helium_7.0-r14027
authorwbernard
Wed, 23 Dec 2009 19:29:07 +0200
changeset 179 d8ac696cc51f
parent 1 be27ed110b50
child 180 e02a83d4c571
child 592 3215c239276a
helium_7.0-r14027
buildframework/helium/build.xml
buildframework/helium/config/diamonds_config.xml.ftl
buildframework/helium/config/helium_data_model.xml
buildframework/helium/config/helium_distribution_test.cfg.xml
buildframework/helium/config/ivy/modules/python-2.5.ivy.xml
buildframework/helium/config/java_checkstyle_config.xml
buildframework/helium/config/metadata_filter_config_default.ant.xml
buildframework/helium/config/metadata_regex.csv
buildframework/helium/config/signaling_config_default.ant.xml
buildframework/helium/config/stages_config_default.ant.xml
buildframework/helium/config/version.txt
buildframework/helium/doc/src/api_changes.rst.ftl
buildframework/helium/doc/src/feature_list.rst
buildframework/helium/doc/src/helium_overview.xml
buildframework/helium/doc/src/index.rst.ftl
buildframework/helium/doc/src/manual/antlogging.rst
buildframework/helium/doc/src/manual/product_example.rst
buildframework/helium/doc/src/manual/signaling.rst
buildframework/helium/doc/src/manual/stages.rst.ftl
buildframework/helium/doc/src/sf.rst
buildframework/helium/doc/src/tutorials/configuration/HowtoCreateANewSignal.rst
buildframework/helium/doc/src/tutorials/qt_build.rst
buildframework/helium/external/filedisk/COPYING.TXT
buildframework/helium/external/filedisk/example.txt
buildframework/helium/external/filedisk/exe/MAKEFILE
buildframework/helium/external/filedisk/exe/filedisk.c
buildframework/helium/external/filedisk/exe/filedisk.rc
buildframework/helium/external/filedisk/exe/sources
buildframework/helium/external/filedisk/filedisk.exe
buildframework/helium/external/filedisk/filedisk.reg
buildframework/helium/external/filedisk/filedisk.sys
buildframework/helium/external/filedisk/install.txt
buildframework/helium/external/filedisk/readme.txt
buildframework/helium/external/filedisk/sys/inc/filedisk.h
buildframework/helium/external/filedisk/sys/obj/i386/checked/filedisk.sys
buildframework/helium/external/filedisk/sys/obj/i386/free/filedisk.sys
buildframework/helium/external/filedisk/sys/src/MAKEFILE
buildframework/helium/external/filedisk/sys/src/Sources
buildframework/helium/external/filedisk/sys/src/filedisk.c
buildframework/helium/external/filedisk/sys/src/filedisk.rc
buildframework/helium/external/helium-antlib/bin/helium-core.jar
buildframework/helium/external/helium-antlib/bin/helium-diamonds.jar
buildframework/helium/external/helium-antlib/bin/helium-imaker.jar
buildframework/helium/external/helium-antlib/bin/helium-logging.jar
buildframework/helium/external/helium-antlib/bin/helium-metadata.jar
buildframework/helium/external/helium-antlib/bin/helium-quality.jar
buildframework/helium/external/helium-antlib/bin/helium-sbs.jar
buildframework/helium/external/helium-antlib/bin/helium-scm.jar
buildframework/helium/external/helium-antlib/bin/helium-signaling.jar
buildframework/helium/external/helium-antlib/bin/helium-sysdef.jar
buildframework/helium/external/helium-antlib/build.xml
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/EmailDataSender.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/TemplateProcessor.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/HeliumExecutor.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/VariableIFImpl.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/VariableInterface.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/antlib.xml
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/conditions/XMLLogCondition.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/helium.antlib.xml
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/GetValueFromVariableSet.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/ValidateUserLogin.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmFinalTargetDef.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmImportDef.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmListenerDef.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmPostDefImpl.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/Variable.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/VariableSet.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/plexus/AntStreamConsumer.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/plexus/CommandBase.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/plexus/FileStreamConsumer.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/plexus/StreamMultiplexer.java
buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/plexus/StreamRecorder.java
buildframework/helium/external/helium-antlib/core/tests/bld.sh
buildframework/helium/external/helium-antlib/core/tests/build.bat
buildframework/helium/external/helium-antlib/core/tests/build.xml
buildframework/helium/external/helium-antlib/core/tests/core/executor/test_executor.ant.xml
buildframework/helium/external/helium-antlib/core/tests/core/variableset/build.xml
buildframework/helium/external/helium-antlib/core/tests/core/variableset/test_variableset.ant.xml
buildframework/helium/external/helium-antlib/core/tests/lib/ant-antunit-1.0.jar
buildframework/helium/external/helium-antlib/core/tests/src/com/nokia/helium/core/plexus/tests/TestAntStreamConsumer.java
buildframework/helium/external/helium-antlib/core/tests/src/com/nokia/helium/core/plexus/tests/TestCommandBase.java
buildframework/helium/external/helium-antlib/core/tests/src/com/nokia/helium/core/plexus/tests/TestFileStreamConsumer.java
buildframework/helium/external/helium-antlib/core/tests/src/com/nokia/helium/core/plexus/tests/TestStreamMultiplexer.java
buildframework/helium/external/helium-antlib/core/tests/src/com/nokia/helium/core/plexus/tests/TestStreamRecorder.java
buildframework/helium/external/helium-antlib/diamonds/lib/dom4j-1.6.1.jar
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsClient.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsConfig.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsExceptionStatusUpdate.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsListenerImpl.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsPostBuildStatusUpdate.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/StageDiamondsListener.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/TargetDiamondsListener.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/XMLMerger.java
buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/ant/HeliumListener.java
buildframework/helium/external/helium-antlib/diamonds/tests/src/com/nokia/helium/diamonds/tests/TestXMLMerger.java
buildframework/helium/external/helium-antlib/doc/src/build.rst
buildframework/helium/external/helium-antlib/doc/src/structure.rst
buildframework/helium/external/helium-antlib/imaker/bld.bat
buildframework/helium/external/helium-antlib/imaker/build.xml
buildframework/helium/external/helium-antlib/imaker/demo/build.bat
buildframework/helium/external/helium-antlib/imaker/demo/build.xml
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/HelpConfigStreamConsumer.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/HelpTargetListStreamConsumer.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/IMaker.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/IMakerException.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/PrintVarSteamConsumer.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/Command.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/Engine.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/IMakerCommandSet.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/antlib.xml
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/engines/Emake.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/engines/EmakeEngine.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/engines/JavaEngine.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/engines/build_imaker_roms_signing.mk.ftl
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/taskdefs/IMakerTask.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/types/Configuration.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/types/ConfigurationSet.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/types/MakefileSelector.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/types/Product.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/types/Variable.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/types/VariableGroup.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/types/VariableSet.java
buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/utils/ParallelExecutor.java
buildframework/helium/external/helium-antlib/imaker/tests/antunit/test_emakeengine.ant.xml
buildframework/helium/external/helium-antlib/imaker/tests/antunit/test_imaker.ant.xml
buildframework/helium/external/helium-antlib/imaker/tests/antunit/test_imaker_invalid.ant.xml
buildframework/helium/external/helium-antlib/imaker/tests/antunit/test_javaengine.ant.xml
buildframework/helium/external/helium-antlib/imaker/tests/bld.sh
buildframework/helium/external/helium-antlib/imaker/tests/build.bat
buildframework/helium/external/helium-antlib/imaker/tests/build.xml
buildframework/helium/external/helium-antlib/imaker/tests/emake_data/cust.mk.ftl
buildframework/helium/external/helium-antlib/imaker/tests/emake_data/invalid.mk.ftl
buildframework/helium/external/helium-antlib/imaker/tests/epocroot/imaker
buildframework/helium/external/helium-antlib/imaker/tests/epocroot/imaker.bat
buildframework/helium/external/helium-antlib/imaker/tests/epocroot/imaker_mock.py
buildframework/helium/external/helium-antlib/imaker/tests/epocroot_invalid/imaker
buildframework/helium/external/helium-antlib/imaker/tests/epocroot_invalid/imaker.bat
buildframework/helium/external/helium-antlib/imaker/tests/epocroot_invalid/imaker_mock.py
buildframework/helium/external/helium-antlib/imaker/tests/epocroot_task/emake
buildframework/helium/external/helium-antlib/imaker/tests/epocroot_task/emake.cmd
buildframework/helium/external/helium-antlib/imaker/tests/epocroot_task/imaker
buildframework/helium/external/helium-antlib/imaker/tests/epocroot_task/imaker.bat
buildframework/helium/external/helium-antlib/imaker/tests/epocroot_task/imaker_mock.py
buildframework/helium/external/helium-antlib/imaker/tests/parallelexecutor_data/linux.txt
buildframework/helium/external/helium-antlib/imaker/tests/parallelexecutor_data/windows.txt
buildframework/helium/external/helium-antlib/imaker/tests/src/com/nokia/helium/imaker/tests/TestHelpConfigStreamConsumer.java
buildframework/helium/external/helium-antlib/imaker/tests/src/com/nokia/helium/imaker/tests/TestIMaker.java
buildframework/helium/external/helium-antlib/imaker/tests/src/com/nokia/helium/imaker/tests/TestParallelExecutor.java
buildframework/helium/external/helium-antlib/imaker/tests/src/com/nokia/helium/imaker/tests/TestPrintVarStreamConsumer.java
buildframework/helium/external/helium-antlib/lib/dom4j-1.6.1.jar
buildframework/helium/external/helium-antlib/lib/plexus-utils-1.5.6.jar
buildframework/helium/external/helium-antlib/logging/bld.bat
buildframework/helium/external/helium-antlib/logging/build.xml
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/antlib.xml
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/helium.antlib.xml
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/AntLogRecorderEntry.java
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/AntLoggingHandler.java
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/BuildEventHandler.java
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/BuildStatusReport.java
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/Handler.java
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/StageSummaryHandler.java
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/StatusAndLogListener.java
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/SubBuildEventHandler.java
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/TargetEventHandler.java
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/TaskEventHandler.java
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/taskdefs/LogRecorder.java
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/taskdefs/LogReplace.java
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/types/RecordFilter.java
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/types/RecordFilterSet.java
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/types/Stage.java
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/types/StageLogging.java
buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/types/StageSummary.java
buildframework/helium/external/helium-antlib/logging/src/templates/build_stages_summary.txt.ftl
buildframework/helium/external/helium-antlib/logging/tests/antunit/test_stageslogging.ant.xml
buildframework/helium/external/helium-antlib/logging/tests/bld.sh
buildframework/helium/external/helium-antlib/logging/tests/build.bat
buildframework/helium/external/helium-antlib/logging/tests/build.xml
buildframework/helium/external/helium-antlib/logging/tests/build_stages_summary.txt.ftl
buildframework/helium/external/helium-antlib/logging/tests/prep-ccm-get-input.ant.xml
buildframework/helium/external/helium-antlib/logging/tests/stages_config.ant.xml
buildframework/helium/external/helium-antlib/macros.ant.xml
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/SQLFMPPLoader.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/antlib.xml
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/conditions/MetaDataLogCondition.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/taskdefs/MetaDataDelete.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/taskdefs/MetaDataRecord.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/AbldLogMetaDataInput.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/AntLogMetaDataInput.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/LogMetaDataInput.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/MetaDataFilter.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/MetaDataFilterSet.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/MetadataSource.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/PolicyLogMetaDataInput.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/SBSLogMetaDataInput.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/TextLogMetaDataInput.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/XMLLogMetaDataInput.java
buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/db/MetadataDb.java
buildframework/helium/external/helium-antlib/metadata/src/templates/general_category.txt.ftl
buildframework/helium/external/helium-antlib/metadata/src/templates/summary.html.ftl
buildframework/helium/external/helium-antlib/metadata/tests/build.xml
buildframework/helium/external/helium-antlib/metadata/tests/data/categorization.log
buildframework/helium/external/helium-antlib/metadata/tests/data/categorization_clean.log
buildframework/helium/external/helium-antlib/metadata/tests/data/noerror.log
buildframework/helium/external/helium-antlib/metadata/tests/data/parser_error.log
buildframework/helium/external/helium-antlib/metadata/tests/functionality/func_add_test.ant.xml
buildframework/helium/external/helium-antlib/metadata/tests/functionality/test_regex.ant.xml
buildframework/helium/external/helium-antlib/quality/tests/build.xml
buildframework/helium/external/helium-antlib/sbs/bld.bat
buildframework/helium/external/helium-antlib/sbs/build.xml
buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/SAXSysdefParser.java
buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/SBSCommandBase.java
buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/SBSException.java
buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/ant/SBSBuildList.java
buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/ant/antlib.xml
buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/ant/taskdefs/GetSBSInputs.java
buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/ant/taskdefs/SBSTask.java
buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/ant/types/SBSBuild.java
buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/ant/types/SBSInput.java
buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/ant/types/SBSMakeOptions.java
buildframework/helium/external/helium-antlib/sbs/tests/bld.sh
buildframework/helium/external/helium-antlib/sbs/tests/build.bat
buildframework/helium/external/helium-antlib/sbs/tests/build.xml
buildframework/helium/external/helium-antlib/sbs/tests/sbs_default_config.ant.xml
buildframework/helium/external/helium-antlib/sbs/tests/test.sysdef.xml
buildframework/helium/external/helium-antlib/sbs/tests/test_sbs_input.ant.xml
buildframework/helium/external/helium-antlib/scm/demo/build.xml
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/ChangelogAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/InitAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/ScmAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/StatusAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/TagsAction.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/LatestTag.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/Revision.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/Tag.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/TagSet.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/init/InitScmResult.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/pull/AbstractPullCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/pull/PullScmResult.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/tags/AbstractTagsCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/tags/TagsScmResult.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/manager/BasicExtendedScmManager.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/ScmProviderExt.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/init/HgInitCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/update/HgUpdateCommand.java
buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/repository/HgScmProviderRepository.java
buildframework/helium/external/helium-antlib/scm/tests/abstract_unittest_scmtask.ant.xml
buildframework/helium/external/helium-antlib/scm/tests/build.xml
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/Notifier.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/SignalStatusList.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/SignalList.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/SignalListener.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/EMAILNotifier.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/ExecuteTaskNotifier.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/LogSourceList.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/NotifierInput.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SMSNotifier.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalConfig.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalExceptionHandler.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalInput.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalNotifierInput.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalNotifierList.java
buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalStatusDef.java
buildframework/helium/external/helium-antlib/signaling/tests/build.xml
buildframework/helium/external/helium-antlib/signaling/tests/src/com/nokia/helium/signaling/tests/TestEmailSender.java
buildframework/helium/external/helium-antlib/signaling/tests/test_signal/signaling_test.ant.xml
buildframework/helium/external/helium-antlib/signaling/tests/test_signal/test_signaling.ant.xml
buildframework/helium/external/helium-antlib/sysdef/bld.bat
buildframework/helium/external/helium-antlib/sysdef/build.xml
buildframework/helium/external/helium-antlib/sysdef/demo/build.bat
buildframework/helium/external/helium-antlib/sysdef/demo/build.xml
buildframework/helium/external/helium-antlib/sysdef/demo/data/layer1/package1/package_definition.xml
buildframework/helium/external/helium-antlib/sysdef/demo/data/layer1/package2/package_definition.xml
buildframework/helium/external/helium-antlib/sysdef/demo/data/layer2/package3/package_definition.xml
buildframework/helium/external/helium-antlib/sysdef/demo/data/layer2/package4/package_definition.xml
buildframework/helium/external/helium-antlib/sysdef/demo/data/layer3/package5/package_definition.xml
buildframework/helium/external/helium-antlib/sysdef/demo/data/root/system_definition_layer1.xml
buildframework/helium/external/helium-antlib/sysdef/demo/data/root/system_definition_layer2.xml
buildframework/helium/external/helium-antlib/sysdef/demo/data/root/system_definition_layer3.xml
buildframework/helium/external/helium-antlib/sysdef/demo/data/root/system_model.xml
buildframework/helium/external/helium-antlib/sysdef/demo/data/sf/os/buildtools/bldsystemtools/buildsystemtools/filter-module.xsl
buildframework/helium/external/helium-antlib/sysdef/demo/data/sf/os/buildtools/bldsystemtools/buildsystemtools/filtersysdef.xsl
buildframework/helium/external/helium-antlib/sysdef/demo/data/sf/os/buildtools/bldsystemtools/buildsystemtools/joinsysdef-module.xsl
buildframework/helium/external/helium-antlib/sysdef/demo/data/sf/os/buildtools/bldsystemtools/buildsystemtools/joinsysdef.xsl
buildframework/helium/external/helium-antlib/sysdef/demo/data/sf/os/buildtools/bldsystemtools/buildsystemtools/mergesysdef-module.xsl
buildframework/helium/external/helium-antlib/sysdef/demo/data/sf/os/buildtools/bldsystemtools/buildsystemtools/mergesysdef.xsl
buildframework/helium/external/helium-antlib/sysdef/demo/data/sf/os/buildtools/bldsystemtools/buildsystemtools/sysdefdowngrade.xsl
buildframework/helium/external/helium-antlib/sysdef/lib/serializer.jar
buildframework/helium/external/helium-antlib/sysdef/lib/xalan.jar
buildframework/helium/external/helium-antlib/sysdef/src/com/nokia/helium/sysdef/ant/antlib.xml
buildframework/helium/external/helium-antlib/sysdef/src/com/nokia/helium/sysdef/ant/helium.antlib.xml
buildframework/helium/external/helium-antlib/sysdef/src/com/nokia/helium/sysdef/ant/taskdefs/AbstractSydefTask.java
buildframework/helium/external/helium-antlib/sysdef/src/com/nokia/helium/sysdef/ant/taskdefs/DowngradeTask.java
buildframework/helium/external/helium-antlib/sysdef/src/com/nokia/helium/sysdef/ant/taskdefs/JoinTask.java
buildframework/helium/external/helium-antlib/sysdef/src/com/nokia/helium/sysdef/ant/taskdefs/MergeTask.java
buildframework/helium/external/helium-antlib/sysdef/tests/antunit/test_downgrade_sysdef.ant.xml
buildframework/helium/external/helium-antlib/sysdef/tests/antunit/test_join_sysdef.ant.xml
buildframework/helium/external/helium-antlib/sysdef/tests/antunit/test_merge_sysdef.ant.xml
buildframework/helium/external/helium-antlib/sysdef/tests/bld.sh
buildframework/helium/external/helium-antlib/sysdef/tests/build.bat
buildframework/helium/external/helium-antlib/sysdef/tests/build.xml
buildframework/helium/external/helium-antlib/test-macros.ant.xml
buildframework/helium/external/python/bin/nosetests-script.py
buildframework/helium/external/python/lib/2.5/Amara-1.2.0.1-py2.5.egg
buildframework/helium/external/python/lib/2.5/Jinja-1.2-py2.5-win32.egg
buildframework/helium/external/python/lib/2.5/Jinja2-2.0rc1-py2.5-win32.egg
buildframework/helium/external/python/lib/2.5/Pygments-0.10-py2.5.egg
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/PKG-INFO
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/SOURCES.txt
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/dependency_links.txt
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/entry_points.txt
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/not-zip-safe
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/requires.txt
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/top_level.txt
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/__init__.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/_jinja.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/addnodes.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/application.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/builder.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/cmdline.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/config.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/directives/__init__.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/directives/code.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/directives/desc.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/directives/other.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/environment.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/__init__.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/autodoc.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/coverage.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/doctest.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/ifconfig.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/intersphinx.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/jsmath.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/mathbase.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/pngmath.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/refcounting.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/todo.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/highlighting.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/htmlhelp.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/htmlwriter.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/latexwriter.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/linkcheck.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/__init__.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sphinx.pot
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/quickstart.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/roles.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/search.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/setup_command.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/contents.png
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/default.css
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/doctools.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/file.png
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/jquery.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/minus.png
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/navigation.png
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/plus.png
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/rightsidebar.css
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/searchtools.js
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/sphinxdoc.css
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/stickysidebar.css
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/traditional.css
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/frameset.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/rstsource.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/versionchanges.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/defindex.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex-single.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex-split.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/layout.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/modindex.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/opensearch.xml
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/page.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/search.html
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/Makefile
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/fncychap.sty
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/howto.cls
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/manual.cls
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/python.ist
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/sphinx.sty
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/tabulary.sty
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/textwriter.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/__init__.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/compat.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/console.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/jsdump.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/png.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/smartypants.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/stemmer.py
buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/texescape.py
buildframework/helium/external/python/lib/2.5/coverage-2.85-py2.5.egg
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/PKG-INFO
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/SOURCES.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/dependency_links.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/not-zip-safe
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2html.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2latex.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2newlatex.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2pseudoxml.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2s5.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2xml.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rstpep2html.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/top_level.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/core.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/examples.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/frontend.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/io.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/af.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/ca.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/cs.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/de.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/en.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/eo.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/es.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/fi.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/fr.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/he.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/it.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/ja.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/nl.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/pt_br.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/ru.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/sk.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/sv.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/zh_cn.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/zh_tw.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/nodes.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/null.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/admonitions.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/body.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/html.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/images.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/misc.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/parts.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/references.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/tables.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/README.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsa.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsb.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsc.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsn.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamso.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsr.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isobox.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isocyr1.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isocyr2.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isodia.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk1.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk2.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk3.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk4-wide.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk4.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isolat1.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isolat2.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomfrk-wide.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomfrk.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomopf-wide.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomopf.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomscr-wide.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomscr.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isonum.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isopub.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isotech.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlalias.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlextra-wide.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlextra.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/s5defs.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-lat1.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-special.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-symbol.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/af.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ca.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/cs.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/de.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/en.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/eo.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/es.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/fi.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/fr.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/he.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/it.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ja.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/nl.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/pt_br.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ru.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/sk.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/sv.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/zh_cn.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/zh_tw.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/roles.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/states.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/tableparser.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/doctree.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/pep.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/python/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/python/moduleparser.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/python/pynodes.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/standalone.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/statemachine.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/components.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/frontmatter.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/misc.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/parts.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/peps.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/references.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/universal.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/writer_aux.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/urischemes.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/utils.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/docutils_xml.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/html4css1/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/html4css1/html4css1.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/html4css1/template.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/latex2e/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/latex2e/latex2e.tex
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/base.tex
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/unicode_map.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/null.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/pep.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/template.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pseudoxml.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/__init__.py
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/README.txt
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/__base__
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/framing.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/pretty.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/framing.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/pretty.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/blank.gif
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/framing.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/iepngfix.htc
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/opera.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/outline.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/pretty.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/print.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/s5-core.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.js
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-black/__base__
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-black/pretty.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-white/framing.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-white/pretty.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-black/__base__
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-black/pretty.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-white/framing.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-white/pretty.css
buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/roman.py
buildframework/helium/external/python/lib/2.5/easy-install.pth
buildframework/helium/external/python/lib/2.5/epydoc-3.0beta1-py2.5.egg
buildframework/helium/external/python/lib/2.5/linux/4Suite_XML-1.0.2-py2.5-linux-i686.egg
buildframework/helium/external/python/lib/2.5/linux/PyXML-0.8.4-py2.5-linux-i686.egg
buildframework/helium/external/python/lib/2.5/linux/easy-install.pth
buildframework/helium/external/python/lib/2.5/linux/lxml-1.3.6-py2.5-linux-i686.egg
buildframework/helium/external/python/lib/2.5/linux/site.py
buildframework/helium/external/python/lib/2.5/mocker-0.10.1-py2.5.egg
buildframework/helium/external/python/lib/2.5/nose-0.10.4-py2.5.egg
buildframework/helium/external/python/lib/2.5/path-2.2-py2.5.egg
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/EGG-INFO/PKG-INFO
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/__init__.py
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/_psyco.pyd
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/classes.py
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/core.py
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/kdictproxy.py
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/logger.py
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/profiler.py
buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/support.py
buildframework/helium/external/python/lib/2.5/setuptools-0.6c5-py2.5.egg
buildframework/helium/external/python/lib/2.5/simplejson-1.9.1-py2.5-win32.egg
buildframework/helium/external/python/lib/2.5/sphinx-build.py
buildframework/helium/external/python/lib/2.5/threadpool.py
buildframework/helium/external/python/lib/2.6/PyXML-0.8.4-py2.6-win32.egg
buildframework/helium/external/python/lib/2.6/easy-install.pth
buildframework/helium/external/python/lib/2.6/site.py
buildframework/helium/external/python/lib/common/Amara-1.2.0.1-py2.5.egg
buildframework/helium/external/python/lib/common/Jinja-1.2-py2.5-win32.egg
buildframework/helium/external/python/lib/common/Jinja2-2.2.1-py2.5.egg
buildframework/helium/external/python/lib/common/Pygments-0.10-py2.5.egg
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/EGG-INFO/PKG-INFO
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/EGG-INFO/SOURCES.txt
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/EGG-INFO/dependency_links.txt
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/EGG-INFO/entry_points.txt
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/EGG-INFO/not-zip-safe
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/EGG-INFO/requires.txt
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/EGG-INFO/top_level.txt
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/__init__.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/_jinja.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/addnodes.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/application.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/builder.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/cmdline.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/config.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/directives/__init__.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/directives/code.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/directives/desc.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/directives/other.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/environment.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/__init__.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/autodoc.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/coverage.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/doctest.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/ifconfig.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/intersphinx.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/jsmath.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/mathbase.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/pngmath.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/refcounting.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/todo.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/highlighting.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/htmlhelp.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/htmlwriter.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/latexwriter.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/linkcheck.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/__init__.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sphinx.pot
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/quickstart.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/roles.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/search.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/setup_command.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/contents.png
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/default.css
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/doctools.js
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/file.png
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/jquery.js
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/minus.png
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/navigation.png
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/plus.png
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/rightsidebar.css
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/searchtools.js
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/sphinxdoc.css
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/stickysidebar.css
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/traditional.css
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/frameset.html
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/rstsource.html
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/versionchanges.html
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/defindex.html
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex-single.html
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex-split.html
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex.html
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/layout.html
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/modindex.html
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/opensearch.xml
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/page.html
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/search.html
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/Makefile
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/fncychap.sty
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/howto.cls
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/manual.cls
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/python.ist
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/sphinx.sty
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/tabulary.sty
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/textwriter.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/util/__init__.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/util/compat.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/util/console.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/util/jsdump.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/util/png.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/util/smartypants.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/util/stemmer.py
buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/util/texescape.py
buildframework/helium/external/python/lib/common/coverage-2.85-py2.5.egg
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/PKG-INFO
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/SOURCES.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/dependency_links.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/not-zip-safe
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2html.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2latex.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2newlatex.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2pseudoxml.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2s5.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2xml.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rstpep2html.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/top_level.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/__init__.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/core.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/examples.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/frontend.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/io.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/__init__.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/af.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/ca.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/cs.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/de.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/en.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/eo.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/es.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/fi.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/fr.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/he.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/it.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/ja.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/nl.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/pt_br.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/ru.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/sk.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/sv.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/zh_cn.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/zh_tw.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/nodes.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/__init__.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/null.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/__init__.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/__init__.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/admonitions.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/body.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/html.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/images.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/misc.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/parts.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/references.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/tables.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/README.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsa.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsb.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsc.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsn.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamso.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsr.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isobox.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isocyr1.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isocyr2.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isodia.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk1.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk2.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk3.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk4-wide.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk4.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isolat1.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isolat2.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomfrk-wide.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomfrk.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomopf-wide.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomopf.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomscr-wide.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomscr.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isonum.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isopub.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isotech.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlalias.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlextra-wide.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlextra.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/s5defs.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-lat1.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-special.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-symbol.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/__init__.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/af.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ca.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/cs.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/de.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/en.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/eo.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/es.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/fi.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/fr.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/he.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/it.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ja.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/nl.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/pt_br.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ru.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/sk.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/sv.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/zh_cn.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/zh_tw.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/roles.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/states.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/tableparser.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/readers/__init__.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/readers/doctree.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/readers/pep.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/readers/python/__init__.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/readers/python/moduleparser.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/readers/python/pynodes.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/readers/standalone.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/statemachine.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/__init__.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/components.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/frontmatter.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/misc.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/parts.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/peps.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/references.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/universal.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/writer_aux.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/urischemes.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/utils.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/__init__.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/docutils_xml.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/html4css1/__init__.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/html4css1/html4css1.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/html4css1/template.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/latex2e/__init__.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/latex2e/latex2e.tex
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/__init__.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/base.tex
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/unicode_map.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/null.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/pep_html/__init__.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/pep_html/pep.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/pep_html/template.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/pseudoxml.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/__init__.py
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/README.txt
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/__base__
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/framing.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/pretty.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/framing.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/pretty.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/blank.gif
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/framing.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/iepngfix.htc
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/opera.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/outline.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/pretty.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/print.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/s5-core.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.js
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-black/__base__
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-black/pretty.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-white/framing.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-white/pretty.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-black/__base__
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-black/pretty.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-white/framing.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-white/pretty.css
buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/roman.py
buildframework/helium/external/python/lib/common/easy-install.pth
buildframework/helium/external/python/lib/common/epydoc-3.0beta1-py2.5.egg
buildframework/helium/external/python/lib/common/mocker-0.10.1-py2.5.egg
buildframework/helium/external/python/lib/common/nose-0.11.1-py2.6.egg
buildframework/helium/external/python/lib/common/path-2.2-py2.5.egg
buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/EGG-INFO/PKG-INFO
buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/psyco/__init__.py
buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/psyco/_psyco.pyd
buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/psyco/classes.py
buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/psyco/core.py
buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/psyco/kdictproxy.py
buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/psyco/logger.py
buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/psyco/profiler.py
buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/psyco/support.py
buildframework/helium/external/python/lib/common/setuptools-0.6c5-py2.5.egg
buildframework/helium/external/python/lib/common/simplejson-1.9.1-py2.5-win32.egg
buildframework/helium/external/python/lib/common/site.py
buildframework/helium/external/python/lib/common/sphinx-build.py
buildframework/helium/external/python/lib/common/threadpool.py
buildframework/helium/external/python/lib/linux/4Suite-XML-1.0.2.tar.gz
buildframework/helium/external/python/lib/linux/PyXML-0.8.4.tar.gz
buildframework/helium/external/python/lib/linux/easy-install.pth
buildframework/helium/external/python/lib/linux/lxml-1.3.6.tgz
buildframework/helium/external/python/lib/linux/site.py
buildframework/helium/helium.ant.xml
buildframework/helium/helium_preinclude.ant.xml
buildframework/helium/hlm
buildframework/helium/hlm.bat
buildframework/helium/hlm.sh
buildframework/helium/precompile_py.bat
buildframework/helium/pt.bat
buildframework/helium/tests/data/archive_test_input.cfg.xml
buildframework/helium/tests/data/example_corernd.iconfig.xml
buildframework/helium/tests/data/flash_config/rom_image_config_test.xml
buildframework/helium/tests/data/logs/test_log.log
buildframework/helium/tests/data/packageiad/epoc32/tools/makesis.exe
buildframework/helium/tests/data/packageiad/epoc32/tools/signsis.exe
buildframework/helium/tests/data/packageiad/layers.sysdef.xml
buildframework/helium/tests/data/packageiad/sis/testPackage/depends.xml
buildframework/helium/tests/data/packageiad/sis/testPackage/sisinfo.xml
buildframework/helium/tests/data/packageiad/sis/testPackage/testPackage.sis
buildframework/helium/tests/data/scanlog/all_regex_type.log
buildframework/helium/tests/minibuilds/ats/build.xml
buildframework/helium/tests/minibuilds/ats/helium_minibuild_ats.sysdef.xml
buildframework/helium/tests/minibuilds/compile/archive.cfg.xml
buildframework/helium/tests/minibuilds/compile/build.sbsinput.ant.xml
buildframework/helium/tests/minibuilds/compile/build.xml
buildframework/helium/tests/minibuilds/compile/common.sbsinput.ant.xml
buildframework/helium/tests/minibuilds/ido-sbs/build.sbsinput.ant.xml
buildframework/helium/tests/minibuilds/ido-sbs/build.xml
buildframework/helium/tests/minibuilds/ido-sbs/common.sbsinput.ant.xml
buildframework/helium/tests/minibuilds/ido/build.xml
buildframework/helium/tests/minibuilds/ido/hack-test.ant.xml
buildframework/helium/tests/minibuilds/ido/hlm.bat
buildframework/helium/tests/minibuilds/imaker/build.xml
buildframework/helium/tests/minibuilds/qt/build.xml
buildframework/helium/tests/minibuilds/qt/config/qmake_zip_cfg.xml
buildframework/helium/tools/common/bin/CheckTools.class
buildframework/helium/tools/common/bin/CheckTools.java
buildframework/helium/tools/common/bin/call_vcvars32.bat
buildframework/helium/tools/common/common.ant.xml
buildframework/helium/tools/common/common.antlib.xml
buildframework/helium/tools/common/docs.ant.xml
buildframework/helium/tools/common/java/lib/nokia_ant.jar
buildframework/helium/tools/common/java/src/com/nokia/ant/AtsCondition.java
buildframework/helium/tools/common/java/src/com/nokia/ant/BSFJepEngine.java
buildframework/helium/tools/common/java/src/com/nokia/ant/BuildStatusDef.java
buildframework/helium/tools/common/java/src/com/nokia/ant/Database.java
buildframework/helium/tools/common/java/src/com/nokia/ant/HeliumLogger.java
buildframework/helium/tools/common/java/src/com/nokia/ant/ModelPropertiesParser.java
buildframework/helium/tools/common/java/src/com/nokia/ant/XmlLogger.java
buildframework/helium/tools/common/java/src/com/nokia/ant/antlib.xml
buildframework/helium/tools/common/java/src/com/nokia/ant/listener/TracingLogger.java
buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/EmailDataSender.java
buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/Listener.java
buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/TaskNode.java
buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/XMLRenderer.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AbstractScmBaseTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AntConfigurationTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AntDependencyTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AntLintTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/CopyParallelTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/CoverageRecorderEntry.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/DatabaseTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/DeconfigureTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/GetValueFromVariableSet.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/HlmExecTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/LDAP.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/LogRecorderTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ModelPropertiesTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/PythonTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/RBTTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/RebaselineTask.java
buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/TextLogRecorderEntry.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/SBSMakeOptions.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/imaker/Configuration.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/imaker/ConfigurationSet.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/imaker/Variable.java
buildframework/helium/tools/common/java/src/com/nokia/ant/types/imaker/VariableSet.java
buildframework/helium/tools/common/java/src/com/nokia/ant/util/ToolsProcess.java
buildframework/helium/tools/common/java/src/com/nokia/fmpp/SqlDataLoader.java
buildframework/helium/tools/common/java/src/com/nokia/log4j.xml
buildframework/helium/tools/common/java/src/com/nokia/tools/Tool.java
buildframework/helium/tools/common/java/src/com/nokia/tools/cmt/CMTTool.java
buildframework/helium/tools/common/java/src/com/nokia/tools/cone/CONETool.java
buildframework/helium/tools/common/java/src/com/nokia/tools/configuration/CONFIGURATIONTool.java
buildframework/helium/tools/common/java/src/com/nokia/tools/sbs/SBSTool.java
buildframework/helium/tools/common/libs.ant.xml
buildframework/helium/tools/common/logging.ant.xml
buildframework/helium/tools/common/python/lib/ant.py
buildframework/helium/tools/common/python/lib/archive/builders.py
buildframework/helium/tools/common/python/lib/archive/mappers.py
buildframework/helium/tools/common/python/lib/ats3/__init__.py
buildframework/helium/tools/common/python/lib/ats3/aste.py
buildframework/helium/tools/common/python/lib/ats3/aste_template.xml
buildframework/helium/tools/common/python/lib/ats3/ats4_template.xml
buildframework/helium/tools/common/python/lib/ats3/ats_template.xml
buildframework/helium/tools/common/python/lib/ats3/dropgenerator.py
buildframework/helium/tools/common/python/lib/ats3/matti/MattiDrops.py
buildframework/helium/tools/common/python/lib/ats3/matti/__init__.py
buildframework/helium/tools/common/python/lib/ats3/parsers.py
buildframework/helium/tools/common/python/lib/ats3/templates/ats4_macros.xml
buildframework/helium/tools/common/python/lib/ats3/testconfigurator.py
buildframework/helium/tools/common/python/lib/atsant.py
buildframework/helium/tools/common/python/lib/bomtofile.py
buildframework/helium/tools/common/python/lib/build/io.py
buildframework/helium/tools/common/python/lib/build/model.py
buildframework/helium/tools/common/python/lib/buildtools.py
buildframework/helium/tools/common/python/lib/ccm/__init__.py
buildframework/helium/tools/common/python/lib/ccm/conflict.py
buildframework/helium/tools/common/python/lib/ccm/extra.py
buildframework/helium/tools/common/python/lib/ccmutil.py
buildframework/helium/tools/common/python/lib/compilation.py
buildframework/helium/tools/common/python/lib/configuration.py
buildframework/helium/tools/common/python/lib/configuration_model.py
buildframework/helium/tools/common/python/lib/cpythontest/__init__.py
buildframework/helium/tools/common/python/lib/cpythontest/test_archive.py
buildframework/helium/tools/common/python/lib/cpythontest/test_ats3.py
buildframework/helium/tools/common/python/lib/cpythontest/test_ats3_aste.py
buildframework/helium/tools/common/python/lib/cpythontest/test_ats4.py
buildframework/helium/tools/common/python/lib/cpythontest/test_ats4_aste.py
buildframework/helium/tools/common/python/lib/cpythontest/test_atsant.py
buildframework/helium/tools/common/python/lib/cpythontest/test_atsconfigparser.py
buildframework/helium/tools/common/python/lib/cpythontest/test_atsconfiguration.py
buildframework/helium/tools/common/python/lib/cpythontest/test_buildmodel.py
buildframework/helium/tools/common/python/lib/cpythontest/test_ccm.py
buildframework/helium/tools/common/python/lib/cpythontest/test_comments.py
buildframework/helium/tools/common/python/lib/cpythontest/test_configuration_model.py
buildframework/helium/tools/common/python/lib/cpythontest/test_dependancygraph.py
buildframework/helium/tools/common/python/lib/cpythontest/test_fileutils.py
buildframework/helium/tools/common/python/lib/cpythontest/test_iqrf.py
buildframework/helium/tools/common/python/lib/cpythontest/test_logger.py
buildframework/helium/tools/common/python/lib/cpythontest/test_matti.py
buildframework/helium/tools/common/python/lib/cpythontest/test_packageiad.py
buildframework/helium/tools/common/python/lib/cpythontest/test_parsers.py
buildframework/helium/tools/common/python/lib/cpythontest/test_policy_validator.py
buildframework/helium/tools/common/python/lib/cpythontest/test_relnotes.py
buildframework/helium/tools/common/python/lib/cpythontest/test_sis.py
buildframework/helium/tools/common/python/lib/cpythontest/test_timeout_launcher.py
buildframework/helium/tools/common/python/lib/cpythontest/test_vbaconf.py
buildframework/helium/tools/common/python/lib/delta_zip.py
buildframework/helium/tools/common/python/lib/dependancygraph.py
buildframework/helium/tools/common/python/lib/docs.py
buildframework/helium/tools/common/python/lib/fileutils.py
buildframework/helium/tools/common/python/lib/helium/documentation.py
buildframework/helium/tools/common/python/lib/idoprep.py
buildframework/helium/tools/common/python/lib/imaker/ant.py
buildframework/helium/tools/common/python/lib/integration/quality.py
buildframework/helium/tools/common/python/lib/integration/templatebuilder.py
buildframework/helium/tools/common/python/lib/minidomamara.py
buildframework/helium/tools/common/python/lib/parsedatalistening.py
buildframework/helium/tools/common/python/lib/precompile.py
buildframework/helium/tools/common/python/lib/preparation.py
buildframework/helium/tools/common/python/lib/sis.py
buildframework/helium/tools/common/python/lib/symrec.py
buildframework/helium/tools/common/python/lib/sysdef/api.py
buildframework/helium/tools/common/python/lib/test/test_ant.py
buildframework/helium/tools/common/python/lib/test/test_archive.py
buildframework/helium/tools/common/python/lib/test/test_ats3.py
buildframework/helium/tools/common/python/lib/test/test_ats3_aste.py
buildframework/helium/tools/common/python/lib/test/test_atsconfigparser.py
buildframework/helium/tools/common/python/lib/test/test_atsconfiguration.py
buildframework/helium/tools/common/python/lib/test/test_build_io.py
buildframework/helium/tools/common/python/lib/test/test_buildmodel.py
buildframework/helium/tools/common/python/lib/test/test_ccm.py
buildframework/helium/tools/common/python/lib/test/test_ccm_results.py
buildframework/helium/tools/common/python/lib/test/test_comments.py
buildframework/helium/tools/common/python/lib/test/test_configuration.py
buildframework/helium/tools/common/python/lib/test/test_configuration_model.py
buildframework/helium/tools/common/python/lib/test/test_deltazip.py
buildframework/helium/tools/common/python/lib/test/test_fileutils.py
buildframework/helium/tools/common/python/lib/test/test_filter_heliumlog.py
buildframework/helium/tools/common/python/lib/test/test_filter_metadatalog.py
buildframework/helium/tools/common/python/lib/test/test_freedisk.py
buildframework/helium/tools/common/python/lib/test/test_ido.py
buildframework/helium/tools/common/python/lib/test/test_iqrf.py
buildframework/helium/tools/common/python/lib/test/test_logger.py
buildframework/helium/tools/common/python/lib/test/test_parsers.py
buildframework/helium/tools/common/python/lib/test/test_policy_validator.py
buildframework/helium/tools/common/python/lib/test/test_relnotes.py
buildframework/helium/tools/common/python/lib/test/test_rom.py
buildframework/helium/tools/common/python/lib/test/test_sbs.py
buildframework/helium/tools/common/python/lib/test/test_searchnextdrive.py
buildframework/helium/tools/common/python/lib/test/test_session_provider.py
buildframework/helium/tools/common/python/lib/test/test_symbian_log.py
buildframework/helium/tools/common/python/lib/test/test_symrec.py
buildframework/helium/tools/common/python/lib/test/test_threadpool.py
buildframework/helium/tools/common/python/lib/test/test_unittestadditions.py
buildframework/helium/tools/common/python/lib/test/test_vbaconf.py
buildframework/helium/tools/common/python/lib/unittestadditions.py
buildframework/helium/tools/common/python/scripts/filter_heliumlog.py
buildframework/helium/tools/common/python/scripts/filter_metadatalog.py
buildframework/helium/tools/common/python/scripts/sbsscanlog.py
buildframework/helium/tools/common/python/scripts/sbsscanlogmetadata.py
buildframework/helium/tools/common/python/scripts/searchnextdrive.py
buildframework/helium/tools/common/python/scripts/test_scanlog.ant.xml
buildframework/helium/tools/common/python/scripts/timeout_launcher.py
buildframework/helium/tools/common/schema/ant.xsd
buildframework/helium/tools/common/templates/ido/ido-ant-copy.xml.ftl
buildframework/helium/tools/common/templates/ido/ido-cmt-ant.xml.ftl
buildframework/helium/tools/common/templates/log/build_stages_summary.txt.ftl
buildframework/helium/tools/common/templates/log/cc_summary_metadata.html.ftl
buildframework/helium/tools/common/templates/log/scan2.html.ftl
buildframework/helium/tools/common/templates/log/scan2_text.html.ftl
buildframework/helium/tools/common/test/test_common.ant.xml
buildframework/helium/tools/common/test/test_deconfigure_task.ant.xml
buildframework/helium/tools/common/test/test_getvariablevalue.ant.xml
buildframework/helium/tools/common/test/test_logging.ant.xml
buildframework/helium/tools/common/test/test_rebaseanddeconf_task.ant.xml
buildframework/helium/tools/common/test/test_rebaseline_task.ant.xml
buildframework/helium/tools/common/testing.ant.xml
buildframework/helium/tools/compile/compile.ant.xml
buildframework/helium/tools/compile/compile.antlib.xml
buildframework/helium/tools/compile/ebs/ebs.ant.xml
buildframework/helium/tools/compile/ec/ec.ant.xml
buildframework/helium/tools/compile/ec/sysdef2make.pl
buildframework/helium/tools/compile/qt/qt.ant.xml
buildframework/helium/tools/compile/sbs/sbs.ant.xml
buildframework/helium/tools/compile/sbs/sbs.settings.ant.xml
buildframework/helium/tools/compile/sbs/test/test_sbs.ant.xml
buildframework/helium/tools/compile/sis.ant.xml
buildframework/helium/tools/compile/util/ini2sysdef.py
buildframework/helium/tools/compile/util/txt2sysdef.py
buildframework/helium/tools/iad/iad.ant.xml
buildframework/helium/tools/iad/packageiad.py
buildframework/helium/tools/integration/integration.ant.xml
buildframework/helium/tools/integration/template-builder/template-builder.ant.xml
buildframework/helium/tools/integration/validate_overlay/validate_overlay.ant.xml
buildframework/helium/tools/localisation/localisation-32.ant.xml
buildframework/helium/tools/localisation/localisation-50.ant.xml
buildframework/helium/tools/localisation/localisation.ant.xml
buildframework/helium/tools/localisation/localiser/ECLocaliser.pm
buildframework/helium/tools/preparation/bom/bom.ant.xml
buildframework/helium/tools/preparation/ci.ant.xml
buildframework/helium/tools/preparation/freedisk.py
buildframework/helium/tools/preparation/getenv.pl
buildframework/helium/tools/preparation/ido-prep.ant.xml
buildframework/helium/tools/preparation/ivy/dependencies.ant.xml
buildframework/helium/tools/preparation/password.ant.xml
buildframework/helium/tools/preparation/preparation.ant.xml
buildframework/helium/tools/preparation/synergy/buildmanagement.ant.xml
buildframework/helium/tools/preparation/synergy/ccmgetinput.ant.xml
buildframework/helium/tools/preparation/test/test_bom.ant.xml
buildframework/helium/tools/preparation/test/test_ci.ant.xml
buildframework/helium/tools/preparation/test/test_preparation.ant.xml
buildframework/helium/tools/preparation/test/test_synergy.ant.xml
buildframework/helium/tools/publish/nwiki.ant.xml
buildframework/helium/tools/publish/publish.ant.xml
buildframework/helium/tools/publish/publish_dir_files/build.xml
buildframework/helium/tools/publish/synergy.ant.xml
buildframework/helium/tools/publish/test/test2_publishing_to_diamonds.ant.xml
buildframework/helium/tools/publish/test/test_macro.ant.xml
buildframework/helium/tools/quality/conflict-checker.ant.xml
buildframework/helium/tools/quality/internal-exports.ant.xml
buildframework/helium/tools/quality/mmp-to-target.ant.xml
buildframework/helium/tools/quality/quality.ant.xml
buildframework/helium/tools/quality/validate-policy.ant.xml
buildframework/helium/tools/relnotes/relnotes.ant.xml
buildframework/helium/tools/rombuild/dryrun_parser.py
buildframework/helium/tools/rombuild/imaker.ant.xml
buildframework/helium/tools/rombuild/rombuild.ant.xml
buildframework/helium/tools/startup/bootstrap/bootstrap.ant.xml
buildframework/helium/tools/testing/ats/ats.ant.xml
buildframework/helium/tools/testing/ats/templates/monsym-file-list.txt.ftl
buildframework/helium/tools/testing/eunit/eunit.ant.xml
buildframework/helium/tools/testing/testing.ant.xml
buildframework/helium/tools/uda/uda.ant.xml
--- a/buildframework/helium/build.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -24,15 +24,14 @@
     <description>
         Helium targets to build helium itself.
     </description>
-    <property environment="env"/>
     
+    <import file="build-jar.ant.xml"/>
     <property name="build.drive" location="${env.TEMP}/helium/temp_drive"/>
     <mkdir dir="${build.drive}/"/> 
     
     <property file="${helium.dir}/config/version.txt"/>
     <property name="release.label" value="${helium.version}"/>
     
-    <import file="build-jar.ant.xml"/>
     <import file="helium.ant.xml"/>
     <import file="tools/startup/antserver/antserver.ant.xml"/>
          
--- a/buildframework/helium/config/diamonds_config.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/config/diamonds_config.xml.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -23,7 +23,7 @@
 <configuration>
 <config>
     <template-dir path="${ant['helium.dir']}/tools/common/templates/diamonds" />
-    <output-dir path="${ant['build.log.dir']}"/>
+    <output-dir path="${ant['diamonds.build.output.dir']}"/>
     <property name="smtpserver" value="email.smtp.server" />
     <property name="ldapserver" value="email.ldap.server" />
     <property name="initialiser-target-name" value="diamonds" />
@@ -47,12 +47,8 @@
     <targets>
         <target name="diamonds" template-file="tool.xml.ftl" 
             logfile="${ant['temp.build.dir']}/build/doc/ivy/tool-dependencies-${ant['build.type']}.xml" ant-properties="true"/>        
-        <#if (ant?keys?seq_contains('metadata.enable'))>
-            <target name="compile-main" />
-        <#else>
-            <target name="compile-main" template-file="compile.xml.ftl"
-                logfile="${ant['diamonds.compile.summary']}" ant-properties="true"/>
-        </#if>
+
+        <target name="compile-main" />
             
         <target name="ido-codescanner" template-file="codescanner.xml.ftl"
             logfile="${ant['ido.codescanner.output.dir']}/problemIndex.xml"/>
--- a/buildframework/helium/config/helium_data_model.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/config/helium_data_model.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -46,25 +46,25 @@
         <name>ats.testrun.name</name>
         <editStatus>recommended</editStatus>
         <type>string</type>
-        <description>Modify the test-run name if you have understanding of test.xml file or leave it as it is. Deafault value is a string consist of build id, product name, major and minor versions</description>
+        <description>Modify the test-run name if you have understanding of test.xml file or leave it as it is. Default value is a string consist of build id, product name, major and minor versions</description>
     </property>
     <property>
         <name>ats.plan.name</name>
         <editStatus>recommended</editStatus>
         <type>string</type>
-        <description>Modify the plan name if you have understanding of test.xml file or leave it as it is. Deafault value is "plan" </description>
+        <description>Modify the plan name if you have understanding of test.xml file or leave it as it is. Default value is "plan" </description>
     </property>
     <property>
         <name>ats.trace.enabled</name>
         <editStatus>recommended</editStatus>
         <type>string</type>
-        <description>Should be "True" if tracing is needed during the tests running on ATS3. Deafault value is "False", the values are case-sensitive. </description>
+        <description>Should be "True" if tracing is needed during the tests running on ATS3. Default value is "False", the values are case-sensitive. </description>
     </property>
     <property>
         <name>ats.ctc.enabled</name>
         <editStatus>recommended</editStatus>
         <type>string</type>
-        <description>Should be "True" if coverage measurement and dynamic analysis (CTC) tool support is to be used by ATS. Deafault value is "False", the values are case-sensitive. </description>
+        <description>Should be "True" if coverage measurement and dynamic analysis (CTC) tool support is to be used by ATS. Default value is "False", the values are case-sensitive. </description>
     </property>
     <property>
         <name>ats.email.list</name>
@@ -152,6 +152,12 @@
         <description>Path for creation of the drop file during the build. Default is ATS3AsteDrop.zip</description>
     </property>
     <property>
+        <name>ats.drops.count</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>ATSDrop files counter. Value is set to have total number of ATSDrops.</description>
+    </property>
+    <property>
         <name>ats.product.name</name>
         <editStatus>must</editStatus>
         <type>string</type>
@@ -176,14 +182,26 @@
         <name>ats.aste.testrun.name</name>
         <editStatus>recommended</editStatus>
         <type>string</type>
-        <description>Modify the test-run name if you have understanding of test.xml file or leave it as it is. Deafault value is a string consist of build id, product name, major and minor versions</description>
+        <description>Modify the test-run name if you have understanding of test.xml file or leave it as it is. Default value is a string consist of build id, product name, major and minor versions</description>
     </property>
     <property>
         <name>ats.aste.plan.name</name>
         <editStatus>recommended</editStatus>
         <type>string</type>
-        <description>Modify the plan name if you have understanding of test.xml file or leave it as it is. Deafault value is "plan" </description>
-    </property>
+        <description>Modify the plan name if you have understanding of test.xml file or leave it as it is. Default value is "plan" </description>
+    </property>
+    <property>
+        <name>ats.evalid.pre</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Temp dir</description>
+    </property>
+    <property>
+        <name>ats.evalid.post</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Temp dir</description>
+    </property>    
     <property>
         <name>disable.analysis.tool</name>
         <editStatus>allowed</editStatus>
@@ -311,6 +329,54 @@
         <description>This is where the build logs are stored.</description>
     </property>
     <property>
+        <name>archive.log.dir</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>This is where the archive logs are stored.</description>
+    </property>
+    <property>
+        <name>compile.log.dir</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>This is where the compile logs are stored.</description>
+    </property>
+    <property>
+        <name>post.log.dir</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>This is where the post build logs are stored.</description>
+    </property>
+    <property>
+        <name>prep.log.dir</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>This is where the preparation build logs are stored.</description>
+    </property>
+    <property>
+        <name>test.log.dir</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>This is where the ats test logs are stored.</description>
+    </property>
+    <property>
+        <name>localisation.log.dir</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>This is where the localisation logs are stored.</description>
+    </property>
+    <property>
+        <name>roms.log.dir</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>This is where the roms logs are stored.</description>
+    </property>
+    <property>
+        <name>diamonds.build.output.dir</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>This is where the diamonds output XML files are stored.</description>
+    </property>
+    <property>
         <name>build.signal.status.dir</name>
         <editStatus>discouraged</editStatus>
         <type>string</type>
@@ -377,6 +443,12 @@
         <description>Defined if build.system is set to "ebs", which is the default.</description>
     </property>
     <property>
+        <name>schema.new</name>
+        <editStatus>allowed</editStatus>
+        <type>boolean</type>
+        <description>enabling / disabling the new schema (schema 3.0).</description>
+    </property>
+    <property>
         <name>build.system.sbs</name>
         <editStatus>never</editStatus>
         <type>string</type>
@@ -686,6 +758,12 @@
         <type>string</type>
         <description>List of targets that should be logged in to Diamonds.</description>
     </property>
+    <property>
+        <name>exceptions.target</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>target to be executed in case of exceptions (mainly to generate the summary and raise signal).</description>
+    </property>
     
     <property>
         <name>documentation.url.root</name>
@@ -714,6 +792,12 @@
         <description>Ensures the cleanup-all target is called when the build finishes.</description>
     </property>
     <property>
+        <name>skip.sbs.parser.exception</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>to skip the exception and continue the build during log parsing for raptor</description>
+    </property>
+    <property>
         <name>sbs.config</name>
         <editStatus>allowed</editStatus>
         <type>string</type>
@@ -799,6 +883,12 @@
         <description>Location of sysdef2make.pl file, which is used to translate system definition files to make files. Internal property that normally does not require changes.</description>
     </property>
     <property>
+        <name>ec.sysdef2make.cmdline</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Extra command line parameters for the sysdef2make call.</description>
+    </property>
+    <property>
         <name>ec.tools.dir</name>
         <editStatus>discouraged</editStatus>
         <type>string</type>
@@ -1020,6 +1110,13 @@
         <type>string</type>
         <description>Contains Helium version information</description>
     </property>
+    <property>
+        <name>helium.revision</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Contains Helium version information</description>
+    </property>
+    
     <!--
         IDO codescanner integration.
     -->
@@ -1198,6 +1295,12 @@
         <description>Is a previous builds md5 being passed manually</description>
     </property>
     <property>
+        <name>old.bom.log.publish.dir</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Publish dir location of the old bom log.</description>
+    </property>
+    <property>
         <name>metadata.db.file</name>
         <editStatus>never</editStatus>
         <type>string</type>
@@ -1252,12 +1355,6 @@
         <description>If defined the qmake stage will be enabled during compilation.</description>
     </property>
     <property>
-        <name>qt.dir</name>
-        <editStatus>recommended</editStatus>
-        <type>string</type>
-        <description>The location of the Qt framework to build.</description>
-    </property>
-    <property>
         <name>qt.qmake.ant.template</name>
         <editStatus>allowed</editStatus>
         <type>string</type>
@@ -1283,12 +1380,6 @@
         then those arguments are discarded.</description>
     </property>
     <property>
-        <name>qt.configure.log.name</name>
-        <editStatus>never</editStatus>
-        <type>string</type>
-        <description>The name of the Qt configure output log.</description>
-    </property>
-    <property>
         <name>absolute.prep.root.dir</name>
         <editStatus>never</editStatus>
         <type>string</type>
@@ -1769,6 +1860,12 @@
         <description>Configuration file for SIS-file generation.</description>
     </property>
     <property>
+        <name>sis.config.name</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Common Configuration config name. Override to select a specific config group.</description>
+    </property>
+    <property>
         <name>sms.number</name>
         <editStatus>never</editStatus>
         <type>string</type>
@@ -2216,6 +2313,193 @@
         <type>string</type>
         <description>Location of build metadata database.</description>
     </property>
+    <property>
+        <name>ant.loglevel</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Level of ant logging.</description>
+    </property>
+    <property>
+        <name>last.major.release.database.url</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>URL for the database.xml of last major release</description>
+    </property>
+    <property>
+        <name>ivy.xml.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Ivy configuration file</description>
+    </property>
+    <property>
+        <name>dependency.grph</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of dependency.grph</description>
+    </property>
+    <property>
+        <name>python.dir</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Location of python library</description>
+    </property>
+    <property>
+        <name>python.internal.dir</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Location of nokia internal python library</description>
+    </property>
+    <property>
+        <name>subcon</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>subcon</description>
+    </property>
+    <property>
+        <name>dependency.external.grph</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of dependencies_external.grph</description>
+    </property>
+    <property>
+        <name>build.logs.list</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Contains comma separted list of build logs</description>
+    </property>
+    <property>
+        <name>binary.sizes.rom.logs.list</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>List of binary sizes rom logs</description>
+    </property>
+    <property>
+        <name>binary.sizes.output.file</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>File containing data related to flash image size</description>
+    </property>
+    <property>
+        <name>run.ccm</name>
+        <editStatus>never</editStatus>
+        <type>boolean</type>
+        <description>Enable CCM operations</description>
+    </property>
+    <property>
+        <name>old.bom.log</name>
+        <editStatus>discouraged</editStatus>
+        <type>string</type>
+        <description>Location of last usable XML BOM log file for creating a BOM delta.</description>
+    </property>
+    <property>
+        <name>symbian.version.week</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Symbian release week</description>
+    </property>
+    <property>
+        <name>symbian.version</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Symbian release version</description>
+    </property>
+    <property>
+        <name>s60.release</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>s60.release</description>
+    </property>
+    <property>
+        <name>symbian.version.year</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Symbian release year</description>
+    </property>
+    <property>
+        <name>s60.version</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>s60.version</description>
+    </property>
+    <property>
+        <name>bom.log</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of XML BOM log</description>
+    </property>
+    <property>
+        <name>build.number</name>
+        <editStatus>allowed</editStatus>
+        <type>integer</type>
+        <description>Build number</description>
+    </property>
+    <property>
+        <name>ado.quality.dirs.path</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>List of ado quality dirs</description>
+    </property>
+    <property>
+        <name>s60.getenv.path</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Path referring to latest s60 release</description>
+    </property>
+    <property>
+        <name>ido.variant</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Location of ido variant</description>
+    </property>
+    <property>
+        <name>overlay.files.path</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>List of overlay files to scan overlay structure and create a report</description>
+    </property>
+    <property>
+        <name>project.spec.name</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>project.spec.name</description>
+    </property>
+    <property>
+        <name>email.from</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>From email adress</description>
+    </property>
+    <property>
+        <name>diamonds.log.file</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Location of diamonds log</description>
+    </property>
+    <property>
+        <name>md5.current.build</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Location of current build md5 file</description>
+    </property>
+    <property>
+        <name>ccm.toplevel.project</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Toplevel CCM project</description>
+    </property>
+    <property>
+        <name>project.startswith</name>
+        <editStatus>allowed</editStatus>
+        <type>string</type>
+        <description>Starting letters of project used to find complete CM name</description>
+    </property>
+    <property>
+        <name>release.notes.temp</name>
+        <editStatus>never</editStatus>
+        <type>string</type>
+        <description>Temp release notes</description>
+    </property>
+    
     <group>
         <name>Environment</name>
         <description/>
@@ -2234,6 +2518,11 @@
         <description>Preparing the build area.</description>
         <propertyRef usage="required">prep.config.file</propertyRef>
         <propertyRef usage="optional">prep.delivery.file</propertyRef>
+        <propertyRef usage="optional">old.bom.log.publish.dir</propertyRef>
+        <propertyRef usage="optional">ado.quality.dirs.path</propertyRef>
+        <propertyRef usage="optional">s60.getenv.path</propertyRef>
+        <propertyRef usage="optional">ido.variant</propertyRef>
+        <propertyRef usage="optional">overlay.files.path</propertyRef>
     </group>
     <group>
         <name>localFreeSpace</name>
@@ -2255,11 +2544,15 @@
         <propertyRef usage="required">build.system</propertyRef>
         <propertyRef usage="optional">build.system.ebs</propertyRef>
         <propertyRef usage="optional">ido.build.filter</propertyRef>
+        <propertyRef usage="optional">build.logs.list</propertyRef>
+        <propertyRef usage="optional">binary.sizes.rom.logs.list</propertyRef>
+        <propertyRef usage="optional">binary.sizes.output.file</propertyRef>
     </group>
     <group>
         <name>sisFiles</name>
         <description>Creating SIS files.</description>
         <propertyRef usage="optional">sis.config.file</propertyRef>
+        <propertyRef usage="optional">sis.config.name</propertyRef>
     </group>
     <group>
         <name>rombuild</name>
@@ -2303,6 +2596,8 @@
         <propertyRef usage="optional">publish.fileset.ids</propertyRef>
         <propertyRef usage="optional">publish.release.subdir</propertyRef>
         <propertyRef usage="optional">publish.release.dir</propertyRef>
+        <propertyRef usage="optional">email.from</propertyRef>
+        <propertyRef usage="optional">md5.current.build</propertyRef>
     </group>
     <group>
         <name>mobilecrash</name>
@@ -2325,6 +2620,9 @@
         <propertyRef usage="optional">releasenotes.temp.props</propertyRef>
         <propertyRef usage="optional">releasenotes.temp.props2</propertyRef>
         <propertyRef usage="optional">releasenotes.template</propertyRef>
+        <propertyRef usage="optional">ccm.toplevel.project</propertyRef>
+        <propertyRef usage="optional">project.startswith</propertyRef>
+        <propertyRef usage="optional">release.notes.temp</propertyRef>
     </group>
     <group>
         <name>DeltaZip</name>
@@ -2366,8 +2664,10 @@
         <propertyRef usage="optional">ec.history.option</propertyRef>
         <propertyRef usage="optional">ec.scripts.dir</propertyRef>
         <propertyRef usage="optional">ec.sysdef2make</propertyRef>
+        <propertyRef usage="optional">ec.sysdef2make.cmdline</propertyRef>
         <propertyRef usage="optional">ec.tools.dir</propertyRef>
         <propertyRef usage="optional">ec.build.class</propertyRef>
+        <propertyRef usage="optional">schema.new</propertyRef>
         <propertyRef usage="optional">sbs.implicit.tools.build</propertyRef>
         <propertyRef usage="optional">sbs.tools.config</propertyRef>
         <propertyRef usage="optional">ec.mem.limit</propertyRef>
@@ -2423,6 +2723,7 @@
         <propertyRef usage="optional">diamonds.build.id</propertyRef>
         <propertyRef usage="optional">diamonds.build.url</propertyRef>
         <propertyRef usage="optional">diamonds.target.list.to.log</propertyRef>
+        <propertyRef usage="optional">diamonds.log.file</propertyRef>
     </group>
     <group>
         <name>Localisation</name>
@@ -2460,6 +2761,7 @@
         <propertyRef usage="optional">ats.product.hwid</propertyRef>
         <propertyRef usage="optional">ats.drop.file</propertyRef>
         <propertyRef usage="optional">ats.aste.drop.file</propertyRef>
+        <propertyRef usage="optional">ats.drops.count</propertyRef>
         <propertyRef usage="optional">ats.aste.email.list</propertyRef>
         <propertyRef usage="optional">ats.product.name</propertyRef>
         <propertyRef usage="optional">ats.script.type</propertyRef>
@@ -2475,6 +2777,8 @@
         <propertyRef usage="optional">eunitexerunner.flags</propertyRef>
         <propertyRef usage="optional">drop.file.counter</propertyRef>
         <propertyRef usage="optional">exclude.test.layers</propertyRef>
+        <propertyRef usage="optional">ats.evalid.pre</propertyRef>
+        <propertyRef usage="optional">ats.evalid.post</propertyRef>
     </group>
     <group>
         <name>Company</name>
@@ -2495,8 +2799,6 @@
     <group>
         <name>Qt</name>
         <description/>
-        <propertyRef usage="optional">qt.dir</propertyRef>
-        <propertyRef usage="optional">qt.configure.log.name</propertyRef>
         <propertyRef usage="optional">qt.qmake.ant.template</propertyRef>
         <propertyRef usage="optional">qt.qmake.makefile.template</propertyRef>
         <propertyRef usage="optional">qt.configure.args</propertyRef>
@@ -2519,6 +2821,14 @@
         <propertyRef usage="optional">build.errors.limit</propertyRef>
         <propertyRef usage="optional">build.id</propertyRef>
         <propertyRef usage="optional">build.log.dir</propertyRef>
+        <propertyRef usage="optional">archive.log.dir</propertyRef>
+        <propertyRef usage="optional">compile.log.dir</propertyRef>
+        <propertyRef usage="optional">roms.log.dir</propertyRef>
+        <propertyRef usage="optional">localisation.log.dir</propertyRef>
+        <propertyRef usage="optional">diamonds.build.output.dir</propertyRef>
+        <propertyRef usage="optional">post.log.dir</propertyRef>
+        <propertyRef usage="optional">prep.log.dir</propertyRef>
+        <propertyRef usage="optional">test.log.dir</propertyRef>
         <propertyRef usage="optional">build.signal.status.dir</propertyRef>
         <propertyRef usage="optional">build.status.email.template</propertyRef>
         <propertyRef usage="optional">build.log</propertyRef>
@@ -2530,6 +2840,7 @@
         <propertyRef usage="optional">build.sisfiles.dir</propertyRef>
         <propertyRef usage="optional">build.summary.file</propertyRef>
         <propertyRef usage="optional">build.system.sbs</propertyRef>
+        <propertyRef usage="optional">skip.sbs.parser.exception</propertyRef>
         <propertyRef usage="optional">build.temp.dir</propertyRef>
         <propertyRef usage="optional">build.type</propertyRef>
         <propertyRef usage="optional">build.version</propertyRef>
@@ -2590,6 +2901,7 @@
         <propertyRef usage="optional">helium.java.lib.dir</propertyRef>
         <propertyRef usage="optional">helium.svn.workarea.dir</propertyRef>
         <propertyRef usage="optional">helium.version</propertyRef>
+        <propertyRef usage="optional">helium.revision</propertyRef>
         <propertyRef usage="optional">ido.cenrep.root</propertyRef>
         <propertyRef usage="optional">ido.cenrep.target</propertyRef>
         <propertyRef usage="optional">ido.keep.old</propertyRef>
@@ -2690,5 +3002,32 @@
         <propertyRef usage="optional">hlm.enable.asserts</propertyRef>
         <propertyRef usage="optional">python.modules.path</propertyRef>
         <propertyRef usage="optional">metadata.dbfile</propertyRef>
+        <propertyRef usage="optional">exceptions.target</propertyRef>
+        <propertyRef usage="optional">ant.loglevel</propertyRef>
+        <propertyRef usage="optional">project.spec.name</propertyRef>
+    </group>
+    <group>
+        <name>Documentation</name>
+        <description/>
+        <propertyRef usage="optional">last.major.release.database.url</propertyRef>
+        <propertyRef usage="optional">ivy.xml.file</propertyRef>
+        <propertyRef usage="optional">dependency.grph</propertyRef>
+        <propertyRef usage="optional">python.dir</propertyRef>
+        <propertyRef usage="optional">python.internal.dir</propertyRef>
+        <propertyRef usage="optional">subcon</propertyRef>
+        <propertyRef usage="optional">dependency.external.grph</propertyRef>
+    </group>
+    <group>
+        <name>Bom</name>
+        <description/>
+        <propertyRef usage="optional">run.ccm</propertyRef>
+        <propertyRef usage="optional">old.bom.log</propertyRef>
+        <propertyRef usage="optional">symbian.version.week</propertyRef>
+        <propertyRef usage="optional">symbian.version</propertyRef>
+        <propertyRef usage="optional">symbian.version.year</propertyRef>
+        <propertyRef usage="optional">s60.version</propertyRef>
+        <propertyRef usage="optional">s60.release</propertyRef>
+        <propertyRef usage="optional">bom.log</propertyRef>
+        <propertyRef usage="required">build.number</propertyRef>
     </group>
 </heliumDataModel>
--- a/buildframework/helium/config/helium_distribution_test.cfg.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/config/helium_distribution_test.cfg.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -29,7 +29,7 @@
         <set name="temp.build.dir" value="${env.TEMP}"/>
         <set name="name" value="helium_${helium.version}_subcon"/>
         <set name="include" value="helium/**/*"/>
-        <set name="exclude" value="helium/**/.svn,helium/build/**/*,helium/**/*.pyc,helium/**/*.pyo,helium/**/distribution.policy.s60,helium/**/hlm_debug.log"/>
+        <set name="exclude" value="helium/**/.svn,helium/build/**/*,helium/**/*.pyc,helium/**/*.pyo,helium/**/distribution.policy.s60,helium/**/hlm_debug.log,helium/tools/common/python/**/*.class"/>
         <set name="distribution.policy.s60" value="7"/>
         <set name="ignore.missing.policyfiles" value="true"/>
 
--- a/buildframework/helium/config/ivy/modules/python-2.5.ivy.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/config/ivy/modules/python-2.5.ivy.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -23,8 +23,8 @@
 <ivy-module version="1.3">
     <info organisation="SWEPT"
           module="python"
-          revision="2.5"/>
+          revision="2.x"/>
     <publications>
-        <artifact name="python" type="exe" versionArgs="--version"/> 
+        <artifact name="python" type="exe" versionArgs="--version" versionExp=".*2\.[56].*"/> 
     </publications>
 </ivy-module>
\ No newline at end of file
--- a/buildframework/helium/config/java_checkstyle_config.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/config/java_checkstyle_config.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -49,8 +49,15 @@
 
         <!-- Checks for Javadoc comments.                     -->
         <!-- See http://checkstyle.sf.net/config_javadoc.html -->
-        <!--<module name="JavadocMethod"/>
-        <module name="JavadocVariable"/>
+        <module name="JavadocMethod">
+            <property name="severity" value="warning"/>
+            <property name="scope" value="public"/>
+            <property name="allowMissingParamTags" value="true"/>
+            <property name="allowMissingThrowsTags" value="true"/>
+            <property name="allowMissingReturnTag" value="true"/>
+            <property name="allowMissingPropertyJavadoc" value="true"/>
+        </module>
+        <!--<module name="JavadocVariable"/>
         <module name="JavadocStyle"/>-->
         
         <module name="JavadocType">
--- a/buildframework/helium/config/metadata_filter_config_default.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/config/metadata_filter_config_default.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,7 +21,9 @@
 ============================================================================
 -->
 <project name="metadata-filter-config" xmlns:hlm="http://www.nokia.com/helium">
-
+    <description>
+    Definitions of metadata filter inputs. 
+    </description>
     <hlm:metadatafilterset id="filterset.common">
         <metadatafilterset filterfile="${helium.dir}/config/metadata_regex.csv" />
     </hlm:metadatafilterset>
@@ -41,6 +43,12 @@
         <metadatafilter priority="info" regex="^INFO:" />
     </hlm:metadatafilterset>
 
+    <hlm:metadatafilterset id="filterset.qmake">
+        <metadatafilter priority="error" regex="^Error processing project file:" description="qt error" />
+        <metadatafilter priority="error" regex="^Result: [1-9][0-9]*" description="qt error" />
+        <metadatafilterset refid="filterset.common" />
+    </hlm:metadatafilterset>
+
     <hlm:metadatafilterset id="filterset.qt.configure">
         <metadatafilterset refid="filterset.common" />
     </hlm:metadatafilterset>
@@ -54,8 +62,8 @@
     </hlm:metadatafilterset>
 
     <hlm:metadatafilterset id="filterset.genxml.merge">
-        <metadatafilter priority="error" regex="^ERROR:" description="" />
-        <metadatafilter priority="error" regex="^Context:" description="" />
+        <metadatafilter priority="error" regex="^ERROR:.*" description="" />
+        <metadatafilter priority="error" regex=".*Context:.*" description="" />
     </hlm:metadatafilterset>
 
     <hlm:metadatafilterset id="filterset.buildarea.prep">
--- a/buildframework/helium/config/metadata_regex.csv	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/config/metadata_regex.csv	Wed Dec 23 19:29:07 2009 +0200
@@ -1,5 +1,5 @@
 priority,regex,description
-FATAL,.*mingw_make\.exe.*,
+CRITICAL,.*Error:.*mingw_make\.exe.*,
 ERROR,.*\): Missing file:.*, 
 ERROR,^(?:(?:\s*\d+\)\s*)|(?:\s*\*\*\*\s*))ERROR:.*,
 ERROR,.*Error:\s+.*,
@@ -14,6 +14,7 @@
 ERROR,^make(?:\[\d+\])?\: \*\*\*.*,
 ERROR,^make(?:\[\d+\])?:\s+.*\s+not\s+remade.*,
 ERROR,error: ((Internal fault):)$,
+ERROR,.*No such file or directory$,
 ERROR,Exception: [A-Z0-9_]+.*,
 ERROR,.*target .* given more than once in the same rule.*,
 ERROR,^ERROR:.*,
@@ -22,7 +23,14 @@
 ERROR,.*no rule to make.*,
 ERROR,^ERROR\t.*,
 ERROR,.*Traceback \(most recent call last\).*,
-CRITICAL,[Ww]arning:?\s+(#111-D|#1166-D|#117-D|#128-D|#1293-D|#1441-D|#170-D|#174-D|#175-D|#185-D|#186-D|#223-D|#231-D|#257-D|#284-D|#368-D|#414-D|#430-D|#47-D|#514-D|#546-D|#68-D|#69-D|#830-D|#940-D|#836-D|A1495E|L6318W|C2874W|C4127|C4355|C4530|C4702|C4786|LNK4049),
+ERROR,^Application encountered an unexpected error\.\s*Stopping\.\s*,
+ERROR,^Unable to write dump file .+,
+ERROR,^Unable to connect to CM: .*,
+ERROR,^.*: Incorrect slash in .*,
+ERROR,^.*: Incorrect case for epoc32 tree in .*,
+ERROR,^.*: Incorrect case versus exclusion list in .*,
+ERROR,The system cannot find the path specified.*,
+CRITICAL,.*[Ww]arning:?\s+(#111-D|#1166-D|#117-D|#128-D|#1293-D|#1441-D|#170-D|#174-D|#175-D|#185-D|#186-D|#223-D|#231-D|#257-D|#284-D|#368-D|#414-D|#430-D|#47-D|#514-D|#546-D|#68-D|#69-D|#830-D|#940-D|#836-D|A1495E|L6318W|C2874W|C4127|C4355|C4530|C4702|C4786|LNK4049).*,
 WARNING,^(\d+\))?\s.*WARNING:.*,
 WARNING,^MAKEDEF WARNING:.*,
 WARNING,.*\\\\(?)\(\d+\)\s:\sWarning:\s\(\d+\),
--- a/buildframework/helium/config/signaling_config_default.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/config/signaling_config_default.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -29,13 +29,13 @@
 
     <!-- Only for backward compatibility -->
     <hlm:notifierList id="defaultSignalFailNotifier">
-        <hlm:emailNotifier templateSrc="${helium.dir}/tools/common/templates/log/email_new.html.ftl" title="[signal] ${signal.name}"
+        <hlm:emailNotifier templateSrc="${helium.dir}/tools/common/templates/log/email_new.html.ftl" title="[signal] ${signal.name} - [message] ${signal.message}"
             smtp="${email.smtp.server}" ldap="${email.ldap.server}" notifyWhen="fail">
         </hlm:emailNotifier>
     </hlm:notifierList>
 
     <hlm:notifierList id="defaultFailNotifier">
-        <hlm:emailNotifier defaultTemplate="${helium.dir}/tools/common/templates/log/email_default.html.ftl" title="[signal] ${signal.name}"
+        <hlm:emailNotifier defaultTemplate="${helium.dir}/tools/common/templates/log/email_default.html.ftl" title="[signal] ${signal.name} - [message] ${signal.message}"
             smtp="${email.smtp.server}" ldap="${email.ldap.server}" notifyWhen="fail">
         </hlm:emailNotifier>
     </hlm:notifierList>
@@ -103,6 +103,10 @@
         <hlm:notifierListRef refid="defaultFailNotifier" />
     </hlm:signalInput>
 
+    <hlm:signalInput id="raptorErrorSignalInput" failbuild="now">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
     <hlm:signalInput id="eeRomsSignalInput" failbuild="never">
         <hlm:notifierListRef refid="defaultAlwaysNotifier" />
     </hlm:signalInput>
@@ -185,7 +189,12 @@
         </hlm:targetCondition>
         <signalNotifierInput>
             <signalInput refid="prepWorkAreaSignalInput" />
-            <notifierInput file = "${build.cache.log.dir}/signals/${build.id}_ccm_get_input.log.status.html" />
+            <notifierInput>
+                <fileset dir="${build.cache.log.dir}" >
+                    <include name="signals/${build.id}_ccm_get_input*" />
+                    <include name="${build.id}_ccm_get_input*" />
+                </fileset>
+            </notifierInput>
         </signalNotifierInput>
     </hlm:signalListenerConfig>
 
@@ -195,7 +204,11 @@
         </targetCondition>
         <signalNotifierInput>
             <signalInput refid="preparationSignalInput" />
-            <notifierInput file = "${build.signal.status.dir}/${build.id}_ant_build.log.status.html" />
+            <notifierInput>
+                <fileset dir="${build.log.dir}" >
+                    <include name="**/${build.id}_main.ant*" />
+                </fileset>
+            </notifierInput>
         </signalNotifierInput>
     </hlm:signalListenerConfig>
 
@@ -205,7 +218,11 @@
         </targetCondition>
         <signalNotifierInput>
             <signalInput refid="eeRomsSignalInput" />
-            <notifierInput file = "${build.signal.status.dir}/${build.id}_ee_roms.log.html" />
+            <notifierInput>
+                <fileset dir="${build.log.dir}" >
+                    <include name="**/${build.id}_ee_roms*" />
+                </fileset>
+            </notifierInput>
         </signalNotifierInput>
     </hlm:signalListenerConfig>
 
@@ -215,7 +232,11 @@
         </hlm:targetCondition>
         <signalNotifierInput>
             <signalInput refid="subconRomsSignalInput" />
-            <notifierInput file = "${build.signal.status.dir}/${build.id}_subcon.log.status.html" />
+            <notifierInput>
+                <fileset dir="${build.log.dir}" >
+                    <include name="**/${build.id}_subcon*" />
+                </fileset>
+            </notifierInput>
         </signalNotifierInput>
     </hlm:signalListenerConfig>
 
@@ -226,7 +247,11 @@
         </hlm:targetCondition>
         <signalNotifierInput>
             <signalInput refid="traceRomsSignalInput" />
-            <notifierInput file = "${build.signal.status.dir}/${build.id}_trace_roms.log.html" />
+            <notifierInput>
+                <fileset dir="${build.log.dir}" >
+                    <include name="**/${build.id}_trace_roms*" />
+                </fileset>
+            </notifierInput>
         </signalNotifierInput>
     </hlm:signalListenerConfig>
 
@@ -236,7 +261,11 @@
         </hlm:targetCondition>
         <signalNotifierInput>
             <signalInput refid="fotaSignalInput" />
-            <notifierInput file = "${build.signal.status.dir}/${build.id}_fota.log.status.html" />
+            <notifierInput>
+                <fileset dir="${build.log.dir}" >
+                    <include name="**/${build.id}_fota*" />
+                </fileset>
+            </notifierInput>
         </signalNotifierInput>
     </hlm:signalListenerConfig>
 
@@ -246,7 +275,11 @@
         </hlm:targetCondition>
         <signalNotifierInput>
             <signalInput refid="dataPackagingSignalInput" />
-            <notifierInput file = "${build.signal.status.dir}/${build.id}_dp.log.status.html" />
+            <notifierInput>
+                <fileset dir="${build.log.dir}" >
+                    <include name="**/${build.id}_dp*" />
+                </fileset>
+            </notifierInput>
         </signalNotifierInput>
     </hlm:signalListenerConfig>
 
@@ -260,27 +293,39 @@
         </targetCondition>
         <signalNotifierInput>
             <signalInput refid="atsSignalInput" />
-            <notifierInput file = "${build.signal.status.dir}/${build.id}_ats.log.status.html" />
+            <notifierInput>
+                <fileset dir="${build.log.dir}" >
+                    <include name="**/${build.id}_ats*" />
+                </fileset>
+            </notifierInput>
         </signalNotifierInput>
     </hlm:signalListenerConfig>
 
     <hlm:signalListenerConfig id="asteSignal" target="ats-aste" message="ASTE finished">
         <hlm:targetCondition>
-            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_ats.log.status.xml" />
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_aste.log.status.xml" />
         </hlm:targetCondition>
         <signalNotifierInput>
             <signalInput refid="atsSignalInput" />
-            <notifierInput file = "${build.signal.status.dir}/${build.id}_ats.log.status.html" />
+            <notifierInput>
+                <fileset dir="${build.log.dir}" >
+                    <include name="**/${build.id}_aste*" />
+                </fileset>
+            </notifierInput>
         </signalNotifierInput>
     </hlm:signalListenerConfig>
 
     <hlm:signalListenerConfig id="mattiSignal" target="matti-test" message="ATS MATTI creation finished">
         <targetCondition>
-            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_ats.log.status.xml" />
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_matti.log.status.xml" />
         </targetCondition>
         <signalNotifierInput>
             <signalInput refid="atsSignalInput" />
-            <notifierInput file = "${build.signal.status.dir}/${build.id}_ats.log.status.html" />
+            <notifierInput>
+                <fileset dir="${build.log.dir}" >
+                    <include name="**/${build.id}_matti*" />
+                </fileset>
+            </notifierInput>
         </signalNotifierInput>
     </hlm:signalListenerConfig>
 
@@ -308,11 +353,18 @@
 
     <hlm:signalListenerConfig id="signalValidatePolicyInvalidOrMissing" target="render-validate-policy" message="Policy file validation">
         <targetCondition>
-            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_validate_policy.log.status.xml" />
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_validate-policy.summary.status.xml" />
         </targetCondition>
         <signalNotifierInput>
             <signalInput refid="signalValidatePolicyInvalidOrMissingInput" />
-            <notifierInput file = "${build.signal.status.dir}/${build.id}_validate_policy.log.status.html" />
+            <notifierInput>
+                <fileset dir="${build.log.dir}" >
+                    <include name="**/${build.id}_validate-policy*" />
+                </fileset>
+                <fileset dir="${build.log.dir}" >
+                    <include name="**/${build.id}_validate-policy*" />
+                </fileset>
+            </notifierInput>
         </signalNotifierInput>
     </hlm:signalListenerConfig>
 
@@ -331,7 +383,11 @@
         </targetCondition>
         <signalNotifierInput>
             <signalInput refid="getenvSignalInput" />
-            <notifierInput file = "${build.signal.status.dir}/${build.id}_getenv.log.status.html" />
+            <notifierInput>
+                <fileset dir="${build.log.dir}" >
+                    <include name="**/${build.id}_getenv*" />
+                </fileset>
+            </notifierInput>
         </signalNotifierInput>
     </hlm:signalListenerConfig>
 
@@ -339,23 +395,24 @@
         <hlm:notifierListRef refid="defaultFailNotifier" />
     </hlm:signalInput>
 
+    <hlm:signalInput id="exceptionSignalInput" failbuild="defer">
+        <hlm:notifierListRef refid="defaultFailNotifier" />
+    </hlm:signalInput>
+
     <hlm:signalListenerConfig id="signalConfigureQt" target="configure-qt" message="Configuring Qt framework">
         <targetCondition>
             <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${qt.configure.log.name}.status.xml" />
         </targetCondition>
         <signalNotifierInput>
             <signalInput refid="signalConfigureQtInput" />
-            <notifierInput file = "${build.signal.status.dir}/${qt.configure.log.name}.status.html" />
+            <notifierInput>
+                <fileset dir="${build.log.dir}" >
+                    <include name="**/${qt.configure.log.name}*" />
+                </fileset>
+            </notifierInput>
         </signalNotifierInput>
     </hlm:signalListenerConfig>
 
-    <!-- Signal configuration for a signal sent when the build fails completely. -->
-    <hlm:signalInput id="buildExceptionSignalInput" failbuild="never">
-        <hlm:notifierListRef refid="defaultFailNotifier"/>
-    </hlm:signalInput>
-
-    <property name="signals.buildexception.signalinput" value="buildExceptionSignalInput"/>
-
     <hlm:signalInput id="signalRunQMakeInput" failbuild="defer">
         <hlm:notifierListRef refid="defaultFailNotifier" />
     </hlm:signalInput>
@@ -366,12 +423,16 @@
 
     <hlm:signalListenerConfig id="sisFilesSignal" target="sisfiles" message="sisfiles finished">
         <hlm:targetCondition>
-            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_sisfiles.log.status.xml" 
 />
+            <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_sisfiles.log.status.xml" 
+ />
         </hlm:targetCondition>
         <signalNotifierInput>
             <signalInput refid="sisfilesSignalInput" />
-            <notifierInput file = "${build.signal.status.dir}/${build.id}_sisfiles.log.status.html" />
+            <notifierInput>
+                <fileset dir="${build.log.dir}" >
+                    <include name="**/${build.id}_sisfiles*" />
+                </fileset>
+            </notifierInput>
         </signalNotifierInput>
     </hlm:signalListenerConfig>
-
 </project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/config/stages_config_default.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : stages_config.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="stages-config" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Definitions of helium stages. 
+    </description>
+    
+    <taskdef resource="com/nokia/helium/logger/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+    
+    <!-- Build Stage Summary configuration -->
+    <!-- Comment out below line to skip displaying build stage summary at end of build process -->
+    <hlm:stagesummary id="stage.summary" template="${helium.dir}\tools\common\templates\log\build_stages_summary.txt.ftl" />
+    
+     <!-- Stages configuration -->
+    <hlm:stage id="preparation" starttarget="prep" endtarget="prep"/>
+    <hlm:stage id="compilation" starttarget="compile-main" endtarget="compile-main"/>
+    <hlm:stage id="romcreation" starttarget="build-roms" endtarget="build-roms"/>
+    <hlm:stage id="test" starttarget="run-test" endtarget="run-test"/>
+    <hlm:stage id="localisation" starttarget="localisation" endtarget="localisation"/>
+    <hlm:stage id="postbuild" starttarget="publish" endtarget="publish"/>
+    
+    
+    <!-- Stage record configuration -->
+    <hlm:stagerecord id="stage.default" defaultoutput="${build.log}" loglevel="${ant.loglevel}" append="false"/>
+       
+    <hlm:stagerecord id="stage.preparation" stagerefid="preparation" output="${build.log.dir}/${build.id}_prep.ant.log" loglevel="info" append="true"/>
+    
+    <hlm:stagerecord id="stage.compilation" stagerefid="compilation" output="${build.log.dir}/${build.id}_compile.ant.log" loglevel="info" append="true"/>
+    
+    <hlm:stagerecord id="stage.romcreation" stagerefid="romcreation" output="${build.log.dir}/${build.id}_roms.ant.log" loglevel="info" append="true"/>
+    
+    <hlm:stagerecord id="stage.test" stagerefid="test" output="${build.log.dir}/${build.id}_test.ant.log" loglevel="info" append="true"/>
+    
+    <hlm:stagerecord id="stage.localisation" stagerefid="localisation" output="${build.log.dir}/${build.id}_localisation.ant.log" loglevel="info" append="true"/>
+    
+    <hlm:stagerecord id="stage.postbuild" stagerefid="postbuild" output="${build.log.dir}/${build.id}_postbuild.ant.log" loglevel="info" append="true"/>
+    
+    
+</project>
--- a/buildframework/helium/config/version.txt	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/config/version.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -1,4 +1,4 @@
 #Helium version - DO NOT EDIT
-#Tue Sep 22 14:15:51 IST 2009
-last.major.helium.version=5.0
-helium.version=6.0.1
+#Fri Dec 18 15:07:03 EET 2009
+last.major.helium.version=6.0
+helium.version=7.0
--- a/buildframework/helium/doc/src/api_changes.rst.ftl	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/doc/src/api_changes.rst.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -93,3 +93,24 @@
 * ${macro}
     </#if>
 </#list>
+
+Ant Tasks added
+===============
+<#list doc.apiChanges.taskdef?sort as taskdef>
+    <#assign link = taskdef.@classname>
+    <#if taskdef.@state == 'added'>
+      <#if link?contains("com.nokia.helium")>
+* `${taskdef} <helium-antlib/api/doclet/${link}.html>`_
+      <#else>          
+* `${taskdef} <api/ant/${link}.html>`_
+      </#if>
+    </#if>  
+</#list>
+
+Ant Tasks removed
+=================
+<#list doc.apiChanges.taskdef?sort as taskdef>
+    <#if taskdef.@state == 'removed'>
+* ${taskdef}
+    </#if>
+</#list>
\ No newline at end of file
--- a/buildframework/helium/doc/src/feature_list.rst	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/doc/src/feature_list.rst	Wed Dec 23 19:29:07 2009 +0200
@@ -374,6 +374,13 @@
 .. index::
   single: feature - API Analysis
 
+NSIS installer file creation
+----------------------------
+
+* Installer executables based on the NSIS installation software can be created.
+
+  * Plugins include environment setting modification.
+
 API analysis
 ------------
 
--- a/buildframework/helium/doc/src/helium_overview.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/doc/src/helium_overview.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -77,6 +77,7 @@
             <component>svnant</component>
             <component>xmltask</component>
             <component>ivy</component>
+            <component>helium-antlib</component>
         </row>
     </layer>
     <layer>
--- a/buildframework/helium/doc/src/index.rst.ftl	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/doc/src/index.rst.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -78,20 +78,11 @@
    
    tutorials/configuration/SimplestConfiguration
    tutorials/configuration/UseHlmTasksInConfiguration
-   tutorials/configuration/HowtoCreateANewSignal
    tutorials/rom_image
    tutorials/variant
    tutorials/qt_build
 <#if !ant?keys?seq_contains("sf")>
    nokia/blacktusk/howto-setup-blacktusk-with-helium
-
-* IDO_
-
-.. _IDO: ido
-
-* TeamCI_
-
-.. _TeamCI: teamci
 </#if>
 
 .. raw:: html
@@ -112,36 +103,135 @@
    :maxdepth: 1
 
 <#if !ant?keys?seq_contains("sf")>   
+   nokia/support
    nokia/nokia
    nokia/retrieving
 </#if>
    sf
    manual/running
    manual/configuring
-   manual/configuringdiamonds
-   manual/signaling
+   
+.. raw:: html
+
+   <script type="text/javascript" language="JavaScript"><!--
+   function HideContent(d) {
+   if(d.length < 1) { return; }
+   document.getElementById(d).style.display = "none";
+   }
+   function ShowContent(d) {
+   if(d.length < 1) { return; }
+   document.getElementById(d).style.display = "block";
+   }
+   function ReverseContentDisplay(d) {
+   if(d.length < 1) { return; }
+   if(document.getElementById(d).style.display == "none") { document.getElementById(d).style.display = "block"; }
+   else { document.getElementById(d).style.display = "none"; }
+   }
+   //--></script>
+   <ul><li class="toctree-l1"><a href="javascript:ReverseContentDisplay('stages')">Stages</a></li></ul>
+   <div id="stages" style="display:none; position:absolute; border-style: solid; background-color: white; padding: 5px;">
+   
+.. toctree::
+   :maxdepth: 2
+   
    manual/stages
+   
+.. raw:: html
+
+   </div>
 <#if !ant?keys?seq_contains("sf")>
+   <ul><li class="toctree-l1"><a href="javascript:ReverseContentDisplay('nokiastages')">Nokia Stages</a></li></ul>
+   <div id="nokiastages" style="display:none; position:absolute; border-style: solid; background-color: white; padding: 5px;">
+
+.. toctree::
+   :maxdepth: 2
+   
    nokia/nokiastages
+   
+.. raw:: html
+
+   </div>
+</#if>
+.. toctree::
+   :maxdepth: 1
+   
+<#if !ant?keys?seq_contains("sf")>
    nokia/rndsdk_user_manual
    nokia/quality
 </#if>
-   manual/cruisecontrol
    manual/debugging
    metrics
-   manual/APIs
-<#if !ant?keys?seq_contains("sf")>
-   api_changes
+   
+.. raw:: html
+
+   <ul><li class="toctree-l1"><a href="javascript:ReverseContentDisplay('api')">API</a></li></ul>
+   <div id="api" style="display:none; position:absolute; border-style: solid; background-color: white; padding: 5px;">
    
-* helium-antlib_
+* `Helium API`_
+* `Helium Antlib`_
+* `Ant Tasks`_
+
+.. _`Ant Tasks`: api/ant/index.html
+.. _`Helium API`: api/helium/index.html
+.. _`Helium Antlib`: helium-antlib/index.html
+
+<#if !(ant?keys?seq_contains("sf"))>
+* `Python API`_
+* `Java API`_
+* `IDO API`_
+* `DFS70501 API`_
 
-.. _helium-antlib: helium-antlib
+.. _`Python API`: api/python/index.html
+.. _`Java API`: api/java/index.html
+.. _`IDO API`: <#if ant['helium.version']?matches("^\\d+\\.0(?:\\.\\d+)?$")>../</#if>ido/api/helium/index.html
+.. _`DFS70501 API`: dfs70501/api/helium/index.html
+</#if>
+
+.. raw:: html
+
+   </div>
+   
+<#if !ant?keys?seq_contains("sf")>
+.. toctree::
+   :maxdepth: 1
+   
+   api_changes
+   nokia/releasenotes
 </#if>
 
 .. raw:: html
 
    </td><td>
 
+Helium Framework configuration
+==============================
+
+.. toctree::
+   :maxdepth: 1
+   
+   tutorials/configuration/HowtoCreateANewSignal
+   manual/signaling
+   manual/configuringdiamonds
+   manual/cruisecontrol
+   manual/antlogging
+* helium-antlib_
+
+.. _helium-antlib: helium-antlib
+
+<#if !ant?keys?seq_contains("sf")>
+Customer docs
+=============
+
+* IDO_
+
+.. _IDO: <#if ant['helium.version']?matches("^\\d+\\.0(?:\\.\\d+)?$")>../</#if>ido
+
+* TeamCI_
+
+.. _TeamCI: <#if ant['helium.version']?matches("^\\d+\\.0(?:\\.\\d+)?$")>../</#if>teamci
+
+</#if>
+
 Helium Architecture
 ===================
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/antlogging.rst	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,105 @@
+Configuring Logging
+=====================
+
+Features:
+-----------------
+* Will be initiated by the ANT Listener.
+* Logging will starts whenever build starts.
+* Helium logging framework offers you to configure the ant logging system for different stages of builds.
+* You can log the build process into seperate ant log files for each stage.
+* You can configure the log system to log different level of information (ex: debug, vebose, error).
+
+The configuration:
+-----------------
+
+We can configure the stages for which helium should log the build process.
+
+    * Stages
+       
+       * Stages are like preparation, compilation, postbuild etc.. for which we need to log build process. 
+       * Stages will have attributes for start and end targets.
+       * Stages will specify from which target we need log the build process and at which target we need to end logging build process.
+       
+       .. csv-table:: 
+          :header: "Attribute", "Description", "Required"
+   
+              "id", "Name of Stage (preparation, compilation)","Yes"
+              "starttarget", "Name of target to start logging.","Yes"
+              "endtarget", "Name of target to end logging.","Yes"
+      
+    * Stagerecord 
+
+       * Will record/log the build process from start target to end target mentioned in the Stage type.
+       * Need provide attributes like output log file, loglevel.
+       * Supports passwordfilterset datatype. If we need to filter any passwords from specific stage log files.
+       
+       .. csv-table:: 
+          :header: "Attribute", "Description", "Required"
+   
+              "id", "ID for stage record entry.", "Yes"
+              "defaultoutput", "File to record main ant log file" "Yes (should not have stagerefid attribute if stage record has defaultoutput)"
+              "stagerefid", "Stage reference ID. Exactly as given in the Stage", "Yes"
+              "output", "File to record the build process.", "Yes"
+              "loglevel", "Loglevel to record type of information. ex: debug, info, vebose", "No, Default it will be info"
+              "append", "To append the logging into existing file.", "No, Default it will be false"
+
+Example:
+-----------------
+.. code-block:: xml
+    
+        <hlm:stage id="preparation" starttarget="prep" endtarget="prep"/>
+        <hlm:stage id="compilation" starttarget="compile-main" endtarget="compile-main"/>
+        
+        <hlm:stagerecord id="stage.default" defaultoutput="${build.log.dir}/${build.id}_main.ant.log" loglevel="info" append="true"/>
+        <hlm:stagerecord id="stage.preparation" stagerefid="preparation" output="${build.log.dir}/${build.id}_prep.ant.log" loglevel="info" append="true"/>
+        <hlm:stagerecord id="stage.compilation" stagerefid="compilation" output="${build.log.dir}/${build.id}_compile.ant.log" loglevel="info" append="true"/>
+
+logreplace Task (hlm:logreplace)
+-----------------
+* LogReplace task will filter out the string from stage logging files.
+* If we need to filter out any user passwords and specific word which should n't be logged can passed to stage logging through this task.
+* Specified string will be filtered out from all the stages logging files.
+* It will not be filtered our by hlm:record task. To filter out the same need to passed to hlm:record task through recorderfilterset or recordfilter.
+
+Example:
+-----------------
+This example will filter out unix password value from all the stage logging files.
+
+.. code-block:: xml
+
+        <hlm:logreplace regexp="${unix.password}"/>
+
+
+Record Task (hlm:record)
+-----------------
+* Behaviour is same ANT record task with some addon features.
+* Filerts the logging messages which are passed through the filters to hlm:record task.
+* Will stops the logging happening by listener for any stages and resumes to stage logging once hlm:record task  finishes.
+
+Example:
+-----------------
+
+Below example
+    * Will sets one recoderfilteset.
+    * Will record the given target/tasks into ${build.id}_stagetest.log file by filtering the regexp mentioned in the recorderfilterset and recordfilter.
+
+.. code-block:: xml
+    
+        <hlm:recordfilterset id="recordfilter.config">
+            <hlm:recordfilter category="info" regexp="ERROR" />
+        </hlm:recordfilterset>
+        
+        <hlm:record name="${build.log.dir}/${build.id}_stagetest.log" action="start" loglevel="info">
+            <hlm:recordfilterset refid="recordfilter.config"/>
+            <hlm:recordfilter category="unix" regexp="${unix.password}" />
+        </hlm:record>
+        
+        ... Call tasks you would like to record the output  ...
+        
+        <hlm:record name="${build.log.dir}/${build.id}_stagetest.log" action="stop" append="true" />
+
+
+    
+    
+    
+
--- a/buildframework/helium/doc/src/manual/product_example.rst	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/doc/src/manual/product_example.rst	Wed Dec 23 19:29:07 2009 +0200
@@ -390,12 +390,6 @@
               <set name="rommake.product.name" value="product"/>
               <set name="rommake.product.type" value="RM-num"/>
   
-              <spec type="TemplateBuilder">
-                  <set name="template.build.id" value="${pr}.${build.number}" />
-                  <set name="template.file" value="${build.drive}\config\s60_32_config\number_config\number_product_config\config\data\CenrepVar_product\data\VariantData_product_template.xml" />
-                  <set name="output.file" value="${build.drive}\config\s60_32_config\number_config\number_product_config\config\data\CenrepVar_product\data\VariantData_product.xml" />
-              </spec>
-  
               <spec name="ee_group" abstract="true">
                   <set name="image.type" value="rnd,prd"/>
                   <set name="variant.txt.path" value="\epoc32\data\z\resource\versions\langsw.${config.name}.txt"/>
--- a/buildframework/helium/doc/src/manual/signaling.rst	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/doc/src/manual/signaling.rst	Wed Dec 23 19:29:07 2009 +0200
@@ -35,7 +35,7 @@
         <hlm:targetCondition>
             </available file="some-file.txt" />
         </hlm:targetCondition>
-    </hlm:signalConfig>
+    </hlm:signalListenerConfig>
  
 A signal will then be triggered each time the **target-name** completed. The signalInput will then defined how it should be handled.
 
@@ -162,12 +162,12 @@
        <hlm:notifierListRef refid="defaultSignalFailNotifier" />
    </hlm:signalInput>
    
-   <hlm:signalListenerConfig id="prepWorkAreaSignalWarn">
+   <hlm:signalListenerConfig id="prepWorkAreaSignalWarn" target="prep-work-area" message="Warnings happened during Preparing Work Area">>
         <signalNotifierInput>
             <signalInput refid="prepWorkAreaSignalInputWarn" />
             <notifierInput file="${build.log.dir}/${build.id}_ccm_get_input.log2.xml" />
         </signalNotifierInput>
-       <hlm:targetCondition name="prep-work-area" message="Warnings happened during Preparing Work Area">
+       <hlm:targetCondition> 
            <hlm:hasSeverity severity="error" file="${build.log.dir}/${build.id}_ccm_get_input.log2.xml"/>
        </hlm:targetCondition>
    </hlm:signalListenerConfig>
--- a/buildframework/helium/doc/src/manual/stages.rst.ftl	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/doc/src/manual/stages.rst.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -229,10 +229,25 @@
 
 The build preparation consists in two parts:
 
- * Getting delivery content (Synergy, zips...),
+ * Getting delivery content (SCM, zips...),
  * Preparing the build area.
 
-How to get delivery content from Synergy?
+To get SCM source you just have to run::
+
+  hlm prep-work-area
+
+To create 'build of materials'::
+
+  hlm create-bom
+
+Synergy
+-------
+
+In order for the synergy commands to be executed you must define the property ccm.enabled=true in one of the your config files or on the command line. e.g. 
+
+.. code-block:: xml
+
+    <property name="ccm.enabled" value="true" />
 
 It is possible to automatically get content from Synergy using the Helium framework.
 To handle that you have to configure the delivery.xml file from your family build configuration folder and reference by the property prep.delivery.file.
@@ -320,9 +335,23 @@
     The following properties are required:
         - database: the name of the synergy database you want to use.
 
-To get synergy source you just have to run::
-
-  hlm prep-work-area
+Mercurial
+---------
+
+Add to ant configuration:
+
+.. code-block:: xml
+
+    <target name="prep-work-area">
+        <hlm:scm scmUrl="scm:hg:C:/Build_C/master"> 
+            <hlm:checkout baseDir="${r'$'}{ccm.project.wa_path}/GraphicsDomain"/>
+            <hlm:changelog baseDir="${r'$'}{ccm.project.wa_path}/GraphicsDomain" xmlbom="${r'$'}{build.log.dir}/${r'$'}{build.id}_bom.xml" />
+        </hlm:scm>
+    </target>
+
+For more information see API_
+
+.. _API: ../helium-antlib/api/doclet/index.SCM.html
 
 .. index::
   single: Stage - Compilation
@@ -355,7 +384,7 @@
         <pathelement path="${r'$'}{build.drive}/mc/mc_build/${r'$'}{product.family}_build/4032_System_Definition.xml"/>
     </path>
     
-  The order of the files is significant. If building Symbian OS, the Symbian System Definition file must come first. Here both ``fileset`` and ``pathelement`` are used. ``pathelement`` selects just one file whereas a ``fileset`` can use wildcards to select multiple files or handle problems of filenames changing across different platform releases.
+The order of the files is significant. If building Symbian OS, the Symbian System Definition file must come first. Here both ``fileset`` and ``pathelement`` are used. ``pathelement`` selects just one file whereas a ``fileset`` can use wildcards to select multiple files or handle problems of filenames changing across different platform releases.
 
 2. Determine if an existing build configuration in any of the build model sections of the files are suitable for what needs to be built. A build configuration typically looks something like this:
 
@@ -377,7 +406,7 @@
          <task><buildLayer command="abld -check build" targetList="default" unitParallel="Y" targetParallel="Y"/></task>
     </configuration>
 
-  A ``unitListRef`` includes a ``unitList`` defined somewhere else as part of this configuration. The ``buildLayer`` elements define ``abld`` steps to run on each component. If an existing configuration is not sufficient a new one must be defined in a separate file (which should be included in the ``path`` type).
+A ``unitListRef`` includes a ``unitList`` defined somewhere else as part of this configuration. The ``buildLayer`` elements define ``abld`` steps to run on each component. If an existing configuration is not sufficient a new one must be defined in a separate file (which should be included in the ``path`` type).
 
 3. Define the ``sysdef.configurations`` Ant property to contain a comma-separated list of build configuration names that must match the ``name`` attribute of the ``configuration``. Each configuration will be built in turn in the ``compile-main`` Ant target.
 
@@ -465,6 +494,26 @@
    "``name``", "The name of the .pkg file to parse.", ""
    "``sis.name``", "The name of the .sis file to create. If omitted it will default to the name of the .pkg file.", ""
    "``path``", "The path where the .pkg file exists as input to building the .sis file.", ""
+   
+Configuration enhancements
+::::::::::::::::::::::::::
+
+*Since Helium 7.0.*
+
+The configuration method above will be replaced by a more flexible approach:
+
+.. csv-table:: Property descriptions
+   :header: "Property", "Description", "Values"
+
+   "``makesis.tool``", "The path for the makesis tool that builds a .sis file.", ""
+   "``signsis.tool``", "The path for the signsis tool that signs a .sis file to create a .sisx file.", ""
+   "``build.sisfiles.dir``", "The directory where the .sis file should be put.", ""
+   "``key``", "The key to use for signing.", ""
+   "``cert``", "The certificate to use for signing.", ""
+   "``input``", "The full path and filename of the input file. This can be a .pkg file, for generating a SIS file, a .sis file for signing, or a .sisx file for multiple signing.", ""
+   "``output``", "The full path and filename of the output file. This is only needed if the location or name needs to be different from the default, which is that the file extension changes appropriately.", ""
+
+Also a ``sis.config.name`` property is added that allows the name of a <config> block to be supplied. This can be overridden to allow particular subsets of configurations to be built.
 
 Checking Stub SIS files
 -----------------------
@@ -522,7 +571,7 @@
 .. csv-table:: Ant properties to modify
    :header: "Attribute", "Description", "Values"
 
-   "``regionalVariation``", "Enable regional variation switching.", "false"
+   "``regionalVariation``", "Enable regional variation switching. - Deprecated (always false)", "false"
 
 The imakerconfiguration supports three sub-types:
 
@@ -537,62 +586,78 @@
 Example of configuration:
 
 .. code-block:: xml
-     
-    <hlm:imakerconfigurationset>
-        <imakerconfiguration regionalVariation="true">
-            <makefileset>
-                <include name="**/devlon52/*ui.mk"/>
-            </makefileset>
-            <targetset>
-                <include name="^core${r'$'}" />
-                <include name="langpack_\d+" />
-                <include name="^custvariant_.*${r'$'}" />
-                <include name="^udaerase${r'$'}" />
-            </targetset>
-            <variableset>
-                <variable name="TYPE" value="rnd"/>
-                <variable name="USE_FOTI" value="0"/>
-                <variable name="USE_FOTA" value="1"/>
-            </variableset>
-        </imakerconfiguration>
-    </hlm:imakerconfigurationset>
+
+   <hlm:imakerconfigurationset>
+      <hlm:imakerconfiguration regionalVariation="true">
+         <makefileset>
+            <include name="**/product_name/*ui.mk" />
+         </makefileset>
+         <targetset>
+            <include name="^core${r'$'}" />
+            <include name="langpack_\d+" />
+            <include name="^custvariant_.*${r'$'}" />
+            <include name="^udaerase${r'$'}" />
+         </targetset>
+         <variableset>
+            <variable name="USE_FOTI" value="0" />
+            <variable name="USE_FOTA" value="1" />
+            <variable name="TYPE" value="rnd" />
+         </variableset>
+      </hlm:imakerconfiguration>
+   </hlm:imakerconfigurationset>
+
+
+Other example using product list and variable group:
+
+.. code-block:: xml
+
+   <hlm:imakerconfigurationset>
+      <hlm:imakerconfiguration>
+         <hlm:product list="product_name" ui="true" failonerror="false" />
+         <targetset>
+            <include name="^core${r'$'}" />
+            <include name="langpack_\d+" />
+            <include name="^custvariant_.*${r'$'}" />
+            <include name="^udaerase${r'$'}" />
+         </targetset>
+         <variableset>
+            <variable name="USE_FOTI" value="0" />
+            <variable name="USE_FOTA" value="1" />
+         </variableset>
+         <variablegroup>
+            <variable name="TYPE" value="rnd" />
+         </variablegroup>
+         <variablegroup>
+            <variable name="TYPE" value="subcon" />
+         </variablegroup>
+         <variablegroup>
+            <variable name="TYPE" value="prd" />
+         </variablegroup>
+      </hlm:imakerconfiguration>
+   </hlm:imakerconfigurationset>
+
 
 .. index::
    single: The iMaker Task
 
-The imaker task
----------------
-
-.. csv-table:: Ant properties to modify
-   :header: "Attribute", "Description", "Values"
-
-   "``executor``", "Name of the build system to be used.", "ebs, helium-ec and ec"
-   "``name``", "Log and intermediate file differentiator.", ""
-   "``signal``", "Enable/disable signaling mechanism.", "true, false"
-
-Example:
+How to configure the target
+---------------------------
+
+The target can be configured by defining an hlm:imakerconfigurationset element with the '''imaker.rom.config''' reference.
 
 .. code-block:: xml
-
-    <hlm:imaker executor="${r'$'}{build.system}" name="build">
-        <hlm:imakerconfigurationset>
-            <imakerconfiguration regionalVariation="true">
-                <makefileset>
-                   <include name="**/devlon52/*ui.mk"/>
-                </makefileset>
-                <targetset>
-                   <include name="core"/>
-                   <include name="langpack_\d+"/>
-                   <exclude name="cus.*"/>
-                </targetset>
-                <variableset>
-                    <variable name="TYPE" value="rnd"/>
-                </variableset>
-            </imakerconfiguration>
-        </hlm:imakerconfigurationset>
-    </hlm:imaker>
-
-
+    
+    <hlm:imakerconfigurationset id="imaker.rom.config">
+    ...
+    </hlm:imakerconfigurationset>
+
+The other configurable element is the engine. The '''imaker.engine''' property defines the reference
+to the engine configuration to use for building the roms. Helium defines two engines by default:
+* imaker.engine.default: multithreaded engine (hlm:defaultEngine type)
+* imaker.engine.ec: ECA engine - cluster base execution (hlm:emakeEngine type)
+  
+If the property is not defined Helium will guess the best engine to used based on the build.system property.
+ 
 .. index::
   single: Legacy ROM creation
 
@@ -1224,35 +1289,58 @@
 Cenrep creation (S60 3.2.3 - 5.x)
 :::::::::::::::::::::::::::::::::
 <#if !(ant?keys?seq_contains("sf"))>
-See: http://s60wiki.nokia.com/S60Wiki/Central_Repository_Usage
+See: http://configurationtools.nmp.nokia.com/builds/cone/docs/cli/generate.html?highlight=generate
 </#if>
 
-The target ``configtool`` can be used to run the Configuration Tool.
-
-Currently supported Configuration Tool arguments are:
-
-command_line | name
-
--master_conf    :   master_conf
--confml         :   confml
--impl           :   impl
--iby            :   iby
--ignore_errors  :   keepgoing(true - uses -ignore_errors, otherwise not, setting 
-                    true generates cenrep incase of errors, and signals has to be configured to stop the build
-                    in case of errors).
-
-Default values are:
+The target ``ido-gen-cenrep`` can be used to run the ConE Tool to generate cenreps.
+
+* IDO can use the ido-gen-cenrep to generate the cenreps which are IDO specific.
+* We should pass the sysdef.configurations.list as parameter to ido-gen-cenrep target. Else it will use the defualt one of helium.
+
+Example:
+:::::::::::::::::::::::::::::::::
+
+Below example will generate the cenrep only for IDO specific confml files.
+
+.. code-block:: xml
+
+    <target name="ido-generate-cenrep">
+        <antcall target="ido-gen-cenrep">
+            <param name="sysdef.configurations.list" value="dfs_build"/>    
+        </antcall>
+    </target>
+
+Below example will generate the cenreps for S60 SDK.
 
 .. code-block:: xml
 
-    <hlm:argSet id="cnftool.refid">
-        <hlm:arg name="path" value="${r'$'}{build.drive}/s60/tools/toolsextensions/configurationtool" />
-        <hlm:arg name="master_conf" value="s60.confml" />
-        <hlm:arg name="confml" value="\epoc32\rom\config\confml_data\s60" />
-        <hlm:arg name="impl" value="\epoc32\rom\config\confml_data\s60" />
-        <hlm:arg name="iby" value="\epoc32\rom\include\" />
-        <hlm:arg name="keepgoing" value="false" />
-    </hlm:argSet>
+    <target name="generate-s60-cenrep">
+        <hlm:conEToolMacro>
+            <arg name="output" value="<Path to output log file>"/>
+            <arg name="path" value="build.drive/epoc32/tools/" />
+            <arg name="-v" value="5" />
+            <arg name="-p" value="\epoc32\rom\config" />
+            <arg name="-o" value="\epoc32\release\winscw\urel\z " />
+            <arg name="-c" value="s60_root.confml" />
+        </hlm:conEToolMacro>
+    </target>
+
+By using conEToolMacro you can pass any arguments which are mentioned in the above link.
+
+.. code-block:: xml
+
+    <target name="generate-s60-cenrep">
+        <hlm:conEToolMacro>
+            <arg name="output" value="<Path to output log file>"/>
+            <arg name="path" value="<path to cone.cmd file>" />
+            <arg name="-v" value="<verbose level 0 - NONE (all), 1- CRITICAL, 2- ERROR, 3- WARNING, 4- INFO, 5- DEBUG>" />
+            <arg name="-p" value="<path to root folder containing conml file>" />
+            <arg name="-o" value="<path to output folder on the SDK to generate output files.> " />
+            <arg name="-c" value="<confml file name>" />
+        </hlm:conEToolMacro>
+    </target>
+        
+After running this command generated file can be found from <temp.build.dir>/<build.id>_cenrep_includefile.txt
 
 
 Running individual build commands
@@ -1341,7 +1429,7 @@
 Variation (S60 3.2.3 - 5.x)
 ---------------------------
 
-See ../tutorials/imaker/iMakerUseCaseCustomerVariantConfml.html
+See http://delivery.nmp.nokia.com/trac/imaker/wiki/iMakerUseCaseCustomerVariantConfml
 
 Variation (S60 3.2)
 -------------------
@@ -1594,16 +1682,16 @@
 
 
 .. index::
-  single: ATS3 - STIF, TEF, RTEST, MTF and EUnit
-
-.. _`Stage-ATS3-label`:
-
-Stage: ATS3 - STIF, TEF, RTEST, MTF and EUnit (also Qt)
+  single: ATS - STIF, TEF, RTEST, MTF and EUnit
+
+.. _`Stage-ATS-label`:
+
+Stage: ATS - STIF, TEF, RTEST, MTF and EUnit (also Qt)
 =======================================================
 
 ATS testing is the automatic testing of the phone code once it has been compiled and linked to create a ROM image.
 
-Explanation of the process for getting ATS3 (`STIF`_ and `EUnit`_) tests compiled and executed by Helium, through the use of the ``ats-test`` target.
+Explanation of the process for getting ATS (`STIF`_ and `EUnit`_) tests compiled and executed by Helium, through the use of the ``ats-test`` target.
 
 http://developer.symbian.org/wiki/index.php/Symbian_Test_Tools
 
@@ -1618,7 +1706,7 @@
 ----------------
 
 * `Harmonized Test Interface (HTI)`_ needs to be compiled and into the image.
-* The reader is expected to already have a working ATS3 setup in which test cases can be executed.  ATS3 server names, 
+* The reader is expected to already have a working ATS setup in which test cases can be executed.  ATS server names, 
   access rights and authentication etc. is supposed to be already taken care of.
 
 <#if !(ant?keys?seq_contains("sf"))>
@@ -1672,7 +1760,7 @@
 
 **STEP 2: Configure ATS properties in build.xml**
 
-**(A)** Username and Password for the ATS3 should be set in the `.netrc file`_
+**(A)** Username and Password for the ATS should be set in the `.netrc file`_
 
 .. code-block:: text
 
@@ -1698,14 +1786,14 @@
     **eunitexerunner.flags**       [recommended]   Flags for EUnit exerunner can be set by setting the value of this variable. The default flags are set to "/E S60AppEnv /R Off".
     **ats.email.list**             [recommended]   The property is needed if you want to get an email from ATS server after the tests are executed. There can be one to many semicolon(s) ";" separated email addresses.
     **ats.flashfiles.minlimit**    [recommended]   Limit of minimum number of flash files to execute ats-test target, otherwise ATSDrop.zip will not be generated. Default value is "2" files.
-    **ats.plan.name**              [recommended]   Modify the plan name if you have understanding of test.xml file or leave it as it is. Deafault value is "plan".
+    **ats.plan.name**              [recommended]   Modify the plan name if you have understanding of test.xml file or leave it as it is. Default value is "plan".
     **ats.product.hwid**           [recommended]   Product HardWare ID (HWID) attached to ATS. By default the value of HWID is not set.
     **ats.script.type**            [recommended]   There are two types of ats script files to send drop to ATS server, "runx" and "import"; only difference is that with "import" ATS doesn't have to have access rights to testdrop.zip file, as it is sent to the system over http and import doesn't need network shares. If that is not needed "import" should not be used. Default value is "runx" as "import" involves heavy processing on ATS server.
     **ats.target.platform**        [recommended]   Sets target platform for compiling test components. Default value is "armv5 urel".
-    **ats.test.timeout**           [recommended]   To set test commands execution time limit on ATS3 server, in seconds. Default value is "60".
-    **ats.testrun.name**           [recommended]   Modify the test-run name if you have understanding of test.xml file or leave it as it is. Deafault value is a string consist of build id, product name, major and minor versions.
-    **ats.trace.enabled**          [recommended]   Should be "True" if tracing is needed during the tests running on ATS3. Deafault value is "False", the values are case-sensitive.
-    **ats.ctc.enabled**            [recommended]   Should be "True" if coverage measurement and dynamic analysis (CTC) tool support is to be used by ATS. Deafault value is "False", the values are case-sensitive.
+    **ats.test.timeout**           [recommended]   To set test commands execution time limit on ATS server, in seconds. Default value is "60".
+    **ats.testrun.name**           [recommended]   Modify the test-run name if you have understanding of test.xml file or leave it as it is. Default value is a string consist of build id, product name, major and minor versions.
+    **ats.trace.enabled**          [recommended]   Should be "True" if tracing is needed during the tests running on ATS. Default value is "False", the values are case-sensitive. See http://s60wiki.nokia.com/S60Wiki/CATS/TraceTools
+    **ats.ctc.enabled**            [recommended]   Should be "True" if coverage measurement and dynamic analysis (CTC) tool support is to be used by ATS. Default value is "False", the values are case-sensitive.
     **ats.ctc.host**               [recommended]   CTC host, provided by CATS used to create coverage measurement reports. MON.sym files are copied to this location, for example "10.0.0.1". If not given, code coverage reports are not created
     **ats.obey.pkgfiles.rule**     [recommended]   If the property is set to "True", then the only test components which will have PKG files, will be included into the test.xml as a test-set. Which means, even if there's a test component (executable) but there's no PKG file, it should not be considered as a test component and hence not included into the test.xml as a separate test. By default the property value is False.
     **reference.ats.flash.images** [recommended]   Fileset for list of flash images (can be .fpsx, .C00, .V01 etc) It is recommended to set the fileset, default filset is given below which can be overwritten. set *dir=""* attribute of the filset to "${r'$'}{build.output.dir}/variant_images" if "variant-image-creation" target is being used.
@@ -1713,7 +1801,9 @@
     **tsrc.path.list**             [allowed]       Contains list of the tsrc directories. Gets the list from system definition layer files. Assuming that the test components are defined already in te layers.sysdef.xml files to get compiled. Not recommended, but the property value can be set if there are no system definition file(s), and tsrc directories paths to set manually.
     **ats.report.location**        [allowed]       Sets ATS reports store location. Default location is "${r'$'}{publish.dir}/${r'$'}{publish.subdir}".
     **ats.multiset.enabled**       [allowed]       Should be "True" so a set is used for each pkg file in a component, this allows tests to run in parallel on several devices.
-
+    **ats.diamonds.signal**        [allowed]       Should be "true" so at end of the build diamonds is checked for test results and helium fails if tests failed.
+    **ats.delta.enabled**          [allowed]       Should be "true" so only ado's changed during do-prep-work-area are tested by ats.
+    **ats4.enabled**               [allowed]       Should be "true" if ats4 is to be used.
     ============================== =============== ===============
 
 
@@ -1722,7 +1812,7 @@
 .. code-block:: xml
 
     <property name="ats.server" value="4fio00105"  />
-    <property name="ats.drop.location" location="\\trwsimXX\ATS3_TEST_SHARE\" />
+    <property name="ats.drop.location" location="\\trwsimXX\ATS_TEST_SHARE\" />
     <property name="ats.email.list" value="temp.user@company.com; another.email@company.com" />
     <property name="ats.flashfiles.minlimit" value="2" />
     <property name="ats.product.name" value="PRODUCT" />
@@ -1747,10 +1837,6 @@
         <include name="**/${r'$'}{build.id}*.core.fpsx"/>
         <include name="**/${r'$'}{build.id}*.rofs2.fpsx"/>
         <include name="**/${r'$'}{build.id}*.rofs3.fpsx"/>
-        <include name="**/*rnd.C00"/>
-        <include name="**/*rnd.V01"/>
-        <include name="**/*.fpsx"/>
-        <include name="**/*_rnd.fpsx"/>
     </fileset>
     
 
@@ -1758,7 +1844,7 @@
 
 **STEP 3: Call target ats-test**
 
-To execute the target, a property should be set(``<property name="enabled.ats" value="1" />``).
+To execute the target, a property should be set(``<property name="enabled.ats" value="true" />``).
 
 Then call ``ats-test``, which will create the ATSDrop.zip (test package).
 
@@ -1767,9 +1853,20 @@
 CTC:
 ----
 
-CTC code coverage measurement can be created automatically by enabling property ``ats.ctc.enabled``
-
-Also, property ``ats.ctc.host`` must be defined (See the description above)
+CTC code coverage measurements reports can be created as part of Test Automation process.
+
+1. Build the src using ``build_ctc`` configuration, which is in ``build.sysdef.xml`` file, to create ``MON.sym`` files. It means that a property ``sysdef.configurations.list`` should be modified either add or replace current build configuration with ``build_ctc``
+
+2. Set the property, ``ats.ctc.host``, as described above, for sending the ``MON.sym`` files to the network drive. *(Please contact ATS server administrator and ask for the value to set this property)*
+
+3. Enable CTC process by setting up property ``ats.ctc.enabled`` to "true"
+
+4. Test drops are sent to the ATS server, where, after executing tests ``ctcdata.txt`` files are created. ``ctcdata.txt`` and ``MON.sym`` files are then further processed to create code coverage reports.
+
+5. View or download the Code coverage reports by following the link provided in the ATS report email (sent after the tests are executed on ATS)
+
+*NOTE: After receiving the email notification, it may take a few minutes before the code coverage reports are available.*
+
 
 Qt Tests:
 ---------
@@ -1782,12 +1879,12 @@
 
 .. _`Skip-Sending-AtsDrop-label`:
 
-Skip Sending AtsDrop to ATS3
+Skip Sending AtsDrop to ATS
 ----------------------------
 
-By setting property of ``skip.ats.sending``, ``ats-test`` target only creates a drop file, and does not send the drop (or package) to ATS3 server.
-
-Customizing the test.xml in ATS3
+By setting property of ``skip.ats.sending``, ``ats-test`` target only creates a drop file, and does not send the drop (or package) to ATS server.
+
+Customizing the test.xml in ATS
 --------------------------------
 
 The user can customize the generated test.xml with files:
@@ -1887,12 +1984,12 @@
 
 
 .. index::
-  single: ATS3 - ASTE
-
-Stage: ATS3 - ASTE
+  single: ATS - ASTE
+
+Stage: ATS - ASTE
 ===================
 
-Explanation of the process for getting ATS3 `ASTE`_ tests compiled and executed by Helium, through the use of the ``ats-aste`` target.
+Explanation of the process for getting ATS `ASTE`_ tests compiled and executed by Helium, through the use of the ``ats-aste`` target.
 
 <#if !(ant?keys?seq_contains("sf"))>
 .. _`ASTE`: http://s60wiki.nokia.com/S60Wiki/ASTE
@@ -1902,7 +1999,7 @@
 --------------
 
 * `Harmonized Test Interface (HTI)`_ needs to be compiled and into the image.
-* The reader is expected to already have a working ATS3 setup in which test cases can be executed.  ATS3 server names, access rights and authentication etc. is supposed to be already taken care of.
+* The reader is expected to already have a working ATS setup in which test cases can be executed.  ATS server names, access rights and authentication etc. is supposed to be already taken care of.
 * `SW Test Asset`_ location and type of test should be known.
 
 <#if !(ant?keys?seq_contains("sf"))>
@@ -1920,7 +2017,7 @@
 
 **STEP 1: Configure ASTE properties in build.xml**
 
-**(A)** Username and Password for the ATS3 should be set in the `.netrc file`_
+**(A)** Username and Password for the ATS should be set in the `.netrc file`_
 
 .. code-block:: text
 
@@ -1943,16 +2040,16 @@
     **Property Name**               **Edit Status** **Description**
     =============================== =============== ===============
     **ats.server**                  [must]          For example: "4fio00105" or "catstresrv001.cats.noklab.net:80". Default server port is "8080", but it is not allowed between intra and Noklab. Because of this we need to define server port as 80. The host can be different depending on site and/or product.
-    **ats.drop.location**           [must]          Server location (UNC path) to save the ATS3Drop file, before sending to the ATS. For example: \\\\trwsem00\\some_folder\\. In case, ``ats.script.type`` is set to "import", ATS doesn't need to have access to ats.drop.location,  its value can be any local folder on build machine, for example c:/temp (no network share needed).
+    **ats.drop.location**           [must]          Server location (UNC path) to save the ATSDrop file, before sending to the ATS. For example: \\\\trwsem00\\some_folder\\. In case, ``ats.script.type`` is set to "import", ATS doesn't need to have access to ats.drop.location,  its value can be any local folder on build machine, for example c:/temp (no network share needed).
     **ats.product.name**            [must]          Name of the product to be tested. For example: "PRODUCT".
     **ats.aste.testasset.location** [must]          Location of SW Test Assets, if the TestAsset is not packaged then it is first compressed to a ``.zip`` file. It should be a UNC path.
     **ats.aste.software.release**   [must]          Flash images releases, for example "SPP 51.32".
     **ats.aste.software.version**   [must]          Version of the software to be tested. For example: "W810"
     **ats.aste.email.list**         [recommended]   The property is needed if you want to get an email from ATS server after the tests are executed. There can be one to many semicolon(s) ";" separated email addresses.
     **ats.flashfiles.minlimit**     [recommended]   Limit of minimum number of flash files to execute ats-test target, otherwise ATSDrop.zip will not be generated. Default value is "2" files.
-    **ats.aste.plan.name**          [recommended]   Modify the plan name if you have understanding of test.xml file or leave it as it is. Deafault value is "plan".
+    **ats.aste.plan.name**          [recommended]   Modify the plan name if you have understanding of test.xml file or leave it as it is. Default value is "plan".
     **ats.product.hwid**            [recommended]   Product HardWare ID (HWID) attached to ATS. By default the value of HWID is not set.
-    **ats.test.timeout**            [recommended]   To set test commands execution time limit on ATS3 server, in seconds. Default value is "60".
+    **ats.test.timeout**            [recommended]   To set test commands execution time limit on ATS server, in seconds. Default value is "60".
     **ats.aste.testrun.name**       [recommended]   Modify the test-run name if you have understanding of test.xml file or leave it as it is. Default value is a string consists of build id, product name, major and minor versions.
     **ats.aste.test.type**          [recommended]   Type of test to run. Default is "smoke".
     **ats.aste.testasset.caseids**  [recommended]   These are the cases that which tests should be run from the TestAsset. For example, value can be set as "100,101,102,103,105,106,". A comma is needed to separate case IDs
@@ -1966,7 +2063,7 @@
 .. code-block:: xml
     
     <property name="ats.server" value="4fio00105"  />
-    <property name="ats.drop.location" value="\\trwsimXX\ATS3_TEST_SHARE\" />
+    <property name="ats.drop.location" value="\\trwsimXX\ATS_TEST_SHARE\" />
     <property name="ats.aste.email.list" value="temp.user@company.com; another.email@company.com" />
     <property name="ats.flashfiles.minlimit" value="2" />
     <property name="ats.product.name" value="PRODUCT" />
@@ -1989,10 +2086,6 @@
         <include name="**/${r'$'}{build.id}*.core.fpsx"/>
         <include name="**/${r'$'}{build.id}*.rofs2.fpsx"/>
         <include name="**/${r'$'}{build.id}*.rofs3.fpsx"/>
-        <include name="**/*rnd.C00"/>
-        <include name="**/*rnd.V01"/>
-        <include name="**/*.fpsx"/>
-        <include name="**/*_rnd.fpsx"/>
     </fileset>
     
 
@@ -2000,14 +2093,14 @@
 
 **STEP 2: Call target ats-aste**
 
-To execute the target, a property should be set(``<property name="enabled.aste" value="1" />``).
+To execute the target, a property should be set(``<property name="enabled.aste" value="true" />``).
 
 Then call ``ats-aste``, which will create the ATSDrop.zip (test package).
 
 If property ``ats.aste.email.list`` is set, an email (test report) will be sent when the tests are ready on ATS/ASTE.
 
 
-Skip Sending AtsDrop to ATS3
+Skip Sending AtsDrop to ATS
 ------------------------------
 
 click :ref:`Skip-Sending-AtsDrop-label`:
@@ -2018,15 +2111,15 @@
 Stage: MATTI
 =============
 
-MATTI testing is very similar to ATS3 testing, so for details of how it all links together see :ref:`Stage-ATS3-label`: `and the matti website`_.
+MATTI testing is very similar to ATS testing, so for details of how it all links together see :ref:`Stage-ATS-label`: `and the matti website`_.
 
 <#if !(ant?keys?seq_contains("sf"))>
 .. _`and the matti website`:  http://trmatti1.nmp.nokia.com/help/
 </#if>  
 
-The set up of parameters is very similar (a few less parameters and it mostly uses ATS3 values). The main difference is that once the drop file has been uploaded to the ATS3 server it uses MATTI to perform the tests and not ATS3, this is achieved by calling the MATTIDrop.py script instead of the ATSE or ATS3 scripts when creating the drop file (the drop file contains the flash files and the ruby tests to be performed).
-
-The following parameters are the ones that are not listed in the ATS3 parameters, all other parameters required are as listed in the ATS3 section above.
+The set up of parameters is very similar (a few less parameters and it mostly uses ATS values). The main difference is that once the drop file has been uploaded to the ATS server it uses MATTI to perform the tests and not ATS, this is achieved by calling the MATTIDrop.py script instead of the ATSE or ATS scripts when creating the drop file (the drop file contains the flash files and the ruby tests to be performed).
+
+The following parameters are the ones that are not listed in the ATS parameters, all other parameters required are as listed in the ATS section above.
 
 * [must] - must be set by user
 * [recommended] - should be set by user but not mandatory
@@ -2053,36 +2146,25 @@
 
 .. code-block:: xml
 
-    <property name="enabled.matti" value="1" />
-    <property name="enabled.ats" value="1" />
+    <property name="enabled.matti" value="true" />
     <property name="matti.scripts" value="${r'$'}{helium.dir}\testconfig\ats3\matti\script" />
     <property name="template.file" value="${r'$'}{helium.dir}\tools\common\python\lib\ats3\matti\template\matti_demo.xml" />
     <property name="ats.sis.images.dir" location="${r'$'}{build.drive}\output\matti\sis" />
-    <property name="ats.image.type" value="variant" />
     <property name="ats.product.name" value="" />
-    <property name="ats.email.list" value="" />
-    <property name="ats.plan.name" value="" />
-    <property name="ats.flashfiles.minlimit" value="2" />
-    <property name="ats.target.platform" value="armv5 urel" />
-    <property name="ats.script.type" value="import" />
-    <property name="ats.product.hwid" value="" />
-    <property name="core.build.version" value="1" />
-    <property name="ats.testrun.name" value="${r'$'}{build.id}_${r'$'}{ats.product.name}_${r'$'}{core.build.version}" />
     <property name="ats.test.timeout" value="60" />
-    <property name="ats.output.dir" location="${r'$'}{build.drive}\output\ats" />
-
-    <!--ats3 testing properties-->
+
+    <!--ATS testing properties-->
     <property name="tsrc.data.dir" value="data_rom" />
     <property name="ats.ctc.enabled" value="True" />
     <property name="ats.flashfiles.minlimit" value="2"/>
     <property name="ta.flag.list" value="TA_M, TA_MU, TA_MMAPPFW,TA_MM"/>
     <property name="ats.server" value="12345675:80"/>
 
-In order to upload and view the test run you need to have a valid user id and password that matches that in your .netrc file. To create the account open a web browser window and enter the name of the ats.server with /ats3 at the end e.g. http://123456:80/ats3. Click on the link in the top right hand corner to create the account. To view the test run once your account is active you need to click on the 'test runs' tab.
+In order to upload and view the test run you need to have a valid user id and password that matches that in your .netrc file. To create the account open a web browser window and enter the name of the ats.server with /ATS at the end e.g. http://123456:80/ATS. Click on the link in the top right hand corner to create the account. To view the test run once your account is active you need to click on the 'test runs' tab.
 
 To run the tests call the target `matti-test` (you will need to define the 'build.drive', 'build.number' and it is best to create the 'core.build.version' on the command line as well if you do not add it to the list of targets run that create the ROM image). e.g.
 ::
 
     hlm -Dbuild.number=001 -Dbuild.drive=z: -Dcore.build.version=001 matti-test
 
-If it displays the message 'Testdrop created!' with the file name then the MATTIDrops.py script has done what it needs to do. The next thing to check is that the drop file has been uploaded to the ATS3 server OK. If that is performed successfully then the rest of the testing needs to be performed by the ATS3 server. There is also a test.xml file created that contains details needed for debugging any problems that might occur. To determine if the tests have run correctly you need to read the test run details from the server.
+If it displays the message 'Testdrop created!' with the file name then the MATTIDrops.py script has done what it needs to do. The next thing to check is that the drop file has been uploaded to the ATS server OK. If that is performed successfully then the rest of the testing needs to be performed by the ATS server. There is also a test.xml file created that contains details needed for debugging any problems that might occur. To determine if the tests have run correctly you need to read the test run details from the server.
--- a/buildframework/helium/doc/src/sf.rst	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/doc/src/sf.rst	Wed Dec 23 19:29:07 2009 +0200
@@ -7,9 +7,9 @@
 
 Install the following tools:
 
-* `ActivePython 2.5`_
+* `ActivePython 2.6`_
 
-.. _`ActivePython 2.5`: http://www.activestate.com/activepython/downloads
+.. _`ActivePython 2.6`: http://www.activestate.com/activepython/downloads
 
 * `ActivePerl 5.6.1`_
 
--- a/buildframework/helium/doc/src/tutorials/configuration/HowtoCreateANewSignal.rst	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/doc/src/tutorials/configuration/HowtoCreateANewSignal.rst	Wed Dec 23 19:29:07 2009 +0200
@@ -48,14 +48,14 @@
 
 
 
-To declare a new signal to the framework you need to define a new signalConfig reference.
+To declare a new signal to the framework you need to define a new signalListenerConfig reference.
 You also need to create a signalInput configuration to define your signal behaviour.
 
 .. code-block:: xml
  
    <hlm:signalInput id="customActionSignalInput" failbuild="defer"/>
    
-   <hlm:signalListenerConfig id="customActionSignal" name="custom-action" message="custom-action target ended.">
+   <hlm:signalListenerConfig id="customActionSignal" target="custom-action" message="custom-action target ended.">
       <signalNotifierInput>
           <signalInput refid="customActionSignalInput" />
           <notifierInput file="${artifact}" />
@@ -63,13 +63,13 @@
       <hlm:targetCondition>
          <not><available file="${artifact}"/></not>            
       </hlm:targetCondition>
-   </hlm:signalConfig>
+   </hlm:signalListenerConfig>
 
 
-The signalListenerConfig defines which target to listen and raise signal for. The target name is defined through the **name** attribute.
+The signalListenerConfig defines which target to listen and raise signal for. The target name is defined through the **target** attribute.
 Then the nested **targetCondition** element is used to configure how the signal should be triggered.
 This element accepts any nested `Ant conditions <http://ant.apache.org/manual/CoreTasks/conditions.html>`_.
-In this case the signal will get raised only id the file is not present after the execution of the **custom-action** target.
+In this case the signal will get raised only if the file is not present after the execution of the **custom-action** target.
 
 The framework then uses the defined signalInput from the signalNotifierInput configuration to know how to behave when the signal is raised. In the previous example it will
 simply keep running and fail the build at the end. Then files defined by the nested notifierInput will be passed to the notifier.
@@ -110,4 +110,4 @@
    BUILD SUCCESSFUL
    Total time: 2 seconds
 
-   
\ No newline at end of file
+   
--- a/buildframework/helium/doc/src/tutorials/qt_build.rst	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/doc/src/tutorials/qt_build.rst	Wed Dec 23 19:29:07 2009 +0200
@@ -9,17 +9,6 @@
 
 This tutorial explains how to update your configuration to enable Qt building.
 
-Configuring Qt
-==============
-
-Helium has a ready to use target which allows you to configure Qt. You just need to make sure the qt.dir
-property is configured with the correct location of your Qt source.
-Then you can run the target as follow::
-
- > hlm -Dbuild.drive=Q: -Dbuild.number=1 configure-qt
- ...
- 
-This target has now been depreciated in Helium 6.0, please consider building Qt using Symbian toolchain (SBS or SBSv2).
 
 Building Qt components
 ======================
--- a/buildframework/helium/external/filedisk/COPYING.TXT	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,340 +0,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year  name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
--- a/buildframework/helium/external/filedisk/example.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-C:\>filedisk
-syntax:
-filedisk /mount  <devicenumber> <filename> [size[k|M|G] | /ro | /cd] <drive:>
-filedisk /umount <drive:>
-filedisk /status <drive:>
-
-filename formats:
-  c:\path\filedisk.img
-  \Device\Harddisk0\Partition1\path\filedisk.img
-  \\server\share\path\filedisk.img
-
-example:
-filedisk /mount  0 c:\temp\filedisk.img 8M f:
-filedisk /mount  1 c:\temp\cdimage.iso /cd i:
-filedisk /umount f:
-filedisk /umount i:
-
-C:\>filedisk /mount 0 c:\temp\filedisk.img 8M f:
-
-C:\>format /fs:fat f:
-The type of the file system is RAW.
-The new file system is FAT.
-
-WARNING, ALL DATA ON NON-REMOVABLE DISK
-DRIVE F: WILL BE LOST!
-Proceed with Format (Y/N)? y
-Verifying 7M
-Initializing the File Allocation Table (FAT)...
-Volume label (11 characters, ENTER for none)? filedisk
-Format complete.
-
-    8 353 792 bytes total disk space.
-    8 353 792 bytes available on disk.
-
-        2 048 bytes in each allocation unit.
-        4 079 allocation units available on disk.
-
-           12 bits in each FAT entry.
-
-Volume Serial Number is 28DF-0C81
-
-C:\>dir f:
- Volume in drive F is FILEDISK
- Volume Serial Number is 28DF-0C81
-
- Directory of F:\
-
-File Not Found
-
-C:\>chkdsk f:
-The type of the file system is FAT.
-Volume FILEDISK created 2002-11-24 14:25
-Volume Serial Number is 28DF-0C81
-Windows is verifying files and folders...
-File and folder verification is complete.
-Windows has checked the file system and found no problems.
-
-    8 353 792 bytes total disk space.
-    8 353 792 bytes available on disk.
-
-        2 048 bytes in each allocation unit.
-        4 079 total allocation units on disk.
-        4 079 allocation units available on disk.
-
-C:\>filedisk /status f:
-f: \??\c:\temp\filedisk.img Size: 8388608 bytes
-
-C:\>filedisk /umount f:
-
-C:\>
--- a/buildframework/helium/external/filedisk/exe/MAKEFILE	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-#
-# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
-# file to this component.  This file merely indirects to the real make file
-# that is shared by all the driver components of the Windows NT DDK
-#
-
-!INCLUDE $(NTMAKEENV)\makefile.def
--- a/buildframework/helium/external/filedisk/exe/filedisk.c	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,423 +0,0 @@
-/*
-    Control program for a virtual disk driver for Windows NT/2000/XP.
-    Copyright (C) 1999, 2000, 2001, 2002 Bo Brantén.
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
-
-#include <windows.h>
-#include <winioctl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "filedisk.h"
-
-int FileDiskSyntax(void)
-{
-    fprintf(stderr, "syntax:\n");
-    fprintf(stderr, "filedisk /mount  <devicenumber> <filename> [size[k|M|G] | /ro | /cd] <drive:>\n");
-    fprintf(stderr, "filedisk /umount <drive:>\n");
-    fprintf(stderr, "filedisk /status <drive:>\n");
-    fprintf(stderr, "\n");
-    fprintf(stderr, "filename formats:\n");
-    fprintf(stderr, "  c:\\path\\filedisk.img\n");
-    fprintf(stderr, "  \\Device\\Harddisk0\\Partition1\\path\\filedisk.img\n");
-    fprintf(stderr, "  \\\\server\\share\\path\\filedisk.img\n");
-    fprintf(stderr, "\n");
-    fprintf(stderr, "example:\n");
-    fprintf(stderr, "filedisk /mount  0 c:\\temp\\filedisk.img 8M f:\n");
-    fprintf(stderr, "filedisk /mount  1 c:\\temp\\cdimage.iso /cd i:\n");
-    fprintf(stderr, "filedisk /umount f:\n");
-    fprintf(stderr, "filedisk /umount i:\n");
-
-    return -1;
-}
-
-void PrintLastError(char* Prefix)
-{
-    LPVOID lpMsgBuf;
-
-    FormatMessage( 
-        FORMAT_MESSAGE_ALLOCATE_BUFFER |
-        FORMAT_MESSAGE_FROM_SYSTEM |
-        FORMAT_MESSAGE_IGNORE_INSERTS,
-        NULL,
-        GetLastError(),
-        0,
-        (LPTSTR) &lpMsgBuf,
-        0,
-        NULL
-        );
-
-    fprintf(stderr, "%s %s", Prefix, (LPTSTR) lpMsgBuf);
-
-    LocalFree(lpMsgBuf);
-}
-
-int
-FileDiskMount(
-    int                     DeviceNumber,
-    POPEN_FILE_INFORMATION  OpenFileInformation,
-    char                    DriveLetter,
-    BOOLEAN                 CdImage
-)
-{
-    char    VolumeName[] = "\\\\.\\ :";
-    char    DeviceName[255];
-    HANDLE  Device;
-    DWORD   BytesReturned;
-
-    VolumeName[4] = DriveLetter;
-
-    Device = CreateFile(
-        VolumeName,
-        GENERIC_READ | GENERIC_WRITE,
-        FILE_SHARE_READ | FILE_SHARE_WRITE,
-        NULL,
-        OPEN_EXISTING,
-        FILE_FLAG_NO_BUFFERING,
-        NULL
-        );
-
-    if (Device != INVALID_HANDLE_VALUE)
-    {
-        SetLastError(ERROR_BUSY);
-        PrintLastError(&VolumeName[4]);
-        return -1;
-    }
-
-    if (CdImage)
-    {
-        sprintf(DeviceName, DEVICE_NAME_PREFIX "Cd" "%u", DeviceNumber);
-    }
-    else
-    {
-        sprintf(DeviceName, DEVICE_NAME_PREFIX "%u", DeviceNumber);
-    }
-
-    if (!DefineDosDevice(
-        DDD_RAW_TARGET_PATH,
-        &VolumeName[4],
-        DeviceName
-        ))
-    {
-        PrintLastError(&VolumeName[4]);
-        return -1;
-    }
-
-    Device = CreateFile(
-        VolumeName,
-        GENERIC_READ | GENERIC_WRITE,
-        FILE_SHARE_READ | FILE_SHARE_WRITE,
-        NULL,
-        OPEN_EXISTING,
-        FILE_FLAG_NO_BUFFERING,
-        NULL
-        );
-
-    if (Device == INVALID_HANDLE_VALUE)
-    {
-        PrintLastError(&VolumeName[4]);
-        DefineDosDevice(DDD_REMOVE_DEFINITION, &VolumeName[4], NULL);
-        return -1;
-    }
-
-    if (!DeviceIoControl(
-        Device,
-        IOCTL_FILE_DISK_OPEN_FILE,
-        OpenFileInformation,
-        sizeof(OPEN_FILE_INFORMATION) + OpenFileInformation->FileNameLength - 1,
-        NULL,
-        0,
-        &BytesReturned,
-        NULL
-        ))
-    {
-        PrintLastError("FileDisk:");
-        DefineDosDevice(DDD_REMOVE_DEFINITION, &VolumeName[4], NULL);
-        return -1;
-    }
-
-    return 0;
-}
-
-int FileDiskUmount(char DriveLetter)
-{
-    char    VolumeName[] = "\\\\.\\ :";
-    HANDLE  Device;
-    DWORD   BytesReturned;
-
-    VolumeName[4] = DriveLetter;
-
-    Device = CreateFile(
-        VolumeName,
-        GENERIC_READ | GENERIC_WRITE,
-        FILE_SHARE_READ | FILE_SHARE_WRITE,
-        NULL,
-        OPEN_EXISTING,
-        FILE_FLAG_NO_BUFFERING,
-        NULL
-        );
-
-    if (Device == INVALID_HANDLE_VALUE)
-    {
-        PrintLastError(&VolumeName[4]);
-        return -1;
-    }
-
-    if (!DeviceIoControl(
-        Device,
-        FSCTL_LOCK_VOLUME,
-        NULL,
-        0,
-        NULL,
-        0,
-        &BytesReturned,
-        NULL
-        ))
-    {
-        PrintLastError(&VolumeName[4]);
-        return -1;
-    }
-
-    if (!DeviceIoControl(
-        Device,
-        IOCTL_FILE_DISK_CLOSE_FILE,
-        NULL,
-        0,
-        NULL,
-        0,
-        &BytesReturned,
-        NULL
-        ))
-    {
-        PrintLastError("FileDisk:");
-        return -1;
-    }
-
-    if (!DeviceIoControl(
-        Device,
-        FSCTL_DISMOUNT_VOLUME,
-        NULL,
-        0,
-        NULL,
-        0,
-        &BytesReturned,
-        NULL
-        ))
-    {
-        PrintLastError(&VolumeName[4]);
-        return -1;
-    }
-
-    if (!DeviceIoControl(
-        Device,
-        FSCTL_UNLOCK_VOLUME,
-        NULL,
-        0,
-        NULL,
-        0,
-        &BytesReturned,
-        NULL
-        ))
-    {
-        PrintLastError(&VolumeName[4]);
-        return -1;
-    }
-
-    CloseHandle(Device);
-
-    if (!DefineDosDevice(
-        DDD_REMOVE_DEFINITION,
-        &VolumeName[4],
-        NULL
-        ))
-    {
-        PrintLastError(&VolumeName[4]);
-        return -1;
-    }
-
-    return 0;
-}
-
-int FileDiskStatus(char DriveLetter)
-{
-    char                    VolumeName[] = "\\\\.\\ :";
-    HANDLE                  Device;
-    POPEN_FILE_INFORMATION  OpenFileInformation;
-    DWORD                   BytesReturned;
-
-    VolumeName[4] = DriveLetter;
-
-    Device = CreateFile(
-        VolumeName,
-        GENERIC_READ,
-        FILE_SHARE_READ | FILE_SHARE_WRITE,
-        NULL,
-        OPEN_EXISTING,
-        FILE_FLAG_NO_BUFFERING,
-        NULL
-        );
-
-    if (Device == INVALID_HANDLE_VALUE)
-    {
-        PrintLastError(&VolumeName[4]);
-        return -1;
-    }
-
-    OpenFileInformation = malloc(sizeof(OPEN_FILE_INFORMATION) + MAX_PATH);
-
-    if (!DeviceIoControl(
-        Device,
-        IOCTL_FILE_DISK_QUERY_FILE,
-        NULL,
-        0,
-        OpenFileInformation,
-        sizeof(OPEN_FILE_INFORMATION) + MAX_PATH,
-        &BytesReturned,
-        NULL
-        ))
-    {
-        PrintLastError(&VolumeName[4]);
-        return -1;
-    }
-
-    if (BytesReturned < sizeof(OPEN_FILE_INFORMATION))
-    {
-        SetLastError(ERROR_INSUFFICIENT_BUFFER);
-        PrintLastError(&VolumeName[4]);
-        return -1;
-    }
-
-    printf("%c: %.*s Size: %I64u bytes%s\n",
-        DriveLetter,
-        OpenFileInformation->FileNameLength,
-        OpenFileInformation->FileName,
-        OpenFileInformation->FileSize,
-        OpenFileInformation->ReadOnly ? ", ReadOnly" : ""
-        );
-
-    return 0;
-}
-
-int __cdecl main(int argc, char* argv[])
-{
-    char*                   Command;
-    int                     DeviceNumber;
-    char*                   FileName;
-    char*                   Option;
-    char                    DriveLetter;
-    BOOLEAN                 CdImage = FALSE;
-    POPEN_FILE_INFORMATION  OpenFileInformation;
-
-    Command = argv[1];
-
-    if ((argc == 5 || argc == 6) && !strcmp(Command, "/mount"))
-    {
-        DeviceNumber = atoi(argv[2]);
-        FileName = argv[3];
-
-        if (strlen(FileName) < 2)
-        {
-            return FileDiskSyntax();
-        }
-
-        OpenFileInformation =
-            malloc(sizeof(OPEN_FILE_INFORMATION) + strlen(FileName) + 7);
-
-        memset(
-            OpenFileInformation,
-            0,
-            sizeof(OPEN_FILE_INFORMATION) + strlen(FileName) + 7
-            );
-
-        if (FileName[0] == '\\')
-        {
-            if (FileName[1] == '\\')
-                // \\server\share\path\filedisk.img
-            {
-                strcpy(OpenFileInformation->FileName, "\\??\\UNC");
-                strcat(OpenFileInformation->FileName, FileName + 1);
-            }
-            else
-                // \Device\Harddisk0\Partition1\path\filedisk.img
-            {
-                strcpy(OpenFileInformation->FileName, FileName);
-            }
-        }
-        else
-            // c:\path\filedisk.img
-        {
-            strcpy(OpenFileInformation->FileName, "\\??\\");
-            strcat(OpenFileInformation->FileName, FileName);
-        }
-
-        OpenFileInformation->FileNameLength =
-            (USHORT) strlen(OpenFileInformation->FileName);
-
-        if (argc > 5)
-        {
-            Option = argv[4];
-            DriveLetter = argv[5][0];
-
-            if (!strcmp(Option, "/ro"))
-            {
-                OpenFileInformation->ReadOnly = TRUE;
-            }
-            else if (!strcmp(Option, "/cd"))
-            {
-                CdImage = TRUE;
-            }
-            else
-            {
-                if (Option[strlen(Option) - 1] == 'G')
-                {
-                    OpenFileInformation->FileSize.QuadPart =
-                        _atoi64(Option) * 1024 * 1024 * 1024;
-                }
-                else if (Option[strlen(Option) - 1] == 'M')
-                {
-                    OpenFileInformation->FileSize.QuadPart =
-                        _atoi64(Option) * 1024 * 1024;
-                }
-                else if (Option[strlen(Option) - 1] == 'k')
-                {
-                    OpenFileInformation->FileSize.QuadPart =
-                        _atoi64(Option) * 1024;
-                }
-                else
-                {
-                    OpenFileInformation->FileSize.QuadPart =
-                        _atoi64(Option);
-                }
-            }
-        }
-        else
-        {
-            DriveLetter = argv[4][0];
-        }
-        return FileDiskMount(DeviceNumber, OpenFileInformation, DriveLetter, CdImage);
-    }
-    else if (argc == 3 && !strcmp(Command, "/umount"))
-    {
-        DriveLetter = argv[2][0];
-        return FileDiskUmount(DriveLetter);
-    }
-    else if (argc == 3 && !strcmp(Command, "/status"))
-    {
-        DriveLetter = argv[2][0];
-        return FileDiskStatus(DriveLetter);
-    }
-    else
-    {
-        return FileDiskSyntax();
-    }
-}
--- a/buildframework/helium/external/filedisk/exe/filedisk.rc	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-//Microsoft Developer Studio generated resource script.
-//
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "afxres.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-#pragma code_page(1252)
-#endif //_WIN32
-
-#ifndef _MAC
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,0,0,11
- PRODUCTVERSION 1,0,0,11
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x40004L
- FILETYPE 0x1L
- FILESUBTYPE 0x0L
-BEGIN
-    BLOCK "StringFileInfo"
-    BEGIN
-        BLOCK "040904b0"
-        BEGIN
-            VALUE "CompanyName", "Bo Brantén\0"
-            VALUE "FileDescription", "FileDisk Virtual Disk Driver\0"
-            VALUE "FileVersion", "1.0.0.11\0"
-            VALUE "InternalName", "filedisk\0"
-            VALUE "LegalCopyright", "Copyright © 1999-2002 Bo Brantén\0"
-            VALUE "OriginalFilename", "filedisk.exe\0"
-            VALUE "ProductName", "filedisk\0"
-            VALUE "ProductVersion", "1.0.0.11\0"
-        END
-    END
-    BLOCK "VarFileInfo"
-    BEGIN
-        VALUE "Translation", 0x409, 1200
-    END
-END
-
-#endif    // !_MAC
-
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE DISCARDABLE 
-BEGIN
-    "resource.h\0"
-END
-
-2 TEXTINCLUDE DISCARDABLE 
-BEGIN
-    "#include ""afxres.h""\r\n"
-    "\0"
-END
-
-3 TEXTINCLUDE DISCARDABLE 
-BEGIN
-    "\r\n"
-    "\0"
-END
-
-#endif    // APSTUDIO_INVOKED
-
-#endif    // English (U.S.) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif    // not APSTUDIO_INVOKED
-
--- a/buildframework/helium/external/filedisk/exe/sources	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-TARGETNAME=filedisk
-TARGETPATH=obj
-TARGETTYPE=PROGRAM
-UMTYPE=console
-INCLUDES=..\sys\inc
-SOURCES=filedisk.c filedisk.rc
Binary file buildframework/helium/external/filedisk/filedisk.exe has changed
--- a/buildframework/helium/external/filedisk/filedisk.reg	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-REGEDIT4
-
-[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FileDisk]
-
-"ErrorControl"=dword:00000001
-
-#
-# When to start the driver:
-#   At boot:  Start=1
-#   Manually: Start=3
-#
-"Start"=dword:00000001
-
-"Type"=dword:00000001
-
-[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FileDisk\Parameters]
-
-"NumberOfDevices"=dword:00000004
Binary file buildframework/helium/external/filedisk/filedisk.sys has changed
--- a/buildframework/helium/external/filedisk/install.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-Copy the driver (filedisk.sys) to %systemroot%\system32\drivers\.
-
-Optionally edit filedisk.reg for automatic/manually start and
-number of devices.
-
-Import filedisk.reg to the Registry.
-
-Reboot.
-
-Use the program filedisk.exe to mount/umount files, for an example
-of use see the file example.txt.
--- a/buildframework/helium/external/filedisk/readme.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-
-    This is a virtual disk driver for Windows NT/2000/XP that uses
-    one or more files to emulate physical disks.
-    Copyright (C) 1999-2006 Bo Brantén.
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-    The GNU General Public License is also available from:
-    http://www.gnu.org/copyleft/gpl.html
-
-    Windows and Windows NT are either registered trademarks or trademarks of
-    Microsoft Corporation in the United States and/or other countries.
-
-    Please send comments, corrections and contributions to bosse@acc.umu.se
-
-    The most recent version of this program is available from:
-    http://www.acc.umu.se/~bosse/
-
-    Revision history:
-
-   14. 2006-01-05
-       Updated impersonation so that use of image files stored on network
-       drives work on Windows 2000 SP4, Windows XP SP2 and
-       Windows Server 2003 SP1.
-
-   13. 2004-06-09
-       Small fix in file size handling.
-
-   12. 2004-05-27
-       Possible fix for memory leak.
-
-   11. 2002-11-30
-       Added ioctl to query information about mounted disk image files by
-       request from developer of GUI.
-
-   10. 2002-11-24
-       Added a check so that FileDisk doesn't use compressed or encrypted
-       images. For an explanation why this doesn't work see comment in the
-       source code.
-
-    9. 2002-08-26
-       Corrected the share access for read-only FileDisk images.
-
-    8. 2002-08-11
-       Updated the control application to support UNC paths.
-       Changed the handling of CD-ROM device objects to avoid some problems on
-       Windows XP.
-       Corrected the handling of file sizes so that FileDisk images can be
-       sparse files.
-
-    7. 2002-02-28
-       Added support for CD-images.
-
-    6. 2002-01-21
-       Added support for impersonation so that FileDisk images can be stored
-       on network drives.
-
-    5. 2002-01-18
-       Updated for Windows XP by Robert A. Rose.
-
-    4. 2001-07-08
-       Formating to FAT on Windows 2000 now works.
-
-    3. 2001-05-14
-       Corrected the error messages from the usermode control application.
-
-    2. 2000-03-15
-       Added handling of IOCTL_DISK_CHECK_VERIFY to make the driver work on
-       Windows 2000 (tested on beta 3, build 2031). Formating to FAT still
-       doesn't work but formating to NTFS does.
-
-    1. 1999-06-09
-       Initial release.
--- a/buildframework/helium/external/filedisk/sys/inc/filedisk.h	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
-    This is a virtual disk driver for Windows NT/2000/XP that uses one or more
-    files to emulate physical disks.
-    Copyright (C) 1999, 2000, 2001, 2002 Bo Brantén.
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
-
-#ifndef _FILE_DISK_
-#define _FILE_DISK_
-
-#ifndef __T
-#ifdef _NTDDK_
-#define __T(x)  L ## x
-#else
-#define __T(x)  x
-#endif
-#endif
-
-#ifndef _T
-#define _T(x)   __T(x)
-#endif
-
-#define DEVICE_BASE_NAME    _T("\\FileDisk")
-#define DEVICE_DIR_NAME     _T("\\Device")      DEVICE_BASE_NAME
-#define DEVICE_NAME_PREFIX  DEVICE_DIR_NAME     DEVICE_BASE_NAME
-
-#define FILE_DEVICE_FILE_DISK       0x8000
-
-#define IOCTL_FILE_DISK_OPEN_FILE   CTL_CODE(FILE_DEVICE_FILE_DISK, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-#define IOCTL_FILE_DISK_CLOSE_FILE  CTL_CODE(FILE_DEVICE_FILE_DISK, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-#define IOCTL_FILE_DISK_QUERY_FILE  CTL_CODE(FILE_DEVICE_FILE_DISK, 0x802, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-typedef struct _OPEN_FILE_INFORMATION {
-    LARGE_INTEGER   FileSize;
-    BOOLEAN         ReadOnly;
-    USHORT          FileNameLength;
-    UCHAR           FileName[1];
-} OPEN_FILE_INFORMATION, *POPEN_FILE_INFORMATION;
-
-#endif
Binary file buildframework/helium/external/filedisk/sys/obj/i386/checked/filedisk.sys has changed
Binary file buildframework/helium/external/filedisk/sys/obj/i386/free/filedisk.sys has changed
--- a/buildframework/helium/external/filedisk/sys/src/MAKEFILE	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-#
-# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
-# file to this component.  This file merely indirects to the real make file
-# that is shared by all the driver components of the Windows NT DDK
-#
-
-!INCLUDE $(NTMAKEENV)\makefile.def
--- a/buildframework/helium/external/filedisk/sys/src/Sources	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-TARGETNAME=filedisk
-TARGETPATH=..\obj
-TARGETTYPE=DRIVER
-INCLUDES=..\inc
-SOURCES=filedisk.c filedisk.rc
--- a/buildframework/helium/external/filedisk/sys/src/filedisk.c	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1537 +0,0 @@
-/*
-    This is a virtual disk driver for Windows NT/2000/XP that uses
-    one or more files to emulate physical disks.
-    Copyright (C) 1999-2006 Bo Brantén.
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
-
-#include <ntddk.h>
-#include <ntdddisk.h>
-#include <ntddcdrm.h>
-#include <ntverp.h>
-
-//
-// We include some stuff from newer DDK:s here so that one
-// version of the driver for all versions of Windows can
-// be compiled with the Windows NT 4.0 DDK.
-//
-#if (VER_PRODUCTBUILD < 2195)
-
-#define FILE_DEVICE_MASS_STORAGE            0x0000002d
-#define IOCTL_STORAGE_CHECK_VERIFY2         CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FILE_ATTRIBUTE_ENCRYPTED            0x00004000
-
-#endif
-
-#if (VER_PRODUCTBUILD < 2600)
-
-#define IOCTL_DISK_GET_PARTITION_INFO_EX    CTL_CODE(IOCTL_DISK_BASE, 0x0012, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define IOCTL_DISK_GET_LENGTH_INFO          CTL_CODE(IOCTL_DISK_BASE, 0x0017, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-typedef enum _PARTITION_STYLE {
-    PARTITION_STYLE_MBR,
-    PARTITION_STYLE_GPT
-} PARTITION_STYLE;
-
-typedef unsigned __int64 ULONG64, *PULONG64;
-
-typedef struct _PARTITION_INFORMATION_MBR {
-    UCHAR   PartitionType;
-    BOOLEAN BootIndicator;
-    BOOLEAN RecognizedPartition;
-    ULONG   HiddenSectors;
-} PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR;
-
-typedef struct _PARTITION_INFORMATION_GPT {
-    GUID    PartitionType;
-    GUID    PartitionId;
-    ULONG64 Attributes;
-    WCHAR   Name[36];
-} PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT;
-
-typedef struct _PARTITION_INFORMATION_EX {
-    PARTITION_STYLE PartitionStyle;
-    LARGE_INTEGER   StartingOffset;
-    LARGE_INTEGER   PartitionLength;
-    ULONG           PartitionNumber;
-    BOOLEAN         RewritePartition;
-    union {
-        PARTITION_INFORMATION_MBR Mbr;
-        PARTITION_INFORMATION_GPT Gpt;
-    };
-} PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX;
-
-typedef struct _GET_LENGTH_INFORMATION {
-    LARGE_INTEGER Length;
-} GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION;
-
-#endif // (VER_PRODUCTBUILD < 2600)
-
-//
-// We include some stuff from ntifs.h here so that
-// the driver can be compiled with only the DDK.
-//
-
-#define TOKEN_SOURCE_LENGTH 8
-
-typedef enum _TOKEN_TYPE {
-    TokenPrimary = 1,
-    TokenImpersonation
-} TOKEN_TYPE;
-
-typedef struct _TOKEN_SOURCE {
-    CCHAR   SourceName[TOKEN_SOURCE_LENGTH];
-    LUID    SourceIdentifier;
-} TOKEN_SOURCE, *PTOKEN_SOURCE;
-
-typedef struct _TOKEN_CONTROL {
-    LUID            TokenId;
-    LUID            AuthenticationId;
-    LUID            ModifiedId;
-    TOKEN_SOURCE    TokenSource;
-} TOKEN_CONTROL, *PTOKEN_CONTROL;
-
-typedef struct _SECURITY_CLIENT_CONTEXT {
-    SECURITY_QUALITY_OF_SERVICE SecurityQos;
-    PACCESS_TOKEN               ClientToken;
-    BOOLEAN                     DirectlyAccessClientToken;
-    BOOLEAN                     DirectAccessEffectiveOnly;
-    BOOLEAN                     ServerIsRemote;
-    TOKEN_CONTROL               ClientTokenControl;
-} SECURITY_CLIENT_CONTEXT, *PSECURITY_CLIENT_CONTEXT;
-
-#define PsDereferenceImpersonationToken(T)  \
-            {if (ARGUMENT_PRESENT(T)) {     \
-                (ObDereferenceObject((T))); \
-            } else {                        \
-                ;                           \
-            }                               \
-}
-
-#define PsDereferencePrimaryToken(T) (ObDereferenceObject((T)))
-
-NTKERNELAPI
-VOID
-PsRevertToSelf (
-    VOID
-);
-
-NTKERNELAPI
-NTSTATUS
-SeCreateClientSecurity (
-    IN PETHREAD                     Thread,
-    IN PSECURITY_QUALITY_OF_SERVICE QualityOfService,
-    IN BOOLEAN                      RemoteClient,
-    OUT PSECURITY_CLIENT_CONTEXT    ClientContext
-);
-
-#define SeDeleteClientSecurity(C)  {                                           \
-            if (SeTokenType((C)->ClientToken) == TokenPrimary) {               \
-                PsDereferencePrimaryToken( (C)->ClientToken );                 \
-            } else {                                                           \
-                PsDereferenceImpersonationToken( (C)->ClientToken );           \
-            }                                                                  \
-}
-
-NTKERNELAPI
-VOID
-SeImpersonateClient (
-    IN PSECURITY_CLIENT_CONTEXT ClientContext,
-    IN PETHREAD                 ServerThread OPTIONAL
-);
-
-NTKERNELAPI
-TOKEN_TYPE
-SeTokenType (
-    IN PACCESS_TOKEN Token
-);
-
-#ifndef SE_IMPERSONATE_PRIVILEGE
-#define SE_IMPERSONATE_PRIVILEGE        (29L)
-#endif
-
-#define TOKEN_ASSIGN_PRIMARY            (0x0001)
-#define TOKEN_DUPLICATE                 (0x0002)
-#define TOKEN_IMPERSONATE               (0x0004)
-#define TOKEN_QUERY                     (0x0008)
-#define TOKEN_QUERY_SOURCE              (0x0010)
-#define TOKEN_ADJUST_PRIVILEGES         (0x0020)
-#define TOKEN_ADJUST_GROUPS             (0x0040)
-#define TOKEN_ADJUST_DEFAULT            (0x0080)
-
-#define TOKEN_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
-                          TOKEN_ASSIGN_PRIMARY     |\
-                          TOKEN_DUPLICATE          |\
-                          TOKEN_IMPERSONATE        |\
-                          TOKEN_QUERY              |\
-                          TOKEN_QUERY_SOURCE       |\
-                          TOKEN_ADJUST_PRIVILEGES  |\
-                          TOKEN_ADJUST_GROUPS      |\
-                          TOKEN_ADJUST_DEFAULT)
-
-typedef struct _TOKEN_PRIVILEGES {
-    ULONG               PrivilegeCount;
-    LUID_AND_ATTRIBUTES Privileges[1];
-} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwOpenProcessToken (
-    IN HANDLE       ProcessHandle,
-    IN ACCESS_MASK  DesiredAccess,
-    OUT PHANDLE     TokenHandle
-);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-NtAdjustPrivilegesToken (
-    IN HANDLE               TokenHandle,
-    IN BOOLEAN              DisableAllPrivileges,
-    IN PTOKEN_PRIVILEGES    NewState,
-    IN ULONG                BufferLength,
-    OUT PTOKEN_PRIVILEGES   PreviousState OPTIONAL,
-    OUT PULONG              ReturnLength
-);
-
-//
-// For backward compatibility with Windows NT 4.0 by Bruce Engle.
-//
-#ifndef MmGetSystemAddressForMdlSafe
-#define MmGetSystemAddressForMdlSafe(MDL, PRIORITY) MmGetSystemAddressForMdlPrettySafe(MDL)
-
-PVOID
-MmGetSystemAddressForMdlPrettySafe (
-    PMDL Mdl
-    )
-{
-    CSHORT  MdlMappingCanFail;
-    PVOID   MappedSystemVa;
-
-    MdlMappingCanFail = Mdl->MdlFlags & MDL_MAPPING_CAN_FAIL;
-
-    Mdl->MdlFlags |= MDL_MAPPING_CAN_FAIL;
-
-    MappedSystemVa = MmGetSystemAddressForMdl(Mdl);
-
-    if (MdlMappingCanFail == 0)
-    {
-        Mdl->MdlFlags &= ~MDL_MAPPING_CAN_FAIL;
-    }
-
-    return MappedSystemVa;
-}
-#endif
-
-#include "filedisk.h"
-
-#define PARAMETER_KEY           L"\\Parameters"
-
-#define NUMBEROFDEVICES_VALUE   L"NumberOfDevices"
-
-#define DEFAULT_NUMBEROFDEVICES 4
-
-#define SECTOR_SIZE             512
-
-#define TOC_DATA_TRACK          0x04
-
-HANDLE dir_handle;
-
-typedef struct _DEVICE_EXTENSION {
-    BOOLEAN                     media_in_device;
-    HANDLE                      file_handle;
-    ANSI_STRING                 file_name;
-    LARGE_INTEGER               file_size;
-    BOOLEAN                     read_only;
-    PSECURITY_CLIENT_CONTEXT    security_client_context;
-    LIST_ENTRY                  list_head;
-    KSPIN_LOCK                  list_lock;
-    KEVENT                      request_event;
-    PVOID                       thread_pointer;
-    BOOLEAN                     terminate_thread;
-} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
-
-NTSTATUS
-DriverEntry (
-    IN PDRIVER_OBJECT   DriverObject,
-    IN PUNICODE_STRING  RegistryPath
-);
-
-NTSTATUS
-FileDiskCreateDevice (
-    IN PDRIVER_OBJECT   DriverObject,
-    IN ULONG            Number,
-    IN DEVICE_TYPE      DeviceType
-);
-
-VOID
-FileDiskUnload (
-    IN PDRIVER_OBJECT   DriverObject
-);
-
-PDEVICE_OBJECT
-FileDiskDeleteDevice (
-    IN PDEVICE_OBJECT   DeviceObject
-);
-
-NTSTATUS
-FileDiskCreateClose (
-    IN PDEVICE_OBJECT   DeviceObject,
-    IN PIRP             Irp
-);
-
-NTSTATUS
-FileDiskReadWrite (
-    IN PDEVICE_OBJECT   DeviceObject,
-    IN PIRP             Irp
-);
-
-NTSTATUS
-FileDiskDeviceControl (
-    IN PDEVICE_OBJECT   DeviceObject,
-    IN PIRP             Irp
-);
-
-VOID
-FileDiskThread (
-    IN PVOID            Context
-);
-
-NTSTATUS
-FileDiskOpenFile (
-    IN PDEVICE_OBJECT   DeviceObject,
-    IN PIRP             Irp
-);
-
-NTSTATUS
-FileDiskCloseFile (
-    IN PDEVICE_OBJECT   DeviceObject,
-    IN PIRP             Irp
-);
-
-NTSTATUS
-FileDiskAdjustPrivilege (
-    IN ULONG            Privilege,
-    IN BOOLEAN          Enable
-);
-
-int swprintf(wchar_t *, const wchar_t *, ...);
-
-#pragma code_seg("INIT")
-
-NTSTATUS
-DriverEntry (
-    IN PDRIVER_OBJECT   DriverObject,
-    IN PUNICODE_STRING  RegistryPath
-    )
-{
-    UNICODE_STRING              parameter_path;
-    RTL_QUERY_REGISTRY_TABLE    query_table[2];
-    ULONG                       n_devices;
-    NTSTATUS                    status;
-    UNICODE_STRING              device_dir_name;
-    OBJECT_ATTRIBUTES           object_attributes;
-    ULONG                       n;
-    USHORT                      n_created_devices;
-
-    parameter_path.Length = 0;
-
-    parameter_path.MaximumLength = RegistryPath->Length + sizeof(PARAMETER_KEY);
-
-    parameter_path.Buffer = (PWSTR) ExAllocatePool(PagedPool, parameter_path.MaximumLength);
-
-    if (parameter_path.Buffer == NULL)
-    {
-        return STATUS_INSUFFICIENT_RESOURCES;
-    }
-
-    RtlCopyUnicodeString(&parameter_path, RegistryPath);
-
-    RtlAppendUnicodeToString(&parameter_path, PARAMETER_KEY);
-
-    RtlZeroMemory(&query_table[0], sizeof(query_table));
-
-    query_table[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
-    query_table[0].Name = NUMBEROFDEVICES_VALUE;
-    query_table[0].EntryContext = &n_devices;
-
-    status = RtlQueryRegistryValues(
-        RTL_REGISTRY_ABSOLUTE,
-        parameter_path.Buffer,
-        &query_table[0],
-        NULL,
-        NULL
-        );
-
-    ExFreePool(parameter_path.Buffer);
-
-    if (!NT_SUCCESS(status))
-    {
-        KdPrint(("FileDisk: Query registry failed, using default values.\n"));
-        n_devices = DEFAULT_NUMBEROFDEVICES;
-    }
-
-    RtlInitUnicodeString(&device_dir_name, DEVICE_DIR_NAME);
-
-    InitializeObjectAttributes(
-        &object_attributes,
-        &device_dir_name,
-        OBJ_PERMANENT,
-        NULL,
-        NULL
-        );
-
-    status = ZwCreateDirectoryObject(
-        &dir_handle,
-        DIRECTORY_ALL_ACCESS,
-        &object_attributes
-        );
-
-    if (!NT_SUCCESS(status))
-    {
-        return status;
-    }
-
-    ZwMakeTemporaryObject(dir_handle);
-
-    for (n = 0, n_created_devices = 0; n < n_devices; n++)
-    {
-        status = FileDiskCreateDevice(DriverObject, n, FILE_DEVICE_DISK);
-
-        if (NT_SUCCESS(status))
-        {
-            n_created_devices++;
-        }
-    }
-
-    for (n = 0; n < n_devices; n++)
-    {
-        status = FileDiskCreateDevice(DriverObject, n, FILE_DEVICE_CD_ROM);
-
-        if (NT_SUCCESS(status))
-        {
-            n_created_devices++;
-        }
-    }
-
-    if (n_created_devices == 0)
-    {
-        ZwClose(dir_handle);
-        return status;
-    }
-
-    DriverObject->MajorFunction[IRP_MJ_CREATE]         = FileDiskCreateClose;
-    DriverObject->MajorFunction[IRP_MJ_CLOSE]          = FileDiskCreateClose;
-    DriverObject->MajorFunction[IRP_MJ_READ]           = FileDiskReadWrite;
-    DriverObject->MajorFunction[IRP_MJ_WRITE]          = FileDiskReadWrite;
-    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FileDiskDeviceControl;
-
-    DriverObject->DriverUnload = FileDiskUnload;
-
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS
-FileDiskCreateDevice (
-    IN PDRIVER_OBJECT   DriverObject,
-    IN ULONG            Number,
-    IN DEVICE_TYPE      DeviceType
-    )
-{
-    WCHAR               device_name_buffer[MAXIMUM_FILENAME_LENGTH];
-    UNICODE_STRING      device_name;
-    NTSTATUS            status;
-    PDEVICE_OBJECT      device_object;
-    PDEVICE_EXTENSION   device_extension;
-    HANDLE              thread_handle;
-
-    ASSERT(DriverObject != NULL);
-
-    if (DeviceType == FILE_DEVICE_CD_ROM)
-    {
-        swprintf(
-            device_name_buffer,
-            DEVICE_NAME_PREFIX L"Cd" L"%u",
-            Number
-            );
-    }
-    else
-    {
-        swprintf(
-            device_name_buffer,
-            DEVICE_NAME_PREFIX L"%u",
-            Number
-            );
-    }
-
-    RtlInitUnicodeString(&device_name, device_name_buffer);
-
-    status = IoCreateDevice(
-        DriverObject,
-        sizeof(DEVICE_EXTENSION),
-        &device_name,
-        DeviceType,
-        0,
-        FALSE,
-        &device_object
-        );
-
-    if (!NT_SUCCESS(status))
-    {
-        return status;
-    }
-
-    device_object->Flags |= DO_DIRECT_IO;
-
-    device_extension = (PDEVICE_EXTENSION) device_object->DeviceExtension;
-
-    device_extension->media_in_device = FALSE;
-
-    if (DeviceType == FILE_DEVICE_CD_ROM)
-    {
-        device_object->Characteristics |= FILE_READ_ONLY_DEVICE;
-        device_extension->read_only = TRUE;
-    }
-
-    InitializeListHead(&device_extension->list_head);
-
-    KeInitializeSpinLock(&device_extension->list_lock);
-
-    KeInitializeEvent(
-        &device_extension->request_event,
-        SynchronizationEvent,
-        FALSE
-        );
-
-    device_extension->terminate_thread = FALSE;
-
-    status = PsCreateSystemThread(
-        &thread_handle,
-        (ACCESS_MASK) 0L,
-        NULL,
-        NULL,
-        NULL,
-        FileDiskThread,
-        device_object
-        );
-
-    if (!NT_SUCCESS(status))
-    {
-        IoDeleteDevice(device_object);
-        return status;
-    }
-
-    status = ObReferenceObjectByHandle(
-        thread_handle,
-        THREAD_ALL_ACCESS,
-        NULL,
-        KernelMode,
-        &device_extension->thread_pointer,
-        NULL
-        );
-
-    if (!NT_SUCCESS(status))
-    {
-        ZwClose(thread_handle);
-
-        device_extension->terminate_thread = TRUE;
-
-        KeSetEvent(
-            &device_extension->request_event,
-            (KPRIORITY) 0,
-            FALSE
-            );
-
-        IoDeleteDevice(device_object);
-
-        return status;
-    }
-
-    ZwClose(thread_handle);
-
-    return STATUS_SUCCESS;
-}
-
-#pragma code_seg("PAGE")
-
-VOID
-FileDiskUnload (
-    IN PDRIVER_OBJECT DriverObject
-    )
-{
-    PDEVICE_OBJECT device_object;
-
-    PAGED_CODE();
-
-    device_object = DriverObject->DeviceObject;
-
-    while (device_object)
-    {
-        device_object = FileDiskDeleteDevice(device_object);
-    }
-
-    ZwClose(dir_handle);
-}
-
-PDEVICE_OBJECT
-FileDiskDeleteDevice (
-    IN PDEVICE_OBJECT DeviceObject
-    )
-{
-    PDEVICE_EXTENSION   device_extension;
-    PDEVICE_OBJECT      next_device_object;
-
-    PAGED_CODE();
-
-    ASSERT(DeviceObject != NULL);
-
-    device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
-
-    device_extension->terminate_thread = TRUE;
-
-    KeSetEvent(
-        &device_extension->request_event,
-        (KPRIORITY) 0,
-        FALSE
-        );
-
-    KeWaitForSingleObject(
-        device_extension->thread_pointer,
-        Executive,
-        KernelMode,
-        FALSE,
-        NULL
-        );
-
-    ObDereferenceObject(device_extension->thread_pointer);
-
-    if (device_extension->security_client_context != NULL)
-    {
-        SeDeleteClientSecurity(device_extension->security_client_context);
-        ExFreePool(device_extension->security_client_context);
-    }
-
-    next_device_object = DeviceObject->NextDevice;
-
-    IoDeleteDevice(DeviceObject);
-
-    return next_device_object;
-}
-
-NTSTATUS
-FileDiskCreateClose (
-    IN PDEVICE_OBJECT   DeviceObject,
-    IN PIRP             Irp
-    )
-{
-    PAGED_CODE();
-
-    Irp->IoStatus.Status = STATUS_SUCCESS;
-    Irp->IoStatus.Information = FILE_OPENED;
-
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-    return STATUS_SUCCESS;
-}
-
-#pragma code_seg()
-
-NTSTATUS
-FileDiskReadWrite (
-    IN PDEVICE_OBJECT   DeviceObject,
-    IN PIRP             Irp
-    )
-{
-    PDEVICE_EXTENSION   device_extension;
-    PIO_STACK_LOCATION  io_stack;
-
-    device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
-
-    if (!device_extension->media_in_device)
-    {
-        Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE;
-        Irp->IoStatus.Information = 0;
-
-        IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-        return STATUS_NO_MEDIA_IN_DEVICE;
-    }
-
-    io_stack = IoGetCurrentIrpStackLocation(Irp);
-
-    if (io_stack->Parameters.Read.Length == 0)
-    {
-        Irp->IoStatus.Status = STATUS_SUCCESS;
-        Irp->IoStatus.Information = 0;
-
-        IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-        return STATUS_SUCCESS;
-    }
-
-    IoMarkIrpPending(Irp);
-
-    ExInterlockedInsertTailList(
-        &device_extension->list_head,
-        &Irp->Tail.Overlay.ListEntry,
-        &device_extension->list_lock
-        );
-
-    KeSetEvent(
-        &device_extension->request_event,
-        (KPRIORITY) 0,
-        FALSE
-        );
-
-    return STATUS_PENDING;
-}
-
-NTSTATUS
-FileDiskDeviceControl (
-    IN PDEVICE_OBJECT   DeviceObject,
-    IN PIRP             Irp
-    )
-{
-    PDEVICE_EXTENSION   device_extension;
-    PIO_STACK_LOCATION  io_stack;
-    NTSTATUS            status;
-
-    device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
-
-    io_stack = IoGetCurrentIrpStackLocation(Irp);
-
-    if (!device_extension->media_in_device &&
-        io_stack->Parameters.DeviceIoControl.IoControlCode !=
-        IOCTL_FILE_DISK_OPEN_FILE)
-    {
-        Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE;
-        Irp->IoStatus.Information = 0;
-
-        IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-        return STATUS_NO_MEDIA_IN_DEVICE;
-    }
-
-    switch (io_stack->Parameters.DeviceIoControl.IoControlCode)
-    {
-    case IOCTL_FILE_DISK_OPEN_FILE:
-        {
-            SECURITY_QUALITY_OF_SERVICE security_quality_of_service;
-
-            if (device_extension->media_in_device)
-            {
-                KdPrint(("FileDisk: IOCTL_FILE_DISK_OPEN_FILE: Media already opened\n"));
-
-                status = STATUS_INVALID_DEVICE_REQUEST;
-                Irp->IoStatus.Information = 0;
-                break;
-            }
-
-            if (io_stack->Parameters.DeviceIoControl.InputBufferLength <
-                sizeof(OPEN_FILE_INFORMATION))
-            {
-                status = STATUS_INVALID_PARAMETER;
-                Irp->IoStatus.Information = 0;
-                break;
-            }
-
-            if (io_stack->Parameters.DeviceIoControl.InputBufferLength <
-                sizeof(OPEN_FILE_INFORMATION) +
-                ((POPEN_FILE_INFORMATION)Irp->AssociatedIrp.SystemBuffer)->FileNameLength -
-                sizeof(UCHAR))
-            {
-                status = STATUS_INVALID_PARAMETER;
-                Irp->IoStatus.Information = 0;
-                break;
-            }
-
-            if (device_extension->security_client_context != NULL)
-            {
-                SeDeleteClientSecurity(device_extension->security_client_context);
-            }
-            else
-            {
-                device_extension->security_client_context =
-                    ExAllocatePool(NonPagedPool, sizeof(SECURITY_CLIENT_CONTEXT));
-            }
-
-            RtlZeroMemory(&security_quality_of_service, sizeof(SECURITY_QUALITY_OF_SERVICE));
-
-            security_quality_of_service.Length = sizeof(SECURITY_QUALITY_OF_SERVICE);
-            security_quality_of_service.ImpersonationLevel = SecurityImpersonation;
-            security_quality_of_service.ContextTrackingMode = SECURITY_STATIC_TRACKING;
-            security_quality_of_service.EffectiveOnly = FALSE;
-
-            SeCreateClientSecurity(
-                PsGetCurrentThread(),
-                &security_quality_of_service,
-                FALSE,
-                device_extension->security_client_context
-                );
-
-            IoMarkIrpPending(Irp);
-
-            ExInterlockedInsertTailList(
-                &device_extension->list_head,
-                &Irp->Tail.Overlay.ListEntry,
-                &device_extension->list_lock
-                );
-
-            KeSetEvent(
-                &device_extension->request_event,
-                (KPRIORITY) 0,
-                FALSE
-                );
-
-            status = STATUS_PENDING;
-
-            break;
-        }
-
-    case IOCTL_FILE_DISK_CLOSE_FILE:
-        {
-            IoMarkIrpPending(Irp);
-
-            ExInterlockedInsertTailList(
-                &device_extension->list_head,
-                &Irp->Tail.Overlay.ListEntry,
-                &device_extension->list_lock
-                );
-
-            KeSetEvent(
-                &device_extension->request_event,
-                (KPRIORITY) 0,
-                FALSE
-                );
-
-            status = STATUS_PENDING;
-
-            break;
-        }
-
-    case IOCTL_FILE_DISK_QUERY_FILE:
-        {
-            POPEN_FILE_INFORMATION open_file_information;
-
-            if (io_stack->Parameters.DeviceIoControl.OutputBufferLength <
-                sizeof(OPEN_FILE_INFORMATION) + device_extension->file_name.Length - sizeof(UCHAR))
-            {
-                status = STATUS_BUFFER_TOO_SMALL;
-                Irp->IoStatus.Information = 0;
-                break;
-            }
-
-            open_file_information = (POPEN_FILE_INFORMATION) Irp->AssociatedIrp.SystemBuffer;
-
-            open_file_information->FileSize.QuadPart = device_extension->file_size.QuadPart;
-            open_file_information->ReadOnly = device_extension->read_only;
-            open_file_information->FileNameLength = device_extension->file_name.Length;
-
-            RtlCopyMemory(
-                open_file_information->FileName,
-                device_extension->file_name.Buffer,
-                device_extension->file_name.Length
-                );
-
-            status = STATUS_SUCCESS;
-            Irp->IoStatus.Information = sizeof(OPEN_FILE_INFORMATION) +
-                open_file_information->FileNameLength - sizeof(UCHAR);
-
-            break;
-        }
-
-    case IOCTL_DISK_CHECK_VERIFY:
-    case IOCTL_CDROM_CHECK_VERIFY:
-    case IOCTL_STORAGE_CHECK_VERIFY:
-    case IOCTL_STORAGE_CHECK_VERIFY2:
-        {
-            status = STATUS_SUCCESS;
-            Irp->IoStatus.Information = 0;
-            break;
-        }
-
-    case IOCTL_DISK_GET_DRIVE_GEOMETRY:
-    case IOCTL_CDROM_GET_DRIVE_GEOMETRY:
-        {
-            PDISK_GEOMETRY  disk_geometry;
-            ULONGLONG       length;
-
-            if (io_stack->Parameters.DeviceIoControl.OutputBufferLength <
-                sizeof(DISK_GEOMETRY))
-            {
-                status = STATUS_BUFFER_TOO_SMALL;
-                Irp->IoStatus.Information = 0;
-                break;
-            }
-
-            disk_geometry = (PDISK_GEOMETRY) Irp->AssociatedIrp.SystemBuffer;
-
-            length = device_extension->file_size.QuadPart;
-
-            disk_geometry->Cylinders.QuadPart = length / SECTOR_SIZE / 32 / 2;
-            disk_geometry->MediaType = FixedMedia;
-            disk_geometry->TracksPerCylinder = 2;
-            disk_geometry->SectorsPerTrack = 32;
-            disk_geometry->BytesPerSector = SECTOR_SIZE;
-
-            status = STATUS_SUCCESS;
-            Irp->IoStatus.Information = sizeof(DISK_GEOMETRY);
-
-            break;
-        }
-
-    case IOCTL_DISK_GET_LENGTH_INFO:
-        {
-            PGET_LENGTH_INFORMATION get_length_information;
-
-            if (io_stack->Parameters.DeviceIoControl.OutputBufferLength <
-                sizeof(GET_LENGTH_INFORMATION))
-            {
-                status = STATUS_BUFFER_TOO_SMALL;
-                Irp->IoStatus.Information = 0;
-                break;
-            }
-
-            get_length_information = (PGET_LENGTH_INFORMATION) Irp->AssociatedIrp.SystemBuffer;
-
-            get_length_information->Length.QuadPart = device_extension->file_size.QuadPart;
-
-            status = STATUS_SUCCESS;
-            Irp->IoStatus.Information = sizeof(GET_LENGTH_INFORMATION);
-
-        break;
-        }
-
-    case IOCTL_DISK_GET_PARTITION_INFO:
-        {
-            PPARTITION_INFORMATION  partition_information;
-            ULONGLONG               length;
-
-            if (io_stack->Parameters.DeviceIoControl.OutputBufferLength <
-                sizeof(PARTITION_INFORMATION))
-            {
-                status = STATUS_BUFFER_TOO_SMALL;
-                Irp->IoStatus.Information = 0;
-                break;
-            }
-
-            partition_information = (PPARTITION_INFORMATION) Irp->AssociatedIrp.SystemBuffer;
-
-            length = device_extension->file_size.QuadPart;
-
-            partition_information->StartingOffset.QuadPart = 0;
-            partition_information->PartitionLength.QuadPart = length;
-            partition_information->HiddenSectors = 1;
-            partition_information->PartitionNumber = 0;
-            partition_information->PartitionType = 0;
-            partition_information->BootIndicator = FALSE;
-            partition_information->RecognizedPartition = FALSE;
-            partition_information->RewritePartition = FALSE;
-
-            status = STATUS_SUCCESS;
-            Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION);
-
-            break;
-        }
-
-    case IOCTL_DISK_GET_PARTITION_INFO_EX:
-        {
-            PPARTITION_INFORMATION_EX   partition_information_ex;
-            ULONGLONG                   length;
-
-            if (io_stack->Parameters.DeviceIoControl.OutputBufferLength <
-                sizeof(PARTITION_INFORMATION_EX))
-            {
-                status = STATUS_BUFFER_TOO_SMALL;
-                Irp->IoStatus.Information = 0;
-                break;
-            }
-
-            partition_information_ex = (PPARTITION_INFORMATION_EX) Irp->AssociatedIrp.SystemBuffer;
-
-            length = device_extension->file_size.QuadPart;
-
-            partition_information_ex->PartitionStyle = PARTITION_STYLE_MBR;
-            partition_information_ex->StartingOffset.QuadPart = 0;
-            partition_information_ex->PartitionLength.QuadPart = length;
-            partition_information_ex->PartitionNumber = 0;
-            partition_information_ex->RewritePartition = FALSE;
-            partition_information_ex->Mbr.PartitionType = 0;
-            partition_information_ex->Mbr.BootIndicator = FALSE;
-            partition_information_ex->Mbr.RecognizedPartition = FALSE;
-            partition_information_ex->Mbr.HiddenSectors = 1;
-
-            status = STATUS_SUCCESS;
-            Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION_EX);
-
-            break;
-        }
-
-    case IOCTL_DISK_IS_WRITABLE:
-        {
-            if (!device_extension->read_only)
-            {
-                status = STATUS_SUCCESS;
-            }
-            else
-            {
-                status = STATUS_MEDIA_WRITE_PROTECTED;
-            }
-            Irp->IoStatus.Information = 0;
-            break;
-        }
-
-    case IOCTL_DISK_MEDIA_REMOVAL:
-    case IOCTL_STORAGE_MEDIA_REMOVAL:
-        {
-            status = STATUS_SUCCESS;
-            Irp->IoStatus.Information = 0;
-            break;
-        }
-
-    case IOCTL_CDROM_READ_TOC:
-        {
-            PCDROM_TOC cdrom_toc;
-
-            if (io_stack->Parameters.DeviceIoControl.OutputBufferLength <
-                sizeof(CDROM_TOC))
-            {
-                status = STATUS_BUFFER_TOO_SMALL;
-                Irp->IoStatus.Information = 0;
-                break;
-            }
-
-            cdrom_toc = (PCDROM_TOC) Irp->AssociatedIrp.SystemBuffer;
-
-            RtlZeroMemory(cdrom_toc, sizeof(CDROM_TOC));
-
-            cdrom_toc->FirstTrack = 1;
-            cdrom_toc->LastTrack = 1;
-            cdrom_toc->TrackData[0].Control = TOC_DATA_TRACK;
-
-            status = STATUS_SUCCESS;
-            Irp->IoStatus.Information = sizeof(CDROM_TOC);
-
-            break;
-        }
-
-    case IOCTL_DISK_SET_PARTITION_INFO:
-        {
-            if (device_extension->read_only)
-            {
-                status = STATUS_MEDIA_WRITE_PROTECTED;
-                Irp->IoStatus.Information = 0;
-                break;
-            }
-
-            if (io_stack->Parameters.DeviceIoControl.InputBufferLength <
-                sizeof(SET_PARTITION_INFORMATION))
-            {
-                status = STATUS_INVALID_PARAMETER;
-                Irp->IoStatus.Information = 0;
-                break;
-            }
-
-            status = STATUS_SUCCESS;
-            Irp->IoStatus.Information = 0;
-
-            break;
-        }
-
-    case IOCTL_DISK_VERIFY:
-        {
-            PVERIFY_INFORMATION verify_information;
-
-            if (io_stack->Parameters.DeviceIoControl.InputBufferLength <
-                sizeof(VERIFY_INFORMATION))
-            {
-                status = STATUS_INVALID_PARAMETER;
-                Irp->IoStatus.Information = 0;
-                break;
-            }
-
-            verify_information = (PVERIFY_INFORMATION) Irp->AssociatedIrp.SystemBuffer;
-
-            status = STATUS_SUCCESS;
-            Irp->IoStatus.Information = verify_information->Length;
-
-            break;
-        }
-
-    default:
-        {
-            KdPrint((
-                "FileDisk: Unknown IoControlCode %#x\n",
-                io_stack->Parameters.DeviceIoControl.IoControlCode
-                ));
-
-            status = STATUS_INVALID_DEVICE_REQUEST;
-            Irp->IoStatus.Information = 0;
-        }
-    }
-
-    if (status != STATUS_PENDING)
-    {
-        Irp->IoStatus.Status = status;
-
-        IoCompleteRequest(Irp, IO_NO_INCREMENT);
-    }
-
-    return status;
-}
-
-VOID
-FileDiskThread (
-    IN PVOID Context
-    )
-{
-    PDEVICE_OBJECT      device_object;
-    PDEVICE_EXTENSION   device_extension;
-    PLIST_ENTRY         request;
-    PIRP                irp;
-    PIO_STACK_LOCATION  io_stack;
-    PUCHAR              system_buffer;
-    PUCHAR              buffer;
-
-    ASSERT(Context != NULL);
-
-    device_object = (PDEVICE_OBJECT) Context;
-
-    device_extension = (PDEVICE_EXTENSION) device_object->DeviceExtension;
-
-    KeSetPriorityThread(KeGetCurrentThread(), LOW_REALTIME_PRIORITY);
-
-    FileDiskAdjustPrivilege(SE_IMPERSONATE_PRIVILEGE, TRUE);
-
-    for (;;)
-    {
-        KeWaitForSingleObject(
-            &device_extension->request_event,
-            Executive,
-            KernelMode,
-            FALSE,
-            NULL
-            );
-
-        if (device_extension->terminate_thread)
-        {
-            PsTerminateSystemThread(STATUS_SUCCESS);
-        }
-
-        while (request = ExInterlockedRemoveHeadList(
-            &device_extension->list_head,
-            &device_extension->list_lock
-            ))
-        {
-            irp = CONTAINING_RECORD(request, IRP, Tail.Overlay.ListEntry);
-
-            io_stack = IoGetCurrentIrpStackLocation(irp);
-
-            switch (io_stack->MajorFunction)
-            {
-            case IRP_MJ_READ:
-                system_buffer = (PUCHAR) MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority);
-                if (system_buffer == NULL)
-                {
-                    irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
-                    irp->IoStatus.Information = 0;
-                    break;
-                }
-                buffer = (PUCHAR) ExAllocatePool(PagedPool, io_stack->Parameters.Read.Length);
-                if (buffer == NULL)
-                {
-                    irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
-                    irp->IoStatus.Information = 0;
-                    break;
-                }
-                ZwReadFile(
-                    device_extension->file_handle,
-                    NULL,
-                    NULL,
-                    NULL,
-                    &irp->IoStatus,
-                    buffer,
-                    io_stack->Parameters.Read.Length,
-                    &io_stack->Parameters.Read.ByteOffset,
-                    NULL
-                    );
-                RtlCopyMemory(system_buffer, buffer, io_stack->Parameters.Read.Length);
-                ExFreePool(buffer);
-                break;
-
-            case IRP_MJ_WRITE:
-                if ((io_stack->Parameters.Write.ByteOffset.QuadPart +
-                     io_stack->Parameters.Write.Length) >
-                     device_extension->file_size.QuadPart)
-                {
-                    irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
-                    irp->IoStatus.Information = 0;
-                }
-                ZwWriteFile(
-                    device_extension->file_handle,
-                    NULL,
-                    NULL,
-                    NULL,
-                    &irp->IoStatus,
-                    MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority),
-                    io_stack->Parameters.Write.Length,
-                    &io_stack->Parameters.Write.ByteOffset,
-                    NULL
-                    );
-                break;
-
-            case IRP_MJ_DEVICE_CONTROL:
-                switch (io_stack->Parameters.DeviceIoControl.IoControlCode)
-                {
-                case IOCTL_FILE_DISK_OPEN_FILE:
-
-                    SeImpersonateClient(device_extension->security_client_context, NULL);
-
-                    irp->IoStatus.Status = FileDiskOpenFile(device_object, irp);
-
-                    PsRevertToSelf();
-
-                    break;
-
-                case IOCTL_FILE_DISK_CLOSE_FILE:
-                    irp->IoStatus.Status = FileDiskCloseFile(device_object, irp);
-                    break;
-
-                default:
-                    irp->IoStatus.Status = STATUS_DRIVER_INTERNAL_ERROR;
-                }
-                break;
-
-            default:
-                irp->IoStatus.Status = STATUS_DRIVER_INTERNAL_ERROR;
-            }
-
-            IoCompleteRequest(
-                irp,
-                (CCHAR) (NT_SUCCESS(irp->IoStatus.Status) ?
-                IO_DISK_INCREMENT : IO_NO_INCREMENT)
-                );
-        }
-    }
-}
-
-#pragma code_seg("PAGE")
-
-NTSTATUS
-FileDiskOpenFile (
-    IN PDEVICE_OBJECT   DeviceObject,
-    IN PIRP             Irp
-    )
-{
-    PDEVICE_EXTENSION               device_extension;
-    POPEN_FILE_INFORMATION          open_file_information;
-    UNICODE_STRING                  ufile_name;
-    NTSTATUS                        status;
-    OBJECT_ATTRIBUTES               object_attributes;
-    FILE_END_OF_FILE_INFORMATION    file_eof;
-    FILE_BASIC_INFORMATION          file_basic;
-    FILE_STANDARD_INFORMATION       file_standard;
-    FILE_ALIGNMENT_INFORMATION      file_alignment;
-
-    PAGED_CODE();
-
-    ASSERT(DeviceObject != NULL);
-    ASSERT(Irp != NULL);
-
-    device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
-
-    open_file_information = (POPEN_FILE_INFORMATION) Irp->AssociatedIrp.SystemBuffer;
-
-    if (DeviceObject->DeviceType != FILE_DEVICE_CD_ROM)
-    {
-        device_extension->read_only = open_file_information->ReadOnly;
-    }
-
-    device_extension->file_name.Length = open_file_information->FileNameLength;
-    device_extension->file_name.MaximumLength = open_file_information->FileNameLength;
-    device_extension->file_name.Buffer = ExAllocatePool(NonPagedPool, open_file_information->FileNameLength);
-
-    RtlCopyMemory(
-        device_extension->file_name.Buffer,
-        open_file_information->FileName,
-        open_file_information->FileNameLength
-        );
-
-    status = RtlAnsiStringToUnicodeString(
-        &ufile_name,
-        &device_extension->file_name,
-        TRUE
-        );
-
-    if (!NT_SUCCESS(status))
-    {
-        ExFreePool(device_extension->file_name.Buffer);
-        Irp->IoStatus.Status = status;
-        Irp->IoStatus.Information = 0;
-        return status;
-    }
-
-    InitializeObjectAttributes(
-        &object_attributes,
-        &ufile_name,
-        OBJ_CASE_INSENSITIVE,
-        NULL,
-        NULL
-        );
-
-    status = ZwCreateFile(
-        &device_extension->file_handle,
-        device_extension->read_only ? GENERIC_READ : GENERIC_READ | GENERIC_WRITE,
-        &object_attributes,
-        &Irp->IoStatus,
-        NULL,
-        FILE_ATTRIBUTE_NORMAL,
-        device_extension->read_only ? FILE_SHARE_READ : 0,
-        FILE_OPEN,
-        FILE_NON_DIRECTORY_FILE |
-        FILE_RANDOM_ACCESS |
-        FILE_NO_INTERMEDIATE_BUFFERING |
-        FILE_SYNCHRONOUS_IO_NONALERT,
-        NULL,
-        0
-        );
-
-    if (status == STATUS_OBJECT_NAME_NOT_FOUND || status == STATUS_NO_SUCH_FILE)
-    {
-        if (device_extension->read_only || open_file_information->FileSize.QuadPart == 0)
-        {
-            ExFreePool(device_extension->file_name.Buffer);
-            RtlFreeUnicodeString(&ufile_name);
-
-            Irp->IoStatus.Status = STATUS_NO_SUCH_FILE;
-            Irp->IoStatus.Information = 0;
-
-            return STATUS_NO_SUCH_FILE;
-        }
-        else
-        {
-            status = ZwCreateFile(
-                &device_extension->file_handle,
-                GENERIC_READ | GENERIC_WRITE,
-                &object_attributes,
-                &Irp->IoStatus,
-                &open_file_information->FileSize,
-                FILE_ATTRIBUTE_NORMAL,
-                0,
-                FILE_OPEN_IF,
-                FILE_NON_DIRECTORY_FILE |
-                FILE_RANDOM_ACCESS |
-                FILE_NO_INTERMEDIATE_BUFFERING |
-                FILE_SYNCHRONOUS_IO_NONALERT,
-                NULL,
-                0
-                );
-
-            if (!NT_SUCCESS(status))
-            {
-                ExFreePool(device_extension->file_name.Buffer);
-                RtlFreeUnicodeString(&ufile_name);
-                return status;
-            }
-
-            if (Irp->IoStatus.Information == FILE_CREATED)
-            {
-                file_eof.EndOfFile.QuadPart = open_file_information->FileSize.QuadPart;
-
-                status = ZwSetInformationFile(
-                    device_extension->file_handle,
-                    &Irp->IoStatus,
-                    &file_eof,
-                    sizeof(FILE_END_OF_FILE_INFORMATION),
-                    FileEndOfFileInformation
-                    );
-
-                if (!NT_SUCCESS(status))
-                {
-                    ExFreePool(device_extension->file_name.Buffer);
-                    RtlFreeUnicodeString(&ufile_name);
-                    ZwClose(device_extension->file_handle);
-                    return status;
-                }
-            }
-        }
-    }
-    else if (!NT_SUCCESS(status))
-    {
-        ExFreePool(device_extension->file_name.Buffer);
-        RtlFreeUnicodeString(&ufile_name);
-        return status;
-    }
-
-    RtlFreeUnicodeString(&ufile_name);
-
-    status = ZwQueryInformationFile(
-        device_extension->file_handle,
-        &Irp->IoStatus,
-        &file_basic,
-        sizeof(FILE_BASIC_INFORMATION),
-        FileBasicInformation
-        );
-
-    if (!NT_SUCCESS(status))
-    {
-        ExFreePool(device_extension->file_name.Buffer);
-        ZwClose(device_extension->file_handle);
-        return status;
-    }
-
-/*
-    //
-    // The NT cache manager can deadlock if a filesystem that is using the cache
-    // manager is used in a virtual disk that stores its file on a filesystem
-    // that is also using the cache manager, this is why we open the file with
-    // FILE_NO_INTERMEDIATE_BUFFERING above, however if the file is compressed
-    // or encrypted NT will not honor this request and cache it anyway since it
-    // need to store the decompressed/unencrypted data somewhere, therefor we put
-    // an extra check here and don't alow disk images to be compressed/encrypted.
-    //
-    if (file_basic.FileAttributes & (FILE_ATTRIBUTE_COMPRESSED | FILE_ATTRIBUTE_ENCRYPTED))
-    {
-        ExFreePool(device_extension->file_name.Buffer);
-        ZwClose(device_extension->file_handle);
-        Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
-        Irp->IoStatus.Information = 0;
-        return STATUS_ACCESS_DENIED;
-    }
-*/
-
-    status = ZwQueryInformationFile(
-        device_extension->file_handle,
-        &Irp->IoStatus,
-        &file_standard,
-        sizeof(FILE_STANDARD_INFORMATION),
-        FileStandardInformation
-        );
-
-    if (!NT_SUCCESS(status))
-    {
-        ExFreePool(device_extension->file_name.Buffer);
-        ZwClose(device_extension->file_handle);
-        return status;
-    }
-
-    device_extension->file_size.QuadPart = file_standard.EndOfFile.QuadPart;
-
-    status = ZwQueryInformationFile(
-        device_extension->file_handle,
-        &Irp->IoStatus,
-        &file_alignment,
-        sizeof(FILE_ALIGNMENT_INFORMATION),
-        FileAlignmentInformation
-        );
-
-    if (!NT_SUCCESS(status))
-    {
-        ExFreePool(device_extension->file_name.Buffer);
-        ZwClose(device_extension->file_handle);
-        return status;
-    }
-
-    DeviceObject->AlignmentRequirement = file_alignment.AlignmentRequirement;
-
-    if (device_extension->read_only)
-    {
-        DeviceObject->Characteristics |= FILE_READ_ONLY_DEVICE;
-    }
-    else
-    {
-        DeviceObject->Characteristics &= ~FILE_READ_ONLY_DEVICE;
-    }
-
-    device_extension->media_in_device = TRUE;
-
-    Irp->IoStatus.Status = STATUS_SUCCESS;
-    Irp->IoStatus.Information = 0;
-
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS
-FileDiskCloseFile (
-    IN PDEVICE_OBJECT   DeviceObject,
-    IN PIRP             Irp
-    )
-{
-    PDEVICE_EXTENSION device_extension;
-
-    PAGED_CODE();
-
-    ASSERT(DeviceObject != NULL);
-    ASSERT(Irp != NULL);
-
-    device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
-
-    ExFreePool(device_extension->file_name.Buffer);
-
-    ZwClose(device_extension->file_handle);
-
-    device_extension->media_in_device = FALSE;
-
-    Irp->IoStatus.Status = STATUS_SUCCESS;
-    Irp->IoStatus.Information = 0;
-
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS
-FileDiskAdjustPrivilege (
-    IN ULONG    Privilege,
-    IN BOOLEAN  Enable
-    )
-{
-    NTSTATUS            status;
-    HANDLE              token_handle;
-    TOKEN_PRIVILEGES    token_privileges;
-
-    PAGED_CODE();
-
-    status = ZwOpenProcessToken(
-        NtCurrentProcess(),
-        TOKEN_ALL_ACCESS,
-        &token_handle
-        );
-
-    if (!NT_SUCCESS(status))
-    {
-        return status;
-    }
-
-    token_privileges.PrivilegeCount = 1;
-    token_privileges.Privileges[0].Luid = RtlConvertUlongToLuid(Privilege);
-    token_privileges.Privileges[0].Attributes = Enable ? SE_PRIVILEGE_ENABLED : 0;
-
-    //
-    // Normaly one would use ZwAdjustPrivilegesToken but it is only available
-    // on Windows 2000 and later versions, however since we are in a system
-    // thread does ExGetPreviousMode always return KernelMode and therefore
-    // can NtAdjustPrivilegesToken be used directly.
-    //
-    status = NtAdjustPrivilegesToken(
-        token_handle,
-        FALSE,
-        &token_privileges,
-        sizeof(token_privileges),
-        NULL,
-        NULL
-        );
-
-    ZwClose(token_handle);
-
-    return status;
-}
--- a/buildframework/helium/external/filedisk/sys/src/filedisk.rc	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-//Microsoft Developer Studio generated resource script.
-//
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "afxres.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-#pragma code_page(1252)
-#endif //_WIN32
-
-#ifndef _MAC
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,0,0,14
- PRODUCTVERSION 1,0,0,14
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x40004L
- FILETYPE 0x3L
- FILESUBTYPE 0x0L
-BEGIN
-    BLOCK "StringFileInfo"
-    BEGIN
-        BLOCK "040904b0"
-        BEGIN
-            VALUE "CompanyName", "Bo Brantén\0"
-            VALUE "FileDescription", "FileDisk Virtual Disk Driver\0"
-            VALUE "FileVersion", "1.0.0.14\0"
-            VALUE "InternalName", "filedisk\0"
-            VALUE "LegalCopyright", "Copyright © 1999-2006 Bo Brantén\0"
-            VALUE "OriginalFilename", "filedisk.sys\0"
-            VALUE "ProductName", "filedisk\0"
-            VALUE "ProductVersion", "1.0.0.14\0"
-        END
-    END
-    BLOCK "VarFileInfo"
-    BEGIN
-        VALUE "Translation", 0x409, 1200
-    END
-END
-
-#endif    // !_MAC
-
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE DISCARDABLE 
-BEGIN
-    "resource.h\0"
-END
-
-2 TEXTINCLUDE DISCARDABLE 
-BEGIN
-    "#include ""afxres.h""\r\n"
-    "\0"
-END
-
-3 TEXTINCLUDE DISCARDABLE 
-BEGIN
-    "\r\n"
-    "\0"
-END
-
-#endif    // APSTUDIO_INVOKED
-
-#endif    // English (U.S.) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif    // not APSTUDIO_INVOKED
-
Binary file buildframework/helium/external/helium-antlib/bin/helium-core.jar has changed
Binary file buildframework/helium/external/helium-antlib/bin/helium-diamonds.jar has changed
Binary file buildframework/helium/external/helium-antlib/bin/helium-imaker.jar has changed
Binary file buildframework/helium/external/helium-antlib/bin/helium-logging.jar has changed
Binary file buildframework/helium/external/helium-antlib/bin/helium-metadata.jar has changed
Binary file buildframework/helium/external/helium-antlib/bin/helium-quality.jar has changed
Binary file buildframework/helium/external/helium-antlib/bin/helium-sbs.jar has changed
Binary file buildframework/helium/external/helium-antlib/bin/helium-scm.jar has changed
Binary file buildframework/helium/external/helium-antlib/bin/helium-signaling.jar has changed
Binary file buildframework/helium/external/helium-antlib/bin/helium-sysdef.jar has changed
--- a/buildframework/helium/external/helium-antlib/build.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -24,7 +24,9 @@
     <description>Helium Antlib build file.</description>
     
     <property environment="env" />
-    
+
+    <dirname property="helium.antlib.root.dir" file="${ant.file.helium-antlib}" />    
+
     <import file="macros.ant.xml" />    
     
     
@@ -52,23 +54,41 @@
     
     <target name="junit" description="Runs jUnit tests">
         <subantPreset target="junit"/>
+        <antcall target="merge-coverage" />
     </target>
     
     
     <target name="unittest" description="Runs AntUnit tests">
         <subantPreset target="unittest"/>
+        <antcall target="merge-coverage" />
     </target>
     
-    
+        
     <target name="test" description="Runs all tests">
         <subantPreset target="test"/>
+        <antcall target="merge-coverage" />
     </target>
     
-
     <target name="clean" description="Cleans build outputs">
         <subantPreset target="clean"/>
     </target>
 
+    <target name="merge-coverage">
+        <emma enabled="true">
+            <report>
+                <sourcepath>
+                    <dirset dir="${helium.antlib.root.dir}" >
+                        <include name="**/src" /> 
+                    </dirset>
+                </sourcepath>
+                <infileset dir="${build.temp.dir}" includes="**/*.emma" />
+                <txt outfile="${build.temp.dir}/coverage.txt" />
+                <html outfile="${build.temp.dir}/coverage.html" />
+                <xml outfile="${build.temp.dir}/coverage.xml" />
+            </report>
+        </emma>
+    </target>
+    
 </project>
 
 
--- a/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/EmailDataSender.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/EmailDataSender.java	Wed Dec 23 19:29:07 2009 +0200
@@ -150,15 +150,16 @@
             toListLength = toAddressList.length;
         InternetAddress[] addressList = new InternetAddress[toListLength];
         try {
-            log.debug("EmailDataSender:getToAddressList:length: "
+            log.debug("getToAddressList:length: "
                     + toListLength);
             for (int i = 0; i < toListLength; i++) {
-                log.debug("EmailDataSender:getToAddressList:address:"
+                log.debug("getToAddressList:address:"
                         + toAddressList[i]);
                 addressList[i] = new InternetAddress(toAddressList[i]);
             }
         } catch (Exception aex) {
-            log.error("EmailDataSender:AddressException: " + aex);
+            // We are Ignoring the errors as no need to fail the build.
+            log.error("AddressException: " + aex);
         }
         return addressList;
     }
@@ -217,10 +218,9 @@
     public void sendData(String purpose, String fileToSend, String mimeType,
             String subject, String header, boolean compressData) {
         try {
-            log.debug("EmailDataSender:sendData:file: " + fileToSend);
-            log.debug("EmailDataSender:sendData:mimetype: " + mimeType);
+            log.debug("sendData:Send file: " + fileToSend + " and mimetype: " + mimeType);
             if (fileToSend != null) {
-                log.debug("EmailDataSender:sendData:smtp address: "
+                log.debug("sendData:smtp address: "
                         + smtpServerAddress);
                 InternetAddress[] toAddresses = getToAddressList();
                 Properties props = new Properties();
@@ -235,15 +235,14 @@
                 MimeMultipart multipart = new MimeMultipart("related");
                 BodyPart messageBodyPart = new MimeBodyPart();
                 ByteArrayDataSource dataSrc = null;
-                log.debug("EmailDataSender:sendData:Send file: " + fileToSend);
                 String fileName = new File(fileToSend).getName();
                 if (compressData) {
-                    log.debug("EmailDataSender: Sending compressed data");
+                    log.debug("Sending compressed data");
                     dataSrc = compressFile(fileToSend);
                     dataSrc.setName(fileName + ".gz");
                     messageBodyPart.setFileName(fileName + ".gz");
                 } else {
-                    log.debug("EmailDataSender: Sending uncompressed data:");
+                    log.debug("Sending uncompressed data:");
                     dataSrc = new ByteArrayDataSource(new FileInputStream(
                             new File(fileToSend)), mimeType);
 
@@ -267,15 +266,21 @@
                     InternetAddress fromAddress = getFromAddress(); 
                     message.setFrom(fromAddress);
                 } catch (Exception e) {
-                    log.debug("Error retrieving current user email address: " + e.getMessage());
+                    // We are Ignoring the errors as no need to fail the build.
+                    log.debug("Error retrieving current user email address: " + e.getMessage(), e);
                 }
                 message.addRecipients(Message.RecipientType.TO, toAddresses);
                 log.info("Sending email alert: " + subject);
                 Transport.send(message);
             }
         } catch (Exception e) {
-            log.info("Not sending e-mail signal because of errors");
-            log.debug("Failed sending e-mail: " + purpose + ": ", e);
+            String errorMessage = e.getMessage();
+            String fullErrorMessage = "Failed sending e-mail: " + purpose;
+            if (errorMessage != null) {
+                fullErrorMessage += " " + errorMessage;
+            }
+            // We are Ignoring the errors as no need to fail the build.
+            log.info(fullErrorMessage);
         }
     }
 
@@ -342,12 +347,11 @@
             if (en.hasMore()) {
                 SearchResult sr = en.next();
                 String email = (String) sr.getAttributes().get("mail").get();
-                log.debug("EmailDataSender:getUserEmail:" + email);
+                log.debug("getUserEmail:" + email);
                 return email;
             }
         } catch (javax.naming.NameNotFoundException ex) {
-            log.debug("EmailDataSender:username:" + username + "finding error");
-            throw new HlmAntLibException("Error find user email");
+            throw new HlmAntLibException("Error finding user email for " + username );
         }
         throw new HlmAntLibException("Could not find user email in LDAP.");
     }
--- a/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/TemplateProcessor.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/TemplateProcessor.java	Wed Dec 23 19:29:07 2009 +0200
@@ -68,15 +68,12 @@
                 }
             }
         } catch (java.io.IOException e) {
-            log.warn("I/O Error during template conversion: " + e.getMessage());
             throw new TemplateProcessorException(
                     "I/O Error during template conversion: " + e.getMessage());
         } catch (org.xml.sax.SAXException e1) {
-            log.warn("XML parser error: " + e1);
             throw new TemplateProcessorException("XML parser error: "
                     + e1.getMessage());
         } catch (javax.xml.parsers.ParserConfigurationException e3) {
-            log.warn("Parser error: " + e3);
             throw new TemplateProcessorException("Parser error: "
                     + e3.getMessage());
         }
@@ -111,7 +108,6 @@
             convertTemplate(templateFile.getParent(), templateFile.getName(),
                     outputFile.toString(), sourceList);
         } else {
-            log.error("Template file is not defined.");
             throw new TemplateProcessorException("Template file not defined.");
         }
     }
@@ -145,16 +141,10 @@
                         .debug("diamonds:TemplateProcessor:adding template directory loader: "
                                 + templateDir);
             } catch (java.io.IOException ie) {
-                log.debug("Template directory configuring error.");
-                log.info("Template directory configuring error.");
                 throw new TemplateProcessorException(
                         "Template directory configuring error: " + ie);
             }
         } else {
-            log.debug("Template directory does not exist: "
-                    + templateDirFile.getAbsolutePath());
-            log.info("Template directory does not exist: "
-                    + templateDirFile.getAbsolutePath());
             throw new TemplateProcessorException(
                     "Template directory does not exist: "
                             + templateDirFile.getAbsolutePath());
@@ -164,14 +154,11 @@
             Map<String, Object> templateMap = getTemplateMap(sourceList);
             template.process(templateMap, new FileWriter(outputFile));
         } catch (freemarker.core.InvalidReferenceException ivx) {
-            log.warn("Invalid reference in configuration: ", ivx);
             throw new TemplateProcessorException(
                     "Invalid reference in config: " + ivx);
         } catch (freemarker.template.TemplateException e2) {
-            log.warn("TemplateException: ", e2);
             throw new TemplateProcessorException("TemplateException: " + e2);
         } catch (java.io.IOException e) {
-            log.warn("I/O Error during template conversion: " + e.getMessage());
             throw new TemplateProcessorException(
                     "I/O Error during template conversion: " + e);
         }
--- a/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/HeliumExecutor.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/HeliumExecutor.java	Wed Dec 23 19:29:07 2009 +0200
@@ -67,7 +67,7 @@
      */
     public void executeTargets(Project project, String[] targetNames) {
         this.project = project;
-        log.debug("[HeliumExecutor] Running executeTargets");
+        log.debug("Running executeTargets");
         BuildException failure = null;
         try {
             loadModules(project);
@@ -75,6 +75,7 @@
             super.executeTargets(project, targetNames);
         } catch (BuildException e) {
             // Saving current issue
+            // We are Ignoring the errors as no need to fail the build.
             failure = e;
         }
 
@@ -119,7 +120,7 @@
         if (file == null) {
             return;
         }
-        log.debug("[HeliumExecutor] Loading " + moduleLib.getName());
+        log.debug("Loading " + moduleLib.getName());
         ImportTask task = new ImportTask();
         Target target = new Target();
         target.setName("");
@@ -152,13 +153,13 @@
             if (tempExceptionDefList != null) {
                 exceptionHandlers.put(moduleName, tempExceptionDefList);
             }
-            log.debug("HeliumExecutor:loadModule:pre-opsize"
+            log.debug("loadModule:pre-opsize"
                     + preOperations.size());
-            log.debug("HeliumExecutor:loadModule:post-opsize"
+            log.debug("loadModule:post-opsize"
                     + postOperations.size());
-            log.debug("HeliumExecutor:loadModule:exception-opsize"
+            log.debug("loadModule:exception-opsize"
                     + exceptionHandlers.size());
-            log.debug("[HeliumExecutor] Checking " + moduleLib);
+            log.debug("Checking " + moduleLib);
         }
     }
 
@@ -195,7 +196,7 @@
             URL url = findHeliumAntlibXml(moduleLib);
             if (url == null)
                 return null;
-            log.debug("[HeliumExecutor] Getting " + url);
+            log.debug("Getting " + url);
 
             JarURLConnection jarConnection = (JarURLConnection) url
                     .openConnection();
@@ -213,10 +214,10 @@
             }
             writer.close();
             reader.close();
-            log.debug("[HeliumExecutor] Temp file " + file.getAbsolutePath());
+            log.debug("Temp file " + file.getAbsolutePath());
             return file.getAbsolutePath();
         } catch (Exception ex) {
-            log.error("[HeliumExecutor] Error: ", ex);
+            log.error("Error: " + ex.getMessage(), ex);
             return null;
         }
     }
@@ -224,9 +225,9 @@
     private void doOperations(
             HashMap<String, Vector<HlmDefinition>> operations, Project prj,
             String[] targetNames) {
-        log.debug("HeliumExecutor:doOperations: start");
+        log.debug("doOperations: start");
         for (String moduleName : operations.keySet()) {
-            log.debug("HeliumExecutor:doOperations: module" + moduleName);
+            log.debug("doOperations: module" + moduleName);
             for (HlmDefinition definition : operations.get(moduleName)) {
                 definition.execute(prj, moduleName, targetNames);
             }
@@ -234,9 +235,8 @@
     }
 
     private void handleExceptions(Project prj, Exception e) {
-        log.debug("HeliumExecutor:handleExceptions: start");
         for (String moduleName : this.exceptionHandlers.keySet()) {
-            log.debug("HeliumExecutor:handleExceptions: module" + moduleName);
+            log.debug("handleExceptions: module" + moduleName);
             for (HlmExceptionHandler exceptionHandler : this.exceptionHandlers
                     .get(moduleName)) {
                 exceptionHandler.handleException(prj, moduleName, e);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/VariableIFImpl.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.helium.core.ant;
+
+import org.apache.tools.ant.types.DataType;
+import com.nokia.helium.core.ant.types.Variable;
+import java.util.Collection;
+
+/**
+ * Interface to get the list of variables of type VariableSet
+ */
+public class VariableIFImpl extends DataType 
+{
+
+    
+    /**
+     * Get the name of the variable.
+     * @return name.
+     */
+    public Collection<Variable> getVariables() {
+        //Implemented by sub class
+        return null;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/VariableInterface.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.helium.core.ant;
+
+import com.nokia.helium.core.ant.types.Variable;
+import java.util.Collection;
+
+/**
+ * Interface to get the list of variables of type VariableSet
+ */
+public interface VariableInterface
+{
+
+    
+    /**
+     * Get the name of the variable.
+     * @return name.
+     */
+    Collection<Variable> getVariables();
+
+}
\ No newline at end of file
--- a/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/antlib.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/antlib.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -24,10 +24,14 @@
     <!-- Task definition -->
     <taskdef name="path2file" classname="com.nokia.helium.core.ant.taskdefs.SerializePathTask"/>
     <taskdef name="countSeverity" classname="com.nokia.helium.core.ant.taskdefs.XMLLogCount"/>
+    <taskdef name="getVariableValue" classname="com.nokia.helium.core.ant.taskdefs.GetValueFromVariableSet"/>
     <!-- Type definition -->
     <typedef name="hasSeverity" classname="com.nokia.helium.core.ant.conditions.XMLLogCondition"/>
     <typedef name="ldapauthenticate" classname="com.nokia.helium.core.ant.taskdefs.ValidateUserLogin" />
 
+    <typedef name="arg" classname="com.nokia.helium.core.ant.types.Variable"/>
+    <typedef name="argSet" classname="com.nokia.helium.core.ant.types.VariableSet"/>
+
     <!-- Type definition -->
     <typedef name="deflist" classname="com.nokia.helium.core.ant.types.HlmDefList"/>
     <typedef name="importdef" classname="com.nokia.helium.core.ant.types.HlmImportDef"/>
--- a/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/conditions/XMLLogCondition.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/conditions/XMLLogCondition.java	Wed Dec 23 19:29:07 2009 +0200
@@ -87,8 +87,7 @@
         if (severity == null)
             throw new BuildException("'severity' attribute is not defined");
 
-        this.log("Looking for severity '" + severity + "' under '"
-                + fileName.getAbsolutePath() + "'");
+        //this.log("Looking for severity '" + severity + "' under '" + fileName.getAbsolutePath() + "'");
         SAXParserFactory factory = SAXParserFactory.newInstance();
         try {
             SAXParser saxParser = factory.newSAXParser();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/helium.antlib.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : libs.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="libs-core" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Ant task definition declarations.
+    </description>
+    <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+    <typedef name="finaltargetdef" classname="com.nokia.helium.core.ant.types.HlmFinalTargetDef"/> 
+
+    <hlm:deflist id="helium-core.list">
+        <finaltargetdef/>
+    </hlm:deflist>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/GetValueFromVariableSet.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,126 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.helium.core.ant.taskdefs;
+
+import org.apache.tools.ant.BuildException;
+import java.util.Vector;
+import java.util.Collection;
+import com.nokia.helium.core.ant.VariableIFImpl;
+import org.apache.tools.ant.Task;
+import com.nokia.helium.core.ant.types.Variable;
+
+
+/**
+ * To retrive a variable value from a collection of variable set based on name, which contains property-value in pair.
+ *  
+ * <pre>
+ * Example:
+ * 
+ * &lt;hlm:argSet id="test.variableSet"&gt;
+ * &lt;variable name="v1" value="the_value_1"/&gt;
+ *     &lt;variable name="v2" value="the_value_2"/&gt;
+ *      &lt;variable name="v3" value="the_value_3"/&gt;
+ * &lt;/hlm:argSet&gt;
+ *       
+ *  &lt;hlm:getVariableValue name="v3" property="v1.value"&gt;
+ * &lt;hlm:argSet refid="test.variableSet"/&gt;
+ * &lt;/hlm:getVariableValue&gt;
+ * </pre>
+ * @ant.task name="getVariableValue"
+ */
+public class GetValueFromVariableSet extends Task {
+    private String name;
+    private String property;
+    private boolean failOnError = true;
+    
+   private Vector<VariableIFImpl> variableIntefaces = new Vector<VariableIFImpl>();
+    
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Helper function to set failonerror attribute for the task. 
+     * @param failStatus, if true will fail the build if no variable is found for 
+     * matching name.
+     */
+    public void setFailOnError(boolean failStatus) {
+        failOnError = failStatus;
+    }
+
+    /**
+     * Helper function to store the name of the property where the value to be stored
+     * @param property name of the property where the result to be stored
+     */
+    public void setProperty(String property) {
+        this.property = property;
+    }
+
+    /**
+     * Helper function to create the VariableIFImpl object. 
+     * @return created VariableIFImpl instance
+     */
+    public VariableIFImpl createVariableIFImpl() {
+        VariableIFImpl var = new VariableIFImpl();
+        add(var);
+        return var;
+    }
+
+    
+    /**
+     * Helper function to add the newly created variable set. Called by ant.
+     * @param vs variable set to be added.
+     */
+    public void add(VariableIFImpl vs) {
+        variableIntefaces.add(vs);
+    }
+
+    public VariableIFImpl getVariableInterface() {
+        if (variableIntefaces.isEmpty()) {
+            throw new BuildException("variable interface cannot be null");
+        }
+        if (variableIntefaces.size() > 1 ) {
+            throw new BuildException("maximum one variable interface can be set");
+        }
+        return variableIntefaces.elementAt(0);
+    }
+    
+
+    /**
+     * Task to get the name / value pair
+     * @return return the name / value pair for the variable set.
+     */
+    public void execute() {
+        if (name == null)
+            throw new BuildException("'name' attribute has not been defined.");
+        if (property == null)
+            throw new BuildException(
+                    "'property' attribute has not been defined.");
+        VariableIFImpl varInterface = getVariableInterface();
+        Collection<Variable> variables = varInterface.getVariables();
+        for (Variable var : variables) {
+            if (var.getName().equals(name)) {
+                getProject().setProperty(property, var.getValue());
+                return;
+            }
+        }
+        if (failOnError) {
+            throw new BuildException("Could not find '" + name + "' variable.");
+        }
+    }
+}
--- a/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/ValidateUserLogin.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/ValidateUserLogin.java	Wed Dec 23 19:29:07 2009 +0200
@@ -18,6 +18,7 @@
 package com.nokia.helium.core.ant.taskdefs;
 
 import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
 import org.apache.tools.ant.BuildException;
 import javax.naming.*;
 import javax.naming.directory.*;
@@ -138,6 +139,8 @@
             DirContext authContext = new InitialDirContext(env);
             return true;
         } catch (NamingException e) {
+            // We are Ignoring the errors as no need to fail the build.
+            log("Not able to validate the user. " + e.getMessage(), Project.MSG_DEBUG);
             return false;  
         }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmFinalTargetDef.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,54 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+ 
+package com.nokia.helium.core.ant.types;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Target;
+import java.util.Hashtable;
+import org.apache.log4j.Logger;
+
+
+/**
+ * Class to execute the final target as post operation.
+ */
+public class HlmFinalTargetDef extends HlmPostDefImpl
+{
+    private Logger log = Logger.getLogger(HlmFinalTargetDef.class);
+    
+    /**
+     * This post action will execute the final target if any to be executed.
+     * @param prj
+     * @param module
+     * @param targetNames
+     * 
+     */
+    public void execute(Project prj, String module, String[] targetNames) {
+        String finalTargetName = prj.getProperty("hlm.target.final");
+        log.debug("Calling final target" + finalTargetName);
+        if (finalTargetName != null) {
+            Hashtable targets = prj.getTargets();
+            Target finalTarget = (Target)targets.get(finalTargetName);
+            if (finalTarget == null) {
+                log.info("The final target : " + finalTargetName + " not available skipping");
+                return;
+            }
+            finalTarget.execute();
+        }
+    }
+}
\ No newline at end of file
--- a/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmImportDef.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmImportDef.java	Wed Dec 23 19:29:07 2009 +0200
@@ -45,8 +45,7 @@
      * Will import the given file.
      */
     public void execute(Project prj, String module, String[] targetNames) {
-        log.debug("importdef:fileName" + file.toString());
-        log.debug("importdef:prj name" + prj.getName());
+        log.debug("importdef:prj name" + prj.getName() + ". fileName" + file.toString());
         ImportTask task = new ImportTask();
         Target target = new Target();
         target.setName("");
--- a/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmListenerDef.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmListenerDef.java	Wed Dec 23 19:29:07 2009 +0200
@@ -20,6 +20,7 @@
 
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.BuildListener;
+import org.apache.log4j.Logger;
 
 /**
  * This class implements a listener registration action.
@@ -29,6 +30,7 @@
 public class HlmListenerDef extends HlmPreDefImpl {
 
     private String classname;
+    private Logger log = Logger.getLogger(HlmListenerDef.class);
 
     public void setClassname(String classname) {
         this.classname = classname;
@@ -44,11 +46,11 @@
                     .newInstance();
             prj.addBuildListener(listener);
         } catch (ClassNotFoundException ex) {
-            ex.printStackTrace();
+            log.debug("Class not found exception:" + ex.getMessage(), ex);
         } catch (InstantiationException ex1) {
-            ex1.printStackTrace();
+            log.debug("Class Instantiation exception:" + ex1.getMessage(), ex1);
         } catch (IllegalAccessException ex1) {
-            ex1.printStackTrace();
+            log.debug("Illegal Class Access exception:" + ex1.getMessage(), ex1);
         }
     }
 }
\ No newline at end of file
--- a/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmPostDefImpl.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmPostDefImpl.java	Wed Dec 23 19:29:07 2009 +0200
@@ -35,6 +35,6 @@
      * Do nothing.
      */
     public void execute(Project prj, String module, String[] targetNames) {
-        log.debug("HlmPostDefImpl:execute:" + module);
+        // Empty method. Implemented by extending classes.
     }
 }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/Variable.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,130 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.helium.core.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.BuildException;
+import org.apache.log4j.Logger;
+
+/**
+ * Helper class to store the command line variables
+ * with name / value pair.
+ * @ant.type name="arg"
+ * @ant.type name="makeOption"
+ */
+public class Variable extends DataType
+{
+    private static Logger log = Logger.getLogger(Variable.class);
+    private String name;
+    private String value;
+    private String cmdLine;
+
+    
+    public Variable() {
+    }
+    
+    /**
+     * Set the name of the variable.
+     * @param name
+     */
+    public void setName(String nm) {
+        name = nm;
+    }
+
+    
+    /**
+     * Get the name of the variable.
+     * @return name.
+     */
+    public String getName() {
+        if ( cmdLine == null) {
+            if (name == null ) { 
+                throw new BuildException( "name should not be null");
+            }
+            if (value == null) {
+                throw new BuildException( "value should not be null");
+            }
+            return name;
+        } else {
+            if (name != null  && value != null) { 
+                throw new BuildException( "you can define either name, value or line attribute and not both");
+            }
+            String cmdPart = cmdLine.trim();
+            String[] cmdArgs = cmdPart.split(" ");
+            return cmdArgs[0];
+        }
+    }
+
+    /**
+     * Set the value of the variable.
+     * @param value
+     */
+    public void setValue(String vlue) {
+        value = vlue;
+    }
+
+    /**
+     * Helper function to set the command line string
+     * @param line, string as input to command line.
+     */
+    public void setLine(String line) {
+        cmdLine = line;
+    }
+    
+    /**
+     * Get the value of the variable.
+     * @return value.
+     */
+    public String getValue() {
+        if ( cmdLine == null) {
+            if (name == null ) { 
+                throw new BuildException( "name should not be null");
+            }
+            if (value == null) {
+                throw new BuildException( "value should not be null");
+            }
+            return value;
+        } else {
+            if (name != null  && value != null) { 
+                throw new BuildException( "you can define either name, value or line attribute and not both");
+            }
+            return cmdLine;
+        }
+    }
+    /**
+     * Get the command line parameter
+     * @return command line string.
+     */
+    public String getParameter() {
+        if ( cmdLine == null) {
+            if (name == null ) { 
+                throw new BuildException( "name should not be null");
+            }
+            if (value == null) {
+                throw new BuildException( "value should not be null");
+            }
+            return name + "=" + value;
+        } else {
+            if (name != null  && value != null) { 
+                throw new BuildException( "you can define either name, value or line attribute and not both");
+            }
+            return cmdLine;
+        }
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/VariableSet.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,160 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.helium.core.ant.types;
+
+import java.util.Vector;
+import java.util.HashMap;
+import java.util.List;
+import com.nokia.helium.core.ant.VariableIFImpl;
+import java.util.Collection;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.Reference;
+import java.util.ArrayList;
+import org.apache.log4j.Logger;
+
+/**
+ * Helper class to store the variable set (list of variables
+ * with name / value pair)
+ * @ant.type name="argSet"
+ */
+public class VariableSet extends VariableIFImpl {
+
+    private static Logger log = Logger.getLogger(VariableSet.class);
+    
+    private HashMap<String, Variable> variablesMap = new HashMap<String, Variable>();
+
+    private List<Variable> variables = new ArrayList<Variable> ();
+
+    private Vector<VariableSet> varSets = new Vector<VariableSet>();
+    
+    private VariableSet currentSet;
+
+    /**
+     * Constructor
+     */
+    public VariableSet() {
+    }    
+
+    /**
+     * Helper function to add the created varset
+     * @param filter to be added to the varset
+     */
+    public void add(VariableSet varSet) {
+        currentSet = null;
+        if (varSet != null) {
+            varSets.add(varSet);
+        }
+    }
+
+    /**
+     * Creates an empty variable element and adds 
+     * it to the variables list
+     * @return empty Variable pair
+     */
+    public VariableSet createArgSet() {
+        VariableSet varSet =  new VariableSet();
+        add(varSet);
+        return varSet;
+    }
+
+    /**
+     * Creates an empty variable element and adds 
+     * it to the variables list
+     * @return empty Variable pair
+     */
+    public Variable createArg() {
+        Variable var =  new Variable();
+        add(var);
+        return var;
+    }
+    
+    private void addVariable(Variable var) {
+        variables.add(var);
+    }
+    
+    /**
+     * Add a given variable to the list 
+     * @param var variable to add
+     */
+    public void add(Variable var) {
+        if ( currentSet == null) {
+            currentSet = new VariableSet();
+            varSets.add(currentSet);
+        }
+        currentSet.addVariable(var);
+    }
+
+    /**
+     * Helper function to get the list of variables defined for this set.
+     * @return variable list for this set.
+     */
+    public List<Variable> getVariablesList() {
+        return variables;
+    }
+    
+    public List<VariableSet> getVariableSets() {
+        return varSets;
+    }
+
+
+    /**
+     * Helper function to return the list of variables and its references
+     * @return variable list for this set and its references.
+     */
+    public Collection<Variable> getVariables() {
+        HashMap<String, Variable> varMap =   getVariablesMap();
+        //if (varMap.isEmpty()) {
+        //    throw new BuildException("Variable should not be empty and should contain one arg");
+        //}
+        return getVariablesMap().values();
+    }
+    /**
+     * Returns the list of variables available in the VariableSet 
+     * @return variable list
+     */
+    public HashMap<String, Variable> getVariablesMap() {
+        HashMap<String, Variable> allVariables = new HashMap<String, Variable>();
+        // Then filters as reference in filterset
+        Reference refId = getRefid();
+        Object varSetObject = null;
+        if (refId != null) {
+            try {
+                varSetObject = refId.getReferencedObject();
+            } catch ( Exception ex) {
+                log.debug("exception in getting variable", ex);
+                throw new BuildException("Not found: " + ex.getMessage());
+            }
+            if (varSetObject != null && varSetObject instanceof VariableSet) {
+                HashMap<String, Variable> varSetMap = ((VariableSet)varSetObject).getVariablesMap();
+                allVariables.putAll(varSetMap);
+            }
+        }
+        if (varSets != null && (!varSets.isEmpty())) {
+            for (VariableSet varSet : varSets) {
+                HashMap<String, Variable> variablesMap = varSet.getVariablesMap();
+                allVariables.putAll(variablesMap);
+            }
+        }
+        if (variables != null && !variables.isEmpty()) {
+            for (Variable var : variables) {
+                allVariables.put(var.getName(), var);
+            }
+        }
+        return allVariables;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/plexus/AntStreamConsumer.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,62 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.core.plexus;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+/**
+ * Handle the output lines and redirect them to Ant logging.
+ * The logging level is configurable.
+ *
+ */
+public class AntStreamConsumer implements StreamConsumer {
+
+    private Task task;
+    private int level = Project.MSG_INFO;
+    
+    /**
+     * Initialize the consumer with the task that will be used to 
+     * redirect the consumed lines. Default logging level will be 
+     * Project.MSG_INFO.
+     * @param task an Ant task
+     */
+    public AntStreamConsumer(Task task) {
+        this.task = task;
+    }
+
+    /**
+     * Initialize the consumer with the task that will be used to 
+     * redirect the consumed lines, and the level of logging.
+     * @param task ant Ant task.
+     * @param level ant logging level to use.
+     */
+    public AntStreamConsumer(Task task, int level) {
+        this.task = task;
+        this.level = level;
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void consumeLine(String line) {
+        task.log(line, level);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/plexus/CommandBase.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,214 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.core.plexus;
+
+import java.io.File;
+import java.util.Map;
+import java.util.Vector;
+
+import org.apache.log4j.Logger;
+import org.codehaus.plexus.util.Os;
+import org.codehaus.plexus.util.cli.CommandLineException;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+/**
+ * This abstract class implements some basic support to execute commands and 
+ * redirect outputs to StreamConsumer. You can have common stream consumers or
+ * execution base streamconsumers. The exception type raised 
+ * can be controlled by the implementing class.
+ *
+ * @param <T>
+ */
+public abstract class CommandBase<T extends Exception> {
+    private final Logger log = Logger.getLogger(getClass());
+    private Vector<StreamConsumer> outputHandlers = new Vector<StreamConsumer>();
+    private Vector<StreamConsumer> errorHandlers = new Vector<StreamConsumer>();
+
+    /**
+     * Get the executable name.
+     * @return
+     */
+    protected abstract String getExecutable();
+
+    /**
+     * Throw an exception with message and cause.
+     * @param message
+     * @param t
+     * @throws T
+     */
+    protected abstract void throwException(String message, Throwable t) throws T;
+
+    /**
+     * Throw an exception with message only.
+     * @param message
+     * @throws T
+     */
+    protected void throwException(String message) throws T {
+        throwException(message, null);
+    }
+
+    /**
+     * Location where to execute the command. The default location
+     * is the current directory.
+     * @return a File object pointing to a directory.
+     */
+    public File getWorkingDir() {
+        return new File(".");
+    }
+    
+    /**
+     * Add a LineHandler to the CommandBase instance.
+     * LineHandlers could be used to record/log the output stream
+     * command invocation.
+     * @param lineHandler a lineHandle instance
+     */
+    public void addOutputLineHandler(StreamConsumer lineHandler) {
+        if (lineHandler != null) {
+            outputHandlers.add(lineHandler);
+        }
+    }
+    
+    /**
+     * Add a LineHandler to the CommandBase instance.
+     * LineHandlers could be used to record/log the output error stream
+     * command invocation.
+     * @param lineHandler a lineHandle instance
+     */
+    public void addErrorLineHandler(StreamConsumer lineHandler) {
+        if (lineHandler != null) {
+            errorHandlers.add(lineHandler);
+        }
+    }
+
+    /**
+     * Execute the command defined by getExecutable with args as list of arguments.
+     * 
+     * @param args
+     * @throws T extends
+     */
+    public void execute(String[] args) throws T {
+        execute(args, null);
+    }
+
+    /**
+     * Execute the command given by getExecutable with args as list of arguments and custom StreamConsumer.
+     * 
+     * @param args
+     *            an array representing blocks arguments
+     * @param output
+     *            the StreamConsumer to analyze the output with. If null it is
+     *            ignored.
+     * @throws T
+     */
+    public void execute(String[] args, StreamConsumer output) throws T {
+        execute(args, null, output);
+    }
+
+    /**
+     * Execute the command given by getExecutable with args as list of arguments and custom StreamConsumer.
+     * Also env content will be added to the environment. 
+     * 
+     * @param args
+     *            an array representing blocks arguments
+     * @param env
+     *            additional key to add the environment
+     * @param output
+     *            the StreamConsumer to analyze the output with. If null it is
+     *            ignored.
+     * @throws T
+     */
+    public void executeCmdLine(String argLine, Map<String, String> env, StreamConsumer output)
+            throws T {
+        Commandline cmdLine = new Commandline();
+        cmdLine.createArg().setValue(getExecutable());
+        if (argLine != null) {
+            cmdLine.createArg().setLine(argLine);
+        }
+        executeCmd(cmdLine, env, output);
+    }
+
+    private void executeCmd(Commandline cmdLine, Map<String, String> env, StreamConsumer output)     throws T  {
+        if (env != null) {
+            for (Map.Entry<String, String> entry : env.entrySet()) {
+                cmdLine.addEnvironment(entry.getKey(), entry.getValue());
+            }
+        }
+        cmdLine.setWorkingDirectory(getWorkingDir());
+        
+        // This is only needed on windows.
+        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
+            cmdLine.createArg().setLine("&& exit %%ERRORLEVEL%%");    
+        }
+        
+
+        StreamMultiplexer inputMux = new StreamMultiplexer();
+        if (output != null) {
+            inputMux.addHandler(output);
+        }
+        for (StreamConsumer lh : outputHandlers) {
+            inputMux.addHandler(lh);
+        }
+
+        StreamMultiplexer errorMux = new StreamMultiplexer();
+        StreamRecorder errorRecorder = new StreamRecorder();
+        errorMux.addHandler(errorRecorder);
+        for (StreamConsumer lh : errorHandlers) {
+            errorMux.addHandler(lh);
+        }
+
+        try {
+            int err = CommandLineUtils.executeCommandLine(cmdLine, inputMux,
+                    errorMux);
+            // check its exit value
+            log.debug("Execution of " + getExecutable() + " returned: " + err);
+            if (err != 0) {
+                throwException(errorRecorder.getBuffer() + " (return code: " + err
+                        + ")");
+            }
+        } catch (CommandLineException e) {
+            throwException(
+                    "Error executing " + getExecutable() + ": "
+                            + e.toString());
+        }
+    }
+
+    /**
+     * Execute the command given by getExecutable with args as list of arguments and custom StreamConsumer.
+     * Also env content will be added to the environment. 
+     * 
+     * @param args
+     *            an array representing blocks arguments
+     * @param env
+     *            additional key to add the environment
+     * @param output
+     *            the StreamConsumer to analyze the output with. If null it is
+     *            ignored.
+     * @throws T
+     */
+    public void execute(String[] args, Map<String, String> env, StreamConsumer output)
+            throws T {
+        Commandline cmdLine = new Commandline();
+        cmdLine.createArg().setValue(getExecutable());
+        if (args != null) {
+            cmdLine.addArguments(args);
+        }
+        executeCmd(cmdLine, env, output);
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/plexus/FileStreamConsumer.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,70 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.core.plexus;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+
+import org.apache.log4j.Logger;
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+/**
+ * Record a stream into a file. 
+ *
+ */
+public class FileStreamConsumer implements StreamConsumer {
+    private Logger log = Logger.getLogger(getClass());
+    private Writer writer;
+    
+    /**
+     * Create a FileStreamConsumer which will record content to 
+     * the output file.
+     * @param output the file to write the output to.
+     * @throws FileNotFoundException if an error occur while opening the file.
+     */
+    public FileStreamConsumer(File output) throws FileNotFoundException {
+        writer = new OutputStreamWriter(new FileOutputStream(output));
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public synchronized void consumeLine(String line) {
+        try {
+            writer.append(line + "\n");
+        } catch (IOException e) {
+            log.error("Error while writing to file: " + e.getMessage(), e);
+        }
+    }
+    
+    /**
+     * Closing the file.
+     */
+    public void close() {
+        try {
+            writer.flush();
+            writer.close();
+        } catch (IOException e) {
+            log.error("Error while writing to file: " + e.getMessage(), e);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/plexus/StreamMultiplexer.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.core.plexus;
+
+import java.util.Vector;
+
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+/**
+ * Get the line consumed by a set of StreamConsumer.
+ *
+ */
+public class StreamMultiplexer implements StreamConsumer {
+
+    private Vector<StreamConsumer> handlers = new Vector<StreamConsumer>(); 
+    
+    /**
+     * Add an StreamConsumer to the multiplexing. 
+     * @param handler the StreamConsumer to add.
+     */
+    public void addHandler(StreamConsumer handler) {
+        handlers.add(handler);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void consumeLine(String line) {
+        for (StreamConsumer handler : handlers) {
+            handler.consumeLine(line);
+        }
+    }
+    
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/plexus/StreamRecorder.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,69 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.core.plexus;
+
+import org.apache.log4j.Logger;
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+/**
+ * Record the consumed lines into a StringBuffer.
+ *
+ */
+public class StreamRecorder implements StreamConsumer {
+    private Logger log = Logger.getLogger(this.getClass());    
+    private StringBuffer buffer = new StringBuffer();
+    
+    /**
+     * Default constructor.
+     */
+    public StreamRecorder() {
+    }
+
+    /**
+     * This constructor allows you to set a custom
+     * buffer.
+     * @param buffer custom buffer object.
+     */
+    public StreamRecorder(StringBuffer buffer) {
+        this.buffer = buffer;
+    }
+
+    /**
+     * Get the current buffer.
+     * @return the current buffer object
+     */
+    public StringBuffer getBuffer() {
+        return buffer;
+    }
+
+    /**
+     * Set the buffer object.
+     * @param buffer custom buffer object.
+     */
+    public synchronized void setBuffer(StringBuffer buffer) {
+        this.buffer = buffer;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public synchronized void consumeLine(String line) {
+        log.debug(line);
+        buffer.append(line + "\n");
+    }
+}
--- a/buildframework/helium/external/helium-antlib/core/tests/bld.sh	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/bld.sh	Wed Dec 23 19:29:07 2009 +0200
@@ -19,5 +19,5 @@
 
 
 module load java/1.6.0
-setenv ANT_ARGS "-lib ../../antlibs -lib ../../bin/helium-core.jar -lib ../../lib" 
+setenv ANT_ARGS "-lib ../../antlibs -lib ../lib -lib ../../lib -lib ../../bin/helium-core.jar " 
 ant -Dant.executor.class="com.nokia.helium.core.ant.HeliumExecutor" $*
--- a/buildframework/helium/external/helium-antlib/core/tests/build.bat	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/build.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -21,6 +21,6 @@
 set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
 ) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
 if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
-set ANT_ARGS=-lib %CD%\lib -lib %CD%\..\..\lib -lib %CD%\..\..\antlibs -lib %CD%\..\..\bin\helium-core.jar
+set ANT_ARGS=-lib %CD%\..\lib -lib %CD%\..\..\lib -lib %CD%\..\..\antlibs -lib %CD%\..\..\bin\helium-core.jar
 ant -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor %*
 endlocal
\ No newline at end of file
--- a/buildframework/helium/external/helium-antlib/core/tests/build.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -22,13 +22,13 @@
 -->
 <project name="helium-antlib-unittest" xmlns:au="antlib:org.apache.ant.antunit">
     <description>Helium antlib core tests.</description>
+
+    <import file="../../test-macros.ant.xml" />
+    
     <target name="unittest" depends="unittest-core" />
 
     <target name="unittest-core">
-        <au:antunit>
-            <fileset dir="." includes="**/test_*.ant.xml" />
-            <au:plainlistener />
-        </au:antunit>
+        <antunitModule name="core" />
     </target>
 
 </project>
--- a/buildframework/helium/external/helium-antlib/core/tests/core/executor/test_executor.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/core/executor/test_executor.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -23,24 +23,59 @@
 <project name="test-executor" xmlns:au="antlib:org.apache.ant.antunit">
     <description>Helium antlib core executor tests.</description>
 
+    <target name="final-target-1">
+        <echo message="about to call final target" />
+        <fail message="test is failed for final target" />
+    </target>
+
+    <target name="test-final-target-1">
+        <property name="hlm.target.final" value="test_final_target" />
+        <au:expectfailure>
+            <antcall target="final-target-1" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-final-target-2">
+        <property name="hlm.target.final" value="test_final_target" />
+        <echo message="about to call final target" />
+    </target>
+
+    <target name="test-final-target-3" depends="test_final_target">
+        <!-- assumption is that always that the target would be running -->
+        <property name="hlm.target.final" value="test_final_target" />
+    </target>
+
+    <target name="test-final-target-4">
+        <!-- assumption is that always that the target would be running -->
+        <property name="hlm.target.final" value="non-exist-target" />
+    </target>
+
+
+    <target name="test_final_target">
+        <echo message="executing test_final_target by default at end" />
+    </target>
+    
     <target name="test-executor">
         <au:logcapturer/>
         <exec osfamily="windows" executable="cmd">
             <arg line="/C ant"/>
             <arg value="-Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor"/>
             <arg line="-lib ../../../../bin"/>
+            <arg line="-lib ../../../../lib"/>
             <arg line="-lib ../../../../antlibs"/>
             <arg line="target"/>
         </exec>    
         <exec osfamily="unix" executable="ant">
             <arg value="-Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor"/>
             <arg line="-lib ../../../../bin"/>
+            <arg line="-lib ../../../../lib"/>
             <arg line="-lib ../../../../antlibs"/>
             <arg line="target"/>
         </exec>
         <exec osfamily="unix" executable="ant">
             <arg value="-Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor"/>
             <arg line="-lib ../../../../bin"/>
+            <arg line="-lib ../../../../lib"/>
             <arg line="-lib ../../../../antlibs"/>
             <arg line="target"/>
         </exec>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/core/variableset/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : build.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-variableset">
+    <description>Helium antlib core executor test config.</description>
+
+    <target name="target">
+        <echo>Running target.</echo>
+    </target>
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/core/variableset/test_variableset.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,127 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : test_executor.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-variableset" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium antlib core variableset tests.</description>
+
+    <typedef name="arg" classname="com.nokia.helium.core.ant.types.Variable"/>
+    <typedef name="argSet" classname="com.nokia.helium.core.ant.types.VariableSet"/>
+
+    <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+    <taskdef name="getVariableValue" classname="com.nokia.helium.core.ant.taskdefs.GetValueFromVariableSet"/>
+
+    <argSet id="common.argset">
+        <arg line="-c tools_rel -c tools2_rel" />
+        <arg name="-j" value="1" />
+    </argSet>
+
+    <argSet id="common.invalid.arg1" />
+
+    <argSet id="common.invalid.arg2">
+        <arg name="-j"/>
+    </argSet>
+
+    <argSet id="common.invalid.arg3">
+        <arg line="-c tools_rel -c tools2_rel" name="test" value="test"/>
+    </argSet>
+
+    <argSet id="override.argset.thread">
+        <argSet refid="common.argset" />
+        <arg name="-j" value="10" />
+    </argSet>
+
+    <argSet id="load.order1">
+        <arg name="--engine" value="emake" />
+        <argSet refid="common.argset" />
+    </argSet>
+
+    <target name="test-var-value-test1">
+        <getVariableValue name="-j" property="test.var">
+            <argSet refid="common.argset" />
+        </getVariableValue>
+        <echo message="test.var: ${test.var}" />
+        <au:assertTrue>
+            <equals arg1="${test.var}" arg2="1"/>
+        </au:assertTrue>
+    </target>
+
+    <target name="test-var-invalid-ref">
+        <au:expectfailure>
+            <getVariableValue name="-j" property="test.var">
+                <argSet refid="common.target" />
+            </getVariableValue>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-var-override-test1">
+        <getVariableValue name="-j" property="test.var">
+            <argSet refid="override.argset.thread" />
+        </getVariableValue>
+        <echo message="test.var: ${test.var}" />
+        <au:assertTrue>
+            <equals arg1="${test.var}" arg2="10"/>
+        </au:assertTrue>
+    </target>
+
+    <target name="test-var-load-order1">
+        <getVariableValue name="--engine" property="test.var">
+            <argSet refid="load.order1" />
+        </getVariableValue>
+        <echo message="test.var: ${test.var}" />
+        <au:assertTrue>
+            <equals arg1="${test.var}" arg2="emake"/>
+        </au:assertTrue>
+    </target>
+
+    <target name="test-var-invalid-name">
+        <au:expectfailure>
+            <getVariableValue name="--engine" property="test.var">
+                <argSet refid="common.argset" />
+            </getVariableValue>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-var-invalid-arg1">
+        <au:expectfailure>
+            <getVariableValue name="--engine" property="test.var">
+                <argSet refid="common.invalid.arg1" />
+            </getVariableValue>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-var-invalid-arg2">
+        <au:expectfailure>
+            <getVariableValue name="--engine" property="test.var">
+                <argSet refid="common.invalid.arg2" />
+            </getVariableValue>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-var-invalid-arg3">
+        <au:expectfailure>
+            <getVariableValue name="--engine" property="test.var">
+                <argSet refid="common.invalid.arg3" />
+            </getVariableValue>
+        </au:expectfailure>
+    </target>
+
+</project>
\ No newline at end of file
Binary file buildframework/helium/external/helium-antlib/core/tests/lib/ant-antunit-1.0.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/src/com/nokia/helium/core/plexus/tests/TestAntStreamConsumer.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,110 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.core.plexus.tests;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.Echo;
+import org.junit.Test;
+import static org.junit.Assert.*;
+import com.nokia.helium.core.plexus.AntStreamConsumer;
+
+public class TestAntStreamConsumer {
+
+    public class AntBuildListener implements BuildListener {
+        private StringBuffer log = new StringBuffer();
+        
+        public StringBuffer getLog() {
+            return log;
+        }
+
+        @Override
+        public void buildFinished(BuildEvent arg0) {
+        }
+
+        @Override
+        public void buildStarted(BuildEvent arg0) {
+        }
+
+        @Override
+        public void messageLogged(BuildEvent arg0) {
+            log.append(arg0.getMessage());
+        }
+
+        @Override
+        public void targetFinished(BuildEvent arg0) {
+        }
+
+        @Override
+        public void targetStarted(BuildEvent arg0) {
+        }
+
+        @Override
+        public void taskFinished(BuildEvent arg0) {
+        }
+
+        @Override
+        public void taskStarted(BuildEvent arg0) {
+        }
+        
+    }
+    
+    @Test
+    public void testLoggingThroughAnt() {
+        // Setting up an Ant task
+        Project project = new Project();
+        AntBuildListener listener = new AntBuildListener();
+        project.addBuildListener(listener);
+        project.init();
+        Echo echo = new Echo();
+        echo.setProject(project);
+        echo.setMessage("From the echo task");
+        
+        
+        // Configuring the Ant consumer
+        AntStreamConsumer consumer = new AntStreamConsumer(echo);
+        consumer.consumeLine("consumed line!");
+        echo.execute();
+        assertTrue(listener.getLog().toString().contains("From the echo task"));
+        assertTrue(listener.getLog().toString().contains("consumed line!"));
+        
+    }
+
+    @Test
+    public void testLoggingThroughAntAsError() {
+        // Setting up an Ant task
+        Project project = new Project();
+        AntBuildListener listener = new AntBuildListener();
+        project.addBuildListener(listener);
+        project.init();
+        Echo echo = new Echo();
+        echo.setProject(project);
+        echo.setMessage("From the echo task");
+        
+        
+        // Configuring the Ant consumer
+        AntStreamConsumer consumer = new AntStreamConsumer(echo, Project.MSG_ERR);
+        consumer.consumeLine("consumed line!");
+        echo.execute();
+        assertTrue(listener.getLog().toString().contains("From the echo task"));
+        assertTrue(listener.getLog().toString().contains("consumed line!"));
+        
+    }
+    
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/src/com/nokia/helium/core/plexus/tests/TestCommandBase.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,121 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.core.plexus.tests;
+
+import hidden.org.codehaus.plexus.interpolation.os.Os;
+
+import java.util.Hashtable;
+
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+import com.nokia.helium.core.plexus.CommandBase;
+import com.nokia.helium.core.plexus.StreamRecorder;
+
+/**
+ * Unittests for the CommandBase class. 
+ *
+ */
+public class TestCommandBase {
+
+    /**
+     * The simplest possible implementation possible.
+     *
+     */
+    public class CommandImpl extends CommandBase<Exception> {
+
+        @Override
+        protected String getExecutable() {
+            return "echo";
+        }
+
+        @Override
+        protected void throwException(String message, Throwable t)
+                throws Exception {
+            throw new Exception(message, t);
+        }
+        
+    }
+    
+    @Test
+    public void simpleExecution() {
+        CommandImpl cmd = new CommandImpl();
+        try {
+            cmd.execute(null);
+        } catch (Exception e) {
+            fail("Exception should not happen.");
+        }
+
+    }
+
+    @Test
+    public void simpleExecutionWithArgs() {
+        CommandImpl cmd = new CommandImpl();
+        String args[] = new String[2];
+        args[0] = "foo";
+        args[1] = "bar";
+        try {
+            cmd.execute(args);
+        } catch (Exception e) {
+            fail("Exception should not happen.");
+        }
+    }
+    
+    @Test
+    public void simpleExecutionWithArgsAndRecorder() throws Exception {
+        CommandImpl cmd = new CommandImpl();
+        String args[] = new String[2];
+        args[0] = "foo";
+        args[1] = "bar";
+        StreamRecorder rec = new StreamRecorder();
+        cmd.execute(args, rec);
+        assertTrue(rec.getBuffer().toString().startsWith("foo bar"));
+    }
+
+    @Test
+    public void simpleExecutionWithArgsAndRecorderAsOutputHandler() throws Exception {
+        CommandImpl cmd = new CommandImpl();
+        StreamRecorder rec = new StreamRecorder();
+        cmd.addOutputLineHandler(rec);
+        String args[] = new String[2];
+        args[0] = "foo";
+        args[1] = "bar";
+        cmd.execute(args, rec);
+        assertTrue(rec.getBuffer().toString().startsWith("foo bar"));
+    }
+
+    @Test
+    public void simpleExecutionWithEnv() throws Exception {
+        CommandImpl cmd = new CommandImpl();
+        StreamRecorder rec = new StreamRecorder();
+        cmd.addOutputLineHandler(rec);
+        String args[] = new String[2];
+        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
+            args[0] = "%TEST_FOO%";
+            args[1] = "%TEST_BAR%";
+        } else {
+            args[0] = "$TEST_FOO";
+            args[1] = "$TEST_BAR";
+        }
+        Hashtable<String, String> env = new Hashtable<String, String>();
+        env.put("TEST_FOO", "foo");
+        env.put("TEST_BAR", "bar");
+        cmd.execute(args, env, rec);
+        assertTrue(rec.getBuffer().toString().startsWith("foo bar"));
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/src/com/nokia/helium/core/plexus/tests/TestFileStreamConsumer.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.core.plexus.tests;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.junit.Test;
+import static org.junit.Assert.*;
+import com.nokia.helium.core.plexus.FileStreamConsumer;
+
+public class TestFileStreamConsumer {
+    
+    @Test
+    public void testContentGoesToFile() throws FileNotFoundException, IOException {
+        // Setting up an Ant task
+        File temp = File.createTempFile("temp_",".log");
+        temp.deleteOnExit();
+        FileStreamConsumer consumer = new FileStreamConsumer(temp);
+        consumer.consumeLine("Hello World!");
+        consumer.consumeLine("Bonjour monde!");
+        consumer.close();
+        assertTrue(temp.length() == 28);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/src/com/nokia/helium/core/plexus/tests/TestStreamMultiplexer.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.core.plexus.tests;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import com.nokia.helium.core.plexus.StreamMultiplexer;
+import com.nokia.helium.core.plexus.StreamRecorder;
+
+/**
+ * Testing the StreamMultiplexer class.
+ *
+ */
+public class TestStreamMultiplexer {
+
+    /**
+     * Having an empty list of handler should not cause any problem.
+     */
+    @Test
+    public void noHandler() {
+        StreamMultiplexer mux = new StreamMultiplexer();
+        mux.consumeLine("1st line");
+        mux.consumeLine("2nd line");
+    }
+    
+    /**
+     * The two recorders should record the same stuff.
+     */
+    @Test
+    public void recordSomeLines() {
+        StreamMultiplexer mux = new StreamMultiplexer();
+        StreamRecorder rec = new StreamRecorder();
+        StreamRecorder rec2 = new StreamRecorder();
+        mux.addHandler(rec);
+        mux.addHandler(rec2);
+        mux.consumeLine("1st line");
+        mux.consumeLine("2nd line");
+        assertTrue(rec.getBuffer().toString().equals("1st line\n2nd line\n"));
+        assertTrue(rec2.getBuffer().toString().equals("1st line\n2nd line\n"));
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/core/tests/src/com/nokia/helium/core/plexus/tests/TestStreamRecorder.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,56 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.core.plexus.tests;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import com.nokia.helium.core.plexus.StreamRecorder;
+
+/**
+ * Unittests for the TestStreamRecorder class. 
+ *
+ */
+public class TestStreamRecorder {
+
+    @Test
+    public void recordSomeLines() {
+        StreamRecorder rec = new StreamRecorder();
+        rec.consumeLine("1st line");
+        rec.consumeLine("2nd line");
+        assertTrue(rec.getBuffer().toString().equals("1st line\n2nd line\n"));
+    }
+
+    @Test
+    public void recordSomeLinesWithOwnBuffer() {
+        StringBuffer buffer = new StringBuffer();
+        StreamRecorder rec = new StreamRecorder(buffer);
+        assertTrue(rec.getBuffer() == buffer);
+        rec.consumeLine("1st line");
+        rec.consumeLine("2nd line");
+        assertTrue(rec.getBuffer().toString().equals("1st line\n2nd line\n"));
+    }
+
+    @Test
+    public void setGetBuffer() {
+        StringBuffer buffer = new StringBuffer();
+        StreamRecorder rec = new StreamRecorder();
+        assertTrue(rec.getBuffer() != buffer);
+        rec.setBuffer(buffer);
+    }
+}
Binary file buildframework/helium/external/helium-antlib/diamonds/lib/dom4j-1.6.1.jar has changed
--- a/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsClient.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsClient.java	Wed Dec 23 19:29:07 2009 +0200
@@ -71,10 +71,8 @@
         try {
             result = httpClient.executeMethod(postMethod);
         } catch (IOException e) {
-            log.info("IOException while sending http request");
-            log.debug("IOException while sending http request: ", e);
             isRecordOnly = true;
-            throw new DiamondsException("Exception in executeMethod");
+            throw new DiamondsException("IOException while sending http request." + e.getMessage());
             // e.printStackTrace();
         }
         return result;
@@ -89,8 +87,7 @@
         } catch (Exception ex) {
             // ex.printStackTrace();
             isRecordOnly = true;
-            log.info("Failed to check url, defaulting to input.");
-            throw new DiamondsException("Exception verifying URL");
+            throw new DiamondsException("Failed to check url, defaulting to input. " + ex.getMessage());
         }
         return retURL;
     }
@@ -175,23 +172,19 @@
                     log.debug("diamondsBuildID: " + diamondsBuildID);
                 } else {
                     isRecordOnly = true;
-                    log.debug("Connection Failed.");
-                    log
-                            .info("Diamonds data not sent, because of connection failure.");
+                    log.error("Diamonds data not sent, because of connection failure.");
                     //throw new DiamondsException("Connection Failed");
                 }
             }
         } catch (HttpException ex) {
             isRecordOnly = true;
-            log.debug("Connection Failed", ex);
-            log.info("Diamonds data not sent, because of httpexception.");
+            log.error("Diamonds data not sent, because of httpexception.", ex);
             // log.error("Failed: " + ex.toString());
             //throw new DiamondsException("Http Exception see the logs: "
             //        + ex.getMessage());
         } catch (IOException ex1) {
             isRecordOnly = true;
-            log.debug("Connection Failed. ", ex1);
-            log.info("Diamonds data not sent, because of io exception.");
+            log.error("Diamonds data not sent, because of io exception.", ex1);
             // log.error("Failed: " + ex.toString());
             //throw new DiamondsException("Network error, see the logs: "
             //        + ex1.getMessage());
@@ -215,8 +208,7 @@
                 result = processPostMethodResult(httpClient
                         .executeMethod(postMethod));
             } catch (Exception e) {
-                log.debug("DiamondsClient:sendData by Http: ", e);
-                log.info("The final data via http not sent because errors: ", e);
+                log.error("sendData:The final data via http not sent because errors: ", e);
             }
         }
         return result;
@@ -233,8 +225,7 @@
                     "[DIAMONDS_DATA]", null);
             log.debug("DiamondsClient:sendDataByEmail:succeeds");
         } catch (Exception e) {
-            log.debug("DiamondsClient:sendDataByEmail: ", e);
-            log.info("The final data via http not sent because errors: ", e);
+            log.error("sendDataByMail:The final data via http not sent because errors: ", e);
             return -1;
         }
         return 0;
--- a/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsConfig.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsConfig.java	Wed Dec 23 19:29:07 2009 +0200
@@ -65,11 +65,11 @@
         SAXReader saxReader = new SAXReader();
         Document document = null;
         try {
-            log.debug("diamonds:DiamondsConfig:reading configuration");
+            log.debug("Reading diamonds configuration.");
             document = saxReader.read(configFile);
         } catch (Exception e) {
-            log.debug("diamonds:DiamondsConfig:", e);
-            throw new DiamondsException("Diamonds configuration parsing error: "
+            // No need to fail the build due to internal Helium configuration errors.
+            log.debug("Diamonds configuration parsing error: "
                     + e.getMessage());
         }
         parseConfig(document);
--- a/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsExceptionStatusUpdate.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsExceptionStatusUpdate.java	Wed Dec 23 19:29:07 2009 +0200
@@ -91,7 +91,7 @@
             if (SignalStatusList.getDeferredSignalList().hasSignalInList()) {
                 Vector<SignalStatus> signalList = SignalStatusList.getDeferredSignalList().getSignalStatusList();
                 timeFormat = new SimpleDateFormat(DiamondsConfig.getDiamondsProperties().getProperty("tstampformat"));
-                log.debug("[DiamondsExceptionStatusUpdate] => Build Status = " + buildStatus);
+                log.debug("Build Status = " + buildStatus);
                 int i = 0;
                 for (SignalStatus status : signalList) {
                     signalInformation.put("diamond.signal.name." + i, status.getName());
@@ -108,12 +108,12 @@
                 templateProcessor.convertTemplate(templateDir, templateFile, outputFile,sourceList);
 
                 /* send the generated XML file for diamonds client to update the signals information into Diamonds */
-                log.debug("[DiamondsExceptionStatusUpdate] => sending data to diamonds ..." + outputFile);
+                log.debug("sending data to diamonds ..." + outputFile);
                 diamondsClient.sendData(outputFile, DiamondsConfig.getDiamondsProperties().getDiamondsBuildID());
                 try {
                     DiamondsListenerImpl.mergeToFullResults(new File(outputFile));
                 } catch (DiamondsException de) {
-                    log.debug("[DiamondsExceptionStatusUpdate] => " + de.getMessage());
+                    log.error("Not able to merge into full results XML file " + de.getMessage(), de);
                 }
             }
             /* Check, is the signal is in now signal list?
@@ -124,7 +124,7 @@
                 Vector<SignalStatus> signalList = SignalStatusList.getNowSignalList().getSignalStatusList();
                 buildStatus = "failed";
                 timeFormat = new SimpleDateFormat(DiamondsConfig.getDiamondsProperties().getProperty("tstampformat"));
-                log.debug("[DiamondsExceptionStatusUpdate] => Build Status = " + buildStatus);
+                log.debug("Build Status = " + buildStatus);
                 int i = 0;
                 for (SignalStatus status : signalList) {
                     signalInformation.put("diamond.signal.name." + i, status.getName());
@@ -141,12 +141,12 @@
                 templateProcessor.convertTemplate(templateDir, templateFile, outputFile,sourceList);
 
                 /* send the generated XML file for diamonds client to update the signals information into Diamonds */
-                log.debug("[DiamondsExceptionStatusUpdate] => sending data to diamonds ..." + outputFile);
+                log.debug("sending data to diamonds ..." + outputFile);
                 diamondsClient.sendData(outputFile, DiamondsConfig.getDiamondsProperties().getDiamondsBuildID());
                 try {
                     DiamondsListenerImpl.mergeToFullResults(new File(outputFile));
                 } catch (DiamondsException de) {
-                    log.debug("[DiamondsExceptionStatusUpdate] => " + de.getMessage());
+                    log.error("Not able to merge into full results XML file " + de.getMessage(), de);
                 }
             }
             /* Generate the build status XML file required for diamonds to update the build status information,
@@ -165,7 +165,7 @@
             try {
                 DiamondsListenerImpl.mergeToFullResults(new File(outputFile));
             } catch (DiamondsException de) {
-                log.debug("[DiamondsExceptionStatusUpdate] => " + de.getMessage());
+                log.error("Not able to merge into full results XML file " + de.getMessage(), de);
             }
         }
 
--- a/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsListenerImpl.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsListenerImpl.java	Wed Dec 23 19:29:07 2009 +0200
@@ -106,7 +106,6 @@
                         .getTemplateDir(), finishTemplateFile, output,
                         sourceList);
             } catch (Exception e) {
-                log.debug("diamonds:DiamondsListenerImpl:exception: ", e);
                 throw new DiamondsException(
                         "failed to convert the build finish template: "
                                 + e.getMessage());
@@ -118,7 +117,6 @@
                 diamondsClient.sendData(output, DiamondsConfig
                         .getDiamondsProperties().getDiamondsBuildID());
             } catch (Exception e) {
-                log.debug("diamonds:DiamondsListenerImpl: exception: ", e);
                 throw new DiamondsException("Failed to send data to diamonds: "
                         + e.getMessage());
             }
@@ -149,7 +147,7 @@
                         fullResultsFile.getAbsolutePath(), smtpServer,
                         ldapServer);
             } catch (Exception e) {
-                log.debug("Error sending diamonds final log: ", e);
+                log.error("Error sending diamonds final log: ", e);
             }
         }
     }
@@ -278,7 +276,6 @@
                 }
                 isInitialized = true;
             } catch (Exception e) {
-                log.debug("diamonds:DiamondsListenerImpl: ", e);
                 throw new DiamondsException("failed to connect to diamonds: "
                         + e.getMessage());
             }
--- a/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsPostBuildStatusUpdate.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsPostBuildStatusUpdate.java	Wed Dec 23 19:29:07 2009 +0200
@@ -92,7 +92,7 @@
             try {
                 DiamondsListenerImpl.mergeToFullResults(new File(outputFile));
             } catch (DiamondsException de) {
-                log.debug("[DiamondsExceptionStatusUpdate] => " + de.getMessage());
+                log.error("Not able to merge into full results XML file " + de.getMessage(), de);
             }
         }
     }
--- a/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/StageDiamondsListener.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/StageDiamondsListener.java	Wed Dec 23 19:29:07 2009 +0200
@@ -80,6 +80,7 @@
             initStageTargetsMap();
             isTargetMapInitialized = true;
         }
+        log.debug("targetBegin targetName: " + targetName + " - currentStartTargetName:" + currentStartTargetName);
         if (currentStartTargetName == null) {
             findAndSetStartTimeForTargetInStageList(targetName);
         }
@@ -158,10 +159,8 @@
                     getDiamondsClient().sendData(output, DiamondsConfig
                             .getDiamondsProperties().getDiamondsBuildID());
                 } catch (com.nokia.helium.core.TemplateProcessorException e1) {
-                    log.debug("diamonds:StageDiamondsListener:exception: ", e1);
-                    throw new DiamondsException(
-                            "template conversion error while sending data for stage: "
-                                    + stageName + " : " + e1.getMessage());
+                    throw new DiamondsException("template conversion error while sending data for stage: "
+                            + stageName + " : " + e1.getMessage());
                 }
             }
         }
@@ -199,11 +198,13 @@
                 log.debug("Diamonds target missing: ", be);
             }
             if (arrayList != null) {
+                log.debug(" + Stage definition: " + stage.getStageName());
                 Enumeration<Target> targetEnum = arrayList.elements();
                 while (targetEnum.hasMoreElements()) {
                     // fast lookup
                     Target target = targetEnum.nextElement();
                     stageMap.put(target.getName(), INVALID_DATE);
+                    log.debug("   - Start target: " + target.getName());
                 }
                 stageTargetBeginList.add(stageMap);
 
@@ -211,6 +212,7 @@
                 String endTargetName = stage.getEndTargetName();
                 // fast lookup
                 stageTargetEndMap.put(endTargetName, stage);
+                log.debug("   - End target: " + endTargetName);
             }
         }
     }
--- a/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/TargetDiamondsListener.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/TargetDiamondsListener.java	Wed Dec 23 19:29:07 2009 +0200
@@ -166,17 +166,13 @@
                 }
             } else {
                 log
-                        .debug("diamonds:TargetDiamondsListener:sendTargetData: exists("
+                        .debug("sendTargetData: exists("
                                 + templateFile.getAbsolutePath() + ") => false");
 
             }
         } catch (com.nokia.helium.core.TemplateProcessorException e1) {
-            log.debug(
-                    "diamonds:TargetDiamondsListener:sendTargetData:exception",
-                    e1);
-            throw new DiamondsException(
-                    "template conversion error while sending data for target:"
-                            + target + ":" + e1.getMessage());
+            throw new DiamondsException("template conversion error while sending data for target:"
+                    + target + ":" + e1.getMessage());
         }
         File outputFile = new File(output);
         if (outputFile.exists()) {
--- a/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/XMLMerger.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/XMLMerger.java	Wed Dec 23 19:29:07 2009 +0200
@@ -84,7 +84,6 @@
             mergeNode(root, dataRoot);
             write();
         } catch (DocumentException e) {
-            log.debug("Error merging: " + e);
             throw new XMLMergerException(e.getMessage());
         }
     }
--- a/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/ant/HeliumListener.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/ant/HeliumListener.java	Wed Dec 23 19:29:07 2009 +0200
@@ -121,8 +121,7 @@
             if (errorMessage == null) {
                 errorMessage = "";
             }
-            log
-                    .info("Diamonds Error, might not be logged properly, see debug log. "
+            log.error("Diamonds Error, might not be logged properly, see debug log. "
                             + errorMessage);
         }
         if (diamondsListeners != null) {
@@ -135,8 +134,7 @@
                     if (errorMessage == null) {
                         errorMessage = "";
                     }
-                    log
-                            .info("Diamonds Error, might not be logged properly, see debug log. "
+                    log.error("Diamonds Error, might not be logged properly, see debug log. "
                                     + errorMessage);
                 }
             }
@@ -158,7 +156,6 @@
             templateProcessor.convertTemplate(configFile,
                     outputFile.toString(), sourceList);
         } catch (Exception e) {
-            log.debug("Error: ", e);
             throw new BuildException(
                     "Diamonds configuration pre-parsing error: "
                             + e.getMessage());
@@ -166,7 +163,6 @@
         try {
             DiamondsConfig.parseConfiguration(outputFile.toString());
         } catch (Exception e) {
-            log.debug("Error: ", e);
             throw new BuildException("Diamonds configuration parsing error: "
                     + e.getMessage());
         }
@@ -199,8 +195,7 @@
                     if (errorMessage == null) {
                         errorMessage = "";
                     }
-                    log
-                            .info("Diamonds Error, might not be logged properly, see debug log. "
+                    log.error("Diamonds Error, might not be logged properly, see debug log. "
                                     + errorMessage);
                 }
 
@@ -217,8 +212,7 @@
                 try {
                     diamondsListener.buildEnd(event);
                 } catch (Exception e) {
-                    log.debug("Error: ", e);
-                    log.info("Failed to log in diamonds: " + e);
+                    log.error("Failed to log in diamonds: " + e);
                 }
 
             }
--- a/buildframework/helium/external/helium-antlib/diamonds/tests/src/com/nokia/helium/diamonds/tests/TestXMLMerger.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/diamonds/tests/src/com/nokia/helium/diamonds/tests/TestXMLMerger.java	Wed Dec 23 19:29:07 2009 +0200
@@ -25,6 +25,7 @@
 import java.io.BufferedReader;
 import java.io.IOException;
 import com.nokia.helium.diamonds.XMLMerger;
+import com.nokia.helium.diamonds.XMLMerger.XMLMergerException;
 
 import org.junit.*;
 import static org.junit.Assert.*;
@@ -142,6 +143,35 @@
     }
 
     /**
+     * Test the XMLMerger with xml file with no Root node.
+     */
+    @Test(expected=XMLMergerException.class)
+    public void test_mergeWithNoRootNode() throws Exception{
+		File merge = createTextFile("<?xml version=\"1.0\"?>\n");
+		XMLMerger merger = new XMLMerger(merge);
+	}
+    /**
+     * Test the XMLMerger with xml files with different root nodes to merge.
+     */
+    @Test(expected=XMLMergerException.class)
+    public void test_mergeWithDifferentRootNodes() throws Exception{
+		File merge = createTextFile("<?xml version=\"1.0\"?>\n<root/>");
+		File toBeMerged = createTextFile("<?xml version=\"1.0\"?>\n<root1/>\n");
+		XMLMerger merger = new XMLMerger(merge);
+		merger.merge(toBeMerged);
+	}
+    /**
+     * Test the XMLMerger with xml files with Wrong xml format
+     */
+    @Test(expected=XMLMergerException.class)
+    public void test_mergeWithWrongXML() throws Exception{
+        	File merge = createTextFile("<?xml version=\"1.0\"?>\n<root/>");
+        	File toBeMerged = createTextFile("<?xml version=\"1.0\"?>\n<root/><test/>\n");
+        	XMLMerger merger = new XMLMerger(merge);
+        	merger.merge(toBeMerged);
+	}
+
+    /**
      * Load file content into a string. 
      * @param fullPathFilename
      * @return the file content as a string
@@ -188,4 +218,4 @@
         }
         
     }
-}
\ No newline at end of file
+}
--- a/buildframework/helium/external/helium-antlib/doc/src/build.rst	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/src/build.rst	Wed Dec 23 19:29:07 2009 +0200
@@ -76,6 +76,11 @@
         [echo] Cleaning helium-signaling
       [delete] Deleting directory C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\signaling\classes
       [delete] Deleting: C:\development\workspace\helium-antlib-dragonfly-trunk\sf\bin\helium-signaling.jar
+      
+   clean:
+        [echo] Cleaning helium-logging
+      [delete] Deleting directory C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\logging\classes
+      [delete] Deleting: C:\development\workspace\helium-antlib-dragonfly-trunk\sf\bin\helium-logging.jar
    
    BUILD SUCCESSFUL
    Total time: 1 second
--- a/buildframework/helium/external/helium-antlib/doc/src/structure.rst	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/doc/src/structure.rst	Wed Dec 23 19:29:07 2009 +0200
@@ -125,9 +125,29 @@
 Logging
 -------
 
-Developer must use standard Ant logging for any user log output.
+Developer must preferably use standard Ant logging for any user log output.
 Internal debug logging must be implemented using Log4J framework.
 
+ * ANT Listeners must use log4j logging framework - using Ant logging system might cause some looping issues.
+ * Ant Type and Task must use the Ant logging mechanism to report to the user.
+ * Generic framework (part of the code which doesn't links to Ant directly) must use Log4J. 
+ * Usage of System.out.println should be avoided.
+ * All the non-handled exceptions should be considered as errors and should be reported as such:
+    * use log("message", Project.MSG_ERR) under Ant
+    * log.error() otherwise.
+    * Exception to this rule must be clearly commented under the code.
+ * Debug information:
+    * Log4J framework (log.debug()) must be used to push information to the Helium debug log - so debug information are not
+      directly visible by the user.
+    * Ant logging framework can also be use to log Type/Task debug info (but log4j is preferred).
+    * PrintStackTrace method should be used on below scenario's:
+       * At the time of unknown exception.
+       * Should be used with exceptions other than BuildException.
+       * In case it is difficult to debug the issue with Exception.getMessage().
+       * use this method during debugging complex issue (this doesn't mean the line should remain in the code after development).
+       * When it is required to print the all the information about the occurring Exception. 
+
+
 This is an example on how to use logging:
 ::
    
@@ -144,3 +164,17 @@
 
 
 Please find more information on Log4J from the online manual: http://logging.apache.org/log4j/1.2/manual.html.
+
+
+Exception
+---------
+
+Exceptional event reporting and handling is crutial in software development. Developer must make sure it is done accordingly
+to the framework it is currently using:
+
+ * To report a build failure under Ant the BuildException must be used.
+    But we have to keep in mind that a BuildException is not tracked because it derives from the RuntimeError type.
+    So we have to be careful with those and try to limit their puprose to the original usage: Ant build failure.
+ * It is preferable to have meaningful exception type like: FileNotFoundException.
+ * Developer should try to avoid as much as possible the throw or catch raw type of exception like Exception, RuntimeError.  
+   
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/bld.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,60 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+
+REM Configure Ant 
+if not defined TESTED_ANT_HOME (
+set TESTED_ANT_HOME=C:\Apps\ant_1.7
+) 
+if exist %TESTED_ANT_HOME% (set ANT_HOME=%TESTED_ANT_HOME%)
+
+REM Configure the expected Ant Version details below
+SET expMajorVer=1
+SET expMinorVer=7
+
+rem *** Verify Ant Version ***
+rem -- Run the 'ant -version' command and capture the output to a variable 
+for /f "tokens=*" %%a in ('ant -version') do (set antversion=%%a)
+echo *** Installed Version : %antversion%
+
+rem -- Parse the version string obtained above and get the version number
+for /f "tokens=4 delims= " %%a in ("%antversion%") do set val=%%a
+rem -- Parse the version number delimiting the '.' and set the major and
+rem    minor versions
+for /f "tokens=1-2 delims=." %%a in ("%val%") do (
+set /A majorVersion=%%a
+set /A minorVersion=%%b
+)
+rem -- Check whether major version is greater than or equal to the expected.
+if %majorVersion% geq %expMajorVer% ( 
+rem -- if major version is valid, check minor version. If minor version is less
+rem    than expected display message and abort the execution.
+if %minorVersion% lss %expMinorVer% (echo *** Incorrect version of Ant found. Please check you have atleast Ant 1.7.0 & goto :errorstop ) 
+)
+
+ant %*
+endlocal
+
+:errorstop
+@echo *** Build aborted with error
+exit /b 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-imaker">
+    <description>Helium Antlib iMaker build file.</description>
+    
+    <import file="../macros.ant.xml"/>
+    
+    <property name="name" value="imaker"/>
+    
+    <path id="helium.imaker.classpath">
+        <fileset dir="${ant.file.helium-imaker}/../lib" includes="*.jar"/>
+        <fileset dir="${ant.file.helium-imaker}/../../bin" includes="helium-core.jar"/>
+    </path>
+
+</project>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/demo/build.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,27 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set ANT_ARGS=-lib %CD%\..\lib -lib %CD%\..\..\lib -lib  %CD%\..\..\bin\helium-core.jar -lib  %CD%\..\..\bin\helium-imaker.jar -lib %CD%\..\..\antlibs
+ant %*
+endlocal
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/demo/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-imaker-demo" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib imaker demo.</description>
+
+    <taskdef resource="com/nokia/helium/imaker/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+
+    <property name="epocroot" location="K:/" />
+    <property name="product" value="?product??" />
+    
+    <hlm:emakeEngine id="imaker.ec">
+        <arg value="--emake-annofile=${epocroot}/imaker.anno.xml"/>
+        <arg value="--emake-autodepend=1"/>
+        <arg value="--emake-annodetail=basic,history,file,waiting"/>                            
+    </hlm:emakeEngine>
+    <hlm:defaultEngine id="imaker.default"/>
+    
+    <property name="imaker.engine" value="default" />
+    
+    <target name="demo-imaker">
+        <hlm:imaker epocroot="${epocroot}" output="${epocroot}/imaker.log" verbose="true" engineRefid="imaker.${imaker.engine}">
+            <hlm:imakerconfigurationset>
+                <hlm:imakerconfiguration>
+                    <makefileset>
+                        <include name="**/${product}/*ui.mk" />
+                    </makefileset>
+                    <targetset>
+                        <include name="core" />
+                        <include name="langpack_01" />
+                    </targetset>
+                    <variableset>
+                        <variable name="USE_FOTI" value="1" />
+                        <variable name="USE_FOTA" value="1" />
+                    </variableset>
+                    <variablegroup>
+                        <variable name="TYPE" value="rnd" />
+                    </variablegroup>
+                    <variablegroup>
+                        <variable name="TYPE" value="subcon" />
+                    </variablegroup>
+                </hlm:imakerconfiguration>
+            </hlm:imakerconfigurationset>
+        </hlm:imaker>
+    </target>
+    
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/HelpConfigStreamConsumer.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,65 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+/**
+ * This class implements the help-config output parser for iMaker. 
+ * The list of configuration will be stored into an internal list 
+ * object. 
+ * 
+ */
+public class HelpConfigStreamConsumer implements StreamConsumer {
+    private List<String> configurations = new ArrayList<String>();
+    
+    /**
+     * {@inheritDoc}
+     * Only list starting with '/' and ending with '.mk' will be considered.
+     */
+    @Override
+    public void consumeLine(String line) {
+        line = line.trim();
+        if (line.startsWith("/") && line.endsWith(".mk")) {
+            configurations.add(line);
+        }
+    }
+    
+    /**
+     * Get the list of configurations as File objects.
+     * @return
+     */
+    public List<File> getConfigurations(File epocroot) {
+        List<File> confs = new ArrayList<File>();
+        for (String config : configurations) {
+            confs.add(new File(epocroot, config));
+        }
+        return confs; 
+    }
+    
+    /**
+     * Get the list of configuration as strings.
+     * @return the list of configurations
+     */
+    public List<String> getConfigurations() {
+        return configurations;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/HelpTargetListStreamConsumer.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,52 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+/**
+ *  Helper class to parse the output form help-target-*-list. 
+ *
+ */
+public class HelpTargetListStreamConsumer implements StreamConsumer {
+
+    private List<String> targets = new ArrayList<String>();
+    
+    /**
+     * {@inheritDoc}
+     * iMaker targets should match the following patterns to be selected: [A-za-z0-9\\-_%]+.
+     */
+    @Override
+    public void consumeLine(String line) {
+        line = line.trim();
+        if (line.matches("^[A-za-z0-9\\-_%]+$")) {
+            targets.add(line);
+        }
+    }
+
+    /**
+     * Get the list of found targets.
+     * @return the target list.
+     */
+    public List<String> getTargets() {
+        return targets;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/IMaker.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,190 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+
+import com.nokia.helium.core.plexus.CommandBase;
+import com.nokia.helium.core.plexus.StreamRecorder;
+
+import org.apache.log4j.Logger;
+
+/**
+ * This class implements a wrapper around iMaker.
+ * It helps to introspect:
+ *   <li> variables
+ *   <li> targets
+ *   <li> configurations
+ *
+ */
+public class IMaker extends CommandBase<IMakerException> {
+    private static final String TEMP_ROMBUILD_DIR = "epoc32/rombuild/temp";
+    private final Logger log = Logger.getLogger(getClass());
+    private File epocroot;
+
+    /**
+     * Create an iMaker wrapper class with a specific epocroot.
+     * @param epocroot
+     */
+    public IMaker(File epocroot) {
+        this.epocroot = epocroot;
+        
+    }
+    
+    /**
+     * Creates a temp working dir for the rom image creation.
+     * @return
+     * @throws IOException
+     */
+    public File createWorkDir() throws IMakerException {
+        try {
+            File tempRootDir = new File(getEpocroot(), TEMP_ROMBUILD_DIR);
+            tempRootDir.mkdirs();
+            File tempDir = File.createTempFile("helium-imaker", "", tempRootDir);
+            tempDir.delete();
+            tempDir.mkdirs();
+            return tempDir;
+        } catch (IOException e) {
+            throw new IMakerException(e.getMessage(), e);
+        }
+    }
+    
+    /**
+     * Epocroot location.
+     * @return the epocroot location
+     */
+    public File getEpocroot() {
+        return epocroot;
+    }
+
+    /**
+     * Get the iMaker version.
+     * @return the current iMaker version.
+     * @throws IMakerException is thrown in case of an iMaker execution error.
+     */
+    public String getVersion() throws IMakerException {
+        log.debug("getVersion");
+        String[] args = new String[1];
+        args[0] = "version";
+        StreamRecorder rec = new StreamRecorder();
+        execute(args, rec);
+        return rec.getBuffer().toString().trim();
+    }
+
+    /**
+     * Get the value of a particular variable from iMaker configuration.
+     * @param name the variable name
+     * @return the value or null if the variable does not exist.
+     * @throws IMakerException
+     */
+    public String getVariable(String name) throws IMakerException {
+        log.debug("getVariable: " + name);
+        String[] args = new String[1];
+        args[0] = "print-" + name;
+        PrintVarSteamConsumer consumer = new PrintVarSteamConsumer(name);
+        execute(args, consumer);
+        return consumer.getValue();
+    }
+
+    /**
+     * Get the value of a particular variable from iMaker configuration for a particular
+     * configuration.
+     * @param name the variable name
+     * @return the value or null if the variable does not exist.
+     * @throws IMakerException
+     */
+    public String getVariable(String name, File configuration) throws IMakerException {
+        log.debug("getVariable: " + name + " - " + configuration);
+        String[] args = new String[3];
+        args[0] = "-f";
+        args[1] = configuration.getAbsolutePath();
+        args[2] = "print-" + name;
+        PrintVarSteamConsumer consumer = new PrintVarSteamConsumer(name);
+        execute(args, consumer);
+        return consumer.getValue();
+    }
+
+    /**
+     * Get the list of available iMaker configurations.
+     * @return a list of configurations
+     * @throws IMakerException
+     */
+    public List<String> getConfigurations() throws IMakerException {
+        log.debug("getConfigurations");
+        String[] args = new String[1];
+        args[0] = "help-config";
+        HelpConfigStreamConsumer consumer = new HelpConfigStreamConsumer();
+        execute(args, consumer);
+        return consumer.getConfigurations();
+    }
+    
+    /**
+     * Get the a list of target supported by a specific configuration.  
+     * @param configuration the configuration to use
+     * @return the list of targets.
+     * @throws IMakerException
+     */
+    public List<String> getTargets(String configuration) throws IMakerException {
+        log.debug("getConfigurations");
+        String[] args = new String[3];
+        args[0] = "-f";
+        args[1] = configuration;
+        args[2] = "help-target-*-list";
+        HelpTargetListStreamConsumer consumer = new HelpTargetListStreamConsumer();
+        execute(args, consumer);
+        return consumer.getTargets();
+    }
+
+    /**
+     * Get the target list for the configuration.
+     * @param configuration a File object representing the configuration location.
+     * @return a list of targets.
+     * @throws IMakerException
+     */
+    public List<String> getTargets(File configuration) throws IMakerException {
+        return getTargets(configuration.getAbsolutePath());
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected String getExecutable() {
+        return "imaker";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File getWorkingDir() {
+        return getEpocroot();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void throwException(String message, Throwable t)
+            throws IMakerException {
+        throw new IMakerException(message, t);        
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/IMakerException.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker;
+
+/**
+ * Exception raise by the iMaker framework.
+ *
+ */
+public class IMakerException extends Exception {
+
+    private static final long serialVersionUID = -6918895304070211899L;
+
+    /**
+     * An exception with message. 
+     * @param message
+     */
+    public IMakerException(String message) {
+        super(message);
+    }
+
+    /**
+     * An exception with message and cause.
+     * @param message
+     */
+    public IMakerException(String message, Throwable t) {
+        super(message, t);
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/PrintVarSteamConsumer.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,67 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker;
+
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+/**
+ * Parsing iMaker printvar calls.
+ * Output from iMaker should match:
+ * NAME = `some content'
+ *
+ */
+public class PrintVarSteamConsumer implements StreamConsumer {
+
+    private String name;
+    private String value;
+    private boolean inParsing;
+    
+    /**
+     * Construct a PrintVarSteamConsumer for a variable named by name.
+     * @param name
+     */
+    public PrintVarSteamConsumer(String name) {
+        this.name = name;
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void consumeLine(String line) {
+        String varPrefix = name + " = `";
+        if (!inParsing && line.startsWith(varPrefix)) {
+            value = line.substring(varPrefix.length());
+            inParsing = true;
+        } else if (inParsing) {
+            value += "\n" + line;
+        }
+        if (value != null && value.endsWith("'")) {
+            value = value.substring(0, value.length() - 1);
+            inParsing = false;
+        }
+    }
+    
+    /**
+     * Get the variable value returned by iMaker.
+     * @return the variable content return by iMaker.
+     */
+    public String getValue() {
+        return value;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/Command.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,148 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker.ant;
+
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+/**
+ * Abstract a command call. The default command will be imaker.
+ * 
+ */
+public class Command {
+    // default command is iMaker
+    private String command = "imaker";
+    private List<String> args = new ArrayList<String>();
+    private Map<String, String> variables = new Hashtable<String, String>();
+    private String target = "";
+    
+    /**
+     * Get the target name.
+     * @return the target name.
+     */
+    public String getTarget() {
+        return target;
+    }
+
+    /**
+     * Set the command name
+     * @param target the command name.
+     */
+    public void setTarget(String target) {
+        this.target = target;
+    }
+
+    /**
+     * Get the command name.
+     * @return the command name.
+     */
+    public String getCommand() {
+        return command;
+    }
+
+    /**
+     * Set the command name 
+     * @param command the command name.
+     */
+    public void setCommand(String command) {
+        this.command = command;
+    }
+    
+    /**
+     * Set the list of arguments based on a list of String.
+     * @param args the arg list.
+     */
+    public void setArguments(List<String> args) {
+        this.args.clear();
+        this.args.addAll(args);
+    }
+    
+    /**
+     * Append an argument to the argument list.
+     * @param arg the argument to add.
+     */
+    public void addArgument(String arg) {
+        this.args.add(arg);
+    }
+    
+    /**
+     * Get the list of arguments.
+     * @return the list of arguments
+     */
+    public List<String> getArguments() {
+        return args;
+    }
+
+    /**
+     * Get the map of variables.
+     * @return a map representing variables for current object.
+     */
+    public Map<String, String> getVariables() {
+        return variables;
+    }
+
+    /**
+     * Set variables using vars set of variables.
+     * @param vars
+     */
+    public void setVariables(Map<String, String> vars) {
+        variables.clear();
+        variables.putAll(vars);
+    }
+
+    /**
+     * Add all the variables from vars.
+     * @param vars a set of variables
+     */
+    public void addVariables(Map<String, String> vars) {
+        variables.putAll(vars);
+    }
+
+    /**
+     * Add a variable to the command.
+     * @param name the variable name
+     * @param value the variable value
+     */
+    public void addVariable(String name, String value) {
+        variables.put(name, value);
+    }
+
+    /**
+     * Convert the current object as a command line string.
+     * The final string will be contains the data in the following
+     * order:
+     *   <li> command
+     *   <li> arguments
+     *   <li> variables
+     *   <li> target 
+     * @return
+     */
+    public String getCmdLine() {
+        String cmdLine = getCommand();
+        for (String arg : getArguments()) {
+            cmdLine += " " + arg;            
+        }
+        for (Entry<String, String> e : getVariables().entrySet()) {
+            cmdLine += " " + e.getKey() + "=" + e.getValue();            
+        }
+        cmdLine += " " + getTarget();
+        return cmdLine;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/Engine.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker.ant;
+
+import java.util.List;
+
+import com.nokia.helium.imaker.IMakerException;
+import com.nokia.helium.imaker.ant.taskdefs.IMakerTask;
+
+/**
+ * Engine interface. Methods needed by the IMaker task to
+ * build the roms. 
+ *
+ */
+public interface Engine {
+    
+    /**
+     * Set the current IMakerTask.
+     * @param task the task instance.
+     */
+    void setTask(IMakerTask task);
+
+    /**
+     * Build the Commands.
+     * The sublist will be build in a serialize way,
+     * the content of each sublist will be built in parallel.
+     * @param cmdSet
+     * @throws IMakerException
+     */
+    void build(List<List<Command>> cmdSet) throws IMakerException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/IMakerCommandSet.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker.ant;
+
+import java.util.List;
+
+import com.nokia.helium.imaker.IMaker;
+
+/**
+ * This interface describes the API a configuration object should define.   
+ *
+ */
+public interface IMakerCommandSet {
+
+    /**
+     * Returns a list of command List.
+     * The sublist will be build sequentially. Their content can be built
+     * in parallel.
+     * @return a list of Command list
+     */
+    List<List<Command>> getCommands(IMaker imaker);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/antlib.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : antlib.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<antlib>
+    <!-- Task definition -->
+    <taskdef name="imaker" classname="com.nokia.helium.imaker.ant.taskdefs.IMakerTask" />
+
+
+    <!-- Type definition - configuration -->
+    <typedef name="imakerconfiguration" classname="com.nokia.helium.imaker.ant.types.Configuration"/>
+    <typedef name="imakerconfigurationset" classname="com.nokia.helium.imaker.ant.types.ConfigurationSet"/>
+    <typedef name="product" classname="com.nokia.helium.imaker.ant.types.Product"/>
+
+    <!-- Type definition - Engine -->
+    <typedef name="defaultEngine" classname="com.nokia.helium.imaker.ant.engines.JavaEngine" />
+    <typedef name="emakeEngine" classname="com.nokia.helium.imaker.ant.engines.EmakeEngine" />
+</antlib>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/engines/Emake.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,65 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker.ant.engines;
+
+import java.io.File;
+
+import com.nokia.helium.core.plexus.CommandBase;
+import com.nokia.helium.imaker.IMakerException;
+
+/**
+ * Simple emake wrapper based on the CommandBase class.
+ *
+ */
+public class Emake extends CommandBase<IMakerException> {
+
+    private File workingDir = new File(".");
+    
+    /**
+     * @return emake.
+     */
+    @Override
+    protected String getExecutable() {
+        return "emake";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void throwException(String message, Throwable t) throws IMakerException {
+        throw new IMakerException(message, t);
+    }
+
+    /**
+     * Set the working directory where emake should be called.
+     * @param workingDir the working directory.
+     */
+    public void setWorkingDir(File workingDir) {
+        this.workingDir = workingDir;
+    }
+
+    /**
+     * Get the workingDir defined by the user.
+     * @return the working dir.
+     */
+    @Override
+    public File getWorkingDir() {
+        return workingDir;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/engines/EmakeEngine.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,250 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker.ant.engines;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.FileNotFoundException;
+import java.io.OutputStreamWriter;
+import java.io.StringWriter;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.DataType;
+
+import com.nokia.helium.core.plexus.AntStreamConsumer;
+import com.nokia.helium.core.plexus.FileStreamConsumer;
+import com.nokia.helium.imaker.IMakerException;
+import com.nokia.helium.imaker.ant.Command;
+import com.nokia.helium.imaker.ant.Engine;
+import com.nokia.helium.imaker.ant.taskdefs.IMakerTask;
+
+import freemarker.cache.ClassTemplateLoader;
+import freemarker.cache.FileTemplateLoader;
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import freemarker.template.TemplateException;
+
+/**
+ *
+ * Simplest possible definition of the type, e.g:
+ * <pre>
+ * &lt;emakeEngine id="imaker.ec" /&gt;
+ * </pre>
+ * 
+ * Emake engine with some custom configuration.
+ * <pre> 
+ * &lt;emakeEngine id="imaker.ec" &gt;
+ *     &lt;arg value="--emake-annofile=imaker.anno.xml" /&gt;
+ * &lt;/emakeEngine&gt;
+ * </pre>
+ * 
+ * @ant.type name=emakeEngine category=imaker
+ */
+public class EmakeEngine extends DataType implements Engine {
+    private Logger log = Logger.getLogger(getClass());
+    private IMakerTask task;
+    private List<Arg> customArgs = new ArrayList<Arg>(); 
+    private File template;
+    
+    /**
+     * Holder for emake custom args. 
+     */
+    public class Arg {
+        private String value;
+
+        /**
+         * Get the value of the argument.
+         * @return the argument
+         */
+        public String getValue() {
+            return value;
+        }
+
+        /**
+         * Define the additional command line parameter you want to add to emake
+         * invocation.
+         * @param value the additional command line parameter
+         * @ant.required
+         */
+        public void setValue(String value) {
+            this.value = value;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void build(List<List<Command>> cmdSet) throws IMakerException {
+        File makefile = null;
+        try {
+            // Writing the makefile.
+            makefile = writeMakefile(cmdSet);
+            
+            // Running Emake
+            runEmake(makefile);
+        } finally {
+            if (makefile != null) {
+                makefile.delete();
+            }
+        }
+    }
+
+    /**
+     * Returns the jar file name containing this class
+     * @return a File object or null if not found.
+     * @throws IMakerException
+     */
+    protected File getJarFile() throws IMakerException {
+        URL url = this.getClass().getClassLoader().getResource(this.getClass().getName().replace('.', '/') + ".class");
+        if (url.getProtocol().equals("jar") && url.getPath().contains("!/")) {
+            String fileUrl = url.getPath().split("!/")[0];
+            try {
+                return new File(new URL(fileUrl).getPath());
+            } catch (MalformedURLException e) {
+                throw new IMakerException("Error determining the jar file where "
+                        + this.getClass().getName() + " is located.", e);
+            }
+        }
+        return null;
+    }
+    /**
+     * Run emake using defined makefile.
+     * @param makefile the makefile to build
+     * @throws IMakerException
+     */
+    private void runEmake(File makefile) throws IMakerException {
+        FileStreamConsumer output = null;
+        if (task.getOutput() != null) {
+            try {
+                output = new FileStreamConsumer(task.getOutput());
+            } catch (FileNotFoundException e) {
+                throw new IMakerException("Error creating the stream recorder: " + e.getMessage(), e);
+            }
+        }
+        try {
+            Emake emake = new Emake();
+            emake.setWorkingDir(task.getEpocroot());
+            List<String> args = new ArrayList<String>();
+            for (Arg arg : customArgs) {
+                if (arg.getValue() != null) {
+                    args.add(arg.getValue());
+                }
+            }
+            args.add("-f");
+            args.add(makefile.getAbsolutePath());
+            args.add("all");
+            if (task.isVerbose()) {
+                emake.addOutputLineHandler(new AntStreamConsumer(task));
+            }
+            emake.addErrorLineHandler(new AntStreamConsumer(task, Project.MSG_ERR));
+            if (output != null) {
+                emake.addOutputLineHandler(output);
+                emake.addErrorLineHandler(output);
+            }
+            emake.execute(args.toArray(new String[args.size()]));
+        } catch (IMakerException e) {
+            throw new IMakerException("Error executing emake: " + e.getMessage(), e);
+        } finally {
+            if (output != null) {
+                output.close();
+            }
+        }
+    }
+    
+    /**
+     * Create the Makefile based on the cmdSet build sequence. 
+     * @param cmdSet
+     * @return
+     * @throws IMakerException 
+     * @throws IOException
+     */
+    private File writeMakefile(List<List<Command>> cmdSet) throws IMakerException {
+        try {
+            Configuration cfg = new Configuration();
+            Template template = null;
+            if (this.template != null) {
+                if (!this.template.exists()) {
+                    throw new IMakerException("Could not find template file: " + this.template.getAbsolutePath());
+                }
+                task.log("Loading template: " + this.template.getAbsolutePath());
+                cfg.setTemplateLoader(new FileTemplateLoader(this.template.getParentFile()));
+                template = cfg.getTemplate(this.template.getName());
+            } else {
+                cfg.setTemplateLoader(new ClassTemplateLoader(this.getClass(), ""));
+                template = cfg.getTemplate("build_imaker_roms_signing.mk.ftl");
+            }
+            File makefile = File.createTempFile("helium-imaker", ".mk", task.getEpocroot());
+            makefile.deleteOnExit();
+            StringWriter out = new StringWriter();
+            Map<String, Object> data = new Hashtable<String, Object>();
+            data.put("cmdSets", cmdSet);
+            data.put("makefile", makefile.getAbsoluteFile());
+            data.put("java_home", System.getProperty("java.home"));
+            File jar = getJarFile();
+            if (jar != null) {
+                task.log("Using " + jar + " as the utility container, make sure the file is available under an emake root.");
+                data.put("java_utils_classpath", jar.getAbsolutePath());
+            }
+            template.process(data, out);
+            log.debug(out.getBuffer().toString());
+        
+            OutputStreamWriter output = new OutputStreamWriter(new FileOutputStream(makefile));
+            output.append(out.getBuffer().toString());
+            output.close();
+            return makefile;
+        } catch (IOException e) {
+           throw new IMakerException("Error generating the makefile: " + e.getMessage(), e);
+        } catch (TemplateException e) {
+            throw new IMakerException("Error while rendering the makefile template: " + e.getMessage(), e);
+        }
+    }
+    
+    /**
+     * Add custom parameters for the emake invocation.
+     * @return a new Arg object.
+     */
+    public Arg createArg() {
+        Arg arg = new Arg();
+        customArgs.add(arg);
+        return arg;
+    }
+    
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setTask(IMakerTask task) {
+        this.task = task;
+    }
+    
+    /**
+     * Defines an alternate template to use to generate the build sequence for emake.
+     * @ant.not-required
+     */
+    public void setTemplate(File template) {
+        this.template = template;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/engines/JavaEngine.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,194 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker.ant.engines;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.DataType;
+
+import com.nokia.helium.core.plexus.StreamRecorder;
+import com.nokia.helium.imaker.IMaker;
+import com.nokia.helium.imaker.IMakerException;
+import com.nokia.helium.imaker.ant.Command;
+import com.nokia.helium.imaker.ant.Engine;
+import com.nokia.helium.imaker.ant.taskdefs.IMakerTask;
+
+/**
+ * Engine purely based on Java. Parallelisation is
+ * implemented using multithreading.
+ * 
+ * <pre>
+ * &lt;defaultEngine id="imaker.default" threads="4" /&gt;
+ * </pre>
+ * 
+ * @ant.type name=defaultEngine category=imaker
+ */
+public class JavaEngine extends DataType implements Engine {
+
+    private IMakerTask task;
+    private OutputStreamWriter output;
+    private int threads = 1;
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setTask(IMakerTask task) {
+        this.task = task;
+    }
+    
+    /**
+     * Defines the number of iMaker jobs running in
+     * parallel. 
+     * @ant.not-required Default value is 1.
+     */
+    public void setThreads(int threads) {
+        this.threads = threads;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void build(List<List<Command>> cmds) throws IMakerException {
+        task.log("Building with Ant engine.");
+        if (threads <= 0) {
+            throw new BuildException("'threads' must be >= 0. (current value: " + threads + ")");
+        }
+        openLog();
+        // Do something with the configurations
+        for (List<Command> cmdlist : cmds) {
+            task.log("Building command list in parallel.");
+            if (cmdlist.size() > 0) {
+                ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(cmdlist.size());
+                ThreadPoolExecutor threadPool = new ThreadPoolExecutor(threads, threads, 10, TimeUnit.MILLISECONDS, queue);
+                task.log("Adding " + cmdlist.size() + " to queue.");
+                for (final Command cmd : cmdlist) {
+                    // Create a Runnable to wrap the image
+                    // building.
+                    threadPool.execute(new Runnable() {
+                        public void run() {
+                            try {
+                                buildCommand(cmd);
+                            } catch (IMakerException e) {
+                                task.log(e.getMessage(), Project.MSG_ERR);
+                            }
+                        }
+                    });
+                }
+                threadPool.shutdown();
+                try {
+                    while (!threadPool.isTerminated()) {
+                        threadPool.awaitTermination(100, TimeUnit.MILLISECONDS);
+                    }
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        closeLog();
+    }
+
+  
+    /**
+     * Build a Command.
+     * @param cmd
+     * @throws IMakerException
+     */
+    protected void buildCommand(Command cmd) throws IMakerException {
+        IMaker imaker = task.getIMaker();
+        StreamRecorder rec = new StreamRecorder();
+        imaker.addOutputLineHandler(rec);
+        imaker.addErrorLineHandler(rec);
+        
+        rec.consumeLine("-- " + cmd.getCmdLine());
+        rec.consumeLine("++ Started at " + new Date());
+        rec.consumeLine("+++ HiRes Start " + new Date().getTime());
+        
+        List<String> args = new ArrayList<String>();
+        args.addAll(cmd.getArguments());
+        // Setting the working dir for the image creation.
+        File tempDir = imaker.createWorkDir();
+        args.add("WORKDIR=" + tempDir.getAbsolutePath());
+        // Pushing custom variables
+        for (Entry<String, String> e : cmd.getVariables().entrySet()) {
+            if (e.getKey().equals("WORKDIR")) {
+                task.log("WORKDIR cannot be defined by the user, the value will be ignored.", Project.MSG_WARN);
+            } else {
+                args.add(e.getKey() + "=" + e.getValue());
+            }
+        }
+        // Setting the target
+        args.add(cmd.getTarget());                
+        try {
+            imaker.execute(args.toArray(new String[args.size()]));
+        } catch (IMakerException e) {
+            // logging iMaker execution error to the 
+            // task and the output log.
+            task.log(e.getMessage(), Project.MSG_ERR);
+            rec.consumeLine(e.getMessage());
+        } finally {
+            rec.consumeLine("+++ HiRes End " + new Date().getTime());
+            rec.consumeLine("++ Finished at " + new Date());
+        }
+        // writing data
+        writeLog(rec.getBuffer().toString());
+    }
+    
+    private void openLog() throws IMakerException {
+        if (task.getOutput() != null) {
+            try {
+                output = new OutputStreamWriter(new FileOutputStream(task.getOutput()));
+            } catch (FileNotFoundException e) {
+                throw new IMakerException(e.getMessage(), e);
+            }
+        }
+    }
+
+    private synchronized void writeLog(String str) throws IMakerException {
+        if (output != null) {
+            try {
+                output.write(str);
+            } catch (IOException e) {
+                throw new IMakerException(e.getMessage(), e);
+            }
+        }
+    }
+    
+    private void closeLog() throws IMakerException {
+        if (output != null) {
+            try {
+                output.close();
+            } catch (IOException e) {
+                throw new IMakerException(e.getMessage(), e);
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/engines/build_imaker_roms_signing.mk.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,128 @@
+<#--
+============================================================================ 
+Name        : build_imaker_roms_signing.mk.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+############################################################################
+# Makefile generated by the emake engine 
+############################################################################
+
+# Are we using linux?
+USE_UNIX  := $(if $(findstring cmd.exe,$(SHELL))$(findstring mingw,$(call lcase,$(MAKE))),0,1)
+EXECUTOR_CLASS = com.nokia.helium.imaker.utils.ParallelExecutor
+
+# Path conversion macro
+true        = $(if $(filter-out 0,$(subst 0,0 ,$1)),1)
+iif         = $(if $(call true,$1),$2,$3)
+lcase       = $(call tr,$([A-Z]),$([a-z]),$1)
+pathconv    = $(call iif,$(USE_UNIX),$(subst \,/,$1),$(subst /,\,$1))
+
+# Some variables
+ROMBUILD_TEMPDIR=$(call pathconv,epoc32/rombuild/temp)
+
+
+$(ROMBUILD_TEMPDIR)/:
+	-mkdir $(ROMBUILD_TEMPDIR)
+
+<#assign cid=0>
+<#assign iid=0>
+<#assign deps="">
+<#list cmdSets as cmds>
+<#assign configdeps="">
+<#assign configimagedeps="">
+<#assign firstiid=iid>
+
+#pragma runlocal
+configuration_${cid}-dir: $(ROMBUILD_TEMPDIR)/config_${iid} <#if (cid>0)>configuration_${cid-1}</#if> <#if (cmds?size == 0)>;</#if>
+	$(call iif,$(USE_UNIX),touch,@echo off >) $(ROMBUILD_TEMPDIR)/command-dir-list-${cid}.txt
+    <#list cmds as cmd>
+        <#assign cmdline="">
+        <#list cmd.getArguments() as arg>
+            <#assign cmdline="${cmdline} ${arg}">
+        </#list>
+        <#assign vars=cmd.getVariables()>
+        <#list vars?keys as var>
+            <#assign cmdline="${cmdline} ${var}=${vars[var]}">
+        </#list>
+	@echo $(call iif,$(USE_UNIX),,cmd /c) ${cmd.getCommand()} WORKDIR=$(ROMBUILD_TEMPDIR)/config_${iid} ${cmdline} ${cmd.getTarget()}-dir >> $(ROMBUILD_TEMPDIR)/command-dir-list-${cid}.txt 
+<#assign iid=iid+1>
+    </#list>
+	-@${java_home}/bin/java -cp "${java_utils_classpath}" $(EXECUTOR_CLASS) $(ROMBUILD_TEMPDIR)/command-dir-list-${cid}.txt
+
+
+<#assign iid=firstiid>
+    <#list cmds as cmd>
+        <#assign cmdline="">
+        <#list cmd.getArguments() as arg>
+            <#assign cmdline="${cmdline} ${arg}">
+        </#list>
+        <#assign vars=cmd.getVariables()>
+        <#list vars?keys as var>
+            <#assign cmdline="${cmdline} ${var}=${vars[var]}">
+        </#list>
+#
+#  Building configuration ${iid}.
+#
+$(ROMBUILD_TEMPDIR)/config_${iid}/: $(ROMBUILD_TEMPDIR)
+	-mkdir $(call pathconv,$(ROMBUILD_TEMPDIR)/config_${iid})
+
+
+rom_${iid}-image: configuration_${cid}-dir
+	@echo -- ${cmd.getCmdLine()}-image
+	-@perl -e "print '++ Started at '.localtime().\"\n\""
+	-@perl -e "use Time::HiRes; print '+++ HiRes Start '.Time::HiRes::time().\"\n\";"	
+	-${cmd.getCommand()} WORKDIR=$(ROMBUILD_TEMPDIR)/config_${iid} ${cmdline} ${cmd.getTarget()}-image
+	-@perl -e "use Time::HiRes; print '+++ HiRes End '.Time::HiRes::time().\"\n\";"
+	-@perl -e "print '++ Finished at '.localtime().\"\n\""
+
+<#assign configimagedeps="${configimagedeps} rom_${iid}-image">
+<#assign iid=iid+1>
+    </#list>
+
+configuration_${cid}-image: ${configimagedeps} ;
+
+<#assign iid=firstiid>
+#pragma runlocal
+configuration_${cid}-e2flash: configuration_${cid}-image
+	$(call iif,$(USE_UNIX),touch,@echo off >) $(ROMBUILD_TEMPDIR)/command-e2flash-list-${cid}.txt
+    <#list cmds as cmd>
+        <#assign cmdline="">
+        <#list cmd.getArguments() as arg>
+            <#assign cmdline="${cmdline} ${arg}">
+        </#list>
+        <#assign vars=cmd.getVariables()>
+        <#list vars?keys as var>
+            <#assign cmdline="${cmdline} ${var}=${vars[var]}">
+        </#list>
+	@echo $(call iif,$(USE_UNIX),,cmd /c) ${cmd.getCommand()} WORKDIR=$(ROMBUILD_TEMPDIR)/config_${iid} ${cmdline} ${cmd.getTarget()}-e2flash >> $(ROMBUILD_TEMPDIR)/command-e2flash-list-${cid}.txt 
+<#assign iid=iid+1>
+    </#list>
+	 -@${java_home}/bin/java -cp "${java_utils_classpath}" $(EXECUTOR_CLASS) $(ROMBUILD_TEMPDIR)/command-e2flash-list-${cid}.txt
+
+
+configuration_${cid}: <#if (cid>0)>configuration_${cid-1}</#if> configuration_${cid}-dir configuration_${cid}-image configuration_${cid}-e2flash ;
+
+
+<#assign deps="configuration_${cid}">        
+<#assign cid=cid+1>
+</#list>
+
+all: ${deps} ;
+
+# End of config
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/taskdefs/IMakerTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,286 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker.ant.taskdefs;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.DataType;
+
+import com.nokia.helium.core.plexus.AntStreamConsumer;
+import com.nokia.helium.imaker.IMaker;
+import com.nokia.helium.imaker.IMakerException;
+import com.nokia.helium.imaker.ant.Command;
+import com.nokia.helium.imaker.ant.Engine;
+import com.nokia.helium.imaker.ant.IMakerCommandSet;
+import com.nokia.helium.imaker.ant.engines.JavaEngine;
+
+/**
+ * The imaker task will allow you to efficiently use iMaker to 
+ * build rom images in parallel.
+ * 
+ * The task is actually base on two concepts:
+ * <ul>
+ *   <li> content configuration: what needs to be built.
+ *   <li> acceleration engine: how to build roms in an efficient way.
+ * </ul>
+ * 
+ * In the following example the task is configured to use the emake engine
+ * to accelerate the rom image creation and an <code>imakerconfiguration</code> configuration
+ * element to configure the content of the building:
+ *
+ * <pre>
+ *       &lt;hlm:emakeEngine id="imaker.ec" /&gt;
+ *       &lt;hlm:imaker epocroot="${epocroot}" 
+ *                      output="${epocroot}/imaker.log"
+ *                      engineRefid="imaker.ec"
+ *                      verbose="true"&gt;
+             &lt;hlm:imakerconfiguration&gt;
+ *                   &lt;makefileset&gt;
+ *                       &lt;include name="*&#42;/product/*ui.mk" /&gt;
+ *                   &lt;/makefileset&gt;
+ *                   &lt;targetset&gt;
+ *                       &lt;include name="core" /&gt;
+ *                       &lt;include name="langpack_01" /&gt;
+ *                   &lt;/targetset&gt;
+             &lt;/hlm:imakerconfiguration&gt;
+ *       &lt;/hlm:imaker&gt;
+ * </pre> 
+ * @ant.task name=imaker category=imaker
+ */
+public class IMakerTask extends Task {
+
+    private File epocroot;
+    private boolean verbose;
+    private boolean failOnError = true;
+    private List<IMakerCommandSet> commandSets = new ArrayList<IMakerCommandSet>();
+    private String engineRefId;
+    private AntStreamConsumer stdout = new AntStreamConsumer(this);
+    private AntStreamConsumer stderr = new AntStreamConsumer(this, Project.MSG_ERR);
+    private File output;
+    
+    /**
+     * Add iMaker Task compatible configuration. The task will 
+     * accept any Ant type implementing the IMakerCommandSet 
+     * interface like the <code>imakerconfiguration</code> type.
+     * 
+     * @param cmdSet an iMaker configuration which will defines
+     *               what needs to be built.
+     * 
+     * @ant.required
+     */
+    public void add(IMakerCommandSet cmdSet) {
+        commandSets.add(cmdSet);
+    }
+
+    /**
+     * Defines the reference id of the engine to use.
+     * @ant.not-required Default Java implementation will be used.
+     */
+    public void setEngineRefId(String engineRefId) {
+        this.engineRefId = engineRefId;
+    }
+
+    /**
+     * Retrieve the engine to be used. If the engineRefId
+     * attribute is not defined then the JavaEngine is used 
+     * as the default one.
+     * @return An instance of engine.
+     * @throws a BuildException if the engineRefId attribute doesn't define an Engine
+     * object.
+     */
+    protected Engine getEngine() {
+        if (engineRefId == null) {
+            log("Using default engine (Java threading)");
+            JavaEngine engine = new JavaEngine();
+            engine.setProject(getProject());
+            engine.setTask(this);
+            return engine;
+        } else {
+            try {
+                Engine engine = (Engine)this.getProject().getReference(engineRefId);
+                engine.setTask(this);
+                return engine;
+            } catch (ClassCastException e) {
+                throw new BuildException("Reference '" + engineRefId + "' is not referencing an Engine configuration.");
+            }
+        }
+    }
+    
+    /**
+     * Get current epocroot location (build environment).
+     * @return a File object.
+     */
+    public File getEpocroot() {
+        File epocroot = this.epocroot;
+        if (epocroot == null) {
+            epocroot = new File(System.getenv("EPOCROOT"));
+            if (epocroot == null) {
+                throw new BuildException("'epocroot' attribute has not been defined.");                
+            } else {
+                log("Using EPOCROOT: " + epocroot.getAbsolutePath());
+            }
+        }
+
+        if (!epocroot.exists() || !epocroot.isDirectory()) {
+            throw new BuildException("Invalid epocroot directory: " + epocroot);
+        }
+        return epocroot;
+    }
+
+    /**
+     * Defines the EPOCROOT location.
+     * @param epocroot
+     * @ant.not-required Will use EPOCROOT environment variable if not defined.
+     */
+    public void setEpocroot(File epocroot) {
+        this.epocroot = epocroot;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void execute() {
+        try {
+            // Simple way to verify if iMaker is installed under
+            // then environment.
+            IMaker imaker = getIMaker();
+            log("Using iMaker: " + imaker.getVersion());
+
+            // build the content.
+            build();
+        } catch (IMakerException e) {
+            if (shouldFailOnError()) {
+                throw new BuildException(e.getMessage(), e);
+            } else {
+                log(e.getMessage(),  Project.MSG_ERR);
+            }
+        }
+    }
+    
+    /**
+     * Should the task be verbose.
+     * @return  Returns true if the task should display all iMaker outputs.
+     */
+    public boolean isVerbose() {
+        return verbose;
+    }
+
+    /**
+     * Defines if the task should log all the output through Ant.
+     * by default only error/warnings are printed.
+     * @param verbose set the verbosity status.
+     * @ant.not-required Default is false.
+     */
+    public void setVerbose(boolean verbose) {
+        this.verbose = verbose;
+    }
+
+    /**
+     * Get the output filename.
+     * @return the output filename.
+     */
+    public File getOutput() {
+        return output;
+    }
+
+    /**
+     * Defined the output log filename.
+     * @param output
+     * @ant.not-required
+     */
+    public void setOutput(File output) {
+        this.output = output;
+    }
+
+    /**
+     * Concatenate all the configuration content and
+     * delegate the building to the engine.
+     * @throws IMakerException
+     */
+    protected void build() throws IMakerException {
+        List<List<Command>> cmds = new ArrayList<List<Command>>();
+        for (IMakerCommandSet cmdSet : commandSets) {
+            if (cmdSet instanceof DataType) {
+                DataType dataType = (DataType)cmdSet;
+                if (dataType.isReference()) {
+                    cmdSet = (IMakerCommandSet)dataType.getRefid().getReferencedObject();
+                }
+            }
+            cmds.addAll(cmdSet.getCommands(getIMaker()));
+        }
+        if (cmds.size() > 0) {
+            getEngine().build(cmds);
+        } else {
+            log("Nothing to build.");
+        }
+    }
+    
+    /**
+     * Get a configured IMaker instance. The created object
+     * is configured with output stream redirected to
+     * the task logging. Stderr is always redirected,
+     * stdout is only redirected if the task is configured
+     * to be verbose.
+     * 
+     * @return an IMaker instance.
+     */
+    public IMaker getIMaker() {
+        return getIMaker(verbose, true);
+    }
+
+    /**
+     * Get a configured IMaker instance. The created object
+     * is configured with output stream redirected to
+     * the task logging. Stderr is always redirected,
+     * the stdout will be configured by the verbose parameter.
+     * @param verbose enable stdout redirection to the task logging.
+     * @return an IMaker instance.
+     */
+    public IMaker getIMaker(boolean verbose, boolean verboseError) {
+        IMaker imaker = new IMaker(getEpocroot());
+        if (verbose) {
+            imaker.addOutputLineHandler(stdout);
+        }
+        if (verboseError) {
+            imaker.addErrorLineHandler(stderr);
+        }
+        return imaker;
+    }
+    
+    /**
+     * Defines if the task should fail in case of error.
+     * @ant.not-required Default is true
+     */
+    public void setFailOnError(boolean failOnError) {
+        this.failOnError = failOnError;
+    }
+    
+    /**
+     * Should the task should fail in case of error?
+     * @return true if the task should fail on error.
+     */
+    public boolean shouldFailOnError() {
+        return this.failOnError;
+    }
+        
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/types/Configuration.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,356 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.helium.imaker.ant.types;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.PatternSet;
+
+import com.nokia.helium.imaker.IMaker;
+import com.nokia.helium.imaker.IMakerException;
+import com.nokia.helium.imaker.ant.Command;
+import com.nokia.helium.imaker.ant.IMakerCommandSet;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.Vector;
+import java.util.regex.Pattern;
+
+/**
+ * The imakerconfiguration enables the build manager to configure his iMaker
+ * builds based on introspection.
+ *
+ * The makefileset element will configure the filtering of the "imaker help-config"
+ * command. Then for each of the configuration found the targetset elements will be used
+ * to filter the output from the "imaker -f <i>configuration.mk</i> help-target-*-list"
+ * command. Finally a set of command will be generated.
+ *
+ * Each command will then be configure using the set of variables defined by the variableset
+ * elements. Only the WORKDIR variable is under the task control to ensure call safety during the
+ * parallelization. 
+ * 
+ * The usage of the variablegroup will allow you to duplicate the common set of commands 
+ * and apply additional variables.    
+ *
+ * Example: 
+ * <pre>
+ *     &lt;imakerconfiguration regionalVariation="true"&gt;
+ *         &lt;makefileset&gt;
+ *             &lt;include name="*&#42;/product/*ui.mk"/&gt;
+ *         &lt;/makefileset&gt;
+ *         &lt;targetset&gt;
+ *             &lt;include name="^core$" /&gt;
+ *             &lt;include name="langpack_\d+" /&gt;
+ *             &lt;include name="^custvariant_.*$" /&gt;
+ *             &lt;include name="^udaerase$" /&gt;
+ *         &lt;/targetset&gt;
+ *         &lt;variableset&gt;
+ *             &lt;variable name="USE_FOTI" value="0"/&gt;
+ *             &lt;variable name="USE_FOTA" value="1"/&gt;
+ *         &lt;/variableset&gt;
+ *         &lt;variablegroup&gt;
+ *             &lt;variable name="TYPE" value="rnd"/&gt;
+ *         &lt;/variablegroup&gt;
+ *         &lt;variablegroup&gt;
+ *             &lt;variable name="TYPE" value="subcon"/&gt;
+ *         &lt;/variablegroup&gt;
+ *     &lt;/imakerconfiguration&gt;
+ * </pre>
+ *
+ * This configuration might produce the following calls :
+ * <pre>
+ * imaker -f /epoc32/rom/config/platform/product/image_conf_product_ui.mk TYPE=rnd USE_FOTI=0 USE_FOTA=1 core
+ * imaker -f /epoc32/rom/config/platform/product/image_conf_product_ui.mk TYPE=subcon USE_FOTI=0 USE_FOTA=1 core
+ * imaker -f /epoc32/rom/config/platform/product/image_conf_product_ui.mk TYPE=rnd USE_FOTI=0 USE_FOTA=1 langpack_01
+ * imaker -f /epoc32/rom/config/platform/product/image_conf_product_ui.mk TYPE=subcon USE_FOTI=0 USE_FOTA=1 langpack_01
+ * </pre>
+ * 
+ * @ant.type name="imakerconfiguration" category="imaker"
+ */
+public class Configuration extends DataType implements IMakerCommandSet {
+    
+    private Vector<PatternSet> makefiles = new Vector<PatternSet>();
+    private Vector<MakefileSelector> selectors = new Vector<MakefileSelector>();
+    private Vector<PatternSet> targets = new Vector<PatternSet>();
+    private Vector<VariableSet> variables = new Vector<VariableSet>();
+    private Vector<VariableGroup> variablegroups = new Vector<VariableGroup>();
+    private boolean regionalVariation;
+    
+    /**
+     * Create a makefileset element.
+     * Makefileset elements are based on regular Ant PatternSet.
+     * @return a PatternSet object.
+     */
+    public PatternSet createMakefileSet() {
+        PatternSet makefile =  new PatternSet();
+        makefiles.add(makefile);
+        return makefile;
+    }
+    
+    /**
+     * Get the list of makefileset element.
+     * @return a vector of PatternSet objects.
+     */
+    public Vector<PatternSet> getMakefileSet() {
+        return makefiles;
+    }
+    
+    /**
+     * Add a Makefile selector configuration (e.g: products)
+     * @param filter
+     */
+    public void add(MakefileSelector filter) {
+        selectors.add(filter);
+    }
+    
+    /**
+     * Create a targetset element.
+     * Targetset elements are based on regular Ant PatternSet.
+     * @return a PatternSet object.
+     */
+    public PatternSet createTargetSet() {
+        PatternSet target =  new PatternSet();
+        targets.add(target);
+        return target;
+    }
+    
+    /**
+     * Get the list of targetset.
+     * @return a vector of PatternSet objects.
+     */
+    public Vector<PatternSet> getTargetSet() {
+        return targets;
+    }
+
+    /**
+     * Create a VariableSet element.
+     * @return a VariableSet object.
+     */
+    public VariableSet createVariableSet() {
+        VariableSet var =  new VariableSet();
+        variables.add(var);
+        return var;
+    }
+        
+    /**
+     * Create a VariableSet element.
+     * @return a VariableSet object.
+     */
+    public VariableGroup createVariableGroup() {
+        VariableGroup var =  new VariableGroup();
+        variablegroups.add(var);
+        return var;
+    }
+        
+    /**
+     * Get the list of variableset.
+     * @return a vector of VariableSet objects.
+     */
+    public Vector<VariableSet> getVariableSet() {
+        return variables;
+    }
+
+    /**
+     * Enables the sorting of images per region. 
+     * @deprecated The usage of this feature is now ignored.
+     * @param value the state of the regional variation
+     * @ant.not-required Default is false - The usage of this feature is now ignored.
+     */
+    @Deprecated
+    public void setRegionalVariation(boolean value) {
+        log(this.getDataTypeName() + ": the usage of the regionalVariation attribute is now ignored.", Project.MSG_WARN);
+        regionalVariation = value;
+    }
+
+    /**
+     * Get the status of the regional variation enabling.
+     * @deprecated The usage of this feature is now ignored.
+     * @return returns true is the regional variation should be enabled.
+     */
+    public boolean getRegionalVariation() {
+        return regionalVariation;
+    }
+
+    /**
+     * Check if name is matching any of the pattern under patterns list.
+     * @param name the string to match
+     * @param patterns a list of PatternSet
+     * @return Returns true if name matches at least one pattern.
+     */
+    protected boolean isIncluded(String name, Vector<PatternSet> patterns) {
+        for (PatternSet patternSet : patterns) {
+            if (patternSet.isReference()) {
+                patternSet = (PatternSet) patternSet.getRefid().getReferencedObject();
+            }
+            String[] includes = patternSet.getIncludePatterns(getProject());
+            if (includes != null) {
+                for (String pattern : includes) {
+                    if (Pattern.matches(pattern, name)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Check if name is matching any of the pattern under patterns list.
+     * @param name the string to match
+     * @param patterns a list of PatternSet
+     * @return Returns true if name matches at least one pattern.
+     */
+    protected boolean isExcluded(String name, Vector<PatternSet> patterns) {
+        for (PatternSet patternSet : patterns) {
+            if (patternSet.isReference()) {
+                patternSet = (PatternSet) patternSet.getRefid().getReferencedObject();
+            }
+            String[] excludes = patternSet.getExcludePatterns(getProject());
+            if (excludes != null) {
+                for (String pattern : excludes) {
+                    if (Pattern.matches(pattern, name)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+    
+    /**
+     * Get a configured matcher.
+     * @return a configured makefile matcher.
+     */
+    protected Matcher getMakefileMatcher() {
+        Matcher matcher = new Matcher();
+        List<String> includes = new ArrayList<String>(); 
+        List<String> excludes = new ArrayList<String>(); 
+        for (PatternSet patternSet : makefiles) {
+            if (patternSet.isReference()) {
+                patternSet = (PatternSet) patternSet.getRefid().getReferencedObject();
+            }
+            String[] patterns = patternSet.getIncludePatterns(getProject());
+            if (patterns != null) {
+                for (String pattern : patterns) {
+                    includes.add(pattern);
+                }
+            }
+            patterns = patternSet.getExcludePatterns(getProject());
+            if (patterns != null) {
+                for (String pattern : patterns) {
+                    excludes.add(pattern);
+                }
+            }
+        }    
+        matcher.setIncludes(includes.toArray(new String[includes.size()]));
+        matcher.setExcludes(excludes.toArray(new String[excludes.size()]));
+        return matcher;
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public List<List<Command>> getCommands(IMaker imaker) {
+        List<List<Command>> cmdSet = new ArrayList<List<Command>>();
+        List<Command> cmds = new ArrayList<Command>();
+        // Let's add one fake group.
+        if (variablegroups.size() == 0) {
+            variablegroups.add(new VariableGroup());
+        }
+        try {
+            for (String configuration : getConfigurations(imaker.getConfigurations())) {
+                log("Including configuration: " + configuration);
+                for (String target : imaker.getTargets(configuration)) {
+                    if (isIncluded(target, targets) && !isExcluded(target, targets)) {
+                        log("Including target: " + target);
+                        for (VariableGroup group : variablegroups) {
+                            if (group.isReference()) {
+                                group = (VariableGroup)group.getRefid().getReferencedObject();
+                            }
+                            Command cmd = new Command();
+                            cmd.setCommand("imaker");
+                            cmd.addArgument("-f");
+                            cmd.addArgument(configuration);
+                            // Adding variables
+                            for (VariableSet vs : variables) {
+                                cmd.addVariables(vs.toMap());
+                            }
+                            // Adding variables from groups
+                            cmd.addVariables(group.toMap());
+                            cmd.setTarget(target);
+                            cmds.add(cmd);
+                        }
+                    }
+                }
+            }
+        } catch (IMakerException e) {
+            throw new BuildException(e.getMessage());
+        }
+        // adding all the commands.
+        if (cmds.size() > 0) {
+            cmdSet.add(cmds);
+        }
+        return cmdSet;
+    }
+    
+    /**
+     * Select which iMaker configuration should be built.
+     * @param configurations
+     * @return
+     */
+    protected Set<String> getConfigurations(List<String> configurations) {
+        Set<String> result = new HashSet<String>();
+        if (makefiles.size() > 0) {
+            Matcher matcher = getMakefileMatcher();
+            for (String configuration : configurations) {
+                if (matcher.match(configuration)) {
+                    result.add(configuration);
+                }
+            }
+        }
+        for (MakefileSelector selector : selectors) {
+            result.addAll(selector.selectMakefile(configurations));
+        }
+        return result;
+    }
+    
+    /**
+     * Matcher object to filter discovered configurations.
+     * iMaker configuration.
+     */
+    public class Matcher extends DirectoryScanner {
+        
+        /**
+         * Check is a particular configuration can
+         * is selected.
+         * @param path the string to match.
+         * @return return true is the path is selected.
+         */
+        public boolean match(String path) {
+            String vpath = path.replace('/', File.separatorChar).
+                replace('\\', File.separatorChar);
+            return isIncluded(vpath) && !isExcluded(vpath);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/types/ConfigurationSet.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,95 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.helium.imaker.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+
+import com.nokia.helium.imaker.IMaker;
+import com.nokia.helium.imaker.ant.Command;
+import com.nokia.helium.imaker.ant.IMakerCommandSet;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Vector;
+
+/**
+ * Set of iMaker configuration.
+ *
+ * <pre>
+ * &lt;hlm:imakerconfigurationset&gt;
+ *     &lt;imakerconfiguration regionalVariation="true"&gt;
+ *         &lt;makefileset&gt;
+ *             &lt;include name="*&#42;/product/*ui.mk"/&gt;
+ *         &lt;/makefileset&gt;
+ *         &lt;targetset&gt;
+ *             &lt;include name="^core$" /&gt;
+ *             &lt;include name="langpack_\d+" /&gt;
+ *             &lt;include name="^custvariant_.*$" /&gt;
+ *             &lt;include name="^udaerase$" /&gt;
+ *         &lt;/targetset&gt;
+ *         &lt;variableset&gt;
+ *             &lt;variable name="USE_FOTI" value="0"/&gt;
+ *             &lt;variable name="USE_FOTA" value="1"/&gt;
+ *         &lt;/variableset&gt;
+ *         &lt;variablegroup&gt;
+ *             &lt;variable name="TYPE" value="rnd"/&gt;
+ *             &lt;variable name="USE_FOTI" value="0"/&gt;
+ *             &lt;variable name="USE_FOTA" value="1"/&gt;
+ *         &lt;/variablegroup&gt;
+ *         &lt;variablegroup&gt;
+ *             &lt;variable name="TYPE" value="subcon"/&gt;
+ *             &lt;variable name="USE_FOTI" value="0"/&gt;
+ *             &lt;variable name="USE_FOTA" value="1"/&gt;
+ *         &lt;/variablegroup&gt;
+ *     &lt;/imakerconfiguration&gt;
+ * &lt;/hlm:imakerconfigurationset&gt;
+ * </pre>
+ * @ant.type name="imakerconfigurationset" category="imaker"
+ */
+public class ConfigurationSet extends DataType implements IMakerCommandSet {
+
+    private Vector<Configuration> configurations = new Vector<Configuration>();
+
+    /**
+     * This method create an iMaker Configuration element. 
+     */
+    public Configuration createImakerConfiguration() {
+        Configuration config = new Configuration();
+        configurations.add(config);
+        return config;
+    }
+
+    /**
+     * Get the list of iMaker configuration. 
+     */
+    public Vector<Configuration> getImakerConfiguration() {
+        return configurations;
+    }
+
+    @Override
+    public List<List<Command>> getCommands(IMaker imaker) {
+        List<List<Command>> cmdset = new ArrayList<List<Command>>();
+        for (Configuration config : configurations) {
+            if (config.isReference()) {
+                config = (Configuration) config.getRefid().getReferencedObject();
+            }
+            cmdset.addAll(config.getCommands(imaker));
+        }
+        return cmdset;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/types/MakefileSelector.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,34 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.helium.imaker.ant.types;
+
+import java.util.List;
+
+/**
+ * Interface used to extend the Makefile introspection of the
+ *  iMaker configuration.
+ *
+ */
+public interface MakefileSelector {
+
+    /**
+     * Select the configurations to be built based on the object settings.
+     * @param configuration
+     * @return a list of selected configuration from the input list.
+     */
+    List<String> selectMakefile(List<String> configurations);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/types/Product.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,123 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.helium.imaker.ant.types;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Vector;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.DataType;
+
+/**
+ * The product type will allow you to select iMaker makefile configuration based on
+ * the product name. The search will be done using the following template:
+ * image_conf_[product_name][_ui].mk
+ * 
+ * <pre>
+ * &lt;hlm:product list="product1,product2" ui="true" failonerror="false" /&gt;
+ * </pre>
+ * @ant.type name="hlm:product" category="imaker"
+ */
+public class Product extends DataType implements MakefileSelector {
+    private String list;
+    private boolean ui;
+    private boolean failOnError = true;
+
+    /**
+     * Defines a comma separated list of product names.
+     * @param name
+     */
+    public void setList(String list) {
+        this.list = list;
+    }
+    
+    /**
+     * Get the list of products
+     * @return an array of products
+     */
+    public String[] getNames() {
+        Vector<String> names = new Vector<String>();
+        for (String name : this.list.split(",")) {
+            name = name.trim();
+            if (name.length() > 0) {
+                names.add(name);
+            }
+        }
+        return names.toArray(new String[names.size()]);
+    }
+
+    public void setUi(boolean ui) {
+        this.ui = ui;
+    }
+
+    /**
+     * Define if we are looking for a ui configuration (will add _ui to the
+     * makefile name)
+     * @return
+     * @ant.not-required Default false
+     */
+    public boolean isUi() {
+        return ui;
+    }
+
+    /**
+     * Shall we fail the build in case of missing config?
+     * @param failOnError
+     * @ant.not-required Default true
+     */
+    public void setFailOnError(boolean failOnError) {
+        this.failOnError = failOnError;
+    }
+
+    /**
+     * Shall we fail the build in case of missing config. 
+     * @return a boolean
+     */
+    public boolean isFailOnError() {
+        return failOnError;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public List<String> selectMakefile(List<String> configurations) {
+        List<String> result = new ArrayList<String>();
+        for (String product : getNames()) {
+            String endOfString = "image_conf_" + product + (ui ? "_ui" : "") + ".mk";
+            boolean foundConfig = false;
+            for (String config : configurations) {
+                if (config.endsWith(endOfString)) {
+                    foundConfig = true;
+                    result.add(config);
+                    break;
+                }
+            }
+            if (!foundConfig) {
+                if (isFailOnError()) {
+                    throw new BuildException("Could not find a valid configuration for " + product);
+                } else {
+                    log("Could not find a valid configuration for " + product, Project.MSG_ERR);
+                }
+            }
+        }
+        return result;
+    }
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/types/Variable.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,78 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.helium.imaker.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * Configure a variable for iMaker.
+ * @ant.type name="variable" category="imaker"
+ */
+public class Variable extends DataType
+{
+    private String mName;
+    private String mValue;
+    
+    /**
+     * Set the name of the variable.
+     * @param name
+     */
+    public void setName(String name) {
+        mName = name;
+    }
+
+    
+    /**
+     * Get the name of the variable.
+     * @return name.
+     */
+    public String getName() {
+        return mName;
+    }
+
+    /**
+     * Set the value of the variable.
+     * @param value
+     */
+    public void setValue(String value) {
+        mValue = value;
+    }
+
+    
+    /**
+     * Get the value of the variable.
+     * @return value.
+     */
+    public String getValue() {
+        return mValue;
+    }
+
+    /**
+     * Validate if the configuration is defined properly.
+     * Throws BuildException in case of error.
+     */
+    public void validate() {
+        if (getName() == null) {
+            throw new BuildException("The variable element doesn't define a 'name' attribute.");
+        }
+        if (getValue() == null) {
+            throw new BuildException("The variable element doesn't define a 'value' attribute.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/types/VariableGroup.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,34 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.helium.imaker.ant.types;
+
+/**
+ * This type is a container for variable configuration.
+ * A set of command will be generated for each group
+ * present in the imakerconfiguration.
+ * 
+ * <pre>
+ * &lt;variablegroup&gt;
+ *     &lt;variable name="TYPE" value="rnd" /&gt;
+ * &lt;/variablegroup&gt;
+ * </pre>
+ * 
+ * @ant.type name=variablegroup category="imaker"
+ */
+public class VariableGroup extends VariableSet {
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/ant/types/VariableSet.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,78 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.helium.imaker.ant.types;
+import org.apache.tools.ant.types.DataType;
+
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Vector;
+
+/**
+ * This type is a container for variable configuration.
+ * 
+ * <pre>
+ * &lt;variableset&gt;
+ *     &lt;variable name="TYPE" value="rnd" /&gt;
+ * &lt;/variableset&gt;
+ * </pre>
+ * 
+ * @ant.type name="variableset" category="imaker"
+ */
+public class VariableSet extends DataType {
+    
+    private Vector<Variable> variables = new Vector<Variable>();
+    
+    /**
+     * Creates a Variable object.
+     * @return a Variable object.
+     */
+    public Variable createVariable() {
+        Variable var =  new Variable();
+        add(var);
+        return var;
+    }
+    
+    /**
+     * Support the addition of a Variable object.
+     * @param a Variable object.
+     */
+    public void add(Variable var) {
+        variables.add(var);
+    }
+    
+    /**
+     * Get the list of Variable object.
+     * @return a vector of Variable objects
+     */
+    public Vector<Variable> getVariables() {
+        return variables;
+    }
+    
+    /**
+     * Convert the set of variable to a Map object.
+     * @return the content of that set into a Map object.
+     */
+    public Map<String, String> toMap() {
+        Map<String, String> data = new Hashtable<String, String>();
+        for (Variable var : variables) {
+            var.validate();
+            data.put(var.getName(), var.getValue());
+        }
+        return data;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/src/com/nokia/helium/imaker/utils/ParallelExecutor.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,134 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker.utils;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+
+/**
+ * Simple application which will execute each line from a text file
+ * as a command. All the command will be executed in parallel.
+ * Default number of threads is 4.
+ * 
+ * The implementation must not rely on any external dependencies except JVM and owning jar.
+ *
+ */
+public final class ParallelExecutor {
+    
+    /**
+     * Private constructor - not meant to be instantiated.
+     */
+    private ParallelExecutor() {
+    }
+    
+    /**
+     * Internal class holding a command to 
+     * execute.
+     *
+     */
+    private static class RunCommand implements Runnable {
+        private String cmdline;
+        
+        /**
+         * Default constructor
+         * @param cmdline the command to run
+         */
+        public RunCommand(String cmdline) {
+            this.cmdline = cmdline;
+        }
+        
+        /**
+         * Running command line and capturing the output.
+         */
+        @Override
+        public void run() {
+            StringTokenizer st = new StringTokenizer(cmdline);
+            String[] cmdArray = new String[st.countTokens()];
+            for (int i = 0; st.hasMoreTokens(); i++) {
+                cmdArray[i] = st.nextToken();
+            }
+            Process p;
+            try {
+                p = new ProcessBuilder(cmdArray).redirectErrorStream(true).start();
+                BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
+                String line;
+                StringBuffer buffer = new StringBuffer();
+                SimpleDateFormat df = new SimpleDateFormat("EEE MMM d HH:mm:ss yyyy");
+                
+                Date start = new Date();
+                buffer.append("++ Started at " + df.format(start) + "\n");
+                buffer.append("+++ HiRes Start " + start.getTime() / 1000 + "\n");
+                buffer.append("-- " + cmdline + "\n");
+                while ((line = in.readLine()) != null) {
+                    buffer.append(line + "\n");
+                }
+                Date end = new Date();
+                buffer.append("+++ HiRes End " + end.getTime() / 1000 + "\n");
+                buffer.append("++ Finished at " + df.format(end) + "\n");
+                synchronized (System.out) {
+                    System.out.print(buffer);
+                }
+            } catch (IOException e) {
+                System.err.println("ERROR: " + e.getMessage());
+            }
+        }
+    }
+    
+    /**
+     * This is the entry point of the application.
+     * It will only accept one file name as parameter.
+     * @param args a list of arguments.
+     */
+    public static void main(String[] args) {
+        if (args.length == 1) {
+            try {
+                List<String> cmds = new ArrayList<String>();
+                BufferedReader in = new BufferedReader(new FileReader(args[0]));
+                String line;
+                while ((line = in.readLine()) != null) {
+                    if (line.trim().length() > 0) {
+                        cmds.add(line);
+                    }
+                }
+                
+                final ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(cmds.size());
+                int numOfProcessor = Runtime.getRuntime().availableProcessors();
+                System.out.println("Number of threads: " + numOfProcessor);
+                ThreadPoolExecutor executor = new ThreadPoolExecutor(numOfProcessor, numOfProcessor, 100, TimeUnit.MILLISECONDS, queue);
+                for (String cmd : cmds) {
+                    executor.execute(new RunCommand(cmd));
+                }
+                executor.shutdown();
+            } catch (IOException e) {
+                System.err.println("ERROR: " + e.getMessage());
+            }
+        } else {
+            System.out.println("ParallelExecutor: nothing to execute.");
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/antunit/test_emakeengine.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_emakeengine.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-imaker-emakeengine-unittest" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib imaker unittests.</description>
+
+    <taskdef resource="com/nokia/helium/imaker/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+    <property name="epocroot" location="${basedir}/../epocroot_task" />
+    <property name="epocroot.temp" location="${epocroot}/temp" />
+
+    <!-- is called prior to the test -->
+    <target name="setUp">
+        <echo>-------------------------------------------------------------------------------</echo>
+        <delete dir="${epocroot.temp}" failonerror="false" />
+        <delete dir="${epocroot}/epoc32" failonerror="false" />
+        <mkdir dir="${epocroot.temp}" />
+    </target>
+
+    <!-- is called after the test, even if that caused an error -->
+    <target name="tearDown">
+        <delete dir="${epocroot.temp}" failonerror="false" />
+        <delete dir="${epocroot}/epoc32" failonerror="false" />
+        <echo>-------------------------------------------------------------------------------</echo>
+    </target>
+
+    <target name="test-imaker-defaultconfig">
+        <hlm:emakeEngine id="imaker.ec" />
+        <hlm:imaker epocroot="${epocroot}" 
+            output="${epocroot.temp}/output.log"
+            engineRefId="imaker.ec">
+            <hlm:imakerconfiguration>
+                <makefileset>
+                    <include name="**/product/*ui.mk" />
+                </makefileset>
+                <targetset>
+                    <include name="core" />
+                    <include name="langpack_\d+" />
+                </targetset>
+            </hlm:imakerconfiguration>
+        </hlm:imaker>
+        <au:assertFileExists file="${epocroot.temp}/output.log" />
+    </target>
+
+    <target name="test-imaker-defaultconfig-custom-args">
+        <hlm:emakeEngine id="imaker.ec">
+            <arg value="--autodepends=1" />
+        </hlm:emakeEngine>
+        <hlm:imaker epocroot="${epocroot}" 
+            output="${epocroot.temp}/output.log"
+            engineRefId="imaker.ec"
+            verbose="true">
+            <hlm:imakerconfiguration>
+                <makefileset>
+                    <include name="**/product/*ui.mk" />
+                </makefileset>
+                <targetset>
+                    <include name="core" />
+                    <include name="langpack_\d+" />
+                </targetset>
+            </hlm:imakerconfiguration>
+        </hlm:imaker>
+        <au:assertLogContains text="--autodepends=1" />
+        <au:assertFileExists file="${epocroot.temp}/output.log" />
+    </target>
+
+    <target name="test-imaker-defaultconfig-with-cust-missing-template">
+        <hlm:emakeEngine id="imaker.ec" template="missing.mk.ftl">
+            <arg value="--autodepends=1" />
+        </hlm:emakeEngine>
+        <au:expectfailure message="Could not find template file:">
+            <hlm:imaker epocroot="${epocroot}" 
+            	output="${epocroot.temp}/output.log"
+                engineRefId="imaker.ec"
+                verbose="true">
+                <hlm:imakerconfiguration>
+                    <makefileset>
+                        <include name="**/product/*ui.mk" />
+                    </makefileset>
+                    <targetset>
+                        <include name="core" />
+                        <include name="langpack_\d+" />
+                    </targetset>
+                </hlm:imakerconfiguration>
+            </hlm:imaker>
+        </au:expectfailure>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.log" />
+    </target>
+
+    <target name="test-imaker-defaultconfig-with-cust-invalid-template">
+        <hlm:emakeEngine id="imaker.ec" template="../emake_data/invalid.mk.ftl">
+            <arg value="--autodepends=1" />
+        </hlm:emakeEngine>
+        <au:expectfailure message="Error while rendering the makefile template:">
+            <hlm:imaker epocroot="${epocroot}" 
+                output="${epocroot.temp}/output.log"
+                engineRefId="imaker.ec"
+                verbose="true">
+                <hlm:imakerconfiguration>
+                    <makefileset>
+                        <include name="**/product/*ui.mk" />
+                    </makefileset>
+                    <targetset>
+                        <include name="core" />
+                        <include name="langpack_\d+" />
+                    </targetset>
+                </hlm:imakerconfiguration>
+            </hlm:imaker>
+        </au:expectfailure>
+        <au:assertLogContains text="invalid.mk.ftl" />
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.log" />
+    </target>
+
+    <target name="test-imaker-defaultconfig-with-cust-template">
+        <hlm:emakeEngine id="imaker.ec" template="../emake_data/cust.mk.ftl">
+            <arg value="--autodepends=1" />
+        </hlm:emakeEngine>
+        <hlm:imaker epocroot="${epocroot}" 
+            output="${epocroot.temp}/output.log"
+            engineRefId="imaker.ec"
+            verbose="true">
+            <hlm:imakerconfiguration>
+                <makefileset>
+                    <include name="**/product/*ui.mk" />
+                </makefileset>
+                <targetset>
+                    <include name="core" />
+                    <include name="langpack_\d+" />
+                </targetset>
+            </hlm:imakerconfiguration>
+        </hlm:imaker>
+        <au:assertLogContains text="Loading template:" />
+        <au:assertLogContains text="cust.mk.ftl" />
+        <au:assertFileExists file="${epocroot.temp}/output.log" />
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/antunit/test_imaker.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,280 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_imaker.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-imaker-unittest" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib imaker unittests.</description>
+
+    <taskdef resource="com/nokia/helium/imaker/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+    <property name="epocroot" location="${basedir}/../epocroot_task" />
+    <property name="epocroot.temp" location="${epocroot}/temp" />
+
+    <!-- is called prior to the test -->
+    <target name="setUp">
+        <echo>-------------------------------------------------------------------------------</echo>
+        <delete dir="${epocroot.temp}" failonerror="false" />
+        <delete dir="${epocroot}/epoc32" failonerror="false" />
+        <mkdir dir="${epocroot.temp}" />
+    </target>
+
+    <!-- is called after the test, even if that caused an error -->
+    <target name="tearDown">
+        <delete dir="${epocroot.temp}" failonerror="false" />
+        <delete dir="${epocroot}/epoc32" failonerror="false" />
+        <echo>-------------------------------------------------------------------------------</echo>
+    </target>
+
+    <target name="test-imaker-noargs-noconfig">
+        <echo>Will fail because it can't find imaker.</echo>
+        <au:expectfailure>
+            <hlm:imaker />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-imaker-epocroot">
+        <echo>Usin custom epocroot.</echo>
+        <hlm:imaker epocroot="${epocroot}" />
+    </target>
+
+    <target name="test-imaker-noargs">
+        <hlm:imaker epocroot="${epocroot}" output="${epocroot.temp}/output.log"/>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.log" />
+    </target>
+
+    <target name="test-imaker-empty-imakerconfigurationset">
+        <hlm:imaker epocroot="${epocroot}" output="${epocroot.temp}/output.log">
+            <hlm:imakerconfigurationset>
+            </hlm:imakerconfigurationset>
+        </hlm:imaker>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.log" />
+        <au:assertLogContains text="Nothing to build." />
+    </target>
+
+    <target name="test-imaker-empty-imakerconfiguration-accepted">
+        <hlm:imaker epocroot="${epocroot}" output="${epocroot.temp}/output.log">
+            <hlm:imakerconfiguration>
+            </hlm:imakerconfiguration>
+        </hlm:imaker>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.log" />
+        <au:assertLogContains text="Nothing to build." />
+    </target>
+
+    <target name="test-imaker-empty-imakerconfiguration">
+        <hlm:imaker epocroot="${epocroot}" output="${epocroot.temp}/output.log">
+            <hlm:imakerconfigurationset>
+                <hlm:imakerconfiguration>
+                </hlm:imakerconfiguration>
+            </hlm:imakerconfigurationset>
+        </hlm:imaker>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.log" />
+        <au:assertLogContains text="Nothing to build." />
+    </target>
+
+    <target name="test-imaker-imakerconfiguration-makefileset">
+        <hlm:imaker epocroot="${epocroot}" output="${epocroot.temp}/output.log">
+            <hlm:imakerconfigurationset>
+                <hlm:imakerconfiguration>
+                    <makefileset>
+                        <include name="**/product/*ui.mk" />
+                    </makefileset>
+                </hlm:imakerconfiguration>
+            </hlm:imakerconfigurationset>
+        </hlm:imaker>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.log" />
+        <au:assertLogContains text="Nothing to build." />
+    </target>
+    
+    <target name="test-imaker-imakerconfiguration-targetset">
+        <hlm:imaker epocroot="${epocroot}" output="${epocroot.temp}/output.log">
+            <hlm:imakerconfigurationset>
+                <hlm:imakerconfiguration>
+                    <makefileset>
+                        <include name="**/product/*ui.mk" />
+                    </makefileset>
+                    <targetset>
+                        <include name="core" />
+                        <include name="langpack_\d+" />
+                    </targetset>
+                </hlm:imakerconfiguration>
+            </hlm:imakerconfigurationset>
+        </hlm:imaker>
+        <au:assertFileExists file="${epocroot.temp}/output.log" />
+    </target>
+
+    <target name="test-imaker-imakerconfiguration-variableset">
+        <au:expectfailure message="The variable element doesn't define a 'name' attribute.">
+            <hlm:imaker epocroot="${epocroot}" output="${epocroot.temp}/output.log">
+                <hlm:imakerconfigurationset>
+                    <hlm:imakerconfiguration>
+                        <makefileset>
+                            <include name="**/product/*ui.mk" />
+                        </makefileset>
+                        <targetset>
+                            <include name="core" />
+                            <include name="langpack_\d+" />
+                        </targetset>
+                        <variableset>
+                            <variable />
+                        </variableset>
+                    </hlm:imakerconfiguration>
+                </hlm:imakerconfigurationset>
+            </hlm:imaker>
+        </au:expectfailure>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.log" />
+    </target>
+
+    <target name="test-imaker-imakerconfiguration-variablegroup">
+        <hlm:imaker epocroot="${epocroot}" output="${epocroot.temp}/output.log">
+            <hlm:imakerconfigurationset>
+                <hlm:imakerconfiguration>
+                    <makefileset>
+                        <include name="**/product/*ui.mk" />
+                    </makefileset>
+                    <targetset>
+                        <include name="core" />
+                        <include name="langpack_\d+" />
+                    </targetset>
+                    <variablegroup>
+                        <variable name="TYPE" value="rnd" />
+                    </variablegroup>
+                    <variablegroup>
+                        <variable name="TYPE" value="prd" />
+                    </variablegroup>
+                </hlm:imakerconfiguration>
+            </hlm:imakerconfigurationset>
+        </hlm:imaker>
+        <au:assertFileExists file="${epocroot.temp}/output.log" />
+    </target>
+
+    <target name="test-imaker-imakerconfiguration-variablegroup-refid">
+        <hlm:imakerconfigurationset id="config">
+            <hlm:imakerconfiguration>
+                <makefileset>
+                    <include name="**/product/*ui.mk" />
+                </makefileset>
+                <targetset>
+                    <include name="core" />
+                    <include name="langpack_\d+" />
+                </targetset>
+                <variablegroup>
+                    <variable name="TYPE" value="rnd" />
+                </variablegroup>
+                <variablegroup>
+                    <variable name="TYPE" value="prd" />
+                </variablegroup>
+            </hlm:imakerconfiguration>
+        </hlm:imakerconfigurationset>
+        <hlm:imaker epocroot="${epocroot}" output="${epocroot.temp}/output.log">
+            <hlm:imakerconfigurationset refid="config"/>
+        </hlm:imaker>
+        <au:assertFileExists file="${epocroot.temp}/output.log" />
+        <au:assertLogDoesntContain text="Nothing to build" />
+    </target>
+
+    <target name="test-imaker-imakerconfiguration-variablegroup-refid-subconfig">
+        <hlm:imakerconfiguration id="subconfig">
+            <makefileset>
+                <include name="**/product/*ui.mk" />
+            </makefileset>
+            <targetset>
+                <include name="core" />
+                <include name="langpack_\d+" />
+            </targetset>
+            <variablegroup>
+                <variable name="TYPE" value="rnd" />
+            </variablegroup>
+            <variablegroup>
+                <variable name="TYPE" value="prd" />
+            </variablegroup>
+        </hlm:imakerconfiguration>
+        <hlm:imakerconfigurationset id="config">
+            <hlm:imakerconfiguration refid="subconfig" />
+        </hlm:imakerconfigurationset>
+        <hlm:imaker epocroot="${epocroot}" output="${epocroot.temp}/output.log">
+            <hlm:imakerconfigurationset refid="config"/>
+        </hlm:imaker>
+        <au:assertFileExists file="${epocroot.temp}/output.log" />
+        <au:assertLogDoesntContain text="Nothing to build" />
+    </target>
+
+    <target name="test-imaker-imakerconfiguration-variablegroup-product">
+        <hlm:imaker epocroot="${epocroot}" output="${epocroot.temp}/output.log">
+            <hlm:imakerconfiguration>
+                <hlm:product list="product" ui="true" />
+                <targetset>
+                    <include name="core" />
+                    <include name="langpack_\d+" />
+                </targetset>
+                <variablegroup>
+                    <variable name="TYPE" value="rnd" />
+                </variablegroup>
+                <variablegroup>
+                    <variable name="TYPE" value="prd" />
+                </variablegroup>
+            </hlm:imakerconfiguration>
+        </hlm:imaker>
+        <au:assertFileExists file="${epocroot.temp}/output.log" />
+        <au:assertLogDoesntContain text="Nothing to build" />
+    </target>
+
+    <target name="test-imaker-imakerconfiguration-variablegroup-product-invalid">
+        <au:expectfailure message="Could not find a valid configuration for product_invalid">
+            <hlm:imaker epocroot="${epocroot}" output="${epocroot.temp}/output.log">
+                <hlm:imakerconfiguration>
+                    <hlm:product list="product_invalid" ui="true" />
+                    <targetset>
+                        <include name="core" />
+                        <include name="langpack_\d+" />
+                    </targetset>
+                    <variablegroup>
+                        <variable name="TYPE" value="rnd" />
+                    </variablegroup>
+                    <variablegroup>
+                        <variable name="TYPE" value="prd" />
+                    </variablegroup>
+                </hlm:imakerconfiguration>
+            </hlm:imaker>
+        </au:expectfailure>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.log" />
+    </target>
+
+    <target name="test-imaker-imakerconfiguration-variablegroup-product-invalid-notfail">
+        <hlm:imaker epocroot="${epocroot}" output="${epocroot.temp}/output.log">
+            <hlm:imakerconfiguration>
+                <hlm:product list="product_invalid" ui="true" failonerror="false" />
+                <targetset>
+                    <include name="core" />
+                    <include name="langpack_\d+" />
+                </targetset>
+                <variablegroup>
+                    <variable name="TYPE" value="rnd" />
+                </variablegroup>
+                <variablegroup>
+                    <variable name="TYPE" value="prd" />
+                </variablegroup>
+            </hlm:imakerconfiguration>
+        </hlm:imaker>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.log" />
+        <au:assertLogContains text="Could not find a valid configuration for product_invalid" />
+        <au:assertLogContains text="Nothing to build." />
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/antunit/test_imaker_invalid.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_imaker_invalid.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-imaker-invalid-unittest" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib imaker unittests.</description>
+
+    <taskdef resource="com/nokia/helium/imaker/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+    <property name="epocroot" location="${basedir}/../epocroot_invalid" />
+    <property name="epocroot.temp" location="${epocroot}/temp" />
+
+    <!-- is called prior to the test -->
+    <target name="setUp">
+        <echo>-------------------------------------------------------------------------------</echo>
+        <delete dir="${epocroot.temp}" failonerror="false" />
+        <delete dir="${epocroot}/epoc32" failonerror="false" />
+        <mkdir dir="${epocroot.temp}" />
+    </target>
+
+    <!-- is called after the test, even if that caused an error -->
+    <target name="tearDown">
+        <delete dir="${epocroot.temp}" failonerror="false" />
+        <delete dir="${epocroot}/epoc32" failonerror="false" />
+        <echo>-------------------------------------------------------------------------------</echo>
+    </target>
+
+    <target name="test-imaker-imakerconfiguration-targetset">
+        <au:expectfailure message="(return code: 1)">
+            <hlm:imaker epocroot="${epocroot}" output="${epocroot.temp}/output.log">
+                <hlm:imakerconfigurationset>
+                    <hlm:imakerconfiguration>
+                        <makefileset>
+                            <include name="**/product/*ui.mk" />
+                        </makefileset>
+                        <targetset>
+                            <include name="core" />
+                            <include name="langpack_\d+" />
+                        </targetset>
+                    </hlm:imakerconfiguration>
+                </hlm:imakerconfigurationset>
+            </hlm:imaker>
+        </au:expectfailure>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.log" />
+    </target>
+
+    <target name="test-imaker-imakerconfiguration-targetset-failonerror-false">
+        <hlm:imaker epocroot="${epocroot}" output="${epocroot.temp}/output.log" failonerror="false">
+            <hlm:imakerconfigurationset>
+                <hlm:imakerconfiguration>
+                    <makefileset>
+                        <include name="**/product/*ui.mk" />
+                    </makefileset>
+                    <targetset>
+                        <include name="core" />
+                        <include name="langpack_\d+" />
+                    </targetset>
+                </hlm:imakerconfiguration>
+            </hlm:imakerconfigurationset>
+        </hlm:imaker>
+        <au:assertLogContains text="*** No rule to make target" />
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.log" />
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/antunit/test_javaengine.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_javaengine.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-imaker-javaengine-unittest" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib imaker unittests.</description>
+
+    <taskdef resource="com/nokia/helium/imaker/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+    <property name="epocroot" location="${basedir}/../epocroot_task" />
+    <property name="epocroot.temp" location="${epocroot}/temp" />
+
+    <!-- is called prior to the test -->
+    <target name="setUp">
+        <echo>-------------------------------------------------------------------------------</echo>
+        <delete dir="${epocroot.temp}" failonerror="false" />
+        <delete dir="${epocroot}/epoc32" failonerror="false" />
+        <mkdir dir="${epocroot.temp}" />
+    </target>
+
+    <!-- is called after the test, even if that caused an error -->
+    <target name="tearDown">
+        <delete dir="${epocroot.temp}" failonerror="false" />
+        <delete dir="${epocroot}/epoc32" failonerror="false" />
+        <echo>-------------------------------------------------------------------------------</echo>
+    </target>
+
+    <target name="test-imaker-defaultconfig">
+        <hlm:defaultEngine id="imaker.default" threads="1"/>
+        <hlm:imaker epocroot="${epocroot}" 
+            output="${epocroot.temp}/output.log"
+            engineRefId="imaker.default">
+            <hlm:imakerconfiguration>
+                <makefileset>
+                    <include name="**/product/*ui.mk" />
+                </makefileset>
+                <targetset>
+                    <include name="core" />
+                    <include name="langpack_\d+" />
+                </targetset>
+            </hlm:imakerconfiguration>
+        </hlm:imaker>
+        <au:assertFileExists file="${epocroot.temp}/output.log" />
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/bld.sh	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,25 @@
+#!/bin/csh
+
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+
+module load java/1.6.0
+module load mercurial
+export PATH=$PATH:.
+setenv ANT_ARGS "-lib ../lib -lib ../../lib -lib ../../core/lib -lib ../../bin/helium-core.jar -lib ../../bin/helium-imaker.jar -lib ../../antlibs"
+ant $*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/build.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,27 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set ANT_ARGS=-lib %CD%\..\lib -lib %CD%\..\..\lib -lib %CD%\..\..\bin\helium-core.jar -lib %CD%\..\..\bin\helium-imaker.jar -lib %CD%\..\..\antlibs
+ant %*
+endlocal
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-unittest" xmlns:au="antlib:org.apache.ant.antunit">
+    <description>Helium Antlib Sysdef unittests.</description>
+
+    
+    <import file="../../test-macros.ant.xml" />
+
+    <target name="unittest" depends="unittest-imaker" />
+
+    <target name="unittest-imaker">
+        <antunitModule name="imaker" />
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/emake_data/cust.mk.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,30 @@
+<#--
+============================================================================ 
+Name        : cust.mk.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+java_home:${java_home}
+java_utils_classpath:${java_utils_classpath}
+makefile:${makefile}
+<#list cmdSets as cmds>
+Group:
+    <#list cmds as cmd>
+    + <#list cmd.getArguments() as arg>${arg} </#list>${cmd.getTarget()}
+    </#list>
+</#list>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/emake_data/invalid.mk.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,31 @@
+<#--
+============================================================================ 
+Name        : invalid.mk.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+java_home:${java_home}
+java_utils_classpath:${java_utils_classpath}
+makefile:${makefile}
+<#list cmdSets as cmds>
+Group:
+    <#list cmds as cmd>
+    + <#list cmd.getArguments() as arg>${arg} </#list>${cmd.getTarget()}
+    </#list>
+<#-- The next line is meant to be invalid! -->
+</list>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/epocroot/imaker	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,18 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+python imaker_mock.p $*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/epocroot/imaker.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,19 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+@python imaker_mock.py %*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/epocroot/imaker_mock.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,69 @@
+#============================================================================ 
+#Name        : imaler_mock.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import sys
+print "iMaker 09.24.01, 10-Jun-2009."
+
+if sys.argv.count("version"):
+    print ""
+    sys.exit(0)
+
+if sys.argv.count("help-target-*-list") and sys.argv.count("/epoc32/rom/config/platform/product/image_conf_invalid.mk"):
+    print """mingw_make: /epoc32/rom/config/platform/product/image_conf_invalid.mk: No such file or directory
+mingw_make: *** No rule to make target `/epoc32/rom/config/platform/product/image_conf_invalid.mk'.  Stop.
+*** Error: Command `\epoc32\tools\rom\imaker\mingw_make.exe -R --no-print-directory SHELL="C:\WINNT\system32\cmd.exe" -I
+ B:/epoc32/rom/config -f B:/epoc32/tools/rom/imaker/imaker.mk TIMESTAMP=2009102317302243    -f /epoc32/rom/config/platform/
+product/image_conf_invalid.mk  -f B:/epoc32/tools/rom/imaker/imaker.mk help-target-*-list' failed in `/'.
+"""
+    sys.exit(1)
+
+if sys.argv.count("help-config"):
+    print "Finding available configuration file(s):"
+    print "/epoc32/rom/config/platform/product/image_conf_product.mk"
+    print "/epoc32/rom/config/platform/product/image_conf_product_ui.mk"
+    print ""
+    sys.exit(0)
+
+if sys.argv.count("help-target-*-list"):
+    # start with some kind of warnings...
+    print "B:/epoc32/tools/rom/imaker/imaker_help.mk:55: memory_map_settings2.hrh: No such file or directory"
+    print "all"
+    print "core"
+    print "core-dir"
+    print "help-%-list"
+    print "langpack_01"
+    print ""
+    sys.exit(0)
+
+if sys.argv.count("-f") and sys.argv.count("print-VARIABLE"):
+    print "VARIABLE = `PRODUCT_VALUE'"
+    print ""
+    sys.exit(0)
+
+if sys.argv.count("print-VARIABLE"):
+    print "VARIABLE = `VALUE'"
+    print ""
+    sys.exit(0)
+
+if sys.argv.count("print-NOTEXISTSVARIABLE"):
+    print ""
+    sys.exit(0)
+
+print ""
+sys.exit(0)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/epocroot_invalid/imaker	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,18 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+python imaker_mock.p $*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/epocroot_invalid/imaker.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,19 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+@python imaker_mock.py %*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/epocroot_invalid/imaker_mock.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,28 @@
+#============================================================================ 
+#Name        : imaler_mock.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import sys
+print "iMaker 09.24.01, 10-Jun-2009."
+sys.stderr.write("""mingw_make: /epoc32/rom/config/platform/product/image_conf_invalid.mk: No such file or directory
+mingw_make: *** No rule to make target `/epoc32/rom/config/platform/product/image_conf_invalid.mk'.  Stop.
+*** Error: Command `\epoc32\tools\rom\imaker\mingw_make.exe -R --no-print-directory SHELL="C:\WINNT\system32\cmd.exe" -I
+ B:/epoc32/rom/config -f B:/epoc32/tools/rom/imaker/imaker.mk TIMESTAMP=2009102317302243    -f /epoc32/rom/config/platform/
+product/image_conf_invalid.mk  -f B:/epoc32/tools/rom/imaker/imaker.mk help-target-*-list' failed in `/'.
+""")
+sys.exit(1)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/epocroot_task/emake	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,18 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+echo $*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/epocroot_task/emake.cmd	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,21 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+echo %*
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/epocroot_task/imaker	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,18 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+python imaker_mock.p $*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/epocroot_task/imaker.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,19 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+@python imaker_mock.py %*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/epocroot_task/imaker_mock.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,167 @@
+#============================================================================ 
+#Name        : imaler_mock.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import sys
+print "iMaker 09.24.01, 10-Jun-2009."
+
+if sys.argv.count("version"):
+    print ""
+    sys.exit(0)
+
+# two product supported by the mock
+if sys.argv.count("help-config"):
+    print "Finding available configuration file(s):"
+    print "/epoc32/rom/config/platform/product/image_conf_product.mk"
+    print "/epoc32/rom/config/platform/product/image_conf_product_ui.mk"
+    print ""
+    sys.exit(0)
+
+# List of targets
+if sys.argv.count("help-target-*-list"):
+    # start with some kind of warnings...
+    print "all"
+    print "core"
+    print "core-dir"
+    print "help-%-list"
+    print "langpack_01"
+    print ""
+    sys.exit(0)
+
+
+
+
+def print_log(log):
+    for line in log:
+        print line
+
+
+core_log = ["iMaker 09.42.01, 13-Oct-2009.", 
+"Generating content with ConE",
+"* Writing tmp2.oby - result of substitution phase",
+"* Writing tmp3.oby - result of reorganisation phase",
+"* Writing tmp4.oby - result of Plugin stage",
+"* Writing tmp5.oby - result of choosing language-specific files",
+"* Writing tmp7.oby - result of problem-suppression phase",
+"* Writing tmp8.oby - result of bitmap conversion phase",
+"* Removing previous image and logs...",
+"* Writing tmp9.oby - result of cleaning phase",
+"* Writing NAME_VERSION04_rnd.oby - final OBY file",
+"* Writing NAME_VERSION04_rnd.rom.oby - final OBY file",
+"* Writing NAME_VERSION04_rnd.dir - ROM directory listing",
+"-------------------------------------------------------------------------------",
+"Total duration: 01:42  Status: OK",
+"===============================================================================",
+]
+
+if sys.argv.count("core"):
+    print_log(core_log)
+    print ""
+    sys.exit(0)
+
+rof2_log = ["iMaker 09.42.01, 13-Oct-2009.", 
+"Generating content with ConE",
+"Variant target             USE_VARIANTBLD = `2'",
+"Variant directory          VARIANT_DIR    = `/output/release_flash_images/product/rnd/langpack/langpack_01/rofs2/temp/cone'",
+"Variant config makefile    VARIANT_MK     = `/output/release_flash_images/product/rnd/langpack/langpack_01/rofs2/temp/cone/language_variant.mk'",
+"Variant include directory  VARIANT_INCDIR = `/output/release_flash_images/product/rnd/langpack/langpack_01/rofs2/temp/cone/include'",
+"Variant SIS directory      VARIANT_SISDIR = -",
+"Variant operator cache dir VARIANT_OPCDIR = -",
+"Variant widget preinst dir VARIANT_WGZDIR = -",
+"Variant zip content dir    VARIANT_ZIPDIR = -",
+"Variant copy content dir   VARIANT_CPDIR  = `/output/release_flash_images/product/rnd/langpack/langpack_01/rofs2/temp/cone/content'",
+"Variant output directory   VARIANT_OUTDIR = `/output/release_flash_images/product/rnd/langpack/langpack_01/rofs2/variant'",
+"Generating oby(s) for Variant image creation",
+"Copying copy content directory",
+"Generating Feature manager file(s)",
+"Generating file(s) for ROFS2 image creation",
+"Generating language files for Language Package image creation",
+"Creating ROFS2 SOS image",
+"",
+"ROM_IMAGE[0] non-xip size=0x00000000 xip=0 compress=0 extension=0 composite=none uncompress=0", 
+"ROM_IMAGE[1] dummy1 size=0x10000000 xip=0 compress=0 extension=0 composite=none uncompress=0 ",
+"ROM_IMAGE[2] rofs2 size=0x10000000 xip=0 compress=0 extension=0 composite=none uncompress=0 ",
+"ROM_IMAGE[3] dummy3 size=0x10000000 xip=0 compress=0 extension=0 composite=none uncompress=0 ",
+"* Writing tmp2.oby - result of substitution phase",
+"* Writing tmp3.oby - result of reorganisation phase",
+"* Writing tmp4.oby - result of Plugin stage",
+"* Writing tmp5.oby - result of choosing language-specific files",
+"Created ecom-2-0.spi",
+"Created ecom-2-1.s06",
+"Created ecom-2-2.s15",
+"Created ecom-2-3.s07",
+"Created ecom-2-4.s08",
+"Created ecom-2-5.s09",
+"Created ecom-2-6.s01",
+"* Writing tmp6.oby - result of SPI stage",
+"override.pm: ------------------------------------------------------------------",
+"Handling overrides...Replace ROM_IMAGE[2] `data=\epoc32\data\Z\Resource\bootdata\languages.txt   resource\Bootdata\languages.txt' with `data=I:/output/release_flash_images/product/rnd/langpack/langpack_01/rofs2/NAME_VERSION04_rnd_rofs2_languages.txt  resource\Bootdata\languages.txt'",
+"Replace ROM_IMAGE[2] `data=\epoc32\data\Z\Resource\versions\lang.txt        resource\versions\lang.txt' with `data=I:/output/release_flash_images/product/rnd/langpack/langpack_01/rofs2/NAME_VERSION04_rnd_rofs2_lang.txt  resource\versions\lang.txt'",
+"Replace ROM_IMAGE[2] `data=\epoc32\data\Z\Resource\versions\langsw.txt        resource\versions\langsw.txt' with `data=I:/output/release_flash_images/product/rnd/langpack/langpack_01/rofs2/NAME_VERSION04_rnd_rofs2_langsw.txt  resource\versions\langsw.txt'",
+"override.pm: Duration: 1 seconds ----------------------------------------------",
+"obyparse.pm: ------------------------------------------------------------------",
+"Finding include hierarchy from tmp1.oby",
+"Found 730 different include files",
+"Finding SPI input files from tmp5.oby",
+"Found 103 SPI input files",
+"Reading UDEB files from /epoc32/rombuild/mytraces.txt",
+"Found 0 entries",
+"Finding ROM-patched components",
+"Found 0 ROM-patched components",
+"obyparse.pm: Duration: 2 seconds ----------------------------------------------",
+"* Writing tmp7.oby - result of problem-suppression phase",
+"* Writing tmp8.oby - result of bitmap conversion phase",
+"* Removing previous image and logs...",
+"* Writing tmp9.oby - result of cleaning phase",
+"* Writing NAME_VERSION04_rnd.oby - final OBY file",
+"* Writing NAME_VERSION04_rnd.rofs2.oby - final OBY file",
+"* Writing NAME_VERSION04_rnd.dir - ROM directory listing",
+"* Executing rofsbuild -slog -loglevel1     NAME_VERSION04_rnd.rofs2.oby",
+"The number of processors (4) is used as the number of concurrent jobs.",
+"",
+"ROFSBUILD - Rofs/Datadrive image builder V2.6.3",
+"Copyright (c) 1996-2009 Nokia Corporation.",
+"",
+"WARNING: Unknown keyword 'OM_IMAGE[0]'.  Line 31 ignored",
+"WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 2464 ignored",
+"WARNING: Unknown keyword 'OM_IMAGE[0]'.  Line 31 ignored",
+"WARNING: Unknown keyword '-----------------------------------------------------------'.  Line 2464 ignored",
+"* rofsbuild failed",
+"",
+"*** Error: (S:ROFS2,C:1,B:1,K:0,V:1): Command `buildrom -loglevel1 -v -nosymbols -DFEATUREVARIANT=product -fm=/epoc32/include/s60regionalfeatures.xml -es60ibymacros -elocalise -oNAME_VERSION04_rnd.img I:/output/release_flash_images/product/rnd/langpack/langpack_01/rofs2/NAME_VERSION04_rnd_rofs2_master.oby' failed (1) in `/output/release_flash_images/product/rnd/langpack/langpack_01/rofs2'.",
+"===============================================================================",
+"Target: langpack_01  Duration: 01:40  Status: FAILED",
+"ConE output dir = `/output/release_flash_images/product/rnd/langpack/langpack_01/rofs2/temp/cone'",
+"ConE log file   = `/output/release_flash_images/product/rnd/langpack/langpack_01/rofs2/NAME_VERSION04_rnd_cone_langpack_01.log'",
+"ROFS2 dir       = `/output/release_flash_images/product/rnd/langpack/langpack_01/rofs2'",
+"ROFS2 symbols   = `/output/release_flash_images/product/rnd/langpack/langpack_01/rofs2/NAME_VERSION04_rnd.rofs2.symbol'",
+"ROFS2 flash     = `/output/release_flash_images/product/rnd/langpack/langpack_01/NAME_VERSION04_rnd.rofs2.fpsx'",
+"-------------------------------------------------------------------------------",
+"Total duration: 01:42  Status: FAILED",
+"===============================================================================",
+]
+
+if sys.argv.count("langpack_01"):
+    print_log(rof2_log)
+    sys.stderr.write("*** Error: (S:ROFS2,C:1,B:1,K:0,V:1): Command `buildrom -loglevel1 -v -nosymbols -DFEATUREVARIANT=product -fm=/epoc32/include/s60regionalfeatures.xml -es60ibymacros -elocalise -oNAME_VERSION04_rnd.img /output/release_flash_images/product/rnd/langpack/langpack_01/rofs2/NAME_VERSION04_rnd_rofs2_master.oby' failed (1) in `/output/release_flash_images/product/rnd/langpack/langpack_01/rofs2'.\n")
+    print ""
+    sys.exit(1)
+
+
+print ""
+sys.exit(0)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/parallelexecutor_data/linux.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,2 @@
+ls -l
+ls -l
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/parallelexecutor_data/windows.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,2 @@
+cmd /c dir
+cmd /c dir
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/src/com/nokia/helium/imaker/tests/TestHelpConfigStreamConsumer.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker.tests;
+
+import java.io.File;
+
+import org.junit.*;
+
+import com.nokia.helium.imaker.HelpConfigStreamConsumer;
+
+import static org.junit.Assert.*;
+
+/**
+ * Test the HelpTargetStreamConsumer.
+ *
+ */
+public class TestHelpConfigStreamConsumer {
+
+    /**
+     * Checking if the consumer is parsing correctly the output. 
+     */
+    @Test
+    public void introspectConfiguration() {
+        HelpConfigStreamConsumer consumer = new HelpConfigStreamConsumer();
+        consumer.consumeLine("iMaker 09.24.01, 10-Jun-2009.");
+        consumer.consumeLine("Finding available configuration file(s):");
+        consumer.consumeLine("/epoc32/rom/config/platform/product/image_conf_product.mk");
+        consumer.consumeLine("/epoc32/rom/config/platform/product/image_conf_product_ui.mk");
+        consumer.consumeLine("");
+        
+        // Verifying string output
+        String[] expected = new String[2];
+        expected[0] = "/epoc32/rom/config/platform/product/image_conf_product.mk";
+        expected[1] = "/epoc32/rom/config/platform/product/image_conf_product_ui.mk";
+        assertArrayEquals(expected, consumer.getConfigurations().toArray(new String[2]));
+
+        // Verifying the file output
+        File[] expectedFile = new File[2];
+        expectedFile[0] = new File(new File("."), "/epoc32/rom/config/platform/product/image_conf_product.mk");
+        expectedFile[1] = new File(new File("."), "/epoc32/rom/config/platform/product/image_conf_product_ui.mk");
+        assertArrayEquals(expectedFile, consumer.getConfigurations(new File(".")).toArray(new File[2]));
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/src/com/nokia/helium/imaker/tests/TestIMaker.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,141 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker.tests;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.nokia.helium.imaker.IMaker;
+import com.nokia.helium.imaker.IMakerException;
+
+/**
+ * Testing IMaker class.
+ */
+public class TestIMaker {
+
+    private File epocroot = new File(System.getProperty("testdir"), "tests/epocroot");
+
+    /**
+     * Test the getVersion is retrieving the output from imaker correctly.
+     * @throws IMakerException
+     */
+    @Test
+    public void testGetVersion() throws IMakerException {
+        String expectedVersion = "iMaker 09.24.01, 10-Jun-2009.";
+        IMaker imaker = new IMaker(epocroot);
+        assertEquals(expectedVersion, imaker.getVersion());
+    }
+
+    /**
+     * Test the introspection of an existing variable.
+     * @throws IMakerException
+     */
+    @Test
+    public void testGetVariable() throws IMakerException {
+        IMaker imaker = new IMaker(epocroot);
+        assertEquals("VALUE", imaker.getVariable("VARIABLE"));
+    }
+    
+    /**
+     * Test the introspection of an existing variable.
+     * @throws IMakerException
+     */
+    @Test
+    public void testGetVariableFromConfiguration() throws IMakerException {
+        IMaker imaker = new IMaker(epocroot);
+        assertEquals("PRODUCT_VALUE", imaker.getVariable("VARIABLE", new File("/epoc32/rom/config/platform/product/image_conf_product.mk")));
+    }
+
+    /**
+     * Test the introspection of a non-existing variable.
+     * @throws IMakerException
+     */
+    @Test
+    public void testGetNotExistingVariable() throws IMakerException {
+        IMaker imaker = new IMaker(epocroot);
+        assertEquals(null, imaker.getVariable("NOTEXISTINGVARIABLE"));
+    }
+    
+    /**
+     * Test the introspection of existing configurations.
+     * @throws IMakerException
+     */
+    @Test
+    public void testGetConfigurations() throws IMakerException {
+        IMaker imaker = new IMaker(epocroot);
+        String[] expected = new String[2];
+        expected[0] = "/epoc32/rom/config/platform/product/image_conf_product.mk";
+        expected[1] = "/epoc32/rom/config/platform/product/image_conf_product_ui.mk";
+        assertArrayEquals(expected, imaker.getConfigurations().toArray(new String[2]));
+    }
+    
+    /**
+     * Test the introspection of existing target for a configuration.
+     * @throws IMakerException
+     */
+    @Test
+    public void testGetTargets() throws IMakerException {
+        IMaker imaker = new IMaker(epocroot);
+        List<String> targets = imaker.getTargets("/epoc32/rom/config/platform/product/image_conf_product.mk");
+        
+        String[] expected = new String[5];
+        expected[0] = "all";
+        expected[1] = "core";
+        expected[2] = "core-dir";
+        expected[3] = "help-%-list";
+        expected[4] = "langpack_01";
+        assertArrayEquals(expected, targets.toArray(new String[5]));
+    }
+
+    /**
+     * Test the introspection of existing target for a configuration using file
+     * object.
+     * @throws IMakerException
+     */
+    @Test
+    public void testGetTargetsFromFile() throws IMakerException {
+        IMaker imaker = new IMaker(epocroot);
+        List<String> targets = imaker.getTargets(new File("/epoc32/rom/config/platform/product/image_conf_product.mk"));
+        
+        String[] expected = new String[5];
+        expected[0] = "all";
+        expected[1] = "core";
+        expected[2] = "core-dir";
+        expected[3] = "help-%-list";
+        expected[4] = "langpack_01";
+        assertArrayEquals(expected, targets.toArray(new String[5]));
+    }
+    
+    /**
+     * Test the introspection of existing target for a configuration.
+     * @throws IMakerException
+     */
+    @Test
+    public void testGetTargetsWithInvalidProductConf() throws IMakerException {
+        IMaker imaker = new IMaker(epocroot);
+        try {
+            imaker.getTargets("/epoc32/rom/config/platform/product/image_conf_invalid.mk");
+            fail("We should catch a failure from iMaker.");
+        } catch(IMakerException e) {
+            // Exception should be raised
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/src/com/nokia/helium/imaker/tests/TestParallelExecutor.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,53 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker.tests;
+
+import java.io.File;
+import org.junit.Test;
+import com.nokia.helium.imaker.utils.ParallelExecutor;
+
+/**
+ * Basic testing of the ParallelExecutor
+ *
+ */
+public class TestParallelExecutor {
+	private File testdir = new File(System.getProperty("testdir"));
+	
+	/**
+	 * Nothing should happen.
+	 */
+	@Test
+	public void executionWithNoArgs() {
+		String args[] = new String[0];
+		ParallelExecutor.main(args);
+	}
+
+	/**
+	 * Will list current directory content twice.
+	 */
+	@Test
+	public void executionWithTextFile() {
+		String args[] = new String[1];
+        if (System.getProperty("os.name").toLowerCase().startsWith("win")) {
+        	args[0] = new File(testdir, "tests/parallelexecutor_data/windows.txt").getAbsolutePath();
+        } else {
+        	args[0] = new File(testdir, "tests/parallelexecutor_data/linux.txt").getAbsolutePath();
+        }
+		ParallelExecutor.main(args);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/imaker/tests/src/com/nokia/helium/imaker/tests/TestPrintVarStreamConsumer.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.imaker.tests;
+
+import org.junit.*;
+
+import com.nokia.helium.imaker.PrintVarSteamConsumer;
+
+import static org.junit.Assert.*;
+
+public class TestPrintVarStreamConsumer {
+
+    @Test
+    public void readSimpleVar() {
+        PrintVarSteamConsumer consumer = new PrintVarSteamConsumer("WORKDIR");
+        consumer.consumeLine("iMaker 09.24.01, 10-Jun-2009.");
+        consumer.consumeLine("WORKDIR = `/.'");
+        consumer.consumeLine("");
+        assertEquals(consumer.getValue(), "/.");
+    }
+
+    @Test
+    public void readMultilineVar() {
+        PrintVarSteamConsumer consumer = new PrintVarSteamConsumer("LONGVAR");
+        consumer.consumeLine("iMaker 09.24.01, 10-Jun-2009.");
+        consumer.consumeLine("LONGVAR = `some text");
+        consumer.consumeLine("second line");
+        consumer.consumeLine("end of text'");
+        consumer.consumeLine("");
+        assertEquals(consumer.getValue(), "some text\nsecond line\nend of text");
+    }
+}
Binary file buildframework/helium/external/helium-antlib/lib/dom4j-1.6.1.jar has changed
Binary file buildframework/helium/external/helium-antlib/lib/plexus-utils-1.5.6.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/bld.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,60 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+
+REM Configure Ant 
+if not defined TESTED_ANT_HOME (
+set TESTED_ANT_HOME=C:\Apps\ant_1.7
+) 
+if exist %TESTED_ANT_HOME% (set ANT_HOME=%TESTED_ANT_HOME%)
+
+REM Configure the expected Ant Version details below
+SET expMajorVer=1
+SET expMinorVer=7
+
+rem *** Verify Ant Version ***
+rem -- Run the 'ant -version' command and capture the output to a variable 
+for /f "tokens=*" %%a in ('ant -version') do (set antversion=%%a)
+echo *** Installed Version : %antversion%
+
+rem -- Parse the version string obtained above and get the version number
+for /f "tokens=4 delims= " %%a in ("%antversion%") do set val=%%a
+rem -- Parse the version number delimiting the '.' and set the major and
+rem    minor versions
+for /f "tokens=1-2 delims=." %%a in ("%val%") do (
+set /A majorVersion=%%a
+set /A minorVersion=%%b
+)
+rem -- Check whether major version is greater than or equal to the expected.
+if %majorVersion% geq %expMajorVer% ( 
+rem -- if major version is valid, check minor version. If minor version is less
+rem    than expected display message and abort the execution.
+if %minorVersion% lss %expMinorVer% (echo *** Incorrect version of Ant found. Please check you have atleast Ant 1.7.0 & goto :errorstop ) 
+)
+
+ant %*
+endlocal
+
+:errorstop
+@echo *** Build aborted with error
+exit /b 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-logging">
+    <description>Helium Antlib logging.</description>
+    
+    <import file="../macros.ant.xml"/>
+    
+    <property name="name" value="logging"/>
+    
+    <import file="../core/build.xml"/>
+    
+    <path id="helium.logging.classpath">
+        <fileset dir="${helium.antlib.root.dir}/bin" includes="helium-logging.jar"/>
+    </path>
+
+</project>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/antlib.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : antlib.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<antlib>
+    <!-- Task definition -->
+    <taskdef name="record" classname="com.nokia.helium.logger.ant.taskdefs.LogRecorder"/>
+    <taskdef name="logreplace" classname="com.nokia.helium.logger.ant.taskdefs.LogReplace"/>
+    
+    <!-- Type definition -->
+    <typedef name="stagerecord" classname="com.nokia.helium.logger.ant.types.StageLogging"/>
+    <typedef name="stage" classname="com.nokia.helium.logger.ant.types.Stage"/>
+    <typedef name="stagesummary" classname="com.nokia.helium.logger.ant.types.StageSummary"/>
+    <typedef name="recordfilterset" classname="com.nokia.helium.logger.ant.types.RecordFilterSet"/>
+    
+</antlib>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/helium.antlib.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : helium.antlib.xml 
+Part of     : Helium Antlib 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="libs-logging" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Ant task definition declarations.
+    </description>    
+    <taskdef resource="com/nokia/helium/logger/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/AntLogRecorderEntry.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,408 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.logger.ant.listener;
+
+import java.io.PrintStream;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildLogger;
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.SubBuildListener;
+import org.apache.tools.ant.util.StringUtils;
+import org.apache.tools.ant.BuildException;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Vector;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * This is a class that represents a recorder. This is the listener to the
+ * build process.
+ *
+ * @since Ant 1.4
+ */
+public class AntLogRecorderEntry implements BuildLogger, SubBuildListener {
+
+    //////////////////////////////////////////////////////////////////////
+    // ATTRIBUTES
+
+    /** The name of the file associated with this recorder entry.  */
+    private String filename;
+    /** The state of the recorder (recorder on or off).  */
+    private boolean record = true;
+    /** The current verbosity level to record at.  */
+    private int loglevel = Project.MSG_INFO;
+    /** The output PrintStream to record to.  */
+    private PrintStream out;
+    /** The start time of the last know target.  */
+    private long targetStartTime;
+    /** Strip task banners if true.  */
+    private boolean emacsMode;
+    /** project instance the recorder is associated with */
+    private Project project;
+    
+    private Pattern pattern;
+    
+    private Vector<String> logRegExps = new Vector<String>();
+    
+    
+    //////////////////////////////////////////////////////////////////////
+    // CONSTRUCTORS / INITIALIZERS
+
+    /**
+     * @param name The name of this recorder (used as the filename).
+     */
+    public AntLogRecorderEntry(String name) {
+        targetStartTime = System.currentTimeMillis();
+        filename = name;
+    }
+
+    //////////////////////////////////////////////////////////////////////
+    // ACCESSOR METHODS
+
+    /**
+     * @return the name of the file the output is sent to.
+     */
+    public String getFilename() {
+        return filename;
+    }
+
+    /**
+     * Turns off or on this recorder.
+     *
+     * @param state true for on, false for off, null for no change.
+     */
+    public void setRecordState(Boolean state) {
+        if (state != null) {
+            flush();
+            record = state.booleanValue();
+        }
+    }
+    
+    /**
+     * To set the regexp to filter the logging.
+     * @param regexp
+     */
+    public void addRegexp(String regexp) {
+        logRegExps.add(regexp);
+    }
+    
+    /**
+     * To clear all regexp set.
+     */
+    public void resetRegExp() { 
+        logRegExps.clear();
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#buildStarted(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void buildStarted(BuildEvent event) {
+        log("> BUILD STARTED", Project.MSG_DEBUG);
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#buildFinished(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void buildFinished(BuildEvent event) {
+        log("< BUILD FINISHED", Project.MSG_DEBUG);
+
+        if (record && out != null) {
+            Throwable error = event.getException();
+
+            if (error == null) {
+                out.println(StringUtils.LINE_SEP + "BUILD SUCCESSFUL");
+            } else {
+                out.println(StringUtils.LINE_SEP + "BUILD FAILED"
+                            + StringUtils.LINE_SEP);
+                error.printStackTrace(out);
+            }
+        }
+        cleanup();
+    }
+
+    /**
+     * Cleans up any resources held by this recorder entry at the end
+     * of a subbuild if it has been created for the subbuild's project
+     * instance.
+     *
+     * @param event the buildFinished event
+     *
+     * @since Ant 1.6.2
+     */
+    public void subBuildFinished(BuildEvent event) {
+        if (event.getProject() == project) {
+            cleanup();
+        }
+    }
+
+    /**
+     * Empty implementation to satisfy the BuildListener interface.
+     *
+     * @param event the buildStarted event
+     *
+     * @since Ant 1.6.2
+     */
+    public void subBuildStarted(BuildEvent event) {
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#targetStarted(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void targetStarted(BuildEvent event) {
+        log(">> TARGET STARTED -- " + event.getTarget(), Project.MSG_DEBUG);
+        log(StringUtils.LINE_SEP + event.getTarget().getName() + ":",
+            Project.MSG_INFO);
+        targetStartTime = System.currentTimeMillis();
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#targetFinished(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void targetFinished(BuildEvent event) {
+        log("<< TARGET FINISHED -- " + event.getTarget(), Project.MSG_DEBUG);
+
+        String time = formatTime(System.currentTimeMillis() - targetStartTime);
+
+        log(event.getTarget() + ":  duration " + time, Project.MSG_VERBOSE);
+        flush();
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#taskStarted(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void taskStarted(BuildEvent event) {
+        log(">>> TASK STARTED -- " + event.getTask(), Project.MSG_DEBUG);
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#taskFinished(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void taskFinished(BuildEvent event) {
+        log("<<< TASK FINISHED -- " + event.getTask(), Project.MSG_DEBUG);
+        flush();
+    }
+
+    /**
+     * @see org.apache.tools.ant.BuildListener#messageLogged(BuildEvent)
+     */
+    /** {@inheritDoc}. */
+    public void messageLogged(BuildEvent event) {
+        log("--- MESSAGE LOGGED", Project.MSG_DEBUG);
+
+        StringBuffer buf = new StringBuffer();
+
+        if (event.getTask() != null) {
+            String name = event.getTask().getTaskName();
+
+            if (!emacsMode) {
+                String label = "[" + name + "] ";
+                int size = DefaultLogger.LEFT_COLUMN_SIZE - label.length();
+
+                for (int i = 0; i < size; i++) {
+                    buf.append(" ");
+                }
+                buf.append(label);
+            }
+        }
+        String messgeToUpdate = filterMessage(event.getMessage());
+        buf.append(messgeToUpdate);
+        log(buf.toString(), event.getPriority());
+    }
+    
+    
+    /**
+     * To replace regExp matching with ****.
+     * @param message
+     * @return
+     */
+    private String filterMessage(String message) {
+        for (String regExp : logRegExps) {
+            pattern = Pattern.compile(regExp);
+            if (pattern != null) {
+                Matcher match = pattern.matcher(message);
+                message = match.replaceAll("********");
+            }
+        }
+        return message;
+    }
+
+
+    /**
+     * The thing that actually sends the information to the output.
+     *
+     * @param mesg The message to log.
+     * @param level The verbosity level of the message.
+     */
+    private void log(String mesg, int level) {
+        if (record && (level <= loglevel) && out != null) {
+            out.println(mesg);
+        }
+    }
+
+    private void flush() {
+        if (record && out != null) {
+            out.flush();
+        }
+    }
+
+    /**
+     * @see BuildLogger#setMessageOutputLevel(int)
+     */
+    /** {@inheritDoc}. */
+    public void setMessageOutputLevel(int level) {
+        if (level >= Project.MSG_ERR && level <= Project.MSG_DEBUG) {
+            loglevel = level;
+        }
+    }
+
+    /**
+     * @see BuildLogger#setOutputPrintStream(PrintStream)
+     */
+    /** {@inheritDoc}. */
+    public void setOutputPrintStream(PrintStream output) {
+        closeFile();
+        out = output;
+    }
+
+
+    /**
+     * @see BuildLogger#setEmacsMode(boolean)
+     */
+    /** {@inheritDoc}. */
+    public void setEmacsMode(boolean emacsMode) {
+        this.emacsMode = emacsMode;
+    }
+
+
+    /**
+     * @see BuildLogger#setErrorPrintStream(PrintStream)
+     */
+    /** {@inheritDoc}. */
+    public void setErrorPrintStream(PrintStream err) {
+        setOutputPrintStream(err);
+    }
+
+
+    private static String formatTime(long millis) {
+        // CheckStyle:MagicNumber OFF
+        long seconds = millis / 1000;
+        long minutes = seconds / 60;
+
+
+        if (minutes > 0) {
+            return Long.toString(minutes) + " minute"
+                 + (minutes == 1 ? " " : "s ")
+                 + Long.toString(seconds % 60) + " second"
+                 + (seconds % 60 == 1 ? "" : "s");
+        } else {
+            return Long.toString(seconds) + " second"
+                 + (seconds % 60 == 1 ? "" : "s");
+        }
+        // CheckStyle:MagicNumber ON
+    }
+
+    /**
+     * Set the project associated with this recorder entry.
+     *
+     * @param project the project instance
+     *
+     * @since 1.6.2
+     */
+    public void setProject(Project project) {
+        this.project = project;
+        if (project != null) {
+            project.addBuildListener(this);
+        }
+    }
+
+    /**
+     * @since 1.6.2
+     */
+    public void cleanup() {
+        closeFile();
+        if (project != null) {
+            project.removeBuildListener(this);
+        }
+        project = null;
+    }
+
+    /**
+     * Closes the file associated with this recorder.
+     * Used by Recorder.
+     * @since 1.6.3
+     */
+    public void closeFile() {
+        if (out != null) {
+            out.close();
+            out = null;
+        }
+    }
+    
+    /**
+     * Initially opens the file associated with this recorder.
+     * Used by Recorder.
+     * @param append Indicates if output must be appended to the logfile or that
+     * the logfile should be overwritten.
+     * @throws BuildException
+     * @since 1.6.3
+     */
+    public void openFile(boolean append) {
+        openFileImpl(append);
+    }
+    
+    /**
+     * Re-opens the file associated with this recorder.
+     * Used by Recorder.
+     * @throws BuildException
+     * @since 1.6.3
+     */
+    public void reopenFile() {
+        openFileImpl(true);
+    }
+    
+    private void openFileImpl(boolean append) {
+        if (out == null) {
+            try {
+                out = new PrintStream(new FileOutputStream(filename, append));
+            } catch (IOException ioe) {
+                throw new BuildException("Problems opening file using a "
+                                         + "recorder entry", ioe);
+            }
+        }
+    }
+    
+    /**
+     * To add user message into log file.
+     * @param message
+     */
+    public void addLogMessage(String message) {
+        out.println(StringUtils.LINE_SEP + message);
+        
+    }
+    
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/AntLoggingHandler.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,581 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.logger.ant.listener;
+
+import java.io.File;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Vector;
+import java.util.Map.Entry;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.LogLevel;
+import org.apache.tools.ant.BuildException;
+import org.apache.log4j.Logger;
+
+import com.nokia.helium.logger.ant.types.*;
+
+
+    /**
+     * Ant logging class for each Stage. 
+     * 
+     *
+     */
+public class AntLoggingHandler implements Handler {
+    
+    private static Hashtable recorderEntries = new Hashtable();
+    private Boolean append ;
+    private int loglevel = -1;
+    private VerbosityLevelChoices antLogLevel;
+    private Map<String, Stage> stagesMapping;
+    private Map<String, StageLogging> stageRecordMap;
+    private Map<String, StageLogging> defaultRecordMap;
+    private Map<Stage, Target> depStartTargetMap;
+    private boolean isStagesIntialized;
+    private boolean isRecordingStarted;
+    private AntLogRecorderEntry recorderEntry;
+    private boolean isRecorderEntryRegistered;
+    private boolean isDefaultRecorderEntryRegistered;
+    private Logger log = Logger.getLogger(AntLoggingHandler.class);
+    private boolean isInitDepStartTarget;
+    private String currentStageName; 
+    
+
+    public AntLoggingHandler() {
+        antLogLevel = new VerbosityLevelChoices();
+        stagesMapping = new HashMap<String, Stage>();
+        stageRecordMap = new HashMap<String, StageLogging>();
+        defaultRecordMap = new HashMap<String, StageLogging>();
+        depStartTargetMap = new HashMap<Stage, Target>();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void handleTargetFinished(BuildEvent event) {
+        String stageName = getStopStageName (event.getTarget().getName());
+        if (stageName != null && getIsRecordingStarted()) {
+            stopStageAntLog(stageName);
+            startDefaultAntLog();
+            
+        }
+        log.debug("Finishing target [" + event.getTarget().getName() + "]");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void handleTargetStarted(BuildEvent event) {
+        
+        if (!isDefaultRecorderEntryRegistered ) {
+            log.debug("Intializing deafult recorder information and registering the recorder");
+            initDefaultAntLogStage(event);
+            registerDefaultRecorderEntry();
+        }
+        
+        if (!isStagesIntialized()) {
+            log.debug("Intializing stages information");
+            getStagesInformation(event);
+        }
+        
+        if (!isInitDepStartTarget() && isStagesIntialized()) {
+            log.debug("Intializing dependent targets stage information.");
+            initDepStartTarget(event);
+        }
+        
+        if (!isRecorderEntryRegistered && isStagesIntialized()) {
+            log.debug("Registering recorder entries.");
+            registerRecorderEntry(event);
+        }
+        
+        log.debug("Starting target [" + event.getTarget().getName() + "]");
+        String stageName = getStartStageName (event.getTarget().getName());
+        if (stageName != null &&  !getIsRecordingStarted()) {
+            stopDefaultAntLog(stageName);
+            startStageAntLog(stageName);
+        }
+        
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public void handleBuildStarted(BuildEvent event) {
+        
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public void handleBuildFinished(BuildEvent event) {
+        String time = getDateTime();
+        StageLogging stageLogging = defaultRecordMap.get("default");
+        if (stageLogging != null) {
+            // this case might happen if the config has not been loaded because
+            // of an error happening before the start of the build.
+            File logFile = new File(stageLogging.getDefaultOutput());
+            if (logFile.exists()) {
+                recorderEntry = getRecorder(stageLogging.getDefaultOutput(), StatusAndLogListener.getProject());
+                recorderEntry.addLogMessage("Stopping main Ant logging at " + time + " into " + stageLogging.getDefaultOutput());
+                recorderEntry.setRecordState(false);
+            }
+       } else {
+           log.debug("Could not find default recorder configuration.");
+       }
+       this.cleanup();
+    }
+    
+    /**
+     * Stage ant logging for respective stage.
+     * @param stageName
+     */
+    public void startStageAntLog(String stageName) {
+        String time = getDateTime();
+        log.debug("Starting stagerecorder for stage [" + stageName + "]");
+        StageLogging startStageLogging = stageRecordMap.get(stageName);
+        File logFile = new File(startStageLogging.getOutput());
+        if (logFile.exists()) {
+            recorderEntry = getRecorder(startStageLogging.getOutput(), StatusAndLogListener.getProject());
+            recorderEntry.setRecordState(true);
+            recorderEntry.addLogMessage("Starting logging for stage \"" + stageName + "\" into " + startStageLogging.getOutput() + " at " + time );
+            this.isRecordingStarted = true;
+            this.currentStageName = stageName;
+        }
+    }
+    
+    /**
+     * Stop ant logging for respective stage.
+     * @param stageName
+     */
+
+    public void stopStageAntLog( String stageName) {
+        String time = getDateTime();
+        log.debug("Stopping stagerecorder for stage [" + stageName + "]");
+        StageLogging stopStageLogging = stageRecordMap.get(stageName);
+        StageLogging defaultStageLogging = defaultRecordMap.get("default");
+        recorderEntry.addLogMessage("Stopping logging for stage \"" + stageName + "\" into " + stopStageLogging.getOutput() + " at " + time);
+        recorderEntry.addLogMessage("Starting logging into " +  defaultStageLogging.getDefaultOutput());
+        recorderEntry = getRecorder(stopStageLogging.getOutput(), StatusAndLogListener.getProject());
+        recorderEntry.setRecordState(false);
+        this.isRecordingStarted = false;
+        this.currentStageName = null;
+    }
+    
+    /**
+     * Returns recorder entry for logging current build process.
+     * @param stageLogging
+     * @param proj
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    protected AntLogRecorderEntry getRecorder(String name, Project proj) {
+        
+        Object o = recorderEntries.get(name);
+        AntLogRecorderEntry entry;
+        if (o == null) {
+            // create a recorder entry
+            entry = new AntLogRecorderEntry(name);
+            if (append == null) {
+                entry.openFile(false);
+            } else {
+                entry.openFile(append.booleanValue());
+            }
+            entry.setProject(proj);
+            recorderEntries.put(name, entry);
+        } else {
+            entry = (AntLogRecorderEntry) o;
+        }
+        return entry;
+    }
+    
+    /**
+     * Whether or not the logger should append to a previous file.
+     * @param append if true, append to a previous file.
+     */
+    public void setAppend(boolean append) {
+        this.append = append ;
+    }
+    
+    
+    /**
+     * Sets the level to which this recorder entry should log to.
+     * @param level the level to set.
+     * @see VerbosityLevelChoices
+     */
+    public void setLoglevel(VerbosityLevelChoices level) {
+        loglevel = level.getLevel();
+    }
+    
+    /**
+     * A list of possible values for the <code>setLoglevel()</code> method.
+     * Possible values include: error, warn, info, verbose, debug.
+     */
+    public static class VerbosityLevelChoices extends LogLevel {
+    }
+    
+    /**
+     * To get the stage information.
+     * @param event
+     */
+    @SuppressWarnings("unchecked")
+    private void getStagesInformation(BuildEvent event) {
+        this.isStagesIntialized = true;
+        Hashtable<String, Object> references = event.getProject().getReferences(); 
+        Enumeration<String> keyEnum = references.keys();
+        while (keyEnum.hasMoreElements()) {
+            String key = keyEnum.nextElement();
+            if (references.get(key) instanceof Stage) {
+                Stage tempStage = (Stage)references.get(key);
+                log.debug("Found  stage [" + key + "] for recording");
+                if (validateStageTargets(event, tempStage.getStartTarget(), tempStage.getEndTarget() )) {
+                    log.debug("Start and end targets are valid for stage [" + key + "]");
+                    stagesMapping.put(key, (Stage)references.get(key));
+                    getStageRecordInformation(event, key, tempStage.getStartTarget(), tempStage.getEndTarget());
+                }
+            }
+        }
+    }
+    
+    /**
+     * Checks, is stages are initialized.
+     * @return
+     */
+    private boolean isStagesIntialized() {
+        return this.isStagesIntialized;
+    }
+    
+    /**
+     * To initialize stage record mapping.
+     * @param event
+     */
+    @SuppressWarnings("unchecked")
+    private void getStageRecordInformation(BuildEvent event, String stageKey, String startTarget, String endTarget) {
+        Hashtable<String, Object> references = event.getProject().getReferences(); 
+        Enumeration<String> keyEnum = references.keys();
+        while (keyEnum.hasMoreElements()) {
+            String key = keyEnum.nextElement();
+            if (references.get(key) instanceof StageLogging) {
+                StageLogging tempStageLogging = (StageLogging)references.get(key);
+                
+                if (tempStageLogging.getStageRefID() == null && tempStageLogging.getDefaultOutput() == null ) {
+                    throw new BuildException("stagefefid attribute should be specified for stagerecord [" + key + "]");
+                }
+                if (tempStageLogging.getStageRefID() != null ) {
+                    if (tempStageLogging.getStageRefID().equalsIgnoreCase(stageKey) && tempStageLogging.getDefaultOutput() == null) {
+                        log.debug("stagerecord reference for stage [" + stageKey + "] is [" +  tempStageLogging.getStageRefID() + "]");
+                        if (tempStageLogging.getOutput() == null) {
+                            throw new BuildException("output attribute should be specified for stagerecord [" + key + "]");
+                        }
+                        stageRecordMap.put(stageKey, tempStageLogging);
+                    }
+                }
+            }
+        }
+    }
+    
+    /**
+     * First Validate is the default output has been set. 
+     * @param event
+     */
+    @SuppressWarnings("unchecked")
+    private void initDefaultAntLogStage(BuildEvent event) {
+        Hashtable<String, Object> references = event.getProject().getReferences(); 
+        Enumeration<String> keyEnum = references.keys();
+        while (keyEnum.hasMoreElements()) {
+            String key = keyEnum.nextElement();
+            if (references.get(key) instanceof StageLogging) {
+                StageLogging tempStageLogging = (StageLogging)references.get(key);
+                
+                if (tempStageLogging.getStageRefID() == null && tempStageLogging.getDefaultOutput() != null ) {
+                    defaultRecordMap.put("default", tempStageLogging);
+                }
+            }
+        }
+    }
+    
+    /**
+     * To check is the stage start and end targets present in the sequence. 
+     * @param event
+     * @param startTarget
+     * @param endTarget
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    private boolean validateStageTargets(BuildEvent event, String startTarget, String endTarget) {
+        
+        Hashtable<String, String> antTargets = event.getProject().getTargets();
+        return antTargets.containsKey(startTarget) && antTargets.containsKey(endTarget);
+    }
+    
+    /**
+     * Return mapped stage name to start record.
+     * @param targetName
+     * @return
+     */
+    
+    private String getStartStageName(String targetName) {
+        
+        for (Map.Entry<String, Stage> entry : stagesMapping.entrySet() ) {
+            Stage stage = entry.getValue();
+            if ( stage.getStartTarget().equalsIgnoreCase(targetName)) {
+                log.debug("stageName name for target [" + targetName + "] is [" +  entry.getKey() + "]");
+                return entry.getKey();
+            }
+            for (Map.Entry<Stage, Target> depEntry : depStartTargetMap.entrySet() ) {
+                Stage depStage = depEntry.getKey();
+                if ((depStage.getStartTarget().equalsIgnoreCase(stage.getStartTarget())) && (depEntry.getValue().getName().equalsIgnoreCase(targetName))) {
+                    log.debug("stageName name for depending target [" + depStage.getStartTarget() + "] is [" +  entry.getKey() + "]");
+                    return entry.getKey();
+                }
+            }
+        }
+        return null;
+    }
+    
+    /**
+     * Return mapped stage name to stop record.
+     * @param targetName
+     * @return
+     */
+    private String getStopStageName(String targetName) {
+        
+        for (Map.Entry<String, Stage> entry : stagesMapping.entrySet() ) {
+            Stage stage = entry.getValue();
+            if ( stage.getEndTarget().equalsIgnoreCase(targetName)) {
+                log.debug("stageName name for end target [" + targetName + "] is [" +  entry.getKey() + "]");
+                return entry.getKey();
+            }
+        }
+        return null;
+    }
+    
+    /**
+     * To check is recording started.
+     * @return
+     */
+    private boolean getIsRecordingStarted() {
+        return this.isRecordingStarted;
+    }
+    
+    /**
+     * To register recorder entries.
+     * @param event
+     */
+    @SuppressWarnings("unchecked")
+    private void registerRecorderEntry(BuildEvent event) {
+        /* Later register stages recorder entries */
+        for (Map.Entry<String, StageLogging> entry : stageRecordMap.entrySet()) {
+            StageLogging stageLogging  = entry.getValue();  
+            File logFile = new File(stageLogging.getOutput());
+            if (!logFile.getParentFile().exists()) {
+                logFile.getParentFile().mkdirs();
+            }
+            if (logFile.getParentFile().exists()) {
+                log.debug("Registering recorderentry for log file [" + stageLogging.getOutput() + "]");
+                this.setAppend(stageLogging.getAppend().booleanValue());
+                recorderEntry = getRecorder(stageLogging.getOutput(), StatusAndLogListener.getProject());
+                antLogLevel.setValue(stageLogging.getLogLevel());
+                this.setLoglevel(antLogLevel);
+                recorderEntry.setMessageOutputLevel(loglevel);
+                recorderEntry.setEmacsMode(false);
+                recorderEntry.setRecordState(false);
+                isRecorderEntryRegistered = true;
+            }
+        }
+    }
+    
+    /**
+     * To register default recorder entry.
+     */
+    @SuppressWarnings("unchecked")
+    private void registerDefaultRecorderEntry() {
+        
+        /* First register default recorder */
+        if (defaultRecordMap.size() == 0) {
+            throw new BuildException("There is no stagerecord type with defaultoutput attribute set. please set...");
+        }
+        StageLogging stageLogging = defaultRecordMap.get("default");
+        File logFile = new File(stageLogging.getDefaultOutput());
+        if (!logFile.getParentFile().exists()) {
+            logFile.getParentFile().mkdirs();
+        }
+        if (logFile.getParentFile().exists()) {
+            log.debug("Registering recorderentry for log file [" + stageLogging.getDefaultOutput() + "]");
+            this.setAppend(stageLogging.getAppend().booleanValue());
+            recorderEntry = getRecorder(stageLogging.getDefaultOutput(), StatusAndLogListener.getProject());
+            antLogLevel.setValue(stageLogging.getLogLevel());
+            this.setLoglevel(antLogLevel);
+            recorderEntry.setMessageOutputLevel(loglevel);
+            recorderEntry.setEmacsMode(false);
+            recorderEntry.setRecordState(true);
+            String time = getDateTime();
+            recorderEntry.addLogMessage("Starting main Ant logging at " + time + " into " + stageLogging.getDefaultOutput());
+            isDefaultRecorderEntryRegistered = true;
+        }
+        
+    }
+    
+    
+    
+    /**
+     * To clean recorder entries.
+     */
+    private void cleanup() {
+        log.debug("Cleaning up recorder entries of stagerecord");
+        StatusAndLogListener.getProject().removeBuildListener(recorderEntry);
+        recorderEntries.clear();
+        
+    }
+    
+    /**
+     * To check is the dependent start target map is initialized.
+     * @return
+     */
+    private boolean isInitDepStartTarget() {
+        return isInitDepStartTarget;
+    }
+    
+    /**
+     * Initialize the dependent start targets mapping.
+     * @param event
+     */
+    @SuppressWarnings("unchecked")
+    private void initDepStartTarget(BuildEvent event) {
+        Vector<Target> arrayList = null;
+        isInitDepStartTarget = true;
+        for (Map.Entry<String, Stage> entry : stagesMapping.entrySet() ) {
+            Stage stage = entry.getValue();
+            arrayList = event.getProject().topoSort(stage.getStartTarget(), event.getProject().getTargets(), false);
+            if (arrayList != null && arrayList.size() > 1) {
+                depStartTargetMap.put(stage, arrayList.firstElement());
+            }
+        }
+    }
+    
+    /**
+     * To get current date and time.
+     * @return
+     */
+    private String getDateTime() {
+        DateFormat dateFormat = new SimpleDateFormat("EE yyyy/MM/dd HH:mm:ss:SS aaa");
+        Date date = new Date();
+        return dateFormat.format(date);
+    } 
+    
+    /**
+     * To stop default ant logging.
+     */
+    private void stopDefaultAntLog(String stageName) {
+        String time = getDateTime();
+        StageLogging defaultStageLogging = defaultRecordMap.get("default");
+        StageLogging stageLogging = stageRecordMap.get(stageName);
+        File logFile = new File(defaultStageLogging.getDefaultOutput());
+        if (logFile.exists()) {
+            recorderEntry = getRecorder(defaultStageLogging.getDefaultOutput(), StatusAndLogListener.getProject());
+            recorderEntry.addLogMessage("Stopping logging into " + defaultStageLogging.getDefaultOutput() + " and starting logging for stage \"" + stageName + "\" at " + time);
+            recorderEntry.addLogMessage("Starting logging into " + stageLogging.getOutput());
+            recorderEntry.setRecordState(false);
+        }
+    }
+    
+    /**
+     * To start deafult ant logging.
+     */
+    
+    private void startDefaultAntLog() {
+        String time = getDateTime();
+        StageLogging stageLogging = defaultRecordMap.get("default");
+        recorderEntry = getRecorder(stageLogging.getDefaultOutput(), StatusAndLogListener.getProject());
+        recorderEntry.addLogMessage("Resuming logging into " + stageLogging.getDefaultOutput() + " at " + time );
+        recorderEntry.setRecordState(true);
+    }
+    
+    /**
+     * To get the current stage running.
+     * @return
+     */
+    public String getCurrentStageName() {
+        
+        return this.currentStageName;
+    }
+    
+    /**
+     * To do the logging actions depending on hlm:record actions.
+     * @param stageName
+     * @param action
+     * @param message
+     */
+    public void doLoggingAction(String stageName, boolean action, String message, Task task) {
+        String time = getDateTime();
+        StageLogging stageLogging = null;
+        String fileName;
+        if (stageName.equalsIgnoreCase("default")) {
+            stageLogging = defaultRecordMap.get(stageName);
+            fileName = stageLogging.getDefaultOutput();
+        } else {
+            stageLogging = stageRecordMap.get(stageName);
+            fileName = stageLogging.getOutput();
+        }
+        File logFile = new File(fileName);
+        if (logFile.exists()) {
+            recorderEntry = getRecorder(fileName, StatusAndLogListener.getProject());
+            recorderEntry.addLogMessage(message + " logging into " + fileName + " from " + task.getTaskName() + " task at " + time);
+            recorderEntry.setRecordState(action);
+        }
+    }
+    
+    /**
+     * Called by LogReplace task to find and replace any property values which are not updated.
+     * @param regExp
+     */
+    @SuppressWarnings("unchecked")
+    public void addRegExp (String regExp) {
+        
+        if (!regExp.equals("")) {
+            
+            for (Map.Entry<String, StageLogging> entry : defaultRecordMap.entrySet() ) {
+                StageLogging stageLogging = entry.getValue();
+                File logFile = new File(stageLogging.getDefaultOutput());
+                if (logFile.exists()) {
+                    AntLogRecorderEntry recorderEntry = getRecorder(stageLogging.getDefaultOutput(), StatusAndLogListener.getProject());
+                    recorderEntry.addRegexp(regExp);
+                }
+            }
+            
+            for (Map.Entry<String, StageLogging> entry : stageRecordMap.entrySet() ) {
+                StageLogging stageLogging = entry.getValue();
+                File logFile = new File(stageLogging.getOutput());
+                if (logFile.exists()) {
+                    AntLogRecorderEntry recorderEntry = getRecorder(stageLogging.getOutput(), StatusAndLogListener.getProject());
+                    recorderEntry.addRegexp(regExp);
+                }
+            }
+            
+        }
+    }
+
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/BuildEventHandler.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.logger.ant.listener;
+
+import org.apache.tools.ant.BuildEvent;
+
+/**
+ * <code>Handler</code> is an interface which is used to handle the build events
+ * which are of importance for ant logging and build stage summary display.
+ * 
+ *
+ */
+public interface BuildEventHandler {
+
+   /**
+    * Method to handle build start events.
+    * 
+    * @param event is the build event to be handled. 
+    */
+    void handleBuildStarted( BuildEvent event );
+
+   /**
+    * Method to handle build finish events.
+    * 
+    * @param event is the build event to be handled. 
+    */
+    void handleBuildFinished( BuildEvent event );
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/BuildStatusReport.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+package com.nokia.helium.logger.ant.listener;
+
+import static com.nokia.helium.logger.ant.listener.StageSummaryHandler.FAILED;
+import static com.nokia.helium.logger.ant.listener.StageSummaryHandler.PASSED;
+
+/**
+ * <code>BuildStatusReport</code> is a simple java bean used to hold information pertaining
+ * to various build stages.
+ * 
+ */
+public class BuildStatusReport {
+
+    private String phaseName;
+    private String startTime;
+    private String duration;
+    private String reason;
+    private String status;
+
+    /**
+     * Create an instance of {@link BuildStatusReport}.
+     * 
+     * @param phaseName is the name of the Phase
+     * @param startTime is the start time of the Phase
+     * @param duration is the duration of the Phase
+     * @param reason is the cause of build failure, if any
+     */
+    public BuildStatusReport(String phaseName, String startTime,
+            String duration, String reason) {
+        this.phaseName = phaseName;
+        this.startTime = startTime;
+        this.duration = duration;
+        this.reason = (reason != null && !reason.isEmpty()) ? reason : "N/A";
+        this.status = (reason != null && !reason.isEmpty()) ? FAILED : PASSED; 
+    }
+
+    /**
+     * Get the Build Phase name.
+     * 
+     * @return the Build Phase name.
+     */
+    public String getPhaseName() {
+        return phaseName;
+    }
+
+    /**
+     * Set the Build Phase name.
+     * 
+     * @param phaseName is the phase name to set.
+     */
+    public void setPhaseName(String phaseName) {
+        this.phaseName = phaseName;
+    }
+
+    /**
+     * Get the start time of this Phase.
+     * 
+     * @return the start time of this Phase.
+     */
+    public String getStartTime() {
+        return startTime;
+    }
+
+    /**
+     * Set the start time of this Phase.
+     * 
+     * @param startTime is the start time to set.
+     */
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    /**
+     * Get the duration of this Phase.
+     * 
+     * @return the duration of this Phase.
+     */
+    public String getDuration() {
+        return duration;
+    }
+
+    /**
+     * Set the duration of this Phase.
+     * 
+     * @param duration the duration to set.
+     */
+    public void setDuration(String duration) {
+        this.duration = duration;
+    }
+
+    /**
+     * Get the reason for build failure.
+     * 
+     * @return the reason for build failure.
+     */
+    public String getReason() {
+        return reason;
+    }
+
+    /**
+     * Set the reason for build failure.
+     * 
+     * @param reason is the reason for build failure.
+     */
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    /**
+     * Get the build status.
+     * 
+     * @return the build status.
+     */
+    public String getStatus() {
+        return status;
+    }
+
+    /**
+     * Set the build status.
+     * 
+     * @param status is the build status to set.
+     */
+    public void setStatus(String status) {
+        this.status = status;
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/Handler.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,30 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.logger.ant.listener;
+
+
+/**
+ * <code>Handler</code> is an interface which is used to handle the build events
+ * which are of importance for ant logging and build stage summary display.
+ * 
+ *
+ */
+public interface Handler extends BuildEventHandler, TargetEventHandler {
+
+   
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/StageSummaryHandler.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,447 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+package com.nokia.helium.logger.ant.listener;
+
+import java.io.File;
+import java.io.StringWriter;
+import java.text.DateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.TreeMap;
+import java.util.Vector;
+
+import org.apache.log4j.Logger;
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.util.DateUtils;
+
+import com.nokia.helium.logger.ant.types.Stage;
+import com.nokia.helium.logger.ant.types.StageSummary;
+
+import freemarker.cache.FileTemplateLoader;
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+
+/**
+ * <code>StageStatusHandler</code> is the handler class responsible for
+ * displaying the summary of the various configured build stages at the end of
+ * build process.
+ * 
+ */
+public class StageSummaryHandler implements Handler {
+
+    public static final String PASSED = "PASSED";
+    public static final String FAILED = "FAILED";
+
+    private Logger log = Logger.getLogger(getClass());
+    private boolean displaySummary;
+    private boolean lookup4Stages;
+    private boolean summarize;
+
+    private List<BuildStatusReport> statusReports;
+    private HashSet<String> completedStages;
+    private Hashtable<String, Stage> currentStages;
+    private Hashtable<String, Long> currentStagesStartTime;
+    private Hashtable<String, Stage> stages;
+    private String template;
+
+    /**
+     * Create an instance of {@link StageSummaryHandler}
+     * 
+     */
+    public StageSummaryHandler() {
+        this.statusReports = new ArrayList<BuildStatusReport>();
+        this.completedStages = new HashSet<String>();
+        this.currentStages = new Hashtable<String, Stage>();
+        this.currentStagesStartTime = new Hashtable<String, Long>();
+        log.debug("StageStatusHandler instantiated");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void handleBuildStarted(BuildEvent event) {
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void handleBuildFinished(BuildEvent event) {
+        if (summarize && !currentStages.isEmpty()) {
+            Long currTime = getCurrentTime();
+            String reason = getReason(event.getException());
+            Map<String, Stage> tempStages = new Hashtable<String, Stage>(
+                    currentStages);
+            for (String stageName : tempStages.keySet()) {
+                endCurrentStage(stageName, tempStages.get(stageName), reason,
+                        currTime);
+            }
+
+        }
+        if (summarize && displaySummary) {
+            generateSummary(event.getProject());
+            displaySummary = false;
+            log.debug("Stage Summary generation completed");
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void handleTargetStarted(BuildEvent event) {
+        Project project = event.getProject();
+        if (!summarize) {
+            StageSummary stageSummary = getStageSummary(project);
+            summarize = stageSummary != null
+                    && !stageSummary.getTemplate().trim().isEmpty();
+            lookup4Stages = summarize;
+            template = stageSummary.getTemplate();
+            log.debug("Is Project configured to display Stage Summary ? "
+                    + summarize);
+        }
+
+        if (lookup4Stages) {
+            log.debug("Loading stages....");
+            parseStages(event.getProject());
+            log.debug("Total no of stages loaded = " + stages.size());
+            lookup4Stages = false;
+        }
+
+        log.debug("Handling target - " + event.getTarget().getName());
+        if (summarize) {
+            Long currTime = getCurrentTime();
+            TreeMap<String, Stage> result = searchNewStage(event);
+            if (result != null && result.size() == 1) {
+                String stageName = result.firstKey();
+                Stage stage = result.get(stageName);
+                startNewStage(stageName, stage, currTime);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void handleTargetFinished(BuildEvent event) {
+        String currentTarget = event.getTarget().getName();
+        Long currTime = getCurrentTime();
+        String reason = getReason(event.getException());
+        if (summarize && !currentStages.isEmpty()) {
+            TreeMap<String, Stage> result = getCurrentStageToEnd(currentTarget);
+            if (!result.isEmpty()) {
+                String stageName = result.firstKey();
+                Stage stage = result.get(stageName);
+                endCurrentStage(stageName, stage, reason, currTime);
+            }
+        }
+    }
+
+    private TreeMap<String, Stage> getCurrentStageToEnd(String target) {
+        TreeMap<String, Stage> result = new TreeMap<String, Stage>();
+        for (String stageName : currentStages.keySet()) {
+            Stage stage = currentStages.get(stageName);
+            if (stage.isEndTarget(target)) {
+                result.put(stageName, stage);
+                break;
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Method returns the configured {@link StageSummary}.
+     * 
+     * @param project
+     *            is the project to lookup for stageSummary.
+     * @return the {@link StageSummary}.
+     */
+    @SuppressWarnings("unchecked")
+    private StageSummary getStageSummary(Project project) {
+        StageSummary stageSummary = null;
+        int count = 0;
+        Hashtable<String, Object> references = project.getReferences();
+        for (Enumeration<String> en = references.keys(); en.hasMoreElements();) {
+            Object object = references.get(en.nextElement());
+            if (object instanceof StageSummary) {
+                count++;
+                if (count > 1) {
+                    raiseException("Multiple entries of 'hlm:stagesummary' found in "
+                            + "stages_config.ant.xml.");
+                }
+                stageSummary = (StageSummary) object;
+            }
+        }
+        return stageSummary;
+    }
+
+    /**
+     * Raise a {@link BuildException} with the specified error message.
+     * 
+     * @param message
+     *            is the error message to display.
+     */
+    private void raiseException(String message) {
+        throw new BuildException(message);
+    }
+
+    /**
+     * Start the given stage as a new build stage.
+     * 
+     * @param stageName
+     *            is the name of the new stage.
+     * @param newStage
+     *            is the build stage to start as new.
+     * @param startTime
+     *            is the start time of the given build stage.
+     */
+    private void startNewStage(String stageName, Stage newStage, Long startTime) {
+        if (!currentStages.containsKey(stageName)) {
+            this.currentStages.put(stageName, newStage);
+            this.currentStagesStartTime.put(stageName, startTime);
+            log.debug("New stage [" + stageName + "] started at "
+                    + getTimestamp(startTime));
+        }
+    }
+
+    /**
+     * End the current stage.
+     * 
+     * @param reason
+     *            is the reason for build failure if any.
+     * @param currTime
+     *            is the end time of the current stage.
+     */
+    private void endCurrentStage(String currentStageName, Stage currentStage,
+            String reason, Long currTime) {
+        if (currentStage != null) {
+            BuildStatusReport report = constructBuildStatusReport(
+                    currentStageName, currentStagesStartTime
+                            .get(currentStageName), currTime, reason);
+            statusReports.add(report);
+            displaySummary = true;
+            log.debug("Stage [" + currentStageName + "] finished at "
+                    + getTimestamp(currTime));
+            reset(currentStageName);
+        }
+    }
+
+    /**
+     * Reset the build stage variables to default.
+     */
+    private void reset(String stageName) {
+        this.currentStages.remove(stageName);
+        this.currentStagesStartTime.remove(stageName);
+        this.completedStages.add(stageName);
+    }
+
+    /**
+     * Search for the new Stage based on the given build event.
+     * 
+     * @param event
+     *            is the build event fired.
+     * @return a map with Stage Name and stage, if the build event marks the
+     *         start of a configured Stage.
+     */
+    private TreeMap<String, Stage> searchNewStage(BuildEvent event) {
+        TreeMap<String, Stage> result = new TreeMap<String, Stage>();
+        String target = event.getTarget().getName();
+        for (String stageName : stages.keySet()) {
+            Stage stage = stages.get(stageName);
+            if (!completedStages.contains(stageName)
+                    && isStartingTarget(target, event.getProject(), stage)) {
+                result.put(stageName, stage);
+                break;
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Return whether the given target is a starting target of the given stage.
+     * 
+     * @param targetName
+     *            is the target to check.
+     * @param project
+     *            is the project to lookup for target
+     * @param stage
+     *            is the stage to check.
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    private boolean isStartingTarget(String targetName, Project project,
+            Stage stage) {
+        boolean bool = false;
+        if (project.getTargets().containsKey(stage.getStartTarget())) {
+            Vector<Target> dependencies = project.topoSort(stage
+                    .getStartTarget(), project.getTargets(), false);
+            if (!dependencies.isEmpty()) {
+                Target target = dependencies.firstElement();
+                bool = target.getName().equals(targetName);
+            }
+        }
+        return bool;
+    }
+
+    /**
+     * Parse and cache the stages configured.
+     * 
+     * @param project
+     *            is the project to lookup for stages.
+     */
+    @SuppressWarnings("unchecked")
+    private void parseStages(Project project) {
+        stages = new Hashtable<String, Stage>();
+        Hashtable<String, Object> references = project.getReferences();
+        for (Enumeration<String> en = references.keys(); en.hasMoreElements();) {
+            String key = en.nextElement();
+            Object value = references.get(key);
+            if (value instanceof Stage) {
+                stages.put(key, (Stage) value);
+            }
+        }
+    }
+
+    /**
+     * Return the reason for build failure in String format.
+     * 
+     * @param th
+     *            is the cause of build failure if any.
+     * @return String representing the build failure.
+     */
+    private String getReason(Throwable th) {
+        return (th != null) ? th.getMessage() : "";
+    }
+
+    /**
+     * Return the current time in milliseconds.
+     * 
+     * @return the current time in milliseconds.
+     */
+    private Long getCurrentTime() {
+        return System.currentTimeMillis();
+    }
+
+    /**
+     * Generate build summary.
+     * 
+     */
+    private void generateSummary(Project project) {
+        if (template != null) {
+            try {
+                Configuration cfg = new Configuration();
+                // get base dir and template name
+                StringTokenizer tokenizer = new StringTokenizer(template,
+                        File.separator);
+                StringBuffer baseDirBuf = new StringBuffer();
+                String templateName = null;
+                while (tokenizer.hasMoreElements()) {
+                    String str = (String) tokenizer.nextElement();
+                    if (str.endsWith(".ftl")) {
+                        templateName = str;
+                    } else {
+                        baseDirBuf.append(str).append(File.separator);
+                    }
+                }
+                File baseDir = new File(baseDirBuf.toString());
+                cfg.setTemplateLoader(new FileTemplateLoader(baseDir));
+                Template templ = cfg.getTemplate(templateName);
+                StringWriter writer = new StringWriter();
+                templ.process(getTemplateData(), writer);
+                project.log(writer.toString());
+            } catch (freemarker.core.InvalidReferenceException ivx) {
+                project.log("Invalid reference in config: ", ivx,
+                        Project.MSG_WARN);
+            } catch (freemarker.template.TemplateException e2) {
+                project.log("TemplateException: ", e2, Project.MSG_WARN);
+            } catch (java.io.IOException e) {
+                project.log("I/O Error during template conversion: ", e,
+                        Project.MSG_WARN);
+            }
+        }
+    }
+
+    /**
+     * Return the data-model to be merged with the template.
+     * 
+     * @return a Map representing template data-model.
+     */
+    private Map<String, Object> getTemplateData() {
+        Map<String, Object> templateMap = new HashMap<String, Object>();
+        templateMap.put("statusReports", new ArrayList<BuildStatusReport>(
+                statusReports));
+        return templateMap;
+    }
+
+    /**
+     * Get the given date as String format.
+     * 
+     * @param date
+     *            is the date to be formatted as String.
+     * @return given date formated as String
+     */
+    private String getTimestamp(long date) {
+        Date dt = new Date(date);
+        DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.SHORT,
+                DateFormat.SHORT);
+        String finishTime = formatter.format(dt);
+        return finishTime;
+    }
+
+    /**
+     * Get the time duration for the given start and end times in String format.
+     * 
+     * @param startTime
+     *            is the start time.
+     * @param endTime
+     *            is the end time.
+     * @return
+     */
+    private String getTimeElapsed(Long startTime, Long endTime) {
+        long timeElapsed = endTime - startTime;
+        return DateUtils.formatElapsedTime(timeElapsed);
+    }
+
+    /**
+     * Construct an instance of {@link BuildStatusReport} with the given
+     * details.
+     * 
+     * @param phaseName
+     *            is the name of the Phase.
+     * @param startTime
+     *            is the start time of the given Phase
+     * @param endTime
+     *            is the end time of given phase
+     * @param reason
+     *            is the cause of failure
+     * @return
+     */
+    private BuildStatusReport constructBuildStatusReport(String phaseName,
+            Long startTime, Long endTime, String reason) {
+        return new BuildStatusReport(phaseName, getTimestamp(startTime),
+                getTimeElapsed(startTime, endTime), reason);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/StatusAndLogListener.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,201 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.logger.ant.listener;
+
+import java.util.Vector;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.SubBuildListener;
+import org.apache.tools.ant.Project;
+
+/**
+ * <code>StatusAndLogListener</code> implements {@link BuildListener} and
+ * listens to build events in particularly for activities such as ant logging
+ * and displaying build stage summary at the end of build process.
+ * 
+ */
+public class StatusAndLogListener implements BuildListener, SubBuildListener {
+
+    private static Vector<Handler> handlers = new Vector<Handler>();
+    private static Project project;
+    
+    /**
+     * Default constructor
+     */
+    public StatusAndLogListener() {
+    }
+
+    /**
+     * Signals that the last target has finished. This event will still be fired
+     * if an error occurred during the build.
+     * 
+     * @param event
+     *            An event with any relevant extra information. Must not be
+     *            <code>null</code>.
+     * 
+     * @see BuildEvent#getException()
+     */
+    public void buildStarted(BuildEvent event) {
+        project = event.getProject();
+        for (Handler handler : handlers) {
+            handler.handleBuildStarted(event);
+        }
+        
+    }
+    /**
+     * Signals that a build has started. This event is fired before any targets
+     * have started.
+     * 
+     * @param event
+     *            An event with any relevant extra information. Must not be
+     *            <code>null</code>.
+     */
+    public void buildFinished(BuildEvent event) {
+        for ( Handler handler : handlers ) {
+            handler.handleBuildFinished( event );
+        }
+    }
+    
+
+    /**
+     * Signals that a target is starting.
+     * 
+     * @param event
+     *            An event with any relevant extra information. Must not be
+     *            <code>null</code>.
+     * 
+     * @see BuildEvent#getTarget()
+     */
+    public void targetStarted(BuildEvent event) {
+        for (Handler handler : handlers) {
+            handler.handleTargetStarted(event);
+        }
+    }
+
+    /**
+     * Signals that a target has finished. This event will still be fired if an
+     * error occurred during the build.
+     * 
+     * @param event
+     *            An event with any relevant extra information. Must not be
+     *            <code>null</code>.
+     * 
+     * @see BuildEvent#getException()
+     */
+    public void targetFinished(BuildEvent event) {
+        for (Handler handler : handlers) {
+            handler.handleTargetFinished(event);
+        }
+    }
+
+    /**
+     * Signals that a task is starting.
+     * 
+     * @param event
+     *            An event with any relevant extra information. Must not be
+     *            <code>null</code>.
+     * 
+     * @see BuildEvent#getTask()
+     */
+    public void taskStarted(BuildEvent event) {
+        // implement if needed
+    }
+
+    /**
+     * Signals that a task has finished. This event will still be fired if an
+     * error occurred during the build.
+     * 
+     * @param event
+     *            An event with any relevant extra information. Must not be
+     *            <code>null</code>.
+     * 
+     * @see BuildEvent#getException()
+     */
+    public void taskFinished(BuildEvent event) {
+        // implement if needed
+    }
+    
+    /**
+     * Signals that a subbuild has started. This event is fired before any targets have started. 
+     * @param event
+     */
+    public void subBuildStarted(BuildEvent event) {
+         
+    }
+    
+    /**
+     * Signals that the last target has finished. This event will still be fired if an error occurred during the build. 
+     * @param event
+     */
+    
+    public void subBuildFinished(BuildEvent event) {
+        
+    }
+    
+    
+
+    /**
+     * Signals a message logging event.
+     * 
+     * @param event
+     *            An event with any relevant extra information. Must not be
+     *            <code>null</code>.
+     * 
+     * @see BuildEvent#getMessage()
+     * @see BuildEvent#getException()
+     * @see BuildEvent#getPriority()
+     */
+    public void messageLogged(BuildEvent event) {
+        // implement if needed
+
+    }
+
+    /**
+     * Register the given handler.
+     * 
+     * @param handler
+     *            is the handler to register
+     */
+    public static void register ( Handler handler ) {
+        handlers.add( handler );
+    }
+    
+    /**
+     * Return root project name.
+     * @return
+     */
+    public static Project getProject() {
+      return project;   
+    }
+    
+    
+    /**
+     * Check and return required type handler.
+     * @param handlerType
+     * @return
+     */
+    public static Handler getHandler(Class handlerType) {
+        for (Handler handler : handlers) {
+            if (handlerType.isInstance(handler)) {
+                return handler;
+            }
+        }
+        return null;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/SubBuildEventHandler.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.logger.ant.listener;
+
+import org.apache.tools.ant.BuildEvent;
+
+/**
+ * <code>Handler</code> is an interface which is used to handle the build events
+ * which are of importance for ant logging and build stage summary display.
+ * 
+ *
+ */
+public interface SubBuildEventHandler {
+
+    /**
+     * Method to handle SubBuild Started  events.
+     * @param event
+     */
+    void handleSubBuildStarted( BuildEvent event );
+    
+    /**
+     * Method to handle SubBuild Finished  events.
+     * @param event
+     */
+    void handleSubBuildFinished( BuildEvent event );
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/TargetEventHandler.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.logger.ant.listener;
+
+import org.apache.tools.ant.BuildEvent;
+
+/**
+ * <code>Handler</code> is an interface which is used to handle the build events
+ * which are of importance for ant logging and build stage summary display.
+ * 
+ *
+ */
+public interface TargetEventHandler {
+
+   /**
+     * Method to handle Target started Event
+     * 
+     * @param event
+     */
+    
+    void handleTargetStarted( BuildEvent event );
+  
+   /**
+    * Method to handle target finish events.
+    * 
+    * @param event is the build event to be handled. 
+    */
+    void handleTargetFinished( BuildEvent event );
+   
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/listener/TaskEventHandler.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.logger.ant.listener;
+
+import org.apache.tools.ant.BuildEvent;
+
+/**
+ * <code>Handler</code> is an interface which is used to handle the build events
+ * which are of importance for ant logging and build stage summary display.
+ * 
+ *
+ */
+public interface TaskEventHandler {
+
+   /**
+    * Method to handle Task Finished events.
+    * 
+    * @param event is the build event to be handled. 
+    */
+    void handleTaskFinished( BuildEvent event );
+
+   /**
+    * Method to handle Task Started( events.
+    * 
+    * @param event is the build event to be handled. 
+    */
+    void handleTaskStarted( BuildEvent event );
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/taskdefs/LogRecorder.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,333 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+
+package com.nokia.helium.logger.ant.taskdefs;
+
+import java.util.Hashtable;
+import java.util.Vector;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+import org.apache.tools.ant.types.LogLevel;
+
+import com.nokia.helium.logger.ant.listener.AntLogRecorderEntry;
+import com.nokia.helium.logger.ant.listener.AntLoggingHandler;
+import com.nokia.helium.logger.ant.listener.Handler;
+import com.nokia.helium.logger.ant.listener.StatusAndLogListener;
+import com.nokia.helium.logger.ant.types.RecordFilter;
+import com.nokia.helium.logger.ant.types.RecordFilterSet;
+
+/**
+ * For recording ant logging output.
+ *  
+ * <pre>
+ *      &lt;hlm:record name="${build.log.dir}/${build.id}_test.log" action="start" append="false" loglevel="info"&gt;
+ *           &lt;hlm:recordfilterset refid="recordfilter.config"/&gt;
+ *           &lt;hlm:recordfilter category="info" regexp="^INFO:" /&gt;
+ *      &lt;/hlm:record&gt;
+ *      
+ * </pre>
+ * 
+ * @ant.task name="Record" category="Logging".
+ *
+ */
+
+public class LogRecorder extends Task implements Handler {
+    
+    private static Hashtable<String, AntLogRecorderEntry> recorderEntries = new Hashtable<String, AntLogRecorderEntry>();
+    private String fileName;
+    private Boolean append ;
+    private Boolean start ;
+    private int loglevel = -1;
+    private boolean emacsMode ;
+    private Vector<RecordFilter> recordFilters = new Vector<RecordFilter>();
+    private Vector<RecordFilterSet> recordFilterSet = new Vector<RecordFilterSet>();
+    private Vector<String> regExpList = new Vector<String>();
+    
+    
+    public LogRecorder() {
+        
+    }
+    /**
+     * Run by the task.
+     */
+    
+    public void execute () {
+        
+        AntLoggingHandler antLoggingHandler  = (AntLoggingHandler)StatusAndLogListener.getHandler(AntLoggingHandler.class);
+        
+        /* To validate attributes passed. */
+        validateAttributes();
+        
+        /* to add regular filters */
+        addAllRecordFilters();
+        
+        
+        /* Init password/record filter and replace any unset properties */
+        initAndReplaceProperties();
+        
+     // get the recorder entry
+        AntLogRecorderEntry recorder = getRecorder(fileName, getProject());
+        // set the values on the recorder
+        recorder.setMessageOutputLevel(loglevel);
+        recorder.setEmacsMode(emacsMode);
+        if (start != null) {
+            if (start.booleanValue()) {
+                if (antLoggingHandler != null) {
+                    if (antLoggingHandler.getCurrentStageName() != null) {
+                        antLoggingHandler.doLoggingAction(antLoggingHandler.getCurrentStageName(), false, "Stopping", this);
+                    } else {
+                        antLoggingHandler.doLoggingAction("default", false, "Stopping", this);
+                    }
+                }
+                recorder.reopenFile();
+                recorder.setRecordState(start);
+            } else {
+                recorder.setRecordState(start);
+                recorder.closeFile();
+                if (antLoggingHandler != null) {
+                    if (antLoggingHandler.getCurrentStageName() != null) {
+                        antLoggingHandler.doLoggingAction(antLoggingHandler.getCurrentStageName(), true, "Starting", this);
+                    } else {
+                        antLoggingHandler.doLoggingAction("default", true, "Starting", this);
+                    }
+                }
+            }
+        }
+        
+    }
+    /**
+     * To Validate is the fileName set for recording.
+     */
+    private void validateAttributes() {
+        if (fileName == null) {
+            throw new BuildException("filename attribute should be specified for helium recorder task.");
+        }
+        
+    }
+
+    /**
+     * Set the file name to recod.
+     * @param fileName
+     * @ant.required
+     */
+    public void setName(String fileName) {
+        this.fileName = fileName;
+    }
+    
+    /**
+     * Return the fileName.
+     * @return
+     */
+    public String getName() {
+        return this.fileName;
+    }
+    
+    /**
+     * Set the append parameter.
+     * @param append
+     * @ant.not-required
+     */
+    public void setAppend(boolean append) {
+        this.append = append ? Boolean.TRUE : Boolean.FALSE;
+    }
+    
+    /**
+     * Set logLevel to log the information.
+     * @param level
+     * @ant.not-required
+     */
+    public void setLoglevel(VerbosityLevelChoices level) {
+        loglevel = level.getLevel();
+    }
+    
+    /**
+     * Set the EmacsMode.
+     * @param emacsMode
+     * @ant.not-required
+     */
+    public void setEmacsMode(boolean emacsMode) {
+        this.emacsMode = emacsMode;
+    }
+    
+    /**
+     * Return the emacsMode.
+     * @return
+     */
+    public boolean getEmacsMode() {
+        return this.emacsMode;
+    }
+    
+    /**
+     * create the type of recorderfilter.
+     * @param logFilter
+     */
+    public void addRecordFilter(RecordFilter logFilter) {
+        if (!recordFilters.contains(logFilter)) {
+            recordFilters.add(logFilter);
+        }
+    }
+    
+    /**
+     * Create the type of recoderfilterset
+     * @param logFilterSet
+     */
+    public void addRecordFilterSet(RecordFilterSet logFilterSet) {
+        if (!recordFilterSet.contains(logFilterSet)) {
+            recordFilterSet.add(logFilterSet);
+        }
+    }
+    
+    /**
+     * Set the action of stop/start.
+     * @param action
+     * @ant.not-required
+     */
+    public void setAction(ActionChoices action) {
+        if (action.getValue().equalsIgnoreCase("start")) {
+            start = Boolean.TRUE;
+        } else {
+            start = Boolean.FALSE;
+        }
+    }
+    
+    /**
+     * To get the action state of current recorder.
+     * @return
+     */
+    public boolean getAction() {
+        return start.booleanValue();
+    }
+    
+    
+    /**
+     * A list of possible values for the <code>setAction()</code> method.
+     * Possible values include: start and stop.
+     */
+    public static class ActionChoices extends EnumeratedAttribute {
+        private static final String[] VALUES = {"start", "stop"};
+
+        /**
+         * @see EnumeratedAttribute#getValues()
+         */
+        /** {@inheritDoc}. */
+        public String[] getValues() {
+            return VALUES;
+        }
+    }
+    
+    /**
+     * To set the verbosity levels
+     * 
+     *
+     */
+    public static class VerbosityLevelChoices extends LogLevel {
+    }
+    
+    
+    /**
+     * To register the recorder entry
+     */
+    @SuppressWarnings("unchecked")
+    protected AntLogRecorderEntry getRecorder(String name, Project proj) {
+        Object o = recorderEntries.get(name);
+        AntLogRecorderEntry entry;
+        if (o == null) {
+            // create a recorder entry
+            entry = new AntLogRecorderEntry(name);
+            for (String regExp : regExpList) {
+                if (!regExp.equals("")) {
+                    String pattern = Pattern.quote(regExp);
+                    entry.addRegexp(pattern);
+                }
+            }
+            
+            if (append == null) {
+                entry.openFile(false);
+            } else {
+                entry.openFile(append.booleanValue());
+            }
+            entry.setProject(proj);
+            recorderEntries.put(name, entry);
+        } else {
+            entry = (AntLogRecorderEntry) o;
+        }
+        return entry;
+    }
+    
+    /**
+     * Get all the recorderfilters from recorderfilterset refid.
+     */
+    public void addAllRecordFilters() {
+        for (RecordFilterSet recFilterSet : recordFilterSet ) {
+            recordFilters.addAll(recFilterSet.getAllFilters());
+        }
+    }
+    
+    public void handleBuildFinished(BuildEvent event) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void handleBuildStarted(BuildEvent event) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void handleTargetFinished(BuildEvent event) {
+        // TODO Auto-generated method stub
+    }
+
+    public void handleTargetStarted(BuildEvent event) {
+        // TODO Auto-generated method stub
+
+    }
+    
+    /**
+     * To init password and record filters. 
+     * Replace with values if any property values are unset.
+     */
+    @SuppressWarnings("unused")
+    public void initAndReplaceProperties() {
+        
+        Pattern pattern = null; 
+        Matcher match = null;
+        for (RecordFilter recordFilter : recordFilters) { 
+            if (recordFilter.getRegExp() == null) {
+                throw new BuildException("\"regexp\" attribute should not have null value for recordfilter");
+            }
+            if (recordFilter.getRegExp() != null) {
+                pattern = Pattern.compile("\\$\\{(.*)}");
+                match = pattern.matcher(recordFilter.getRegExp());
+                if (match.find()) {
+                    regExpList.add(getProject().replaceProperties(recordFilter.getRegExp()));
+                } else {
+                    regExpList.add(recordFilter.getRegExp());
+                }
+            }
+        }
+    }
+    
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/taskdefs/LogReplace.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.logger.ant.taskdefs;
+
+import java.util.regex.Pattern;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+
+import com.nokia.helium.logger.ant.listener.AntLoggingHandler;
+import com.nokia.helium.logger.ant.listener.StatusAndLogListener;
+
+/**
+ * To replace the property values with real values if the properties are not set at the begining of the build.
+ * 
+ * pre>
+ *      &lt;hlm:logreplace regexp="${property.not.set}"/&gt;
+ * </pre>
+ * 
+ * @ant.task name="logreplace" category="Logging".
+ */
+public class LogReplace extends Task {
+    
+    private String regExp;
+    
+    /**
+     * Run by the task.
+     */
+    
+    public void execute () {
+        
+        AntLoggingHandler antLoggingHandler  = (AntLoggingHandler)StatusAndLogListener.getHandler(AntLoggingHandler.class);
+        
+        if (regExp == null ) {
+            throw new BuildException ("'regexp' attribute should not be null.");
+        }
+        
+        if (antLoggingHandler != null) {
+            String pattern = Pattern.quote(regExp);
+            antLoggingHandler.addRegExp(pattern);
+        }
+    }
+
+    /**
+     * @param regExp the regExp to set
+     * @ant.required
+     */
+    public void setRegExp(String regExp) {
+        this.regExp = regExp;
+    }
+
+    /**
+     * @return the regExp
+     */
+    public String getRegExp() {
+        return regExp;
+    }
+    
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/types/RecordFilter.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.logger.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+
+/**
+ * Recorder Filter will be used to filter the ant logging output.
+ * 
+ *  To get the lines which matches the regular expression.
+ *  
+ * <pre>
+ *      &lt;hlm:recordfilter category="info" regexp="ERROR"/&gt;
+ *      &lt;hlm:recordfilter category="warn" regexp="^WARN"/&gt;
+ * </pre>
+ * 
+ * @ant.task name="Recordfilter" category="Logging".
+ *
+ */
+
+public class RecordFilter extends DataType {
+    
+    private String category;
+    private String regExp;
+    
+    
+    /**
+     * Set category.
+     * @param category
+     * @ant.not-required
+     */
+    public void setCategory(String category) {
+        this.category = category;
+    }
+    
+    /**
+     * Return the category.
+     * @return
+     */
+    public String  getCategory() {
+        return this.category;
+    }
+    
+    /**
+     * Sets the regExp.
+     * @param regExp
+     * @ant.required
+     */
+    public void setRegExp(String regExp) {
+        this.regExp = regExp;
+    }
+    
+    
+    /**
+     * get the regExp.
+     * @return
+     */
+    public String  getRegExp() {
+        return this.regExp;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/types/RecordFilterSet.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,87 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.logger.ant.types;
+
+import java.util.Vector;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.Reference;
+
+/**
+ * Recorder Filter set will be used to group the recorder filters to filter ant logging output.
+ * 
+ *  To get the lines which matches the regular expression.
+ *  
+ * <pre>
+ *      &lt;hlm:recordfilterset id="recordfilter.config"&gt;
+ *          &lt;hlm:recordfilter category="error" regexp="Hello" /&gt;
+ *          &lt;hlm:recordfilter category="warning" regexp="echo" /&gt;
+ *          &lt;hlm:recordfilter category="info" regexp="ERROR" /&gt;
+ *      &lt;/hlm:recordfilterset>
+ *      
+ * </pre>
+ * 
+ * @ant.task name="Recordfilterset" category="Logging".
+ *
+ */
+
+public class RecordFilterSet extends DataType {
+    
+    private Vector<RecordFilter> recordFilters = new Vector<RecordFilter>();
+    
+    public RecordFilterSet() {
+    }
+    
+    /**
+     * Add the recordefilter type into recordfilterset.
+     * @param logFilter
+     */
+    public void addRecordFilter(RecordFilter logFilter) {
+        if (!recordFilters.contains(logFilter)) {
+            recordFilters.add(logFilter);
+        }
+    }
+    
+    
+    /**
+     * return all the recorderfilters associated with current recorderfilterset.
+     * @return
+     */
+    public Vector<RecordFilter> getAllFilters() {
+        Vector<RecordFilter> allFilters = new Vector<RecordFilter>();
+        if (recordFilters.size() > 0) {
+            allFilters.addAll(recordFilters);
+            return allFilters;
+        }
+        Reference refId = getRefid();
+        Object filterSetObject = null;
+        if (refId != null) {
+            try {
+                filterSetObject = refId.getReferencedObject();
+            } catch ( Exception ex) {
+                throw new BuildException("Reference id of the record filter is not valid. " + ex.getMessage(), ex);
+            }
+            if (filterSetObject != null && filterSetObject instanceof RecordFilterSet) {
+                allFilters.addAll(((RecordFilterSet)filterSetObject).getAllFilters());
+                return allFilters;
+            }
+        }
+        return allFilters;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/types/Stage.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.logger.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+
+
+/**
+ * A <code>Stage</code> is a Data type which stores Stage information.
+ * 
+ * <p>
+ * A Stage is defined by setting three attributes name, start and end targets, both should be a
+ * valid target name in the project.
+ * 
+ * <p>
+ * Usage:
+ * 
+ * <pre>
+ *      &lt;hlm:stage id="preparation" starttarget="stagetest" endtarget="stagetest"/&gt;              
+ * </pre>
+ *  
+ * @ant.task name="stage" category="Logging"
+ * 
+ */
+public class Stage extends DataType {
+
+    private String startTarget;
+    private String endTarget;
+
+    public Stage() {
+        
+    }
+    /**
+     * Get the starting point of this {@link Stage}.
+     * 
+     * @return the starting point of this {@link Stage}.
+     */
+    public String getStartTarget() {
+        return this.startTarget;
+    }
+
+    /**
+     * Set the starting target.
+     * 
+     * @param start
+     *            is the starting point to set.
+     * @ant.required
+     */
+    public void setStartTarget(String startTarget) {
+        this.startTarget = startTarget;
+    }
+
+    /**
+     * Get the end point of this {@link Stage}.
+     * 
+     * @return the end point of this {@link Stage}.
+     * 
+     */
+    public String getEndTarget() {
+        return this.endTarget;
+    }
+
+    /**
+     * Set the end target.
+     * 
+     * @param end
+     *            is the end point to set.
+     * @ant.required
+     */
+    public void setEndTarget(String endTarget) {
+        this.endTarget = endTarget;
+    }
+    
+    /**
+     * Check is the start target set to current target. 
+     * @param target
+     * @return
+     */
+    public boolean isStartTarget ( String target ) {
+        return this.startTarget.equals( target );
+    }
+    
+    /** Check is the end target set to current target.
+     * 
+     * @param target
+     * @return
+     */
+    public boolean isEndTarget ( String target ) {
+        return this.endTarget.equals( target );
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/types/StageLogging.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,158 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.logger.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+import com.nokia.helium.logger.ant.listener.AntLoggingHandler;
+import com.nokia.helium.logger.ant.listener.StatusAndLogListener;
+import org.apache.log4j.Logger;
+
+/**
+ * A 'StageRecord' is a Data type which stores attributes for stage recording/logging.
+ * 
+ * 
+ * Usage:
+ * <pre>
+ * &lt;hlm:stagerecord id="record.default" defaultoutput="${build.log.dir}/${build.id}_main.ant.log" loglevel="info" append="false"/&gt;
+ *      
+ *                  
+ * &lt;hlm:stagerecord id="record.prep"  
+ *                  stagerefid="preparation" 
+ *                  output="${build.log.dir}/${build.id}_prep.ant.log" 
+ *                  loglevel="info"
+ *                  append="false"/&gt;
+ *                                  
+ * </pre>
+ * 
+ * 
+ * @ant.task name="stagerecord" category="Logging"
+ */
+public class StageLogging extends DataType {
+    
+    private static boolean isAntLoggerRegistered;
+    private String logLevel = "info";
+    private String logFile;
+    private String defaultLogFile;
+    private Boolean append;
+    private String stageRefId;
+    private Logger log = Logger.getLogger(StageLogging.class);
+    /**
+     * Constructor which will register the logging handler
+     */
+    public StageLogging () {
+        if (!isAntLoggerRegistered) {
+            StatusAndLogListener.register(new AntLoggingHandler());
+            log.debug("Registering stage record to StatusAndLogListener listener");
+            isAntLoggerRegistered = true;
+        }
+    }
+    
+    /**
+     * Sets output log file name.
+     * @param outPut
+     * @ant.required
+     */
+    
+    public void setOutput(String outPut) {
+        this.logFile = outPut;
+    }
+    
+    /**
+     * Returns output log file name.
+     * @return
+     */
+    
+    public String getOutput() {
+        return this.logFile;
+    }
+    
+    /**
+     * Sets log level for respective stage.
+     * @param logLevel
+     * @ant.not-required
+     */
+    
+    public void setLogLevel(String logLevel) {
+        this.logLevel = logLevel;
+    }
+    
+    /**
+     * Returns log level of respective stage.
+     * @return
+     */
+    
+    public String getLogLevel() {
+        return this.logLevel;
+    }
+    
+    /**
+     * Get the name of this StageRefID.
+     * 
+     * @return name of the Phase.
+     */
+    public String getStageRefID() {
+        return this.stageRefId;
+    }
+
+    /**
+     * Set the name of the StageRefID.
+     * 
+     * @param name
+     *            is the name to set.
+     * @ant.required
+     */
+    public void setStageRefId(String name) {
+        this.stageRefId = name;
+    }
+    
+    /**
+     * Return default ant log file name.
+     * @return
+     */
+    public String getDefaultOutput() {
+        return this.defaultLogFile;
+    }
+
+   /**
+    * Set the default ant log name.
+    * @param name
+    * @ant.required
+    */
+    public void setDefaultOutput(String name) {
+        this.defaultLogFile = name;
+    }
+    
+    /**
+     * Set append value.
+     * @param append
+     * @ant.not-required
+     */
+    public void setAppend(boolean append) {
+        this.append = append ? Boolean.TRUE : Boolean.FALSE;
+    }
+    
+    /**
+     * Return the append value.
+     * @param append
+     * @return
+     */
+    public Boolean getAppend() {
+        return this.append;
+    }
+    
+     
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/com/nokia/helium/logger/ant/types/StageSummary.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+package com.nokia.helium.logger.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+
+import com.nokia.helium.logger.ant.listener.StageSummaryHandler;
+import com.nokia.helium.logger.ant.listener.StatusAndLogListener;
+
+/**
+ * <code>StageSummary</code> is a Data type when set a build summary is 
+ * displayed at the end of build process.
+ * 
+ * <pre>
+ * Usage:
+ *       &lt;hlm:stagesummary id=&quot;stage.summary&quot; 
+ *          template=&quot;${template.dir}\build_stages_summary.txt.ftl&quot;/&gt;
+ * </pre>
+ * 
+ * @ant.task name="stagesummary" category="Logging"
+ * 
+ */
+public class StageSummary extends DataType {
+
+    private static boolean isStageSummaryHandlerRegistered;
+    
+    private String template;
+
+    public StageSummary () {
+        if ( !isStageSummaryHandlerRegistered ) {
+            StatusAndLogListener.register( new StageSummaryHandler() );
+            isStageSummaryHandlerRegistered = true;
+        }
+    }
+    
+    /**
+     * Get the template used for displaying build stage summary.
+     * 
+     * @return the template to display build stage summary.
+     */
+    public String getTemplate () {
+        return template;
+    }
+
+    /**
+     * Set the template to be used for displaying build stage summary.
+     * 
+     * @param template
+     *            the template to set
+     * @ant.required           
+     */
+    public void setTemplate ( String template ) {
+        this.template = template;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/src/templates/build_stages_summary.txt.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,35 @@
+<#--
+============================================================================ 
+Name        : build_stages_summary.txt.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+
+*** BUILD STAGE SUMMARY ***
+
+<#assign count = 0>
+<#list statusReports as report>
+<#assign count = count + 1>
+${count}) ${report["phaseName"]}
+${""?left_pad(2)} Start Time : ${report["startTime"]}
+${""?left_pad(2)} Duration   : ${report["duration"]}
+${""?left_pad(2)} Status     : ${report["status"]}
+<#if  report["status"] == "FAILED">
+${""?left_pad(2)} Reason     : ${report["reason"]}
+</#if>
+</#list>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/tests/antunit/test_stageslogging.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_signaltask.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-stage" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib Signal unittests.</description>
+    
+    
+    <property environment="env"/>
+
+    <import file="../stages_config.ant.xml" />
+    <import file="../build.xml" />        
+    <target name="test-stages" depends="run-stages">    
+        <au:assertFileExists file="${build.log.dir}/${build.id}_main.ant.log"/>
+        <au:assertFileExists file="${build.log.dir}/${build.id}_prep.ant.log"/>
+        <au:assertFileExists file="${build.log.dir}/${build.id}_compile.ant.log"/>
+        <au:assertFileExists file="${build.log.dir}/${build.id}_stagetest.log"/>
+        
+        
+        <loadfile srcfile="${build.log.dir}/${build.id}_stagetest.log" property="recordfilter.task.log">
+            <filterchain>
+                <linecontainsregexp>
+                    <regexp pattern="ERROR"/>
+                </linecontainsregexp>
+            </filterchain>
+        </loadfile>
+        <au:assertTrue message="record task is not doing the record filtering">
+            <not>
+                <isset property="recordfilter.task.log"/>
+            </not>
+        </au:assertTrue>
+        
+        <loadfile srcfile="${build.log.dir}/${build.id}_stagetest.log" property="passwordfilter.task.log">
+            <filterchain>
+                <linecontainsregexp>
+                    <regexp pattern="synergy"/>
+                </linecontainsregexp>
+            </filterchain>
+        </loadfile>
+        <au:assertTrue message="record task is not doing the password filtering">
+            <not>
+                <isset property="passwordfilter.task.log"/>
+            </not>
+        </au:assertTrue>
+        
+        <loadfile srcfile="${build.log.dir}/${build.id}_stagetest.log" property="passwordfilter.log">
+            <filterchain>
+                <linecontainsregexp>
+                    <regexp pattern="something"/>
+                </linecontainsregexp>
+            </filterchain>
+        </loadfile>
+        <au:assertTrue message="record task is not doing the password filtering">
+            <not>
+                <isset property="passwordfilter.log"/>
+            </not>
+        </au:assertTrue>
+    
+        
+    </target>
+ 
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/tests/bld.sh	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+if [ -f ~/.bashrc ] ; then
+	. ~/.bashrc
+fi
+MODULE_VERSION="$(module --version 2>&1)"
+if [ "$?" == "0" ] ; then
+    module load "java/1.6.0"
+    module load "tww/ant/1.7.1"
+fi
+export TEMP="/tmp/$USER"
+
+export ANT_ARGS="-lib ../lib -lib ../../lib -lib ../../bin/helium-logging.jar -lib ../../antlibs -listener com.nokia.helium.logger.ant.listener.StatusAndLogListener"
+ant $*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/tests/build.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,27 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set ANT_ARGS=-lib %CD%\..\lib -lib %CD%\..\..\lib -lib %CD%\..\..\bin\helium-logging.jar -lib %CD%\..\..\antlibs -lib ..\..\bin\helium-core.jar -listener com.nokia.helium.logger.ant.listener.StatusAndLogListener
+ant -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor %*
+endlocal
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/tests/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-unittest" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib Logging unittests.</description>
+    
+    
+    <import file="../../test-macros.ant.xml" />
+    <dirname property="stages.test.dir" file="${ant.file.helium-antlib-unittest}"/>
+    <property name="template.dir" location="../src/templates"/>
+    <target name="unittest" depends="unittest-logging" />
+
+    <target name="unittest-logging">
+        <antunitModule name="logging" />
+    </target>
+    
+    <property environment="env"/>
+    
+    <taskdef resource="net/sf/antcontrib/antlib.xml"/>
+    
+    <property name="build.log.dir" location="${stages.test.dir}\logs"/>
+    <property name="build.log" location="${stages.test.dir}\logs\${build.id}_test.log"/>
+    <property name="build.cache.log.dir" location="${stages.test.dir}\logs"/>
+    <property name="build.id" value="ant-logging-test"/>
+    <property name="display" value="Message for testing"/>
+    <import file="stages_config.ant.xml" />       
+    
+    <target name="run-stages">
+        
+        <echo> Before calling target </echo> 
+        <echo>grace</echo>
+        
+        <antcall target="hello-test"/>
+        <antcall target="compile"/>
+        <ant antfile="${stages.test.dir}/prep-ccm-get-input.ant.xml" target="prep-ccm-get-input"/>
+        
+        <echo> After calling target </echo>
+    </target>
+    
+    <target name="compile" depends="creatbom,get-env"/>
+    
+    
+    <hlm:recordfilterset id="recordfilter.config">
+        <hlm:recordfilter category="info" regexp="ERROR" />
+    </hlm:recordfilterset>
+    
+    <target name="hello-test" depends="get-password">
+        
+        <hlm:record name="${build.log.dir}/${build.id}_stagetest.log" action="start" loglevel="info">
+            <hlm:recordfilterset refid="recordfilter.config"/>
+            <hlm:recordfilter category="unix" regexp="${unix.password}" />
+            <hlm:recordfilter category="synergy" regexp="synergy" />
+        </hlm:record>
+        
+        <antcall target="stagetest">
+            <param name="display" value="Inside stage test for first time synergy ERROR"/>
+        </antcall>
+        <antcall target="stagetest">
+            <param name="display" value="Inside stage test for second time grace INFO"/>
+        </antcall>
+        
+        <hlm:record name="${build.log.dir}/${build.id}_stagetest.log" action="stop" append="true" />
+        <echo>unix-password = ${unix.password}</echo>
+        <property name="ats.password" value="password"/>
+        <hlm:logreplace regexp="${ats.password}"/>
+        <echo>ats-password = ${ats.password}</echo>
+        <antcall target="get-env"/>
+        <antcall target="hello"/>
+        
+    </target>
+    
+    <target name="stagetest" >
+        <echo>${unix.password}</echo>
+        <echo>synergy</echo>
+        <echo> Hello... inside stagetest target ${display}</echo>
+    </target>
+    
+    <target name="creatbom">
+        <echo> Hello... inside creatbom target </echo>
+    </target>
+    
+    <target name="get-env">
+        <echo> Hello... inside get-env target ${display} </echo>
+    </target>
+    
+    <target name="hello">
+        <echo> Hello... inside hello target ${display} </echo>
+    </target>
+    
+    <target name="get-password">
+        <property name="unix.password" value="something"/>
+        <hlm:logreplace regexp="${unix.password}"/>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/tests/build_stages_summary.txt.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,35 @@
+<#--
+============================================================================ 
+Name        : build_stages_summary.txt.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+
+*** BUILD STAGE SUMMARY ***
+
+<#assign count = 0>
+<#list statusReports as report>
+<#assign count = count + 1>
+${count}) ${report["phaseName"]}
+${""?left_pad(2)} Start Time : ${report["startTime"]}
+${""?left_pad(2)} Duration   : ${report["duration"]}
+${""?left_pad(2)} Status     : ${report["status"]}
+<#if  report["status"] == "FAILED">
+${""?left_pad(2)} Reason     : ${report["reason"]}
+</#if>
+</#list>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/tests/prep-ccm-get-input.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : prep-ccm-get-input.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="prep-ccm-get-input" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib Logging unittests.</description>
+        
+    
+    <property environment="env"/>
+    
+    
+    <target name="prep-ccm-get-input">
+        <antcall target="prep">
+            <param name="display" value="Inside prep target for first time"/>
+        </antcall>
+        <antcall target="prep">
+            <param name="display" value="Inside prep target for second time"/>
+        </antcall>
+        <antcall target="init"/>
+        <antcall target="ccm-get-input"/>
+    </target>
+    
+    <target name="prep">
+        <echo> Hello... Inside Prep target ${display}</echo>
+    </target>
+    
+    <target name="ccm-get-input">
+        <echo> Hello... Inside ccm-get-input target </echo>
+    </target>
+    
+    <target name="init">
+        <echo> Hello... Inside init target ${display} </echo>
+    </target> 
+    
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/logging/tests/stages_config.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : stages_config.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="stages-config" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Definitions of helium stages. 
+    </description>
+    
+    <taskdef resource="com/nokia/helium/logger/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+    
+    <dirname property="logging.test.project.dir" file="${ant.file.stages-config}" />
+    
+    <hlm:stagesummary id="stage.summary" template="${logging.test.project.dir}\build_stages_summary.txt.ftl" />
+
+    <hlm:stage id="preparation" starttarget="hello-test" endtarget="hello-test"/>
+    <hlm:stage id="compile" starttarget="compile" endtarget="compile"/>
+    <hlm:stage id="post" starttarget="prep-ccm-get-input" endtarget="prep-ccm-get-input"/>
+    
+    <hlm:stagerecord id="record.default" defaultoutput="${build.log.dir}/${build.id}_main.ant.log" loglevel="info" append="false"/>
+    
+    <hlm:stagerecord id="record.prep"  stagerefid="preparation" output="${build.log.dir}/${build.id}_prep.ant.log" loglevel="info" append="false"/>
+    
+    <hlm:stagerecord id="record.compile"  stagerefid="compile" output="${build.log.dir}/${build.id}_compile.ant.log" loglevel="info" append="false"/>
+    
+    <hlm:stagerecord id="record.post"  stagerefid="post" output="${build.log.dir}/${build.id}_post.ant.log" loglevel="info" append="false"/>
+    
+</project>
--- a/buildframework/helium/external/helium-antlib/macros.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/macros.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -24,7 +24,7 @@
     <description>Helium Antlib build macro.</description>
     
     <dirname property="helium.antlib.root.dir" file="${ant.file.build-macros}" />
-    <property name="build.temp.dir" location="${basedir}/../build" />
+    <property name="build.temp.dir" location="${helium.antlib.root.dir}/../build" />
     <property name="bin.dir" location="${basedir}/../bin" />
 
     <path id="helium.antlib.classpath">
@@ -71,7 +71,8 @@
                 <fileset dir="${build.temp.dir}/@{name}/classes" />
                 <fileset dir="${basedir}/src" includes="**/*.xml" />
                 <fileset dir="${basedir}/src" includes="**/*.*ftl" />
-
+                <fileset dir="${basedir}/src" includes="**/*.vm" />
+                
                 <manifest>
                     <section name="common">
                         <attribute name="Implementation-Title" value="@{name}" />
@@ -86,18 +87,67 @@
     <macrodef name="testModule">
         <attribute name="name" />
         <attribute name="dir" default="${helium.antlib.root.dir}" />
+        <attribute name="bindir" default="${bin.dir}" />
         <sequential>
+            <mkdir dir="${build.temp.dir}" />
             <if>
                 <available type="dir" file="${basedir}/tests"/>
                 <then>
-                    <exec osfamily="windows" executable="cmd" dir="${basedir}/tests">
-                        <env key="ANT_LIB_HOME" path="${helium.antlib.root.dir}"/>
-                        <arg line="/c build.bat unittest" />
-                    </exec>
-                    <exec osfamily="unix" executable="./bld.sh" dir="${basedir}/tests">
-                        <env key="ANT_LIB_HOME" path="${helium.antlib.root.dir}"/>
-                        <arg line="unittest" />
-                    </exec>
+                    <trycatch>
+                        <try>
+                            <!-- Temporarly replacing the jar file
+                                 with an instrumented one to do the 
+                                 actual coverage measurment
+                             -->
+                            <mkdir dir="${build.temp.dir}/@{name}/backup" />
+                            <delete>
+                                <fileset dir="${build.temp.dir}" includes="@{name}/**/*_antunit.emma" />
+                            </delete>
+                            <copy file="@{bindir}/helium-@{name}.jar" todir="${build.temp.dir}/@{name}/backup/" />
+                            <emma enabled="true">
+                                <instr destdir="@{bindir}/" metadatafile="${build.temp.dir}/@{name}/metadata_antunit.emma" merge="true" mode="overwrite">
+                                    <instrpath>
+                                        <fileset dir="@{bindir}" includes="helium-@{name}.jar" />
+                                    </instrpath>
+                                </instr>
+                            </emma>
+                            <exec osfamily="windows" executable="cmd" dir="${basedir}/tests">
+                                <env key="ANT_LIB_HOME" path="${helium.antlib.root.dir}" />
+                                <arg line="/c build.bat unittest" />
+                            </exec>
+                            <exec osfamily="unix" executable="./bld.sh" dir="${basedir}/tests">
+                                <env key="ANT_LIB_HOME" path="${helium.antlib.root.dir}" />
+                                <arg line="unittest" />
+                            </exec>
+                            <move todir="${build.temp.dir}/@{name}">
+                                <fileset dir="${basedir}/tests" includes="**/coverage.ec" />
+                                <chainedmapper>
+                                    <filtermapper>
+                                        <replacestring from="/" to="_" />
+                                    </filtermapper>
+                                    <regexpmapper from="^(.*)\.ec$$" to="\1_antunit.emma" />
+                                </chainedmapper>
+                            </move>
+                            <emma enabled="true">
+                                <report>
+                                    <infileset dir="${build.temp.dir}/@{name}/" includes="*_antunit.emma" />
+                                    <txt outfile="${build.temp.dir}/@{name}/coverage_antunit.txt" />
+                                    <html outfile="${build.temp.dir}/@{name}/coverage_antunit.html" />
+                                    <xml outfile="${build.temp.dir}/@{name}/coverage_antunit.xml" />
+                                </report>
+                            </emma>
+                            <if>
+                                <available file="${build.temp.dir}/@{name}/coverage_antunit.txt" />
+                                <then>
+                                    <loadfile property="message" srcFile="${build.temp.dir}/@{name}/coverage_antunit.txt" />
+                                    <echo message="${message}" />
+                                </then>
+                            </if>
+                        </try>
+                        <finally>
+                            <copy file="${build.temp.dir}/@{name}/backup/helium-@{name}.jar" todir="@{bindir}" overwrite="true" />
+                        </finally>
+                    </trycatch>
                 </then>
             </if>
         </sequential>
@@ -115,60 +165,72 @@
     <macrodef name="junitModule">
         <attribute name="name" />
         <attribute name="dir" default="${helium.antlib.root.dir}" />
+        <attribute name="bindir" default="${bin.dir}" />
         <sequential>
+            <mkdir dir="${build.temp.dir}" />
             <if>
                 <available type="dir" file="${basedir}/tests/src"/>
                 <then>
                     <echo>JUnit test module @{name}</echo>
                     <delete dir="${build.temp.dir}/@{name}/junit_classes"/>
+                    <delete>
+                        <fileset dir="${build.temp.dir}" includes="@{name}/**/*_junit.emma" />
+                    </delete>
                     <mkdir dir="${build.temp.dir}/@{name}/junit_classes" />
                     <javac srcdir="${basedir}/tests/src" destdir="${build.temp.dir}/@{name}/junit_classes" debug="true" source="1.5" target="1.5">
                         <classpath refid="helium.antlib.classpath" />
                         <classpath refid="helium.@{name}.classpath" />
+                        <classpath>
+                            <fileset dir="@{bindir}" includes="*-@{name}.jar" />
+                        </classpath>
                         <include name="**/*.java" />
                     </javac>
-                    
-                    <path id="build.classpath">
-                        <pathelement location="${build.temp.dir}/@{name}/classes" />
-                        <pathelement location="${build.temp.dir}/@{name}/junit_classes" />
-                    </path>
-                    
+            
+                    <copy file="@{bindir}/helium-@{name}.jar" todir="${build.temp.dir}/@{name}/" overwrite="true"/>
                     <emma enabled="true">
-                        <instr instrpathref="build.classpath"  
-                        destdir="${build.temp.dir}/@{name}/emma/instrumented"  
-                        metadatafile="${build.temp.dir}/@{name}/metadata.emma"
-                        merge="true">
-                            <filter excludes="org.apache.log4j.*" />
+                        <instr destdir="${build.temp.dir}/@{name}/" metadatafile="${build.temp.dir}/@{name}/metadata_junit.emma" merge="true" mode="overwrite">
+                            <instrpath>
+                                <fileset dir="${build.temp.dir}/@{name}/" includes="helium-@{name}.jar" />
+                            </instrpath>
                         </instr>
                     </emma>
                     
+                    <delete file="${build.temp.dir}/@{name}/coverage.emma" failonerror="false" />
                     <junit fork="yes" printsummary="yes" haltonfailure="yes" showoutput="yes">
                         <formatter type="brief" usefile="false"/>
-                        <jvmarg value="-Demma.coverage.out.file=${build.temp.dir}/@{name}/coverage.emma" />
-                        <jvmarg value="-Demma.coverage.out.merge=false" />
+                        <jvmarg value="-Demma.coverage.out.file=${build.temp.dir}/@{name}/coverage_junit.emma" />
+                        <jvmarg value="-Demma.coverage.out.merge=true" />
                         <jvmarg value="-Dtestdir=${basedir}" />
+                        <classpath>
+                            <pathelement path="${build.temp.dir}/@{name}/helium-@{name}.jar"/>
+                            <pathelement path="${helium.antlib.root.dir}/antlibs/*.jar"/>
+                            <pathelement path="${build.temp.dir}/@{name}/junit_classes" />
+                        </classpath>
                         <classpath refid="helium.antlib.classpath" />
                         <classpath refid="helium.@{name}.classpath" />
-                        <classpath>
-                            <pathelement path="${build.temp.dir}/@{name}/emma/instrumented"/>
-                            <pathelement path="${helium.antlib.root.dir}/antlibs/*.jar"/>
-                        </classpath>
                         <batchtest fork="yes" todir="${build.temp.dir}/@{name}/junit_test">
                             <fileset dir="${basedir}/tests/src">
                                 <include name="**/*Test*.java"/>
                             </fileset>
                         </batchtest>
                     </junit>
+                    <delete file="${build.temp.dir}/@{name}/helium-@{name}.jar" failonerror="false" />
                     
                     <emma enabled="true" >
                         <report>
-                            <infileset dir="${build.temp.dir}/@{name}" includes="*.emma" />
+                            <infileset dir="${build.temp.dir}/@{name}" includes="*_junit.emma" />
                             <txt outfile="${build.temp.dir}/@{name}/coverage.txt" />
                             <html outfile="${build.temp.dir}/@{name}/coverage.html" />
+                            <xml outfile="${build.temp.dir}/@{name}/coverage.xml" />
                         </report>
                     </emma>
-                    <loadfile property="message" srcFile="${build.temp.dir}/@{name}/coverage.txt"/>
-                    <echo message="${message}"/>
+                    <if>
+                        <available file="${build.temp.dir}/@{name}/coverage.txt" />
+                        <then>
+                            <loadfile property="message" srcFile="${build.temp.dir}/@{name}/coverage.txt"/>
+                            <echo message="${message}"/>
+                        </then>
+                    </if>
                 </then>
             </if>
         </sequential>
--- a/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/SQLFMPPLoader.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/SQLFMPPLoader.java	Wed Dec 23 19:29:07 2009 +0200
@@ -34,6 +34,7 @@
 import com.nokia.helium.metadata.db.MetaDataDb;
 import org.apache.log4j.Logger;
 
+
 /**
  * Utility class to access the data from the database and used by FMPP
  * templates.
@@ -52,11 +53,11 @@
      * @see fmpp.tdd.DataLoader#load(fmpp.Engine, java.util.List)
      */
     public Object load(Engine engine, List args) throws Exception {
-        log.debug("args.size:" + args.size());
+        //log.debug("args.size:" + args.size());
         java.util.ListIterator iter = args.listIterator();
         int argsSize = args.size();
         if (argsSize < 1) {
-            throw new Exception("input DB path should be provided");
+            throw new Exception("Input DB path should be provided to load into FMPP.");
         }
 
         /* arg[0] - dbpath
@@ -82,7 +83,7 @@
          * @return returns the template model for the query 
          */
         public TemplateModel get(String query) {
-            log.debug("QueryModel:" + query);
+            //log.debug("QueryModel:" + query);
             return new QueryTemplateModel(query);
         }
 
@@ -111,7 +112,7 @@
          * @param query for which the template model needs to be returned.
          */
         public QueryTemplateModel(String query) {
-            log.debug("query in SQLTemplateModel" + query);
+            //log.debug("query in SQLTemplateModel" + query);
             this.query = query;
         }
 
@@ -121,9 +122,9 @@
          */
         public TemplateModel get(String key) {
             checkAndReadData();
-            log.debug("QueryModel:" + key);
+            //log.debug("QueryModel:" + key);
             List<String> dataList = indexMap.get(key);
-            log.debug("datalist size" + dataList.size());
+            //log.debug("datalist size" + dataList.size());
             if (dataList.size() ==  1 ) {
                 return new SimpleScalar((String)dataList.get(0));
             }
@@ -136,11 +137,11 @@
          */
         private void checkAndReadData() {
             if (!isDataRead) {
-                log.debug("isDataRead:" + isDataRead);
+                //log.debug("isDataRead:" + isDataRead);
                 isDataRead = true;
                 indexMap = metadataDb.getIndexMap(query); 
             }
-            log.debug("indexmap size" + indexMap.size());
+            //log.debug("indexmap size" + indexMap.size());
         }
 
         /*
@@ -196,7 +197,7 @@
          * @return the iterator model from which the data is accessed.
          */
         public TemplateModelIterator iterator() {
-            log.debug("iterator constructor called");
+            //log.debug("iterator constructor called");
             return new SQLTemplateModelIterator(query);
         }
     }
@@ -218,15 +219,17 @@
         public TemplateModel next() {
             SimpleHash simpleHash = null;
             try {
-                log.debug("checking any more element");
+                //log.debug("checking any more element");
                 if (rowList != null && (count >= rowList.size())) {
                     finished = true;
                 }
-                log.debug("next:count:" + count);
+                //log.debug("next:count:" + count);
                 simpleHash = new SimpleHash(rowList.get(count));
                 count ++;
                 return simpleHash;
             } catch (Exception ex) {
+                // We are Ignoring the errors as no need to fail the build.
+                log.debug("Iteration exception" + ex.getMessage());
                 ex.printStackTrace();
             }
             return null;
@@ -235,10 +238,10 @@
         public boolean hasNext() {
             if (rowList == null ||  READ_LIMIT <= count) {
                 if (!finished) {
-                    log.debug("getting records");
+                    //log.debug("Getting records");
                     rowList = metadataDb.getRecords(query, READ_LIMIT, currentOffsetIndex * READ_LIMIT);
                     count = 0;
-                    log.debug("rowList.size : " + rowList.size());
+                    //log.debug("rowList.size : " + rowList.size());
                     if (rowList.size() == 0) {
                         finished = true;
                     }
--- a/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/antlib.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/antlib.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -23,6 +23,7 @@
 <antlib>
     <!-- Task definition -->
     <taskdef name="metadatarecord" classname="com.nokia.helium.metadata.ant.taskdefs.MetaDataRecord"/>
+    <taskdef name="metadatadelete" classname="com.nokia.helium.metadata.ant.taskdefs.MetaDataDelete"/>
     <!-- Type definition -->
     <typedef name="textmetadatainput" classname="com.nokia.helium.metadata.ant.types.TextLogMetaDataInput"/>
     <typedef name="antmetadatainput" classname="com.nokia.helium.metadata.ant.types.AntLogMetaDataInput"/>
--- a/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/conditions/MetaDataLogCondition.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/conditions/MetaDataLogCondition.java	Wed Dec 23 19:29:07 2009 +0200
@@ -81,8 +81,7 @@
         if (severity == null)
             throw new BuildException("'severity' attribute is not defined");
 
-        this.log("Looking for severity '" + severity + "' under '"
-                + fileName.getAbsolutePath() + "'");
+        //this.log("Looking for severity '" + severity + "' under '" + fileName.getAbsolutePath() + "'");
         
         MetaDataDb.Priority prty = null;
         if (severity.equalsIgnoreCase("ERROR")) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/taskdefs/MetaDataDelete.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.metadata.ant.taskdefs;
+
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import java.util.Vector;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.log4j.Logger;
+import com.nokia.helium.metadata.db.*;
+import java.util.Date;
+
+/**
+ * This task provide a way to delete the data from db for a log file set.
+ * 
+ * <pre>
+ * Example 1:
+ * &lt;metadadelete database=&quot;compile_log.db&quot;&gt;
+ *     &lt;fileset casesensitive=&quot;false&quot; file=&quot;sbs.log.file&quot;/&gt
+ * &lt;/metadadelete&gt;
+ * </pre>
+ * 
+ * @ant.task name="metadatadelete" category="Metadata"
+ */
+public class MetaDataDelete extends Task {
+
+    private static Logger log = Logger.getLogger(MetaDataDelete.class);
+
+    private String database;
+    
+    private boolean failOnError = true;
+
+    private Vector<FileSet> fileSetList = new Vector<FileSet>();
+
+    /**
+     * Helper function to set the database parameter
+     * 
+     * @ant.required
+     */
+    public void setDatabase(String dbFile) {
+        database = dbFile;
+    }
+
+    public void setFailOnError(String failNotify) {
+        if (failNotify.equals("false")) {
+            failOnError = false;
+        }
+    }
+
+    /**
+     * Updates the list of filelist from the input fileset.
+     *  @param fileSetList input fileset list
+     *  @return the matched files including the base dir. 
+     */
+    private List<String> getFileListFromFileSet() {
+        List<String> fileList = new ArrayList<String>();
+        for (FileSet fs : fileSetList) {
+            DirectoryScanner ds = fs.getDirectoryScanner(getProject());
+            String[] includedFiles = ds.getIncludedFiles();
+            for ( String file : includedFiles ) {
+                fileList.add(file);
+                log.debug("includedfiles: " + file);
+            }
+        }
+        log.debug("fileList.size" + fileList.size());
+        return fileList;
+    }
+
+    /**
+     * Adds the fileset (list of input log files to be processed).
+     *  @param fileSet fileset to be added
+     * 
+     */
+    public void add(FileSet fileSet) {
+        fileSetList.add(fileSet);
+    }   
+
+    /**
+     * Helper function to get the database
+     * 
+     */
+    public String getDatabase() {
+        return database;
+    }
+
+    
+    @Override
+    public void execute() {
+        MetaDataDb metadataDb = null;
+        try {
+            log.debug("Initializing DB: " + database + "to delete");
+            log("time before removing entries from db" + new Date());
+            metadataDb = new MetaDataDb(database);
+            metadataDb.removeEntries(getFileListFromFileSet());
+            log("time after removing entries from db" + new Date());
+        } catch (BuildException ex1) {
+            if (failOnError) {
+                throw ex1;
+            }
+        } catch (Exception ex) {
+            if (failOnError) {
+                throw new BuildException("Failed during writing data to db");
+            }
+        } finally {
+            log.debug("finalizing DB: " + database);
+            if (metadataDb != null) {
+                metadataDb.finalizeDB();
+            }
+        }
+    }
+}
\ No newline at end of file
--- a/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/taskdefs/MetaDataRecord.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/taskdefs/MetaDataRecord.java	Wed Dec 23 19:29:07 2009 +0200
@@ -22,10 +22,9 @@
 import org.apache.tools.ant.Task;
 import java.util.Vector;
 import java.util.Iterator;
-//import java.util.ArrayList;
 import org.apache.log4j.Logger;
-//import org.apache.tools.ant.types.FileSet;
 import com.nokia.helium.metadata.db.*;
+import java.util.Date;
 
 /**
  * This task provide a way to record the data in the Database.
@@ -114,6 +113,7 @@
             log.debug("Initializing DB: " + database);
             metadataDb = new MetaDataDb(database);
             log.debug("Parsing the input and writing to DB");
+            log("time before recording to db" + new Date());
             for ( MetaDataInput metadataInput : metadataList ) {
                 boolean removed = false;
                 Iterator<MetaDataDb.LogEntry> inputIterator = metadataInput.iterator();
@@ -125,6 +125,7 @@
                     metadataDb.addLogEntry(logEntry);
                 }
             }
+            log("time after recording to db" + new Date());
             log.debug("Successfully writen to DB");
         } catch (BuildException ex1) {
             if (failOnError) {
--- a/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/AbldLogMetaDataInput.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/AbldLogMetaDataInput.java	Wed Dec 23 19:29:07 2009 +0200
@@ -60,36 +60,41 @@
     public AbldLogMetaDataInput() {
     }
 
-    public boolean isEntryAvailable() {
+    /**
+     * Function to check from the input stream if is there any entries available.
+     * @return true if there are any entry available otherwise false.
+     */
+    public boolean isEntryCreated(File currentFile) {
         String exceptions = "";
-        int currentFileIndex = getCurrentFileIndex();
         int lineNumber = getLineNumber(); 
         BufferedReader currentReader = getCurrentReader();
-        
         log.debug("Getting next set of log entries for Abld Input");
-        //log.debug("currentFileIndex" + currentFileIndex);
-        List<File> fileList = getFileList();
-        int fileListSize = fileList.size();
-        log.debug("fileList.size" + fileListSize);
-        while (currentFileIndex < fileListSize) {
-            try {
-                //log.debug("currentfileindex while getting file name: " + currentFileIndex);
-                File currentFile = fileList.get(currentFileIndex);
-                if (currentReader == null) {
-                    lineNumber = 0;
-                    setLineNumber(lineNumber);
-                    log.debug("Current abld log file name:" + currentFile);
-                    log.info("Processing file: " + currentFile);
-                    currentReader = new BufferedReader(new FileReader(currentFile));
-                    setCurrentReader(currentReader);
-                }
-                String logText = null;
-                while ((logText = currentReader.readLine()) != null) {
-                    lineNumber ++;
-                    setLineNumber(lineNumber);
-                    logText = logText.replaceFirst("'^\\s*\\[.+?\\]\\s*", "");
-                    if (logText.startsWith("++ Finished at")) {
-                        //log.debug("matching finished regex");
+        try {
+            if (currentReader == null) {
+                lineNumber = 0;
+                setLineNumber(lineNumber);
+                log.debug("Current abld log file name:" + currentFile);
+                log.debug("Processing file: " + currentFile);
+                currentReader = new BufferedReader(new FileReader(currentFile));
+                setCurrentReader(currentReader);
+            }
+            String logText = null;
+            while ((logText = currentReader.readLine()) != null) {
+                lineNumber ++;
+                setLineNumber(lineNumber);
+                logText = logText.replaceFirst("'^\\s*\\[.+?\\]\\s*", "");
+                if (logText.startsWith("++ Finished at")) {
+                    if (currentComponent != null && !entryCreated) {
+                        addEntry("DEFAULT", currentComponent, currentFile.toString(), 
+                                0, "" );
+                        entryCreated = true;
+                        recordText = false;
+                        return true;
+                    }
+                    entryCreated = false;
+                } else if (logText.startsWith("=== ")) {
+                    Matcher finishMatch = abldFinishedPattern.matcher(logText);
+                    if (finishMatch.matches()) {
                         if (currentComponent != null && !entryCreated) {
                             addEntry("DEFAULT", currentComponent, currentFile.toString(), 
                                     0, "" );
@@ -98,69 +103,46 @@
                             return true;
                         }
                         entryCreated = false;
-                    } else if (logText.startsWith("=== ")) {
-                        //log.debug("trying to match with finish pattern =======");
-                        Matcher finishMatch = abldFinishedPattern.matcher(logText);
-                        if (finishMatch.matches()) {
-                            if (currentComponent != null && !entryCreated) {
-                                addEntry("DEFAULT", currentComponent, currentFile.toString(), 
-                                        0, "" );
-                                entryCreated = true;
-                                recordText = false;
-                                return true;
-                            }
-                            entryCreated = false;
-                        } else {
-                            //log.debug("trying to match the start pattern");
-                            Matcher componentMatch = abldComponentPattern.matcher(logText);
-                            if (componentMatch.matches()) {
-                                //log.debug("matched abldComponentPattern");
-                                currentComponent = componentMatch.group(2);
-                                recordText = true;
-                            }
+                    } else {
+                        Matcher componentMatch = abldComponentPattern.matcher(logText);
+                        if (componentMatch.matches()) {
+                            currentComponent = componentMatch.group(2);
+                            recordText = true;
+                        }
 
-                            Matcher startMatch = abldStartedPattern.matcher(logText);
-                            if (startMatch.matches()) {
-                                //log.debug("matched abldStartedPattern");
-                                currentComponent = startMatch.group(1);
-                                recordText = true;
-                            }
+                        Matcher startMatch = abldStartedPattern.matcher(logText);
+                        if (startMatch.matches()) {
+                            currentComponent = startMatch.group(1);
+                            recordText = true;
                         }
-                    } else {
-                        if (recordText) {
-                            String severity = getSeverity(logText);
-                            if (severity != null) {
-                                //log.debug("severity:" + severity);
-                                //log.debug("currentFile:" + currentFile);
-                                //log.debug("lineNumber:" + lineNumber);
-                                //log.debug("logText:" + logText);
-                                entryCreated = true; 
-                                addEntry(severity, currentComponent, currentFile.toString(), 
-                                        lineNumber, logText );
-                                return true;
-                            }
+                    }
+                } else {
+                    if (recordText) {
+                        String severity = getSeverity(logText);
+                        if (severity != null) {
+                            entryCreated = true; 
+                            addEntry(severity, currentComponent, currentFile.toString(), 
+                                    lineNumber, logText );
+                            return true;
                         }
                     }
                 }
-                currentReader.close();
-                currentReader = null;
-                setCurrentReader(currentReader);
-                currentFileIndex ++;
-                setCurrentFileIndex(currentFileIndex);
-                //log.debug("currentfileindex: " + currentFileIndex);
-                //log.debug("fileListSize: " + fileListSize);
-            } catch (Exception ex) {
-                log.debug("Exception in AbldLogMetadata", ex);
-               try {
-                   currentReader.close();
-               } catch ( IOException iex) {
-                   log.debug("Exception in closing reader");
-               }
-               currentReader = null;
-               setCurrentReader(null);
-               exceptions = exceptions + ex.getMessage() + "\n";
-               return false;
             }
+            currentReader.close();
+            currentReader = null;
+            setCurrentReader(currentReader);
+        } catch (Exception ex) {
+            log.debug("Exception in AbldLogMetadata", ex);
+           try {
+               currentReader.close();
+           } catch ( IOException iex) {
+               // We are Ignoring the errors as no need to fail the build. 
+               log.debug("Exception in closing reader", iex);
+           }
+           currentReader = null;
+           setCurrentReader(null);
+           exceptions = exceptions + ex.getMessage() + "\n";
+           return false;
         }
         if (!exceptions.equals("")) {
             throw new BuildException(exceptions);
--- a/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/AntLogMetaDataInput.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/AntLogMetaDataInput.java	Wed Dec 23 19:29:07 2009 +0200
@@ -52,82 +52,69 @@
     
     private boolean entryCreated;
     
+    /**
+     * Constructor
+     */
     public AntLogMetaDataInput() {
     }
 
-    public boolean isEntryAvailable() {
+    /**
+     * Function to check from the input stream if is there any entries available.
+     * @return true if there are any entry available otherwise false.
+     */
+    public boolean isEntryCreated(File currentFile) {
         String exceptions = "";
-        int currentFileIndex = getCurrentFileIndex();
         int lineNumber = getLineNumber(); 
         BufferedReader currentReader = getCurrentReader();
-        log.debug("Getting next set of log entries for Ant Input");
-        //log.debug("currentFileIndex" + currentFileIndex);
-        List<File> fileList = getFileList();
-        //log.debug("is filelist empty" + fileList.isEmpty());
-        int fileListSize = fileList.size();
-        log.debug("fileList.size" + fileListSize);
-        while (currentFileIndex < fileListSize) {
-            try {
-                lineNumber ++;
-                setLineNumber(lineNumber);
-                log.debug("currentfileindex while getting file name: " + currentFileIndex);
-                File currentFile = fileList.get(currentFileIndex);
-                if (currentReader == null) {
-                    setLineNumber(0);
-                    log.debug("Current Text log file name:" + currentFile);
-                    log.info("Processing file: " + currentFile);
-                    currentReader = new BufferedReader(new FileReader(currentFile));
-                    setCurrentReader(currentReader);
-                }
-                String logText = "";
-                while ((logText = currentReader.readLine()) != null) {
-                    //log.debug("logtext : " + logText + " line-number: " + lineNumber);
-                    //log.debug("logtext : " + logText + " line-number: " + lineNumber);
-                    Matcher match = antTargetPattern.matcher(logText); 
-                    if (match.matches()) {
-                        if (currentComponent != null && !entryCreated) {
-                            addEntry("DEFAULT", currentComponent, currentFile.toString(), 
-                                    0, "" );
-                            entryCreated = true;
-                            return true;
-                        }
-                        entryCreated = false;
-                        currentComponent = match.group(1);
-                        //log.debug("currentComponent:" + currentComponent);
-                    }
-                    logText = logText.replaceFirst("^[ ]*\\[.+?\\][ ]*", "");
-                    String severity = getSeverity(logText);
-                    if (severity != null) {
-//                        log.debug("severity:" + severity);
-//                        log.debug("currentFile:" + currentFile);
-//                        log.debug("lineNumber:" + lineNumber);
-//                        log.debug("logText:" + logText);
+        try {
+            if (currentReader == null) {
+                setLineNumber(0);
+                log.debug("Current Text log file name:" + currentFile);
+                log.debug("Processing file: " + currentFile);
+                currentReader = new BufferedReader(new FileReader(currentFile));
+                setCurrentReader(currentReader);
+            }
+            String logText = "";
+            while ((logText = currentReader.readLine()) != null) {
+                Matcher match = antTargetPattern.matcher(logText); 
+                if (match.matches()) {
+                    if (currentComponent != null && !entryCreated) {
+                        addEntry("DEFAULT", currentComponent, currentFile.toString(), 
+                                0, "" );
                         entryCreated = true;
-                        // If there is no current component which means
-                        // it is a redirected output, using file name as comp name
-                        if (currentComponent == null ) {
-                            currentComponent = currentFile.getName();
-                        }
-                        addEntry(severity, currentComponent, currentFile.toString(), 
-                                lineNumber, logText );
-                        logText = "";
                         return true;
                     }
+                    entryCreated = false;
+                    currentComponent = match.group(1);
                 }
+                logText = logText.replaceFirst("^[ ]*\\[.+?\\][ ]*", "");
+                String severity = getSeverity(logText);
+                if (severity != null) {
+                    entryCreated = true;
+                    // If there is no current component which means
+                    // it is a redirected output, using file name as comp name
+                    if (currentComponent == null ) {
+                        currentComponent = currentFile.getName();
+                    }
+                    addEntry(severity, currentComponent, currentFile.toString(), 
+                            lineNumber, logText );
+                    logText = "";
+                    return true;
+                }
+            }
+            currentReader.close();
+            currentReader = null;
+            setCurrentReader(currentReader);
+            if (isAdditionalEntry()) {
+                return true;
+            }
+        } catch (Exception ex) {
+            log.debug("Exception in AntLogMetadata", ex);
+            try {
                 currentReader.close();
-                currentReader = null;
-                setCurrentReader(currentReader);
-                currentFileIndex ++;
-                setCurrentFileIndex(currentFileIndex);
-                //log.debug("currentfileindex: " + currentFileIndex);
-                //log.debug("fileListSize: " + fileListSize);
-            } catch (Exception ex) {
-                log.debug("Exception in AntLogMetadata", ex);
-                try {
-                    currentReader.close();
-                } catch ( IOException iex) {
-                    log.debug("Exception in closing reader");
-                }
+            } catch ( IOException iex) {
+                // We are Ignoring the errors as no need to fail the build.
+                log.debug("Exception in closing reader", iex);
                 currentReader = null;
                 setCurrentReader(null);
                 exceptions = exceptions + ex.getMessage() + "\n";
@@ -137,7 +124,6 @@
         if (!exceptions.equals("")) {
             throw new BuildException(exceptions);
         }
-        
         return false;
     }
 }
\ No newline at end of file
--- a/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/LogMetaDataInput.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/LogMetaDataInput.java	Wed Dec 23 19:29:07 2009 +0200
@@ -43,7 +43,11 @@
     private static Logger log = Logger.getLogger(LogMetaDataInput.class);
     
     private Vector<FileSet> fileSetList = new Vector<FileSet>();
+
+    private int currentFileIndex;
     
+    private boolean entryAddedForLog;
+
     private List<File> fileList;
     private Vector<MetaDataFilterSet> metadataFilterSets = new Vector<MetaDataFilterSet>();
     private Vector<MetaDataFilter> completeFilterList;
@@ -54,7 +58,6 @@
     
     
     public LogMetaDataInput() {
-        //initRecordInfo();
     }
 
     /**
@@ -83,7 +86,11 @@
         add(filterSet);
         return filterSet;
     }
-    
+
+    /**
+     * Helper function to return all the filters associated with this metadata input
+     * @return all the filters merged based on the order of definition.
+     */
     private Vector<MetaDataFilter> getCompleteFilters()throws Exception {
         Vector<MetaDataFilter> allFilter = new Vector<MetaDataFilter>();
         for (MetaDataFilterSet filterSet : metadataFilterSets) {
@@ -111,6 +118,10 @@
         return fileList;
     }
 
+    /**
+     * Internal function to get the entry
+     * @return the top most entry in the list.
+     */
     private MetaDataDb.LogEntry getEntry()throws Exception {
         if (logEntries != null && logEntries.size() > 0) {
             return logEntries.remove(0);
@@ -119,12 +130,65 @@
         }
     }
 
+    /**
+     * Helper function to return the file list of the metadata input
+     * @return file list of this metadata input.
+     */
     protected List<File> getFileList() {
         return fileList;
     }
 
-    abstract boolean isEntryAvailable() throws Exception ;
+    protected File getCurrentFile() {
+        List<File> fileList = getFileList();
+        return fileList.get(currentFileIndex); 
+    }
+
+    /**
+     * Function to check from the input stream if is there any entries available. Implemented by the sub classes.
+     * @return true if there are any entry available otherwise false.
+     */
     
+    boolean isEntryAvailable() throws Exception {
+        try {
+            int fileListSize = getFileList().size();
+            while (currentFileIndex < fileListSize) {
+                boolean entryCreated = false;
+                File currentFile = getCurrentFile();
+                entryCreated = isEntryCreated(currentFile);
+                if (entryCreated) {
+                    if (!entryAddedForLog) {
+                        entryAddedForLog = true;
+                    }
+                    return entryCreated;
+                }
+                if (!entryAddedForLog) {
+                    // If no entry, then logfile is added to the database.
+                    addEntry("default", "general", getCurrentFile().toString(), -1, "", -1);
+                    currentFileIndex ++;
+                    return true;
+                }
+                currentFileIndex ++;
+            }
+        } catch (Exception ex1 ) {
+            log.info("Exception processing stream: " + ex1.getMessage());
+            log.debug("exception while parsing the stream", ex1);
+            throw ex1;
+        }
+        return false;
+    }
+
+    /**
+     * Function to check from the input stream if is there any entries available.
+     * @param file for which the contents needs to be parsed for errors
+     * @return true if there are any entry available otherwise false.
+     */
+    abstract boolean isEntryCreated(File currentFile) throws Exception;
+
+    /**
+     * Returns the severity matches for the log text
+     * @param log text for which the severity needs to be identified.
+     * @return the severity of the input text
+     */
     protected String getSeverity(String logText) throws Exception {
         try {
             if (completeFilterList == null) {
@@ -133,7 +197,6 @@
             for ( MetaDataFilter filter : completeFilterList) {
                 Pattern pattern = filter.getPattern();
                 if ((pattern.matcher(logText)).matches()) {
-                    //log.debug("pattern matched");
                     return filter.getPriority();
                 }
             }
@@ -144,8 +207,32 @@
         return null;
     }
 
+
+    /**
+     * Helper function to store the entry which will be added to the database
+     * @param priority for the entry
+     * @param component of the entry
+     * @param logpath of the entry
+     * @param lineNo of the entry
+     * @param log text message of the entry
+     */
     protected void addEntry(String priority, String component, String logPath, int lineNo, 
             String logText) throws Exception {
+        addEntry(priority, component, logPath, lineNo, logText, -1);
+    }
+    
+
+    /**
+     * Helper function to store the entry which will be added to the database
+     * @param priority for the entry
+     * @param component of the entry
+     * @param logpath of the entry
+     * @param lineNo of the entry
+     * @param log text message of the entry
+     * @param elapsedTime of the component
+     */
+    protected void addEntry(String priority, String component, String logPath, int lineNo, 
+            String logText, float elapsedTime) throws Exception {
         //log.debug("adding entry to the list");
         File logPathFile = new File(logPath.trim());
         String baseDir = logPathFile.getParent();
@@ -153,9 +240,17 @@
         String uniqueLogPath = baseDir + "/" +  logPathFile.getName();
         logEntries.add(new MetaDataDb.LogEntry(
                 logText, priority, 
-                component, uniqueLogPath, lineNo));
+                component, uniqueLogPath, lineNo, elapsedTime));
     }
-
+    
+    /**
+     * Looks for the text which matches the filter regular expression and adds the entries to the database.
+     * @param logTextInfo text message to be searched with filter regular expressions
+     * @param priority for the entry
+     * @param currentComponent of the logtextInfo
+     * @param logpath fo;e fpr wjocj tje text info has to be looked for with filter expression
+     * @param lineNumber of the text message
+     */
     protected boolean findAndAddEntries(String logTextInfo, String currentComponent, 
             String logPath, int lineNumber)throws Exception {
         boolean entryAdded = false; 
@@ -164,20 +259,28 @@
         for (int i = 0; i < logText.length; i++) {
             severity = getSeverity(logText[i]);
             if ( severity != null) {
-                log.debug("found match: ----" + logText[i]);
                 addEntry(severity, currentComponent, logPath, 
-                        i + lineNumber, logText[i] );
+                        i + lineNumber, logText[i]);
                 if (!entryAdded) {
                     entryAdded = true;
                 }
             }
         }
         return entryAdded;
-    }    
+    }
+    
+    /**
+     * Log text are processed based on iterator. When ever the entry is found the entry is returned
+     * and the function is called again for further entries.
+     * @return the iterator object for the metadata input.
+     */
     public Iterator<MetaDataDb.LogEntry> iterator() {
         return metadataInputIterator;
     }
 
+    /**
+     * Class to process the files as stream and add the entries todb
+     */
     public class MetaDataInputIterator implements Iterator<MetaDataDb.LogEntry> {
         public boolean hasNext() {
             if (fileList == null) {
@@ -187,23 +290,29 @@
                 }
             }
             if (logEntries.size() > 0) {
-                log.debug("returning from existing entries");
                 return true;
             }
             boolean retValue = false;
             try {
                 retValue = isEntryAvailable();
             } catch ( Exception ex) {
-                throw new BuildException("Exception in metadata input.");
+                throw new BuildException("Exception while analysing errors from the log:", ex);
             }
             return retValue;
         }
 
+        /**
+         * Helper function to remove  entries if any
+         */
         public void remove() {
         }
         
+
+        /**
+         * Gets the next entry, which has been identified
+         * @return log entry to be added to the database.
+         */
         public MetaDataDb.LogEntry next() {
-            //log.debug("getting next element: " + logEntry);
             MetaDataDb.LogEntry entry = null;
             try {
                 entry = getEntry();
--- a/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/MetaDataFilter.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/MetaDataFilter.java	Wed Dec 23 19:29:07 2009 +0200
@@ -104,6 +104,10 @@
         pattern = Pattern.compile(regex);
     }
     
+    /**
+     * Helper function to return the pattern
+     * @return the pattern of this filter.
+     */
     public Pattern getPattern() {
         return pattern;
     }
--- a/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/MetaDataFilterSet.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/MetaDataFilterSet.java	Wed Dec 23 19:29:07 2009 +0200
@@ -22,6 +22,8 @@
 import java.util.*;
 import org.apache.tools.ant.types.Reference;
 import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
 import org.apache.log4j.Logger;
 import fmpp.models.CsvSequence;
 import freemarker.template.TemplateSequenceModel;
@@ -92,14 +94,15 @@
             try {
                 filterSetObject = refId.getReferencedObject();
             } catch ( Exception ex) {
-                log.info("Reference id of the filter is not valid");
-                throw ex;
+                log.debug("Reference id of the metadata filter is not valid.", ex); 
+                throw new BuildException("Reference id of the metadata filter is not valid " + ex.getMessage(), ex);
             }
             if (filterSetObject != null && filterSetObject instanceof MetaDataFilterSet) {
                 allFilters.addAll(((MetaDataFilterSet)filterSetObject).getAllFilters());
                 return allFilters;
             }
-            throw new Exception ("filterset object is not instance of MetaDataFilterSet");
+            log.debug("Filterset object is not instance of MetaDataFilterSet");
+            throw new Exception ("Filterset object is not instance of MetaDataFilterSet");
         }
         // Add any nested filtersets
         for (MetaDataFilterSet filterSet : filterSets) {
@@ -108,7 +111,11 @@
         
         return removeInvalidFilters(allFilters);
     }
-    
+
+    /**
+     * Helper function called to remove any invalid filters
+     * @return only the valid filters
+     */
     private Vector<MetaDataFilter> removeInvalidFilters(Vector<MetaDataFilter> filterList) {
         ListIterator<MetaDataFilter> iter = filterList.listIterator();
         while (iter.hasNext()) {
@@ -116,8 +123,7 @@
             String priority = filter.getPriority();
             String regEx = filter.getRegex();
             if (priority == null || regEx == null) {
-                log.info("Warning: invalid filter removed");
-                log.debug("Warning: some filter is invalid removing it");
+                log("Warning: some filter is invalid removing it", Project.MSG_WARN);
                 iter.remove();
             }
         }
@@ -166,7 +172,10 @@
         }
     }
 
-    
+    /**
+     * Helper function to add the filters from the csv files
+     * @param csv file path from which the filters needs to be added.
+     */
     private void addCSVFromFile(String csvPath) throws Exception {
         CsvSequence csvs = new CsvSequence();
         csvs.setSeparator(',');
@@ -174,22 +183,22 @@
         try {
             csvs.load(new FileReader(new File(filterFile)));
         } catch (java.io.FileNotFoundException fex) {
-            log.error("File not found:" + filterFile);
+            log.debug("Metadata CSV file not found:", fex);
             throw fex;
         } catch (fmpp.util.StringUtil.ParseException pex) {
-            log.error("parser exception");
+            log.debug("FMPP not able parse the Metadata CSV file. ", pex);
             throw pex;
         } catch (java.io.IOException iex) {
-            log.error("I/O exception");
+            log.debug("Metadata I/O Exception. " + iex.getMessage(), iex);
             throw iex;
         }
         int size = 0;
         try {
-            log.debug("filter CSV record size: " + csvs.size());
+                log.debug("filter CSV record size: " + csvs.size());
                 size = csvs.size();
             } catch (Exception ex) {
-                log.info("Warning: filter parsing error");
-                log.debug("Exception in processing csv file");
+                // We are Ignoring the errors as no need to fail the build.
+                log.debug("Exception in processing csv file " + filterFile, ex);
             }
             for (int i = 0; i < size; i++) {
                 try {
@@ -197,8 +206,8 @@
                     .get(i);
                     int modelSize = model.size();
                     if (modelSize != 3 ) {
-                        log.debug("csv row size:" + size);
-                        throw new Exception("filter format is invalid");
+                        log.debug("Metadata CSV file filter file format is invalid. It has row size " + size);
+                        throw new Exception("Metadata CSV file filter file format is invalid. It has row size " + size);
                     }
                     MetaDataFilter filter = new MetaDataFilter();
                     filter.setPriority(model.get(0).toString());
@@ -206,8 +215,8 @@
                     filter.setDescription(model.get(2).toString());
                     filters.add(filter);
                 } catch (Exception ex) {
-                    log.info("Warning: filter parsing error");
-                    log.debug("Exception in processing csv file");
+                    // We are Ignoring the errors as no need to fail the build.
+                    log.debug("Exception in processing Metadate csv file " + filterFile, ex);
                 }
             }
     }
--- a/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/MetadataSource.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/MetadataSource.java	Wed Dec 23 19:29:07 2009 +0200
@@ -28,7 +28,7 @@
 
 /**
  * This type define an input source that will be communicated to the notifiers.
- * Not used, deprecated and an xml and html file is generated fof signal modules.
+ * Not used, deprecated and an xml and html file is generated for signal modules.
  * @ant.type name="metadatasource" category="Metadata"
  * @deprecated
  * 
--- a/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/PolicyLogMetaDataInput.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/PolicyLogMetaDataInput.java	Wed Dec 23 19:29:07 2009 +0200
@@ -46,11 +46,18 @@
     
     private Map<String, String> currentAttributeMap;
     
-    
+
+    /**
+     * Constructor
+     */
     public PolicyLogMetaDataInput() {
     }
     
 
+    /**
+     * Helper function to return the attributes of the stream reader
+     * @returns the attributes as a map.
+     */
     private Map<String, String> getAttributes(XMLStreamReader streamReader) {
         int count = streamReader.getAttributeCount() ;
         if (count > 0 ) {
@@ -65,16 +72,24 @@
     }
 
    
-    
+    /**
+     * Function to process the start event of xml stream callback.
+     * @param streamReader: the input stream reader which contains the xml data to be parsed for recording data.
+     * @return true if there are any element to be added to the database.
+     */
     boolean startElement (XMLStreamReader streamReader) {
         String tagName = streamReader.getLocalName();
-        //log.debug("startElement: " + tagName);
         if (tagName.equalsIgnoreCase("error")) {
             currentAttributeMap = getAttributes(streamReader);
         }
         return false;
     }
 
+    /**
+     * Function to process the end event of xml stream callback.
+     * @param streamReader: the input stream reader which contains the xml data to be parsed for recording data.
+     * @return true if there are any element to be added to the database.
+     */
     boolean endElement(XMLStreamReader streamReader) throws Exception {
         boolean retValue = false;
         try {
@@ -111,7 +126,11 @@
         }
         return retValue;
     }
-
+    
+     /* Function to process the characters event of xml stream callback.
+     * @param streamReader: the input stream reader which contains the xml data to be parsed for recording data.
+     * @return true if there are any element to be added to the database.
+     */
     boolean characters (XMLStreamReader streamReader) {
         return false;
     }
--- a/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/SBSLogMetaDataInput.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/SBSLogMetaDataInput.java	Wed Dec 23 19:29:07 2009 +0200
@@ -19,10 +19,12 @@
 
 import java.io.*;
 import java.util.*;
-//import javax.xml.parsers.SAXParser;
-//import javax.xml.parsers.SAXParserFactory;
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
 import org.apache.log4j.Logger;
 import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.events.XMLEvent;
 
 
 /**
@@ -33,7 +35,7 @@
  *    &lt;metadatafilterset filterfile="common.csv" /&gt;
  * &lt;/hlm:metadatafilterset&gt;
  * 
- * &lt;hlm:sbsmetadatainput&gt;
+ * &lt;hlm:sbsmetadatainput cleanLogFile="cleanlog.file" &gt
  *    &lt;fileset dir="${project.dir}/../data/"&gt;
  *        &lt;include name="*compile.log"/&gt;
  *    &lt;/fileset&gt;
@@ -44,21 +46,497 @@
  */
 public class SBSLogMetaDataInput extends XMLLogMetaDataInput {
 
+    private static final String SPECIAL_CASE_REG_EX = "(make.exe|make): \\*\\*\\*.*(/.*)(_exe|_dll|_pdd|_ldd|_kext|_lib)/.*";
+
+    private static final String DRIVE_LETTER_REGEX = "(([a-z]|[A-Z]):(\\\\|/))(.*)(/bld\\.inf)";
+
     private Logger log = Logger.getLogger(SBSLogMetaDataInput.class);
 
     private String currentComponent;
     
+    private float currentElapsedTime;
+    
     private String logTextInfo = "";
     
+    private HashMap<String, List <CategoryEntry>> generalTextEntries = new HashMap<String, List <CategoryEntry>>();
+    
+    private CategorizationHandler categorizationHandler;
+    
     private int lineNumber;
 
     private boolean recordText;
     
+    private File cleanLogFile;
     
+    private boolean additionalEntry;
+    
+    private Pattern specialCasePattern;
+    
+    private HashMap<String, TimeEntry> componentTimeMap = new HashMap<String, TimeEntry>();
+
+    /**
+     * Constructor
+     */
     public SBSLogMetaDataInput() {
+        specialCasePattern = Pattern.compile(SPECIAL_CASE_REG_EX);
     }
     
-    private String getComponent(XMLStreamReader streamReader) {
+    
+    /**
+     * Removes the bld inf and the drive letter from the text
+     * @param text in which the bld.inf and drive letter to be removed
+     * @return updated string.
+     */
+    static String removeDriveAndBldInf(String text) {
+        Matcher matcher = (Pattern.compile(DRIVE_LETTER_REGEX)).matcher(text);
+        if (matcher.matches()) {
+            return matcher.group(4);
+        } else {
+            return text;
+        }
+    }
+
+    /**
+     * Removes the bld inf and the drive letter from the text
+     * @param text in which the bld.inf and drive letter to be removed
+     * @return updated string.
+     */
+    static String getComponent(XMLStreamReader streamReader) {
+        String currentComponent = getAttribute("bldinf", streamReader);
+        if ( currentComponent != null && currentComponent.equals("")) {
+            return null;
+        }
+        if (currentComponent != null ) {
+            currentComponent = removeDriveAndBldInf(currentComponent);
+        }
+        return currentComponent;
+    }
+
+    /**
+     * Generic function to return the attribute value of an attribute from stream
+     * @param attribute for which the value from xml stream to be returned.
+     * @return the attribute value of an attribute.
+     */
+    static String getAttribute(String attribute, XMLStreamReader streamReader) {
+        int count = streamReader.getAttributeCount() ;
+        for (int i = 0 ; i < count ; i++) {
+            if ( streamReader.getAttributeLocalName(i).equals(attribute) ) {
+                return streamReader.getAttributeValue(i);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Helper function to set the clean log file
+     * @param logFile which is the clean log file to process for additional categories
+     */
+    public void setCleanLogFile(File logFile) {
+        cleanLogFile = logFile;
+    }
+
+    /**
+     * Function to process the characters event of xml stream callback.
+     * @param streamReader: the input stream reader which contains the xml data to be parsed for recording data.
+     * @return true if there are any element to be added to the database.
+     */
+    public boolean characters (XMLStreamReader streamReader) {
+        if (recordText) {
+            logTextInfo += streamReader.getText();
+        } else {
+            if (!additionalEntry) {
+                additionalEntry = true;
+            }
+            String cdataText = streamReader.getText().trim();
+            String [] textList = cdataText.split("\n");
+            for (String text : textList) {
+                Matcher specialCaseMatcher = specialCasePattern.matcher(text);
+                List <CategoryEntry> entryList  = null;
+                if (specialCaseMatcher.matches()) {
+                    String componentName = specialCaseMatcher.group(2);
+                    String extension = specialCaseMatcher.group(3); 
+                    String componentWithTarget =  (componentName.substring(1) + "." 
+                        + extension.substring(1)).toLowerCase();
+                    CategoryEntry newEntry = new CategoryEntry(text, componentWithTarget ,
+                            "error", streamReader.getLocation().getLineNumber(), getCurrentFile().toString());
+                    entryList = generalTextEntries.get(componentWithTarget); 
+                    if ( entryList == null) {
+                        entryList = new ArrayList<CategoryEntry>();
+                        generalTextEntries.put(componentWithTarget, entryList);
+                    }
+                    entryList.add(newEntry);
+                } else {
+                    String componentWithTarget = null;
+                    int indexMakeString = text.indexOf( "make: ***" );
+                    int indexSlash = text.lastIndexOf( "/" );
+                    if (indexMakeString != -1 && indexSlash != -1) {
+                        int indexExt = ( indexSlash  + 1) + text.substring(indexSlash).indexOf( "." );
+                        if ( indexExt != -1 ) {
+                            componentWithTarget = (text.substring(indexSlash,indexExt + 3)).toLowerCase();
+                        }
+                    }
+                    if (componentWithTarget != null) {
+                        CategoryEntry newEntry = new CategoryEntry(text, componentWithTarget ,
+                                "error", streamReader.getLocation().getLineNumber(), getCurrentFile().toString());                    
+                        entryList = generalTextEntries.get(componentWithTarget);
+                        if (entryList == null) {
+                            entryList = new ArrayList<CategoryEntry>();
+                            generalTextEntries.put(componentWithTarget, entryList);
+                        }
+                        entryList.add(newEntry);
+                    }
+                    
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Function to process the start event of xml stream callback.
+     * @param streamReader: the input stream reader which contains the xml data to be parsed for recording data.
+     * @return true if there are any element to be added to the database.
+     */
+    public boolean startElement (XMLStreamReader streamReader) throws Exception {
+        try {
+            String tagName = streamReader.getLocalName();
+            if (tagName.equalsIgnoreCase("buildlog")) {
+                log.debug("starting with buildlog");
+            }
+            if (tagName.equalsIgnoreCase("recipe") ) {
+                lineNumber = streamReader.getLocation().getLineNumber();
+                currentComponent = getComponent(streamReader);
+                recordText = true;
+            } else if (tagName.equalsIgnoreCase("error")
+                    || tagName.equalsIgnoreCase("warning")) {
+                lineNumber = streamReader.getLocation().getLineNumber();
+                currentComponent = getComponent(streamReader);
+                recordText = true;
+            } else if (tagName.equalsIgnoreCase("whatlog") ) {
+                currentComponent = getComponent(streamReader);
+            } else if (tagName.equalsIgnoreCase("time")) {
+                currentElapsedTime = Float.valueOf(getAttribute("elapsed", streamReader)).floatValue();
+                if (currentComponent != null) {
+                    TimeEntry timeObject = componentTimeMap.get(currentComponent);
+                    if (timeObject == null) {
+                        timeObject = new TimeEntry(currentElapsedTime, getCurrentFile().toString());
+                        componentTimeMap.put(currentComponent, timeObject);
+                    } else  {
+                        timeObject.addElapsedTime(currentElapsedTime);
+                    }
+                }
+            }
+        } catch (Exception ex) {
+            log.debug("exception in startelement",ex);
+            throw ex;
+        }
+        return false;
+    }
+
+    /**
+     * Checks whether is there any additional entry. During log parsing, all the text which are not part of any tag
+     * and are part of CDATA are recorded in a list and checked in this function for any matching errors and processed
+     * for their categorization.
+     * @return true if there are any element to be added to the database.
+     */
+    public boolean isAdditionalEntry() {
+        try { 
+            if (!componentTimeMap.isEmpty()) {
+                Set<String> componentSet = componentTimeMap.keySet();
+                for (String component : componentSet) {
+                    
+                    TimeEntry entry = componentTimeMap.get(component);
+                    addEntry("default", component, entry.getFilePath(), -1, 
+                            null, entry.getElapsedTime());
+                    componentTimeMap.remove(component);
+                    return true;
+                }
+            }
+            if (cleanLogFile != null ) {
+                if (categorizationHandler == null ) {
+                    log.info("initializing categorization handler");
+                    categorizationHandler = 
+                        new CategorizationHandler(cleanLogFile, generalTextEntries);
+                }
+            }
+            if (categorizationHandler != null && categorizationHandler.hasNext()) {
+                try {
+                    CategoryEntry entry = categorizationHandler.getNext();
+                    if (entry != null) {
+                        addEntry(entry.getSeverity(), entry.getCategory(), entry.getLogFile(), 
+                                entry.getLineNumber(), entry.getText());
+                        return true;
+                    }
+                } catch (Exception ex) {
+                    log.debug("Exception during categorization handler", ex);
+                    return false;
+                }
+            }
+        } catch (Exception ex) {
+            log.debug("Exception in finding additional entry", ex);
+        }
+        return false;
+    }
+
+    /**
+     * Function to process the end event of xml stream callback.
+     * @param streamReader: the input stream reader which contains the xml data to be parsed for recording data.
+     * @return true if there are any element to be added to the database.
+     */
+    public boolean endElement(XMLStreamReader streamReader) throws Exception {
+        try {
+            String tagName = streamReader.getLocalName();
+            if (tagName.equalsIgnoreCase("recipe")) {
+                recordText = false;
+                if (logTextInfo != null) {
+                    if (currentComponent == null) {
+                        currentComponent = "general";
+                    }
+                    boolean entryCreated = findAndAddEntries(logTextInfo, currentComponent,
+                            getCurrentFile().toString(), lineNumber);
+                    logTextInfo = "";
+                    if ( entryCreated) {
+                        return true;
+                    }
+                }
+            } else if (tagName.equalsIgnoreCase("error")
+                    || tagName.equalsIgnoreCase("warning")) {
+                recordText = false;
+                if (currentComponent == null) {
+                    currentComponent = "general";
+                }
+                addEntry(tagName, currentComponent, getCurrentFile().toString(), lineNumber, 
+                        logTextInfo);
+                logTextInfo = "";
+                return true;
+            } else if (tagName.equalsIgnoreCase("whatlog") ) {
+                addEntry("default", currentComponent, getCurrentFile().toString(), -1, 
+                        "");
+                return true;
+            }
+        } catch (Exception ex) {
+            log.debug("Exception while processing for sbs metadata input", ex);
+            throw ex;
+        }
+        return false;
+    }
+}
+
+/* This class stores the temporary Time entry which is being recorded for each data
+ * at the end of the build and during isAdditionalEntry function, the time for the component
+ * is updated in the database.
+ */
+class TimeEntry {
+    
+    private float elapsedTime;
+    private String filePath;
+    
+    /**
+     * Constructor to store the elapsedTime and the path which are to be updated to the database.
+     * @param elapsedTime: time duration of the component.
+     * @path of the component.
+     */
+    public TimeEntry(float elapsedTime, String path) {
+        elapsedTime = elapsedTime;
+        filePath = path;
+    }
+    
+
+    /**
+     * Helper function to add time to the previous elapsed time.
+     * @param time to be added to the elapsed timet.
+     */
+    public void addElapsedTime(float time) {
+        elapsedTime += time;
+    }
+    
+    /**
+     * Helper function to return the elapsed time
+     * @return elapsed time of this time entry.
+     */
+    public float getElapsedTime() {
+        return elapsedTime;
+    }
+
+    /**
+     * Helper function to return the file path of this entry
+     * @return path of this time entry.
+     */
+    public String getFilePath() {
+        return filePath;
+    }
+}
+/* This class stores the temporary category entry which is processed during
+ * at the end of the build and categorized and written to the database.
+ */
+class CategoryEntry {
+
+    private String text;
+    private int lineNumber;
+    private String fileName;
+    private String severity;
+    private String category;
+
+
+    /**
+     * Constructor of the category entry
+     * @param txt - text message of the entry
+     * @param ctgry - category of the entry
+     * @param svrty - severity of this entry
+     * @param lnNo - line number of this entry
+     * @param flName - name of the file being processed.
+     * @return path of this time entry.
+     */
+    public CategoryEntry(String txt, String ctgry, 
+            String svrty, int lnNo, String flName) {
+        text = txt;
+        lineNumber = lnNo;
+        fileName = flName;
+        severity = svrty;
+        category = "general";
+        if (ctgry != null) {
+            category = ctgry;
+        }
+    }
+    
+    /**
+     * Helper function to set the category
+     * @param set the category
+     */
+    void setCategory(String ctgry) {
+        category = ctgry;
+    }
+    
+    /**
+     * Helper function to return the category
+     * @return the category of this entry.
+     */
+    String getCategory() {
+        return category;
+    }
+
+    /**
+     * Returns the logfile of this entry
+     * @return logfile of this entry
+     */
+    String getLogFile() {
+        return fileName;
+    }
+
+    /**
+     * Helper function returns the severity of this entry
+     * @return severity of this entry
+     */
+    String getSeverity() {
+        return severity;
+    }
+
+    /**
+     * Helper function returns the line number of this entry
+     * @return the line number of this entry.
+     */
+    
+    int getLineNumber() {
+        return lineNumber;
+    }
+
+    /**
+     * Helper function returns the text message of this entry
+     * @return text message of this entry
+     */
+    String getText() {
+        return text;
+    }
+
+}
+
+/* This class handles the categorization of scanlog errors based on the clean log output
+ * from raptor.
+ */
+ class CategorizationHandler {
+   
+    private int count;
+    
+    private String currentComponent;
+    private boolean isInFileTag;
+    
+    private HashMap<String, List <CategoryEntry>> categoryList;
+
+    private List<CategoryEntry> currentList;
+
+    private XMLInputFactory xmlInputFactory;
+
+    private XMLStreamReader xmlStreamReader;
+
+    private Logger log = Logger.getLogger(CategorizationHandler.class);
+
+    /**
+     * Constructor
+     * @param clean log file input using which the CDATA text are categorized
+     * @param list of entries to be categorized
+     */
+    public CategorizationHandler(File cleanLogFile, HashMap<String, List <CategoryEntry>> ctgMap) {
+        categoryList = ctgMap;
+        Set<String> categorySet = categoryList.keySet();
+        if (cleanLogFile != null ) {
+            try {
+                xmlInputFactory = XMLInputFactory.newInstance();
+                xmlStreamReader = xmlInputFactory.createXMLStreamReader(cleanLogFile.toString(), 
+                    new BufferedInputStream(new FileInputStream(cleanLogFile)));
+            } catch ( Exception ex) {
+                log.debug("exception while initializing stax processor",ex);
+            }
+        }
+    }
+
+    /**
+     * Checks whether is there any entry (by checking for categorization of the recorded CDATA text)
+     * @return true if there any entry that are being categorized.
+     */
+    public boolean hasNext() {
+        boolean generalEntriesStatus = categoryList != null && !categoryList.isEmpty();
+        boolean currentListStatus = currentList != null && ! currentList.isEmpty();
+        return generalEntriesStatus || currentListStatus;
+    }
+
+    /**
+     * Process the startelement event of XML Stream from clean log.
+     * @param streamReader clean log xml stream reader to be processed
+     * @return true if there are any entry to be added.
+     */
+    public boolean startElement(XMLStreamReader streamReader) throws Exception {
+        String tagName = streamReader.getLocalName();
+        if (tagName.equals("clean")) {
+            currentComponent = getCategory(streamReader);
+            if (currentComponent != null) {
+                currentComponent = SBSLogMetaDataInput.removeDriveAndBldInf(currentComponent);
+            }
+        }
+        if (tagName.equals("file")) {
+            isInFileTag = true;
+        }
+        return false;
+    }
+
+    /**
+     * Process the endelement event of XML Stream from clean log.
+     * @param streamReader clean log xml stream reader to be processed
+     * @return true if there are any entry to be added.
+     */
+    public boolean endElement (XMLStreamReader streamReader) throws Exception {
+        String tagName = streamReader.getLocalName();
+        if (tagName.equals("file")) {
+            isInFileTag = false;
+        }
+        return false;
+    }
+
+    /**
+     * Internal function to find bld inf from the component 
+     * @param streamReader clean log xml stream reader to be processed
+     * @return the bld.inf attribute.
+     */
+    private String getCategory(XMLStreamReader streamReader) {
         int count = streamReader.getAttributeCount() ;
         for (int i = 0 ; i < count ; i++) {
             if ( streamReader.getAttributeLocalName(i).equals("bldinf") ) {
@@ -68,70 +546,110 @@
         return null;
     }
 
-    public boolean characters (XMLStreamReader streamReader) {
-        if (recordText) {
-            logTextInfo += streamReader.getText();
+    /**
+     * Internal function to find the CDATA text of the file attribute.
+     * @param streamReader clean log xml stream reader to be processed
+     * @return the CDATA text of <file> tag.
+     */
+    private String characters(XMLStreamReader xmlStreamReader) {
+        if (isInFileTag) {
+            return xmlStreamReader.getText().toLowerCase();
         }
-        return false;
+        return null;
     }
-    
-    public boolean startElement (XMLStreamReader streamReader) throws Exception {
-        try {
-            String tagName = streamReader.getLocalName();
-            if (tagName.equalsIgnoreCase("buildlog")) {
-                log.debug("starting with buildlog");
+
+    /**
+     * Gets the entry which matches the input path. For each line of <file> tag attribute, the entry list
+     * is compared with that and if there is any match, then it returns the entry from the list, which
+     * is being mtached.
+     * @param path for which matching entry is looked for.
+     * @return entry which matched the path from the clean log file.
+     */
+    private List<CategoryEntry> getEntry(String path) {
+        int index = 0;
+        Set<String> categorySet = categoryList.keySet();
+        for (String key : categorySet) {
+            if (path.indexOf(key) != -1) {
+                List<CategoryEntry> entry = categoryList.get(key);
+                categoryList.remove(key);
+                return entry;
             }
-            if (tagName.equalsIgnoreCase("recipe") ) {
-                lineNumber = streamReader.getLocation().getLineNumber();
-                //log.debug(" startElement: receipe tag");
-                recordText = true;
-                //currentComponent = attributes.getValue("bldinf");
-                currentComponent = getComponent(streamReader);
-            } else if (tagName.equalsIgnoreCase("error")
-                    || tagName.equalsIgnoreCase("warning")) {
-                lineNumber = streamReader.getLocation().getLineNumber();
-                recordText = true;
-            } else if (tagName.equalsIgnoreCase("whatlog") ) {
-                currentComponent = getComponent(streamReader);
-            }
-        } catch (Exception ex) {
-            log.debug("exception in startelement",ex);
-            throw ex;
         }
-        return false;
+        return null;
+    }
+
+    /**
+     * Internal function to update the category entries of the list.
+     * @param categoryList for which the category.
+     * @param category which is to be updated to the list.
+     */
+    private void updateCategoryEntries(List<CategoryEntry> categoryList, String category) {
+        for (CategoryEntry entry : categoryList) {
+            entry.setCategory(category);
+        }
     }
 
-
-    public boolean endElement(XMLStreamReader streamReader) throws Exception {
+    /**
+     * Gets the next entry from the stream based on categorization.
+     * @return the category entry which is identified as categorized entry.
+     */
+    public CategoryEntry getNext() throws Exception {
         try {
-            String tagName = streamReader.getLocalName();
-            if (tagName.equalsIgnoreCase("recipe")) {
-                recordText = false;
-                if (logTextInfo != null) {
-                    //log.debug("endElement: lineNumber: " + lineNumber);
-                    boolean entryCreated = findAndAddEntries(logTextInfo, currentComponent,
-                            getCurrentFile().toString(), lineNumber);
-                    logTextInfo = "";
-                    if ( entryCreated) {
-                        //log.debug("Entry creating end element");
-                        return true;
+            boolean entryCreated = false;
+            if (currentList != null && !currentList.isEmpty()) {
+                CategoryEntry entry = currentList.get(0);
+                currentList.remove(0);
+                return entry;
+            }
+            if (xmlStreamReader != null ) {
+                while (xmlStreamReader.hasNext()) {
+                    int eventType = xmlStreamReader.next();
+                    switch (eventType) {
+                    case XMLEvent.START_ELEMENT:
+                        entryCreated = startElement(xmlStreamReader);
+                        break;
+                    case XMLEvent.END_ELEMENT:
+                        endElement(xmlStreamReader);
+                        break;
+                    case XMLEvent.CHARACTERS:
+                        String path = characters(xmlStreamReader);
+                        if (path != null ) {
+                            currentList = getEntry(path);
+                            if (currentList != null && !currentList.isEmpty()) {
+                                if (currentComponent != null) {
+                                    updateCategoryEntries(currentList, currentComponent);
+                                    CategoryEntry entry = (CategoryEntry)currentList.remove(0);
+                                    return entry;
+                                }
+                            }
+                        }
+                        break;
+                    default:
+                        break;
                     }
                 }
-            } else if (tagName.equalsIgnoreCase("error")
-                    || tagName.equalsIgnoreCase("warning")) {
-                recordText = false;
-                addEntry(tagName, "general", getCurrentFile().toString(), lineNumber, 
-                        logTextInfo);
-                logTextInfo = "";
-                return true;
-            } else if (tagName.equalsIgnoreCase("whatlog") ) {
-                addEntry("default", currentComponent, getCurrentFile().toString(), -1, 
-                        "");
+                if (xmlStreamReader != null) {
+                    close();
+                }
+            }
+        } catch ( Exception ex) {
+            log.debug("exception in categorization",ex);
+            throw ex;
+        }
+        return null;
+    }
+    /**
+     * Internal function to close the clean log file stream
+     */
+    private void close() {
+        try {
+            if (xmlStreamReader != null) {
+                xmlStreamReader.close();
+                xmlStreamReader = null;
             }
         } catch (Exception ex) {
-            log.debug("Exception while processing for sbs metadata input", ex);
-            throw ex;
+            log.debug("exception while closing xml stream",ex);
         }
-        return false;
+        
     }
 }
\ No newline at end of file
--- a/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/TextLogMetaDataInput.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/TextLogMetaDataInput.java	Wed Dec 23 19:29:07 2009 +0200
@@ -43,87 +43,95 @@
 
     private Logger log = Logger.getLogger(TextLogMetaDataInput.class);
     
-    private int currentFileIndex;
-    
     private int lineNumber;
     
     private BufferedReader currentReader;
 
+    /**
+     * Constructor
+     */
     public TextLogMetaDataInput() {
         
     }
-    
-    protected void setCurrentFileIndex(int fileIndex) {
-        currentFileIndex = fileIndex;
-    }
 
+    /**
+     * Helper function to set the line number
+     * @param lineNo to be set for the entry
+     */
     protected void setLineNumber(int lineNo) {
         lineNumber = lineNo;
     }
 
-    protected int getCurrentFileIndex() {
-        return currentFileIndex;
-    }
-    
+    /**
+     * Helper function to return the line number of this entry.
+     * @return line number of the entry.
+     */
     protected int getLineNumber() {
         return lineNumber;
     }
 
+    /**
+     * Helper function to set the reader of this stream
+     * @param reader to process the stream.
+     */
     protected void setCurrentReader(BufferedReader reader) {
         currentReader = reader;
     }
-    
+
+    /**
+     * Function to check if is there any additionaly entry. This is being used for example during streaming
+     * recorded and at the end of streaming use the recorded data to add any additional entry. Used by
+     * @return true if there are any additional entries which are to be recorded in the database.
+     */
+    public boolean isAdditionalEntry() {
+        return false;
+    }
+
+    /**
+     * Helper function to return the lbuffer reader for the current meta data input
+     * @return buffer reader object for the current metadata input.
+     */
     protected BufferedReader getCurrentReader() {
         return currentReader;
     }
 
-    public boolean isEntryAvailable() throws Exception {
-        //Todo: Optimize the function so the most of the statements could
-        //be reused with other metadata input.
+    public boolean isEntryCreated(File currentFile) throws Exception {
         String exceptions = "";
-        //log.debug("Getting next set of log entries for Text Input");
-        //log.debug("currentFileIndex" + currentFileIndex);
-        List<File> fileList = getFileList();
-        //log.debug("is filelist empty" + fileList.isEmpty());
-        int fileListSize = fileList.size();
-        while (currentFileIndex < fileListSize) {
-            try {
-                //log.debug("currentfileindex while getting file name: " + currentFileIndex);
-                File currentFile = fileList.get(currentFileIndex);
-                if (currentReader == null) {
-                    lineNumber = 0;
-                    log.debug("Current Text log file name:" + currentFile);
-                    log.info("Processing file: " + currentFile);
-                    currentReader = new BufferedReader(new FileReader(currentFile));
+        try {
+            if (currentReader == null) {
+                lineNumber = 0;
+                log.debug("Current Text log file name:" + currentFile);
+                log.debug("Processing file: " + currentFile);
+                currentReader = new BufferedReader(new FileReader(currentFile));
+            }
+            String logText = null;
+            while ((logText = currentReader.readLine()) != null) {
+                logText = logText.replaceFirst("^[ ]*\\[.+?\\][ ]*", "");
+                String severity = getSeverity(logText);
+                if (severity != null) {
+                    addEntry(severity, currentFile.getName(), currentFile.toString(), 
+                            lineNumber, logText );
+                    lineNumber ++;
+                    return true;
                 }
-                String logText = null;
-                while ((logText = currentReader.readLine()) != null) {
-                    //log.debug("logtext : " + logText + " line-number: " + lineNumber);
-                    //log.debug("logtext : " + logText + " line-number: " + lineNumber);
-                    logText = logText.replaceFirst("^[ ]*\\[.+?\\][ ]*", "");
-                    String severity = getSeverity(logText);
-                    if (severity != null) {
-//                        log.debug("severity:" + severity);
-//                        log.debug("currentFile:" + currentFile);
-//                        log.debug("lineNumber:" + lineNumber);
-//                        log.debug("logText:" + logText);
-                        
-                        addEntry(severity, currentFile.getName(), currentFile.toString(), 
-                                lineNumber, logText );
-                        lineNumber ++;
-                        return true;
-                    }
-                    lineNumber ++;
-                }
+            }
+            currentReader.close();
+            currentReader = null;
+            if (isAdditionalEntry()) {
+                return true;
+            }
+        } catch (Exception ex) {
+            log.debug("Exception in TextLogMetadata", ex);
+            try {
                 currentReader.close();
                 currentReader = null;
-                currentFileIndex ++;
-            } catch (Exception ex) {
-                log.debug("Exception in TextLogMetadata", ex);
+            } catch (Exception ex1) {
+                // We are Ignoring the errors as no need to fail the build.
+                log.debug("Exception in TextLogMetadata", ex1);
                 try {
                     currentReader.close();
                 } catch ( IOException iex) {
-                    log.info("exception in closing reader");
+                 // We are Ignoring the errors as no need to fail the build.
                     log.debug("Exception in closing reader", iex);
                 }
                 currentReader = null;
--- a/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/XMLLogMetaDataInput.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/ant/types/XMLLogMetaDataInput.java	Wed Dec 23 19:29:07 2009 +0200
@@ -19,12 +19,9 @@
 
 import java.io.*;
 import java.util.*;
-//import javax.xml.parsers.SAXParser;
-//import javax.xml.parsers.SAXParserFactory;
 import org.apache.log4j.Logger;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamReader;
-//import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.events.XMLEvent;
 
 
@@ -40,20 +37,28 @@
 
     private XMLStreamReader xmlStreamReader;
     
-    private int currentFileIndex;
+    private boolean inParsing;
     
+
+    /**
+     * Constructor
+     */
     public XMLLogMetaDataInput() {
         try {
+            inParsing = true;
             xmlInputFactory = XMLInputFactory.newInstance();
             xmlInputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES,Boolean.TRUE);
             xmlInputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES,Boolean.FALSE);
             xmlInputFactory.setProperty(XMLInputFactory.IS_COALESCING , Boolean.TRUE);
         } catch (Exception ex) {
-            ex.printStackTrace();
+         // We are Ignoring the errors as no need to fail the build.
+            log.debug("Exception while initializing stax processing",ex);
         }
     }
     
-
+    /**
+     * Closes the xml stream
+     */
     private void close() {
         try {
             if (xmlStreamReader != null) {
@@ -61,106 +66,83 @@
                 xmlStreamReader = null;
             }
         } catch (Exception ex) {
-            log.info("Exception whil closing xml stream" + ex.getMessage());
-            log.debug("exception while closing xml stream",ex);
+         // We are Ignoring the errors as no need to fail the build.
+            log.debug("Exception while closing xml stream", ex);
         }
         
     }
-   
-    protected File getCurrentFile() {
-        List<File> fileList = getFileList();
-        return fileList.get(currentFileIndex); 
-    }
-    
-    boolean isEntryAvailable() throws Exception {
-        //log.debug("Getting next set of log entries for xml Input");
-        //log.debug("currentFileIndex" + currentFileIndex);
-        int fileListSize = getFileList().size();
-        //log.debug("fileList.size" + fileListSize);
 
-        //if ( isEntryCreatedForRemainingText() ) {
-        //    log.debug("Entry creating from remaining text");
-        //    return true;
-        //}
-        try {
-            while (currentFileIndex < fileListSize) {
-                boolean entryCreated = false;
-                File currentFile = getCurrentFile();
-                    if (xmlStreamReader == null) {
-                        log.info("Processing file: " + currentFile);
-                        xmlStreamReader = xmlInputFactory.createXMLStreamReader(
-                                currentFile.toString(), new BufferedInputStream(new FileInputStream(currentFile)));
-                    //First the START_DOCUMENT is the first event directly pointed to.
-                    }
-                int eventType = xmlStreamReader.getEventType();
-                while (xmlStreamReader.hasNext()) {
-                    eventType = xmlStreamReader.next();
-                    switch (eventType) {
-                    case XMLEvent.START_ELEMENT:
-                        //log.debug("XMLEvent:START_ELEMENT");
-                        entryCreated = startElement(xmlStreamReader);
-                        break;
-                    case XMLEvent.END_ELEMENT:
-                        //log.debug("XMLEvent:END_ELEMENT");
-                        entryCreated = endElement(xmlStreamReader);
-                        //log.debug("XMLEvent:END_ELEMENT: entryCreated: " +entryCreated);
-                        break;
-                    case XMLEvent.PROCESSING_INSTRUCTION:
-                        //log.debug("XMLEvent:PI_DATA");
-                        //printPIData(xmlr);
-                        break;
-                    case XMLEvent.CHARACTERS:
-                        //log.debug("XMLEvent:chacacters");
-                        entryCreated = characters(xmlStreamReader);
-                        break;
-                    case XMLEvent.COMMENT:
-                        log.debug("XMLEvent:COMMENT");
-                        break;
-                    case XMLEvent.START_DOCUMENT:
-                        log.debug("XMLEvent:START_DOCUMENT");
-                        break;
-                    case XMLEvent.END_DOCUMENT:
-                        log.debug("XMLEvent:END_DOCUMENT");
-                        break;
-                    case XMLEvent.ENTITY_REFERENCE:
-                        log.debug("XMLEvent:ENTITY_REFERENCE");
-                        break;
-                    case XMLEvent.ATTRIBUTE:
-                        log.debug("XMLEvent:ATTRIBUTE");
-                        break;
-                    case XMLEvent.DTD:
-                        log.debug("XMLEvent:DTD");
-                        break;
-                    case XMLEvent.CDATA:
-                        log.debug("XMLEvent:CDATA");
-                        break;
-                    case XMLEvent.SPACE:
-                        log.debug("XMLEvent:chacacters");
-                        break;
-                    default:
-                        break;
-                    }
-                    if ( entryCreated) {
-                        return true; 
-                    }
+    /**
+     * Function to check from the input stream if is there any entries available.
+     * @param file for which the contents needs to be parsed for errors
+     * @return true if there are any entry available otherwise false.
+     */
+    boolean isEntryCreated(File currentFile) throws Exception {
+        boolean entryCreated = false;
+        if (inParsing ) {
+            if (xmlStreamReader == null) {
+                log.debug("Processing file: " + currentFile);
+                xmlStreamReader = xmlInputFactory.createXMLStreamReader(
+                        currentFile.toString(), new BufferedInputStream(new FileInputStream(currentFile)));
+            }
+            int eventType = xmlStreamReader.getEventType();
+            while (xmlStreamReader.hasNext()) {
+                eventType = xmlStreamReader.next();
+                switch (eventType) {
+                case XMLEvent.START_ELEMENT:
+                    entryCreated = startElement(xmlStreamReader);
+                    break;
+                case XMLEvent.END_ELEMENT:
+                    entryCreated = endElement(xmlStreamReader);
+                    break;
+                case XMLEvent.CHARACTERS:
+                    entryCreated = characters(xmlStreamReader);
+                    break;
+                default:
+                    break;
                 }
-                if (xmlStreamReader != null) {
-                    close();
+                if ( entryCreated) {
+                    return true; 
                 }
-                currentFileIndex ++;
             }
-        } catch (Exception ex1 ) {
-            log.info("Exception processing xml stream: " + ex1.getMessage());
-            log.debug("exception while parsing the stream", ex1);
-            close();
+            if (xmlStreamReader != null) {
+                close();
+            }
+            inParsing = false;
+        }
+        if (isAdditionalEntry()) {
+            return true;
         }
         return false;
     }
 
-    
+    /**
+     * Function to check if is there any additionaly entry. This is being used for example during streaming
+     * recorded and at the end of streaming use the recorded data to add any additional entry. Used by
+     * @return true if there are any additional entries which are to be recorded in the database.
+     */
+    public boolean isAdditionalEntry() {
+        return false;
+    }
+
+    /**
+     * Function implemented by the subclasses to process the start event of xml stream callback.
+     * @param streamReader: the input stream reader which contains the xml data to be parsed for recording data.
+     * @return true if there are any element to be added to the database.
+     */
     abstract boolean startElement (XMLStreamReader streamReader) throws Exception ;
 
+    /**
+     * Function implemented by the subclasses to process the end event of xml stream callback.
+     * @param streamReader: the input stream reader which contains the xml data to be parsed for recording data.
+     * @return true if there are any element to be added to the database.
+     */
     abstract boolean endElement(XMLStreamReader streamReader) throws Exception;
-    
+
+    /**
+     * Function implemented by the subclasses to process the characters event of xml stream callback.
+     * @param streamReader: the input stream reader which contains the xml data to be parsed for recording data.
+     * @return true if there are any element to be added to the database.
+     */
     abstract boolean characters (XMLStreamReader streamReader);
 }
--- a/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/db/MetadataDb.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/com/nokia/helium/metadata/db/MetadataDb.java	Wed Dec 23 19:29:07 2009 +0200
@@ -24,10 +24,10 @@
 import java.sql.Statement;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
-//import java.sql.DatabaseMetaData;
+
 import org.apache.log4j.Logger;
 import org.apache.tools.ant.BuildException;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Map;
@@ -45,19 +45,23 @@
 
     private static final int LOG_ENTRY_CACHE_LIMIT = 500;
 
-    //private static final int RECORD_LIMIT recordLimit = 5000;
-    
+    private static final int DB_SCHEMA_VERSION = 1;
+
+
     private static final String[] INIT_TABLES = {
+        "CREATE TABLE schema (version INTEGER default " + DB_SCHEMA_VERSION + ")", 
         "CREATE TABLE metadata (priority_id INTEGER, component_id INTEGER, line_number INTEGER, data TEXT, logpath_id INTEGER)", 
         "CREATE TABLE component (id INTEGER PRIMARY KEY,component TEXT, logPath_id INTEGER, UNIQUE (logPath_id,component))", 
         "CREATE TABLE priority (id INTEGER PRIMARY KEY,priority TEXT)", 
-        "CREATE TABLE logfiles (id INTEGER PRIMARY KEY, path TEXT)"
+        "CREATE TABLE logfiles (id INTEGER PRIMARY KEY, path TEXT)",
+        "CREATE TABLE componenttime (cid INTEGER PRIMARY KEY, time DOUBLE default 0, UNIQUE (cid))"
     };
 
     private static final String INSERT_METADATA_ENTRY = "INSERT INTO metadata VALUES(?, ?, ?, ?, ?)";
     private static final String INSERT_LOGENTRY = "INSERT or IGNORE INTO logfiles VALUES(?, ?)";
     private static final String INSERT_PRIORITYENTRY = "INSERT INTO priority VALUES(?, ?)";
-    private static final String INSERT_COMPONENTENTRY = "INSERT or IGNORE INTO component VALUES((SELECT max(id) FROM component)+1, ?, ?) ";
+    private static final String INSERT_COMPONENTENTRY = "INSERT or IGNORE INTO component VALUES(?, ?, ?) ";;
+    private static final String INSERT_COMPONENT_TIME = "INSERT or IGNORE INTO componenttime VALUES(?, ?)";
     
     private String dbPath;
 
@@ -72,6 +76,7 @@
     private PreparedStatement insertMetaDataEntryStmt;
     private PreparedStatement insertLogEntryStmt;
     private PreparedStatement insertComponentStmt;
+    private PreparedStatement insertComponentTimeStmt;
     
     private int entryCacheSize;
 
@@ -90,18 +95,47 @@
         }
         catch (java.lang.ClassNotFoundException e)
         {
-            log.debug("No JDBC Driver found");
             throw new BuildException("JDBC Driver could not be found");
         }
         
         synchronized (MetaDataDb.class) {
             // See if the database needs to be initialized
             boolean initializeDatabase = false;
-            if (!new File(dbPath).exists())
+            File dbFile = new File(dbPath);
+            if (!dbFile.exists())
             {
                 initializeDatabase = true;
+            } else {
+                try {
+                    log.debug("checking for schema version of db");
+                    initializeConnection();
+                    Statement stmt = connection.createStatement();
+                    ResultSet rs = stmt.executeQuery("select version from schema");
+                    int version = -1;
+                    if ( rs.next()) {
+                        version = rs.getInt(1);
+                    }
+                    rs.close();
+                    stmt.close();
+                    log.debug("schema version of db:" + version);
+                    if (version != DB_SCHEMA_VERSION) {
+                        log.debug("Schema Not matched deleting db file");
+                        dbFile.delete();
+                        initializeDatabase = true;
+                    }
+                    finalizeConnection();
+                } catch (SQLException ex) {
+                    try {
+                        finalizeConnection();
+                    } catch (SQLException ex1) {
+                        throw new BuildException("Exception while finalizing Metadata database. ", ex1);
+                    }
+                    // We are Ignoring the errors as no need to fail the build.
+                    log.debug("Exception checking schema for db", ex);
+                    dbFile.delete();
+                    initializeDatabase = true;
+                }
             }
-    
             try
             {
                 initializeConnection();
@@ -123,8 +157,8 @@
                         statement.addBatch("INSERT INTO priority (priority) VALUES (\""
                                 + priorityValues[i] + "\")");
                     }
+                    statement.addBatch("INSERT INTO schema (version) VALUES (\"" + DB_SCHEMA_VERSION + " \")");
                     statement.addBatch("create unique index logfile_unique_1 on logfiles (path)");
-                    //statement.addBatch("create unique index component_unique_1 on component (component)");
     
                     int[] returnCodes = statement.executeBatch();
                     connection.commit();
@@ -135,8 +169,7 @@
             }
             catch (SQLException e)
             {
-                log.debug("problem initializing database",e);
-                throw new BuildException("Problem initializing database");
+                throw new BuildException("Problem while initializing Metadata database. ", e);
             }
         }
     }    
@@ -146,7 +179,7 @@
     {
         // The values assigned to these enums should match the 
         // automatically assigned values created in the database table
-        FATAL(1), ERROR(2), WARNING(3), INFO(4), REMARK(5), DEFAULT(6);
+        FATAL(1), ERROR(2), WARNING(3), INFO(4), REMARK(5), DEFAULT(6), CRITICAL(7);
         private final int value;
         Priority(int value)
         {
@@ -163,6 +196,11 @@
     };
 
 
+    /**
+     * Helper class to store the log entry , used to write to the database
+     * 
+     * @param databasePath The path to the database
+     */
     public static class LogEntry
     {
         private String text;
@@ -175,18 +213,36 @@
         
         private String logPath;
         
+        private float elapsedTime;
+
+    /**
+     * Constructor for the helper class 
+     */
         public LogEntry(String text, Priority priority, String component, 
-                String logPath, int lineNumber)
+                String logPath, int lineNumber, float time)
         {
             this.text = text;
             this.priority = priority;
             this.component = component;
             this.lineNumber = lineNumber;
             this.logPath = logPath;
+            this.elapsedTime = time;
         }
 
+    /**
+     * Constructor for the helper class 
+     */
+        public LogEntry(String text, Priority priority, String component, 
+                String logPath, int lineNumber)
+        {
+            this(text, priority, component, logPath, lineNumber, -1);
+        }
+
+    /**
+     * Constructor for the helper class 
+     */
         public LogEntry(String text, String priorityTxt, String component, String logPath, 
-                int lineNumber) throws Exception
+                int lineNumber, float time) throws Exception
         {
             Priority prty = null;
             String prtyText = priorityTxt.trim().toLowerCase();
@@ -202,6 +258,8 @@
                 prty = Priority.REMARK;
             } else if (prtyText.equals("default")) {
                 prty = Priority.DEFAULT;
+            } else if (prtyText.equals("critical")) {
+                prty = Priority.CRITICAL;
             } else {
                 log.debug("Error: priority " + prtyText + " is not acceptable by metadata and set to Error");
                 prty = Priority.ERROR;
@@ -214,8 +272,23 @@
             
             this.component = component;
             this.lineNumber = lineNumber;
+            this.elapsedTime = time;
         }
-        
+
+    /**
+     * Constructor for the helper class 
+     */
+        public LogEntry(String text, String priorityTxt, String component, String logPath, 
+                int lineNumber) throws Exception
+        {
+            this(text, priorityTxt, component, logPath, lineNumber, -1);
+        }
+
+    /**
+     * Helper function to return to getLogPath
+     * @
+     */
+
         public String getLogPath()
         {
             return logPath;
@@ -241,6 +314,10 @@
         {
             return priority;
         }
+        
+        public double getElapsedTime() {
+            return elapsedTime;
+        }
 
         public void setPriority(Priority priority)
         {
@@ -268,7 +345,6 @@
     public void finalizeStatements() throws SQLException {
         if (statementsInitialized) {
             if ( entryCacheSize > 0) {
-                //log.debug("writing to database");
                 entryCacheSize = 0;
                 writeLogDataToDB();
             }
@@ -291,8 +367,8 @@
                 finalizeConnection();
             }
         } catch (SQLException ex) {
-            log.debug("exception while finalizing the db", ex);
-            //throw ex;
+            // We are Ignoring the errors as no need to fail the build.
+            log.debug("Exception while finalizing the Metadata database. ", ex);
         }
     }
     
@@ -302,8 +378,7 @@
      */
     //Note: Always the query should be in "/" format only
     public Map<String, List<String>> getIndexMap(String query) {
-        Map<String, List<String>> indexMap = new HashMap<String, List<String>>();
-        log.debug("sql query" + query);
+        Map<String, List<String>> indexMap = new LinkedHashMap<String, List<String>>();
         try {
             initializeConnection();
             Statement stmt = connection.createStatement();
@@ -319,12 +394,13 @@
                         int type = rsmd.getColumnType(i);
                         if (type == java.sql.Types.INTEGER ) {
                             data = "" + rs.getInt(i);
+                        } else if (type == java.sql.Types.DOUBLE ) {
+                            data = "" + rs.getDouble(i);
                         } else {
                             data = rs.getString(i);
                         }
-                        log.debug("data:" + data);
                         if ( i == 1) {
-                            key = data;  
+                            key = data;
                         } else {
                             dataList.add(data);
                         }
@@ -335,8 +411,8 @@
             stmt.close();
             finalizeConnection();
         } catch (Exception ex) {
+            // We are Ignoring the errors as no need to fail the build.
             log.debug("Warning: Exception while getting the index map", ex);
-            //throw ex;
         }
         return indexMap;
     }
@@ -344,7 +420,6 @@
     //Note: Always the query should be in "/" format only
     public List<Map<String, Object>> getRecords(String query) {
         List<Map<String, Object>> rowList = new ArrayList<Map<String, Object>>();
-        log.debug("sql query" + query);
         try {
             initializeConnection();
             Statement stmt = connection.createStatement();
@@ -355,26 +430,19 @@
             List<String> columnNames = new ArrayList<String>();
             for (int i = 1; i <= numberOfColumns; i++) {
                 columnNames.add(rsmd.getColumnName(i));
-                log.debug("columnName:" + rsmd.getColumnName(i));
             }
-
-            log.debug("resultSet MetaData column Count=" + numberOfColumns);
             if (rs.isBeforeFirst()) {
                 while (rs.next()) {
-                    Map<String, Object> recordMap = new HashMap<String, Object>();
-                    log.debug("adding records");
+                    Map<String, Object> recordMap = new LinkedHashMap<String, Object>();
                     for (int i = 1; i <= numberOfColumns; i++) {
                         int type = rsmd.getColumnType(i);
                         String columnName = columnNames.get(i - 1);
-                        //log.debug("columnName:" + columnName);
                         if (type == java.sql.Types.INTEGER ) {
                             Integer data = new Integer(rs.getInt(i));
                             recordMap.put(columnName, data);
-                            log.debug("data:" + data);
                         } else {
                             String data = rs.getString(i);
                             recordMap.put(columnName, data );
-                            log.debug("data:" + data);
                         }
                     }
                     rowList.add(recordMap);
@@ -383,8 +451,8 @@
             stmt.close();
             finalizeConnection();
         } catch (Exception ex) {
-            log.debug("Warning: Exception while getting the record details", ex);
-            //throw ex;
+            // We are Ignoring the errors as no need to fail the build.
+            log.warn("Warning: Exception while getting the record details", ex);
         }
         return rowList;
     }
@@ -409,7 +477,6 @@
     private void updateIndexTables(LogEntry entry) throws SQLException
     {
         connection.setAutoCommit(false);
-        //log.debug("updating logpath: " + entry.getLogPath());
         insertLogEntryStmt.setNull(1, 4);
         insertLogEntryStmt.setString(2, entry.getLogPath());
         insertLogEntryStmt.addBatch();
@@ -418,7 +485,6 @@
         readConnection = DriverManager.getConnection(url);
         readConnection.setAutoCommit(false);
         Statement stmt = readConnection.createStatement();
-        log.debug("exiting synchronization---2");
         ResultSet rs = stmt.executeQuery("select id from logfiles where path='" +
                 entry.getLogPath().trim() + "'");
         int logPathId = 0;
@@ -427,7 +493,6 @@
         }
         stmt.close();
         readConnection.close();
-        log.debug("exiting synchronization---5");
         insertComponentStmt.setNull(1, 4);
         insertComponentStmt.setString(2, entry.getComponent());
         insertComponentStmt.setInt(3, logPathId);
@@ -452,27 +517,49 @@
         stmt.close();
     }
     
+    public void removeEntries(List<String> logPathList) throws Exception {
+        initializeConnection();
+        Statement stmt = connection.createStatement();
+        for (String logPath : logPathList) {
+            log.debug("logpath for delete: " + logPath);
+            log.debug("logpath delete query1 " + "DELETE FROM metadata WHERE logpath_id IN (SELECT id from logfiles WHERE path like '" + logPath + "')");
+            stmt.executeUpdate("DELETE FROM metadata WHERE logpath_id IN (SELECT id from logfiles WHERE path like '%" + logPath + "%')");
+            log.debug("logpath for delete2: " + "DELETE FROM component_time WHERE cid IN (select id from component where logpath_id in (select id from logfiles where path like '%" + logPath + "%'))");
+            stmt.executeUpdate("DELETE FROM componenttime WHERE cid IN (select id from component where logpath_id in (select id from logfiles where path like '%" + logPath + "%'))");
+            log.debug("logpath for delete3: " + "DELETE FROM component WHERE logpath_id IN (select id from logfiles where path like '%" + logPath + "%')");
+            stmt.executeUpdate("DELETE FROM component WHERE logpath_id IN (select id from logfiles where path like '%" + logPath + "%')");
+            log.debug("logpath for delete: " + "DELETE FROM logfiles WHERE path like ('%" + logPath + "%')");
+            stmt.executeUpdate("DELETE FROM logfiles WHERE path like ('%" + logPath + "%')");
+        }
+        stmt.close();
+        finalizeConnection();
+    }
+    
     public void addLogEntry(LogEntry entry) throws Exception
     {
        synchronized (MetaDataDb.class) {
             try {
                 if (!statementsInitialized) {
-                    log.debug("initializing statements for JDBC");
+                    log.debug("Initializing statements for JDBC");
                     initializeConnection();
-                    insertMetaDataEntryStmt = connection.prepareStatement("INSERT INTO metadata VALUES(?, ?, ?, ?, ?)");
-                    insertLogEntryStmt = connection.prepareStatement("INSERT or IGNORE INTO logfiles VALUES(?, ?)");
-                    insertComponentStmt = connection.prepareStatement("INSERT or IGNORE INTO component VALUES(?, ?, ?) ");
+                    insertMetaDataEntryStmt = connection.prepareStatement(INSERT_METADATA_ENTRY);
+                    insertLogEntryStmt = connection.prepareStatement(INSERT_LOGENTRY);
+                    insertComponentStmt = connection.prepareStatement(INSERT_COMPONENTENTRY);
+                    insertComponentTimeStmt = connection.prepareStatement(INSERT_COMPONENT_TIME);
                     statementsInitialized = true;
                 }
-                log.debug("MetaDataDB:entry:priority: " + entry.getPriority());
                 connection.setAutoCommit(false);
                 updateIndexTables(entry);
-                if ( entry.getPriority() != Priority.DEFAULT) {
+                double time = entry.getElapsedTime();
+                int logPathId = 0;
+                int componentId = 0;
+                Statement stmt = null;
+                ResultSet rs = null;
+                if ((time != -1) || entry.getPriority() != Priority.DEFAULT) {
                     readConnection = DriverManager.getConnection(url);
-                    Statement stmt = readConnection.createStatement();
-                    ResultSet rs = stmt.executeQuery("select id from logfiles where path='" +
+                    stmt = readConnection.createStatement();
+                    rs = stmt.executeQuery("select id from logfiles where path='" +
                             entry.getLogPath().trim() + "'");
-                    int logPathId = 0;
                     if ( rs.next()) {
                         logPathId = rs.getInt(1);
                     }
@@ -482,13 +569,27 @@
                     stmt = readConnection.createStatement();
                     rs = stmt.executeQuery("select id from component where component='" + 
                             entry.getComponent() + "' and logpath_id='" + logPathId + "'");
-                    int componentId = 0;
                     if ( rs.next()) {
                         componentId = rs.getInt(1);
                     }
                     rs.close();
                     stmt.close();
+                }
+                if (time != -1) {
+                    connection.setAutoCommit(false);
+                    insertComponentTimeStmt.setInt(1, componentId);
+                    insertComponentTimeStmt.setDouble(2, 0);
+                    insertComponentTimeStmt.addBatch();
+                    insertComponentTimeStmt.executeBatch();
+                    connection.commit();
+                    insertComponentTimeStmt.clearBatch();
+                    stmt = readConnection.createStatement();
+                    stmt.executeUpdate("UPDATE componenttime SET time= (time  + " + time + 
+                        ") WHERE cid = " + componentId );
+                    stmt.close();
                     readConnection.close();
+                }
+                if ( entry.getPriority() != Priority.DEFAULT) {
                     insertMetaDataEntryStmt.setInt(1, entry.getPriority().getValue());
                     insertMetaDataEntryStmt.setInt(2, componentId);
                     insertMetaDataEntryStmt.setInt(3, entry.getLineNumber());
@@ -496,14 +597,14 @@
                     insertMetaDataEntryStmt.addBatch();
                     entryCacheSize ++;
                     if (entryCacheSize >= LOG_ENTRY_CACHE_LIMIT) {
-                        log.debug("writing data to database");
                         writeLogDataToDB();
                         entryCacheSize = 0;
                     }
                 }
             } catch (SQLException ex) {
-                log.debug(" Exception while writing the record");
-                throw ex;
+                throw new BuildException("Exception while writing the records into Metadata DB", ex);
+            } catch (Exception ex1) {
+                throw new BuildException("Exception while writing the records into Metadata DB", ex1);
             }
         }
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/templates/general_category.txt.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,36 @@
+<#--
+============================================================================ 
+Name        : summary.html.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+
+    <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
+        "${dbPath}") >
+
+
+
+<#assign logpath_table = table_info['select * from logfiles'] >
+<#assign logpath_id = logpath_table?keys>
+<#list logpath_id as logpath>
+    <#assign component_table = table_info['select id, component from component where logPath_id=${logpath}'] >
+    <#assign component_ids = component_table?keys?sort >
+    <#list component_ids as component_id >
+        component : ${component_table['${component_id}']} : logfile : ${logpath_table['${logpath}']}
+    </#list>
+</#list

>
--- a/buildframework/helium/external/helium-antlib/metadata/src/templates/summary.html.ftl	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/src/templates/summary.html.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -97,27 +97,29 @@
     </@helium_logger_node_head>
     <@helium_logger_node_content nodeid="${helium_node_id}">
         <#list component_ids as component_id>
-            <#assign helium_node_id = helium_node_id + 1>
-            <@helium_logger_node_head nodeid="${helium_node_id}" title="${component_table['${component_id}']}">
+            <#if "${component_table['${component_id}']}" != "general" >
+                <#assign helium_node_id = helium_node_id + 1>
+                <@helium_logger_node_head nodeid="${helium_node_id}" title="${component_table['${component_id}']}">
+                    <#list priority_ids as priority>
+                        <#assign priority_text = "${priority_table['${priority}']}"?lower_case>
+                        <#assign priority_count = "${table_info['select count(data) as COUNT from metadata where logpath_id=${logpath} and priority_id = ${priority} and component_id = ${component_id}'][0]['COUNT']}" >
+                        <@logfile_severity "${component_table['${component_id}']}", "${priority_text}", 
+                                "${priority_count}", 
+                                "${helium_node_id}" />
+                    </#list>
+                </@helium_logger_node_head>
+                <@helium_logger_node_content nodeid="${helium_node_id}">
                 <#list priority_ids as priority>
-                    <#assign priority_text = "${priority_table['${priority}']}"?lower_case>
-                    <#assign priority_count = "${table_info['select count(data) as COUNT from metadata where logpath_id=${logpath} and priority_id = ${priority} and component_id = ${component_id}'][0]['COUNT']}" >
-                    <@logfile_severity "${component_table['${component_id}']}", "${priority_text}", 
-                            "${priority_count}", 
-                            "${helium_node_id}" />
+                    <#list table_info['select * from metadata where logpath_id = ${logpath} and priority_id = ${priority} and component_id = ${component_id}'] as recordentry >
+                        <#-- <#if sublog?node_name == "logfile"> --> 
+                            <@logfile_entry_detail recordentry, "${helium_node_id}" />
+                        <#-- <#elseif sublog?node_name == "log">
+                            <@antlognode sublog/>
+                        </#if> -->
+                    </#list>
                 </#list>
-            </@helium_logger_node_head>
-            <@helium_logger_node_content nodeid="${helium_node_id}">
-            <#list priority_ids as priority>
-                <#list table_info['select * from metadata where logpath_id = ${logpath} and priority_id = ${priority} and component_id = ${component_id}'] as recordentry >
-                    <#-- <#if sublog?node_name == "logfile"> --> 
-                        <@logfile_entry_detail recordentry, "${helium_node_id}" />
-                    <#-- <#elseif sublog?node_name == "log">
-                        <@antlognode sublog/>
-                    </#if> -->
-                </#list>
-            </#list>
-            </@helium_logger_node_content>
+                </@helium_logger_node_content>
+            </#if>
         </#list>
     </@helium_logger_node_content>
 </#list>
--- a/buildframework/helium/external/helium-antlib/metadata/tests/build.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -22,7 +22,8 @@
 -->
 <project name="helium-antlib-metadata-unittest" xmlns:au="antlib:org.apache.ant.antunit">
     <description>Helium Antlib metadata tests.</description>
-    
+    <import file="../../test-macros.ant.xml" />
+  
     <dirname property="metadata.unitest.dir" file="${ant.file.helium-antlib-metadata-unittest}" />
     <property environment="env" />
     <import file="../../../nokia/companyproperties.ant.xml" optional="true"/>
@@ -33,9 +34,6 @@
     <target name="unittest" depends="unittest-metadata"/>
 
     <target name="unittest-metadata">
-        <au:antunit>
-            <fileset dir="." includes="**/test_*.ant.xml" />
-            <au:plainlistener logLevel="info"/>
-        </au:antunit>
+        <antunitModule name="metadata" />
     </target>
 </project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/data/categorization.log	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<buildlog sbs_version="2.9.2 [2009-09-21 sf release]" xmlns="http://symbian.com/xml/build/log" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build/log http://symbian.com/xml/build/log/1_0.xsd">
+<recipe name='compile' target='X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/urel/srchuiresultview.o' host='' layer='app_layer' component='' bldinf='X:/sf/app/organizer/group/bld.inf' mmp='X:/sf/app/organizer/searchui/searchapp/plugins/resultviewerplugin/group/srchuiresviewplugin.mmp' config='armv5_urel.product' platform='armv5' phase='ALL' source='X:/sf/app/organizer/searchui/searchapp/plugins/resultviewerplugin/src/srchuiresultview.cpp'>
+<![CDATA[
++ C:/APPS/rvct22_616/bin/armcc.exe -O2 --dwarf2 --dllimport_runtime --exceptions --exceptions_unwind --diag_suppress 161,611,654,997,1152,1300,1464,1488,2523,6318,6331 --diag_error 1267 --cpu 5T --enum_is_int -Ono_known_library --fpmode ieee_no_fenv --export_all_vtbl --memaccess -UL41 --no_vfe --apcs /inter -c --thumb -D__MARM_THUMB__ --fpu softvfp --cpp -D__MARM_INTERWORK__ -D__SUPPORT_CPP_EXCEPTIONS__ -D_UNICODE -D__SYMBIAN32__ -D__ARMCC__ -D__EPOC32__ -D__MARM__ -D__EABI__ '-D__PRODUCT_INCLUDE__="X:/epoc32/include/feature_settings.hrh"' -D__MARM_ARMV5__ -D__ARMCC_2__ -D__ARMCC_2_2__ -DNDEBUG -D__DLL__ --preinclude X:/epoc32/include/rvct/rvct.h -JX:/sf/app/organizer/searchui/searchapp/plugins/resultviewerplugin/src -JX:/sf/app/organizer/searchui/searchapp/plugins/resultviewerplugin/inc -JX:/sf/app/organizer/searchui/searchapp/inc -JX:/sf/app/organizer/searchui/searchapp/SrchUICommon/inc -JX:/epoc32/ -JX:/epoc32/include/config/platform -JX:/epoc32/include/baseport -JX:/epoc32/include -JX:/epoc32/include/ecom -JX:/epoc32/include -JX:/epoc32/include/mw -JX:/epoc32/include/platform/mw -JX:/epoc32/include/platform -JX:/epoc32/include/app -JX:/epoc32/include/platform/app -JX:/epoc32/include/platform/loc -JX:/epoc32/include/platform/mw/loc -JX:/epoc32/include/platform/app/loc -JX:/epoc32/include/platform/loc/sc -JX:/epoc32/include/platform/mw/loc/sc -JX:/epoc32/include/platform/app/loc/sc --depend_format=unix --depend X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/urel/srchuiresultview.o.d -o X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/urel/srchuiresultview.o X:/sf/app/organizer/searchui/searchapp/plugins/resultviewerplugin/src/srchuiresultview.cpp
+"X:\sf\app\organizer\searchui\searchapp\plugins\resultviewerplugin\src\srchuiresultview.cpp", line 339: Error:  #20: identifier "KSEARCH_HLP_SINGLE_RE" is undefined
+          	helpContext.iContext = KSEARCH_HLP_SINGLE_RE; // add correct help context when available
+          	                       ^
+X:\sf\app\organizer\searchui\searchapp\plugins\resultviewerplugin\src\srchuiresultview.cpp: 0 warnings, 1 error
+
+]]><time start='1253718692.38008' elapsed='1.094' />
+<status exit='failed' code='1' attempt='3' />
+</recipe>
+make: *** [X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/urel/srchuiresultview.o] Error 1
+<clean bldinf='X:/sf/app/organizer/group/bld.inf' mmp='X:/sf/app/organizer/searchui/searchapp/plugins/resultviewerplugin/group/srchuiresviewplugin.mmp' config='armv5_udeb.product'>
+<file>X:/epoc32/release/armv5/udeb/srchuiresviewplugin.dll</file>
+<file>"X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresviewplugin{000a0000}.def"</file>
+<file>"X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresviewplugin{000a0000}.dso"</file>
+<file>X:/epoc32/release/armv5/udeb/srchuiresviewplugin.dll.sym</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresviewplugin_udeb_objects.via</file>
+<file>X:/epoc32/release/armv5/udeb/srchuiresviewplugin.dll.map</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultview.o.d</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultcontainer.o.d</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultmodel.o.d</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/proxy.o.d</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultview.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultcontainer.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultmodel.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/proxy.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultview.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultcontainer.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultmodel.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/proxy.o</file>
+<file>X:/epoc32/release/armv5.product/udeb/srchuiresviewplugin.dll</file>
+<file>X:/epoc32/release/armv5.product/udeb/srchuiresviewplugin.dll.sym</file>
+<file>X:/epoc32/release/armv5.product/udeb/srchuiresviewplugin.dll.map</file>
+<dir>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5</dir>
+<dir>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5</dir>
+<dir>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb</dir>
+<dir>X:/epoc32/release/armv5/udeb</dir>
+<dir>X:/epoc32/release/armv5/lib</dir>
+<dir>X:/epoc32/release/armv5/lib</dir>
+<dir>X:/epoc32/release/armv5.product/udeb</dir>
+</clean>
+</buildlog>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/data/categorization_clean.log	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<buildlog sbs_version="2.9.2 [2009-09-21 sf release]" xmlns="http://symbian.com/xml/build/log" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build/log http://symbian.com/xml/build/log/1_0.xsd">
+<clean bldinf='X:/sf/app/organizer/group/bld.inf' mmp='X:/sf/app/organizer/searchui/searchapp/plugins/resultviewerplugin/group/srchuiresviewplugin.mmp' config='armv5_udeb.product'>
+<file>X:/epoc32/release/armv5/udeb/srchuiresviewplugin.dll</file>
+<file>"X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresviewplugin{000a0000}.def"</file>
+<file>"X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresviewplugin{000a0000}.dso"</file>
+<file>X:/epoc32/release/armv5/udeb/srchuiresviewplugin.dll.sym</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresviewplugin_udeb_objects.via</file>
+<file>X:/epoc32/release/armv5/udeb/srchuiresviewplugin.dll.map</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultview.o.d</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultcontainer.o.d</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultmodel.o.d</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/proxy.o.d</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultview.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultcontainer.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultmodel.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/proxy.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultview.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultcontainer.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultmodel.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/proxy.o</file>
+<file>X:/epoc32/release/armv5.product/udeb/srchuiresviewplugin.dll</file>
+<file>X:/epoc32/release/armv5.product/udeb/srchuiresviewplugin.dll.sym</file>
+<file>X:/epoc32/release/armv5.product/udeb/srchuiresviewplugin.dll.map</file>
+<dir>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5</dir>
+<dir>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5</dir>
+<dir>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb</dir>
+<dir>X:/epoc32/release/armv5/udeb</dir>
+<dir>X:/epoc32/release/armv5/lib</dir>
+<dir>X:/epoc32/release/armv5/lib</dir>
+<dir>X:/epoc32/release/armv5.product/udeb</dir>
+</clean>
+</buildlog>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/data/noerror.log	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<buildlog sbs_version="2.9.2 [2009-09-21 sf release]" xmlns="http://symbian.com/xml/build/log" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build/log http://symbian.com/xml/build/log/1_0.xsd">
+</buildlog>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/data/parser_error.log	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<buildlog sbs_version="2.9.2 [2009-09-21 sf release]" xmlns="http://symbian.com/xml/build/log" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build/log http://symbian.com/xml/build/log/1_0.xsd">
+<recipe name='compile' target='X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/urel/srchuiresultview.o' host='' layer='app_layer' component='' bldinf='X:/sf/app/organizer/group/bld.inf' mmp='X:/sf/app/organizer/searchui/searchapp/plugins/resultviewerplugin/group/srchuiresviewplugin.mmp' config='armv5_urel.product' platform='armv5' phase='ALL' source='X:/sf/app/organizer/searchui/searchapp/plugins/resultviewerplugin/src/srchuiresultview.cpp'>
+<![CDATA[
++ C:/APPS/rvct22_616/bin/armcc.exe -O2 --dwarf2 --dllimport_runtime --exceptions --exceptions_unwind --diag_suppress 161,611,654,997,1152,1300,1464,1488,2523,6318,6331 --diag_error 1267 --cpu 5T --enum_is_int -Ono_known_library --fpmode ieee_no_fenv --export_all_vtbl --memaccess -UL41 --no_vfe --apcs /inter -c --thumb -D__MARM_THUMB__ --fpu softvfp --cpp -D__MARM_INTERWORK__ -D__SUPPORT_CPP_EXCEPTIONS__ -D_UNICODE -D__SYMBIAN32__ -D__ARMCC__ -D__EPOC32__ -D__MARM__ -D__EABI__ '-D__PRODUCT_INCLUDE__="X:/epoc32/include/feature_settings.hrh"' -D__MARM_ARMV5__ -D__ARMCC_2__ -D__ARMCC_2_2__ -DNDEBUG -D__DLL__ --preinclude X:/epoc32/include/rvct/rvct.h -JX:/sf/app/organizer/searchui/searchapp/plugins/resultviewerplugin/src -JX:/sf/app/organizer/searchui/searchapp/plugins/resultviewerplugin/inc -JX:/sf/app/organizer/searchui/searchapp/inc -JX:/sf/app/organizer/searchui/searchapp/SrchUICommon/inc -JX:/epoc32/ -JX:/epoc32/include/config/platform -JX:/epoc32/include/baseport -JX:/epoc32/include -JX:/epoc32/include/ecom -JX:/epoc32/include -JX:/epoc32/include/mw -JX:/epoc32/include/platform/mw -JX:/epoc32/include/platform -JX:/epoc32/include/app -JX:/epoc32/include/platform/app -JX:/epoc32/include/platform/loc -JX:/epoc32/include/platform/mw/loc -JX:/epoc32/include/platform/app/loc -JX:/epoc32/include/platform/loc/sc -JX:/epoc32/include/platform/mw/loc/sc -JX:/epoc32/include/platform/app/loc/sc --depend_format=unix --depend X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/urel/srchuiresultview.o.d -o X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/urel/srchuiresultview.o X:/sf/app/organizer/searchui/searchapp/plugins/resultviewerplugin/src/srchuiresultview.cpp
+"X:\sf\app\organizer\searchui\searchapp\plugins\resultviewerplugin\src\srchuiresultview.cpp", line 339: Error:  #20: identifier "KSEARCH_HLP_SINGLE_RE" is undefined
+          	helpContext.iContext = KSEARCH_HLP_SINGLE_RE; // add correct help context when available
+          	                       ^
+X:\sf\app\organizer\searchui\searchapp\plugins\resultviewerplugin\src\srchuiresultview.cpp: 0 warnings, 1 error
+
+]]><time start='1253718692.38008' elapsed='1.094' />
+<error>
+<status exit='failed' code='1' attempt='3' />
+</recipe>
+make: *** [X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/urel/srchuiresultview.o] Error 1
+<clean bldinf='X:/sf/app/organizer/group/bld.inf' mmp='X:/sf/app/organizer/searchui/searchapp/plugins/resultviewerplugin/group/srchuiresviewplugin.mmp' config='armv5_udeb.product'>
+<file>X:/epoc32/release/armv5/udeb/srchuiresviewplugin.dll</file>
+<file>"X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresviewplugin{000a0000}.def"</file>
+<file>"X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresviewplugin{000a0000}.dso"</file>
+<file>X:/epoc32/release/armv5/udeb/srchuiresviewplugin.dll.sym</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresviewplugin_udeb_objects.via</file>
+<file>X:/epoc32/release/armv5/udeb/srchuiresviewplugin.dll.map</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultview.o.d</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultcontainer.o.d</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultmodel.o.d</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/proxy.o.d</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultview.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultcontainer.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultmodel.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/proxy.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultview.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultcontainer.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/srchuiresultmodel.o</file>
+<file>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb/proxy.o</file>
+<file>X:/epoc32/release/armv5.product/udeb/srchuiresviewplugin.dll</file>
+<file>X:/epoc32/release/armv5.product/udeb/srchuiresviewplugin.dll.sym</file>
+<file>X:/epoc32/release/armv5.product/udeb/srchuiresviewplugin.dll.map</file>
+<dir>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5</dir>
+<dir>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5</dir>
+<dir>X:/epoc32/build/organizer/c_aff6bae36b1df6c4/srchuiresviewplugin_dll/armv5/udeb</dir>
+<dir>X:/epoc32/release/armv5/udeb</dir>
+<dir>X:/epoc32/release/armv5/lib</dir>
+<dir>X:/epoc32/release/armv5/lib</dir>
+<dir>X:/epoc32/release/armv5.product/udeb</dir>
+</clean>
+</buildlog>
--- a/buildframework/helium/external/helium-antlib/metadata/tests/functionality/func_add_test.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/functionality/func_add_test.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -160,6 +160,26 @@
         </hlm:metadatarecord>
     </target>
 
+    <target name="test-old_schema">
+        <copy file="${project.dir}/../output/old_schema_log.sqlite" 
+            tofile="${project.dir}/../output/old_schema_log.sqlite_bak" />
+        <echo message="text log metadata input validation" />
+        <hlm:metadatarecord database="${project.dir}/../output/old_schema_log.sqlite">
+            <hlm:abldmetadatainput>
+                <fileset dir="${project.dir}/../data">
+                    <include  name="sample_abld.log"/>
+                </fileset>
+                <metadatafilterset refid="text_log_metadata_input" />
+            </hlm:abldmetadatainput>
+        </hlm:metadatarecord>
+
+        <delete file="${project.dir}/../output/old_schema_log.sqlite" />
+        <copy file="${project.dir}/../output/old_schema_log.sqlite_bak" 
+            tofile="${project.dir}/../output/old_schema_log.sqlite"
+            failonerror="false" />
+        
+    </target>
+
     <target name="ant_ido_logs">
         <delete file="${project.dir}/../output/ant_ido_logs.sqlite" failonerror="false" />
         <echo message="text log metadata input validation" />
--- a/buildframework/helium/external/helium-antlib/metadata/tests/functionality/test_regex.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/metadata/tests/functionality/test_regex.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -41,6 +41,102 @@
         <metadatafilterset filterfile="${metadata-filterfile}" />
     </hlm:metadatafilterset>
 
+    <!-- Test categorization for sbs scanlog
+    -->
+    <target name="test-categorization">
+        <delete file="${project.dir}/../output/categorization.sqlite" failonerror="false" />
+        <echo message="categorization validation" />
+        <hlm:metadatarecord database="${project.dir}/../output/categorization.sqlite">
+            <hlm:sbsmetadatainput cleanLogFile="${project.dir}/../data/categorization_clean.log">
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="categorization.log"/>
+                </fileset>
+                <metadatafilterset refid="all-regex-filterfile" />
+            </hlm:sbsmetadatainput>
+        </hlm:metadatarecord>
+        <hlm:metadataCountSeverity severity="error" log="categorization.log" db="${project.dir}/../output/categorization.sqlite" property="cleanlog_errors"/>
+        <au:assertTrue>
+            <equals arg1="${cleanlog_errors}" arg2="2"/>
+        </au:assertTrue>
+    </target>
+
+    <!-- Test parser error
+    -->
+    <target name="test-parser-error">
+        <delete file="${project.dir}/../output/parser_error.sqlite" failonerror="false" />
+        <au:expectfailure>
+            <hlm:metadatarecord database="${project.dir}/../output/parser_error.sqlite">
+                <hlm:sbsmetadatainput>
+                    <fileset dir="${project.dir}/../data/">
+                        <include  name="parser_error.log"/>
+                    </fileset>
+                    <metadatafilterset refid="all-regex-filterfile" />
+                </hlm:sbsmetadatainput>
+            </hlm:metadatarecord>
+        </au:expectfailure>
+    </target>
+
+    <!-- Test parser error
+    -->
+    <target name="test-parser-error-keepgoing">
+        <delete file="${project.dir}/../output/parser_error.sqlite" failonerror="false" />
+        <hlm:metadatarecord database="${project.dir}/../output/parser_error.sqlite" failonerror="false">
+            <hlm:sbsmetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="parser_error.log"/>
+                </fileset>
+                <metadatafilterset refid="all-regex-filterfile" />
+            </hlm:sbsmetadatainput>
+        </hlm:metadatarecord>
+    </target>
+
+
+    <!-- Test categorization without cleanLogFile
+    -->
+    <target name="test-categorization-nocleanlog">
+        <delete file="${project.dir}/../output/categorization.sqlite" failonerror="false" />
+        <echo message="categorization validation" />
+        <hlm:metadatarecord database="${project.dir}/../output/categorization.sqlite">
+            <hlm:sbsmetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="categorization.log"/>
+                </fileset>
+                <metadatafilterset refid="all-regex-filterfile" />
+            </hlm:sbsmetadatainput>
+        </hlm:metadatarecord>
+        <hlm:metadataCountSeverity severity="error" log="categorization.log" db="${project.dir}/../output/categorization.sqlite" property="nocleanlog_errors"/>
+        <au:assertTrue>
+            <equals arg1="${nocleanlog_errors}" arg2="1"/>
+        </au:assertTrue>
+    </target>
+
+    <target name="test-log-entry-for-no-errors">
+        <delete file="${project.dir}/../output/log-entry-for-no-error.sqlite" failonerror="false" />
+        <echo message="categorization validation" />
+        <hlm:metadatarecord database="${project.dir}/../output/log-entry-for-no-error.sqlite">
+            <hlm:sbsmetadatainput>
+                <fileset dir="${project.dir}/../data/">
+                    <include  name="noerror.log"/>
+                </fileset>
+                <metadatafilterset refid="all-regex-filterfile" />
+            </hlm:sbsmetadatainput>
+        </hlm:metadatarecord>
+        <fmpp sourceFile="${project.dir}/../../src/templates/general_category.txt.ftl"
+                     outputfile="${project.dir}/../output/general_category.txt">
+            <freemarkerLinks expandProperties="yes">
+                macro: ${project.dir}/../../src/templates/macro
+            </freemarkerLinks>
+            <data expandProperties="yes">
+                dbPath: ${project.dir}/../output/log-entry-for-no-error.sqlite
+                ant: antProperties()
+            </data>
+        </fmpp>
+        <au:assertFileExists file="${project.dir}/../output/general_category.txt" message="Error in test cases"/>
+        <loadfile property="logEntry"
+              srcFile="${project.dir}/../output/general_category.txt"/>
+        <au:assertMatches string="${logEntry}" pattern="component : general : logfile : " 
+                     casesensitive="false"/>
+    </target>
 
     <!-- Check for all the regular expression defined in the filter file,
     The log file contains text for matching regular expression.
@@ -251,7 +347,7 @@
 
     <target name="test-policy_metadata_input">
         <property name="metadata-read-db" value="${project.dir}/../output/log_policy_metadata_input.sqlite"/>
-        <delete file="${metadata-policy-db}" failonerror="false" />
+        <delete file="${metadata-read-db}" failonerror="false" />
         <echo message="policy metadata input validation" />
         <echo message="database:${metadata-read-db}" />
         <au:assertFileExists file="${metadata-filterfile}" message="${metadata-filterfile} filter file does not exist"/>
@@ -274,7 +370,7 @@
 
     <target name="test-ant_log_metadata_input">
         <property name="metadata-read-db" value="${project.dir}/../output/log_ant_metadata_input.sqlite"/>
-        <delete file="${metadata-ant-db}" failonerror="false" />
+        <delete file="${metadata-read-db}" failonerror="false" />
         <echo message="ant log metadata input validation" />
         <echo message="database:${metadata-read-db}" />
         <au:assertFileExists file="${metadata-filterfile}" message="${metadata-filterfile} filter file does not exist"/>
--- a/buildframework/helium/external/helium-antlib/quality/tests/build.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/quality/tests/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -22,12 +22,12 @@
 -->
 <project name="helium-antlib-unittest" xmlns:au="antlib:org.apache.ant.antunit">
     <description>Helium antlib quality tests.</description>
+    
+    <import file="../../test-macros.ant.xml" />
+
     <target name="unittest" depends="unittest-quality" />
 
     <target name="unittest-quality">
-        <au:antunit>
-            <fileset dir="." includes="test_*.ant.xml" />
-            <au:plainlistener logLevel="info" />
-        </au:antunit>
+        <antunitModule name="quality" />
     </target>
 </project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/bld.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,60 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+
+REM Configure Ant 
+if not defined TESTED_ANT_HOME (
+set TESTED_ANT_HOME=C:\Apps\ant_1.7
+) 
+if exist %TESTED_ANT_HOME% (set ANT_HOME=%TESTED_ANT_HOME%)
+
+REM Configure the expected Ant Version details below
+SET expMajorVer=1
+SET expMinorVer=7
+
+rem *** Verify Ant Version ***
+rem -- Run the 'ant -version' command and capture the output to a variable 
+for /f "tokens=*" %%a in ('ant -version') do (set antversion=%%a)
+echo *** Installed Version : %antversion%
+
+rem -- Parse the version string obtained above and get the version number
+for /f "tokens=4 delims= " %%a in ("%antversion%") do set val=%%a
+rem -- Parse the version number delimiting the '.' and set the major and
+rem    minor versions
+for /f "tokens=1-2 delims=." %%a in ("%val%") do (
+set /A majorVersion=%%a
+set /A minorVersion=%%b
+)
+rem -- Check whether major version is greater than or equal to the expected.
+if %majorVersion% geq %expMajorVer% ( 
+rem -- if major version is valid, check minor version. If minor version is less
+rem    than expected display message and abort the execution.
+if %minorVersion% lss %expMinorVer% (echo *** Incorrect version of Ant found. Please check you have atleast Ant 1.7.0 & goto :errorstop ) 
+)
+
+ant %*
+endlocal
+
+:errorstop
+@echo *** Build aborted with error
+exit /b 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-sbs">
+    <description>Helium Antlib sbs build file.</description>
+    
+    <import file="../macros.ant.xml"/>
+    
+    <property name="name" value="sbs"/>
+    
+    <path id="helium.sbs.classpath">
+        <fileset dir="${helium.antlib.root.dir}/bin" includes="*.jar"/>
+        <fileset dir="${helium.antlib.root.dir}/sbs/lib" includes="*.jar"/>
+    </path>
+
+</project>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/SAXSysdefParser.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,94 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.helium.sbs;
+
+import org.dom4j.Document;
+import org.apache.tools.ant.BuildException;
+import org.dom4j.Element;
+import org.dom4j.Attribute;
+import org.dom4j.ElementPath;
+import org.dom4j.ElementHandler;
+import org.dom4j.io.SAXReader;
+import org.apache.log4j.Logger;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * Parses the sysdef config file and extracts the available configurations
+ */
+public class SAXSysdefParser {
+    private File sysdefFile;
+    private String configs = "";
+    private List<String> layers;
+    private boolean initialized;
+    private Logger log = Logger.getLogger(SAXSysdefParser.class);
+
+    /**
+     * Constructor
+     * @param fileName - name of the sysdef file to parse
+     */
+    public SAXSysdefParser(File fileName) {
+        
+        sysdefFile = fileName;
+    }
+    
+    public List<String> getLayers() {
+        if (!initialized ) {
+            initialized = true;
+            parseConfig("layer");
+            if (layers == null) {
+                throw new BuildException("No layers found from sysdef");
+            }
+        }
+        return layers;
+    }
+
+    /**
+     * Constructor
+     * @return list of available configurations that can be built.
+     */    
+     public void parseConfig(String nodeToGet) {
+        layers = new ArrayList<String>();
+        SAXReader reader = new SAXReader();
+            reader.addHandler( "/SystemDefinition/systemModel/" + nodeToGet,
+                new ElementHandler() {
+                    public void onStart(ElementPath path) {
+                    }
+                    public void onEnd(ElementPath path) {
+                        Element row = path.getCurrent();
+                        Iterator itr = row.attributeIterator();
+                        while (itr.hasNext())
+                        {
+                            Attribute child = (Attribute) itr.next();
+                            String attrName = child.getQualifiedName();
+                            if (attrName.equals("name")) {
+                                layers.add((String)child.getValue());
+                            }
+                        }
+                        row.detach();
+                    }
+                }
+            );
+        try {
+            Document doc = reader.read(sysdefFile);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/SBSCommandBase.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,83 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.sbs;
+
+import java.io.File;
+import java.util.HashMap;
+
+import com.nokia.helium.core.plexus.CommandBase;
+
+/**
+ * Simple SBS wrapper based on the CommandBase class.
+ *
+ */
+public class SBSCommandBase extends CommandBase<SBSException> {
+
+    private File workingDir;
+    
+    private String cleanLogPath;
+    
+    /**
+     * @return sbs.
+     */
+    @Override
+    protected String getExecutable() {
+        return "sbs";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void throwException(String message, Throwable t) throws SBSException {
+        throw new SBSException(message, t);
+    }
+
+    /**
+     * Set the working directory where emake should be called.
+     * @param workingDir the working directory.
+     */
+    public void setWorkingDir(File workingDir) {
+        this.workingDir = workingDir;
+    }
+
+    /**
+     * Get the workingDir defined by the user.
+     * @return the working dir.
+     */
+    @Override
+    public File getWorkingDir() {
+        return workingDir;
+    }
+
+    public void setCleanLogFilePath(String path) {
+        cleanLogPath = path;
+    }
+
+    /**
+     * Executes the command using as argline, instead of argument.
+     * @param argLine, argline to execute.
+     */
+    public void execute(String argLine) throws SBSException {
+        HashMap<String, String> envMap = new HashMap<String, String>();
+        envMap.put("PYTHONPATH", "");
+        if ( cleanLogPath != null) {
+            envMap.put("SBS_CLEAN_LOG_FILE", cleanLogPath);
+        }
+        executeCmdLine(argLine, envMap, null);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/SBSException.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.sbs;
+
+/**
+ * Exception raise by the SBS Modules.
+ *
+ */
+public class SBSException extends Exception {
+
+    /**
+     * An exception with message. 
+     * @param message
+     */
+    public SBSException(String message) {
+        super(message);
+    }
+
+    /**
+     * An exception with message and cause.
+     * @param message
+     */
+    public SBSException(String message, Throwable t) {
+        super(message, t);
+    }
+    
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/ant/SBSBuildList.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.sbs.ant;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.HashMap;
+import com.nokia.helium.sbs.ant.types.*;
+import com.nokia.helium.sbs.ant.taskdefs.*;
+import org.apache.log4j.Logger;
+
+public final class SBSBuildList {
+
+
+
+    private static HashMap<Object, SBSBuild> sbsBuildMap;
+
+    private static Logger log = Logger.getLogger(SBSBuildList.class);
+
+    private SBSBuildList() {
+    }
+    
+    public static List<SBSInput> getSBSInputList(Project project, String buildName) {
+        if (sbsBuildMap == null) {
+            initialize(project);
+        }
+        SBSBuild sbsBuild = sbsBuildMap.get(buildName);
+        if (sbsBuild == null) {
+            throw new BuildException("Config name : " + buildName + " is not valid");
+        }
+        List<SBSInput> retList = null;
+        if (sbsBuild != null) {
+            retList = sbsBuild.getSBSInputList();
+        }
+        return retList;
+    }
+
+    private static void initialize(Project project) {
+        Hashtable references = project.getReferences();
+        sbsBuildMap = new HashMap<Object, SBSBuild>();
+        for (Object key : references.keySet()) {
+            Object sbsBuildObject = references.get(key); 
+            if ( sbsBuildObject != null && sbsBuildObject instanceof SBSBuild) {
+                sbsBuildMap.put(key, (SBSBuild)sbsBuildObject);
+            }
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/ant/antlib.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : antlib.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<antlib>
+    <!-- Task definition -->
+    <taskdef name="sbstask" classname="com.nokia.helium.sbs.ant.taskdefs.SBSTask"/>
+    <taskdef name="getsbsinputs" classname="com.nokia.helium.sbs.ant.taskdefs.GetSBSInputs"/>
+    <!-- Type definition -->
+    <typedef name="sbsbuild" classname="com.nokia.helium.sbs.ant.types.SBSBuild"/>
+    <typedef name="sbsinput" classname="com.nokia.helium.sbs.ant.types.SBSInput"/>
+    <typedef name="sbsmakeoptions" classname="com.nokia.helium.sbs.ant.types.SBSMakeOptions"/>
+    <typedef name="sbsoptions" classname="com.nokia.helium.core.ant.types.VariableSet"/>
+</antlib>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/ant/taskdefs/GetSBSInputs.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.sbs.ant.taskdefs;
+
+import java.util.List;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import com.nokia.helium.sbs.ant.types.*;
+import com.nokia.helium.sbs.ant.*;
+import org.apache.log4j.Logger;
+
+public class GetSBSInputs extends Task {
+
+    private Logger log = Logger.getLogger(GetSBSInputs.class);
+    private String configName;
+    private String outputProperty;
+    
+
+    public void setConfig(String name) {
+        configName = name;
+    }
+
+    public void setOutputProperty(String property) {
+        outputProperty = property;
+    }
+
+    /**
+     *  Execute the task. Set the property with number of severities.  
+     * @throws BuildException
+     */
+    public void execute() {
+        if (configName == null) {
+            throw new BuildException("configInput is not defined");
+        }
+        List<SBSInput> sbsInputList = SBSBuildList.getSBSInputList(getProject(), configName);
+        StringBuffer inputs = new StringBuffer();
+        for (SBSInput input : sbsInputList) {
+            if (inputs.length() > 0) {
+                inputs.append(",");
+            }
+            inputs.append(input.getRefid().getRefId());
+            getProject().setProperty(outputProperty,inputs.toString());
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/ant/taskdefs/SBSTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,311 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
+
+package com.nokia.helium.sbs.ant.taskdefs;
+
+import java.util.List;
+import org.w3c.dom.*;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.*;
+import javax.xml.transform.dom.*;
+import javax.xml.transform.stream.*;
+import java.io.FileWriter;
+import java.text.DecimalFormat;
+import java.util.Date;
+import com.nokia.helium.core.plexus.AntStreamConsumer;
+import java.io.File;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import com.nokia.helium.core.ant.types.Variable;
+import com.nokia.helium.core.ant.types.VariableSet;
+import com.nokia.helium.sbs.ant.types.*;
+import com.nokia.helium.sbs.ant.*;
+import org.apache.log4j.Logger;
+import org.apache.tools.ant.types.PatternSet;
+import com.nokia.helium.sbs.SAXSysdefParser;
+import com.nokia.helium.sbs.SBSCommandBase;
+import com.nokia.helium.sbs.SBSException;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import com.nokia.helium.core.plexus.FileStreamConsumer;
+import java.util.Collection;
+
+public class SBSTask extends Task {
+
+    private Logger log = Logger.getLogger(SBSTask.class);
+    private String sbsInputName;
+    private String layerPatternSetRef;
+    private File sysDefFile;
+    private File workingDir;
+    private File errorFile;
+    private String logSuffix;
+    private String cleanLog;
+    private String outputLogName;
+    private File statsLog;
+    private boolean executeCmd = true;
+    private boolean failOnError = true;
+    private Date startTime;
+    private Date endTime;
+
+
+    public void setCleanLog(String logPath) {
+        cleanLog = logPath;
+    }
+
+    public void setOutputLog(String logName) {
+        outputLogName = logName;
+    }
+
+    public void setStatsLog(File log) {
+        statsLog = log;
+    }
+    
+    public void setSBSInput(String inputName) {
+        sbsInputName = inputName;
+    }
+
+    public void setErrorOutput(File file) {
+        errorFile = file;
+    }
+
+    public void setSysDefFile(File file) {
+        sysDefFile = file;
+    }
+
+    public void setLogSuffix(String suffix) {
+        logSuffix = suffix;
+    }
+
+    public void setLayerPatternSetRef(String id) {
+        layerPatternSetRef = id;
+    }
+
+    public void setWorkingDir(File dir) {
+        workingDir = dir;
+    }
+
+    public void setExecute(boolean execute) {
+        executeCmd = execute;
+    }
+
+    public void setFailOnError(boolean failBuild) {
+        failOnError = failBuild;
+    }
+
+    /**
+     *  Execute the task. Set the property with number of severities.  
+     * @throws BuildException
+     */
+    public void execute() {
+        if (sbsInputName == null) {
+            throw new BuildException("sbsInputName is not defined");
+        }
+        if (sysDefFile == null) {
+            throw new BuildException("System Definition file is missing");
+        }
+        if (workingDir == null) {
+            throw new BuildException("workingDir must be set");
+        }
+        
+        List <String> filteredLayers = getFilteredLayers();
+        SBSCommandBase sbsCmd = new SBSCommandBase();
+        sbsCmd.setWorkingDir(workingDir);
+        if (cleanLog != null) {
+            sbsCmd.setCleanLogFilePath(cleanLog);
+        }
+        try {
+            log.debug("error stream file : " + errorFile);
+            sbsCmd.addOutputLineHandler(new AntStreamConsumer(this));
+            if (errorFile == null) {
+                log.debug("redirecting error to Antstream");
+                sbsCmd.addErrorLineHandler(new AntStreamConsumer(this));
+            } else {
+                log.debug("redirecting error to file stream");
+                sbsCmd.addErrorLineHandler(new FileStreamConsumer(errorFile));
+            }
+        } catch (java.io.FileNotFoundException ex) {
+            log.info("file path: " + errorFile + "Not valid" );
+        }
+        Object refObject = getProject().getReferences().get(sbsInputName);
+        if (refObject == null) {
+            throw new BuildException("invalid sbs input reference: " + sbsInputName);
+        }
+        if ( refObject != null && ! (refObject instanceof SBSInput)) {
+            throw new BuildException("sbs input name " + sbsInputName + "is not valid");
+        }
+        SBSInput sbsInput = (SBSInput)refObject;
+        StringBuffer cmdOptions = new StringBuffer();
+        VariableSet sbsOptions = sbsInput.getFullSBSOptions();
+        cmdOptions.append(" -s " + sysDefFile);
+        Collection<Variable> variableList = sbsOptions.getVariables(); 
+        if (sbsOptions != null ) {
+           if (variableList.isEmpty()) {
+               throw new BuildException("sbsoptions cannot be empty for input: " + sbsInputName);
+           }
+        }
+        for (Variable variable : variableList) {
+            cmdOptions.append(" " + variable.getParameter());
+        }
+        SBSMakeOptions sbsMakeOptions = sbsInput.getFullSBSMakeOptions();
+        variableList = null;
+        if (sbsMakeOptions != null) {
+            cmdOptions.append(" -e " + sbsMakeOptions.getEngine());
+            String ppThreads = sbsMakeOptions.getPPThreads();
+            if (ppThreads != null) {
+                cmdOptions.append(" -j " + ppThreads);
+            }
+            variableList = sbsMakeOptions.getVariables(); 
+            //if (variableList.isEmpty()) {
+            //    throw new BuildException("sbs make options cannot be empty for input: " + sbsInputName);
+            //}
+            for (Variable variable : variableList) {
+                cmdOptions.append(" --mo=");
+                cmdOptions.append(variable.getParameter());
+            }
+        }
+        if (filteredLayers != null) {
+            if (filteredLayers.isEmpty()) {
+                log.info("Warning: No matching layers to build from system definition file, skipped");
+                return;
+            } else {
+                for (String layer : filteredLayers) {
+                    cmdOptions.append(" -l " + layer);
+                }
+            }
+        }
+        startTime = new Date();
+        try {
+            log("sbs commands: " + cmdOptions.toString());
+            if (executeCmd) {
+                sbsCmd.execute(cmdOptions.toString());
+            }
+        } catch (SBSException sex) {
+            log.info("SBS exception occured during sbs execution");
+            if (failOnError) {
+                throw new BuildException("exception during SBS execution", sex);
+            }
+        } catch (Exception ex) {
+            log.info("Exception occured during sbs execution");
+            if (failOnError) {
+                throw new BuildException("exception during SBS execution", ex);
+            }
+        }
+        endTime = new Date();
+        updateSBSLogStatistics(statsLog, outputLogName);
+    }
+
+    private List<String> getFilteredLayers() {
+        List<String> filteredLayers = null;
+        if (layerPatternSetRef != null) {
+            Hashtable references = getProject().getReferences();
+            Object layerPatternSetObject = references.get(layerPatternSetRef); 
+            if ( layerPatternSetObject != null && ! (layerPatternSetObject instanceof PatternSet)) {
+                throw new BuildException("Layer Pattern set is not of type PatternSet");
+            }
+            if (layerPatternSetObject != null) {
+                PatternSet layerPatternSet = (PatternSet) layerPatternSetObject;
+                SAXSysdefParser sysDefParser = new SAXSysdefParser(sysDefFile);
+                List<String> fullLayerList = sysDefParser.getLayers(); 
+                filteredLayers = new ArrayList<String>();
+                String[] includes = layerPatternSet.getIncludePatterns(getProject());
+                String[] excludes = layerPatternSet.getExcludePatterns(getProject());
+                if (includes == null && excludes == null) {
+                    throw new BuildException("No patterns specified");
+                }
+                for (String layer : fullLayerList) {
+                    if (includes == null) {
+                        if (!isExcluded(layer, excludes)) {
+                            filteredLayers.add(layer);
+                        }
+                        continue;
+                    }
+                    if (isIncluded(layer, includes) ) {
+                        if (!isExcluded(layer, excludes)) {
+                            filteredLayers.add(layer);
+                        }
+                    }
+                }
+            }
+        }
+        return filteredLayers;
+    }
+
+    
+    private boolean isIncluded(String text, String[] includes) {
+        if (includes != null) {
+            for (String pattern : includes) {
+                if (text.matches(pattern)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private void updateSBSLogStatistics(File infoFileName, 
+            String logFileName) {
+
+        try {
+            DocumentBuilderFactory sbsInfo = DocumentBuilderFactory.newInstance();
+            DocumentBuilder docBuilder = sbsInfo.newDocumentBuilder();
+            Document doc = docBuilder.newDocument();
+            Element root = doc.createElement("sbsinfo");
+            doc.appendChild(root);
+            Element child = doc.createElement("logfile");
+            child.setAttribute("name", logFileName);
+            root.appendChild(child);
+
+            long timeDiff = (endTime.getTime() - startTime.getTime()) / 1000;
+            child = doc.createElement("durationlong");
+            child.setAttribute("time", "" + timeDiff);
+            root.appendChild(child);
+            child = doc.createElement("duration");
+            int hours = (int) (timeDiff / 3600);
+            int minutesSeconds = (int)(timeDiff % 3600);
+            int minutes = minutesSeconds / 60;
+            int seconds = minutesSeconds % 60;
+            DecimalFormat decimalFormat =  new DecimalFormat();
+            decimalFormat.setMinimumIntegerDigits(2);
+            String duration = decimalFormat.format(hours) + "H:" +  
+                    decimalFormat.format(minutes) +  "M:"  + decimalFormat.format(seconds) + "S";
+            //Todo: handle if the time difference is greater than 24 hours
+            child.setAttribute("time", duration);
+            root.appendChild(child);
+            Transformer transformer = TransformerFactory.newInstance().newTransformer();
+            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+            FileWriter sbsWriter = new FileWriter(infoFileName);
+            StreamResult result = new StreamResult(sbsWriter);
+            DOMSource sbsSource = new DOMSource(doc);
+            transformer.transform(sbsSource, result);
+        } catch (Exception ex) {
+            log.debug("exception while xml writing sbs log info", ex);
+        }
+        
+    }
+
+    private boolean isExcluded(String text, String[] excludes) {
+        if (excludes != null) {
+            for (String pattern : excludes) {
+                if (text.matches(pattern)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/ant/types/SBSBuild.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,92 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.helium.sbs.ant.types;
+
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.BuildException;
+import java.util.Vector;
+import java.util.List;
+import java.util.ArrayList;
+import org.apache.tools.ant.types.Reference;
+import org.apache.log4j.Logger;
+
+
+/**
+ * Helper class to store the command line variables
+ * with name / value pair.
+ * @ant.type name="arg"
+ * @ant.type name="makeOption"
+ */
+public class SBSBuild extends DataType
+{
+    private static Logger log = Logger.getLogger(SBSBuild.class);
+
+    private String name;
+
+    private Vector<SBSInput> sbsInputList = new Vector<SBSInput>();
+
+
+    public SBSBuild() {
+    }
+    
+    /**
+     * Set the name of the variable.
+     * @param name
+     */
+    public void setName(String nm) {
+        name = nm;
+    }
+
+    /**
+     * Gets the name of the build input.
+     * @param name
+     */
+    public String getName() {
+        return name;
+    }
+    
+    /**
+     * Creates an empty variable element and adds 
+     * it to the variables list
+     * @return empty Variable pair
+     */
+    public SBSInput createSBSInput() {
+        SBSInput input =  new SBSInput();
+        sbsInputList.add(input);
+        return input;
+    }
+    
+    public List<SBSInput> getSBSInputList() {
+        List<SBSInput> inputList = new ArrayList<SBSInput>();
+        Reference refId = getRefid();
+        Object sbsInputObject = null;
+        if (refId != null) {
+            try {
+                sbsInputObject = refId.getReferencedObject();
+            } catch ( Exception ex) {
+                //log.info("Reference id of sbsinput list is not valid");
+                throw new BuildException("Reference id (" + refId.getRefId() + ") of sbsinput list is not valid");
+            }
+            if (sbsInputObject != null && sbsInputObject instanceof SBSInput) {
+                inputList.add((SBSInput)sbsInputObject);
+            }
+        }
+        inputList.addAll(sbsInputList);
+        return inputList;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/ant/types/SBSInput.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,251 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.helium.sbs.ant.types;
+
+import com.nokia.helium.core.ant.types.VariableSet;
+import com.nokia.helium.core.ant.VariableIFImpl;
+import java.util.Collection;
+import com.nokia.helium.core.ant.types.Variable;
+import org.apache.tools.ant.BuildException;
+import java.util.Vector;
+import org.apache.tools.ant.types.Reference;
+import org.apache.log4j.Logger;
+
+/**
+ * Helper class to store the variable set (list of variables
+ * with name / value pair)
+ * @ant.type name="argSet"
+ */
+public class SBSInput extends VariableIFImpl {
+    
+    private static Logger log = Logger.getLogger(SBSInput.class);
+    
+    private Vector<VariableSet> sbsOptions = new Vector<VariableSet>();
+    private Vector<SBSMakeOptions> sbsMakeOptions = new Vector<SBSMakeOptions>();
+    private Vector<SBSInput> sbsInputList = new Vector<SBSInput>();
+    
+    /**
+     * Constructor
+     */
+    public SBSInput() {
+    }    
+
+    /**
+     * Creates an empty variable element and adds 
+     * it to the variables list
+     * @return empty Variable pair
+     */
+    public VariableSet createSBSOptions() {
+        SBSInput sbsInput = new SBSInput();
+        VariableSet varSet =  new VariableSet();
+        sbsInput.addSBSOptions(varSet);
+        sbsInputList.add(sbsInput);
+        return varSet;
+    }
+    
+    public void addSBSOptions(VariableSet varSet) {
+        sbsOptions.add(varSet);
+    }
+    
+    /**
+     * Creates an empty variable element and adds 
+     * it to the variables list
+     * @return empty Variable pair
+     */
+    public VariableSet createSBSMakeOptions() {
+        SBSInput sbsInput = new SBSInput();
+        SBSMakeOptions varSet =  new SBSMakeOptions();
+        sbsInput.addSBSMakeOptions(varSet);
+        sbsInputList.add(sbsInput);
+        return varSet;
+    }
+
+    public void addSBSMakeOptions(SBSMakeOptions varSet) {
+        sbsMakeOptions.add(varSet);
+    }
+
+    public SBSInput createSBSInput() {
+        SBSInput sbsInput = new SBSInput();
+        sbsInputList.add(sbsInput);
+        return sbsInput;
+    }
+    
+    public Vector<VariableSet> getSBSOptions() {
+        return sbsOptions;
+    }
+
+    public Vector<SBSMakeOptions> getSBSMakeOptions() {
+        return sbsMakeOptions;
+    }
+    
+    private void validateInput() {
+        if (getRefid() != null && (!sbsMakeOptions.isEmpty() || !sbsOptions.isEmpty())) {
+            throw new BuildException("SBSInput with refid should not have sbsoptions / sbsmakeoptions");
+        }
+    }
+
+    private Vector<VariableSet> getSBSOptions(SBSInput sbsInput) {
+        Vector<VariableSet> fullList = null;
+        sbsInput.validateInput();
+        Reference refId = sbsInput.getRefid();
+        Object sbsInputObject = null;
+        if (refId != null) {
+            try {
+                sbsInputObject = refId.getReferencedObject();
+            } catch ( Exception ex) {
+                //log.info("Reference id of sbsinput list is not valid");
+                throw new BuildException("Reference id (" + refId.getRefId() + ") of sbsinput list is not valid");
+            }
+            if (sbsInputObject != null && sbsInputObject instanceof SBSInput) {
+                VariableSet options = ((SBSInput)sbsInputObject).getFullSBSOptions();
+                if (options != null ) {
+                    if (fullList == null) {
+                        fullList = new Vector<VariableSet>();
+                    }
+                    fullList.add(options);
+                }
+            }
+        }
+        Vector<VariableSet> optionsList = sbsInput.getSBSOptions();
+        if (optionsList != null ) {
+            if (fullList == null) {
+                fullList = new Vector<VariableSet>();
+            }
+            fullList.addAll(optionsList);
+        }
+        return fullList;
+    }
+
+    private Vector<SBSMakeOptions> getSBSMakeOptions(SBSInput sbsInput) {
+        Vector<SBSMakeOptions> sbsMakeOptionsList = null;
+        Reference refId = sbsInput.getRefid();
+        Object sbsInputObject = null;
+        if (refId != null) {
+            try {
+                sbsInputObject = refId.getReferencedObject();
+            } catch ( Exception ex) {
+               throw new BuildException("Reference id (" + refId.getRefId() + ") of sbsinput list is not valid");
+            }
+            if (sbsInputObject != null && sbsInputObject instanceof SBSInput) {
+                SBSMakeOptions options = ((SBSInput)sbsInputObject).getFullSBSMakeOptions(); 
+                if (options != null ) {
+                    if (sbsMakeOptionsList == null) {
+                        sbsMakeOptionsList = new Vector<SBSMakeOptions>();
+                    }
+                    sbsMakeOptionsList.add(options);
+                }
+            }
+        }
+        Vector<SBSMakeOptions> options = sbsInput.getSBSMakeOptions();
+        if (options != null) {
+            if (sbsMakeOptionsList == null) {
+                sbsMakeOptionsList = new Vector<SBSMakeOptions>();
+            }
+            sbsMakeOptionsList.addAll(options);
+        }
+        return sbsMakeOptionsList;
+    }
+
+    public VariableSet getFullSBSOptions() {
+        Vector<VariableSet> fullList = null;
+        VariableSet resultSet = null;
+        Vector<VariableSet> currentOptions = getSBSOptions(this);
+        if (currentOptions != null && !currentOptions.isEmpty()) {
+            if (fullList == null ) {
+                fullList = new Vector<VariableSet>();
+            }
+            fullList.addAll(currentOptions);
+        }
+        for (SBSInput sbsInput : sbsInputList) {
+            Vector<VariableSet> options = getSBSOptions(sbsInput);
+            if (options != null && !options.isEmpty()) {
+                if (fullList == null ) {
+                    fullList = new Vector<VariableSet>();
+                }
+                fullList.addAll(options);
+            }
+        }
+        if (fullList != null) {
+            for (VariableSet varSet : fullList) {
+                for (Variable var : varSet.getVariables()) {
+                    if (resultSet == null) {
+                        resultSet = new VariableSet();
+                    }
+                    resultSet.add(var);
+                }
+            }
+        }
+        return resultSet;
+    }
+
+    public SBSMakeOptions getFullSBSMakeOptions() {
+        Vector<SBSMakeOptions> sbsMakeOptionsList = null;
+        SBSMakeOptions resultSet = null;
+        Vector<SBSMakeOptions> currentOptions = getSBSMakeOptions(this);
+        if (currentOptions != null && !currentOptions.isEmpty()) {
+            if (sbsMakeOptionsList == null ) {
+                sbsMakeOptionsList = new Vector<SBSMakeOptions>();
+            }
+            sbsMakeOptionsList.addAll(currentOptions);
+        }
+        for (SBSInput sbsInput : sbsInputList) {
+            Vector<SBSMakeOptions> options = getSBSMakeOptions(sbsInput);
+            if (options != null && !options.isEmpty()) {
+                if (sbsMakeOptionsList == null ) {
+                    sbsMakeOptionsList = new Vector<SBSMakeOptions>();
+                }
+                sbsMakeOptionsList.addAll(options);
+            }
+        }
+        if (sbsMakeOptionsList != null ) {
+            String engine = null;
+            for (SBSMakeOptions varSet : sbsMakeOptionsList) {
+                String currentEngine = varSet.getEngine();
+                if (currentEngine != null) {
+                    if (engine == null) {
+                        engine = currentEngine;
+                        if (resultSet == null ) {
+                            resultSet = new SBSMakeOptions();
+                        }
+                        resultSet.setEngine(currentEngine);
+                    } else {
+                        if (!engine.equals(currentEngine) ) {
+                            throw new BuildException("inheriting engine types mismatch: " + engine + " != " + currentEngine);
+                        }
+                    }
+                }
+                if (resultSet == null ) {
+                    resultSet = new SBSMakeOptions();
+                }
+                for (Variable var : varSet.getVariables()) {
+                    resultSet.add(var);
+                }
+            }
+        }
+        return resultSet;
+    }
+    
+    public Collection<Variable> getVariables() {
+        Collection<Variable> varList = null;
+        VariableSet  options = getFullSBSOptions();
+        if (options != null) {
+            varList = options.getVariables();
+        }
+        return varList;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/src/com/nokia/helium/sbs/ant/types/SBSMakeOptions.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,136 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.helium.sbs.ant.types;
+
+import com.nokia.helium.core.ant.types.VariableSet;
+import org.apache.log4j.Logger;
+import org.apache.tools.ant.types.Reference;
+import org.apache.tools.ant.BuildException;
+import java.util.List;
+
+/**
+ * Helper class to store the variable set (list of variables
+ * with name / value pair)
+ * @ant.type name="argSet"
+ */
+public class  SBSMakeOptions extends VariableSet {
+
+    private static Logger log = Logger.getLogger(SBSMakeOptions.class);
+
+    private String engine;
+
+    private String ppThreads;
+
+    
+    private boolean initialized;
+    /**
+     * Constructor
+     */
+    public SBSMakeOptions() {
+    }    
+
+    /**
+     * Helper function called by ant to create the new varset
+     */
+    public SBSMakeOptions createSBSMakeOptions() {
+        SBSMakeOptions options =  new SBSMakeOptions();
+        add(options);
+        return options;
+    }
+
+    /**
+     * Helper function to add the created varset
+     * @param filter to be added to the varset
+     */
+    public void add(SBSMakeOptions option) {
+        super.add(option);
+    }
+
+    /**
+     * Sets the engine type for this options 
+     * @param engine for which the make options are used
+     */
+    public void setEngine(String engineName) {
+        engine = engineName;
+    }
+
+    /**
+     * Sets the ppthreads (no. bldinfs to process) 
+     * @param ppBlock no. bldinfs to process per block
+     */
+    public void setPPThreads(String ppBlock) {
+        ppThreads = ppBlock;
+    }
+    
+    public String getPPThreads() {
+        if (!initialized) {
+            initializeAll();
+            initialized = true;
+        }
+        return ppThreads;
+    }
+
+    /**
+     * Returns the engine name 
+     * @return type of make engine
+     */
+    public String getEngine() {
+        if (!initialized) {
+            initializeAll();
+            initialized = true;
+        }
+        if (engine == null) {
+            throw new BuildException("engine should not be null");
+        }
+        return engine;
+    }
+    private void initializeAll() {
+        Object sbsInputObject = null;
+        List<VariableSet> varSets = getVariableSets();
+        initialize(this);
+        for (VariableSet varSet : varSets) {
+            initialize(varSet);
+        }
+    }
+    
+    private void initialize(VariableSet varSet) {
+        SBSMakeOptions makeOptions = null;
+        Reference refId = varSet.getRefid();
+        if (refId != null) {
+            try {
+                makeOptions = (SBSMakeOptions)refId.getReferencedObject();
+                if (makeOptions != null) {
+                    String refEngine = makeOptions.getEngine();
+                    String threads = makeOptions.getPPThreads();
+                    if (engine != null && !(engine.equals(refEngine))) {
+                        throw new BuildException(" Config's engine type " + engine + " not matching with reference : " 
+                                + refId.getRefId() + ": engine: " + refEngine);
+                    }
+                    if (ppThreads == null) {
+                        ppThreads = threads;
+                    }
+                    if (engine == null) {
+                        engine = refEngine;
+                    }
+                }
+            } catch ( Exception ex) {
+                throw new BuildException(ex.getMessage());
+            }
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/tests/bld.sh	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,24 @@
+#!/bin/csh
+
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+
+module load java/1.6.0
+module load mercurial
+setenv ANT_ARGS "-lib ../lib -lib ../../lib -lib ../../core/lib  -lib ../../bin/helium-core.jar -lib ../../bin/helium-sbs.jar -lib ../../antlibs"
+ant $*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/tests/build.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,27 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set ANT_ARGS=-lib ..\lib -lib ..\..\lib -lib ..\..\core\lib -lib ..\..\bin\helium-core.jar -lib ..\..\bin\helium-sbs.jar -lib ..\..\antlibs
+ant %*
+endlocal
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/tests/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-sbs-unittest" xmlns:au="antlib:org.apache.ant.antunit">
+    <description>Helium Antlib sbs tests.</description>
+    <import file="../../test-macros.ant.xml" />
+  
+    <dirname property="sbs.unitest.dir" file="${ant.file.helium-antlib-sbs-unittest}" />
+    <property environment="env" />
+    <import file="../../../nokia/companyproperties.ant.xml" optional="true"/>
+    <import file="../../../../extensions/nokia/external/helium-nokia-antlib/companyproperties.ant.xml" optional="true"/>
+
+    <target name="unittest" depends="unittest-sbs"/>
+
+    <target name="unittest-sbs">
+        <antunitModule name="sbs" />
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/tests/sbs_default_config.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,164 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : test_diamonds.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="sbs-default-config" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib default sbs configuration.</description>
+    
+    <dirname property="project.dir" file="${ant.file.sbs-default-config}" />
+
+    <taskdef resource="com/nokia/helium/sbs/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+    <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+
+    <hlm:sbsbuild id="pf_7952">
+        <sbsInput refid="mainbuild-sbs-ec" >
+            <sbsOptions>
+                <arg line="-f armv5.log" />
+            </sbsOptions>
+        </sbsInput>
+    </hlm:sbsbuild>
+    
+    <hlm:sbsbuild id="sf_build">
+        <sbsInput refid="tools-sbs" />
+        <sbsInput refid="mainbuild-sbs" />
+    </hlm:sbsbuild>
+    
+    <!-- In future migrationg to 3.0 schema <sbsbuild> would also to handle layers and filters 
+        and also to include / exclude layers to be built 
+    -->
+
+    <!-- Common make options for particular engine values of it could be overridden by referencing it-->
+    <hlm:sbsmakeoptions id="commonEMakeOptions" engine="emake">
+        <arg name="--emake-emulation" value="gmake" />
+        <arg name="--emake-annodetail" value="basic,history,waiting" />
+        <arg name="--emake-class" value="${ec.build.class}" />
+        <arg name="--emake-historyfile" value="${ec.historyfile.dir}/raptor_clean.emake.data" />
+        <arg name="--case-sensitive" value="0" />
+    </hlm:sbsmakeoptions>
+        
+    <hlm:sbsmakeoptions id="commonGmakeOptions" engine="gmake" />
+
+    <hlm:sbsmakeoptions id="commonPVMGmakeOptions" engine="pvmgmake" />
+        
+    <!-- Tools specific make options inheriting the commone make option-->
+    <hlm:sbsmakeoptions id="toolsmake-sbs-ec">
+        <sbsmakeoptions refid="commonEMakeOptions" />
+        <arg name="--emake-maxagents" value="1" />
+    </hlm:sbsmakeoptions>
+            
+    <!-- Main build make option directly refering to common emake option -->
+    <hlm:sbsmakeoptions id="mainbuildmake-sbs-ec" engine="emake">
+        <sbsmakeoptions refid="commonEMakeOptions" />
+    </hlm:sbsmakeoptions>
+        
+    <!-- sbs input consists of sbs options and sbs make options, the sbs options remains same for all
+    the build system, the make options varies
+     -->
+    <hlm:sbsinput id="tools-sbs">
+        <sbsoptions>
+            <arg line="-c tools_rel -c tools2_rel" />
+            <arg name="-j" value="1" />
+        </sbsoptions>
+    </hlm:sbsinput>
+
+    <!-- sbs input for main build.
+     -->
+    <hlm:sbsinput id="mainbuild-sbs">
+        <sbsoptions>
+            <arg line="-c winscw -c armv5" />
+            <arg line="-f winscw.log" />
+        </sbsoptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="mainbuild-sbs-ec">
+        <sbsoptions>
+            <arg line="-c winscw -c armv5" />
+            <arg line="-f winscw.log" />
+        </sbsoptions>
+        <sbsmakeoptions refid="mainbuildmake-sbs-ec" />
+    </hlm:sbsinput>
+
+    <!-- Main build make option directly refering to common emake option -->
+    <hlm:sbsmakeoptions id="common-inherit-ec-without-engine">
+        <arg name="--emake-emulation" value="gmake" />
+        <arg name="--emake-annodetail" value="basic,history,waiting" />
+        <arg name="--emake-class" value="${ec.build.class}" />
+        <arg name="--emake-historyfile" value="${ec.historyfile.dir}/raptor_clean.emake.data" />
+    </hlm:sbsmakeoptions>
+
+    <hlm:sbsmakeoptions id="common-inherit-ec-with-engine" engine="emake">
+        <arg name="--emake-emulation" value="gmake" />
+        <arg name="--emake-annodetail" value="basic,history,waiting" />
+        <arg name="--emake-class" value="${ec.build.class}" />
+        <arg name="--emake-historyfile" value="${ec.historyfile.dir}/raptor_clean.emake.data" />
+    </hlm:sbsmakeoptions>
+
+    <hlm:sbsinput id="engine-inherit1-sbs-ec">
+        <sbsoptions>
+            <arg line="-c winscw -c armv5" />
+            <arg line="-f winscw.log" />
+        </sbsoptions>
+        <sbsmakeoptions refid="common-inherit-ec-without-engine" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="engine-inherit2-sbs-ec">
+        <sbsoptions>
+            <arg line="-c winscw -c armv5" />
+            <arg line="-f winscw.log" />
+        </sbsoptions>
+        <sbsmakeoptions refid="common-inherit-ec-with-engine" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="engine-inherit3-sbs-ec">
+        <sbsoptions>
+            <arg line="-c winscw -c armv5" />
+        </sbsoptions>
+        <sbsmakeoptions refid="common-inherit-ec-with-engine" engine="ec-helium" />
+    </hlm:sbsinput>
+
+    <hlm:sbsbuild id="inherit1">
+        <sbsInput refid="engine-inherit1-sbs-ec" >
+            <sbsOptions>
+                <arg line="-f armv5.log" />
+            </sbsOptions>
+        </sbsInput>
+    </hlm:sbsbuild>
+
+    <hlm:sbsbuild id="inherit2">
+        <sbsInput refid="engine-inherit2-sbs-ec" >
+            <sbsOptions>
+                <arg line="-f armv5.log" />
+            </sbsOptions>
+        </sbsInput>
+    </hlm:sbsbuild>
+
+    <hlm:sbsinput id="inherit3_sbs_input"> 
+        <sbsInput refid="engine-inherit3-sbs-ec" />
+        <sbsoptions>
+            <arg line="-f armv5.log" />
+        </sbsoptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsbuild id="inherit3">
+        <sbsinput refid="inherit3_sbs_input" />
+    </hlm:sbsbuild>
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/tests/test.sysdef.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,142 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : test.sysdef.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE SystemDefinition [
+ <!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED
+  span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset 
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED  
+  span CDATA #IMPLIED
+  level CDATA #IMPLIED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+  name CDATA #REQUIRED
+  level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+  unitID ID #REQUIRED
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  bldFile CDATA #REQUIRED
+  priority CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+  name CDATA #REQUIRED
+  version CDATA #REQUIRED
+  late (Y|N) #IMPLIED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+  name ID #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N | y | n) #REQUIRED
+  targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  command CDATA #REQUIRED>
+ <!ENTITY layer_real_source_path "/sf/os/mm" >
+]>
+<SystemDefinition name="test_model" schema="1.4.0">
+    <systemModel>
+        <layer name="include_layer_set">
+            <module name="multimedia_mdf">
+                <unit name="mmdevicefw" unitID="sos.mmdevicefw" bldFile="sf\os\mm\mmdevicefw\mdf\group" mrp="sf\os\mm\mmdevicefw\mdf\group\multimedia_mdf.mrp"/>
+            </module>
+            <module name="multimedia_testframework">
+                <unit name="mmtestfw" unitID="sos.mmtestfw" bldFile="sf\os\mm\mmtestenv\mmtestfw\group" mrp="sf\os\mm\mmtestenv\mmtestfw\group\multimedia_testframework_source.mrp"/>
+            </module>
+        </layer>
+        <layer name="exclude_layer_set">
+            <module name="mmimg_component_test_rom">
+                <unit name="mdfunittest" unitID="sos.mdfunittest" bldFile="sf\os\mm\mmdevicefw\mdfunittest\codecapi\audio\tsrc\group" mrp="" filter="mmimg_component_test_rom"/>
+            </module>
+        </layer>
+        <layer name="include_exclude_matcher">
+            <module name="mmimg_component_test_rom">
+                <unit name="mdfunittest" unitID="sos.mdfunittest" bldFile="sf\os\mm\mmdevicefw\mdfunittest\codecapi\audio\tsrc\group" mrp="" filter="mmimg_component_test_rom"/>
+            </module>
+        </layer>
+        <layer name="include_exclude_non-matcher">
+            <module name="mmimg_component_test_rom">
+                <unit name="mdfunittest" unitID="sos.mdfunittest" bldFile="sf\os\mm\mmdevicefw\mdfunittest\codecapi\audio\tsrc\group" mrp="" filter="mmimg_component_test_rom"/>
+            </module>
+        </layer>
+  </systemModel>
+</SystemDefinition>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sbs/tests/test_sbs_input.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,179 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : test_sbs_input.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+
+<project name="test-sbs-input" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib sbs unittests.</description>
+
+    <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+    <taskdef resource="com/nokia/helium/sbs/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+    <taskdef name="getVariableValue" classname="com.nokia.helium.core.ant.taskdefs.GetValueFromVariableSet"/>
+    <dirname property="test.sbs.dir" file="${ant.file.test-sbs-input}"/>
+    <property name="working.dir" value="${test.sbs.dir}" />
+    <patternset id="includeLayerPatternSet" >
+        <include name="include_layer_.*"/>
+    </patternset>
+
+    <patternset id="emptySet" />
+
+    <patternset id="excludeLayerPatternSet" >
+        <exclude name="exclude_layer_.*" />
+    </patternset>
+
+    <patternset id="incExcludeLayerPatternSet" >
+        <include name="include_exclude_.*" />
+        <exclude name="include_exclude_non-matcher.*" />
+    </patternset>
+
+    <dirname property="project.dir" file="${ant.file.test-sbs-input}" />
+
+    <property name="build.system" value="sbs" />
+
+    <import file="${project.dir}/sbs_default_config.ant.xml" />
+
+    <target name="test-7952">
+        <hlm:getsbsinputs config="pf_7952" outputProperty="sbs-inputs"/>
+        <hlm:sbstask sbsinput="${sbs-inputs}" sysdefFile="test.sysdef.xml" 
+            workingDir="${working.dir}" execute="false"/>
+    </target>
+
+    <target name="test-without-sysdef">
+        <property name="build.system" value="sbs" />
+        <au:expectfailure>
+            <hlm:getsbsinputs config="pf_7952" outputProperty="sbs-inputs"/>
+            <hlm:sbstask sbsinput="pf_7952" workingDir="${working.dir}" execute="false"/>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-without-working-dir">
+        <property name="build.system" value="sbs" />
+        <au:expectfailure>
+            <hlm:getsbsinputs config="pf_7952" outputProperty="sbs-inputs"/>
+            <hlm:sbstask sbsinput="${sbs-inputs}" sysdefFile="test.sysdef.xml" execute="false" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-sbs">
+        <property name="build.system" value="sbs" />
+        <hlm:getsbsinputs config="pf_7952" outputProperty="sbs-inputs"/>
+        <hlm:sbstask sbsinput="${sbs-inputs}" sysdefFile="test.sysdef.xml" 
+            workingDir="${working.dir}" execute="false"/>
+    </target>
+
+    <target name="test-sbs-ec">
+        <property name="build.system" value="sbs-ec" />
+        <hlm:getsbsinputs config="pf_7952" outputProperty="sbs-inputs"/>
+        <hlm:sbstask sbsinput="${sbs-inputs}" sysdefFile="test.sysdef.xml" 
+            workingDir="${working.dir}" execute="false"/>
+    </target>
+
+    <target name="test-all-layers">
+        <property name="build.system" value="sbs" />
+        <hlm:getsbsinputs config="pf_7952" outputProperty="sbs-inputs"/>
+        <hlm:sbstask sbsinput="${sbs-inputs}" sysdefFile="test.sysdef.xml" 
+            workingDir="${working.dir}" execute="false"/>
+    </target>
+
+    <target name="test-include-layers">
+        <property name="build.system" value="sbs" />
+        <hlm:getsbsinputs config="pf_7952" outputProperty="sbs-inputs"/>
+        <hlm:sbstask sbsinput="${sbs-inputs}" sysdefFile="test.sysdef.xml" 
+            layerPatternSetRef="includeLayerPatternSet" workingDir="${working.dir}"
+            execute="false"/>
+        <au:assertLogContains text="sbs" />
+        <au:expectfailure>
+            <au:assertLogContains text="-l exclude_layer_set" />
+        </au:expectfailure>
+        <au:expectfailure>
+            <au:assertLogContains text="-l include_exclude_matcher" />
+        </au:expectfailure>
+        <au:expectfailure>
+            <au:assertLogContains text="-l include_exclude_non-matcher" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-exclude-layers">
+        <property name="build.system" value="sbs-ec" />
+        <hlm:getsbsinputs config="pf_7952" outputProperty="sbs-inputs"/>
+        <hlm:sbstask sbsinput="${sbs-inputs}" sysdefFile="test.sysdef.xml" 
+            layerPatternSetRef="excludeLayerPatternSet" 
+            workingDir="${working.dir}" execute="false"/>
+        <au:assertLogContains text="-l include_layer_set" />
+        <au:assertLogContains text="-l include_exclude_matcher" />
+        <au:assertLogContains text="-l include_exclude_non-matcher" />
+    </target>
+
+<!--
+    <target name="test-include-exclude-layers">
+        <property name="build.system" value="sbs" />
+        <hlm:getsbsinputs config="pf_7952" outputProperty="sbs-inputs"/>
+        <hlm:sbstask sbsinput="${sbs-inputs}" sysdefFile="test.sysdef.xml" 
+            layerPatternSetRef="incExcludeLayerPatternSet" 
+            workingDir="${working.dir}" execute="false"/>
+        <au:assertLogContains text="-l include_exclude_matcher" />
+    </target>
+-->
+    <target name="test-empty-pattern-set">
+        <property name="build.system" value="sbs-ec" />
+        <au:expectfailure>
+            <hlm:getsbsinputs config="pf_7952" outputProperty="sbs-inputs"/>
+            <hlm:sbstask config="${sbs-inputs}" sysdefFile="test.sysdef.xml" 
+                layerPatternSetRef="emptySet" 
+                workingDir="${working.dir}" execute="false"/>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-engine-inheritence1">
+        <property name="build.system" value="sbs-ec" />
+        <au:expectfailure>
+            <hlm:getsbsinputs config="inherit1" outputProperty="sbs-inputs"/>
+            <hlm:sbstask sbsinput="${sbs-inputs}" sysdefFile="test.sysdef.xml" 
+                workingDir="${working.dir}" execute="false"/>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-engine-inheritence2">
+        <property name="build.system" value="sbs-ec" />
+        <hlm:getsbsinputs config="inherit2" outputProperty="sbs-inputs"/>
+        <hlm:sbstask sbsinput="${sbs-inputs}" sysdefFile="test.sysdef.xml" workingDir="${working.dir}" execute="false"/>
+        <au:assertLogContains text="-e emake" />
+    </target>
+
+    <target name="test-engine-inheritence3">
+        <property name="build.system" value="sbs-ec" />
+        <au:expectfailure>
+            <hlm:getsbsinputs config="inherit3" outputProperty="sbs-inputs"/>
+            <hlm:sbstask sbsinput="${sbs-inputs}" sysdefFile="test.sysdef.xml" 
+                workingDir="${working.dir}" execute="false"/>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-getinputs">
+        <property name="build.system" value="sbs-ec" />
+        <hlm:getsbsinputs config="inherit3" outputProperty="sbs-inputs"/>
+        <echo message="sbs-inputs: ${sbs-inputs}" />
+        <getVariableValue name="-f" property="sbs.log.file">
+            <hlm:sbsinput refid="${sbs-inputs}" />
+        </getVariableValue>
+        <echo message="${sbs-inputs}" />
+    </target>
+</project>
\ No newline at end of file
--- a/buildframework/helium/external/helium-antlib/scm/demo/build.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/demo/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -398,4 +398,12 @@
         </hlm:scm>
     </target>
     
+    
+    <target name="demo-init" depends="setup">
+        <property name="temp.dir" location="${ant.file.demo}/../temp" />
+        <hlm:scm verbose="true" scmUrl="scm:hg:${temp.dir}/new">
+            <hlm:init />
+        </hlm:scm>
+    </target>
+
 </project>
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/ChangelogAction.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/ChangelogAction.java	Wed Dec 23 19:29:07 2009 +0200
@@ -20,6 +20,11 @@
 import java.util.Date;
 import java.text.SimpleDateFormat;
 import java.util.Iterator;
+import java.io.*;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
 
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmRevision;
@@ -63,7 +68,7 @@
     private String startVersion;
 
     private String endVersion;
-    private String xmlproperty;
+    private File xmlbom;
 
 
     /**
@@ -131,13 +136,13 @@
     }
     
     /**
-     * Output property for xml output of changeset list
+     * File for xml output of changeset list
      * 
      * @ant.not-required
      */ 
-    public void setXMLProperty(String xmlproperty)
+    public void setXmlbom(File xmlbom)
     {
-        this.xmlproperty = xmlproperty;
+        this.xmlbom = xmlbom;
     }
 
     /**
@@ -164,7 +169,7 @@
              }
              catch (Exception e)
              {
-                 throw new BuildException("Date Format not supported jash:" + e.getMessage());
+                 throw new ScmException("Date Format not supported:" + e.getMessage());
              }
          }
          else 
@@ -191,7 +196,7 @@
         {
             getTask().log(changelogSet.toXML());
         }
-        else if (xmlproperty != null)
+        else if (xmlbom != null)
         {
             String output = "";
             for (Object o : changelogSet.getChangeSets())
@@ -206,8 +211,36 @@
                 
                 output = output + "<task><id>" + revision + "</id><synopsis>" + c.getComment() + "</synopsis><completed>" + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(c.getDate()) + "</completed></task>";
             }
-            
-            getProject().setProperty(xmlproperty, output);
+            String[] path = getTask().getScmUrl().split("/");
+            String xml = "<bom><build>untitled</build><content>\n";
+            String thisproject = "<project>" + "<name>" + path[path.length - 1] + "</name>" + "<baseline>" + getTask().getScmUrl() + "</baseline>" + "<database>mercurial</database>" + output + "</project>\n";
+            xml = xml + thisproject;
+            try {
+                if (xmlbom.exists())
+                {
+                    SAXReader xmlReader = new SAXReader();
+                    Document antDoc = xmlReader.read(xmlbom);
+                    for (Iterator iterator = antDoc.selectNodes("//project").iterator(); iterator.hasNext();)
+                    {
+                        boolean equal = false;
+                        Element e = (Element) iterator.next();
+                        for (Iterator iterator2 = antDoc.selectNodes("//baseline").iterator(); iterator2.hasNext();)
+                        {
+                              Element e2 = (Element) iterator2.next();
+                              if (e2.getText().equals(getTask().getScmUrl()))
+                                  equal = true;
+                        }
+                        if (!equal)
+                            xml = xml + e.asXML() + "\n";
+                    }
+                }
+                xml = xml + "</content></bom>";
+                
+                FileWriter fstream = new FileWriter(xmlbom);
+                BufferedWriter out = new BufferedWriter(fstream);
+                out.write(xml);
+                out.close();
+            } catch (Exception e) { e.printStackTrace(); }
         }
         else
         {
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/InitAction.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/InitAction.java	Wed Dec 23 19:29:07 2009 +0200
@@ -24,7 +24,23 @@
 
 import com.nokia.maven.scm.provider.ScmProviderExt;
 
+/**
+ * Create a new repository. In the following example the new_repo mercurial repository 
+ * will be created under /some/path/. E.g:
+ * 
+ * <pre>
+ * &lt;hlm:scm verbose="true" scmUrl="scm:hg:/some/path/new_repo"&gt;
+ *     &lt;hlm:checkout baseDir="scm:hg:/some/path/new_repo" /&gt;
+ * &lt;/hlm:scm&gt;
+ * </pre>
+ * 
+ * @ant.type name="init" category="SCM"
+ */
 public class InitAction extends BaseDirectoryScmAction {
+    
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public void execute(ScmRepository repository) throws ScmException {
         ScmManager scmManager = getTask().getScmManager();
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/ScmAction.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/ScmAction.java	Wed Dec 23 19:29:07 2009 +0200
@@ -21,6 +21,14 @@
 import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.tools.ant.ProjectComponent;
 
+/**
+ * Abstract class which implements common setting between
+ * ScmAction implementations.
+ * 
+ * Any implementing action must implement the execute method as
+ * a execution of the action. The owning task should be used
+ * to log message to the user.  
+ */
 public abstract class ScmAction extends ProjectComponent {
     private ScmTask scmtask;
 
@@ -39,6 +47,10 @@
         this.scmtask = task;
     }
 
+    /**
+     * Get the action name based on the classname.
+     * @return the lowercase class name. 
+     */
     public String getName() {
         String className = getClass().getName();
         String commandName = className
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/StatusAction.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/StatusAction.java	Wed Dec 23 19:29:07 2009 +0200
@@ -36,7 +36,7 @@
  *       &lt;/fileset&gt;
  *    &lt;/hlm:status&gt;
  * &lt;/hlm:scm &gt;
- *
+ * </pre>
  * 
  * @ant.type name="status" category="SCM"
  */
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/TagsAction.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/taskdefs/TagsAction.java	Wed Dec 23 19:29:07 2009 +0200
@@ -29,14 +29,33 @@
 import com.nokia.maven.scm.command.tags.TagsScmResult;
 import com.nokia.maven.scm.manager.ExtendedScmManager;
 
+/**
+ * This action will tag current repository revision using a specific name.
+ * 
+ * <pre>
+ * &lt;hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1"&gt;
+ *     &lt;hlm:tags baseDir="${repo.dir}/test1" reference="my.tags" /&gt;
+ * &lt;/hlm:scm&gt;
+ * </pre>
+ *
+ * @ant.type name="tags" category="SCM"
+ */
 public class TagsAction extends BaseDirectoryScmAction {
 
     private String reference;
 
+    /**
+     * Defines the id of the result type generated by the query.
+     * @param reference the name of the reference to use.
+     * @ant.not-required Only log result by default.
+     */
     public void setReference(String reference) {
         this.reference = reference;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public void execute(ScmRepository repository) throws ScmException {
         TagsScmResult result;
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/LatestTag.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/LatestTag.java	Wed Dec 23 19:29:07 2009 +0200
@@ -28,19 +28,43 @@
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;
 
+/**
+ * The latestTag element will help you to find the latest revision based
+ * on a pattern.
+ * 
+ *  <pre>
+ *  &lt;latestTag name="1.0.*"&gt;
+ *     &lt;tagSet id="set.of.tags"/&gt;
+ *  latestTag
+ *  </pre>
+ * 
+ * @ant.type name="latestTag" category="SCM"
+ */
 public class LatestTag extends Tag {
 
     private String pattern;
     private List<TagSet> tagSets = new ArrayList<TagSet>();
     
+    /**
+     * Defines the pattern.
+     * @ant.required
+     */
     public void setPattern(String pattern) {
         this.pattern = pattern;
     }
     
+    /**
+     * Add a set of release to search the latest release in.
+     * @param tagSet
+     */
     public void add(TagSet tagSet) {
         tagSets.add(tagSet);
     }
 
+
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public String getName() {
         if (pattern == null)
@@ -56,6 +80,11 @@
         return tags.get(0).getName();
     }
 
+    /**
+     * Get a reduce set of tags, only tag matching the pattern will be
+     * included.
+     * @return the reduce list of tags.
+     */
     protected List<Tag> getCleanedList() {
         Pattern pVer = getPattern();
         List<Tag> tags = new ArrayList<Tag>();
@@ -67,6 +96,15 @@
         return tags;
     }
     
+    /**
+     * Get the pattern as a regular expression.
+     * '*' will be transformed into (\d+) (which means only numbers
+     *  will be considered). Other character will be quoted.
+     * For example:
+     * 1.0.* => 1\.0\.(\d+)
+     * 
+     * @return the transformed pattern.
+     */
     protected Pattern getPattern() {
         // Quoting the current pattern
         getProject().log("pattern: " + pattern, Project.MSG_DEBUG);
@@ -79,6 +117,10 @@
         return Pattern.compile(qVer);
     }
     
+    /**
+     * Get the list of tags, from the tagSets. 
+     * @return a list of Tags objects.
+     */
     protected List<Tag> getTags() {
         List<Tag> tags = new ArrayList<Tag>();
         for (TagSet ts : tagSets) {
@@ -92,15 +134,30 @@
         return tags;
     }
     
+    /**
+     * This class implements the comparator interface, which will help to
+     * order the tag compare to the pattern. For example:
+     * 1.0.2 > 1.0.1 (for pattern 1.0.*)
+     * 1.1.1 > 1.0.2 (for pattern 1.*.*)
+     *
+     * @param <T> A Tag kind of class.
+     */
     public class TagComparator<T extends Tag> implements Comparator<T> {
         
         // Pattern to match for the comparison
         private Pattern pVer;
         
+        /**
+         * Configure the Comparator with the pattern.
+         * @param pattern
+         */
         public TagComparator(Pattern pattern) {
             pVer = pattern;
         }
         
+        /**
+         * {@inheritDoc}
+         */
         @Override
         public int compare(T o1, T o2) {
             getProject().log("Comparing: " + o1.getName() + ">" + o2.getName(), Project.MSG_DEBUG);
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/Revision.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/Revision.java	Wed Dec 23 19:29:07 2009 +0200
@@ -20,6 +20,14 @@
 
 import org.apache.tools.ant.types.DataType;
 
+/**
+ * The revision element store a particular revision id. 
+
+ *  <pre>
+ *  &lt;revision name="release_1.0" /&gt;
+ *  </pre>
+ *
+ */
 public class Revision extends DataType {
 
     private String name;
@@ -35,6 +43,10 @@
         this.name = name;
     }
 
+    /**
+     * Get the revision.
+     * @return the revision.
+     */
     public String getName() {
         return name;
     }
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/Tag.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/Tag.java	Wed Dec 23 19:29:07 2009 +0200
@@ -20,6 +20,14 @@
 
 import org.apache.tools.ant.types.DataType;
 
+/**
+ * The tag type store the value of a desired SCM tag.
+ * 
+ *  <pre>
+ *  &lt;tag name="release_1.0" /&gt;
+ *  </pre>
+ *
+ */
 public class Tag extends DataType {
 
     private String name;
@@ -34,6 +42,10 @@
         this.name = name;
     }
 
+    /**
+     * Get the tag value.
+     * @return the tag value
+     */
     public String getName() {
         return name;
     }
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/TagSet.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/helium/scm/ant/types/TagSet.java	Wed Dec 23 19:29:07 2009 +0200
@@ -23,20 +23,45 @@
 
 import org.apache.tools.ant.types.DataType;
 
+/**
+ * This tagSet type is a container of tag elements.
+ * 
+ * Example:
+ *  <pre>
+ *  &lt;tagSet&gt;
+ *      &lt;tag name="release_1.0" /&gt;
+ *      &lt;tag name="release_1.0.1" /&gt;
+ *  &lt;7tagSet&gt;
+ *  </pre>
+ *  
+ * @ant.type name="tagSet" category="SCM"
+ */
 public class TagSet extends DataType {
 
     private List<Tag> tags = new ArrayList<Tag>();
     
+    /**
+     * Add a Tag element.
+     * @param tag
+     */
     public void add(Tag tag) {
         tags.add(tag);
     }
     
+    /**
+     * Create and add a Taf element.
+     * @return the newly created Tag.
+     */
     public Tag createTag() {
         Tag tag = new Tag();
         tags.add(tag);
         return tag;
     }
-    
+
+    /**
+     * Get the list of tags.
+     * @return the list of stored tag elements.
+     */
     public List<Tag> getTags() {
         return new ArrayList<Tag>(tags);
     }
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/init/InitScmResult.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/init/InitScmResult.java	Wed Dec 23 19:29:07 2009 +0200
@@ -20,7 +20,15 @@
 
 import org.apache.maven.scm.ScmResult;
 
+/**
+ * Class to store the result of the init command.  
+ *
+ */
 public class InitScmResult extends ScmResult {
+    
+    /**
+     * {@inheritDoc}
+     */
     public InitScmResult(String commandLine, String providerMessage,
             String commandOutput, boolean success) {
         super(commandLine, providerMessage, commandOutput, success);
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/pull/AbstractPullCommand.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/pull/AbstractPullCommand.java	Wed Dec 23 19:29:07 2009 +0200
@@ -28,16 +28,32 @@
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 
+/**
+ * Abstract class to representing a pull command.
+ * This functionality is mainly targeted for distributed 
+ * repository like Git or Mercurial.  
+ */
 public abstract class AbstractPullCommand extends AbstractCommand
 {
     
+    /**
+     * {@inheritDoc}
+     */
+    @Override
     public ScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet,
             CommandParameters parameters) throws ScmException
     {
         return executePullCommand(repository, fileSet, parameters.getScmVersion(CommandParameter.SCM_VERSION, new ScmTag("tip")));
     }
     
-    
+    /**
+     * Implements the pull functionality.
+     * @param repository the reporsitory.
+     * @param fileSet
+     * @param scmVersion what revision to pull.
+     * @return
+     * @throws ScmException
+     */
     protected abstract PullScmResult executePullCommand(ScmProviderRepository repository, ScmFileSet fileSet, ScmVersion scmVersion) throws ScmException;
 
 }
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/pull/PullScmResult.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/pull/PullScmResult.java	Wed Dec 23 19:29:07 2009 +0200
@@ -20,6 +20,10 @@
 
 import org.apache.maven.scm.ScmResult;
 
+/**
+ * 
+ *
+ */
 public class PullScmResult extends ScmResult
 {
     public PullScmResult( String commandLine, String providerMessage, String commandOutput, boolean success )
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/tags/AbstractTagsCommand.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/tags/AbstractTagsCommand.java	Wed Dec 23 19:29:07 2009 +0200
@@ -24,9 +24,16 @@
 import org.apache.maven.scm.command.AbstractCommand;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 
+/**
+ * Abstract class representing a tags command. 
+ * Tags consist in retrieving existing tags for a particular repository.
+ * 
+ */
 public abstract class AbstractTagsCommand extends AbstractCommand
 {
-    
+    /**
+     * {@inheritDoc} 
+     */
     public TagsScmResult executeCommand(ScmProviderRepository repository, ScmFileSet fileSet,
             CommandParameters parameters) throws ScmException
     {
@@ -34,6 +41,14 @@
     }
     
     
+    /**
+     * Execute the tags operation on the repository.
+     * @param repository the repository to use for the action
+     * @param fileSetCommand 
+     * @param parameters
+     * @return a TagsScmResult representing the output of the command.
+     * @throws ScmException
+     */
     protected abstract TagsScmResult executeTagsCommand(ScmProviderRepository repository, ScmFileSet fileSetCommand, CommandParameters parameters) throws ScmException;
 
 }
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/tags/TagsScmResult.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/command/tags/TagsScmResult.java	Wed Dec 23 19:29:07 2009 +0200
@@ -25,14 +25,33 @@
 import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmTag;
 
+/**
+ *  Class to store the result from the tags operation.
+ *
+ */
 public class TagsScmResult extends ScmResult {
     private List<ScmTag> scmVersions = new ArrayList<ScmTag>();
 
+    /**
+     * Default constructor.
+     * @param commandLine
+     * @param providerMessage
+     * @param commandOutput
+     * @param success
+     */
     public TagsScmResult(String commandLine, String providerMessage,
             String commandOutput, boolean success) {
         super(commandLine, providerMessage, commandOutput, success);
     }
 
+    /**
+     * This constructor stores also the ScmTag retrieved.
+     * @param commandLine
+     * @param providerMessage
+     * @param commandOutput
+     * @param success
+     * @param scmVersions
+     */
     public TagsScmResult(String commandLine, String providerMessage,
             String commandOutput, boolean success,
             Enumeration<ScmTag> scmVersions) {
@@ -43,6 +62,10 @@
         }
     }
 
+    /**
+     * Get the list of tags from the command.
+     * @return
+     */
     public List<ScmTag> getTags() {
         return scmVersions;
     }
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/manager/BasicExtendedScmManager.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/manager/BasicExtendedScmManager.java	Wed Dec 23 19:29:07 2009 +0200
@@ -31,9 +31,17 @@
 import com.nokia.maven.scm.command.info.InfoScmResult;
 import com.nokia.maven.scm.provider.ScmProviderExt;
 
+/**
+ * Extended SCM manager which implements the additional functionalities
+ * defined by the ExtendedScmManager.
+ *
+ */
 public class BasicExtendedScmManager extends BasicScmManager implements
         ExtendedScmManager {
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public PullScmResult pull(ScmRepository repository, File path)
             throws ScmException {
@@ -47,6 +55,9 @@
         }
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public TagsScmResult tags(ScmRepository repository, File path) throws ScmException {
         try {
@@ -59,6 +70,9 @@
         }
     }
     
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public InfoScmResult info(ScmRepository repository, File path) throws ScmException {
         try {
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/ScmProviderExt.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/ScmProviderExt.java	Wed Dec 23 19:29:07 2009 +0200
@@ -30,16 +30,50 @@
 import com.nokia.maven.scm.command.tags.TagsScmResult;
 import com.nokia.maven.scm.command.info.InfoScmResult;
 
+/**
+ * This interface describe additional functionalities provider could implement 
+ * compare to the default ScmProvider interface
+ *  
+ */
 public interface ScmProviderExt {
 
+    /**
+     * Create a new repository.
+     * @param repository the repository to create.
+     * @return ScmResult result.
+     * @throws ScmException
+     */
     ScmResult init(ScmRepository repository) throws ScmException;
 
+    /**
+     * Pull changes, this function is target for distributed SCM file Hg or Git.
+     * @param repository
+     * @param path the location of the checkout.
+     * @return a PullScmResult result object.
+     * @throws ScmException
+     */
     PullScmResult pull(ScmRepository repository, File path)
             throws ScmException;
 
+    /**
+     * Get a list of tags from a repository.
+     * @param repository the repository
+     * @param fileSet
+     * @param parameters
+     * @return a TagsScmResult with the list of tags if successful.
+     * @throws ScmException
+     */
     TagsScmResult tags(ScmRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException;
 
+    /**
+     * Get information about current revision.
+     * @param repository
+     * @param fileSet
+     * @param parameters
+     * @return a InfoScmResult with current revision if successful.
+     * @throws ScmException
+     */
     InfoScmResult info(ScmRepository repository, ScmFileSet fileSet, CommandParameters parameters)
             throws ScmException;
 }
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/init/HgInitCommand.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/init/HgInitCommand.java	Wed Dec 23 19:29:07 2009 +0200
@@ -30,7 +30,7 @@
 import org.apache.maven.scm.provider.ScmProviderRepository;
 import org.apache.maven.scm.provider.hg.HgUtils;
 import org.apache.maven.scm.provider.hg.command.HgCommandConstants;
-import org.apache.maven.scm.provider.hg.repository.HgScmProviderRepository;
+import com.nokia.maven.scm.provider.hg.repository.HgScmProviderRepository;
 
 import com.nokia.maven.scm.command.init.InitScmResult;
 
@@ -39,32 +39,36 @@
     private static Logger log = Logger.getLogger(HgInitCommand.class);
 
     @Override
-    protected ScmResult executeCommand(ScmProviderRepository arg0,
-            ScmFileSet arg1, CommandParameters arg2) throws ScmException {
-        // TODO Auto-generated method stub
-        return null;
+    protected ScmResult executeCommand(ScmProviderRepository repository,
+            ScmFileSet basedir, CommandParameters args) throws ScmException {
+        return executeInitCommand(repository);
     }
 
     public InitScmResult executeInitCommand(ScmProviderRepository repository)
             throws ScmException {
         // Get the directory in which to create a new repository. Only local
         // filesystems supported.
-        log.info("executeInitCommand" + repository);
+        log.info("executeInitCommand: " + repository);
         HgScmProviderRepository hgRepo = (HgScmProviderRepository) repository;
         String uri = hgRepo.getURI();
-        String fileUri = uri.substring("scm:hg:file:/".length());
-        log.info(fileUri);
-        File hgRepoDir = new File(fileUri);
+        log.info(uri);
+        File hgRepoDir = new File(uri);
+        File hgRepoRootDir = hgRepoDir.getParentFile();
 
-        boolean workingDirReady = hgRepoDir.mkdirs();
-        if (!workingDirReady) {
-            throw new ScmException("Could not initiate test branch at: "
-                    + hgRepoDir);
+        if (!hgRepoRootDir.exists()) {
+            boolean workingDirReady = hgRepoRootDir.mkdirs();
+            if (!workingDirReady) {
+                throw new ScmException("Could not initiate test branch at: "
+                        + hgRepoRootDir);
+            }
         }
 
         // Create and run the command
-        String[] initCmd = new String[] { HgCommandConstants.INIT_CMD };
-        HgUtils.execute(new File("f:/hg"), initCmd);
-        return null;
+        String[] initCmd = new String[] { HgCommandConstants.INIT_CMD, hgRepoDir.getName()};
+        ScmResult result = HgUtils.execute(hgRepoRootDir, initCmd);
+        return new InitScmResult(result.getCommandLine(),
+                result.getProviderMessage(),
+                result.getCommandOutput(),
+                result.isSuccess());
     }
 }
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/update/HgUpdateCommand.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/command/update/HgUpdateCommand.java	Wed Dec 23 19:29:07 2009 +0200
@@ -49,6 +49,9 @@
             ScmFileSet fileSet, ScmVersion tag) throws ScmException {
         File workingDir = fileSet.getBasedir();
 
+        // Find changes from last revision
+        int previousRevision = HgUtils.getCurrentRevisionNumber(getLogger(),
+                workingDir);
         // Update branch
         String[] updateCmd = new String[] {
                 "update",
@@ -65,30 +68,35 @@
         // Find changes from last revision
         int currentRevision = HgUtils.getCurrentRevisionNumber(getLogger(),
                 workingDir);
-        int previousRevision = currentRevision - 1;
-        String[] diffCmd = new String[] { HgCommandConstants.DIFF_CMD,
-                HgCommandConstants.REVISION_OPTION, "" + previousRevision };
+        List<ScmFile> updatedFiles = new ArrayList<ScmFile>();
+        List changes = new ArrayList();
+        String[] diffCmd = null;
+        if (currentRevision == 0) {
+            diffCmd = new String[] { HgCommandConstants.DIFF_CMD,
+                    "-c", "" + currentRevision};
+        } else {
+            diffCmd = new String[] { HgCommandConstants.DIFF_CMD,
+                    HgCommandConstants.REVISION_OPTION, "" + previousRevision,
+                    HgCommandConstants.REVISION_OPTION, "" + currentRevision};
+        }
         HgDiffConsumer diffConsumer = new HgDiffConsumer(getLogger(),
-                workingDir);
-        ScmResult diffResult = HgUtils.execute(diffConsumer, getLogger(),
+                    workingDir);
+        updateResult = HgUtils.execute(diffConsumer, getLogger(),
                 workingDir, diffCmd);
 
         // Now translate between diff and update file status
-        List<ScmFile> updatedFiles = new ArrayList<ScmFile>();
-        List changes = new ArrayList();
         List<ScmFile> diffFiles = diffConsumer.getChangedFiles();
         Map diffChanges = diffConsumer.getDifferences();
         for (ScmFile diffFile : diffFiles) {
             changes.add(diffChanges.get(diffFile.getPath()));
             if (diffFile.getStatus() == ScmFileStatus.MODIFIED) {
-                updatedFiles.add(new ScmFile(diffFile.getPath(),ScmFileStatus.PATCHED));
+                updatedFiles.add(new ScmFile(diffFile.getPath(), ScmFileStatus.PATCHED));
             } else {
                 updatedFiles.add(diffFile);
             }
         }
-
         return new UpdateScmResultWithRevision(updatedFiles, changes, String
-                .valueOf(currentRevision), diffResult);
+                .valueOf(currentRevision), updateResult);
     }
 
 }
--- a/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/repository/HgScmProviderRepository.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/src/com/nokia/maven/scm/provider/hg/repository/HgScmProviderRepository.java	Wed Dec 23 19:29:07 2009 +0200
@@ -70,9 +70,12 @@
 
     /** {@inheritDoc} */
     public String toString() {
-        return "Hg Repository Interpreted from: " + orgUrl + ":\nProtocol: "
+        if (orgUrl != null) {
+            return "Hg Repository Interpreted from: " + orgUrl + ":\nProtocol: "
                 + orgUrl.getProtocol() + "\nHost: " + getHost() + "\nPort: "
                 + getPort() + "\nUsername: " + getUser() + "\nPassword: "
                 + getPassword() + "\nPath: " + orgUrl.getPath();
+        }
+        return "Hg Repository Interpreted from: " + url;
     }
 }
--- a/buildframework/helium/external/helium-antlib/scm/tests/abstract_unittest_scmtask.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/tests/abstract_unittest_scmtask.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -279,6 +279,15 @@
         </hlm:scm>
     </target>
 
+    <target name="test-update-empty-repo">
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/new">
+            <hlm:init />
+        </hlm:scm>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/new">
+            <hlm:update basedir="${repo.dir}/new" />
+        </hlm:scm>
+    </target>
+        
     <target name="test-update-basedir-tag" depends="test-checkin">
         <echo file="${repo.dir}/test1/not_in_repo2.txt">Not in repo2</echo>
         <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
@@ -511,6 +520,11 @@
         </hlm:scm>
         <au:assertLogContains text="revision:1:" />
         <au:assertLogContains text="revision:2:" />
+        
+        <hlm:scm verbose="false" scmUrl="scm:hg:${repo.dir}/changelog">
+            <hlm:changelog basedir="${repo.dir}/changelog" xmlbom="${repo.dir}/bom.xml"/>
+        </hlm:scm>
+        <au:assertFileExists file="${repo.dir}/bom.xml" />
     </target>
     
     <!--
@@ -619,4 +633,64 @@
         </au:expectfailure>
     </target>
 
+    
+    <!--
+     **************************************************************
+     ** Init
+     **************************************************************
+     -->
+    <target name="test-init">
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/new">
+            <hlm:init />
+        </hlm:scm>
+        <au:assertFileExists file="${repo.dir}/new" />
+    </target>
+
+    
+    <!--
+     **************************************************************
+     ** Pull
+     **************************************************************
+     -->
+    <target name="test-pull">
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:checkout baseDir="${repo.dir}/pull" />
+        </hlm:scm>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:tag baseDir="${repo.dir}/test1" name="tag_0.2" />
+        </hlm:scm>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/pull">
+            <hlm:pull baseDir="${repo.dir}/pull" />
+            <hlm:changelog baseDir="${repo.dir}/pull" numDays="1" />
+        </hlm:scm>
+        <au:assertLogContains text="files:.hgtags" />
+        <au:assertLogContains text="description:[maven-scm] copy for tag tag_0.2" />
+    </target>
+    
+    <!--
+     **************************************************************
+     ** Tags
+     **************************************************************
+     -->
+    <target name="test-tags">
+        <echo file="${repo.dir}/test1/content.txt">content...</echo>
+        <hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
+            <hlm:add>
+                <fileset dir="${repo.dir}/test1">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:add>
+            <hlm:checkin message="Adding files .....">
+                <fileset dir="${repo.dir}/test1">
+                    <include name="*.txt" />
+                </fileset>
+            </hlm:checkin>            
+            <hlm:tag baseDir="${repo.dir}/test1" name="tag_0.1" />
+            <hlm:tags baseDir="${repo.dir}/test1" />
+        </hlm:scm>
+        <au:assertLogContains text=" * tag_0.1" />
+        <au:assertLogContains text=" * tip" />
+    </target>
+    
+    
 </project>
--- a/buildframework/helium/external/helium-antlib/scm/tests/build.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/scm/tests/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -23,15 +23,13 @@
 <project name="helium-antlib-unittest" xmlns:au="antlib:org.apache.ant.antunit">
     <description>Helium Antlib SCM unittests.</description>
 
-    <taskdef resource="org/apache/ant/antunit/antlib.xml" uri="org.apache.ant.antunit" />
+    
+    <import file="../../test-macros.ant.xml" />
 
     <target name="unittest" depends="unittest-scm" />
 
     <target name="unittest-scm">
-        <au:antunit>
-            <fileset dir="." includes="**/test_*.ant.xml" />
-            <au:plainlistener />
-        </au:antunit>
+        <antunitModule name="scm" />
     </target>
 
 </project>
--- a/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/Notifier.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/Notifier.java	Wed Dec 23 19:29:07 2009 +0200
@@ -38,11 +38,13 @@
     /**
      * Sends the data to the requested sender list with specified notifier
      * 
-     * @param senderList
-     *            sends the data to the list of requested user.
+     * @param signalName is the name of the signal that has been raised.
+     * @param failStatus indicates whether to fail the build or not
+     * @param notifierInput contains signal notifier info
+     * @param message is the message from the signal that has been raised.           
      */
     void sendData(String signalName, boolean failStatus,
-            NotifierInput notifierInput);
+            NotifierInput notifierInput, String message );
 
     /**
      * Sends the data to the requested sender list with specified notifier
--- a/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/SignalStatusList.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/SignalStatusList.java	Wed Dec 23 19:29:07 2009 +0200
@@ -69,7 +69,7 @@
             statusBuffer.append(signalStatus);
             statusBuffer.append("\n");
         }
-        log.debug("SignalStatusList:getErrorMsg:msg:" + statusBuffer.toString());
+        log.debug("getErrorMsg:msg:" + statusBuffer.toString());
         return statusBuffer.toString();
     }
 
@@ -79,7 +79,7 @@
      * @return true if any signal are pending.
      */
     public boolean hasSignalInList() {
-        log.debug("SignalStatusList:hasDeferMsgInList:size:"
+        log.debug("asDeferMsgInList:size:"
                 + signals.size());
         return signals.size() > 0;
     }
@@ -88,10 +88,10 @@
      * Clear all deferred signals.
      */
     public void clearStatusList() {
-        log.debug("SignalStatusList:clearStatusList:size1:"
+        log.debug("clearStatusList:size1:"
                 + signals.size());
         signals.clear();
-        log.debug("SignalStatusList:clearStatusList:size2:"
+        log.debug("clearStatusList:size2:"
                 + signals.size());
     }
     
--- a/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/SignalList.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/SignalList.java	Wed Dec 23 19:29:07 2009 +0200
@@ -147,8 +147,8 @@
         return targetsMap.get(targetName);
     }
 
-    protected void sendNotifications(Vector<Notifier> notifierList, String signalName) {
-        sendNotifications(notifierList, signalName, false, null);
+    protected void sendNotifications(Vector<Notifier> notifierList, String signalName, String errorMessage ) {
+        sendNotifications( notifierList, signalName, false, null, errorMessage );
     }
 
     public void processForSignal(Project prj, SignalNotifierInput signalNotifierInput, String signalName, String targetName, 
@@ -165,7 +165,7 @@
         }
         NotifierInput notifierInput = signalNotifierInput.getNotifierInput();
         sendNotifications(notifierList, signalName, failBuild,
-                notifierInput);
+                notifierInput, errorMessage );
         if (failBuild) {
             String failStatus = "now";
             if (signalInput != null) {
@@ -174,17 +174,17 @@
                 log.debug("Could not find config for signal: " + signalName);
             }
             if (failStatus == null || failStatus.equals("now")) {
+                log.debug("Adding now signal. Signal name is " + signalName);
                 SignalStatusList.getNowSignalList().addSignalStatus(new SignalStatus(signalName,
                         errorMessage, targetName, new Date()));
                 throw new BuildException(new SignalStatus(signalName,
                         errorMessage, targetName, new Date()).toString());
             } else if (failStatus.equals("defer")) {
-                log.debug("SignalList:adding defer signal:");
-                log.info("Signal " + signalName + " will be deferred.");
+                log.debug("Adding deffer signal. Signal " + signalName + " will be deferred.");
                 SignalStatusList.getDeferredSignalList().addSignalStatus(new SignalStatus(
                         signalName, errorMessage, targetName, new Date()));
             } else if (failStatus.equals("never")) {
-                log.debug("SignalList:adding never signal:");
+                log.debug("Adding never signal. Signal name is " + signalName);
                 SignalStatusList.getNeverSignalList().addSignalStatus(new SignalStatus(signalName,
                         errorMessage, targetName, new Date()));
             } else if (!failStatus.equals("never")) {
@@ -204,13 +204,13 @@
      * @param notifierList
      */
     protected void sendNotifications(Vector<Notifier> notifierList, String signalName,
-            boolean failStatus, NotifierInput notifierInput) {
+            boolean failStatus, NotifierInput notifierInput, String errorMessage ) {
         if (notifierList == null) {
             return;
         }
         for (Notifier notifier : notifierList) {
             if (notifier != null) {
-                notifier.sendData(signalName, failStatus, notifierInput);
+                notifier.sendData(signalName, failStatus, notifierInput, errorMessage );
             }
         }
     }
@@ -241,7 +241,7 @@
                 }
                 processForSignal(prj, config.getSignalNotifierInput(), signalName, 
                         targetName, errorMessage, condition != null);
-                log.debug("SignalList:fail:signalName: " + signalName);
+                log.debug("checkAndNotifyFailure: SignalName: " + signalName);
             }
         }
         return retValue;
@@ -251,7 +251,7 @@
         Condition retCondition = null;
         Vector<Condition> conditionList = targetCondition.getConditions();
         for (Condition condition : conditionList) {
-            log.debug("SignalList:getErrorMessage:" + condition.eval());
+            log.debug("getFailureCondition:" + condition.eval());
             if (condition.eval()) {
                 retCondition = condition;
                 break;
@@ -346,17 +346,17 @@
         }
         log.debug("failStatus: " + failStatus);
         if (failStatus == null || failStatus.equals("now")) {
+            log.debug("Adding now signal. Signal name is " + signalName);
             SignalStatusList.getNowSignalList().addSignalStatus(new SignalStatus(signalName,
                     errorMessage, targetName, new Date()));
             throw new BuildException(new SignalStatus(signalName,
                     errorMessage, targetName, new Date()).toString());
         } else if (failStatus.equals("defer")) {
-            log.debug("SignalList1:adding defer signal:");
-            log.info("Signal " + signalName + " will be deferred.");
+            log.debug("Adding deffer signal. Signal name is " + signalName);
             SignalStatusList.getDeferredSignalList().addSignalStatus(new SignalStatus(
                     signalName, errorMessage, targetName, new Date()));
         } else if (failStatus.equals("never")) {
-            log.debug("SignalList1:adding never signal:");
+            log.debug("Adding never signal. Signal name is " + signalName);
             SignalStatusList.getNeverSignalList().addSignalStatus(new SignalStatus(signalName,
                     errorMessage, targetName, new Date()));
         } else if (!failStatus.equals("never")) {
@@ -365,7 +365,7 @@
             throw new BuildException(new SignalStatus(signalName,
                     errorMessage, targetName, new Date()).toString());
         } else {
-            log.info("Signal " + signalName
+            log.debug("Signal " + signalName
                     + " set to be ignored by the configuration.");
         }
     }
@@ -396,7 +396,7 @@
                     if (configCurrent != null && configCurrent instanceof SignalConfig) {
                         signalName = refid;
                     }
-                    log.debug("SignalList:fail:signalName: " + signalName);
+                    log.debug("checkAndNotify:signalName: " + signalName);
                     notifierList = config.getSignalInput().getSignalNotifierList();
                     if (notifierList == null) {
                         Object obj = (Object) prj
@@ -407,24 +407,24 @@
                         }
                     }
                     failStatus = config.getSignalInput().getFailBuild();
-                    log.debug("SignalList:failStatus:" + failStatus);
+                    log.debug("checkAndNotify:failStatus:" + failStatus);
                     buildFailed = condition != null;
                     sendNotify(notifierList, signalName, buildFailed,
                             fileList);
                 }
                 if (buildFailed) {
                     if (failStatus == null || failStatus.equals("now")) {
+                        log.debug("Adding now signal. Signal name is " + signalName);
                         SignalStatusList.getNowSignalList().addSignalStatus(new SignalStatus(signalName,
                                 errorMessage, targetName, new Date()));
                         throw new BuildException(new SignalStatus(signalName,
                                 errorMessage, targetName, new Date()).toString());
                     } else if (failStatus.equals("defer")) {
-                        log.debug("SignalList1:adding defer signal:");
-                        log.info("Signal " + signalName + " will be deferred.");
+                        log.debug("Signal " + signalName + " will be deferred.");
                         SignalStatusList.getDeferredSignalList().addSignalStatus(new SignalStatus(
                                 signalName, errorMessage, targetName, new Date()));
                     } else if (failStatus.equals("never")) {
-                        log.debug("SignalList1:adding never signal:");
+                        log.debug("Adding never signal. Signal name is " + signalName);
                         SignalStatusList.getNeverSignalList().addSignalStatus(new SignalStatus(signalName,
                                 errorMessage, targetName, new Date()));
                     } else if (!failStatus.equals("never")) {
@@ -433,7 +433,7 @@
                         throw new BuildException(new SignalStatus(signalName,
                                 errorMessage, targetName, new Date()).toString());
                     } else {
-                        log.info("Signal " + signalName
+                        log.debug("Signal " + signalName
                                 + " set to be ignored by the configuration.");
                     }
                 }
--- a/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/SignalListener.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/SignalListener.java	Wed Dec 23 19:29:07 2009 +0200
@@ -88,8 +88,7 @@
             signalList.checkAndNotifyFailure(event.getTarget(),event.getProject());
             //}
         } catch (Exception e) {
-            log.debug("SignalListenerException: ", e);
-            throw new BuildException(e.getMessage());
+            throw new BuildException(e.getMessage(), e);
         }
     }
 
--- a/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/EMAILNotifier.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/EMAILNotifier.java	Wed Dec 23 19:29:07 2009 +0200
@@ -151,13 +151,15 @@
     /**
      * Rendering the template, and sending the result through email.
      * 
-     * @param signalName
-     *            - Name of the signal that has been raised.
+     * @param signalName - is the name of the signal that has been raised.
+     * @param failStatus - indicates whether to fail the build or not
+     * @param notifierInput - contains signal notifier info
+     * @param message - is the message from the signal that has been raised. 
      */
 
     @SuppressWarnings("unchecked")
     public void sendData(String signalName, boolean failStatus,
-            NotifierInput notifierInput) {
+            NotifierInput notifierInput, String message ) {
         if (notifyWhen != null
                 && (notifyWhen.equals("always") || (notifyWhen.equals("fail") && failStatus)
                         || (notifyWhen.equals("pass") && !failStatus))) {
@@ -175,36 +177,43 @@
                 throw new HlmAntLibException(SignalListener.MODULE_NAME,
                         "ldap attribute has not been defined.");
             }
+            
+            String smtpUpdated = getProject().replaceProperties(smtp);
+            String ldapUpdated = getProject().replaceProperties(ldap);
+            String rootdnUpdated = getProject().replaceProperties(rootdn);
+            String additionalRecipientsUpdated = getProject().replaceProperties(additionalRecipients);
+
             log.debug("Sending data by e-mail.");
                 EmailDataSender emailSender;
-                if (rootdn != null)
+                if (rootdnUpdated != null)
                 {
                     String[] to = null;
-                    if (additionalRecipients != null)
+                    if (additionalRecipientsUpdated != null)
                     {
-                        to = additionalRecipients.split(",");
+                        to = additionalRecipientsUpdated.split(",");
                     }
-                    emailSender = new EmailDataSender(to, smtp, ldap, rootdn);
+                    emailSender = new EmailDataSender(to, smtpUpdated, ldapUpdated, rootdnUpdated);
                 }
                 else
                 {
                     emailSender = new EmailDataSender(
-                        additionalRecipients, smtp, ldap);
+                        additionalRecipientsUpdated, smtpUpdated, ldapUpdated);
                 }
                 if (from != null)
                 {
                     emailSender.setFrom(from);
                 }
-                log.debug("EmailNotifier:arlist: " + additionalRecipients);
+                log.debug("EmailNotifier:arlist: " + additionalRecipientsUpdated);
                 Project subProject = getProject().createSubProject();
                 subProject.setProperty("signal.name", signalName);
                 subProject.setProperty("signal.status", "" + failStatus);
+                subProject.setProperty("signal.message", "" + message);
                 
                 emailSender.addCurrentUserToAddressList();
                 String filePath = "";
                 File fileToSend = null;
                 if (notifierInput != null) {
-                    fileToSend = notifierInput.getFile(".html");
+                    fileToSend = notifierInput.getFile(".*.html");
                     if (fileToSend != null) {
                         filePath = fileToSend.toString();
                     }
@@ -224,6 +233,7 @@
                         Hashtable<String, String> signalProperties = new Hashtable<String, String>();
                         signalProperties.put("signal.name", signalName);
                         signalProperties.put("signal.status", "" + failStatus);
+                        signalProperties.put("signal.message", "" + message);
                         sourceList.add(new PropertiesSource("signaling",
                                 signalProperties));
 
@@ -319,4 +329,4 @@
         this.rootdn = rootdn;
     }
 
-}
\ No newline at end of file
+}
--- a/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/ExecuteTaskNotifier.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/ExecuteTaskNotifier.java	Wed Dec 23 19:29:07 2009 +0200
@@ -19,15 +19,17 @@
 package com.nokia.helium.signal.ant.types;
 
 import java.util.ArrayList;
+import java.util.List;
 import java.util.Vector;
-import java.util.List;
+
 import org.apache.log4j.Logger;
 import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.BuildListener;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.Task;
-import org.apache.tools.ant.BuildListener;
 import org.apache.tools.ant.TaskContainer;
 import org.apache.tools.ant.types.DataType;
+
 import com.nokia.helium.signal.Notifier;
 
 /**
@@ -57,9 +59,17 @@
     private Logger log = Logger.getLogger(ExecuteTaskNotifier.class);
     private List<Task> tasks = new ArrayList<Task>();
 
+    /**
+     * Method executes a series of given tasks on raising of the specified signal.
+     * 
+     * @param signalName is the name of the signal that has been raised.
+     * @param failStatus indicates whether to fail the build or not
+     * @param notifierInput contains signal notifier info
+     * @param message is the message from the signal that has been raised.           
+     */
     @SuppressWarnings("unchecked")
     public void sendData(String signalName, boolean failStatus,
-            NotifierInput notifierInput) {
+            NotifierInput notifierInput, String message ) {
         try {
             // Configure the project
             Project prj = getProject().createSubProject();
@@ -73,6 +83,7 @@
             
             prj.setProperty("signal.name", signalName);
             prj.setProperty("signal.status", "" + failStatus);
+            prj.setProperty("signal.message", message );
             // Converting the list of inputs into a string.
             String inputs = "";
             if (notifierInput != null) {
@@ -85,7 +96,8 @@
                 task.perform();
             }
         } catch (BuildException e) {
-            log.debug(e);
+            // We are Ignoring the errors as no need to fail the build.
+            log.debug(e.toString(), e);
         }
     }
 
--- a/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/LogSourceList.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/LogSourceList.java	Wed Dec 23 19:29:07 2009 +0200
@@ -20,9 +20,7 @@
 
 import org.apache.tools.ant.types.DataType;
 import com.nokia.helium.core.LogSource;
-
-import com.nokia.helium.core.HlmAntLibException;
-import com.nokia.helium.signal.ant.SignalListener;
+import org.apache.tools.ant.BuildException;
 
 import java.util.Vector;
 
@@ -67,7 +65,7 @@
      */
     public Vector<LogSource> getLogSourceList() {
         if (sourceList.isEmpty()) {
-            throw new HlmAntLibException(SignalListener.MODULE_NAME, "notifierlist is empty.");
+            throw new BuildException("Signal notifierlist is empty.");
         }
         return sourceList;
     }
--- a/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/NotifierInput.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/NotifierInput.java	Wed Dec 23 19:29:07 2009 +0200
@@ -20,6 +20,8 @@
 
 
 import java.io.File;
+import java.util.List;
+import java.util.ArrayList;
 import java.util.Vector;
 import org.apache.tools.ant.types.DataType;
 import org.apache.tools.ant.types.FileSet;
@@ -55,29 +57,50 @@
     }
     
     /**
-     * Updates the list of filelist from the input fileset.
-     *  @param fileSetList input fileset list
+     * Return a file from the input fileset.
+     *  @param pattern pattern to match from the input fileset
      *  @return the matched files including the base dir. 
      */
     public File getFile(String pattern) {
+        File fileToReturn = null;
         if (file != null) {
-            return file;
+            if (file.toString().matches(pattern)) {
+                fileToReturn = file;
+            }
+            return fileToReturn;
         }
-        File fileFromList = null;
         for (FileSet fs : fileSetList) {
             DirectoryScanner ds = fs.getDirectoryScanner(getProject());
             String[] includedFiles = ds.getIncludedFiles();
             for ( String filePath : includedFiles ) {
                 if (filePath.matches(pattern)) {
-                    fileFromList = new File(ds.getBasedir(), filePath);
-                    log.debug("matched file for pattern: " + pattern + ":" + fileFromList);
+                    fileToReturn = new File(ds.getBasedir(), filePath);
+                    log.debug("matched file for pattern: " + pattern + ":" + fileToReturn);
                     break;
                 }
             }
         }
-        return fileFromList;
+        return fileToReturn;
     }
 
+    /**
+     * Returns the list of filelist from the input fileset.
+     *  @param pattern pattern to match from the input fileset
+     *  @return the matched files including the base dir. 
+     */
+    public List<File> getFileList(String pattern) {
+        List<File> fileList = new ArrayList<File>();
+        for (FileSet fs : fileSetList) {
+            DirectoryScanner ds = fs.getDirectoryScanner(getProject());
+            String[] includedFiles = ds.getIncludedFiles();
+            for ( String filePath : includedFiles ) {
+                if (filePath.matches(pattern)) {
+                    fileList.add(new File(ds.getBasedir(), filePath));
+                }
+            }
+        }
+        return fileList;
+    }
 
     /**
      * Helper function called by ant to set the input file.
--- a/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SMSNotifier.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SMSNotifier.java	Wed Dec 23 19:29:07 2009 +0200
@@ -29,10 +29,14 @@
     }
     /**
      * Sends the data to the requested sender list with specified notifier
-     * @param senderList sends the data to the list of requested user.
+     * 
+     * @param signalName is the name of the signal that has been raised.
+     * @param failStatus indicates whether to fail the build or not
+     * @param notifierInput contains signal notifier info
+     * @param message is the message from the signal that has been raised.           
      */
     public void sendData(String signalName, boolean failStatus,
-            NotifierInput notifierInput) {
+            NotifierInput notifierInput, String message ) {
     }
 
     /**
--- a/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalConfig.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalConfig.java	Wed Dec 23 19:29:07 2009 +0200
@@ -48,6 +48,8 @@
 public class SignalConfig extends DataType
 {
    
+    private static boolean warningPrinted;
+    
     private Vector<ReferenceType> signalInputListRef = new Vector<ReferenceType>();
     private HashMap<String, TargetCondition> targetConditionsMap = new HashMap<String, TargetCondition>();
     private Vector<TargetCondition> targetConditions = new Vector<TargetCondition>();
@@ -55,15 +57,19 @@
     private Vector<LogSourceList> sourceList = new Vector<LogSourceList>();
     
     private String configID;
-
+    
+   
     
     /**
      * {@inheritDoc}
      */
     public void setProject(Project project) {
         super.setProject(project);
-        getProject().log("signalConfig element is now deprecated. Please consider moving to signalListenerConfig element or" + 
+        if (!warningPrinted) {
+            getProject().log("signalConfig element is now deprecated. Please consider moving to signalListenerConfig element or" + 
                 " signal task nested element.", Project.MSG_WARN);
+            warningPrinted = true;
+        }
     }
     
     /**
--- a/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalExceptionHandler.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalExceptionHandler.java	Wed Dec 23 19:29:07 2009 +0200
@@ -17,9 +17,8 @@
 
  
 package com.nokia.helium.signal.ant.types;
-
+import net.sf.antcontrib.logic.RunTargetTask;
 import org.apache.tools.ant.Project;
-import org.apache.tools.ant.types.Reference;
 import com.nokia.helium.core.ant.HlmExceptionHandler;
 import com.nokia.helium.signal.ant.taskdefs.*;
 import com.nokia.helium.signal.ant.SignalListener;
@@ -38,19 +37,12 @@
      * @throws BuildException
      */
     public void handleException(Project project, String module, Exception e) {
-        log.debug("SignalExceptionHandler:handleException: start");
-        String refId = project.getProperty("signals.buildexception.signalinput");
-        if (refId != null) {
-            Signal signal = new Signal();
-            SignalNotifierInput signalNotifierInput = new SignalNotifierInput(); 
-            signal.add(signalNotifierInput);
-            Reference ref = new Reference(project, refId);
-            SignalInput signalInput = signalNotifierInput.createSignalInput();
-            signalInput.setRefid(ref);
-            signal.setProject(project);
-            signal.setName("buildExceptionSignal");
-            signal.setMessage(e.getMessage());
-            signal.execute();
+        String exceptionTarget = project.getProperty("exceptions.target");
+        if (exceptionTarget != null) {
+            RunTargetTask runTargetTask = new RunTargetTask();
+            runTargetTask.setProject(project);
+            runTargetTask.setTarget(exceptionTarget);
+            runTargetTask.execute();
         }
-    }
+   }
 }
\ No newline at end of file
--- a/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalInput.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalInput.java	Wed Dec 23 19:29:07 2009 +0200
@@ -22,13 +22,12 @@
 import java.util.Vector;
 
 import org.apache.tools.ant.types.DataType;
-
-import com.nokia.helium.core.HlmAntLibException;
 import com.nokia.helium.core.ant.types.ReferenceType;
 import org.apache.log4j.Logger;
 
 import com.nokia.helium.signal.Notifier;
-import com.nokia.helium.signal.ant.SignalListener;
+
+import org.apache.tools.ant.BuildException;
 
 /**
  * SignalInput class which is a type to store input for signals
@@ -131,6 +130,6 @@
             }
             return notifierList;
         }
-        throw new HlmAntLibException(SignalListener.MODULE_NAME, "No notifierlist reference");
+        throw new BuildException("No signal notifierlist reference defined.");
     }    
 }
\ No newline at end of file
--- a/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalNotifierInput.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalNotifierInput.java	Wed Dec 23 19:29:07 2009 +0200
@@ -23,8 +23,6 @@
 
 import org.apache.tools.ant.types.DataType;
 
-import org.apache.log4j.Logger;
-
 import org.apache.tools.ant.BuildException;
 
 
@@ -42,8 +40,6 @@
 
     private Vector<NotifierInput> notifierInputList = new Vector<NotifierInput>();
 
-    private Logger log = Logger.getLogger(SignalInput.class);
-
     /**
      * Helper function called by ant to create a new notifier for
      * this input.
--- a/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalNotifierList.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalNotifierList.java	Wed Dec 23 19:29:07 2009 +0200
@@ -19,10 +19,9 @@
 package com.nokia.helium.signal.ant.types;
 
 import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.BuildException;
+import com.nokia.helium.signal.Notifier;
 
-import com.nokia.helium.core.HlmAntLibException;
-import com.nokia.helium.signal.Notifier;
-import com.nokia.helium.signal.ant.SignalListener;
 
 import java.util.Vector;
 
@@ -59,7 +58,7 @@
      */
     public Vector<Notifier> getNotifierList() {
         if (notifierlist.isEmpty()) {
-            throw new HlmAntLibException(SignalListener.MODULE_NAME, "notifierlist is empty.");
+            throw new BuildException(" Signal notifierlist is empty.");
         }
         return notifierlist;
     }
--- a/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalStatusDef.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/src/com/nokia/helium/signal/ant/types/SignalStatusDef.java	Wed Dec 23 19:29:07 2009 +0200
@@ -38,9 +38,7 @@
      * @throws BuildException
      */
     public void execute(Project prj, String module, String[] targetNames) {
-        log.debug("SignalStatusDef:execute:");
         if (SignalStatusList.getDeferredSignalList().hasSignalInList()) {
-            log.debug("SignalStatusDef:execute: Error message: " + SignalStatusList.getDeferredSignalList().getErrorMsg());
             throw new BuildException(SignalStatusList.getDeferredSignalList().getErrorMsg());
         }
     }
--- a/buildframework/helium/external/helium-antlib/signaling/tests/build.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/tests/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -22,16 +22,14 @@
 -->
 <project name="helium-antlib-signaling-unittest" xmlns:au="antlib:org.apache.ant.antunit">
     <description>Helium Antlib signaling tests.</description>
+    <import file="../../test-macros.ant.xml" />
 
     <property environment="env" />
     <dirname property="signaling.test.project.dir" file="${ant.file.helium-antlib-signaling-unittest}" />
     <property name="build.summary.file" location="${signaling.test.project.dir}/test_signal/data/ido_tedo_mcl_devlon52_ec_MCL.52.105_summary.log.xml" />
     <property name="build.id" value="test_new_hlm"/>
   
-    <property name="signaling.config.file" value="${signaling.test.project.dir}/test_signal/test_signaling_config.ant.xml" />
-    <property name="signaling.config.file" value="${signaling.test.project.dir}/test_signal/test_signaling_config.ant.xml" />
-
-    <import file="${signaling.test.project.dir}/test_signal/test_signaling.ant.xml" />
+    <import file="${signaling.test.project.dir}/test_signal/signaling_test.ant.xml" />
     
     <target name="unittest" depends="unittest-signaling,unittest-signaling-antunit" />
 
@@ -40,13 +38,7 @@
     </target>
 
     <target name="unittest-signaling-antunit">
-        <au:antunit>
-            <au:plainlistener />
-            <fileset dir=".">
-                <include name="**/test_*.ant.xml" />
-                <exclude name="**/test_signaling.ant.xml" />
-            </fileset>
-        </au:antunit>
+        <antunitModule name="signaling" />
     </target>
 
 </project>
--- a/buildframework/helium/external/helium-antlib/signaling/tests/src/com/nokia/helium/signaling/tests/TestEmailSender.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/tests/src/com/nokia/helium/signaling/tests/TestEmailSender.java	Wed Dec 23 19:29:07 2009 +0200
@@ -49,7 +49,7 @@
         en.setLdap("test");
         NotifierInput input = new NotifierInput();
         input.setFile(new File(System.getProperty("testdir") + "/tests/test_signal/data/test.log_status.html"));
-        en.sendData("test", true, input);
+        en.sendData("test", true, input, "Test Message");
     }
 
    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/signaling/tests/test_signal/signaling_test.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,272 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : test_signaling.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-signaling" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Test all the helium signals
+    </description>
+
+    <dirname property="project.dir.signaling" file="${ant.file.test-signaling}" />
+
+    <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+    <import file="test_signaling_config.ant.xml" />
+
+    <property name="build.summary.file" location="${project.dir.signaling}/data/ido_tedo_mcl_devlon52_ec_MCL.52.105_summary.log.xml" />
+
+    <target name="target-valid-config1">
+        <echo message="valid configuration1" />
+    </target>
+
+    <target name="target-valid-config2">
+        <echo message="valid configuration2" />
+    </target>
+
+    <target name="target-valid-config3">
+        <echo message="valid configuration3" />
+    </target>
+
+    <target name="target-valid-config4">
+        <echo message="valid configuration4" />
+    </target>
+
+    <target name="target-valid-config5">
+        <echo message="valid configuration5" />
+    </target>
+
+    <target name="target-invalid-config1">
+        <echo message="invalid configuration1" />
+    </target>
+
+    <target name="target-invalid-config2">
+        <echo message="invalid configuration2" />
+    </target>
+
+    <target name="target-invalid-config3">
+        <echo message="invalid configuration3" />
+    </target>
+
+    <target name="target-invalid-config4">
+        <echo message="invalid configuration4" />
+    </target>
+
+    <target name="target-invalid-config5">
+        <echo message="invalid configuration5" />
+    </target>
+
+    <target name="target-invalid-config6">
+        <echo message="invalid configuration6" />
+    </target>
+
+    <target name="target-invalid-config7">
+        <echo message="invalid configuration7" />
+    </target>
+
+    <target name="target-invalid-config8">
+        <echo message="invalid configuration8" />
+    </target>
+
+    <target name="target-invalid-config9">
+        <echo message="invalid configuration9" />
+    </target>
+
+    <target name="test-case1">
+        <echo message="testing config without signal input" />
+        <antcall target="target-valid-config1" inheritRefs="true"/>
+    </target>
+
+    <target name="test-case2">
+        <echo message="testing config without signal input" />
+        <antcall target="target-valid-config2" inheritRefs="true" />
+    </target>
+
+    <target name="test-case3">
+        <echo message="testing config without signal input" />
+        <antcall target="target-valid-config3" inheritRefs="true" />
+    </target>
+
+    <target name="test-case4">
+        <echo message="testing config without signal input" />
+        <antcall target="target-valid-config4" inheritRefs="true" />
+    </target>
+
+    <target name="test-case5">
+        <echo message="testing config without signal input" />
+        <antcall target="target-valid-config5" inheritRefs="true" />
+    </target>
+
+    <target name="test-case6">
+        <echo message="testing config without signal input" />
+        <au:expectfailure>
+            <antcall target="target-invalid-config1" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-case7">
+        <echo message="testing when the named target is not exists, so signal" />
+        <antcall target="target-invalid-config2" inheritRefs="true" />
+    </target>
+
+    <target name="test-case8">
+        <!-- This test case is not valid anymore, now the attribute validation is done 
+    	     at Ant parsing level -->
+        <!--echo message="testing config without signal input" />
+        <au:expectfailure>
+            <antcall target="target-invalid-config3" inheritRefs="true" />
+        </au:expectfailure-->
+    </target>
+
+    <target name="test-case9">
+        <echo message="testing config without signal input" />
+        <au:expectfailure>
+            <antcall target="target-invalid-config4" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-case10">
+        <echo message="testing config without signal input" />
+        <au:expectfailure>
+            <antcall target="target-invalid-config5" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-case11">
+        <echo message="testing config without signal input" />
+        <au:expectfailure>
+            <antcall target="target-invalid-config6" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-signal-exception">
+        <property name="exceptions.target" value="final-exception-target"/>
+        <echo message="signal exception target" />
+        <fail message="fail for signal exception" />
+    </target>
+
+    <target name="final-exception-target">
+        <echo message="final-exception-target executed" />
+    </target>
+    
+    <target name="test-case12">
+        <echo message="testing config without signal input" />
+        <au:expectfailure>
+            <antcall target="target-invalid-config7" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-case13">
+        <echo message="testing config without signal input" />
+        <au:expectfailure>
+            <antcall target="target-invalid-config8" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-case14">
+        <echo message="testing config without signal input" />
+        <au:expectfailure>
+            <antcall target="target-invalid-config9" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <!-- functionality testing -->
+    <target name="fail-now-false-condition">
+        <echo message="fail-now-false-condition target: configured to fail now - false condition" />
+    </target>
+
+    <target name="fail-now-true-condition">
+        <echo message="fail-now-true-condition target: configured to fail now - true condition" />
+    </target>
+
+    <target name="fail-no-condition">
+        <echo message="fail-now-false-condition target: configured to fail now - true condition" />
+    </target>
+
+    <target name="fail-defer-false-condition">
+        <echo message="fail-defer-false-condition target: configured to fail later - false condition" />
+    </target>
+
+    <target name="fail-defer-true-condition">
+        <echo message="${number.of.errors}" />
+        <echo message="fail-defer-true-condition target: configured to fail later - true condition" />
+    </target>
+
+    <target name="fail-never-false-condition">
+        <echo message="fail-never-false-condition target: configured to fail never - false condition" />
+    </target>
+
+    <target name="fail-never-true-condition">
+        <echo message="fail-never-true-condition target: configured to fail never - true condition" />
+    </target>
+
+    <target name="test-fail-now-false-condition">
+        <antcall target="fail-now-false-condition" inheritRefs="true" />
+    </target>
+
+    <target name="compile-signal-test">
+        <au:expectfailure>
+            <echo message="compile-signal failure test" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-compile-signal-test">
+        <au:expectfailure>
+            <antcall target="compile-signal-test" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-fail-now-true-condition">
+        <au:expectfailure>
+            <antcall target="fail-now-true-condition" inheritRefs="true" />
+        </au:expectfailure>
+    </target>
+
+    <target name="test-fail-no-condition" >
+        <antcall target="fail-no-condition" inheritRefs="true" />
+    </target>
+
+    <target name="test-fail-defer-false-condition">
+        <antcall target="fail-defer-false-condition" inheritRefs="true" />
+    </target>
+
+    <target name="test-fail-defer-true-condition">
+        <antcall target="fail-defer-true-condition" inheritRefs="true"/>
+        <au:assertTrue>
+            <hlm:hasDeferredFailure name="inputFailDefer"/>
+        </au:assertTrue>
+        <hlm:clearDeferredFailures/>
+    </target>
+
+    <target name="test-fail-never-false-condition">
+        <antcall target="fail-never-false-condition" inheritRefs="true" />
+    </target>
+
+    <target name="test-fail-never-true-condition">
+        <antcall target="fail-never-true-condition" inheritRefs="true" />
+    </target>
+
+
+    <target name="test-all" depends="test-fail-all, test-case-all,test-compile-signal-test" />
+    <target name="test-fail-all" depends="test-fail-now-false-condition, test-fail-now-true-condition,
+                test-fail-no-condition,test-fail-defer-false-condition, test-fail-defer-true-condition,
+                test-fail-never-false-condition, fail-never-false-condition, fail-never-true-condition" />
+    <target name="test-case-all" depends="test-case1, test-case2, test-case3, test-case4, test-case5, test-case6,
+                test-case7,test-case8,test-case9,test-case10,test-case11,test-case12,test-case13,test-case14" />
+</project>
--- a/buildframework/helium/external/helium-antlib/signaling/tests/test_signal/test_signaling.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,262 +0,0 @@
-<?xml version="1.0"?>
-<!-- 
-============================================================================ 
-Name        : test_signaling.ant.xml 
-Part of     : Helium AntLib
-
-Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-All rights reserved.
-This component and the accompanying materials are made available
-under the terms of the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<project name="test-signaling" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
-    <description>
-        Test all the helium signals
-    </description>
-
-    <dirname property="project.dir.signaling" file="${ant.file.test-signaling}" />
-
-    <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium" />
-    <import file="test_signaling_config.ant.xml" />
-
-    <property name="build.summary.file" location="${project.dir.signaling}/data/ido_tedo_mcl_devlon52_ec_MCL.52.105_summary.log.xml" />
-
-    <target name="target-valid-config1">
-        <echo message="valid configuration1" />
-    </target>
-
-    <target name="target-valid-config2">
-        <echo message="valid configuration2" />
-    </target>
-
-    <target name="target-valid-config3">
-        <echo message="valid configuration3" />
-    </target>
-
-    <target name="target-valid-config4">
-        <echo message="valid configuration4" />
-    </target>
-
-    <target name="target-valid-config5">
-        <echo message="valid configuration5" />
-    </target>
-
-    <target name="target-invalid-config1">
-        <echo message="invalid configuration1" />
-    </target>
-
-    <target name="target-invalid-config2">
-        <echo message="invalid configuration2" />
-    </target>
-
-    <target name="target-invalid-config3">
-        <echo message="invalid configuration3" />
-    </target>
-
-    <target name="target-invalid-config4">
-        <echo message="invalid configuration4" />
-    </target>
-
-    <target name="target-invalid-config5">
-        <echo message="invalid configuration5" />
-    </target>
-
-    <target name="target-invalid-config6">
-        <echo message="invalid configuration6" />
-    </target>
-
-    <target name="target-invalid-config7">
-        <echo message="invalid configuration7" />
-    </target>
-
-    <target name="target-invalid-config8">
-        <echo message="invalid configuration8" />
-    </target>
-
-    <target name="target-invalid-config9">
-        <echo message="invalid configuration9" />
-    </target>
-
-    <target name="test-case1">
-        <echo message="testing config without signal input" />
-        <antcall target="target-valid-config1" inheritRefs="true"/>
-    </target>
-
-    <target name="test-case2">
-        <echo message="testing config without signal input" />
-        <antcall target="target-valid-config2" inheritRefs="true" />
-    </target>
-
-    <target name="test-case3">
-        <echo message="testing config without signal input" />
-        <antcall target="target-valid-config3" inheritRefs="true" />
-    </target>
-
-    <target name="test-case4">
-        <echo message="testing config without signal input" />
-        <antcall target="target-valid-config4" inheritRefs="true" />
-    </target>
-
-    <target name="test-case5">
-        <echo message="testing config without signal input" />
-        <antcall target="target-valid-config5" inheritRefs="true" />
-    </target>
-
-    <target name="test-case6">
-        <echo message="testing config without signal input" />
-        <au:expectfailure>
-            <antcall target="target-invalid-config1" inheritRefs="true" />
-        </au:expectfailure>
-    </target>
-
-    <target name="test-case7">
-        <echo message="testing when the named target is not exists, so signal" />
-        <antcall target="target-invalid-config2" inheritRefs="true" />
-    </target>
-
-    <target name="test-case8">
-        <!-- This test case is not valid anymore, now the attribute validation is done 
-    	     at Ant parsing level -->
-        <!--echo message="testing config without signal input" />
-        <au:expectfailure>
-            <antcall target="target-invalid-config3" inheritRefs="true" />
-        </au:expectfailure-->
-    </target>
-
-    <target name="test-case9">
-        <echo message="testing config without signal input" />
-        <au:expectfailure>
-            <antcall target="target-invalid-config4" inheritRefs="true" />
-        </au:expectfailure>
-    </target>
-
-    <target name="test-case10">
-        <echo message="testing config without signal input" />
-        <au:expectfailure>
-            <antcall target="target-invalid-config5" inheritRefs="true" />
-        </au:expectfailure>
-    </target>
-
-    <target name="test-case11">
-        <echo message="testing config without signal input" />
-        <au:expectfailure>
-            <antcall target="target-invalid-config6" inheritRefs="true" />
-        </au:expectfailure>
-    </target>
-
-    <target name="test-case12">
-        <echo message="testing config without signal input" />
-        <au:expectfailure>
-            <antcall target="target-invalid-config7" inheritRefs="true" />
-        </au:expectfailure>
-    </target>
-
-    <target name="test-case13">
-        <echo message="testing config without signal input" />
-        <au:expectfailure>
-            <antcall target="target-invalid-config8" inheritRefs="true" />
-        </au:expectfailure>
-    </target>
-
-    <target name="test-case14">
-        <echo message="testing config without signal input" />
-        <au:expectfailure>
-            <antcall target="target-invalid-config9" inheritRefs="true" />
-        </au:expectfailure>
-    </target>
-
-    <!-- functionality testing -->
-    <target name="fail-now-false-condition">
-        <echo message="fail-now-false-condition target: configured to fail now - false condition" />
-    </target>
-
-    <target name="fail-now-true-condition">
-        <echo message="fail-now-true-condition target: configured to fail now - true condition" />
-    </target>
-
-    <target name="fail-no-condition">
-        <echo message="fail-now-false-condition target: configured to fail now - true condition" />
-    </target>
-
-    <target name="fail-defer-false-condition">
-        <echo message="fail-defer-false-condition target: configured to fail later - false condition" />
-    </target>
-
-    <target name="fail-defer-true-condition">
-        <echo message="${number.of.errors}" />
-        <echo message="fail-defer-true-condition target: configured to fail later - true condition" />
-    </target>
-
-    <target name="fail-never-false-condition">
-        <echo message="fail-never-false-condition target: configured to fail never - false condition" />
-    </target>
-
-    <target name="fail-never-true-condition">
-        <echo message="fail-never-true-condition target: configured to fail never - true condition" />
-    </target>
-
-    <target name="test-fail-now-false-condition">
-        <antcall target="fail-now-false-condition" inheritRefs="true" />
-    </target>
-
-    <target name="compile-signal-test">
-        <au:expectfailure>
-            <echo message="compile-signal failure test" />
-        </au:expectfailure>
-    </target>
-
-    <target name="test-compile-signal-test">
-        <au:expectfailure>
-            <antcall target="compile-signal-test" inheritRefs="true" />
-        </au:expectfailure>
-    </target>
-
-    <target name="test-fail-now-true-condition">
-        <au:expectfailure>
-            <antcall target="fail-now-true-condition" inheritRefs="true" />
-        </au:expectfailure>
-    </target>
-
-    <target name="test-fail-no-condition" >
-        <antcall target="fail-no-condition" inheritRefs="true" />
-    </target>
-
-    <target name="test-fail-defer-false-condition">
-        <antcall target="fail-defer-false-condition" inheritRefs="true" />
-    </target>
-
-    <target name="test-fail-defer-true-condition">
-        <antcall target="fail-defer-true-condition" inheritRefs="true"/>
-        <au:assertTrue>
-            <hlm:hasDeferredFailure name="inputFailDefer"/>
-        </au:assertTrue>
-        <hlm:clearDeferredFailures/>
-    </target>
-
-    <target name="test-fail-never-false-condition">
-        <antcall target="fail-never-false-condition" inheritRefs="true" />
-    </target>
-
-    <target name="test-fail-never-true-condition">
-        <antcall target="fail-never-true-condition" inheritRefs="true" />
-    </target>
-
-
-    <target name="test-all" depends="test-fail-all, test-case-all,test-compile-signal-test" />
-    <target name="test-fail-all" depends="test-fail-now-false-condition, test-fail-now-true-condition,
-                test-fail-no-condition,test-fail-defer-false-condition, test-fail-defer-true-condition,
-                test-fail-never-false-condition, fail-never-false-condition, fail-never-true-condition" />
-    <target name="test-case-all" depends="test-case1, test-case2, test-case3, test-case4, test-case5, test-case6,
-                test-case7,test-case8,test-case9,test-case10,test-case11,test-case12,test-case13,test-case14" />
-</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/bld.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,60 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+
+REM Configure Ant 
+if not defined TESTED_ANT_HOME (
+set TESTED_ANT_HOME=C:\Apps\ant_1.7
+) 
+if exist %TESTED_ANT_HOME% (set ANT_HOME=%TESTED_ANT_HOME%)
+
+REM Configure the expected Ant Version details below
+SET expMajorVer=1
+SET expMinorVer=7
+
+rem *** Verify Ant Version ***
+rem -- Run the 'ant -version' command and capture the output to a variable 
+for /f "tokens=*" %%a in ('ant -version') do (set antversion=%%a)
+echo *** Installed Version : %antversion%
+
+rem -- Parse the version string obtained above and get the version number
+for /f "tokens=4 delims= " %%a in ("%antversion%") do set val=%%a
+rem -- Parse the version number delimiting the '.' and set the major and
+rem    minor versions
+for /f "tokens=1-2 delims=." %%a in ("%val%") do (
+set /A majorVersion=%%a
+set /A minorVersion=%%b
+)
+rem -- Check whether major version is greater than or equal to the expected.
+if %majorVersion% geq %expMajorVer% ( 
+rem -- if major version is valid, check minor version. If minor version is less
+rem    than expected display message and abort the execution.
+if %minorVersion% lss %expMinorVer% (echo *** Incorrect version of Ant found. Please check you have atleast Ant 1.7.0 & goto :errorstop ) 
+)
+
+ant %*
+endlocal
+
+:errorstop
+@echo *** Build aborted with error
+exit /b 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-sysdef">
+    <description>Helium Antlib Sydef.</description>
+    
+    <import file="../macros.ant.xml"/>
+    
+    <property name="name" value="sysdef"/>
+    
+    <path id="helium.sysdef.classpath">
+        <fileset dir="${helium.antlib.root.dir}/sysdef/lib" includes="*.jar"/>
+    </path>
+    
+</project>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/build.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,27 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set ANT_ARGS=-lib %CD%\..\lib  -lib  %CD%\..\..\bin\helium-sysdef.jar -lib %CD%\..\..\antlibs
+ant %*
+endlocal
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-sysdef-demo" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium Antlib sysdef demo.</description>
+
+    <taskdef resource="com/nokia/helium/sysdef/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+    <property name="epocroot" location="data" />
+
+    <target name="demo-join">
+        <hlm:joinSysdef epocroot="${epocroot}" srcfile="${epocroot}/root/system_definition_layer1.xml" destfile="${epocroot}/layer1.sysdef.xml" />
+        <hlm:joinSysdef epocroot="${epocroot}" srcfile="${epocroot}/root/system_definition_layer2.xml" destfile="${epocroot}/layer2.sysdef.xml" />
+        <hlm:mergeSysdef epocroot="${epocroot}" destfile="${epocroot}/full_model.sysdef.xml" srcfile="${epocroot}/layer1.sysdef.xml" downstreamfile="${epocroot}/layer2.sysdef.xml" />
+        <hlm:downgradeSysdef epocroot="${epocroot}" srcfile="${epocroot}/full_model.sysdef.xml" destfile="${epocroot}/downgraded_model.sysdef.xml"/>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/data/layer1/package1/package_definition.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : package_definition.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<SystemDefinition schema="3.0.0">
+  <package id="package1" name="Package 1" levels="demo">
+    <collection id="collection" name="Collection" level="demo">
+      <component id="component" name="Component" purpose="development">
+        <unit bldFile="collection/component/group" mrp=""/>
+      </component>
+    </collection>
+  </package>
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/data/layer1/package2/package_definition.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : package_definition.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<SystemDefinition schema="3.0.0" xmlns:qt="http://qt.nokia.com">
+  <package id="package2" name="Package 2" levels="demo">
+    <collection id="collection2" name="Collection 2" level="demo">
+      <component id="component2" name="Component 2" purpose="development">
+        <unit bldFile="collection2/component2/group" mrp="" qt:proFile="foo.pro" />
+      </component>
+    </collection>
+  </package>
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/data/layer2/package3/package_definition.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : package_definition.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<SystemDefinition schema="3.0.0" xmlns:qt="http://qt.nokia.com">
+  <package id="package3" name="Package 3" levels="demo">
+    <collection id="collection3" name="Collection 3" level="demo">
+      <component id="component3" name="Component 3" purpose="development">
+        <unit bldFile="collection3/component3/group" mrp="" />
+      </component>
+    </collection>
+  </package>
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/data/layer2/package4/package_definition.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : package_definition.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<SystemDefinition schema="3.0.0">
+  <package id="package4" name="Package 4" levels="demo">
+    <collection id="collection4" name="Collection 4" level="demo">
+      <component id="component4" name="Component 4" purpose="development">
+        <unit bldFile="collection4/component4/group" mrp=""/>
+      </component>
+    </collection>
+  </package>
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/data/layer3/package5/package_definition.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : package_definition.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<SystemDefinition schema="3.0.0" xmlns:qt="http://qt.nokia.com">
+  <package id="package5" name="Package 5" levels="demo">
+    <!-- the xml syntax of this file is voluntarly wrong. -->
+    <collection id="collection5" name="Collection 5" level="demo" />
+      <component id="component5" name="Component 5" purpose="development">
+        <unit bldFile="collection5/component5/group" mrp="" />
+      </component>
+    </collection>
+  </package>
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/data/root/system_definition_layer1.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : package_definition.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE SystemDefinition [
+<!ELEMENT SystemDefinition ( systemModel | layer | package | collection | component)>
+<!ATTLIST SystemDefinition
+  schema CDATA #REQUIRED
+  id-namespace CDATA "http://www.symbian.org/system-definition"
+>
+<!-- this DTD describes schema="3.0.0" --> 
+
+<!-- all relative paths are relative to this file
+	all absolute paths are relative to the environment variable specified by the root attribute, or SRCROOT if not.  -->
+
+<!-- Container for metadata
+	meta, if present, should always be the first element in the parent 
+	 -->
+<!ELEMENT meta ANY>
+<!ATTLIST meta
+  href		CDATA #IMPLIED
+  type	CDATA "auto"
+  rel	CDATA "Generic"
+>
+
+<!-- systemModel element has name but no ID -->
+<!ELEMENT systemModel (meta*, layer+)>
+<!ATTLIST systemModel
+  name CDATA #IMPLIED
+>
+
+<!-- All items from layer down to component should have either @href or at least one valid child item.
+	Anything else will be considered a placeholder
+	-->
+
+<!ELEMENT layer (meta*, (package | collection)*)  >
+<!ATTLIST layer
+  id ID #REQUIRED
+  name CDATA #IMPLIED
+  href		CDATA #IMPLIED
+  levels NMTOKENS #IMPLIED
+  span CDATA #IMPLIED
+  before NMTOKEN #IMPLIED
+>
+
+<!ELEMENT package (meta*,  (package | collection)*)>
+ <!-- Nested packages are for backwards compatibility only -->
+<!ATTLIST package
+  id ID #REQUIRED
+  name CDATA #IMPLIED
+  version CDATA #IMPLIED
+  tech-domain CDATA #IMPLIED
+  href	 CDATA #IMPLIED
+  levels NMTOKENS #IMPLIED
+  span CDATA #IMPLIED
+  level NMTOKEN #IMPLIED
+  before NMTOKEN #IMPLIED  
+>
+
+<!ELEMENT collection (meta*, (component* ))>
+<!ATTLIST collection
+  id ID #REQUIRED
+  name CDATA #IMPLIED
+  href		CDATA #IMPLIED
+  level NMTOKEN #IMPLIED
+  before NMTOKEN #IMPLIED  
+>
+
+<!ELEMENT component (meta*, unit*)>
+<!-- contains units or is a placeholder -->
+<!ATTLIST component
+  id ID #REQUIRED
+  name CDATA #IMPLIED
+  href		CDATA #IMPLIED
+  deprecated CDATA #IMPLIED
+  introduced CDATA #IMPLIED
+  target  ( device | desktop | other ) "device"
+  purpose ( optional | mandatory | development ) "optional"  
+  class NMTOKENS #IMPLIED
+  filter CDATA #IMPLIED
+  before NMTOKEN #IMPLIED  
+  origin-model CDATA #IMPLIED
+>
+<!--
+	"filter" attribute is deprecated
+	"origin-model" attribute is only to be inserted by tools when merging models
+ 	recommended class values are: doc, config, plugin, tool, api -->
+
+<!ELEMENT unit EMPTY >
+<!ATTLIST unit
+  mrp CDATA #IMPLIED
+  bldFile CDATA #IMPLIED
+  base CDATA #IMPLIED
+  root CDATA #IMPLIED
+  version NMTOKEN #IMPLIED
+  prebuilt NMTOKEN #IMPLIED
+  late (yes|no) #IMPLIED
+  filter CDATA #IMPLIED
+  priority CDATA #IMPLIED
+>
+<!-- filter and priority are deprecated 
+	"root" attribute will usually be inserted by tools when merging models, although it can be set manually-->
+
+<!ENTITY layer_real_source_path "/sf/os/mm" >
+]>
+<SystemDefinition schema="3.0.0">
+  <systemModel name="Demo">
+    <layer id="layer1">
+      <package id="package1" href="../layer1/package1/package_definition.xml"/>
+      <package id="package2" href="../layer1/package2/package_definition.xml"/>
+    </layer>
+  </systemModel>
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/data/root/system_definition_layer2.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : package_definition.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE SystemDefinition [
+<!ELEMENT SystemDefinition ( systemModel | layer | package | collection | component)>
+<!ATTLIST SystemDefinition
+  schema CDATA #REQUIRED
+  id-namespace CDATA "http://www.symbian.org/system-definition"
+>
+<!-- this DTD describes schema="3.0.0" --> 
+
+<!-- all relative paths are relative to this file
+	all absolute paths are relative to the environment variable specified by the root attribute, or SRCROOT if not.  -->
+
+<!-- Container for metadata
+	meta, if present, should always be the first element in the parent 
+	 -->
+<!ELEMENT meta ANY>
+<!ATTLIST meta
+  href		CDATA #IMPLIED
+  type	CDATA "auto"
+  rel	CDATA "Generic"
+>
+
+<!-- systemModel element has name but no ID -->
+<!ELEMENT systemModel (meta*, layer+)>
+<!ATTLIST systemModel
+  name CDATA #IMPLIED
+>
+
+<!-- All items from layer down to component should have either @href or at least one valid child item.
+	Anything else will be considered a placeholder
+	-->
+
+<!ELEMENT layer (meta*, (package | collection)*)  >
+<!ATTLIST layer
+  id ID #REQUIRED
+  name CDATA #IMPLIED
+  href		CDATA #IMPLIED
+  levels NMTOKENS #IMPLIED
+  span CDATA #IMPLIED
+  before NMTOKEN #IMPLIED
+>
+
+<!ELEMENT package (meta*,  (package | collection)*)>
+ <!-- Nested packages are for backwards compatibility only -->
+<!ATTLIST package
+  id ID #REQUIRED
+  name CDATA #IMPLIED
+  version CDATA #IMPLIED
+  tech-domain CDATA #IMPLIED
+  href	 CDATA #IMPLIED
+  levels NMTOKENS #IMPLIED
+  span CDATA #IMPLIED
+  level NMTOKEN #IMPLIED
+  before NMTOKEN #IMPLIED  
+>
+
+<!ELEMENT collection (meta*, (component* ))>
+<!ATTLIST collection
+  id ID #REQUIRED
+  name CDATA #IMPLIED
+  href		CDATA #IMPLIED
+  level NMTOKEN #IMPLIED
+  before NMTOKEN #IMPLIED  
+>
+
+<!ELEMENT component (meta*, unit*)>
+<!-- contains units or is a placeholder -->
+<!ATTLIST component
+  id ID #REQUIRED
+  name CDATA #IMPLIED
+  href		CDATA #IMPLIED
+  deprecated CDATA #IMPLIED
+  introduced CDATA #IMPLIED
+  target  ( device | desktop | other ) "device"
+  purpose ( optional | mandatory | development ) "optional"  
+  class NMTOKENS #IMPLIED
+  filter CDATA #IMPLIED
+  before NMTOKEN #IMPLIED  
+  origin-model CDATA #IMPLIED
+>
+<!--
+	"filter" attribute is deprecated
+	"origin-model" attribute is only to be inserted by tools when merging models
+ 	recommended class values are: doc, config, plugin, tool, api -->
+
+<!ELEMENT unit EMPTY >
+<!ATTLIST unit
+  mrp CDATA #IMPLIED
+  bldFile CDATA #IMPLIED
+  base CDATA #IMPLIED
+  root CDATA #IMPLIED
+  version NMTOKEN #IMPLIED
+  prebuilt NMTOKEN #IMPLIED
+  late (yes|no) #IMPLIED
+  filter CDATA #IMPLIED
+  priority CDATA #IMPLIED
+>
+<!-- filter and priority are deprecated 
+	"root" attribute will usually be inserted by tools when merging models, although it can be set manually-->
+]>
+<SystemDefinition schema="3.0.0">
+  <systemModel name="Demo2">
+    <layer id="layer2" name="layer2" levels="demo">
+      <package id="package3" href="../layer2/package3/package_definition.xml"/>
+      <package id="package4" href="../layer2/package4/package_definition.xml"/>
+    </layer>
+  </systemModel>
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/data/root/system_definition_layer3.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : package_definition.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE SystemDefinition [
+<!ELEMENT SystemDefinition ( systemModel | layer | package | collection | component)>
+<!ATTLIST SystemDefinition
+  schema CDATA #REQUIRED
+  id-namespace CDATA "http://www.symbian.org/system-definition"
+>
+<!-- this DTD describes schema="3.0.0" --> 
+
+<!-- all relative paths are relative to this file
+	all absolute paths are relative to the environment variable specified by the root attribute, or SRCROOT if not.  -->
+
+<!-- Container for metadata
+	meta, if present, should always be the first element in the parent 
+	 -->
+<!ELEMENT meta ANY>
+<!ATTLIST meta
+  href		CDATA #IMPLIED
+  type	CDATA "auto"
+  rel	CDATA "Generic"
+>
+
+<!-- systemModel element has name but no ID -->
+<!ELEMENT systemModel (meta*, layer+)>
+<!ATTLIST systemModel
+  name CDATA #IMPLIED
+>
+
+<!-- All items from layer down to component should have either @href or at least one valid child item.
+	Anything else will be considered a placeholder
+	-->
+
+<!ELEMENT layer (meta*, (package | collection)*)  >
+<!ATTLIST layer
+  id ID #REQUIRED
+  name CDATA #IMPLIED
+  href		CDATA #IMPLIED
+  levels NMTOKENS #IMPLIED
+  span CDATA #IMPLIED
+  before NMTOKEN #IMPLIED
+>
+
+<!ELEMENT package (meta*,  (package | collection)*)>
+ <!-- Nested packages are for backwards compatibility only -->
+<!ATTLIST package
+  id ID #REQUIRED
+  name CDATA #IMPLIED
+  version CDATA #IMPLIED
+  tech-domain CDATA #IMPLIED
+  href	 CDATA #IMPLIED
+  levels NMTOKENS #IMPLIED
+  span CDATA #IMPLIED
+  level NMTOKEN #IMPLIED
+  before NMTOKEN #IMPLIED  
+>
+
+<!ELEMENT collection (meta*, (component* ))>
+<!ATTLIST collection
+  id ID #REQUIRED
+  name CDATA #IMPLIED
+  href		CDATA #IMPLIED
+  level NMTOKEN #IMPLIED
+  before NMTOKEN #IMPLIED  
+>
+
+<!ELEMENT component (meta*, unit*)>
+<!-- contains units or is a placeholder -->
+<!ATTLIST component
+  id ID #REQUIRED
+  name CDATA #IMPLIED
+  href		CDATA #IMPLIED
+  deprecated CDATA #IMPLIED
+  introduced CDATA #IMPLIED
+  target  ( device | desktop | other ) "device"
+  purpose ( optional | mandatory | development ) "optional"  
+  class NMTOKENS #IMPLIED
+  filter CDATA #IMPLIED
+  before NMTOKEN #IMPLIED  
+  origin-model CDATA #IMPLIED
+>
+<!--
+	"filter" attribute is deprecated
+	"origin-model" attribute is only to be inserted by tools when merging models
+ 	recommended class values are: doc, config, plugin, tool, api -->
+
+<!ELEMENT unit EMPTY >
+<!ATTLIST unit
+  mrp CDATA #IMPLIED
+  bldFile CDATA #IMPLIED
+  base CDATA #IMPLIED
+  root CDATA #IMPLIED
+  version NMTOKEN #IMPLIED
+  prebuilt NMTOKEN #IMPLIED
+  late (yes|no) #IMPLIED
+  filter CDATA #IMPLIED
+  priority CDATA #IMPLIED
+>
+<!-- filter and priority are deprecated 
+	"root" attribute will usually be inserted by tools when merging models, although it can be set manually-->
+]>
+<SystemDefinition schema="3.0.0">
+  <systemModel name="Demo2">
+    <layer id="layer2" name="layer3" levels="demo">
+      <package id="package5" href="../layer2/package5/package_definition.xml"/>
+    </layer>
+  </systemModel>
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/data/root/system_model.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : package_definition.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE SystemDefinition [
+<!ELEMENT SystemDefinition ( systemModel | layer | package | collection | component)>
+<!ATTLIST SystemDefinition
+  schema CDATA #REQUIRED
+  id-namespace CDATA "http://www.symbian.org/system-definition"
+>
+<!-- this DTD describes schema="3.0.0" --> 
+
+<!-- all relative paths are relative to this file
+	all absolute paths are relative to the environment variable specified by the root attribute, or SRCROOT if not.  -->
+
+<!-- Container for metadata
+	meta, if present, should always be the first element in the parent 
+	 -->
+<!ELEMENT meta ANY>
+<!ATTLIST meta
+  href		CDATA #IMPLIED
+  type	CDATA "auto"
+  rel	CDATA "Generic"
+>
+
+<!-- systemModel element has name but no ID -->
+<!ELEMENT systemModel (meta*, layer+)>
+<!ATTLIST systemModel
+  name CDATA #IMPLIED
+>
+
+<!-- All items from layer down to component should have either @href or at least one valid child item.
+	Anything else will be considered a placeholder
+	-->
+
+<!ELEMENT layer (meta*, (package | collection)*)  >
+<!ATTLIST layer
+  id ID #REQUIRED
+  name CDATA #IMPLIED
+  href		CDATA #IMPLIED
+  levels NMTOKENS #IMPLIED
+  span CDATA #IMPLIED
+  before NMTOKEN #IMPLIED
+>
+
+<!ELEMENT package (meta*,  (package | collection)*)>
+ <!-- Nested packages are for backwards compatibility only -->
+<!ATTLIST package
+  id ID #REQUIRED
+  name CDATA #IMPLIED
+  version CDATA #IMPLIED
+  tech-domain CDATA #IMPLIED
+  href	 CDATA #IMPLIED
+  levels NMTOKENS #IMPLIED
+  span CDATA #IMPLIED
+  level NMTOKEN #IMPLIED
+  before NMTOKEN #IMPLIED  
+>
+
+<!ELEMENT collection (meta*, (component* ))>
+<!ATTLIST collection
+  id ID #REQUIRED
+  name CDATA #IMPLIED
+  href		CDATA #IMPLIED
+  level NMTOKEN #IMPLIED
+  before NMTOKEN #IMPLIED  
+>
+
+<!ELEMENT component (meta*, unit*)>
+<!-- contains units or is a placeholder -->
+<!ATTLIST component
+  id ID #REQUIRED
+  name CDATA #IMPLIED
+  href		CDATA #IMPLIED
+  deprecated CDATA #IMPLIED
+  introduced CDATA #IMPLIED
+  target  ( device | desktop | other ) "device"
+  purpose ( optional | mandatory | development ) "optional"  
+  class NMTOKENS #IMPLIED
+  filter CDATA #IMPLIED
+  before NMTOKEN #IMPLIED  
+  origin-model CDATA #IMPLIED
+>
+<!--
+	"filter" attribute is deprecated
+	"origin-model" attribute is only to be inserted by tools when merging models
+ 	recommended class values are: doc, config, plugin, tool, api -->
+
+<!ELEMENT unit EMPTY >
+<!ATTLIST unit
+  mrp CDATA #IMPLIED
+  bldFile CDATA #IMPLIED
+  base CDATA #IMPLIED
+  root CDATA #IMPLIED
+  version NMTOKEN #IMPLIED
+  prebuilt NMTOKEN #IMPLIED
+  late (yes|no) #IMPLIED
+  filter CDATA #IMPLIED
+  priority CDATA #IMPLIED
+>
+<!-- filter and priority are deprecated 
+	"root" attribute will usually be inserted by tools when merging models, although it can be set manually-->
+]>
+<SystemDefinition schema="3.0.0">
+  <systemModel name="multimedia">
+    <layer id="mw" name="mw" levels="middleware framework">
+      <package id="mmmw" href="file:///i:/sf/mw/mmmw/package_definition.xml"/>
+      <!--<package id="mm" href="i:/sf/os/mm/package_definition.xml"/>-->
+    </layer>
+  </systemModel>
+</SystemDefinition>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/data/sf/os/buildtools/bldsystemtools/buildsystemtools/filter-module.xsl	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,110 @@
+<?xml version="1.0"?>
+ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common"  exclude-result-prefixes="exslt">
+	<xsl:output method="xml" indent="yes"/>
+
+
+<!-- filters can only return hide or show -->
+
+<!-- filter-only =  item's @filter can only have items from the list
+	anything with no filters passes
+-->
+<xsl:template match="filter-only" mode="filter"><xsl:param name="item"/>
+	<xsl:if test="$item[@filter]">
+		<xsl:variable name="this" select="."/>
+		<xsl:variable name="my-filters">
+			<xsl:call-template name="filter-list">
+				<xsl:with-param name="f" select="$item/parent::component/@filter"/>
+			</xsl:call-template>
+			<xsl:call-template name="filter-list">
+				<xsl:with-param name="f" select="$item/@filter"/>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:variable name="match">
+			<xsl:for-each select="exslt:node-set($my-filters)/*">
+				<xsl:if test="not($this/*[name()=name(current())  and @v=current()/@v])">x</xsl:if>
+			</xsl:for-each>
+		</xsl:variable>
+		<xsl:if test="$match!=''">hide</xsl:if>
+	</xsl:if>
+</xsl:template>
+
+
+
+<!-- filter-has =  item's @filter must have all filters in the list. ie it can have any other filters, but these must all be present	
+-->
+<xsl:template match="filter-has" mode="filter"><xsl:param name="item"/>
+	<xsl:if test="$item[(self::component or self::unit)  and not(unit/@filter or self::unit[not(../unit[@filter])])]">
+		<xsl:variable name="my-filters">
+			<xsl:call-template name="filter-list">
+				<xsl:with-param name="f" select="$item/parent::component/@filter"/>
+			</xsl:call-template>
+			<xsl:call-template name="filter-list">
+				<xsl:with-param name="f" select="$item/@filter"/>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:variable name="match">
+			<xsl:for-each select="*">
+				<!-- 	if(f in this) {return true}  else if(!f in this) {return false} else {return !(f is positive)} -->
+				<xsl:choose>
+					<xsl:when test="exslt:node-set($my-filters)/*[name()=name(current()) and @v=current()/@v]"/> <!-- filter in item -->
+					<xsl:when test="exslt:node-set($my-filters)/*[name()!=name(current()) and @v=current()/@v]">x</xsl:when> <!-- !filter in item -->
+					<xsl:when test="self::filter">x</xsl:when> <!-- !(filter is positive) -->
+				</xsl:choose>
+			</xsl:for-each>
+		</xsl:variable>
+		<xsl:if test="$match!=''">hide</xsl:if>
+	</xsl:if>
+</xsl:template>
+
+<xsl:template match="filter-with" mode="filter"><xsl:param name="item"/>
+	<xsl:if test="$item[(self::component or self::unit)  and not(unit/@filter or self::unit[not(../unit[@filter])])]">
+		<xsl:variable name="my-filters">
+			<xsl:call-template name="filter-list">
+				<xsl:with-param name="f" select="$item/parent::component/@filter"/>
+			</xsl:call-template>
+			<xsl:call-template name="filter-list">
+				<xsl:with-param name="f" select="$item/@filter"/>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:variable name="match">
+			<xsl:for-each select="*">
+				<xsl:if test="exslt:node-set($my-filters)/*[name()!=name(current()) and @v=current()/@v]">x</xsl:if> <!-- !filter in item -->
+			</xsl:for-each>
+		</xsl:variable>
+		<xsl:if test="$match!=''">hide</xsl:if>
+	</xsl:if>
+</xsl:template>
+
+
+
+<xsl:template name="filter-item"> <xsl:param name="f"/>
+	<!-- create an element for a given filter. If the filter's empty make nothing -->
+	<xsl:choose>
+		<xsl:when test="$f=''"/>
+		<xsl:when test="starts-with($f,'!')">
+				<not v="{substring($f,2)}"/>
+		</xsl:when>
+		<xsl:otherwise>
+				<filter v="{$f}"/>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+<xsl:template name="filter-list"><xsl:param name="f"/>
+	<!-- turn a filter list into a set of elements (<filter> or <not>) with the attribute "v" containing the "absolute value" of the filter
+		filter="A,B,!C" becomes  <filter v="A"/><filter v="B"/><not v="C"/> 
+	  -->
+	<xsl:choose>
+		<xsl:when test="contains($f,',')">
+			<xsl:call-template name="filter-item"><xsl:with-param name="f" select="normalize-space(substring-before($f,','))"/></xsl:call-template>
+			<xsl:call-template name="filter-list">
+				<xsl:with-param name="f" select="substring-after($f,',')"/>
+			</xsl:call-template>
+		</xsl:when>
+		<xsl:otherwise>
+			<xsl:call-template name="filter-item"><xsl:with-param name="f" select="normalize-space($f)"/></xsl:call-template>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet> 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/data/sf/os/buildtools/bldsystemtools/buildsystemtools/filtersysdef.xsl	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common"  exclude-result-prefixes="exslt">
+	<xsl:output method="xml" indent="yes"/>
+
+<!-- create a stand-alone sysdef from a linked set of fragments -->
+
+<xsl:param name="path">/os/deviceplatformrelease/foundation_system/system_model/system_definition.xml</xsl:param>
+
+<xsl:param name="filter-type">only</xsl:param> <!-- only, has or with -->
+
+<xsl:param name="filter"/> <!-- comma-separated list -->
+
+
+<xsl:template match="/*">
+	<xsl:apply-templates select="." mode="join"/>
+</xsl:template>
+
+
+<xsl:template match="/SystemDefinition[systemModel]">
+
+	<xsl:variable name="f">
+		<xsl:element name="filter-{$filter-type}">
+			<xsl:call-template name="filter-list">
+				<xsl:with-param name="f" select="$filter"/>
+			</xsl:call-template>
+		</xsl:element>
+	</xsl:variable>
+
+<xsl:apply-templates select="." mode="join">
+	<xsl:with-param name="filename" select="$path"/>
+	<xsl:with-param name="data" select="exslt:node-set($f)/*"/>
+</xsl:apply-templates>
+</xsl:template>
+
+
+
+<xsl:include href="joinsysdef-module.xsl"/>
+<xsl:include href="filter-module.xsl"/>
+
+</xsl:stylesheet>	
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/data/sf/os/buildtools/bldsystemtools/buildsystemtools/joinsysdef-module.xsl	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,402 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : joinsysdef-module.xsl 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common" exclude-result-prefixes="exslt">
+	<!-- save SF namespace as a constant to avoid the risk of typos-->
+ <xsl:variable name="defaultns">http://www.symbian.org/system-definition</xsl:variable>
+ 
+<!-- create a stand-alone sysdef from a linked set of fragments -->
+
+<xsl:template match="/*" mode="join">
+	<xsl:message terminate="yes">Cannot process this document</xsl:message>
+</xsl:template>
+
+
+<xsl:template match="/SystemDefinition[@schema='3.0.0' and count(*)=1]" mode="join">
+	<xsl:param name="origin" select="/.."/>
+	<xsl:param name="root"/>
+	<xsl:param name="filename"/>
+	<xsl:param name="namespaces"/>
+	<xsl:choose>
+		<xsl:when test="$origin">	<!-- this sysdef fragment was linked from a parent sysdef -->
+			<xsl:for-each select="*"> <!-- can be only one -->
+				<xsl:variable name="upid"><xsl:apply-templates select="$origin/@id" mode="my-id"/></xsl:variable>		<!-- namespaceless ID of this in parent doc -->
+				<xsl:variable name="id"><xsl:apply-templates select="@id" mode="my-id"/></xsl:variable>						<!-- namespaceless ID of this here -->
+				<xsl:variable name="upns"><xsl:apply-templates select="$origin/@id" mode="my-namespace"/></xsl:variable>	<!-- ID's namespace in parent doc -->
+				<xsl:variable name="ns"><xsl:apply-templates select="@id" mode="my-namespace"/></xsl:variable>	<!-- ID's namespace -->
+				<xsl:if test="$id!=$upid or $ns!=$upns">
+					<xsl:message terminate="yes">Linked ID "<xsl:value-of select="$id"/>" (<xsl:value-of select="$ns"/>) must match linking document "<xsl:value-of select="$upid"/>" (<xsl:value-of select="$upns"/>)</xsl:message>
+				</xsl:if>
+				<!-- copy any attributes not already defined (parent doc overrides child doc)-->
+				<xsl:for-each select="@*">
+					<xsl:variable name="n" select="name()"/>
+					<xsl:choose>
+						<xsl:when test="$n='id'"/> <!-- never copy this, always set -->
+						<xsl:when test="$origin/@*[name()=$n]"> <!-- don't copy if already set -->
+							<xsl:message>Cannot set "<xsl:value-of select="$n"/>", already set</xsl:message>
+						</xsl:when>
+						<xsl:when test="$n='before'">
+							<!-- ensure ns is correct (if any future attribtues will ever use an ID, process it here too)-->
+							<xsl:apply-templates select="." mode="join">
+								<xsl:with-param name="namespaces" select="$namespaces"/>
+							</xsl:apply-templates>
+						</xsl:when> 
+						<xsl:otherwise><xsl:copy-of select="."/></xsl:otherwise> <!-- just copy anything else -->
+					</xsl:choose>
+				</xsl:for-each>
+				<xsl:copy-of select="../namespace::*[not(.=$namespaces)]"/> <!-- set any namespaces not already set (they should all alreayd be, but some XSLT processors are quirky) -->
+				<xsl:apply-templates select="*|comment()" mode="join">
+					<xsl:with-param name="root" select="$root"/>
+					<xsl:with-param name="filename" select="$filename"/>
+					<xsl:with-param name="namespaces" select="$namespaces | ../namespace::*[not(.=$namespaces)]"/>
+				</xsl:apply-templates>
+			</xsl:for-each>
+		</xsl:when>
+		<xsl:when test="function-available('exslt:node-set')">
+			<!--try to put all namespaces in root element -->
+			<xsl:variable name="nss">
+				<!-- contains node set of namespaces to add to root element.
+					May panic if there are too many single-letter namespaces and this can't create a new one -->
+				<xsl:call-template name="needed-namespaces">
+					<xsl:with-param name="foundns">
+						<xsl:apply-templates select="//*[(self::component or self::collection or self::package or self::layer) and @href]" mode="scan-for-namespaces"/>
+					</xsl:with-param>
+				</xsl:call-template>
+			</xsl:variable>
+			<xsl:variable name="ns" select="@id-namespace | namespace::* | exslt:node-set($nss)/*"/>
+			<xsl:copy><xsl:copy-of select="@*"/>
+				<xsl:for-each select="exslt:node-set($nss)/*"> <!-- add namespace definitions -->
+					<xsl:attribute name="xmlns:{name()}">
+						<xsl:value-of select="."/>
+					</xsl:attribute>
+				</xsl:for-each>
+				<xsl:apply-templates select="*|comment()" mode="join">
+					<xsl:with-param name="namespaces" select="$ns"/>
+					<xsl:with-param name="root" select="$root"/>
+					<xsl:with-param name="filename" select="$filename"/>
+				</xsl:apply-templates>
+			</xsl:copy>
+		</xsl:when>
+		<xsl:otherwise> <!-- can't handle node-set() so put the namespaces in the document instead of the root -->
+			<xsl:variable name="ns" select="@id-namespace | namespace::*"/>
+			<xsl:copy><xsl:copy-of select="@*"/>
+				<xsl:apply-templates select="*|comment()" mode="join">
+					<xsl:with-param name="namespaces" select="$ns"/>
+					<xsl:with-param name="root" select="$root"/>
+					<xsl:with-param name="filename" select="$filename"/>
+				</xsl:apply-templates>
+			</xsl:copy>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="scan-for-namespaces"/> <!-- just in case of errors, consider replacing by terminate -->
+<xsl:template match="*[@href and not(self::meta)]" mode="scan-for-namespaces">
+	<!-- produce a list of namespace-prefix namespace pairs separated by newlines, in reverse order found in documents 
+		reverse order so we can try to use the first namespace prefix defined if it's available-->
+	<xsl:for-each select="document(@href,.)/*">
+		<xsl:apply-templates select="//*[(self::component or self::collection or self::package or self::layer) and @href]" mode="scan-for-namespaces"/>
+		<xsl:for-each select="//namespace::* | @id-namespace">
+			<xsl:value-of select="concat(name(),' ',.,'&#xa;')"/>
+		</xsl:for-each>
+	</xsl:for-each>			
+</xsl:template>
+
+<xsl:template name="needed-namespaces">
+	<xsl:param name="foundns"/>
+	<xsl:param name="usedpre"/>
+	<xsl:variable name="line" select="substring-before($foundns,'&#xa;')"/> <!-- always has trailing newline -->
+	<xsl:variable name="name" select="substring-after($line,' ')"/> <!-- namespace prefix -->
+	<xsl:variable name="remainder" select="substring-after($foundns,'&#xa;')"/>
+	<xsl:variable name="newprefix">
+		<xsl:if test="not(contains(concat('&#xa;',$remainder),concat('&#xa;',$line,'&#xa;'))) and
+			not(//namespace::*[.=$name] or @id-namespace[.=$name] or (not(@id-namespace) and $defaultns=$name))">
+					<xsl:apply-templates select="." mode="ns-prefix">
+						<xsl:with-param name="ns" select="$name"/>
+						<xsl:with-param name="pre" select="substring-before($line,' ')"/>
+						<xsl:with-param name="dontuse" select="$usedpre"/>
+					</xsl:apply-templates>
+		</xsl:if>
+	</xsl:variable>
+	<xsl:if test="$newprefix!=''">
+		<!-- can treat this as if it were a namespace node -->
+		<xsl:element name="{$newprefix}">
+			<xsl:value-of select="$name"/>
+		</xsl:element>
+	</xsl:if>
+	<xsl:if test="$remainder!=''">
+		<xsl:call-template name="needed-namespaces">
+			<xsl:with-param name="foundns" select="$remainder"/>
+			<xsl:with-param name="usedpre" select="concat($usedpre,' ',$newprefix,' ')"/>
+		</xsl:call-template>
+	</xsl:if>
+</xsl:template>
+
+<xsl:template match="/SystemDefinition" mode="ns-prefix">
+	<!-- should be able to replace this with mechanism that uses the XSLT processor's own ability to generate namespaces -->
+	<xsl:param name="ns"/>
+	<xsl:param name="pre"/>
+	<xsl:param name="dontuse"/>
+	<xsl:param name="chars">ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz</xsl:param>
+	<xsl:variable name="name" select="substring(substring-after($ns,'http://www.'),1,1)"/>
+	<xsl:choose>
+		<xsl:when test="$pre!='' and $pre!='id-namespace' and not(//namespace::*[name()=$pre]) and not(contains($dontuse,concat(' ',$pre,' ')))">
+			<xsl:value-of select="$pre"/>
+		</xsl:when>
+		<xsl:when test="$ns='' and $chars=''">
+			<xsl:message terminate="yes">Cannot create namespace prefix for downstream default namespace</xsl:message>
+		</xsl:when>
+		<xsl:when test="$name!='' and not(contains($dontuse,concat(' ',$name,' ')))"><xsl:value-of select="$name"/></xsl:when>
+		<xsl:when test="namespace::*[name()=substring($chars,1,1)] or contains($dontuse,concat(' ',substring($chars,1,1),' '))">
+			<xsl:apply-templates mode="ns-prefix">
+				<xsl:with-param name="chars" select="substring($chars,2)"/>
+			</xsl:apply-templates>
+		</xsl:when>
+		<xsl:otherwise>
+			<xsl:value-of select="substring($chars,1,1)"/>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+
+<xsl:template match="unit" mode="join">	<xsl:param name="root"/><xsl:param name="filename"/>
+	<xsl:element name="{name()}">
+		<xsl:apply-templates select="@*" mode="join">
+			<xsl:with-param name="root" select="$root"/>
+			<xsl:with-param name="filename" select="$filename"/>
+		</xsl:apply-templates>
+	</xsl:element>
+</xsl:template>
+
+<!-- copy metadata verbatim
+	Should add mechanism to selectively include or filter metadata sections -->
+<xsl:template match="meta" priority="2">
+	<xsl:element name="{name()}">
+		<xsl:apply-templates select="@*" mode="join"/>
+		<xsl:choose>
+			<xsl:when test="@href">
+				<xsl:copy-of select="document(@href,.)/*"/> 
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:copy-of select="*|comment()"/>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:element>
+</xsl:template>
+
+<xsl:template match="*" mode="join">	<xsl:param name="root"/><xsl:param name="filename"/><xsl:param name="namespaces"/>
+	<xsl:element name="{name()}"> <!-- use this instead of <copy> so xalan doesn't add extra wrong namespaces -->
+		<xsl:apply-templates select="@*" mode="join">
+			<xsl:with-param name="namespaces" select="$namespaces"/>
+		</xsl:apply-templates>
+		
+		<xsl:choose>
+			<xsl:when test="@href">
+				<xsl:variable name="origin" select="."/>
+				<xsl:apply-templates select="document(@href,.)/*" mode="join">
+					<xsl:with-param name="origin" select="$origin"/>
+					<xsl:with-param name="namespaces" select="$namespaces"/>
+					<xsl:with-param name="filename">
+						<xsl:call-template name="joinpath">
+							<xsl:with-param name="file" select="$filename"/>
+							<xsl:with-param name="rel" select="$origin/@href"/>
+						</xsl:call-template>					
+					</xsl:with-param>
+					<xsl:with-param name="root">
+							<xsl:value-of select="$root"/>/<xsl:call-template name="lastbefore">
+							<xsl:with-param name="string" select="$origin/@href"/>
+						</xsl:call-template>
+					</xsl:with-param>
+				</xsl:apply-templates> 
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:apply-templates select="*|comment()" mode="join">
+					<xsl:with-param name="root" select="$root"/>
+					<xsl:with-param name="filename" select="$filename"/>
+					<xsl:with-param name="namespaces" select="$namespaces"/>
+				</xsl:apply-templates>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:element>
+</xsl:template>
+
+<xsl:template match="@mrp[starts-with(.,'/')] | @bldFile[starts-with(.,'/')] | @base[starts-with(.,'/')]" mode="join">
+	<xsl:copy-of select="."/>
+</xsl:template>
+
+<xsl:template match="@mrp|@bldFile|@base" mode="join">	<xsl:param name="root"/><xsl:param name="filename"/>
+	<xsl:attribute name="{name()}">
+		<xsl:call-template name="joinpath">
+			<xsl:with-param name="file" select="$filename"/>
+			<xsl:with-param name="rel" select="."/>
+		</xsl:call-template>	
+	</xsl:attribute>	
+</xsl:template>
+
+
+<xsl:template match="@href" mode="join"/>
+
+<xsl:template match="@*" mode="my-namespace"> <!-- the namespace of an ID -->
+	<xsl:choose>
+		<xsl:when test="contains(.,':')">
+			<xsl:value-of select="ancestor::*/namespace::*[name()=substring-before(current(),':')]"/>
+		</xsl:when>
+		<xsl:when test="/SystemDefinition/@id-namespace">
+			<xsl:value-of select="/SystemDefinition/@id-namespace"/>
+		</xsl:when>
+		<xsl:otherwise>
+			<xsl:value-of select="$defaultns"/>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+
+<xsl:template match="@*" mode="my-id"> <!-- the ID with namespace prefix removed -->
+	<xsl:choose>
+		<xsl:when test="contains(.,':')">
+			<xsl:value-of select="substring-after(.,':')"/>
+		</xsl:when>
+		<xsl:otherwise>
+			<xsl:value-of select="."/>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+
+
+<xsl:template match="@id|@before" mode="join">
+	<xsl:param name="namespaces"/>
+	<!-- this will change the namespace prefixes for all IDs to match the root document -->
+	<xsl:variable name="ns">
+		<xsl:apply-templates select="." mode="my-namespace"/>
+	</xsl:variable>
+	<xsl:if test="$ns=''">
+		<xsl:message terminate="yes">Could not find namespace for <xsl:value-of select="."/>
+		</xsl:message>
+	</xsl:if>
+	<xsl:variable name="prefix" select="name($namespaces[.=$ns])"/>
+	<xsl:attribute name="{name()}">
+	<xsl:choose>
+		<xsl:when test="$prefix = 'id-namespace' or  (not($namespaces[name()='id-prefix']) and $ns=$defaultns)"/> <!-- it's the default namespace, no prefix -->
+		<xsl:when test="$prefix='' and contains(.,':')">
+			<!-- complex: copy id and copy namespace (namespace should be copied already)-->
+			<xsl:value-of select="."/>
+		</xsl:when>
+		<xsl:when test="$prefix='' and $ns=$defaultns"/> <!-- no prefix and it's the default --> 
+		<xsl:when test="$prefix!=''">			<!-- just change the prefix -->
+			<xsl:value-of select="concat($prefix,':')"/>
+		</xsl:when>
+		<xsl:otherwise>
+		<xsl:message terminate="yes">Error</xsl:message>
+		</xsl:otherwise>
+	</xsl:choose>
+		<xsl:apply-templates select="." mode="my-id"/>
+	</xsl:attribute>
+</xsl:template>
+
+
+
+<xsl:template match="@*|comment()" mode="join"><xsl:copy-of select="."/></xsl:template>
+
+
+<!-- path handling follows -->
+
+ <xsl:template name="lastbefore"><xsl:param name="string"/><xsl:param name="substr" select="'/'"/>
+        <xsl:if test="contains($string,$substr)">
+                <xsl:value-of select="substring-before($string,$substr)"/>
+                <xsl:if test="contains(substring-after($string,$substr),$substr)">
+	                <xsl:value-of select="$substr"/>
+	              </xsl:if>
+        <xsl:call-template name="lastbefore">
+                <xsl:with-param name="string" select="substring-after($string,$substr)"/>
+                <xsl:with-param name="substr" select="$substr"/>
+        </xsl:call-template>
+        </xsl:if>
+</xsl:template>
+
+ <xsl:template name="joinpath"><xsl:param name="file"/><xsl:param name="rel"/>
+        <xsl:call-template name="reducepath">
+        <xsl:with-param name="file">
+	        <xsl:call-template name="lastbefore">
+	                <xsl:with-param name="string" select="$file"/>
+	        </xsl:call-template>
+	        <xsl:text>/</xsl:text>
+	        <xsl:value-of select="$rel"/>
+	       </xsl:with-param>
+	      </xsl:call-template>
+ </xsl:template>
+
+<xsl:template name="reducepath"><xsl:param name="file"/>
+	<xsl:call-template name="reducedotdotpath">
+    	<xsl:with-param name="file">
+			<xsl:call-template name="reducedotpath">
+		    	<xsl:with-param name="file" select="$file"/>
+		    </xsl:call-template>
+		</xsl:with-param>
+	</xsl:call-template>
+</xsl:template>
+
+<xsl:template name="reducedotdotpath"><xsl:param name="file"/>
+	<xsl:choose>
+		<xsl:when test="starts-with($file,'../')">
+			<xsl:text>../</xsl:text>
+			<xsl:call-template name="reducedotdotpath">
+        		<xsl:with-param name="file" select="substring($file,4)"/>
+			</xsl:call-template>
+		</xsl:when>
+		<xsl:when test="contains($file,'/../')">							
+			<xsl:call-template name="reducepath">
+        		<xsl:with-param name="file">
+			        <xsl:call-template name="lastbefore">
+			                <xsl:with-param name="string" select="substring-before($file,'/../')"/>
+			        </xsl:call-template>
+			        <xsl:text>/</xsl:text>
+					<xsl:value-of select="substring-after($file,'/../')"/>
+				</xsl:with-param>
+			</xsl:call-template>
+		</xsl:when>
+		<xsl:otherwise><xsl:value-of select="$file"/></xsl:otherwise>
+	</xsl:choose>
+ </xsl:template>
+
+<xsl:template name="reducedotpath"><xsl:param name="file"/>
+	<xsl:choose>	
+		<xsl:when test="starts-with($file,'./')">
+			<xsl:call-template name="reducedotpath">
+        		<xsl:with-param name="file" select="substring($file,3)"/>
+			</xsl:call-template>
+		</xsl:when>
+		<xsl:when test="contains($file,'/./')">
+			<xsl:call-template name="reducepath">
+        		<xsl:with-param name="file">
+	                <xsl:value-of select="substring-before($file,'/./')"/>
+			        <xsl:text>/</xsl:text>
+					<xsl:value-of select="substring-after($file,'/./')"/>
+				</xsl:with-param>
+			</xsl:call-template>
+		</xsl:when>
+		<xsl:otherwise><xsl:value-of select="$file"/></xsl:otherwise>
+	</xsl:choose>
+ </xsl:template>
+
+
+</xsl:stylesheet>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/data/sf/os/buildtools/bldsystemtools/buildsystemtools/joinsysdef.xsl	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : joinsysdef.xsl 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ 	<xsl:output method="xml" indent="yes"/>
+<!-- create a stand-alone sysdef from a linked set of fragments -->
+
+<xsl:param name="path">/os/deviceplatformrelease/foundation_system/system_model/system_definition.xml</xsl:param>
+
+<xsl:template match="/*">
+	<xsl:apply-templates select="." mode="join"/>
+</xsl:template>
+
+
+<xsl:template match="/SystemDefinition[systemModel]">
+<xsl:apply-templates select="." mode="join">
+	<xsl:with-param name="filename" select="$path"/>
+</xsl:apply-templates>
+</xsl:template>
+
+
+
+
+<xsl:include href="joinsysdef-module.xsl"/>
+
+</xsl:stylesheet>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/data/sf/os/buildtools/bldsystemtools/buildsystemtools/mergesysdef-module.xsl	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,513 @@
+<!-- 
+============================================================================ 
+Name        : mergesysdef-module.xsl 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common"  exclude-result-prefixes="exslt">
+	
+<!--  this merge only two files according to the 3.0.0 rules. Old syntax not supported. Must be converetd before calling -->
+<xsl:variable name="defaultns">http://www.symbian.org/system-definition</xsl:variable>
+
+<xsl:template match="/SystemDefinition[starts-with(@schema,'2.') or starts-with(@schema,'1.')]" priority="2" mode="merge-models">
+	<xsl:message terminate="yes">Syntax <xsl:value-of select="@schema"/> not supported</xsl:message>
+</xsl:template>
+<xsl:template match="/SystemDefinition[not(systemModel)]" priority="2" mode="merge-models">
+	<xsl:message terminate="yes">Can only merge stand-alone system models</xsl:message>
+</xsl:template>
+
+<!-- stuff for dealing with namespaces -->
+
+
+<xsl:template match="node()|@*" mode="translate-namespaces"><xsl:copy-of select="."/></xsl:template>
+<!-- don't translate meta or unit tags, just copy verbatim -->
+<xsl:template match="meta|unit" mode="translate-namespaces" priority="2">
+<xsl:element name="{name()}">
+<xsl:copy-of select="@*|*|comment()"/>
+</xsl:element>
+</xsl:template>
+
+<xsl:template match="*" mode="translate-namespaces"><xsl:param name="nsdoc"/>
+<xsl:element name="{name()}">
+<xsl:apply-templates select="@*|node()" mode="translate-namespaces">
+	<xsl:with-param name="nsdoc" select="$nsdoc"/>
+</xsl:apply-templates>
+</xsl:element>
+</xsl:template>
+
+
+<xsl:template match="@id|@before" mode="translate-namespaces"><xsl:param name="nsdoc"/>
+	<xsl:attribute name="{name()}">
+		<xsl:variable name="id">
+			<xsl:choose>
+				<xsl:when test="contains(.,':')">
+					<xsl:value-of select="substring-after(.,':')"/>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:value-of select="."/>
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:variable>
+		<xsl:variable name="ns">
+			<xsl:choose>
+				<xsl:when test="contains(.,':')">
+					<xsl:value-of select="ancestor-or-self::*/namespace::*[name()=substring-before(current()/.,':')]"/>
+				</xsl:when>
+				<xsl:when test="/SystemDefinition/@id-namespace">
+					<xsl:value-of select="/SystemDefinition/@id-namespace"/>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:value-of select="$defaultns"/>
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:variable>
+		<xsl:choose>
+			<xsl:when test="not($nsdoc/@id-namespace) and $defaultns=$ns">
+				<xsl:value-of select="$id"/>
+			</xsl:when>
+			<xsl:when test="$nsdoc/@id-namespace=$ns">
+				<xsl:value-of select="$id"/>
+			</xsl:when>
+			<xsl:when test="$nsdoc/namespace::*[.=$ns]">
+				<xsl:value-of select="concat(name($nsdoc/namespace::*[.=$ns]),':',$id)"/>
+			</xsl:when>
+			<xsl:when test="/SystemDefinition/@id-namespace=$ns">
+				<xsl:variable name="myns">
+					<xsl:apply-templates mode="ns-prefix" select="$nsdoc">
+						<xsl:with-param name="ns" select="$ns"/>
+					</xsl:apply-templates>
+				</xsl:variable>			
+				<xsl:value-of select="concat($myns,':',$id)"/>
+			</xsl:when>
+			<xsl:otherwise> <!-- some namespace that needed to be defined --> 
+			<xsl:message>"<xsl:value-of select="$ns"/>" for <xsl:value-of select="$id"/></xsl:message>
+				<xsl:value-of select="."/>					
+			</xsl:otherwise>
+		</xsl:choose>		
+	</xsl:attribute>
+</xsl:template>
+
+<xsl:template match="/SystemDefinition" mode="ns-prefix">
+	<xsl:param name="ns"/> <!-- the namespace URI -->
+	<xsl:param name="pre"/> <!-- the preferred prefix to use if possbile -->
+	<xsl:param name="dontuse"/> <!-- space prefixed, separated and terminated list of namespace prefixes to not use -->
+	<xsl:param name="chars">ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz</xsl:param> <!-- single letter namespace prefixes to try -->
+	<xsl:variable name="name" select="substring(substring-after($ns,'http://www.'),1,1)"/>
+	<xsl:choose>
+		<xsl:when test="$pre!='' and $pre!='id-namespace' and not(//namespace::*[name()=$pre]) and not(contains($dontuse,concat(' ',$pre,' ')))">
+			<xsl:value-of select="$pre"/>
+		</xsl:when>
+		<xsl:when test="$ns='' and $chars=''">
+			<xsl:message terminate="yes">Cannot create namespace prefix for downstream default namespace</xsl:message>
+		</xsl:when>
+		<xsl:when test="$name!='' and not(contains($dontuse,concat(' ',$name,' ')))"><xsl:value-of select="$name"/></xsl:when>
+		<xsl:when test="namespace::*[name()=substring($chars,1,1)] or contains($dontuse,concat(' ',substring($chars,1,1),' '))">
+			<xsl:apply-templates mode="ns-prefix">
+				<xsl:with-param name="chars" select="substring($chars,2)"/>
+			</xsl:apply-templates>
+		</xsl:when>
+		<xsl:otherwise>
+			<xsl:value-of select="substring($chars,1,1)"/>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+
+<!--  need to make sure this handles <meta> correctly -->
+
+<xsl:template match="/SystemDefinition" mode="merge-models">
+	<xsl:param name="other"/>	<!-- the downstream SystemDefinition this is merged with -->
+	<xsl:param name="up" select="systemModel"/>	<!-- the element containing the origin @name used for any component from "this" model. -->
+	<xsl:param name="down" select="$other/systemModel"/> <!-- the element containing origin @name used for any component from $other model. -->
+	
+	<!-- do some testing -->
+ 	<xsl:if test="$other[starts-with(@schema,'2.') or starts-with(@schema,'1.')]">
+		<xsl:message terminate="yes">Syntax <xsl:value-of select="$other/@schema"/> not supported</xsl:message>
+	</xsl:if>
+	<xsl:if test="not($other/systemModel)">
+		<xsl:message terminate="yes">Can only merge stand-alone system models</xsl:message>
+	</xsl:if>
+	 
+	<xsl:copy>
+		<xsl:copy-of  select="@*"/> <!--  use attributes from origin model -->
+		<xsl:variable name="namespaces">
+			<xsl:copy> <!-- needs <copy> so the processor doesn't lose the namespaces -->
+				<!--copy namespaces as needed -->
+				
+				<xsl:copy-of select="namespace::*[name()!='xml']"/> <!-- all upstream namespaces -->
+
+				<xsl:variable name="cur" select="."/>
+				<xsl:for-each select="$other/namespace::*"> <!-- all namespaces in downstream not already in upstream -->
+					<xsl:if test="not((. = $cur/@id-namespace) or (not($cur/@id-namespace) and .= $defaultns) or  $cur/namespace::*[.=current()])">
+							<!-- namespace in downstream not in upstream doc -->
+							<xsl:variable name="newprefix">
+								 <!-- test to see if the ns prefix already exists -->
+								<xsl:apply-templates select="$cur" mode="ns-prefix">
+									<xsl:with-param name="ns" select="."/>
+									<xsl:with-param name="pre" select="name()"/>
+								</xsl:apply-templates>
+							</xsl:variable>
+							<xsl:copy/>
+					</xsl:if>   
+				</xsl:for-each>
+				
+					<xsl:if test="not(($other/@id-namespace = @id-namespace) or (not($other/@id-namespace) and not(@id-namespace)) or (not(@id-namespace) and $other/@id-namespace = $defaultns) or namespace::*[.=$other/@id-namespace])">  
+						<!-- default namespace in downstream not in upstream doc -->
+						<!-- need to make created ns a bit more intelligent -->
+						<xsl:attribute name="bar" namespace="{$other/@id-namespace}">
+							<xsl:value-of select="$other/@id-namespace"/>
+						</xsl:attribute>
+				</xsl:if>
+			</xsl:copy>
+		</xsl:variable>
+
+		
+		<!-- copy the namespaces to currently open element (the root one) -->
+		<xsl:copy-of select="namespace::*"/>
+		<xsl:for-each select="$other/namespace::*[.!=current()/namespace::*]"><xsl:copy/></xsl:for-each>
+		<xsl:for-each select="exslt:node-set($namespaces)/*/namespace::*"><xsl:copy/></xsl:for-each>
+	<!-- translate all IDs in downstream doc to use namespaces from upstream doc  
+		This is so much easier than having to propigate this info around while creating the doc-->
+	<xsl:variable name="otherdoc">
+		<xsl:apply-templates mode="translate-namespaces" select="$other">
+			<xsl:with-param name="nsdoc" select="exslt:node-set($namespaces)/* | ."/>
+		</xsl:apply-templates>
+	</xsl:variable>
+		<xsl:apply-templates mode="merge-models">
+			<xsl:with-param name="other" select="exslt:node-set($otherdoc)/*"/>
+			<xsl:with-param name="up" select="$up"/>
+			<xsl:with-param name="down" select="$down"/>
+		</xsl:apply-templates>
+	
+	</xsl:copy>
+</xsl:template>
+
+<xsl:template match="systemModel" mode="merge-models">
+	<xsl:param name="other"/>	<!-- the parent of the downstream systemModel this is merged with -->
+	<xsl:param name="up"/>
+	<xsl:param name="down"/>
+	<xsl:copy><xsl:copy-of  select="@*"/>
+		<!--  copy metas and comments in between meta. Do not try to merge metadata between models -->
+			<xsl:copy-of select="meta | $other/systemModel/meta | comment()[following-sibling::meta]"/>	
+		<xsl:apply-templates mode="merge-models">
+			<xsl:with-param name="other" select="$other/systemModel"/>
+			<xsl:with-param name="up" select="$up"/>
+			<xsl:with-param name="down" select="$down"/>
+		</xsl:apply-templates>
+	</xsl:copy>
+</xsl:template>
+
+<xsl:template match="@*|*|comment()" mode="merge-models"><xsl:copy-of select="."/></xsl:template>
+
+
+<xsl:template match="meta|comment()[following-sibling::meta]" mode="merge-models"/>
+	<!-- copy elesewhere, not here so that metas always appear first-->
+
+
+
+<!-- merge levels attribute via std rules -->
+<xsl:template match="layer/@levels|package/@levels" mode="merge-models">
+	<xsl:param name="other"/><!-- the element contains the other @levels -->
+	<xsl:choose>
+		<!--  if they are the same, or not specified in the other,  just copy -->
+		<xsl:when test=".=$other/@levels or not($other/@levels)"><xsl:copy-of select="."/></xsl:when>
+		<xsl:when test="contains(concat(' ',normalize-space(.),' '),concat(' ',normalize-space($other/@levels),' '))">
+			<!--upstream completely contains downstream, just copy --> 
+			<xsl:copy-of select="."/>
+		</xsl:when>
+		<xsl:when test="contains(concat(' ',normalize-space($other/@levels),' '),concat(' ',normalize-space(.),' '))">
+			<!--  If this is contained is other, then use other-->
+			<xsl:copy-of select="$other/@levels"/>
+		</xsl:when>
+		<xsl:when test="contains($other/@levels,'+')">
+			<!-- if other uses + syntax, then pre/append -->
+			<xsl:variable name="lev">
+				<xsl:value-of select="substring-before($other/@levels,'+')"/>
+				<xsl:value-of select="concat(' ',.,' ')"/>
+				<xsl:value-of select="substring-after($other/@levels,'+')"/>
+			</xsl:variable>
+			<xsl:attribute name="levels"><xsl:value-of select="normalize-space($lev)"/></xsl:attribute>
+		</xsl:when>
+		<xsl:otherwise> <!--  if they differ, use the origin's levels -->
+			<xsl:message>Note: levels differ "<xsl:value-of select="."/>" vs "<xsl:value-of select="$other/@levels"/>"</xsl:message>
+			<xsl:copy-of select="."/>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+<xsl:template name="copy-sorted-content">
+	<xsl:param name="base"/>
+	<xsl:param name="to-sort"/>
+	<xsl:param name="start"/>
+	<xsl:param name="end"/>
+	<xsl:param name="down"/>
+	<xsl:param name="remainder" select="/.."/>
+
+	<xsl:choose>
+		<xsl:when test="not($to-sort)"/>  <!-- nothing left to copy. stop -->
+		<xsl:when test="not($base)"/>  <!-- reached end. stop -->
+		<xsl:when test="$base[1]/@id=$end/following-sibling::*[1]/@id"/> <!-- passed $end. Stop -->
+		<xsl:when test="$base[1]/@id = $to-sort[1]/@id">  <!-- both lists start with same item -->
+			<xsl:if test="$base[1]/@id!=$end/@id"> <!-- not at end, so keep going -->
+				<xsl:call-template name="copy-sorted-content">
+					<xsl:with-param name="base" select="$base[position() != 1]"/>
+					<xsl:with-param name="to-sort" select="$to-sort[position() != 1]"/>
+					<xsl:with-param name="remainder" select="$remainder"/>
+					<xsl:with-param name="start" select="$start"/>
+					<xsl:with-param name="end" select="$end"/>
+					<xsl:with-param name="down" select="$down"/>
+				</xsl:call-template>		
+			</xsl:if>
+		</xsl:when>	
+		<xsl:when test="$remainder[@id = $base[1]/@id]"> <!-- left over item is in $base -->
+			<xsl:call-template name="copy-sorted-content">
+				<xsl:with-param name="base" select="$base[position() != 1]"/>
+				<xsl:with-param name="to-sort" select="$to-sort"/>
+				<xsl:with-param name="remainder" select="$remainder[@id != $base[1]/@id]"/>
+				<xsl:with-param name="start" select="$start"/>
+				<xsl:with-param name="end" select="$end"/>
+				<xsl:with-param name="down" select="$down"/>
+			</xsl:call-template>		
+		</xsl:when>
+		<xsl:when test="not($base[@id = $to-sort[1]/@id])"> <!-- in to-sort, but not base -->		
+			<xsl:if test="$base[1]/@id=$end/@id  and not($base[@id=$to-sort[1]/@before])">
+			 	<!-- if at end, then this needs to be copied
+					don't copy if the before ID is found in $base	-->
+				<xsl:apply-templates mode="merge-copy-of" select="$to-sort[1]">
+					<xsl:with-param name="origin" select="$down"/>
+					<xsl:with-param name="root" select="$end/ancestor::systemModel"/>
+				</xsl:apply-templates>
+			</xsl:if>			
+		<xsl:call-template name="copy-sorted-content">
+			<xsl:with-param name="base" select="$base"/>
+			<xsl:with-param name="to-sort" select="$to-sort[position() != 1]"/>
+			<xsl:with-param name="remainder" select="$remainder"/>
+			<xsl:with-param name="start" select="$start"/>
+			<xsl:with-param name="end" select="$end"/>
+			<xsl:with-param name="down" select="$down"/>
+		</xsl:call-template>		
+		</xsl:when>	
+		<xsl:when test="not($to-sort[@id = $base[1]/@id])"> <!-- in base, but not to-sort -->		
+		<xsl:call-template name="copy-sorted-content">
+			<xsl:with-param name="base" select="$base[position() != 1]"/>
+			<xsl:with-param name="to-sort" select="$to-sort"/>
+			<xsl:with-param name="remainder" select="$remainder"/>
+			<xsl:with-param name="start" select="$start"/>
+			<xsl:with-param name="end" select="$end"/>
+			<xsl:with-param name="down" select="$down"/>
+		</xsl:call-template>		
+		</xsl:when>	
+		<xsl:when test="$base[@id = $to-sort[1]/@id]"> <!-- is in base, but not 1st one-->
+			<xsl:call-template name="copy-sorted-content">
+				<xsl:with-param name="base" select="$base"/>
+				<xsl:with-param name="to-sort" select="$to-sort[position() != 1] "/>
+				<xsl:with-param name="remainder" select="$remainder | $to-sort[1]"/>
+				<xsl:with-param name="start" select="$start"/>
+				<xsl:with-param name="end" select="$end"/>
+				<xsl:with-param name="down" select="$down"/>
+			</xsl:call-template>
+		</xsl:when>	
+	</xsl:choose>
+</xsl:template>
+
+<xsl:template match="layer | package | collection | component" mode="merge-models">
+	<xsl:param name="other"/>	<!-- the downstream item of the parent's rank that contains a potential items this is merged with -->
+	<xsl:param name="up"/>
+	<xsl:param name="down"/>
+	<xsl:variable name="this" select="."/>	<!-- current item -->
+	
+	<!-- match = this item in the downstream model -->	
+	<xsl:variable name="match" select="$other/*[@id=current()/@id]"/>
+	
+	<!-- prev = the previous item before the current one (no metas, only named items)-->
+	<xsl:variable name="prev" select="preceding-sibling::*[@id][1]"/> 
+
+	<!-- copy all items between this and prev  that are solely in the downstream model -->	 		
+
+	<xsl:choose>
+		<xsl:when test="$match and (not($prev) or $other/*[@id= $prev/@id] )">
+			<xsl:call-template name="copy-sorted-content">
+				<xsl:with-param name="base" select="../*[@id]"/>
+				<xsl:with-param name="to-sort" select="$other/*[@id]"/>
+				<xsl:with-param name="start" select="$prev"/>
+				<xsl:with-param name="end" select="."/>
+				<xsl:with-param name="down" select="$down"/>
+			</xsl:call-template>
+		</xsl:when>
+	<xsl:when test="not($match/preceding-sibling::*[@id=$this/../*/@id]) and $other/*[@id= current()/@id]/preceding-sibling::*[@id and not(@before)]">
+		<!-- if this is the first item in other that's also in this, then put all new items from other here -->
+		<xsl:apply-templates mode="merge-copy-of" select="$match/preceding-sibling::*[@id and not(@before)]">
+			<xsl:with-param name="origin" select="$down"/>
+			<xsl:with-param name="root" select="$this/ancestor::systemModel"/>	
+		</xsl:apply-templates>
+	</xsl:when>
+	</xsl:choose>
+
+ 	<!-- just copy anything identified as being before this, assume they're all ok -->
+	<xsl:apply-templates mode="merge-copy-of" select="$other/*[@before=current()/@id]">
+		<xsl:with-param name="remove-before" select="1"/>
+		<xsl:with-param name="origin" select="$down"/>
+		<xsl:with-param name="root" select="$this/ancestor::systemModel"/>	
+	</xsl:apply-templates>
+
+	
+	<xsl:copy>
+		<xsl:apply-templates select="@*" mode="merge-models"> <!-- copy upstream attributes -->
+			<xsl:with-param name="other" select="$match"/>
+		</xsl:apply-templates>
+		
+		<xsl:if test="self::component and not(@origin-model) and $up/@name">
+			<!-- insert origin-model and optional root for components only -->
+			<xsl:attribute name="origin-model">
+				<xsl:value-of select="$up/@name"/>
+			</xsl:attribute>
+			<xsl:if test="not(@root)">
+				<xsl:copy-of select="$up/@root"/>
+			</xsl:if>
+		</xsl:if>
+		
+		<xsl:for-each select="$match/@*">  <!-- copy downstream attributes, only if not set on upstream -->
+			<xsl:if test="not($this/@*[name()=name(current())])"><xsl:copy-of select="."/></xsl:if>
+		</xsl:for-each>
+		
+		<xsl:choose>
+			<xsl:when test="self::component">
+				<!-- copy all units, metas and comments from this
+					copy all metas in the merged component
+					copy any new comments in the merged component (not duplicates)
+					if there are no units in the this, copy all units in the merged component
+					if there are units in this, copy only the versioned units in the merged component (only those versions not already specified) -->
+				<xsl:copy-of select="*|comment() | $match/meta |$match/unit[not($this/unit)] | $match/unit[$this/unit and @version[.!=$this/unit/@version]] | $match/comment()[.!=$this/comment()]"/>				
+			</xsl:when>
+			<xsl:otherwise>
+
+				<!--  copy metas and comments in between meta. Do not try to merge metadata between models -->
+				<xsl:copy-of select="meta | $match/meta | comment()[following-sibling::meta]"/>
+				
+				<xsl:apply-templates mode="merge-models">
+					<xsl:with-param name="other" select="$match"/>
+					<xsl:with-param name="up" select="$up"/>
+					<xsl:with-param name="down" select="$down"/>
+				</xsl:apply-templates>
+				<!--  don't copy if explicitly or implicitly placed already-->
+				<xsl:for-each select="$match/*[not(@before) and not(following-sibling::*[@id=$this/*/@id])]">
+					<xsl:if test="not($this/*[@id=current()/@id])">
+						<xsl:apply-templates mode="merge-copy-of" select=".">
+							<xsl:with-param name="origin" select="$down"/>
+							<xsl:with-param name="root" select="$this/ancestor::systemModel"/>			
+						</xsl:apply-templates>
+					</xsl:if>
+				</xsl:for-each>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:copy>
+	
+	<xsl:if test="self::layer and not(following-sibling::layer)">
+		<!-- for the last layer, tack on any remaining layers -->
+		<xsl:apply-templates mode="merge-copy-of" select="$other/layer[not(@before) and not(following-sibling::*[@id=$this/../layer/@id]) and not(@id=$this/@id)]">
+			<xsl:with-param name="origin" select="$down"/>
+			<xsl:with-param name="root" select="$this/ancestor::systemModel"/>			
+		</xsl:apply-templates>		
+	</xsl:if>
+</xsl:template>
+
+
+
+<xsl:template match="*" mode="merge-copy-of">
+	<xsl:param name="remove-before" select="0"/> <!-- set to true if any before attribute is to be removed -->
+	<xsl:param name="origin"/>	<!--the element containing the @name to use the origin-model attribute  -->
+	<xsl:param name="root"/> 	<!--the systemModel element in the upstream doc  -->
+
+	<xsl:choose>
+		<!-- this might slow things down, consider making optional -->
+		<xsl:when test="not(self::layer) and count($root/descendant::*[name()=name(current()/..) and @id!=current()/../@id]/*[@id=current()/@id])">
+			<xsl:message>Warning: <xsl:value-of select="name()"/> "<xsl:value-of select="@id"/>" moved in downstream model. Ignoring moved <xsl:value-of select="name()"/>
+				<xsl:text>&#xa;</xsl:text>
+			</xsl:message>
+		</xsl:when>
+		<xsl:otherwise>
+			<!-- save all content in a variable to test to see if it's got any problems (ie been removed due to errors)-->
+			<xsl:variable name="content">
+				<xsl:apply-templates select="*|comment()" mode="merge-copy-of">
+					<xsl:with-param name="origin" select="$origin"/>
+					<xsl:with-param name="root" select="$root"/>
+				</xsl:apply-templates>
+			</xsl:variable>
+			<xsl:choose>
+				<!-- if all elements in this have been deleted, throw out this element -->
+				<xsl:when test="not(exslt:node-set($content)/*) and *">
+					<xsl:message>Warning: All content in downstream <xsl:value-of select="name()"/> "<xsl:value-of select="@id"/>" is invalid. Ignoring <xsl:value-of select="name()"/>
+						<xsl:text>&#xa;</xsl:text>
+					</xsl:message>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:copy>
+						<xsl:choose>
+							<xsl:when test="$remove-before">
+								<xsl:copy-of select="@*[name()!='before']"/>
+							</xsl:when>
+							<xsl:otherwise><xsl:copy-of select="@*"/></xsl:otherwise>
+						</xsl:choose>
+						<xsl:copy-of select="exslt:node-set($content)"/>
+					</xsl:copy>
+				</xsl:otherwise>
+			</xsl:choose>					
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+
+<xsl:template match="comment()|@*" mode="merge-copy-of">
+	<xsl:copy-of select="."/>
+</xsl:template>
+
+<xsl:template match="component" mode="merge-copy-of">
+	<xsl:param name="remove-before" select="0"/> <!-- set to true if any before attribute is to be removed -->
+	<xsl:param name="origin"/>	<!--the element containing the @name to use the origin-model attribute  -->
+	<xsl:param name="root"/> 	<!--the systemModel element in the upstream doc  -->
+	
+	<xsl:choose>
+		<!-- this might slow things down, consider making optional -->
+		<xsl:when test="$root/descendant::collection[@id!=current()/../@id]/component[@id=current()/@id]">
+			<xsl:message>Warning: <xsl:value-of select="name()"/> "<xsl:value-of select="@id"/>" moved in downstream model. Ignoring moved <xsl:value-of select="name()"/>
+				<xsl:text>&#xa;</xsl:text>
+			</xsl:message>
+		</xsl:when>
+		<xsl:otherwise>
+			<xsl:copy>
+				<xsl:choose>
+					<xsl:when test="$remove-before">
+						<xsl:copy-of select="@*[name()!='before']"/>
+					</xsl:when>
+					<xsl:otherwise><xsl:copy-of select="@*"/></xsl:otherwise>
+				</xsl:choose>
+				<xsl:if test="not(@origin-model) and $origin/@name">
+					<xsl:attribute name="origin-model">
+						<xsl:value-of select="$origin/@name"/>
+					</xsl:attribute>
+					<xsl:if test="not(@root)">
+						<xsl:copy-of select="$origin/@root"/>
+					</xsl:if>
+				</xsl:if>
+				<xsl:copy-of select="*|comment()"/>
+			</xsl:copy>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/data/sf/os/buildtools/bldsystemtools/buildsystemtools/mergesysdef.xsl	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,107 @@
+<!-- 
+============================================================================ 
+Name        : mergesysdef.xsl 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common">
+	<xsl:output method="xml" indent="yes"/>
+	<xsl:param name="Downstream">mcl/System_Definition_Template.xml</xsl:param>
+	 <xsl:key name="origin" match="component" use="@origin-model"/>
+
+<!-- only supports 3.x syntax and only operates on stand-alone models -->
+
+<xsl:variable name="downstream" select="document($Downstream,.)/SystemDefinition"/>
+<xsl:param name="upname">
+	<xsl:choose>
+		<xsl:when test="$downstream[starts-with(@schema,'2.') or starts-with(@schema,'1.')  or not(systemModel)]">
+			<xsl:message terminate="yes">Syntax <xsl:value-of select="@schema"/> not supported</xsl:message>
+		</xsl:when>
+		<xsl:when test="/SystemDefinition/systemModel/@name=$downstream/systemModel/@name">
+			<xsl:apply-templates mode="origin-term" select="/*">
+				<xsl:with-param name="root">Upstream</xsl:with-param>
+			</xsl:apply-templates>
+			</xsl:when>
+		<xsl:otherwise><xsl:value-of select="/SystemDefinition/systemModel/@name"/></xsl:otherwise>
+	</xsl:choose>
+</xsl:param>
+
+<xsl:param name="downname">
+	<xsl:choose>
+		<xsl:when test="/SystemDefinition/systemModel/@name=$downstream/systemModel/@name">
+			<xsl:apply-templates mode="origin-term" select="$downstream">	
+				<xsl:with-param name="root">Downstream</xsl:with-param>
+			</xsl:apply-templates>
+			</xsl:when>
+		<xsl:otherwise><xsl:value-of select="$downstream/systemModel/@name"/></xsl:otherwise>
+	</xsl:choose>
+</xsl:param>
+
+<xsl:template mode="origin-term" match="*">
+	<xsl:param name="root"/>
+	<xsl:param name="index"/>
+	<xsl:choose>
+		<xsl:when test="not(key('origin',concat($root,$index)))">
+			<xsl:value-of select="concat($root,$index)"/>
+		</xsl:when>
+		<xsl:when test="$index=''">
+			<xsl:apply-templates mode="origin-term" select=".">	
+				<xsl:with-param name="root" select="$root"/>
+				<xsl:with-param name="index" select="1"/>
+			</xsl:apply-templates>
+		</xsl:when>
+		<xsl:otherwise>
+			<xsl:apply-templates mode="origin-term" select=".">	
+				<xsl:with-param name="root" select="$root"/>
+				<xsl:with-param name="index" select="$index + 1"/>
+			</xsl:apply-templates>		
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+
+<!--  this merge only two files according to the 3.0.0 rules. Old syntax not supported. Must be converetd before calling -->
+
+
+
+<xsl:template match="/*">
+	<xsl:variable name="upmodel">
+		<sysdef name="{$upname}"/>
+	</xsl:variable>
+	<xsl:variable name="downmodel">
+		<sysdef name="{$downname}"/>
+	</xsl:variable>
+	
+	<xsl:choose>
+		<xsl:when test="function-available('exslt:node-set')">
+			<xsl:apply-templates mode="merge-models" select=".">
+				<xsl:with-param name="other" select="$downstream"/>
+				<xsl:with-param name="up" select="exslt:node-set($upmodel)/sysdef"/>
+				<xsl:with-param name="down" select="exslt:node-set($downmodel)/sysdef"/>
+			</xsl:apply-templates>
+		</xsl:when>
+		<xsl:otherwise> <!-- no node set funcion, so don't bother setting the names -->
+			<xsl:apply-templates mode="merge-models" select=".">
+				<xsl:with-param name="other" select="$downstream"/>
+			</xsl:apply-templates> 		
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+<xsl:include href="mergesysdef-module.xsl"/>
+</xsl:stylesheet>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/demo/data/sf/os/buildtools/bldsystemtools/buildsystemtools/sysdefdowngrade.xsl	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,397 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : sysdefdowngrade.xsl 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+	<xsl:output method="xml" indent="yes"/>
+	
+	<xsl:param name="Path">os/deviceplatformrelease/foundation_system/system_model</xsl:param>
+	<!-- $Path is the location of the root system definition XML file. Must not end in /
+		This is used to compute the absolute paths the 2.0 syntax needs-->
+	<xsl:param name="Root"/> <!-- space separated list of root variables in the form "VAR1=value1 VAR=value2" --> 
+	<xsl:variable name="root" select="concat(' ',$Root,' ')"/> <!-- sort of hack to allow absolute paths in downgraded output -->
+	<xsl:variable name="srcroot" select="substring-before(substring-after($root,' SRCROOT='),' ')"/> <!-- the default path prefix -->
+
+<xsl:template match="/*">
+	<xsl:message terminate="yes">Cannot process this document</xsl:message>
+</xsl:template>
+
+<!-- can only handle 3.0.0 to 2.0.1 transforms
+	Assumes only packages are using href
+ -->
+<xsl:template match="/SystemDefinition[@schema='3.0.0']"> 
+	<!-- process root system definition or package definition-->
+	<xsl:call-template name="DTD"/> <!-- insert 2.0.01 DTD -->
+  <SystemDefinition name="{*/@name}" schema="2.0.1">
+  	<xsl:apply-templates select="*|comment()"/>
+  </SystemDefinition>
+</xsl:template>
+
+<xsl:template match="/SystemDefinition[@schema='3.0.0' and systemModel]"> 
+	<xsl:call-template name="DTD"/> <!-- insert 2.0.01 DTD -->
+  <SystemDefinition name="{systemModel/@name}" schema="2.0.1">
+  	<xsl:apply-templates select="*|comment()"/>
+  </SystemDefinition>
+</xsl:template>
+
+<xsl:template match="/SystemDefinition/package[@href]" priority="2">
+	<xsl:message terminate="yes">Package definition cannot link another package</xsl:message>
+</xsl:template>
+
+<xsl:template match="/SystemDefinition/package" priority="1">
+	<!-- process package definition file--> 
+  <systemModel>
+  	<layer name="anonymous"> <!-- fake layer -->
+		<block>
+			<xsl:apply-templates mode="copy" select="@id|@name|@span|@level|@levels"/><!--  valid attribuites for 2.0 -->
+		  	<xsl:apply-templates select="*|comment()">
+		  		<xsl:with-param name="path" select="concat($Path,'/')"/> <!-- need to keep tack of where the current document is -->
+		  	</xsl:apply-templates>			
+		</block>  
+   	</layer>
+  </systemModel>
+</xsl:template>
+
+
+
+<xsl:template match="/"><xsl:apply-templates select="*"/></xsl:template>
+<xsl:template match="@*|comment()"><xsl:copy-of select="."/></xsl:template> 
+	<!-- comments are copied verbatim. Attribtues are copied by default -->
+
+<xsl:template match="systemModel">
+	<systemModel>
+  	<xsl:apply-templates select="*|comment()"> <!-- no attributes -->
+  		<xsl:with-param name="path" select="$Path"/> <!-- need to keep tack of where the current document is -->
+  	</xsl:apply-templates>
+	</systemModel>
+</xsl:template>
+
+<xsl:template mode="copy" match="@*">
+	<xsl:copy-of select="."/>
+</xsl:template>
+
+<xsl:template mode="copy" match="@id"> <!-- id in 3.0 is name in 2.0 -->
+	<xsl:attribute name="name"><xsl:value-of select="."/></xsl:attribute>
+</xsl:template>
+
+<xsl:template mode="copy" match="@name">  <!-- name in 3.0 is long-name in 2.0.1 -->
+	<xsl:if test=".!=../@id"> <!-- don't bother if it will be the same as name -->
+		<xsl:attribute name="long-name"><xsl:value-of select="."/></xsl:attribute>
+	</xsl:if>
+</xsl:template>
+	
+<xsl:template match="layer"><xsl:param name="path"/>
+	<layer>
+		<xsl:apply-templates mode="copy" select="@id|@name|@span|@levels"/> <!--  valid attribuites for 2.0 -->
+		<xsl:apply-templates select="*|comment()"> 
+			<xsl:with-param name="path" select="$path"/> 
+		</xsl:apply-templates>
+	</layer>
+</xsl:template>
+
+<xsl:template match="layer/package"><!-- translates to block -->
+	<xsl:param name="path"/>
+	<block>
+		<xsl:apply-templates mode="copy" select="@id|@name|@span|@level|@levels"/><!--  valid attribuites for 2.0 -->
+		<xsl:choose>
+			<xsl:when test="@href">
+				<xsl:variable name="this" select="."/>
+				<xsl:for-each select="document(@href,.)/SystemDefinition/*">
+					<xsl:variable name="my-id"><xsl:apply-templates mode="normalize-id" select="@id"/></xsl:variable>
+					<xsl:variable name="other-id"><xsl:apply-templates mode="normalize-id" select="$this/@id"/></xsl:variable>
+					<xsl:if test="$my-id != $other-id">
+						<xsl:message terminate="yes">Error: IDs do not match: <xsl:value-of select="$my-id"/> vs <xsl:value-of select="$other-id"/></xsl:message>
+					</xsl:if>
+					<xsl:if test="@name and @name!=@id and not($this/@name and $this/@name=$this/@id)">
+						<!-- set long-name only if name is different from the id and not set in child doc -->
+						<xsl:attribute name="long-name"><xsl:value-of select="@name"/></xsl:attribute>
+					</xsl:if>						
+					<xsl:for-each select="@span|@levels|@level">
+						<!-- copy only if not set in child doc -->
+						<xsl:if test="not(this/@*[name()=name(current())])">
+							<xsl:copy-of select="."/>
+						</xsl:if>
+					</xsl:for-each>
+					<xsl:apply-templates select="*|comment()">
+	  					<xsl:with-param name="path">
+	  						<xsl:call-template name="normpath">
+	  							<xsl:with-param name="path" select="concat($path,'/',$this/@href)"/>
+	  						</xsl:call-template>
+	  					</xsl:with-param> 
+	  				</xsl:apply-templates>
+				</xsl:for-each>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:apply-templates select="*|comment()">
+  					<xsl:with-param name="path" select="$path"/> 
+  				</xsl:apply-templates>
+			</xsl:otherwise>
+		</xsl:choose>
+	</block>
+</xsl:template>
+
+<xsl:template match="package/package">	<!-- translates to subblock --><xsl:param name="path"/>
+	<subblock>
+		<xsl:apply-templates mode="copy" select="@id|@name"/>
+		<xsl:apply-templates select="*|comment()">
+			<xsl:with-param name="path" select="$path"/> 
+		</xsl:apply-templates>
+	</subblock>
+</xsl:template>
+
+<xsl:template match="package/package/pacakge"> <!-- cannot nest this deep --><xsl:param name="path"/>
+	<xsl:message>Excessive nesting of packages: Ignoring <xsl:value-of select="@id"/></xsl:message>
+	<xsl:apply-templates select="*|comment()">
+		<xsl:with-param name="path" select="$path"/> 
+	</xsl:apply-templates>
+</xsl:template>
+
+
+<xsl:template match="collection"><xsl:param name="path"/>
+	<collection>
+		<xsl:apply-templates mode="copy" select="@id|@name|@level"/>
+		<xsl:apply-templates select="*|comment()">
+			<xsl:with-param name="path" select="$path"/> 
+		</xsl:apply-templates>
+	</collection>
+</xsl:template>
+
+
+<xsl:template match="component"><xsl:param name="path"/>
+	<component>
+		<xsl:apply-templates mode="copy" select="@id|@name|@deprecated|@introduced|@filter|@purpose"/>
+		<xsl:if test="contains(concat(' ',@class,' '),' plugin ')">
+			<xsl:attribute name="plugin">Y</xsl:attribute>
+		</xsl:if>
+		<xsl:call-template name="class">
+			<xsl:with-param name="remove">plugin</xsl:with-param>
+			<xsl:with-param name="add">
+				<xsl:if test="not(*) and comment()">placeholder</xsl:if>
+				<xsl:if test="@target='desktop'"> PC</xsl:if>
+			</xsl:with-param>
+		</xsl:call-template>
+	  	<xsl:apply-templates select="*|comment()">
+			<xsl:with-param name="path" select="$path"/> 
+		</xsl:apply-templates>
+	</component>
+</xsl:template>
+
+<xsl:template match="unit[@base and not(@mrp or @bldFile)]"/>
+
+<xsl:template match="unit"><xsl:param name="path"/>
+	<unit>
+		<xsl:apply-templates select="@mrp|@bldFile|@late">
+			<xsl:with-param name="path" select="$path"/> 
+		</xsl:apply-templates>
+		<xsl:copy-of select="@filter|@root[not(contains($root,concat(' ',.,'=')))]|@version|@prebuilt|@priority"/>
+	</unit>
+</xsl:template>
+
+<xsl:template match="unit/@late"> <!-- 2.0 uses Y/N, 3.0 uses yes/no -->
+	<xsl:attribute name="{name()}">
+		<xsl:choose>
+			<xsl:when test=".='yes'">Y</xsl:when>
+			<xsl:when test=".='no'">N</xsl:when>
+		</xsl:choose>
+	</xsl:attribute>
+</xsl:template>
+
+<xsl:template match="@mrp|@bldFile"><xsl:param name="path"/>
+	<xsl:attribute name="{name()}">
+		<xsl:choose>
+			<xsl:when test="../@root">
+				<xsl:variable name="pre" select="substring-before(substring-after($root,concat(' ',../@root,'=')),' ')"/>
+				<xsl:if test="$pre!=''"><xsl:value-of select="concat($pre,'/')"/></xsl:if>
+			</xsl:when>
+			<xsl:when test="$srcroot!=''">
+				<xsl:value-of select="concat($srcroot,'/')"/>
+			</xsl:when>
+		</xsl:choose>
+		<xsl:choose>
+		<xsl:when test="starts-with(.,'/')"> <!-- keep absolute paths verbatim (barring the leading / ) -->
+			<xsl:value-of select="substring-after(.,'/')"/>
+		</xsl:when>
+		<xsl:otherwise>	
+			<xsl:call-template name="normpath">
+  				<xsl:with-param name="path">
+  					<xsl:call-template name="before">
+						<xsl:with-param name="text" select="$path"/>
+					</xsl:call-template>
+					<xsl:value-of select="."/>
+  				</xsl:with-param>
+  			</xsl:call-template>
+		</xsl:otherwise>
+	</xsl:choose>
+	</xsl:attribute>
+</xsl:template>
+
+<xsl:template match="meta"/> <!-- strip all meta tags -->
+
+<xsl:template match="meta[info/@contract]"> <!-- except contract -->
+	<xsl:copy-of select="info/@contract"/>
+</xsl:template>
+
+<xsl:template match="@id" mode="normalize-id">
+	<xsl:choose>
+		<xsl:when test="contains(@id,':')"><xsl:value-of select="substring-after(@id,':')"/></xsl:when>
+		<xsl:otherwise><xsl:value-of select="@id"/></xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+<xsl:template name="class"><xsl:param name="remove"/><xsl:param name="add"/>
+<!--  returns the value of the class attribute with the space-separated list of names in $remove taken out and those in $add added on (does not check for duplicates) -->
+	<xsl:param name="class" select="normalize-space(@class)"/>
+	<xsl:variable name="r">
+		<xsl:text> </xsl:text>
+		<xsl:choose>
+			<xsl:when test="contains($remove,' ')"><xsl:value-of select="substring-before($remove,' ')"/></xsl:when>
+			<xsl:otherwise><xsl:value-of select="$remove"/></xsl:otherwise>
+		</xsl:choose>
+		<xsl:text> </xsl:text>
+	</xsl:variable>
+	<xsl:variable name="c">
+		<xsl:choose>
+			<xsl:when test="contains(concat(' ',$class,' '),$r)">
+				<xsl:value-of select="substring-before(concat(' ',$class,' '),$r)"/>
+				<xsl:text> </xsl:text>
+				<xsl:value-of select="substring-after(concat(' ',$class,' '),$r)"/>
+			</xsl:when>
+			<xsl:otherwise><xsl:value-of select="$class"/></xsl:otherwise>
+		</xsl:choose>
+		<xsl:if test="normalize-space($add)!=''"><xsl:value-of select="concat(' ',normalize-space($add))"/></xsl:if>
+	</xsl:variable>
+	<xsl:choose>
+		<xsl:when test="contains($remove,' ')">
+			<xsl:call-template name="class">
+				<xsl:with-param name="remove" select="substring-after($remove,' ')"/>
+				<xsl:with-param name="class" select="$c"/>
+			</xsl:call-template>
+		</xsl:when>
+		<xsl:when test="normalize-space($c)!=''">
+			<xsl:attribute name="class">
+				<xsl:value-of select="normalize-space($c)"/>
+			</xsl:attribute>
+		</xsl:when>
+	</xsl:choose>
+</xsl:template>
+
+<xsl:template name="normpath"><xsl:param name="path"/>
+<!-- normalize out any ".." in the path in $path  -->
+<xsl:choose>
+	<xsl:when test="contains($path,'/../')">
+	<xsl:call-template name="normpath">
+		<xsl:with-param name="path">
+		<xsl:call-template name="before">
+			<xsl:with-param name="text" select="substring-before($path,'/../')"/>
+		</xsl:call-template>
+		<xsl:value-of select="substring-after($path,'/../')"/>
+		</xsl:with-param>
+		</xsl:call-template>
+	</xsl:when>
+	<xsl:otherwise><xsl:value-of select="$path"/></xsl:otherwise>
+</xsl:choose>
+</xsl:template>
+
+<!-- return all text before the last / -->
+<xsl:template name="before"><xsl:param name="text"/>
+<xsl:if test="contains($text,'/')">
+	<xsl:value-of select="substring-before($text,'/')"/>/<xsl:call-template name="before"><xsl:with-param name="text" select="substring-after($text,'/')"/></xsl:call-template>
+	</xsl:if>
+</xsl:template>
+
+<xsl:template name="DTD">
+<xsl:text disable-output-escaping="yes"><![CDATA[<!DOCTYPE SystemDefinition [
+<!ELEMENT SystemDefinition ( systemModel )>
+<!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED
+>
+<!-- all paths are relative to the environment variable specified by the root attribute, or SOURCEROOT if not.  -->
+
+<!-- System Model Section of DTD -->
+<!ELEMENT systemModel (layer+)>
+
+<!ELEMENT layer (block* | collection*)*>
+<!-- Kernel Services, Base Services, OS Services, Etc -->
+<!ATTLIST layer
+  name CDATA #REQUIRED
+  long-name CDATA #IMPLIED
+  levels NMTOKENS #IMPLIED
+  span CDATA #IMPLIED
+>
+
+<!ELEMENT block (subblock* | collection*)*>
+ <!-- Generic OS services, Comms Services, etc -->
+<!ATTLIST block
+  levels NMTOKENS #IMPLIED
+  span CDATA #IMPLIED
+  level NMTOKEN #IMPLIED
+  name CDATA #REQUIRED
+  long-name CDATA #IMPLIED
+>
+
+<!ELEMENT subblock (collection)*>
+<!-- Cellular Baseband Services, Networking Services, etc -->
+<!ATTLIST subblock
+  name CDATA #REQUIRED
+  long-name CDATA #IMPLIED
+>
+
+<!ELEMENT collection (component)*>
+<!-- Screen Driver, Content Handling, etc -->
+<!ATTLIST collection
+  name CDATA #REQUIRED
+  long-name CDATA #IMPLIED
+  level NMTOKEN #IMPLIED
+>
+
+<!ELEMENT component (unit)*>
+<!-- contains units or is a  package or prebuilt -->
+<!ATTLIST component
+  name CDATA #REQUIRED
+  long-name CDATA #IMPLIED
+  deprecated CDATA #IMPLIED
+  introduced CDATA #IMPLIED
+  contract CDATA #IMPLIED
+  plugin (Y|N) "N"
+  filter CDATA #IMPLIED
+  class NMTOKENS #IMPLIED
+  supports CDATA #IMPLIED
+  purpose ( optional | mandatory | development ) "optional"
+>
+
+<!ELEMENT unit EMPTY >
+<!-- must be buildable (bld.inf) -->
+<!-- bldFile  may someday be removed in favour of mrp -->
+<!ATTLIST unit
+  mrp CDATA #IMPLIED
+  filter CDATA #IMPLIED
+  bldFile CDATA #IMPLIED
+  root CDATA #IMPLIED
+  version NMTOKEN #IMPLIED
+  prebuilt NMTOKEN #IMPLIED
+  late (Y|N) #IMPLIED
+  priority CDATA #IMPLIED
+>
+]>
+]]></xsl:text>
+</xsl:template>
+</xsl:stylesheet>
Binary file buildframework/helium/external/helium-antlib/sysdef/lib/serializer.jar has changed
Binary file buildframework/helium/external/helium-antlib/sysdef/lib/xalan.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/src/com/nokia/helium/sysdef/ant/antlib.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : antlib.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<antlib>
+    <!-- Task definition -->
+    <taskdef name="joinSysdef" classname="com.nokia.helium.sysdef.ant.taskdefs.JoinTask"/>
+    <taskdef name="mergeSysdef" classname="com.nokia.helium.sysdef.ant.taskdefs.MergeTask"/>
+    <taskdef name="downgradeSysdef" classname="com.nokia.helium.sysdef.ant.taskdefs.DowngradeTask"/>
+    
+    <!-- Type definition -->
+</antlib>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/src/com/nokia/helium/sysdef/ant/helium.antlib.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : helium.antlib.xml 
+Part of     : Helium Antlib 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="libs-sysdef" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Ant task definition declarations.
+    </description>    
+    <taskdef resource="com/nokia/helium/sysdef/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/src/com/nokia/helium/sysdef/ant/taskdefs/AbstractSydefTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,237 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.sysdef.ant.taskdefs;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Map;
+
+import javax.xml.transform.ErrorListener;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+
+/**
+ * This is the base class for manipulating Sysdef v3 files using XML Stylesheet. 
+ * The implementation/interface is not frozen yet. It is morelikely going to
+ * change in the future, depending of the underlaying implementation.
+ * 
+ */
+public abstract class AbstractSydefTask extends Task implements ErrorListener {
+
+    private File srcFile;
+    private File destFile;
+    private File epocroot;
+    private boolean failOnError = true;
+    
+    /**
+     * Get the source file.
+     * @return
+     */
+    public File getSrcFile() {
+        return srcFile;
+    }
+
+    /**
+     * Defines the location of the source system definition file. 
+     * @param srcfile
+     * @ant.required
+     */
+    public void setSrcFile(File srcfile) {
+        this.srcFile = srcfile;
+    }
+
+    /**
+     * Get the location of the output file. 
+     * @return
+     */
+    public File getDestFile() {
+        return destFile;
+    }
+
+    /**
+     * The the name of the destination file.
+     * @param destfile
+     * @ant.required
+     */
+    public void setDestFile(File destfile) {
+        this.destFile = destfile;
+    }
+
+    /**
+     * Get the epocroot.
+     * If epocroot is not set by the user it return the value from the EPOCROOT environment variable.
+     * If the EPOCROOT environment variable is not defined then a BuildException is thrown.
+     * @return the epocroot location as a File object.
+     */
+    public File getEpocroot() {
+        if (epocroot == null) {
+            if (System.getenv("EPOCROOT") != null) {
+                return new File(System.getenv("EPOCROOT"));
+            }
+            else {
+                throw new BuildException("'epocroot' attribute has not been defined.");
+            }
+        }
+        return epocroot;
+    }
+
+    /**
+     * Location of the EPOCROOT.
+     * @ant.not-required By default the EPOCROOT environment variable is used.
+     * @param epocroot path to the epocroot.
+     */
+    public void setEpocroot(File epocroot) {
+        this.epocroot = epocroot;
+    }
+
+    /**
+     * Shall we fail the build on error.
+     * @return is the task should failonerror.
+     */
+    public boolean isFailOnError() {
+        return failOnError;
+    }
+
+    /**
+     * Defines if the file should fail on error.
+     * @param failonerror
+     * @ant.not-required Default is true.
+     */
+    public void setFailOnError(boolean failonerror) {
+        this.failOnError = failonerror;
+    }
+
+    /**
+     * This method should be defined by the implementing class
+     * to define the location of the XSLT file.
+     * @return the XSLT file location.
+     */
+    abstract File getXsl();
+    
+    /**
+     * Check if required attribute have been configured correctly.
+     * If not the method will raise a BuildException.
+     */
+    protected void check() {
+        if (srcFile == null) {
+            throw new BuildException("'srcfile' attribute is not defined");
+        }
+        if (destFile == null) {
+            throw new BuildException("'destfile' attribute is not defined");
+        }
+        File xslt = getXsl();
+        if (!xslt.exists()) {
+            throw new BuildException("Could not find " + xslt);
+        }        
+        if (!srcFile.exists()) {
+            throw new BuildException("Could not find source file " + srcFile);
+        }        
+    }
+    
+    /**
+     * Transform the srcfile using the stylesheet provided by getXsl. The data parameters are
+     * passed to the template engine. The result is save to the destfile.
+     * 
+     * @param data a set of key/value to pass to the XSLT engine.
+     */
+    public void transform(Map<String, String> data) {
+        check();
+        if (destFile.exists()) {
+            log("Deleting previous output file: " + destFile, Project.MSG_DEBUG);
+            destFile.delete();
+        }
+        
+        FileOutputStream output = null;        
+        try {
+            output = new FileOutputStream(destFile);
+            TransformerFactory factory = TransformerFactory.newInstance();
+            Transformer transformer = factory.newTransformer(new StreamSource(getXsl()));
+
+            transformer.setParameter("path", srcFile);
+            for (Map.Entry<String, String> entry : data.entrySet()) {
+                transformer.setParameter(entry.getKey(), entry.getValue());
+            }
+            transformer.setErrorListener(this);        
+            transformer.transform(new StreamSource(srcFile), new StreamResult(
+                    output));
+        
+        } catch (Exception exc) {
+            // deleting the intermediate file in case of error.
+            if (destFile.exists()) {
+                // closing current output stream, so we can delete the file
+                try {
+                    if (output != null) {
+                        output.close();
+                    }
+                } catch (IOException ioe) {
+                    // we should just ignore that error.
+                    log(ioe, Project.MSG_DEBUG);
+                }
+                log("Deleting " + destFile + " because an error occured.", Project.MSG_INFO);
+                destFile.delete();
+            }
+            // Raising the error to Ant.
+            throw new BuildException(exc.toString());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     * Reports errors to the Ant logging system of throw the exception if the task
+     * is set to failonerror.
+     */
+    @Override
+    public void error(TransformerException message) throws TransformerException {
+        if (this.isFailOnError()) {
+            throw message;
+        } else {
+            log("ERROR: " + message.getMessageAndLocation(), Project.MSG_ERR);            
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     * Fails the task in case of fatal error. The is nothing we can do about that.
+     */
+    @Override
+    public void fatalError(TransformerException message) throws TransformerException {
+        log("ERROR: " + message.getMessageAndLocation(), Project.MSG_ERR);
+        throw message;
+    }
+
+    /**
+     * {@inheritDoc}
+     * Reports errors to the Ant logging system of throw the exception if the task
+     * is set to failonerror.
+     */
+    @Override
+    public void warning(TransformerException message) throws TransformerException {
+        if (this.isFailOnError()) {
+            throw message;
+        } else {
+            log("WARNING: " + message.getMessageAndLocation(), Project.MSG_WARN);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/src/com/nokia/helium/sysdef/ant/taskdefs/DowngradeTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,59 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.sysdef.ant.taskdefs;
+
+import java.io.File;
+import java.util.Hashtable;
+
+/**
+ * <p>This task allows to downgrade of a system definition file v3.0 into v2.0.</p>
+ * 
+ * <p>The following example shows how you can downgrade the X:\model.sysdef.xml as
+ * X:\model_2_0_1.sysdef.xml.</p>
+ * 
+ * E.g:
+ *   <pre>
+ *   &lt;hlm:downgradeSysdef epocroot=&quot;X:\&quot; srcfile=&quot;X:\model.sysdef.xml&quot; 
+ *                      destfile=&quot;X:\model_2_0_1.sysdef.xml&quot; /&gt;
+ *   </pre>
+ *
+ *   For more information about system definition file v3.0 please check 
+ *   <a href="http://developer.symbian.org/wiki/index.php/System_Definition">http://developer.symbian.org/wiki/index.php/System_Definition</a>.
+ *
+ *   @ant.task name="downgradeSysdef" category="Sysdef"
+ */
+public class DowngradeTask extends AbstractSydefTask {
+    private static final String XSLT = "sf/os/buildtools/bldsystemtools/buildsystemtools/sysdefdowngrade.xsl"; 
+
+    /**
+     * {@inheritDoc}
+     */
+    public void execute() {
+        check();
+        log("Downgrading " + this.getSrcFile() + " to 2.0.1 schema.");
+        log("Creating " + this.getDestFile());
+        transform(new Hashtable<String, String>());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected File getXsl() {
+        return new File(this.getEpocroot(), XSLT);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/src/com/nokia/helium/sysdef/ant/taskdefs/JoinTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,62 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.sysdef.ant.taskdefs;
+
+import java.io.File;
+import java.util.Hashtable;
+
+/**
+ * <p>This task allows to do the join operation on system definition file v3.0.
+ * Join operation consist in combining a distributed system definition file into
+ * a stand-alone version.</p>
+ * 
+ * <p>The following example shows how you can join the X:\layer.sysdef.xml under
+ * X:\joined_layer.sysdef.xml.</p>
+ * 
+ * E.g:
+ * <pre>
+ *   &lt;hlm:joinSysdef epocroot=&quot;X:\&quot; srcfile=&quot;X:\layer.sysdef.xml&quot; 
+ *                      destfile=&quot;X:\joined_layer.sysdef.xml&quot; /&gt;
+ * </pre>
+ *
+ * For more information about system definition file v3.0 please check 
+ * <a href="http://developer.symbian.org/wiki/index.php/System_Definition">http://developer.symbian.org/wiki/index.php/System_Definition</a>.
+ *
+ * @ant.task name="joinSysdef" category="Sysdef"
+ */
+
+public class JoinTask extends AbstractSydefTask {
+    private static final String XSLT = "sf/os/buildtools/bldsystemtools/buildsystemtools/joinsysdef.xsl"; 
+
+    /**
+     * {@inheritDoc}
+     */
+    public void execute() {
+        check();
+        log("Joining " + this.getSrcFile()); 
+        log("Creating " + this.getDestFile());
+        transform(new Hashtable<String, String>());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected File getXsl() {
+        return new File(this.getEpocroot(), XSLT);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/src/com/nokia/helium/sysdef/ant/taskdefs/MergeTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,97 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+package com.nokia.helium.sysdef.ant.taskdefs;
+
+import java.io.File;
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.apache.tools.ant.BuildException;
+
+/**
+ * <p>This task allows to do the merge operation on system definition file v3.0.
+ * Merge operation consist in combining a the data of two models into one stand-alone
+ * system definition file (Also called canonical system definition file).</p>
+ * 
+ * <p>The following example shows how you can merge the X:\layer.sysdef.xml and X:\vendor.sysdef.xml
+ * as X:\joined_layer.sysdef.xml.</p>
+ * 
+ * E.g:
+ * <pre>
+ *   &lt;hlm:mergeSysdef epocroot=&quot;X:\&quot;
+ *                      srcfile=&quot;X:\layer.sysdef.xml&quot; 
+ *                      downstreamfile=&quot;X:\vendor.sysdef.xml&quot; 
+ *                      destfile=&quot;X:\joined_layer.sysdef.xml&quot; /&gt;
+ * </pre>
+ *   
+ *   
+ *   For more information about system definition file v3.0 please check 
+ *   <a href="http://developer.symbian.org/wiki/index.php/System_Definition">http://developer.symbian.org/wiki/index.php/System_Definition</a>.
+ *   
+ *   @ant.task name="mergeSysdef" category="Sysdef"
+ */
+
+public class MergeTask extends AbstractSydefTask {
+    private static final String XSLT = "sf/os/buildtools/bldsystemtools/buildsystemtools/mergesysdef.xsl"; 
+    private File downstreamFile;
+
+    /**
+     * Get the downstream file for the merge.
+     * @return
+     */
+    public File getDownstreamFile() {
+        return downstreamFile;
+    }
+
+    /**
+     * Defines the location of the downstream file.
+     * @param downstreamfile
+     * @ant.required
+     */
+    public void setDownstreamfile(File downstreamFile) {
+        this.downstreamFile = downstreamFile;
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    public void execute() {
+        check();
+        if (downstreamFile == null) {
+            throw new BuildException("'downstreamfile' attribute is not defined");
+        }
+        if (!downstreamFile.exists()) {
+            throw new BuildException("Could not find downstream file " + downstreamFile);
+        }        
+        
+        log("Merging " + this.getSrcFile());
+        log("Downstream " + downstreamFile);
+        log("Creating " + this.getDestFile());
+        Map<String, String> data = new Hashtable<String, String>();
+        data.put("Downstream", downstreamFile.toString());
+        transform(data);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected File getXsl() {
+        return new File(this.getEpocroot(), XSLT);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/tests/antunit/test_downgrade_sysdef.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_downgrade_sysdef.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-downgrade-sysdef" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium antlib downgrade sysdef tests.</description>
+
+    <taskdef resource="com/nokia/helium/sysdef/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+    <property name="epocroot" location="../../demo/data" />
+    <property name="epocroot.temp" location="${epocroot}/temp" />
+
+
+    <!-- is called prior to the test -->
+    <target name="setUp">
+        <delete dir="${epocroot.temp}/" failonerror="false" />
+        <mkdir dir="${epocroot.temp}" />
+        <hlm:joinSysdef epocroot="${epocroot}"
+                        srcfile="${epocroot}/root/system_definition_layer1.xml"
+                        destfile="${epocroot.temp}/layer1.sysdef.xml" />
+        <hlm:joinSysdef epocroot="${epocroot}"
+                        srcfile="${epocroot}/root/system_definition_layer2.xml"
+                        destfile="${epocroot.temp}/layer2.sysdef.xml" />
+        <hlm:mergeSysdef epocroot="${epocroot}"
+                         srcfile="${epocroot.temp}/layer1.sysdef.xml"
+                         downstreamfile="${epocroot.temp}/layer2.sysdef.xml"
+                         destfile="${epocroot.temp}/full.sysdef.xml" />
+    </target>
+
+    <!-- is called after the test, even if that caused an error -->
+    <target name="tearDown">
+        <delete dir="${epocroot.temp}" failonerror="false" />
+    </target>
+
+
+    <target name="test-noargs">
+        <au:expectfailure expectedMessage="'srcfile' attribute is not defined">
+            <hlm:downgradeSysdef />
+        </au:expectfailure>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.sysdef.xml" />
+    </target>
+
+    <target name="test-srcfile">
+        <au:expectfailure expectedMessage="'destfile' attribute is not defined">
+            <hlm:downgradeSysdef epocroot="${epocroot}" srcfile="${epocroot.temp}/full.sysdef.xml" />
+        </au:expectfailure>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.sysdef.xml" />
+    </target>
+            
+    <target name="test-srcfile-destfile">
+        <hlm:downgradeSysdef epocroot="${epocroot}"
+                             srcfile="${epocroot.temp}/full.sysdef.xml"
+                             destfile="${epocroot.temp}/output.sysdef.xml" />
+        <au:assertFileExists file="${epocroot.temp}/output.sysdef.xml" />
+    </target>
+        
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/tests/antunit/test_join_sysdef.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_join_sysdef.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-join-sysdef" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium antlib join sysdef tests.</description>
+
+    <taskdef resource="com/nokia/helium/sysdef/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+    <property name="epocroot" location="../../demo/data" />
+    <property name="epocroot.temp" location="${epocroot}/temp" />
+
+
+    <!-- is called prior to the test -->
+    <target name="setUp">
+        <delete dir="${epocroot.temp}" failonerror="false" />
+        <mkdir dir="${epocroot.temp}" />
+    </target>
+
+    <!-- is called after the test, even if that caused an error -->
+    <target name="tearDown">
+        <delete dir="${epocroot.temp}" failonerror="false" />
+    </target>
+
+
+    <target name="test-noargs">
+        <au:expectfailure expectedMessage="'srcfile' attribute is not defined">
+            <hlm:joinSysdef />
+        </au:expectfailure>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.sysdef.xml" />
+    </target>
+
+    <target name="test-srcfile">
+        <au:expectfailure expectedMessage="'destfile' attribute is not defined">
+            <hlm:joinSysdef epocroot="${epocroot}" srcfile="${epocroot}/root/system_definition_layer1.xml" />
+        </au:expectfailure>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.sysdef.xml" />
+    </target>
+
+    <target name="test-srcfile-destfile">
+        <hlm:joinSysdef epocroot="${epocroot}" srcfile="${epocroot}/root/system_definition_layer1.xml" destfile="${epocroot.temp}/output.sysdef.xml" />
+        <au:assertFileExists file="${epocroot.temp}/output.sysdef.xml" />
+    </target>
+
+    <target name="test-srcfile-destfile-wrong-epocroot">
+        <echo>test-srcfile-destfile-wrong-epocroot</echo>
+        <au:expectfailure expectedMessage="Could not find">
+            <hlm:joinSysdef epocroot="${epocroot}/foobar" srcfile="${epocroot}/root/system_definition_layer1.xml" destfile="${epocroot.temp}/output.sysdef.xml" />
+        </au:expectfailure>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.sysdef.xml" />
+    </target>
+
+    <target name="test-wrong-content">
+        <echo>test-wrong-content</echo>
+        <au:expectfailure expectedMessage="javax.xml.transform.TransformerException:">
+            <hlm:joinSysdef epocroot="${epocroot}" srcfile="${epocroot}/root/system_definition_layer3.xml" destfile="${epocroot.temp}/output.sysdef.xml" />
+        </au:expectfailure>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.sysdef.xml" />
+    </target>
+
+    <target name="test-invalid-src-file">
+        <echo>test-wrong-content</echo>
+        <au:expectfailure expectedMessage="Could not find source file ">
+            <hlm:joinSysdef epocroot="${epocroot}" srcfile="${epocroot}/root/system_definition_layer_invalid.xml" destfile="${epocroot.temp}/output.sysdef.xml" />
+        </au:expectfailure>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.sysdef.xml" />
+    </target>
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/tests/antunit/test_merge_sysdef.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_merge_sysdef.ant.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-merge-sysdef" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>Helium antlib merge sysdef tests.</description>
+
+    <taskdef resource="com/nokia/helium/sysdef/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+    <property name="epocroot" location="../../demo/data" />
+    <property name="epocroot.temp" location="${epocroot}/temp" />
+
+
+    <!-- is called prior to the test -->
+    <target name="setUp">
+        <delete dir="${epocroot.temp}/" failonerror="false" />
+        <mkdir dir="${epocroot.temp}" />
+        <hlm:joinSysdef epocroot="${epocroot}"
+                        srcfile="${epocroot}/root/system_definition_layer1.xml"
+                        destfile="${epocroot.temp}/layer1.sysdef.xml" />
+        <hlm:joinSysdef epocroot="${epocroot}"
+                        srcfile="${epocroot}/root/system_definition_layer2.xml"
+                        destfile="${epocroot.temp}/layer2.sysdef.xml" />
+    </target>
+
+    <!-- is called after the test, even if that caused an error -->
+    <target name="tearDown">
+        <delete dir="${epocroot.temp}" failonerror="false" />
+    </target>
+
+
+    <target name="test-noargs">
+        <au:expectfailure expectedMessage="'srcfile' attribute is not defined">
+            <hlm:mergeSysdef />
+        </au:expectfailure>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.sysdef.xml" />
+    </target>
+
+    <target name="test-srcfile">
+        <au:expectfailure expectedMessage="'destfile' attribute is not defined">
+            <hlm:mergeSysdef epocroot="${epocroot}" srcfile="${epocroot.temp}/layer1.sysdef.xml" />
+        </au:expectfailure>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.sysdef.xml" />
+    </target>
+            
+    <target name="test-srcfile-destfile">
+        <au:expectfailure expectedMessage="'downstreamfile' attribute is not defined">
+            <hlm:mergeSysdef epocroot="${epocroot}"
+                             srcfile="${epocroot.temp}/layer1.sysdef.xml"
+                             destfile="${epocroot.temp}/output.sysdef.xml" />
+        </au:expectfailure>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.sysdef.xml" />
+    </target>
+        
+    <target name="test-srcfile-destfile-wrong-epocroot">
+        <au:expectfailure expectedMessage="Could not find">
+            <hlm:mergeSysdef epocroot="${epocroot}/foobar"
+                             srcfile="${epocroot.temp}/layer1.sysdef.xml"
+                             downstreamfile="${epocroot.temp}/layer2.sysdef.xml"
+                             destfile="${epocroot.temp}/output.sysdef.xml" />
+        </au:expectfailure>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.sysdef.xml" />
+    </target>            
+
+    <target name="test-valid-input">
+        <hlm:mergeSysdef epocroot="${epocroot}"
+                         srcfile="${epocroot.temp}/layer1.sysdef.xml"
+                         downstreamfile="${epocroot.temp}/layer2.sysdef.xml"
+                         destfile="${epocroot.temp}/output.sysdef.xml" />
+        <au:assertFileExists file="${epocroot.temp}/output.sysdef.xml" />
+    </target>
+
+    <target name="test-invalid-downstream-file">
+        <echo>test-wrong-content</echo>
+        <au:expectfailure expectedMessage="Could not find downstream file ">
+            <hlm:mergeSysdef epocroot="${epocroot}"
+                             srcfile="${epocroot.temp}/layer1.sysdef.xml"
+                             downstreamfile="${epocroot.temp}/layer2_invalid.sysdef.xml"
+                             destfile="${epocroot.temp}/output.sysdef.xml" />
+        </au:expectfailure>
+        <au:assertFileDoesntExist file="${epocroot.temp}/output.sysdef.xml" />
+    </target>
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/tests/bld.sh	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,24 @@
+#!/bin/csh
+
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+
+module load java/1.6.0
+module load mercurial
+setenv ANT_ARGS "-lib ../lib -lib ../../lib -lib ../../bin/helium-core.jar -lib ../../bin/helium-sysdef.jar -lib ../../antlibs"
+ant -Dant.executor.class="com.nokia.helium.core.ant.HeliumExecutor" $*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/tests/build.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,27 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: 
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set ANT_ARGS=-lib %CD%\..\lib -lib %CD%\..\..\lib -lib %CD%\..\..\bin\helium-core.jar -lib %CD%\..\..\bin\helium-sysdef.jar -lib %CD%\..\..\antlibs
+ant -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor %*
+endlocal
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/sysdef/tests/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : build.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-unittest" xmlns:au="antlib:org.apache.ant.antunit">
+    <description>Helium Antlib Sysdef unittests.</description>
+
+    
+    <import file="../../test-macros.ant.xml" />
+
+    <target name="unittest" depends="unittest-sysdef" />
+
+    <target name="unittest-sysdef">
+        <antunitModule name="sysdef" />
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/helium-antlib/test-macros.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : test-macros.xml 
+Part of     : Helium AntLib
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-macros" xmlns:au="org.apache.ant.antunit">
+    <description>Helium Antlib test macro.</description>
+
+    <taskdef resource="org/apache/ant/antunit/antlib.xml" uri="org.apache.ant.antunit"/>
+
+    <dirname property="helium.antlib.root.dir" file="${ant.file.test-macros}" />
+    <property name="build.temp.dir" location="${helium.antlib.root.dir}/../build" />
+
+    <fileset dir="." includes="**/test_*.ant.xml" id="defaut.antunit"/>
+    
+    <macrodef name="antunitModule">
+        <attribute name="name" />
+        <attribute name="filesetid" default="defaut.antunit"/>
+        <sequential>
+            <mkdir dir="${build.temp.dir}/antunit/@{name}" />
+            <au:antunit>
+                <fileset refid="@{filesetid}" />
+                <au:plainlistener logLevel="info"/>
+                <au:xmllistener toDir="${build.temp.dir}/antunit/@{name}"/>
+            </au:antunit>
+        </sequential>
+    </macrodef>
+
+</project>
\ No newline at end of file
--- a/buildframework/helium/external/python/bin/nosetests-script.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/python/bin/nosetests-script.py	Wed Dec 23 19:29:07 2009 +0200
@@ -5,5 +5,5 @@
 from pkg_resources import load_entry_point
 
 sys.exit(
-   load_entry_point('nose==0.10.4', 'console_scripts', 'nosetests')()
+   load_entry_point('nose==0.11.1', 'console_scripts', 'nosetests')()
 )
Binary file buildframework/helium/external/python/lib/2.5/Amara-1.2.0.1-py2.5.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/Jinja-1.2-py2.5-win32.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/Jinja2-2.0rc1-py2.5-win32.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/Pygments-0.10-py2.5.egg has changed
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/PKG-INFO	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-Metadata-Version: 1.0
-Name: Sphinx
-Version: 0.5.1
-Summary: Python documentation generator
-Home-page: http://sphinx.pocoo.org/
-Author: Georg Brandl
-Author-email: georg@python.org
-License: BSD
-Download-URL: http://pypi.python.org/pypi/Sphinx
-Description: 
-        Sphinx is a tool that makes it easy to create intelligent and beautiful
-        documentation for Python projects (or other documents consisting of
-        multiple reStructuredText sources), written by Georg Brandl.
-        It was originally created to translate the new Python documentation,
-        but has now been cleaned up in the hope that it will be useful to many
-        other projects.
-        
-        Sphinx uses reStructuredText as its markup language, and many of its strengths
-        come from the power and straightforwardness of reStructuredText and its
-        parsing and translating suite, the Docutils.
-        
-        Although it is still under constant development, the following features
-        are already present, work fine and can be seen "in action" in the Python docs:
-        
-        * Output formats: HTML (including Windows HTML Help), plain text and LaTeX,
-        for printable PDF versions
-        * Extensive cross-references: semantic markup and automatic links
-        for functions, classes, glossary terms and similar pieces of information
-        * Hierarchical structure: easy definition of a document tree, with automatic
-        links to siblings, parents and children
-        * Automatic indices: general index as well as a module index
-        * Code handling: automatic highlighting using the Pygments highlighter
-        * Various extensions are available, e.g. for automatic testing of snippets
-        and inclusion of appropriately formatted docstrings.
-        
-Platform: any
-Classifier: Development Status :: 4 - Beta
-Classifier: Environment :: Console
-Classifier: Environment :: Web Environment
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: BSD License
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Topic :: Documentation
-Classifier: Topic :: Utilities
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/SOURCES.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,216 +0,0 @@
-AUTHORS
-CHANGES
-EXAMPLES
-LICENSE
-MANIFEST.in
-Makefile
-README
-TODO
-babel.cfg
-ez_setup.py
-setup.cfg
-setup.py
-sphinx-build.py
-sphinx-quickstart.py
-Sphinx.egg-info/PKG-INFO
-Sphinx.egg-info/SOURCES.txt
-Sphinx.egg-info/dependency_links.txt
-Sphinx.egg-info/entry_points.txt
-Sphinx.egg-info/not-zip-safe
-Sphinx.egg-info/requires.txt
-Sphinx.egg-info/top_level.txt
-doc/Makefile
-doc/builders.rst
-doc/changes.rst
-doc/concepts.rst
-doc/conf.py
-doc/config.rst
-doc/contents.rst
-doc/examples.rst
-doc/extensions.rst
-doc/glossary.rst
-doc/intro.rst
-doc/rest.rst
-doc/templating.rst
-doc/_static/sphinx.png
-doc/_templates/index.html
-doc/_templates/indexsidebar.html
-doc/_templates/layout.html
-doc/ext/appapi.rst
-doc/ext/autodoc.rst
-doc/ext/builderapi.rst
-doc/ext/coverage.rst
-doc/ext/doctest.rst
-doc/ext/ifconfig.rst
-doc/ext/intersphinx.rst
-doc/ext/math.rst
-doc/ext/refcounting.rst
-doc/ext/todo.rst
-doc/markup/code.rst
-doc/markup/desc.rst
-doc/markup/index.rst
-doc/markup/inline.rst
-doc/markup/misc.rst
-doc/markup/para.rst
-sphinx/__init__.py
-sphinx/_jinja.py
-sphinx/addnodes.py
-sphinx/application.py
-sphinx/builder.py
-sphinx/cmdline.py
-sphinx/config.py
-sphinx/environment.py
-sphinx/highlighting.py
-sphinx/htmlhelp.py
-sphinx/htmlwriter.py
-sphinx/latexwriter.py
-sphinx/linkcheck.py
-sphinx/quickstart.py
-sphinx/roles.py
-sphinx/search.py
-sphinx/setup_command.py
-sphinx/textwriter.py
-sphinx/directives/__init__.py
-sphinx/directives/code.py
-sphinx/directives/desc.py
-sphinx/directives/other.py
-sphinx/ext/__init__.py
-sphinx/ext/autodoc.py
-sphinx/ext/coverage.py
-sphinx/ext/doctest.py
-sphinx/ext/ifconfig.py
-sphinx/ext/intersphinx.py
-sphinx/ext/jsmath.py
-sphinx/ext/mathbase.py
-sphinx/ext/pngmath.py
-sphinx/ext/refcounting.py
-sphinx/ext/todo.py
-sphinx/locale/__init__.py
-sphinx/locale/__init__.pyc
-sphinx/locale/sphinx.pot
-sphinx/locale/cs/LC_MESSAGES/sphinx.js
-sphinx/locale/cs/LC_MESSAGES/sphinx.mo
-sphinx/locale/cs/LC_MESSAGES/sphinx.po
-sphinx/locale/de/LC_MESSAGES/sphinx.js
-sphinx/locale/de/LC_MESSAGES/sphinx.mo
-sphinx/locale/de/LC_MESSAGES/sphinx.po
-sphinx/locale/es/LC_MESSAGES/sphinx.js
-sphinx/locale/es/LC_MESSAGES/sphinx.mo
-sphinx/locale/es/LC_MESSAGES/sphinx.po
-sphinx/locale/fr/LC_MESSAGES/sphinx.js
-sphinx/locale/fr/LC_MESSAGES/sphinx.mo
-sphinx/locale/fr/LC_MESSAGES/sphinx.po
-sphinx/locale/ja/LC_MESSAGES/sphinx.js
-sphinx/locale/ja/LC_MESSAGES/sphinx.mo
-sphinx/locale/ja/LC_MESSAGES/sphinx.po
-sphinx/locale/nl/LC_MESSAGES/sphinx.js
-sphinx/locale/nl/LC_MESSAGES/sphinx.mo
-sphinx/locale/nl/LC_MESSAGES/sphinx.po
-sphinx/locale/pl/LC_MESSAGES/sphinx.js
-sphinx/locale/pl/LC_MESSAGES/sphinx.mo
-sphinx/locale/pl/LC_MESSAGES/sphinx.po
-sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js
-sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo
-sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po
-sphinx/locale/sl/LC_MESSAGES/sphinx.js
-sphinx/locale/sl/LC_MESSAGES/sphinx.mo
-sphinx/locale/sl/LC_MESSAGES/sphinx.po
-sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js
-sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo
-sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po
-sphinx/static/contents.png
-sphinx/static/default.css
-sphinx/static/doctools.js
-sphinx/static/file.png
-sphinx/static/jquery.js
-sphinx/static/minus.png
-sphinx/static/navigation.png
-sphinx/static/plus.png
-sphinx/static/rightsidebar.css
-sphinx/static/searchtools.js
-sphinx/static/sphinxdoc.css
-sphinx/static/stickysidebar.css
-sphinx/static/traditional.css
-sphinx/templates/defindex.html
-sphinx/templates/genindex-single.html
-sphinx/templates/genindex-split.html
-sphinx/templates/genindex.html
-sphinx/templates/layout.html
-sphinx/templates/modindex.html
-sphinx/templates/opensearch.xml
-sphinx/templates/page.html
-sphinx/templates/search.html
-sphinx/templates/changes/frameset.html
-sphinx/templates/changes/rstsource.html
-sphinx/templates/changes/versionchanges.html
-sphinx/texinputs/Makefile
-sphinx/texinputs/fncychap.sty
-sphinx/texinputs/howto.cls
-sphinx/texinputs/manual.cls
-sphinx/texinputs/python.ist
-sphinx/texinputs/sphinx.sty
-sphinx/texinputs/tabulary.sty
-sphinx/util/__init__.py
-sphinx/util/compat.py
-sphinx/util/console.py
-sphinx/util/jsdump.py
-sphinx/util/png.py
-sphinx/util/smartypants.py
-sphinx/util/stemmer.py
-sphinx/util/texescape.py
-tests/path.py
-tests/path.pyc
-tests/run.py
-tests/test_application.py
-tests/test_application.pyc
-tests/test_autodoc.py
-tests/test_autodoc.pyc
-tests/test_build.py
-tests/test_build.pyc
-tests/test_config.py
-tests/test_config.pyc
-tests/test_coverage.py
-tests/test_coverage.pyc
-tests/test_env.py
-tests/test_env.pyc
-tests/test_i18n.py
-tests/test_i18n.pyc
-tests/test_markup.py
-tests/test_markup.pyc
-tests/test_quickstart.py
-tests/test_quickstart.pyc
-tests/util.py
-tests/util.pyc
-tests/etree13/ElementPath.py
-tests/etree13/ElementPath.pyc
-tests/etree13/ElementTree.py
-tests/etree13/ElementTree.pyc
-tests/etree13/HTMLTreeBuilder.py
-tests/etree13/__init__.py
-tests/etree13/__init__.pyc
-tests/root/Makefile
-tests/root/autodoc.txt
-tests/root/conf.py
-tests/root/contents.txt
-tests/root/desc.txt
-tests/root/ext.py
-tests/root/ext.pyc
-tests/root/images.txt
-tests/root/img.gif
-tests/root/img.pdf
-tests/root/img.png
-tests/root/includes.txt
-tests/root/literal.inc
-tests/root/markup.txt
-tests/root/math.txt
-tests/root/wrongenc.inc
-tests/root/_static/README
-tests/root/_templates/layout.html
-tests/root/special/api.h
-tests/root/subdir/images.txt
-tests/root/subdir/img.png
-tests/root/subdir/include.inc
-tests/root/subdir/simg.png
-utils/check_sources.py
-utils/pylintrc
-utils/reindent.py
\ No newline at end of file
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/dependency_links.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/entry_points.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-[console_scripts]
-sphinx-build = sphinx:main
-sphinx-quickstart = sphinx.quickstart:main
-
-[distutils.commands]
-build_sphinx = sphinx.setup_command:BuildDoc
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/not-zip-safe	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/requires.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-Pygments>=0.8
-Jinja>=1.1
-docutils>=0.4
\ No newline at end of file
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/EGG-INFO/top_level.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-sphinx
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    Sphinx
-    ~~~~~~
-
-    The Sphinx documentation toolchain.
-
-    :copyright: 2007-2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import sys
-
-__revision__ = '$Revision$'
-__version__ = '0.5.1'
-__released__ = '0.5.1'
-
-
-def main(argv=sys.argv):
-    if sys.version_info[:3] < (2, 4, 0):
-        print >>sys.stderr, \
-              'Error: Sphinx requires at least Python 2.4 to run.'
-        return 1
-
-    try:
-        from sphinx import cmdline
-    except ImportError, err:
-        errstr = str(err)
-        if errstr.lower().startswith('no module named'):
-            whichmod = errstr[16:]
-            if whichmod.startswith('docutils'):
-                whichmod = 'Docutils library'
-            elif whichmod.startswith('jinja'):
-                whichmod = 'Jinja library'
-            elif whichmod == 'roman':
-                whichmod = 'roman module (which is distributed with Docutils)'
-            else:
-                whichmod += ' module'
-            print >>sys.stderr, \
-                  'Error: The %s cannot be found. Did you install Sphinx '\
-                  'and its dependencies correctly?' % whichmod
-            return 1
-        raise
-    return cmdline.main(argv)
-
-
-if __name__ == '__main__':
-    sys.exit(main(sys.argv))
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/_jinja.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx._jinja
-    ~~~~~~~~~~~~~
-
-    Jinja glue.
-
-    :copyright: 2007-2008 by Georg Brandl, Horst Gutmann.
-    :license: BSD.
-"""
-
-import codecs
-from os import path
-
-from sphinx.util import mtimes_of_files
-from sphinx.application import TemplateBridge
-
-from jinja import Environment
-from jinja.loaders import BaseLoader
-from jinja.exceptions import TemplateNotFound
-
-
-def babel_extract(fileobj, keywords, comment_tags, options):
-    """
-    Simple extractor to get some basic Babel support.
-    """
-    env = Environment()
-    for lineno, sg, pl in env.get_translations_for_string(fileobj.read()):
-        yield lineno, None, (sg, pl), ''
-
-
-class SphinxFileSystemLoader(BaseLoader):
-    """
-    A loader that loads templates either relative to one of a list of given
-    paths, or from an absolute path.
-    """
-
-    def __init__(self, basepath, extpaths):
-        self.basepath = path.abspath(basepath)
-        self.extpaths = map(path.abspath, extpaths)
-        self.searchpaths = self.extpaths + [self.basepath]
-
-    def get_source(self, environment, name, parent):
-        name = name.replace('/', path.sep)
-        if name.startswith('!'):
-            name = name[1:]
-            if not path.exists(path.join(self.basepath, name)):
-                raise TemplateNotFound(name)
-            filename = path.join(self.basepath, name)
-        elif path.isabs(name):
-            if not path.exists(name):
-                raise TemplateNotFound(name)
-            filename = name
-        else:
-            for searchpath in self.searchpaths:
-                if path.exists(path.join(searchpath, name)):
-                    filename = path.join(searchpath, name)
-                    break
-            else:
-                raise TemplateNotFound(name)
-        f = codecs.open(filename, 'r', environment.template_charset)
-        try:
-            return f.read()
-        finally:
-            f.close()
-
-
-class TranslatorEnvironment(Environment):
-    class _Translator(object):
-        def __init__(self, translator):
-            self.trans = translator
-
-        def gettext(self, string):
-            return self.trans.ugettext(string)
-
-        def ngettext(self, singular, plural, n):
-            return self.trans.ungettext(singular, plural, n)
-
-    def __init__(self, *args, **kwargs):
-        self.translator = kwargs['translator']
-        del kwargs['translator']
-        super(TranslatorEnvironment, self).__init__(*args, **kwargs)
-
-    def get_translator(self, context):
-        return TranslatorEnvironment._Translator(self.translator)
-
-
-class BuiltinTemplates(TemplateBridge):
-    def init(self, builder):
-        self.templates = {}
-        base_templates_path = path.join(path.dirname(__file__), 'templates')
-        ext_templates_path = [path.join(builder.confdir, dir)
-                              for dir in builder.config.templates_path]
-        self.templates_path = [base_templates_path] + ext_templates_path
-        loader = SphinxFileSystemLoader(base_templates_path, ext_templates_path)
-        if builder.translator is not None:
-            self.jinja_env = TranslatorEnvironment(loader=loader,
-                    friendly_traceback=False, translator=builder.translator)
-        else:
-            self.jinja_env = Environment(loader=loader,
-                    # disable traceback, more likely that something
-                    # in the application is broken than in the templates
-                    friendly_traceback=False)
-
-    def newest_template_mtime(self):
-        return max(mtimes_of_files(self.templates_path, '.html'))
-
-    def render(self, template, context):
-        if template in self.templates:
-            return self.templates[template].render(context)
-        templateobj = self.templates[template] = \
-                      self.jinja_env.get_template(template)
-        return templateobj.render(context)
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/addnodes.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.addnodes
-    ~~~~~~~~~~~~~~~
-
-    Additional docutils nodes.
-
-    :copyright: 2007-2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-from docutils import nodes
-
-# index markup
-class index(nodes.Invisible, nodes.Inline, nodes.TextElement): pass
-
-# description units (classdesc, funcdesc etc.)
-
-# parent node for signature and content
-class desc(nodes.Admonition, nodes.Element): pass
-
-# additional name parts (module name, class name)
-class desc_addname(nodes.Part, nodes.Inline, nodes.TextElement): pass
-# compatibility alias
-desc_classname = desc_addname
-# return type (C); object type, e.g. -> annotation (Python)
-class desc_type(nodes.Part, nodes.Inline, nodes.TextElement): pass
-# main name of object
-class desc_name(nodes.Part, nodes.Inline, nodes.TextElement): pass
-# argument list
-class desc_signature(nodes.Part, nodes.Inline, nodes.TextElement): pass
-class desc_parameterlist(nodes.Part, nodes.Inline, nodes.TextElement):
-    child_text_separator = ', '
-class desc_parameter(nodes.Part, nodes.Inline, nodes.TextElement): pass
-class desc_optional(nodes.Part, nodes.Inline, nodes.TextElement):
-    child_text_separator = ', '
-    def astext(self):
-        return '[' + nodes.TextElement.astext(self) + ']'
-# annotation (not Python 3-style annotations)
-class desc_annotation(nodes.Part, nodes.Inline, nodes.TextElement): pass
-
-# node for content
-class desc_content(nodes.General, nodes.Element): pass
-
-# \versionadded, \versionchanged, \deprecated
-class versionmodified(nodes.Admonition, nodes.TextElement): pass
-
-# seealso
-class seealso(nodes.Admonition, nodes.Element): pass
-
-# productionlist
-class productionlist(nodes.Admonition, nodes.Element): pass
-class production(nodes.Part, nodes.Inline, nodes.TextElement): pass
-
-# toc tree
-class toctree(nodes.General, nodes.Element): pass
-
-# centered
-class centered(nodes.Part, nodes.Element): pass
-
-# pending xref
-class pending_xref(nodes.Element): pass
-
-# compact paragraph -- never makes a <p>
-class compact_paragraph(nodes.paragraph): pass
-
-# for the ACKS list
-class acks(nodes.Element): pass
-
-# sets the highlighting language for literal blocks
-class highlightlang(nodes.Element): pass
-
-# like emphasis, but doesn't apply further text processors, e.g. smartypants
-class literal_emphasis(nodes.emphasis): pass
-
-# glossary
-class glossary(nodes.Element): pass
-
-# module declaration
-class module(nodes.Element): pass
-
-# start of a file, used in the LaTeX builder only
-class start_of_file(nodes.Element): pass
-
-# tabular column specification, used for the LaTeX writer
-class tabular_col_spec(nodes.Element): pass
-
-# meta directive -- same as docutils' standard meta node, but pickleable
-class meta(nodes.Special, nodes.PreBibliographic, nodes.Element): pass
-
-# make them known to docutils. this is needed, because the HTML writer
-# will choke at some point if these are not added
-nodes._add_node_class_names("""index desc desc_content desc_signature desc_type
-      desc_addname desc_name desc_parameterlist desc_parameter desc_optional
-      centered versionmodified seealso productionlist production toctree
-      pending_xref compact_paragraph highlightlang literal_emphasis
-      glossary acks module start_of_file tabular_col_spec meta""".split())
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/application.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,325 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.application
-    ~~~~~~~~~~~~~~~~~~
-
-    Sphinx application object.
-
-    Gracefully adapted from the TextPress system by Armin.
-
-
-    :copyright: 2008 by Georg Brandl, Armin Ronacher.
-    :license: BSD.
-"""
-
-import sys
-import posixpath
-from cStringIO import StringIO
-
-from docutils import nodes
-from docutils.parsers.rst import directives, roles
-
-import sphinx
-from sphinx.roles import xfileref_role, innernodetypes
-from sphinx.config import Config
-from sphinx.builder import builtin_builders, StandaloneHTMLBuilder
-from sphinx.directives import desc_directive, target_directive, additional_xref_types
-from sphinx.environment import SphinxStandaloneReader
-from sphinx.util.console import bold
-
-
-class SphinxError(Exception):
-    """
-    Base class for Sphinx errors that are shown to the user in a nicer
-    way than normal exceptions.
-    """
-    category = 'Sphinx error'
-
-class ExtensionError(SphinxError):
-    """Raised if something's wrong with the configuration."""
-    category = 'Extension error'
-
-    def __init__(self, message, orig_exc=None):
-        super(ExtensionError, self).__init__(message)
-        self.orig_exc = orig_exc
-
-    def __repr__(self):
-        if self.orig_exc:
-            return '%s(%r, %r)' % (self.__class__.__name__,
-                                   self.message, self.orig_exc)
-        return '%s(%r)' % (self.__class__.__name__, self.message)
-
-    def __str__(self):
-        parent_str = super(ExtensionError, self).__str__()
-        if self.orig_exc:
-            return '%s (exception: %s)' % (parent_str, self.orig_exc)
-        return parent_str
-
-
-# List of all known core events. Maps name to arguments description.
-events = {
-    'builder-inited': '',
-    'env-purge-doc': 'env, docname',
-    'source-read': 'docname, source text',
-    'doctree-read': 'the doctree before being pickled',
-    'missing-reference': 'env, node, contnode',
-    'doctree-resolved': 'doctree, docname',
-    'env-updated': 'env',
-    'html-page-context': 'pagename, context, doctree or None',
-    'build-finished': 'exception',
-}
-
-CONFIG_FILENAME = 'conf.py'
-
-class Sphinx(object):
-
-    def __init__(self, srcdir, confdir, outdir, doctreedir, buildername,
-                 confoverrides, status, warning=sys.stderr, freshenv=False):
-        self.next_listener_id = 0
-        self._listeners = {}
-        self.builderclasses = builtin_builders.copy()
-        self.builder = None
-
-        self.srcdir = srcdir
-        self.confdir = confdir
-        self.outdir = outdir
-        self.doctreedir = doctreedir
-
-        if status is None:
-            self._status = StringIO()
-            self.quiet = True
-        else:
-            self._status = status
-            self.quiet = False
-        if warning is None:
-            self._warning = StringIO()
-        else:
-            self._warning = warning
-        self._warncount = 0
-
-        self._events = events.copy()
-
-        # status code for command-line application
-        self.statuscode = 0
-
-        # read config
-        self.config = Config(confdir, CONFIG_FILENAME, confoverrides)
-
-        # load all extension modules
-        for extension in self.config.extensions:
-            self.setup_extension(extension)
-        # the config file itself can be an extension
-        if self.config.setup:
-            self.config.setup(self)
-
-        # now that we know all config values, collect them from conf.py
-        self.config.init_values()
-
-        if buildername is None:
-            print >>status, 'No builder selected, using default: html'
-            buildername = 'html'
-        if buildername not in self.builderclasses:
-            raise SphinxError('Builder name %s not registered' % buildername)
-
-        self.info(bold('Sphinx v%s, building %s' % (sphinx.__released__,
-                                                    buildername)))
-
-        builderclass = self.builderclasses[buildername]
-        self.builder = builderclass(self, freshenv=freshenv)
-        self.emit('builder-inited')
-
-    def build(self, all_files, filenames):
-        try:
-            if all_files:
-                self.builder.build_all()
-            elif filenames:
-                self.builder.build_specific(filenames)
-            else:
-                self.builder.build_update()
-        except Exception, err:
-            self.emit('build-finished', err)
-            raise
-        else:
-            self.emit('build-finished', None)
-
-    def warn(self, message):
-        self._warncount += 1
-        try:
-            self._warning.write('WARNING: %s\n' % message)
-        except UnicodeEncodeError:
-            encoding = getattr(self._warning, 'encoding', 'ascii')
-            self._warning.write(('WARNING: %s\n' % message).encode(encoding, 'replace'))
-
-    def info(self, message='', nonl=False):
-        try:
-            self._status.write(message)
-        except UnicodeEncodeError:
-            encoding = getattr(self._status, 'encoding', 'ascii')
-            self._status.write(message.encode(encoding, 'replace'))
-        if not nonl:
-            self._status.write('\n')
-        self._status.flush()
-
-    # general extensibility interface
-
-    def setup_extension(self, extension):
-        """Import and setup a Sphinx extension module."""
-        try:
-            mod = __import__(extension, None, None, ['setup'])
-        except ImportError, err:
-            raise ExtensionError('Could not import extension %s' % extension, err)
-        if hasattr(mod, 'setup'):
-            mod.setup(self)
-
-    def import_object(self, objname, source=None):
-        """Import an object from a 'module.name' string."""
-        try:
-            module, name = objname.rsplit('.', 1)
-        except ValueError, err:
-            raise ExtensionError('Invalid full object name %s' % objname +
-                                 (source and ' (needed for %s)' % source or ''), err)
-        try:
-            return getattr(__import__(module, None, None, [name]), name)
-        except ImportError, err:
-            raise ExtensionError('Could not import %s' % module +
-                                 (source and ' (needed for %s)' % source or ''), err)
-        except AttributeError, err:
-            raise ExtensionError('Could not find %s' % objname +
-                                 (source and ' (needed for %s)' % source or ''), err)
-
-    # event interface
-
-    def _validate_event(self, event):
-        event = intern(event)
-        if event not in self._events:
-            raise ExtensionError('Unknown event name: %s' % event)
-
-    def connect(self, event, callback):
-        self._validate_event(event)
-        listener_id = self.next_listener_id
-        if event not in self._listeners:
-            self._listeners[event] = {listener_id: callback}
-        else:
-            self._listeners[event][listener_id] = callback
-        self.next_listener_id += 1
-        return listener_id
-
-    def disconnect(self, listener_id):
-        for event in self._listeners.itervalues():
-            event.pop(listener_id, None)
-
-    def emit(self, event, *args):
-        result = []
-        if event in self._listeners:
-            for _, callback in self._listeners[event].iteritems():
-                result.append(callback(self, *args))
-        return result
-
-    def emit_firstresult(self, event, *args):
-        for result in self.emit(event, *args):
-            if result is not None:
-                return result
-        return None
-
-    # registering addon parts
-
-    def add_builder(self, builder):
-        if not hasattr(builder, 'name'):
-            raise ExtensionError('Builder class %s has no "name" attribute' % builder)
-        if builder.name in self.builderclasses:
-            raise ExtensionError('Builder %r already exists (in module %s)' % (
-                builder.name, self.builderclasses[builder.name].__module__))
-        self.builderclasses[builder.name] = builder
-
-    def add_config_value(self, name, default, rebuild_env):
-        if name in self.config.values:
-            raise ExtensionError('Config value %r already present' % name)
-        self.config.values[name] = (default, rebuild_env)
-
-    def add_event(self, name):
-        if name in self._events:
-            raise ExtensionError('Event %r already present' % name)
-        self._events[name] = ''
-
-    def add_node(self, node, **kwds):
-        nodes._add_node_class_names([node.__name__])
-        for key, val in kwds.iteritems():
-            try:
-                visit, depart = val
-            except ValueError:
-                raise ExtensionError('Value for key %r must be a (visit, depart) '
-                                     'function tuple' % key)
-            if key == 'html':
-                from sphinx.htmlwriter import HTMLTranslator as translator
-            elif key == 'latex':
-                from sphinx.latexwriter import LaTeXTranslator as translator
-            elif key == 'text':
-                from sphinx.textwriter import TextTranslator as translator
-            else:
-                # ignore invalid keys for compatibility
-                continue
-            setattr(translator, 'visit_'+node.__name__, visit)
-            if depart:
-                setattr(translator, 'depart_'+node.__name__, depart)
-
-    def add_directive(self, name, func, content, arguments, **options):
-        func.content = content
-        func.arguments = arguments
-        func.options = options
-        directives.register_directive(name, func)
-
-    def add_role(self, name, role):
-        roles.register_canonical_role(name, role)
-
-    def add_description_unit(self, directivename, rolename, indextemplate='',
-                             parse_node=None, ref_nodeclass=None):
-        additional_xref_types[directivename] = (rolename, indextemplate, parse_node)
-        directives.register_directive(directivename, desc_directive)
-        roles.register_canonical_role(rolename, xfileref_role)
-        if ref_nodeclass is not None:
-            innernodetypes[rolename] = ref_nodeclass
-
-    def add_crossref_type(self, directivename, rolename, indextemplate='',
-                          ref_nodeclass=None):
-        additional_xref_types[directivename] = (rolename, indextemplate, None)
-        directives.register_directive(directivename, target_directive)
-        roles.register_canonical_role(rolename, xfileref_role)
-        if ref_nodeclass is not None:
-            innernodetypes[rolename] = ref_nodeclass
-
-    def add_transform(self, transform):
-        SphinxStandaloneReader.transforms.append(transform)
-
-    def add_javascript(self, filename):
-        StandaloneHTMLBuilder.script_files.append(
-            posixpath.join('_static', filename))
-
-
-class TemplateBridge(object):
-    """
-    This class defines the interface for a "template bridge", that is, a class
-    that renders templates given a template name and a context.
-    """
-
-    def init(self, builder):
-        """
-        Called by the builder to initialize the template system.  *builder*
-        is the builder object; you'll probably want to look at the value of
-        ``builder.config.templates_path``.
-        """
-        raise NotImplementedError('must be implemented in subclasses')
-
-    def newest_template_mtime(self):
-        """
-        Called by the builder to determine if output files are outdated
-        because of template changes.  Return the mtime of the newest template
-        file that was changed.  The default implementation returns ``0``.
-        """
-        return 0
-
-    def render(self, template, context):
-        """
-        Called by the builder to render a *template* with a specified
-        context (a Python dictionary).
-        """
-        raise NotImplementedError('must be implemented in subclasses')
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/builder.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1272 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.builder
-    ~~~~~~~~~~~~~~
-
-    Builder classes for different output formats.
-
-    :copyright: 2007-2008 by Georg Brandl, Sebastian Wiesner, Horst Gutmann.
-    :license: BSD.
-"""
-
-import os
-import time
-import codecs
-import shutil
-import gettext
-import cPickle as pickle
-from os import path
-from cgi import escape
-
-from docutils import nodes
-from docutils.io import StringOutput, FileOutput, DocTreeInput
-from docutils.core import publish_parts
-from docutils.utils import new_document
-from docutils.frontend import OptionParser
-from docutils.readers.doctree import Reader as DoctreeReader
-
-from sphinx import addnodes, locale, __version__
-from sphinx.util import ensuredir, relative_uri, SEP, os_path, texescape, ustrftime
-from sphinx.htmlhelp import build_hhx
-from sphinx.htmlwriter import HTMLWriter, HTMLTranslator, SmartyPantsHTMLTranslator
-from sphinx.textwriter import TextWriter
-from sphinx.latexwriter import LaTeXWriter
-from sphinx.environment import BuildEnvironment, NoUri
-from sphinx.highlighting import PygmentsBridge
-from sphinx.util.console import bold, purple, darkgreen
-from sphinx.search import js_index
-
-try:
-    import json
-except ImportError:
-    try:
-        import simplejson as json
-    except ImportError:
-        json = None
-
-# side effect: registers roles and directives
-from sphinx import roles
-from sphinx import directives
-
-ENV_PICKLE_FILENAME = 'environment.pickle'
-LAST_BUILD_FILENAME = 'last_build'
-INVENTORY_FILENAME = 'objects.inv'
-
-
-class Builder(object):
-    """
-    Builds target formats from the reST sources.
-    """
-
-    # builder's name, for the -b command line options
-    name = ''
-
-    def __init__(self, app, env=None, freshenv=False):
-        self.srcdir = app.srcdir
-        self.confdir = app.confdir
-        self.outdir = app.outdir
-        self.doctreedir = app.doctreedir
-        if not path.isdir(self.doctreedir):
-            os.makedirs(self.doctreedir)
-
-        self.app = app
-        self.warn = app.warn
-        self.info = app.info
-        self.config = app.config
-
-        self.load_i18n()
-
-        # images that need to be copied over (source -> dest)
-        self.images = {}
-
-        # if None, this is set in load_env()
-        self.env = env
-        self.freshenv = freshenv
-
-        self.init()
-        self.load_env()
-
-    # helper methods
-
-    def init(self):
-        """Load necessary templates and perform initialization."""
-        raise NotImplementedError
-
-    def init_templates(self):
-        # Call this from init() if you need templates.
-        if self.config.template_bridge:
-            self.templates = self.app.import_object(
-                self.config.template_bridge, 'template_bridge setting')()
-        else:
-            from sphinx._jinja import BuiltinTemplates
-            self.templates = BuiltinTemplates()
-        self.templates.init(self)
-
-    def get_target_uri(self, docname, typ=None):
-        """
-        Return the target URI for a document name (typ can be used to qualify
-        the link characteristic for individual builders).
-        """
-        raise NotImplementedError
-
-    def get_relative_uri(self, from_, to, typ=None):
-        """
-        Return a relative URI between two source filenames. May raise environment.NoUri
-        if there's no way to return a sensible URI.
-        """
-        return relative_uri(self.get_target_uri(from_),
-                            self.get_target_uri(to, typ))
-
-    def get_outdated_docs(self):
-        """
-        Return an iterable of output files that are outdated, or a string describing
-        what an update build will build.
-        """
-        raise NotImplementedError
-
-    def status_iterator(self, iterable, summary, colorfunc=darkgreen):
-        l = -1
-        for item in iterable:
-            if l == -1:
-                self.info(bold(summary), nonl=1)
-                l = 0
-            self.info(colorfunc(item) + ' ', nonl=1)
-            yield item
-        if l == 0:
-            self.info()
-
-    supported_image_types = []
-
-    def post_process_images(self, doctree):
-        """
-        Pick the best candidate for all image URIs.
-        """
-        for node in doctree.traverse(nodes.image):
-            if '?' in node['candidates']:
-                # don't rewrite nonlocal image URIs
-                continue
-            if '*' not in node['candidates']:
-                for imgtype in self.supported_image_types:
-                    candidate = node['candidates'].get(imgtype, None)
-                    if candidate:
-                        break
-                else:
-                    self.warn('%s:%s: no matching candidate for image URI %r' %
-                              (node.source, getattr(node, 'lineno', ''), node['uri']))
-                    continue
-                node['uri'] = candidate
-            else:
-                candidate = node['uri']
-            if candidate not in self.env.images:
-                # non-existing URI; let it alone
-                continue
-            self.images[candidate] = self.env.images[candidate][1]
-
-    # build methods
-
-    def load_i18n(self):
-        """
-        Load translated strings from the configured localedirs if
-        enabled in the configuration.
-        """
-        self.translator = None
-        if self.config.language is not None:
-            self.info(bold('loading translations [%s]... ' % self.config.language),
-                      nonl=True)
-            locale_dirs = [path.join(path.dirname(__file__), 'locale')] + \
-                          [path.join(self.srcdir, x) for x in self.config.locale_dirs]
-            for dir_ in locale_dirs:
-                try:
-                    trans = gettext.translation('sphinx', localedir=dir_,
-                            languages=[self.config.language])
-                    if self.translator is None:
-                        self.translator = trans
-                    else:
-                        self.translator._catalog.update(trans.catalog)
-                except Exception:
-                    # Language couldn't be found in the specified path
-                    pass
-            if self.translator is not None:
-                self.info('done')
-            else:
-                self.info('locale not available')
-        if self.translator is None:
-            self.translator = gettext.NullTranslations()
-        self.translator.install(unicode=True)
-        locale.init()  # translate common labels
-
-    def load_env(self):
-        """Set up the build environment."""
-        if self.env:
-            return
-        if not self.freshenv:
-            try:
-                self.info(bold('loading pickled environment... '), nonl=True)
-                self.env = BuildEnvironment.frompickle(self.config,
-                    path.join(self.doctreedir, ENV_PICKLE_FILENAME))
-                self.info('done')
-            except Exception, err:
-                if type(err) is IOError and err.errno == 2:
-                    self.info('not found')
-                else:
-                    self.info('failed: %s' % err)
-                self.env = BuildEnvironment(self.srcdir, self.doctreedir, self.config)
-                self.env.find_files(self.config)
-        else:
-            self.env = BuildEnvironment(self.srcdir, self.doctreedir, self.config)
-            self.env.find_files(self.config)
-        self.env.set_warnfunc(self.warn)
-
-    def build_all(self):
-        """Build all source files."""
-        self.build(None, summary='all source files', method='all')
-
-    def build_specific(self, filenames):
-        """Only rebuild as much as needed for changes in the source_filenames."""
-        # bring the filenames to the canonical format, that is,
-        # relative to the source directory and without source_suffix.
-        dirlen = len(self.srcdir) + 1
-        to_write = []
-        suffix = self.config.source_suffix
-        for filename in filenames:
-            filename = path.abspath(filename)[dirlen:]
-            if filename.endswith(suffix):
-                filename = filename[:-len(suffix)]
-            filename = filename.replace(os.path.sep, SEP)
-            to_write.append(filename)
-        self.build(to_write, method='specific',
-                   summary='%d source files given on command '
-                   'line' % len(to_write))
-
-    def build_update(self):
-        """Only rebuild files changed or added since last build."""
-        to_build = self.get_outdated_docs()
-        if isinstance(to_build, str):
-            self.build(['__all__'], to_build)
-        else:
-            to_build = list(to_build)
-            self.build(to_build,
-                       summary='targets for %d source files that are '
-                       'out of date' % len(to_build))
-
-    def build(self, docnames, summary=None, method='update'):
-        if summary:
-            self.info(bold('building [%s]: ' % self.name), nonl=1)
-            self.info(summary)
-
-        updated_docnames = []
-        # while reading, collect all warnings from docutils
-        warnings = []
-        self.env.set_warnfunc(warnings.append)
-        self.info(bold('updating environment: '), nonl=1)
-        iterator = self.env.update(self.config, self.srcdir, self.doctreedir, self.app)
-        # the first item in the iterator is a summary message
-        self.info(iterator.next())
-        for docname in self.status_iterator(iterator, 'reading sources... ', purple):
-            updated_docnames.append(docname)
-            # nothing further to do, the environment has already done the reading
-        for warning in warnings:
-            if warning.strip():
-                self.warn(warning)
-        self.env.set_warnfunc(self.warn)
-
-        if updated_docnames:
-            # save the environment
-            self.info(bold('pickling environment... '), nonl=True)
-            self.env.topickle(path.join(self.doctreedir, ENV_PICKLE_FILENAME))
-            self.info('done')
-
-            # global actions
-            self.info(bold('checking consistency... '), nonl=True)
-            self.env.check_consistency()
-            self.info('done')
-        else:
-            if method == 'update' and not docnames:
-                self.info(bold('no targets are out of date.'))
-                return
-
-        # another indirection to support methods which don't build files
-        # individually
-        self.write(docnames, updated_docnames, method)
-
-        # finish (write static files etc.)
-        self.finish()
-        status = self.app.statuscode == 0 and 'succeeded' or 'finished with problems'
-        if self.app._warncount:
-            self.info(bold('build %s, %s warning%s.' %
-                           (status, self.app._warncount,
-                            self.app._warncount != 1 and 's' or '')))
-        else:
-            self.info(bold('build %s.' % status))
-
-    def write(self, build_docnames, updated_docnames, method='update'):
-        if build_docnames is None or build_docnames == ['__all__']:
-            # build_all
-            build_docnames = self.env.found_docs
-        if method == 'update':
-            # build updated ones as well
-            docnames = set(build_docnames) | set(updated_docnames)
-        else:
-            docnames = set(build_docnames)
-
-        # add all toctree-containing files that may have changed
-        for docname in list(docnames):
-            for tocdocname in self.env.files_to_rebuild.get(docname, []):
-                docnames.add(tocdocname)
-        docnames.add(self.config.master_doc)
-
-        self.info(bold('preparing documents... '), nonl=True)
-        self.prepare_writing(docnames)
-        self.info('done')
-
-        # write target files
-        warnings = []
-        self.env.set_warnfunc(warnings.append)
-        for docname in self.status_iterator(sorted(docnames),
-                                            'writing output... ', darkgreen):
-            doctree = self.env.get_and_resolve_doctree(docname, self)
-            self.write_doc(docname, doctree)
-        for warning in warnings:
-            if warning.strip():
-                self.warn(warning)
-        self.env.set_warnfunc(self.warn)
-
-    def prepare_writing(self, docnames):
-        raise NotImplementedError
-
-    def write_doc(self, docname, doctree):
-        raise NotImplementedError
-
-    def finish(self):
-        raise NotImplementedError
-
-
-class StandaloneHTMLBuilder(Builder):
-    """
-    Builds standalone HTML docs.
-    """
-    name = 'html'
-    copysource = True
-    out_suffix = '.html'
-    indexer_format = js_index
-    supported_image_types = ['image/svg+xml', 'image/png', 'image/gif',
-                             'image/jpeg']
-    searchindex_filename = 'searchindex.js'
-    add_header_links = True
-    add_definition_links = True
-
-    # This is a class attribute because it is mutated by Sphinx.add_javascript.
-    script_files = ['_static/jquery.js', '_static/doctools.js']
-
-    def init(self):
-        """Load templates."""
-        self.init_templates()
-        self.init_translator_class()
-        if self.config.html_file_suffix:
-            self.out_suffix = self.config.html_file_suffix
-
-        if self.config.language is not None:
-            jsfile = path.join(path.dirname(__file__), 'locale', self.config.language,
-                               'LC_MESSAGES', 'sphinx.js')
-            if path.isfile(jsfile):
-                self.script_files.append('_static/translations.js')
-
-    def init_translator_class(self):
-        if self.config.html_translator_class:
-            self.translator_class = self.app.import_object(
-                self.config.html_translator_class, 'html_translator_class setting')
-        elif self.config.html_use_smartypants:
-            self.translator_class = SmartyPantsHTMLTranslator
-        else:
-            self.translator_class = HTMLTranslator
-
-    def render_partial(self, node):
-        """Utility: Render a lone doctree node."""
-        doc = new_document('<partial node>')
-        doc.append(node)
-        return publish_parts(
-            doc,
-            source_class=DocTreeInput,
-            reader=DoctreeReader(),
-            writer=HTMLWriter(self),
-            settings_overrides={'output_encoding': 'unicode'}
-        )
-
-    def prepare_writing(self, docnames):
-        from sphinx.search import IndexBuilder
-
-        self.indexer = IndexBuilder(self.env)
-        self.load_indexer(docnames)
-        self.docwriter = HTMLWriter(self)
-        self.docsettings = OptionParser(
-            defaults=self.env.settings,
-            components=(self.docwriter,)).get_default_values()
-
-        # format the "last updated on" string, only once is enough since it
-        # typically doesn't include the time of day
-        lufmt = self.config.html_last_updated_fmt
-        if lufmt is not None:
-            self.last_updated = ustrftime(lufmt or _('%b %d, %Y'))
-        else:
-            self.last_updated = None
-
-        logo = self.config.html_logo and \
-               path.basename(self.config.html_logo) or ''
-
-        favicon = self.config.html_favicon and \
-                  path.basename(self.config.html_favicon) or ''
-        if favicon and os.path.splitext(favicon)[1] != '.ico':
-            self.warn('html_favicon is not an .ico file')
-
-        if not isinstance(self.config.html_use_opensearch, basestring):
-            self.warn('html_use_opensearch config value must now be a string')
-
-        self.relations = self.env.collect_relations()
-
-        rellinks = []
-        if self.config.html_use_index:
-            rellinks.append(('genindex', _('General Index'), 'I', _('index')))
-        if self.config.html_use_modindex and self.env.modules:
-            rellinks.append(('modindex', _('Global Module Index'), 'M', _('modules')))
-
-        self.globalcontext = dict(
-            project = self.config.project,
-            release = self.config.release,
-            version = self.config.version,
-            last_updated = self.last_updated,
-            copyright = self.config.copyright,
-            master_doc = self.config.master_doc,
-            style = self.config.html_style,
-            use_opensearch = self.config.html_use_opensearch,
-            docstitle = self.config.html_title,
-            shorttitle = self.config.html_short_title,
-            show_sphinx = self.config.html_show_sphinx,
-            has_source = self.config.html_copy_source,
-            file_suffix = self.out_suffix,
-            script_files = self.script_files,
-            sphinx_version = __version__,
-            rellinks = rellinks,
-            builder = self.name,
-            parents = [],
-            logo = logo,
-            favicon = favicon,
-        )
-        self.globalcontext.update(self.config.html_context)
-
-    def get_doc_context(self, docname, body, metatags):
-        """Collect items for the template context of a page."""
-        # find out relations
-        prev = next = None
-        parents = []
-        rellinks = self.globalcontext['rellinks'][:]
-        related = self.relations.get(docname)
-        titles = self.env.titles
-        if related and related[2]:
-            try:
-                next = {'link': self.get_relative_uri(docname, related[2]),
-                        'title': self.render_partial(titles[related[2]])['title']}
-                rellinks.append((related[2], next['title'], 'N', _('next')))
-            except KeyError:
-                next = None
-        if related and related[1]:
-            try:
-                prev = {'link': self.get_relative_uri(docname, related[1]),
-                        'title': self.render_partial(titles[related[1]])['title']}
-                rellinks.append((related[1], prev['title'], 'P', _('previous')))
-            except KeyError:
-                # the relation is (somehow) not in the TOC tree, handle that gracefully
-                prev = None
-        while related and related[0]:
-            try:
-                parents.append(
-                    {'link': self.get_relative_uri(docname, related[0]),
-                     'title': self.render_partial(titles[related[0]])['title']})
-            except KeyError:
-                pass
-            related = self.relations.get(related[0])
-        if parents:
-            parents.pop() # remove link to the master file; we have a generic
-                          # "back to index" link already
-        parents.reverse()
-
-        # title rendered as HTML
-        title = titles.get(docname)
-        title = title and self.render_partial(title)['title'] or ''
-        # the name for the copied source
-        sourcename = self.config.html_copy_source and docname + '.txt' or ''
-
-        # metadata for the document
-        meta = self.env.metadata.get(docname)
-
-        return dict(
-            parents = parents,
-            prev = prev,
-            next = next,
-            title = title,
-            meta = meta,
-            body = body,
-            metatags = metatags,
-            rellinks = rellinks,
-            sourcename = sourcename,
-            toc = self.render_partial(self.env.get_toc_for(docname))['fragment'],
-            # only display a TOC if there's more than one item to show
-            display_toc = (self.env.toc_num_entries[docname] > 1),
-        )
-
-    def write_doc(self, docname, doctree):
-        self.post_process_images(doctree)
-        destination = StringOutput(encoding='utf-8')
-        doctree.settings = self.docsettings
-
-        self.imgpath = relative_uri(self.get_target_uri(docname), '_images')
-        self.docwriter.write(doctree, destination)
-        self.docwriter.assemble_parts()
-        body = self.docwriter.parts['fragment']
-        metatags = self.docwriter.clean_meta
-
-        ctx = self.get_doc_context(docname, body, metatags)
-        self.index_page(docname, doctree, ctx.get('title', ''))
-        self.handle_page(docname, ctx, event_arg=doctree)
-
-    def finish(self):
-        self.info(bold('writing additional files...'), nonl=1)
-
-        # the global general index
-
-        if self.config.html_use_index:
-            # the total count of lines for each index letter, used to distribute
-            # the entries into two columns
-            genindex = self.env.create_index(self)
-            indexcounts = []
-            for _, entries in genindex:
-                indexcounts.append(sum(1 + len(subitems)
-                                       for _, (_, subitems) in entries))
-
-            genindexcontext = dict(
-                genindexentries = genindex,
-                genindexcounts = indexcounts,
-                split_index = self.config.html_split_index,
-            )
-            self.info(' genindex', nonl=1)
-
-            if self.config.html_split_index:
-                self.handle_page('genindex', genindexcontext, 'genindex-split.html')
-                self.handle_page('genindex-all', genindexcontext, 'genindex.html')
-                for (key, entries), count in zip(genindex, indexcounts):
-                    ctx = {'key': key, 'entries': entries, 'count': count,
-                           'genindexentries': genindex}
-                    self.handle_page('genindex-' + key, ctx, 'genindex-single.html')
-            else:
-                self.handle_page('genindex', genindexcontext, 'genindex.html')
-
-        # the global module index
-
-        if self.config.html_use_modindex and self.env.modules:
-            # the sorted list of all modules, for the global module index
-            modules = sorted(((mn, (self.get_relative_uri('modindex', fn) +
-                                    '#module-' + mn, sy, pl, dep))
-                              for (mn, (fn, sy, pl, dep)) in
-                              self.env.modules.iteritems()),
-                             key=lambda x: x[0].lower())
-            # collect all platforms
-            platforms = set()
-            # sort out collapsable modules
-            modindexentries = []
-            letters = []
-            pmn = ''
-            num_toplevels = 0
-            num_collapsables = 0
-            cg = 0 # collapse group
-            fl = '' # first letter
-            for mn, (fn, sy, pl, dep) in modules:
-                pl = pl and pl.split(', ') or []
-                platforms.update(pl)
-                if fl != mn[0].lower() and mn[0] != '_':
-                    # heading
-                    modindexentries.append(['', False, 0, False,
-                                            mn[0].upper(), '', [], False])
-                    letters.append(mn[0].upper())
-                tn = mn.split('.')[0]
-                if tn != mn:
-                    # submodule
-                    if pmn == tn:
-                        # first submodule - make parent collapsable
-                        modindexentries[-1][1] = True
-                        num_collapsables += 1
-                    elif not pmn.startswith(tn):
-                        # submodule without parent in list, add dummy entry
-                        cg += 1
-                        modindexentries.append([tn, True, cg, False, '', '', [], False])
-                else:
-                    num_toplevels += 1
-                    cg += 1
-                modindexentries.append([mn, False, cg, (tn != mn), fn, sy, pl, dep])
-                pmn = mn
-                fl = mn[0].lower()
-            platforms = sorted(platforms)
-
-            # apply heuristics when to collapse modindex at page load:
-            # only collapse if number of toplevel modules is larger than
-            # number of submodules
-            collapse = len(modules) - num_toplevels < num_toplevels
-
-            modindexcontext = dict(
-                modindexentries = modindexentries,
-                platforms = platforms,
-                letters = letters,
-                collapse_modindex = collapse,
-            )
-            self.info(' modindex', nonl=1)
-            self.handle_page('modindex', modindexcontext, 'modindex.html')
-
-        # the search page
-        if self.name != 'htmlhelp':
-            self.info(' search', nonl=1)
-            self.handle_page('search', {}, 'search.html')
-
-        # additional pages from conf.py
-        for pagename, template in self.config.html_additional_pages.items():
-            self.info(' '+pagename, nonl=1)
-            self.handle_page(pagename, {}, template)
-
-        if self.config.html_use_opensearch and self.name != 'htmlhelp':
-            self.info(' opensearch', nonl=1)
-            fn = path.join(self.outdir, '_static', 'opensearch.xml')
-            self.handle_page('opensearch', {}, 'opensearch.xml', outfilename=fn)
-
-        self.info()
-
-        # copy image files
-        if self.images:
-            self.info(bold('copying images...'), nonl=True)
-            ensuredir(path.join(self.outdir, '_images'))
-            for src, dest in self.images.iteritems():
-                self.info(' '+src, nonl=1)
-                shutil.copyfile(path.join(self.srcdir, src),
-                                path.join(self.outdir, '_images', dest))
-            self.info()
-
-        # copy static files
-        self.info(bold('copying static files... '), nonl=True)
-        ensuredir(path.join(self.outdir, '_static'))
-        # first, create pygments style file
-        f = open(path.join(self.outdir, '_static', 'pygments.css'), 'w')
-        f.write(PygmentsBridge('html', self.config.pygments_style).get_stylesheet())
-        f.close()
-        # then, copy translations JavaScript file
-        if self.config.language is not None:
-            jsfile = path.join(path.dirname(__file__), 'locale', self.config.language,
-                               'LC_MESSAGES', 'sphinx.js')
-            if path.isfile(jsfile):
-                shutil.copyfile(jsfile, path.join(self.outdir, '_static',
-                                                  'translations.js'))
-        # then, copy over all user-supplied static files
-        staticdirnames = [path.join(path.dirname(__file__), 'static')] + \
-                         [path.join(self.confdir, spath)
-                          for spath in self.config.html_static_path]
-        for staticdirname in staticdirnames:
-            for filename in os.listdir(staticdirname):
-                if filename.startswith('.'):
-                    continue
-                fullname = path.join(staticdirname, filename)
-                targetname = path.join(self.outdir, '_static', filename)
-                if path.isfile(fullname):
-                    shutil.copyfile(fullname, targetname)
-                elif path.isdir(fullname):
-                    if filename in self.config.exclude_dirnames:
-                        continue
-                    if path.exists(targetname):
-                        shutil.rmtree(targetname)
-                    shutil.copytree(fullname, targetname)
-        # last, copy logo file (handled differently)
-        if self.config.html_logo:
-            logobase = path.basename(self.config.html_logo)
-            shutil.copyfile(path.join(self.confdir, self.config.html_logo),
-                            path.join(self.outdir, '_static', logobase))
-        self.info('done')
-
-        # dump the search index
-        self.handle_finish()
-
-    def get_outdated_docs(self):
-        if self.templates:
-            template_mtime = self.templates.newest_template_mtime()
-        else:
-            template_mtime = 0
-        for docname in self.env.found_docs:
-            if docname not in self.env.all_docs:
-                yield docname
-                continue
-            targetname = self.env.doc2path(docname, self.outdir, self.out_suffix)
-            try:
-                targetmtime = path.getmtime(targetname)
-            except Exception:
-                targetmtime = 0
-            try:
-                srcmtime = max(path.getmtime(self.env.doc2path(docname)),
-                               template_mtime)
-                if srcmtime > targetmtime:
-                    yield docname
-            except EnvironmentError:
-                # source doesn't exist anymore
-                pass
-
-    def load_indexer(self, docnames):
-        keep = set(self.env.all_docs) - set(docnames)
-        try:
-            f = open(path.join(self.outdir, self.searchindex_filename), 'rb')
-            try:
-                self.indexer.load(f, self.indexer_format)
-            finally:
-                f.close()
-        except (IOError, OSError, ValueError):
-            if keep:
-                self.warn("search index couldn't be loaded, but not all documents "
-                          "will be built: the index will be incomplete.")
-        # delete all entries for files that will be rebuilt
-        self.indexer.prune(keep)
-
-    def index_page(self, pagename, doctree, title):
-        # only index pages with title
-        if self.indexer is not None and title:
-            self.indexer.feed(pagename, title, doctree)
-
-    # --------- these are overwritten by the serialization builder
-
-    def get_target_uri(self, docname, typ=None):
-        return docname + self.out_suffix
-
-    def handle_page(self, pagename, addctx, templatename='page.html',
-                    outfilename=None, event_arg=None):
-        ctx = self.globalcontext.copy()
-        # current_page_name is backwards compatibility
-        ctx['pagename'] = ctx['current_page_name'] = pagename
-
-        def pathto(otheruri, resource=False,
-                   baseuri=self.get_target_uri(pagename)):
-            if not resource:
-                otheruri = self.get_target_uri(otheruri)
-            return relative_uri(baseuri, otheruri)
-        ctx['pathto'] = pathto
-        ctx['hasdoc'] = lambda name: name in self.env.all_docs
-        ctx['customsidebar'] = self.config.html_sidebars.get(pagename)
-        ctx.update(addctx)
-
-        self.app.emit('html-page-context', pagename, templatename, ctx, event_arg)
-
-        output = self.templates.render(templatename, ctx)
-        if not outfilename:
-            outfilename = path.join(self.outdir, os_path(pagename) + self.out_suffix)
-        ensuredir(path.dirname(outfilename)) # normally different from self.outdir
-        try:
-            f = codecs.open(outfilename, 'w', 'utf-8')
-            try:
-                f.write(output)
-            finally:
-                f.close()
-        except (IOError, OSError), err:
-            self.warn("Error writing file %s: %s" % (outfilename, err))
-        if self.copysource and ctx.get('sourcename'):
-            # copy the source file for the "show source" link
-            source_name = path.join(self.outdir, '_sources', os_path(ctx['sourcename']))
-            ensuredir(path.dirname(source_name))
-            shutil.copyfile(self.env.doc2path(pagename), source_name)
-
-    def handle_finish(self):
-        self.info(bold('dumping search index... '), nonl=True)
-        self.indexer.prune(self.env.all_docs)
-        f = open(path.join(self.outdir, self.searchindex_filename), 'wb')
-        try:
-            self.indexer.dump(f, self.indexer_format)
-        finally:
-            f.close()
-        self.info('done')
-
-        self.info(bold('dumping object inventory... '), nonl=True)
-        f = open(path.join(self.outdir, INVENTORY_FILENAME), 'w')
-        try:
-            f.write('# Sphinx inventory version 1\n')
-            f.write('# Project: %s\n' % self.config.project.encode('utf-8'))
-            f.write('# Version: %s\n' % self.config.version)
-            for modname, info in self.env.modules.iteritems():
-                f.write('%s mod %s\n' % (modname, self.get_target_uri(info[0])))
-            for refname, (docname, desctype) in self.env.descrefs.iteritems():
-                f.write('%s %s %s\n' % (refname, desctype, self.get_target_uri(docname)))
-        finally:
-            f.close()
-        self.info('done')
-
-
-class SerializingHTMLBuilder(StandaloneHTMLBuilder):
-    """
-    An abstract builder that serializes the HTML generated.
-    """
-    #: the serializing implementation to use.  Set this to a module that
-    #: implements a `dump`, `load`, `dumps` and `loads` functions
-    #: (pickle, simplejson etc.)
-    implementation = None
-
-    #: the filename for the global context file
-    globalcontext_filename = None
-
-    supported_image_types = ('image/svg+xml', 'image/png', 'image/gif',
-                             'image/jpeg')
-
-    def init(self):
-        self.init_translator_class()
-        self.templates = None   # no template bridge necessary
-
-    def get_target_uri(self, docname, typ=None):
-        if docname == 'index':
-            return ''
-        if docname.endswith(SEP + 'index'):
-            return docname[:-5] # up to sep
-        return docname + SEP
-
-    def handle_page(self, pagename, ctx, templatename='page.html',
-                    outfilename=None, event_arg=None):
-        ctx['current_page_name'] = pagename
-        sidebarfile = self.config.html_sidebars.get(pagename)
-        if sidebarfile:
-            ctx['customsidebar'] = sidebarfile
-
-        if not outfilename:
-            outfilename = path.join(self.outdir, os_path(pagename) + self.out_suffix)
-
-        self.app.emit('html-page-context', pagename, templatename, ctx, event_arg)
-
-        ensuredir(path.dirname(outfilename))
-        f = open(outfilename, 'wb')
-        try:
-            self.implementation.dump(ctx, f, 2)
-        finally:
-            f.close()
-
-        # if there is a source file, copy the source file for the
-        # "show source" link
-        if ctx.get('sourcename'):
-            source_name = path.join(self.outdir, '_sources',
-                                    os_path(ctx['sourcename']))
-            ensuredir(path.dirname(source_name))
-            shutil.copyfile(self.env.doc2path(pagename), source_name)
-
-    def handle_finish(self):
-        # dump the global context
-        outfilename = path.join(self.outdir, self.globalcontext_filename)
-        f = open(outfilename, 'wb')
-        try:
-            self.implementation.dump(self.globalcontext, f, 2)
-        finally:
-            f.close()
-
-        # super here to dump the search index
-        StandaloneHTMLBuilder.handle_finish(self)
-
-        # copy the environment file from the doctree dir to the output dir
-        # as needed by the web app
-        shutil.copyfile(path.join(self.doctreedir, ENV_PICKLE_FILENAME),
-                        path.join(self.outdir, ENV_PICKLE_FILENAME))
-
-        # touch 'last build' file, used by the web application to determine
-        # when to reload its environment and clear the cache
-        open(path.join(self.outdir, LAST_BUILD_FILENAME), 'w').close()
-
-
-class PickleHTMLBuilder(SerializingHTMLBuilder):
-    """
-    A Builder that dumps the generated HTML into pickle files.
-    """
-    implementation = pickle
-    indexer_format = pickle
-    name = 'pickle'
-    out_suffix = '.fpickle'
-    globalcontext_filename = 'globalcontext.pickle'
-    searchindex_filename = 'searchindex.pickle'
-
-
-class JSONHTMLBuilder(SerializingHTMLBuilder):
-    """
-    A builder that dumps the generated HTML into JSON files.
-    """
-    implementation = json
-    indexer_format = json
-    name = 'json'
-    out_suffix = '.fjson'
-    globalcontext_filename = 'globalcontext.json'
-    searchindex_filename = 'searchindex.json'
-
-    def init(self):
-        if json is None:
-            from sphinx.application import SphinxError
-            raise SphinxError('The module simplejson (or json in Python >= 2.6) '
-                              'is not available. The JSONHTMLBuilder builder '
-                              'will not work.')
-        SerializingHTMLBuilder.init(self)
-
-
-class HTMLHelpBuilder(StandaloneHTMLBuilder):
-    """
-    Builder that also outputs Windows HTML help project, contents and index files.
-    Adapted from the original Doc/tools/prechm.py.
-    """
-    name = 'htmlhelp'
-
-    # don't copy the reST source
-    copysource = False
-    supported_image_types = ['image/png', 'image/gif', 'image/jpeg']
-
-    # don't add links
-    add_header_links = False
-    add_definition_links = False
-
-    def init(self):
-        StandaloneHTMLBuilder.init(self)
-        # the output files for HTML help must be .html only
-        self.out_suffix = '.html'
-
-    def handle_finish(self):
-        build_hhx(self, self.outdir, self.config.htmlhelp_basename)
-
-
-class LaTeXBuilder(Builder):
-    """
-    Builds LaTeX output to create PDF.
-    """
-    name = 'latex'
-    supported_image_types = ['application/pdf', 'image/png', 'image/gif',
-                             'image/jpeg']
-
-    def init(self):
-        self.docnames = []
-        self.document_data = []
-        texescape.init()
-
-    def get_outdated_docs(self):
-        return 'all documents' # for now
-
-    def get_target_uri(self, docname, typ=None):
-        if typ == 'token':
-            # token references are always inside production lists and must be
-            # replaced by \token{} in LaTeX
-            return '@token'
-        if docname not in self.docnames:
-            raise NoUri
-        else:
-            return ''
-
-    def init_document_data(self):
-        preliminary_document_data = map(list, self.config.latex_documents)
-        if not preliminary_document_data:
-            self.warn('No "latex_documents" config value found; no documents '
-                      'will be written.')
-            return
-        # assign subdirs to titles
-        self.titles = []
-        for entry in preliminary_document_data:
-            docname = entry[0]
-            if docname not in self.env.all_docs:
-                self.warn('"latex_documents" config value references unknown '
-                          'document %s' % docname)
-                continue
-            self.document_data.append(entry)
-            if docname.endswith(SEP+'index'):
-                docname = docname[:-5]
-            self.titles.append((docname, entry[2]))
-
-    def write(self, *ignored):
-        # first, assemble the "appendix" docs that are in every PDF
-        appendices = []
-        for fname in self.config.latex_appendices:
-            appendices.append(self.env.get_doctree(fname))
-
-        docwriter = LaTeXWriter(self)
-        docsettings = OptionParser(
-            defaults=self.env.settings,
-            components=(docwriter,)).get_default_values()
-
-        self.init_document_data()
-
-        for entry in self.document_data:
-            docname, targetname, title, author, docclass = entry[:5]
-            toctree_only = False
-            if len(entry) > 5:
-                toctree_only = entry[5]
-            destination = FileOutput(
-                destination_path=path.join(self.outdir, targetname),
-                encoding='utf-8')
-            self.info("processing " + targetname + "... ", nonl=1)
-            doctree = self.assemble_doctree(docname, toctree_only,
-                appendices=(docclass == 'manual') and appendices or [])
-            self.post_process_images(doctree)
-            self.info("writing... ", nonl=1)
-            doctree.settings = docsettings
-            doctree.settings.author = author
-            doctree.settings.title = title
-            doctree.settings.docname = docname
-            doctree.settings.docclass = docclass
-            docwriter.write(doctree, destination)
-            self.info("done")
-
-    def assemble_doctree(self, indexfile, toctree_only, appendices):
-        self.docnames = set([indexfile] + appendices)
-        self.info(darkgreen(indexfile) + " ", nonl=1)
-        def process_tree(docname, tree):
-            tree = tree.deepcopy()
-            for toctreenode in tree.traverse(addnodes.toctree):
-                newnodes = []
-                includefiles = map(str, toctreenode['includefiles'])
-                for includefile in includefiles:
-                    try:
-                        self.info(darkgreen(includefile) + " ", nonl=1)
-                        subtree = process_tree(includefile,
-                                               self.env.get_doctree(includefile))
-                        self.docnames.add(includefile)
-                    except Exception:
-                        self.warn('%s: toctree contains ref to nonexisting file %r' %
-                                  (docname, includefile))
-                    else:
-                        sof = addnodes.start_of_file()
-                        sof.children = subtree.children
-                        newnodes.append(sof)
-                toctreenode.parent.replace(toctreenode, newnodes)
-            return tree
-        tree = self.env.get_doctree(indexfile)
-        if toctree_only:
-            # extract toctree nodes from the tree and put them in a fresh document
-            new_tree = new_document('<latex output>')
-            new_sect = nodes.section()
-            new_sect += nodes.title(u'<Set title in conf.py>', u'<Set title in conf.py>')
-            new_tree += new_sect
-            for node in tree.traverse(addnodes.toctree):
-                new_sect += node
-            tree = new_tree
-        largetree = process_tree(indexfile, tree)
-        largetree.extend(appendices)
-        self.info()
-        self.info("resolving references...")
-        self.env.resolve_references(largetree, indexfile, self)
-        # resolve :ref:s to distant tex files -- we can't add a cross-reference,
-        # but append the document name
-        for pendingnode in largetree.traverse(addnodes.pending_xref):
-            docname = pendingnode['refdocname']
-            sectname = pendingnode['refsectname']
-            newnodes = [nodes.emphasis(sectname, sectname)]
-            for subdir, title in self.titles:
-                if docname.startswith(subdir):
-                    newnodes.append(nodes.Text(_(' (in '), _(' (in ')))
-                    newnodes.append(nodes.emphasis(title, title))
-                    newnodes.append(nodes.Text(')', ')'))
-                    break
-            else:
-                pass
-            pendingnode.replace_self(newnodes)
-        return largetree
-
-    def finish(self):
-        # copy image files
-        if self.images:
-            self.info(bold('copying images...'), nonl=1)
-            for src, dest in self.images.iteritems():
-                self.info(' '+src, nonl=1)
-                shutil.copyfile(path.join(self.srcdir, src),
-                                path.join(self.outdir, dest))
-            self.info()
-
-        # the logo is handled differently
-        if self.config.latex_logo:
-            logobase = path.basename(self.config.latex_logo)
-            shutil.copyfile(path.join(self.confdir, self.config.latex_logo),
-                            path.join(self.outdir, logobase))
-
-        self.info(bold('copying TeX support files... '), nonl=True)
-        staticdirname = path.join(path.dirname(__file__), 'texinputs')
-        for filename in os.listdir(staticdirname):
-            if not filename.startswith('.'):
-                shutil.copyfile(path.join(staticdirname, filename),
-                                path.join(self.outdir, filename))
-        self.info('done')
-
-
-class ChangesBuilder(Builder):
-    """
-    Write a summary with all versionadded/changed directives.
-    """
-    name = 'changes'
-
-    def init(self):
-        self.init_templates()
-
-    def get_outdated_docs(self):
-        return self.outdir
-
-    typemap = {
-        'versionadded': 'added',
-        'versionchanged': 'changed',
-        'deprecated': 'deprecated',
-    }
-
-    def write(self, *ignored):
-        version = self.config.version
-        libchanges = {}
-        apichanges = []
-        otherchanges = {}
-        if version not in self.env.versionchanges:
-            self.info(bold('no changes in this version.'))
-            return
-        self.info(bold('writing summary file...'))
-        for type, docname, lineno, module, descname, content in \
-                self.env.versionchanges[version]:
-            ttext = self.typemap[type]
-            context = content.replace('\n', ' ')
-            if descname and docname.startswith('c-api'):
-                if not descname:
-                    continue
-                if context:
-                    entry = '<b>%s</b>: <i>%s:</i> %s' % (descname, ttext, context)
-                else:
-                    entry = '<b>%s</b>: <i>%s</i>.' % (descname, ttext)
-                apichanges.append((entry, docname, lineno))
-            elif descname or module:
-                if not module:
-                    module = _('Builtins')
-                if not descname:
-                    descname = _('Module level')
-                if context:
-                    entry = '<b>%s</b>: <i>%s:</i> %s' % (descname, ttext, context)
-                else:
-                    entry = '<b>%s</b>: <i>%s</i>.' % (descname, ttext)
-                libchanges.setdefault(module, []).append((entry, docname, lineno))
-            else:
-                if not context:
-                    continue
-                entry = '<i>%s:</i> %s' % (ttext.capitalize(), context)
-                title = self.env.titles[docname].astext()
-                otherchanges.setdefault((docname, title), []).append(
-                    (entry, docname, lineno))
-
-        ctx = {
-            'project': self.config.project,
-            'version': version,
-            'docstitle': self.config.html_title,
-            'shorttitle': self.config.html_short_title,
-            'libchanges': sorted(libchanges.iteritems()),
-            'apichanges': sorted(apichanges),
-            'otherchanges': sorted(otherchanges.iteritems()),
-            'show_sphinx': self.config.html_show_sphinx,
-        }
-        f = open(path.join(self.outdir, 'index.html'), 'w')
-        try:
-            f.write(self.templates.render('changes/frameset.html', ctx))
-        finally:
-            f.close()
-        f = open(path.join(self.outdir, 'changes.html'), 'w')
-        try:
-            f.write(self.templates.render('changes/versionchanges.html', ctx))
-        finally:
-            f.close()
-
-        hltext = ['.. versionadded:: %s' % version,
-                  '.. versionchanged:: %s' % version,
-                  '.. deprecated:: %s' % version]
-
-        def hl(no, line):
-            line = '<a name="L%s"> </a>' % no + escape(line)
-            for x in hltext:
-                if x in line:
-                    line = '<span class="hl">%s</span>' % line
-                    break
-            return line
-
-        self.info(bold('copying source files...'))
-        for docname in self.env.all_docs:
-            f = open(self.env.doc2path(docname))
-            lines = f.readlines()
-            targetfn = path.join(self.outdir, 'rst', os_path(docname)) + '.html'
-            ensuredir(path.dirname(targetfn))
-            f = codecs.open(targetfn, 'w', 'utf8')
-            try:
-                text = ''.join(hl(i+1, line) for (i, line) in enumerate(lines))
-                ctx = {'filename': self.env.doc2path(docname, None), 'text': text}
-                f.write(self.templates.render('changes/rstsource.html', ctx))
-            finally:
-                f.close()
-        shutil.copyfile(path.join(path.dirname(__file__), 'static', 'default.css'),
-                        path.join(self.outdir, 'default.css'))
-
-    def hl(self, text, version):
-        text = escape(text)
-        for directive in ['versionchanged', 'versionadded', 'deprecated']:
-            text = text.replace('.. %s:: %s' % (directive, version),
-                                '<b>.. %s:: %s</b>' % (directive, version))
-        return text
-
-    def finish(self):
-        pass
-
-
-class TextBuilder(Builder):
-    name = 'text'
-    out_suffix = '.txt'
-
-    def init(self):
-        pass
-
-    def get_outdated_docs(self):
-        for docname in self.env.found_docs:
-            if docname not in self.env.all_docs:
-                yield docname
-                continue
-            targetname = self.env.doc2path(docname, self.outdir, self.out_suffix)
-            try:
-                targetmtime = path.getmtime(targetname)
-            except Exception:
-                targetmtime = 0
-            try:
-                srcmtime = path.getmtime(self.env.doc2path(docname))
-                if srcmtime > targetmtime:
-                    yield docname
-            except EnvironmentError:
-                # source doesn't exist anymore
-                pass
-
-    def get_target_uri(self, docname, typ=None):
-        return ''
-
-    def prepare_writing(self, docnames):
-        self.writer = TextWriter(self)
-
-    def write_doc(self, docname, doctree):
-        destination = StringOutput(encoding='utf-8')
-        self.writer.write(doctree, destination)
-        outfilename = path.join(self.outdir, os_path(docname) + self.out_suffix)
-        ensuredir(path.dirname(outfilename)) # normally different from self.outdir
-        try:
-            f = codecs.open(outfilename, 'w', 'utf-8')
-            try:
-                f.write(self.writer.output)
-            finally:
-                f.close()
-        except (IOError, OSError), err:
-            self.warn("Error writing file %s: %s" % (outfilename, err))
-
-    def finish(self):
-        pass
-
-
-# compatibility alias
-WebHTMLBuilder = PickleHTMLBuilder
-
-
-from sphinx.linkcheck import CheckExternalLinksBuilder
-
-builtin_builders = {
-    'html': StandaloneHTMLBuilder,
-    'pickle': PickleHTMLBuilder,
-    'json': JSONHTMLBuilder,
-    'web': PickleHTMLBuilder,
-    'htmlhelp': HTMLHelpBuilder,
-    'latex': LaTeXBuilder,
-    'text': TextBuilder,
-    'changes': ChangesBuilder,
-    'linkcheck': CheckExternalLinksBuilder,
-}
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/cmdline.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,186 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.cmdline
-    ~~~~~~~~~~~~~~
-
-    sphinx-build command-line handling.
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import os
-import sys
-import getopt
-import traceback
-from os import path
-
-from docutils.utils import SystemMessage
-
-from sphinx import __version__
-from sphinx.application import Sphinx, SphinxError
-from sphinx.util import format_exception_cut_frames, save_traceback
-from sphinx.util.console import darkred, nocolor, color_terminal
-
-
-def usage(argv, msg=None):
-    if msg:
-        print >>sys.stderr, msg
-        print >>sys.stderr
-    print >>sys.stderr, """\
-Sphinx v%s
-Usage: %s [options] sourcedir outdir [filenames...]
-Options: -b <builder> -- builder to use; default is html
-         -a        -- write all files; default is to only write new and changed files
-         -E        -- don't use a saved environment, always read all files
-         -d <path> -- path for the cached environment and doctree files
-                      (default: outdir/.doctrees)
-         -c <path> -- path where configuration file (conf.py) is located
-                      (default: same as sourcedir)
-         -C        -- use no config file at all, only -D options
-         -D <setting=value> -- override a setting in configuration
-         -A <name=value>    -- pass a value into the templates, for HTML builder
-         -N        -- do not do colored output
-         -q        -- no output on stdout, just warnings on stderr
-         -Q        -- no output at all, not even warnings
-         -P        -- run Pdb on exception
-Modi:
-* without -a and without filenames, write new and changed files.
-* with -a, write all files.
-* with filenames, write these.""" % (__version__, argv[0])
-
-
-def main(argv):
-    if not sys.stdout.isatty() or not color_terminal():
-        # Windows' poor cmd box doesn't understand ANSI sequences
-        nocolor()
-
-    try:
-        opts, args = getopt.getopt(argv[1:], 'ab:d:c:CD:A:NEqP')
-        allopts = set(opt[0] for opt in opts)
-        srcdir = confdir = path.abspath(args[0])
-        if not path.isdir(srcdir):
-            print >>sys.stderr, 'Error: Cannot find source directory.'
-            return 1
-        if not path.isfile(path.join(srcdir, 'conf.py')) and \
-               '-c' not in allopts and '-C' not in allopts:
-            print >>sys.stderr, 'Error: Source directory doesn\'t contain conf.py file.'
-            return 1
-        outdir = path.abspath(args[1])
-        if not path.isdir(outdir):
-            print >>sys.stderr, 'Making output directory...'
-            os.makedirs(outdir)
-    except (IndexError, getopt.error):
-        usage(argv)
-        return 1
-
-    filenames = args[2:]
-    err = 0
-    for filename in filenames:
-        if not path.isfile(filename):
-            print >>sys.stderr, 'Cannot find file %r.' % filename
-            err = 1
-    if err:
-        return 1
-
-    buildername = all_files = None
-    freshenv = use_pdb = False
-    status = sys.stdout
-    warning = sys.stderr
-    confoverrides = {}
-    htmlcontext = {}
-    doctreedir = path.join(outdir, '.doctrees')
-    for opt, val in opts:
-        if opt == '-b':
-            buildername = val
-        elif opt == '-a':
-            if filenames:
-                usage(argv, 'Cannot combine -a option and filenames.')
-                return 1
-            all_files = True
-        elif opt == '-d':
-            doctreedir = path.abspath(val)
-        elif opt == '-c':
-            confdir = path.abspath(val)
-            if not path.isfile(path.join(confdir, 'conf.py')):
-                print >>sys.stderr, \
-                      'Error: Configuration directory doesn\'t contain conf.py file.'
-                return 1
-        elif opt == '-C':
-            confdir = None
-        elif opt == '-D':
-            try:
-                key, val = val.split('=')
-            except ValueError:
-                print >>sys.stderr, \
-                      'Error: -D option argument must be in the form name=value.'
-                return 1
-            try:
-                val = int(val)
-            except ValueError:
-                pass
-            confoverrides[key] = val
-        elif opt == '-A':
-            try:
-                key, val = val.split('=')
-            except ValueError:
-                print >>sys.stderr, \
-                      'Error: -A option argument must be in the form name=value.'
-                return 1
-            try:
-                val = int(val)
-            except ValueError:
-                pass
-            htmlcontext[key] = val
-        elif opt == '-N':
-            nocolor()
-        elif opt == '-E':
-            freshenv = True
-        elif opt == '-q':
-            status = None
-        elif opt == '-Q':
-            status = None
-            warning = None
-        elif opt == '-P':
-            use_pdb = True
-    confoverrides['html_context'] = htmlcontext
-
-    try:
-        app = Sphinx(srcdir, confdir, outdir, doctreedir, buildername,
-                     confoverrides, status, warning, freshenv)
-        app.build(all_files, filenames)
-        return app.statuscode
-    except KeyboardInterrupt:
-        if use_pdb:
-            import pdb
-            print >>sys.stderr, darkred('Interrupted while building, starting debugger:')
-            traceback.print_exc()
-            pdb.post_mortem(sys.exc_info()[2])
-        return 1
-    except Exception, err:
-        if use_pdb:
-            import pdb
-            print >>sys.stderr, darkred('Exception occurred while building, '
-                                        'starting debugger:')
-            traceback.print_exc()
-            pdb.post_mortem(sys.exc_info()[2])
-        else:
-            if isinstance(err, SystemMessage):
-                print >>sys.stderr, darkred('reST markup error:')
-                print >>sys.stderr, err.args[0].encode('ascii', 'backslashreplace')
-            elif isinstance(err, SphinxError):
-                print >>sys.stderr, darkred('%s:' % err.category)
-                print >>sys.stderr, err
-            else:
-                print >>sys.stderr, darkred('Exception occurred:')
-                print >>sys.stderr, format_exception_cut_frames().rstrip()
-                tbpath = save_traceback()
-                print >>sys.stderr, darkred('The full traceback has been saved '
-                                            'in %s, if you want to report the '
-                                            'issue to the author.' % tbpath)
-                print >>sys.stderr, ('Please also report this if it was a user '
-                                     'error, so that a better error message '
-                                     'can be provided next time.')
-                print >>sys.stderr, ('Send reports to sphinx-dev@googlegroups.com. '
-                                     'Thanks!')
-            return 1
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/config.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,140 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.config
-    ~~~~~~~~~~~~~
-
-    Build configuration file handling.
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD license.
-"""
-
-import os
-from os import path
-
-
-class Config(object):
-    """Configuration file abstraction."""
-
-    # the values are: (default, needs fresh doctrees if changed)
-
-    # If you add a value here, don't forget to include it in the
-    # quickstart.py file template as well as in the docs!
-
-    config_values = dict(
-        # general options
-        project = ('Python', True),
-        copyright = ('', False),
-        version = ('', True),
-        release = ('', True),
-        today = ('', True),
-        today_fmt = (None, True),  # the real default is locale-dependent
-
-        language = (None, True),
-        locale_dirs = ([], True),
-
-        master_doc = ('contents', True),
-        source_suffix = ('.rst', True),
-        source_encoding = ('utf-8', True),
-        unused_docs = ([], True),
-        exclude_dirs = ([], True),
-        exclude_trees = ([], True),
-        exclude_dirnames = ([], True),
-        default_role = (None, True),
-        add_function_parentheses = (True, True),
-        add_module_names = (True, True),
-        show_authors = (False, True),
-        pygments_style = ('sphinx', False),
-        highlight_language = ('python', False),
-        templates_path = ([], False),
-        template_bridge = (None, False),
-        keep_warnings = (False, True),
-
-        # HTML options
-        html_title = (lambda self: '%s v%s documentation' %
-                                   (self.project, self.release),
-                      False),
-        html_short_title = (lambda self: self.html_title, False),
-        html_style = ('default.css', False),
-        html_logo = (None, False),
-        html_favicon = (None, False),
-        html_static_path = ([], False),
-        html_last_updated_fmt = (None, False),  # the real default is locale-dependent
-        html_use_smartypants = (True, False),
-        html_translator_class = (None, False),
-        html_sidebars = ({}, False),
-        html_additional_pages = ({}, False),
-        html_use_modindex = (True, False),
-        html_use_index = (True, False),
-        html_split_index = (False, False),
-        html_copy_source = (True, False),
-        html_use_opensearch = ('', False),
-        html_file_suffix = (None, False),
-        html_show_sphinx = (True, False),
-        html_context = ({}, False),
-
-        # HTML help only options
-        htmlhelp_basename = ('pydoc', False),
-
-        # LaTeX options
-        latex_documents = ([], False),
-        latex_logo = (None, False),
-        latex_appendices = ([], False),
-        latex_use_parts = (False, False),
-        latex_use_modindex = (True, False),
-        # paper_size and font_size are still separate values
-        # so that you can give them easily on the command line
-        latex_paper_size = ('letter', False),
-        latex_font_size = ('10pt', False),
-        latex_elements = ({}, False),
-        # now deprecated - use latex_elements
-        latex_preamble = ('', False),
-    )
-
-    def __init__(self, dirname, filename, overrides):
-        self.overrides = overrides
-        self.values = Config.config_values.copy()
-        config = {}
-        if dirname is not None:
-            config['__file__'] = path.join(dirname, filename)
-            olddir = os.getcwd()
-            try:
-                os.chdir(dirname)
-                execfile(config['__file__'], config)
-            finally:
-                os.chdir(olddir)
-        self._raw_config = config
-        # these two must be preinitialized because extensions can add their
-        # own config values
-        self.setup = config.get('setup', None)
-        self.extensions = config.get('extensions', [])
-
-    def init_values(self):
-        config = self._raw_config
-        config.update(self.overrides)
-        for name in config:
-            if name in self.values:
-                self.__dict__[name] = config[name]
-        del self._raw_config
-
-    def __getattr__(self, name):
-        if name.startswith('_'):
-            raise AttributeError(name)
-        if name not in self.values:
-            raise AttributeError('No such config value: %s' % name)
-        default = self.values[name][0]
-        if callable(default):
-            return default(self)
-        return default
-
-    def __getitem__(self, name):
-        return getattr(self, name)
-
-    def __setitem__(self, name, value):
-        setattr(self, name, value)
-
-    def __delitem__(self, name):
-        delattr(self, name)
-
-    def __contains__(self, name):
-        return name in self.values
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/directives/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.directives
-    ~~~~~~~~~~~~~~~~~
-
-    Handlers for additional ReST directives.
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-from sphinx.directives.desc import *
-from sphinx.directives.code import *
-from sphinx.directives.other import *
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/directives/code.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.directives.code
-    ~~~~~~~~~~~~~~~~~~~~~~
-
-    :copyright: 2007-2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import sys
-import codecs
-from os import path
-
-from docutils import nodes
-from docutils.parsers.rst import directives
-
-from sphinx import addnodes
-
-
-# ------ highlight directive --------------------------------------------------------
-
-def highlightlang_directive(name, arguments, options, content, lineno,
-                            content_offset, block_text, state, state_machine):
-    if 'linenothreshold' in options:
-        try:
-            linenothreshold = int(options['linenothreshold'])
-        except Exception:
-            linenothreshold = 10
-    else:
-        linenothreshold = sys.maxint
-    return [addnodes.highlightlang(lang=arguments[0].strip(),
-                                   linenothreshold=linenothreshold)]
-
-highlightlang_directive.content = 0
-highlightlang_directive.arguments = (1, 0, 0)
-highlightlang_directive.options = {'linenothreshold': directives.unchanged}
-directives.register_directive('highlight', highlightlang_directive)
-directives.register_directive('highlightlang', highlightlang_directive) # old name
-
-
-# ------ code-block directive -------------------------------------------------------
-
-def codeblock_directive(name, arguments, options, content, lineno,
-                        content_offset, block_text, state, state_machine):
-    code = u'\n'.join(content)
-    literal = nodes.literal_block(code, code)
-    literal['language'] = arguments[0]
-    literal['linenos'] = 'linenos' in options
-    return [literal]
-
-codeblock_directive.content = 1
-codeblock_directive.arguments = (1, 0, 0)
-codeblock_directive.options = {'linenos': directives.flag}
-directives.register_directive('code-block', codeblock_directive)
-directives.register_directive('sourcecode', codeblock_directive)
-
-
-# ------ literalinclude directive ---------------------------------------------------
-
-def literalinclude_directive(name, arguments, options, content, lineno,
-                             content_offset, block_text, state, state_machine):
-    """Like .. include:: :literal:, but only warns if the include file is not found."""
-    if not state.document.settings.file_insertion_enabled:
-        return [state.document.reporter.warning('File insertion disabled', line=lineno)]
-    env = state.document.settings.env
-    rel_fn = arguments[0]
-    source_dir = path.dirname(path.abspath(state_machine.input_lines.source(
-        lineno - state_machine.input_offset - 1)))
-    fn = path.normpath(path.join(source_dir, rel_fn))
-
-    encoding = options.get('encoding', env.config.source_encoding)
-    try:
-        f = codecs.open(fn, 'r', encoding)
-        text = f.read()
-        f.close()
-    except (IOError, OSError):
-        retnode = state.document.reporter.warning(
-            'Include file %r not found or reading it failed' % arguments[0], line=lineno)
-    except UnicodeError:
-        retnode = state.document.reporter.warning(
-            'Encoding %r used for reading included file %r seems to '
-            'be wrong, try giving an :encoding: option' %
-            (encoding, arguments[0]))
-    else:
-        retnode = nodes.literal_block(text, text, source=fn)
-        retnode.line = 1
-        if options.get('language', ''):
-            retnode['language'] = options['language']
-        if 'linenos' in options:
-            retnode['linenos'] = True
-        state.document.settings.env.note_dependency(rel_fn)
-    return [retnode]
-
-literalinclude_directive.options = {'linenos': directives.flag,
-                                    'language': directives.unchanged,
-                                    'encoding': directives.encoding}
-literalinclude_directive.content = 0
-literalinclude_directive.arguments = (1, 0, 0)
-directives.register_directive('literalinclude', literalinclude_directive)
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/directives/desc.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,592 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.directives.desc
-    ~~~~~~~~~~~~~~~~~~~~~~
-
-    :copyright: 2007-2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import re
-import string
-
-from docutils import nodes
-from docutils.parsers.rst import directives
-
-from sphinx import addnodes
-from sphinx.util import ws_re
-
-
-# ------ information units ---------------------------------------------------------
-
-def desc_index_text(desctype, module, name, add_modules):
-    if desctype == 'function':
-        if not module:
-            return _('%s() (built-in function)') % name
-        return _('%s() (in module %s)') % (name, module)
-    elif desctype == 'data':
-        if not module:
-            return _('%s (built-in variable)') % name
-        return _('%s (in module %s)') % (name, module)
-    elif desctype == 'class':
-        if not module:
-            return _('%s (built-in class)') % name
-        return _('%s (class in %s)') % (name, module)
-    elif desctype == 'exception':
-        return name
-    elif desctype == 'method':
-        try:
-            clsname, methname = name.rsplit('.', 1)
-        except ValueError:
-            if module:
-                return _('%s() (in module %s)') % (name, module)
-            else:
-                return '%s()' % name
-        if module and add_modules:
-            return _('%s() (%s.%s method)') % (methname, module, clsname)
-        else:
-            return _('%s() (%s method)') % (methname, clsname)
-    elif desctype == 'staticmethod':
-        try:
-            clsname, methname = name.rsplit('.', 1)
-        except ValueError:
-            if module:
-                return _('%s() (in module %s)') % (name, module)
-            else:
-                return '%s()' % name
-        if module and add_modules:
-            return _('%s() (%s.%s static method)') % (methname, module, clsname)
-        else:
-            return _('%s() (%s static method)') % (methname, clsname)
-    elif desctype == 'attribute':
-        try:
-            clsname, attrname = name.rsplit('.', 1)
-        except ValueError:
-            if module:
-                return _('%s (in module %s)') % (name, module)
-            else:
-                return name
-        if module and add_modules:
-            return _('%s (%s.%s attribute)') % (attrname, module, clsname)
-        else:
-            return _('%s (%s attribute)') % (attrname, clsname)
-    elif desctype == 'cfunction':
-        return _('%s (C function)') % name
-    elif desctype == 'cmember':
-        return _('%s (C member)') % name
-    elif desctype == 'cmacro':
-        return _('%s (C macro)') % name
-    elif desctype == 'ctype':
-        return _('%s (C type)') % name
-    elif desctype == 'cvar':
-        return _('%s (C variable)') % name
-    else:
-        raise ValueError('unhandled descenv: %s' % desctype)
-
-
-# ------ make field lists (like :param foo:) in desc bodies prettier
-
-_ = lambda x: x  # make gettext extraction in constants possible
-
-doc_fields_with_arg = {
-    'param': '%param',
-    'parameter': '%param',
-    'arg': '%param',
-    'argument': '%param',
-    'keyword': '%param',
-    'kwarg': '%param',
-    'kwparam': '%param',
-    'type': '%type',
-    'raises': _('Raises'),
-    'raise': 'Raises',
-    'exception': 'Raises',
-    'except': 'Raises',
-    'var': _('Variable'),
-    'ivar': 'Variable',
-    'cvar': 'Variable',
-    'returns': _('Returns'),
-    'return': 'Returns',
-}
-
-doc_fields_with_linked_arg = ('raises', 'raise', 'exception', 'except')
-
-doc_fields_without_arg = {
-    'returns': 'Returns',
-    'return': 'Returns',
-    'rtype': _('Return type'),
-}
-
-del _
-
-
-def _is_only_paragraph(node):
-    # determine if the node only contains one paragraph (and system messages)
-    if len(node) == 0:
-        return False
-    elif len(node) > 1:
-        for subnode in node[1:]:
-            if not isinstance(subnode, nodes.system_message):
-                return False
-    if isinstance(node[0], nodes.paragraph):
-        return True
-    return False
-
-
-def handle_doc_fields(node, env):
-    # don't traverse, only handle field lists that are immediate children
-    for child in node.children:
-        if not isinstance(child, nodes.field_list):
-            continue
-        params = None
-        param_nodes = {}
-        param_types = {}
-        new_list = nodes.field_list()
-        for field in child:
-            fname, fbody = field
-            try:
-                typ, obj = fname.astext().split(None, 1)
-                typdesc = _(doc_fields_with_arg[typ])
-                if _is_only_paragraph(fbody):
-                    children = fbody.children[0].children
-                else:
-                    children = fbody.children
-                if typdesc == '%param':
-                    if not params:
-                        pfield = nodes.field()
-                        pfield += nodes.field_name('', _('Parameters'))
-                        pfield += nodes.field_body()
-                        params = nodes.bullet_list()
-                        pfield[1] += params
-                        new_list += pfield
-                    dlitem = nodes.list_item()
-                    dlpar = nodes.paragraph()
-                    dlpar += nodes.emphasis(obj, obj)
-                    dlpar += nodes.Text(' -- ', ' -- ')
-                    dlpar += children
-                    param_nodes[obj] = dlpar
-                    dlitem += dlpar
-                    params += dlitem
-                elif typdesc == '%type':
-                    typenodes = fbody.children
-                    if _is_only_paragraph(fbody):
-                        typenodes = [nodes.Text(' (')] + \
-                                    typenodes[0].children + [nodes.Text(')')]
-                    param_types[obj] = typenodes
-                else:
-                    fieldname = typdesc + ' '
-                    nfield = nodes.field()
-                    nfieldname = nodes.field_name(fieldname, fieldname)
-                    nfield += nfieldname
-                    node = nfieldname
-                    if typ in doc_fields_with_linked_arg:
-                        node = addnodes.pending_xref(obj, reftype='obj',
-                                                     refcaption=False,
-                                                     reftarget=obj,
-                                                     modname=env.currmodule,
-                                                     classname=env.currclass)
-                        nfieldname += node
-                    node += nodes.Text(obj, obj)
-                    nfield += nodes.field_body()
-                    nfield[1] += fbody.children
-                    new_list += nfield
-            except (KeyError, ValueError):
-                fnametext = fname.astext()
-                try:
-                    typ = _(doc_fields_without_arg[fnametext])
-                except KeyError:
-                    # at least capitalize the field name
-                    typ = fnametext.capitalize()
-                fname[0] = nodes.Text(typ)
-                new_list += field
-        for param, type in param_types.iteritems():
-            if param in param_nodes:
-                param_nodes[param][1:1] = type
-        child.replace_self(new_list)
-
-
-# ------ functions to parse a Python or C signature and create desc_* nodes.
-
-py_sig_re = re.compile(
-    r'''^ ([\w.]*\.)?            # class name(s)
-          (\w+)  \s*             # thing name
-          (?: \((.*)\)           # optional arguments
-          (\s* -> \s* .*)? )? $  # optional return annotation
-          ''', re.VERBOSE)
-
-py_paramlist_re = re.compile(r'([\[\],])')  # split at '[', ']' and ','
-
-def parse_py_signature(signode, sig, desctype, module, env):
-    """
-    Transform a python signature into RST nodes.
-    Return (fully qualified name of the thing, classname if any).
-
-    If inside a class, the current class name is handled intelligently:
-    * it is stripped from the displayed name if present
-    * it is added to the full name (return value) if not present
-    """
-    m = py_sig_re.match(sig)
-    if m is None:
-        raise ValueError
-    classname, name, arglist, retann = m.groups()
-
-    if retann:
-        retann = u' \N{RIGHTWARDS ARROW} ' + retann.strip()[2:]
-
-    if env.currclass:
-        add_module = False
-        if classname and classname.startswith(env.currclass):
-            fullname = classname + name
-            # class name is given again in the signature
-            classname = classname[len(env.currclass):].lstrip('.')
-        elif classname:
-            # class name is given in the signature, but different
-            # (shouldn't happen)
-            fullname = env.currclass + '.' + classname + name
-        else:
-            # class name is not given in the signature
-            fullname = env.currclass + '.' + name
-    else:
-        add_module = True
-        fullname = classname and classname + name or name
-
-    if desctype == 'staticmethod':
-        signode += addnodes.desc_annotation('static ', 'static ')
-
-    if classname:
-        signode += addnodes.desc_addname(classname, classname)
-    # exceptions are a special case, since they are documented in the
-    # 'exceptions' module.
-    elif add_module and env.config.add_module_names and \
-           module and module != 'exceptions':
-        nodetext = module + '.'
-        signode += addnodes.desc_addname(nodetext, nodetext)
-
-    signode += addnodes.desc_name(name, name)
-    if not arglist:
-        if desctype in ('function', 'method', 'staticmethod'):
-            # for callables, add an empty parameter list
-            signode += addnodes.desc_parameterlist()
-        if retann:
-            signode += addnodes.desc_type(retann, retann)
-        return fullname, classname
-    signode += addnodes.desc_parameterlist()
-
-    stack = [signode[-1]]
-    for token in py_paramlist_re.split(arglist):
-        if token == '[':
-            opt = addnodes.desc_optional()
-            stack[-1] += opt
-            stack.append(opt)
-        elif token == ']':
-            try:
-                stack.pop()
-            except IndexError:
-                raise ValueError
-        elif not token or token == ',' or token.isspace():
-            pass
-        else:
-            token = token.strip()
-            stack[-1] += addnodes.desc_parameter(token, token)
-    if len(stack) != 1:
-        raise ValueError
-    if retann:
-        signode += addnodes.desc_type(retann, retann)
-    return fullname, classname
-
-
-c_sig_re = re.compile(
-    r'''^([^(]*?)          # return type
-        ([\w:]+)  \s*      # thing name (colon allowed for C++ class names)
-        (?: \((.*)\) )?    # optionally arguments
-        (\s+const)? $      # const specifier
-    ''', re.VERBOSE)
-c_funcptr_sig_re = re.compile(
-    r'''^([^(]+?)          # return type
-        (\( [^()]+ \)) \s* # name in parentheses
-        \( (.*) \)         # arguments
-        (\s+const)? $      # const specifier
-    ''', re.VERBOSE)
-c_funcptr_name_re = re.compile(r'^\(\s*\*\s*(.*?)\s*\)$')
-
-# RE to split at word boundaries
-wsplit_re = re.compile(r'(\W+)')
-
-# These C types aren't described in the reference, so don't try to create
-# a cross-reference to them
-stopwords = set(('const', 'void', 'char', 'int', 'long', 'FILE', 'struct'))
-
-def parse_c_type(node, ctype):
-    # add cross-ref nodes for all words
-    for part in filter(None, wsplit_re.split(ctype)):
-        tnode = nodes.Text(part, part)
-        if part[0] in string.letters+'_' and part not in stopwords:
-            pnode = addnodes.pending_xref(
-                '', reftype='ctype', reftarget=part, modname=None, classname=None)
-            pnode += tnode
-            node += pnode
-        else:
-            node += tnode
-
-def parse_c_signature(signode, sig, desctype):
-    """Transform a C (or C++) signature into RST nodes."""
-    # first try the function pointer signature regex, it's more specific
-    m = c_funcptr_sig_re.match(sig)
-    if m is None:
-        m = c_sig_re.match(sig)
-    if m is None:
-        raise ValueError('no match')
-    rettype, name, arglist, const = m.groups()
-
-    signode += addnodes.desc_type('', '')
-    parse_c_type(signode[-1], rettype)
-    try:
-        classname, funcname = name.split('::', 1)
-        classname += '::'
-        signode += addnodes.desc_addname(classname, classname)
-        signode += addnodes.desc_name(funcname, funcname)
-        # name (the full name) is still both parts
-    except ValueError:
-        signode += addnodes.desc_name(name, name)
-    # clean up parentheses from canonical name
-    m = c_funcptr_name_re.match(name)
-    if m:
-        name = m.group(1)
-    if not arglist:
-        if desctype == 'cfunction':
-            # for functions, add an empty parameter list
-            signode += addnodes.desc_parameterlist()
-        return name
-
-    paramlist = addnodes.desc_parameterlist()
-    arglist = arglist.replace('`', '').replace('\\ ', '') # remove markup
-    # this messes up function pointer types, but not too badly ;)
-    args = arglist.split(',')
-    for arg in args:
-        arg = arg.strip()
-        param = addnodes.desc_parameter('', '', noemph=True)
-        try:
-            ctype, argname = arg.rsplit(' ', 1)
-        except ValueError:
-            # no argument name given, only the type
-            parse_c_type(param, arg)
-        else:
-            parse_c_type(param, ctype)
-            param += nodes.emphasis(' '+argname, ' '+argname)
-        paramlist += param
-    signode += paramlist
-    if const:
-        signode += addnodes.desc_addname(const, const)
-    return name
-
-
-option_desc_re = re.compile(
-    r'((?:/|-|--)[-_a-zA-Z0-9]+)(\s*.*?)(?=,\s+(?:/|-|--)|$)')
-
-def parse_option_desc(signode, sig):
-    """Transform an option description into RST nodes."""
-    count = 0
-    firstname = ''
-    for m in option_desc_re.finditer(sig):
-        optname, args = m.groups()
-        if count:
-            signode += addnodes.desc_addname(', ', ', ')
-        signode += addnodes.desc_name(optname, optname)
-        signode += addnodes.desc_addname(args, args)
-        if not count:
-            firstname = optname
-        count += 1
-    if not firstname:
-        raise ValueError
-    return firstname
-
-
-strip_backslash_re = re.compile(r'\\(?=[^\\])')
-
-def desc_directive(desctype, arguments, options, content, lineno,
-                   content_offset, block_text, state, state_machine):
-    env = state.document.settings.env
-    inode = addnodes.index(entries=[])
-    node = addnodes.desc()
-    node['desctype'] = desctype
-
-    noindex = ('noindex' in options)
-    node['noindex'] = noindex
-    # remove backslashes to support (dummy) escapes; helps Vim's highlighting
-    signatures = map(lambda s: strip_backslash_re.sub('', s.strip()),
-                     arguments[0].split('\n'))
-    names = []
-    clsname = None
-    module = options.get('module', env.currmodule)
-    for i, sig in enumerate(signatures):
-        # add a signature node for each signature in the current unit
-        # and add a reference target for it
-        sig = sig.strip()
-        signode = addnodes.desc_signature(sig, '')
-        signode['first'] = False
-        node.append(signode)
-        try:
-            if desctype in ('function', 'data', 'class', 'exception',
-                            'method', 'staticmethod', 'attribute'):
-                name, clsname = parse_py_signature(signode, sig, desctype, module, env)
-            elif desctype in ('cfunction', 'cmember', 'cmacro', 'ctype', 'cvar'):
-                name = parse_c_signature(signode, sig, desctype)
-            elif desctype == 'cmdoption':
-                optname = parse_option_desc(signode, sig)
-                if not noindex:
-                    targetname = optname.replace('/', '-')
-                    if env.currprogram:
-                        targetname = '-' + env.currprogram + targetname
-                    targetname = 'cmdoption' + targetname
-                    signode['ids'].append(targetname)
-                    state.document.note_explicit_target(signode)
-                    inode['entries'].append(
-                        ('pair', _('%scommand line option; %s') %
-                         ((env.currprogram and env.currprogram + ' ' or ''), sig),
-                         targetname, targetname))
-                    env.note_progoption(optname, targetname)
-                continue
-            elif desctype == 'describe':
-                signode.clear()
-                signode += addnodes.desc_name(sig, sig)
-                continue
-            else:
-                # another registered generic x-ref directive
-                rolename, indextemplate, parse_node = additional_xref_types[desctype]
-                if parse_node:
-                    fullname = parse_node(env, sig, signode)
-                else:
-                    signode.clear()
-                    signode += addnodes.desc_name(sig, sig)
-                    # normalize whitespace like xfileref_role does
-                    fullname = ws_re.sub('', sig)
-                if not noindex:
-                    targetname = '%s-%s' % (rolename, fullname)
-                    signode['ids'].append(targetname)
-                    state.document.note_explicit_target(signode)
-                    if indextemplate:
-                        indexentry = _(indextemplate) % (fullname,)
-                        indextype = 'single'
-                        colon = indexentry.find(':')
-                        if colon != -1:
-                            indextype = indexentry[:colon].strip()
-                            indexentry = indexentry[colon+1:].strip()
-                        inode['entries'].append((indextype, indexentry,
-                                                 targetname, targetname))
-                    env.note_reftarget(rolename, fullname, targetname)
-                # don't use object indexing below
-                continue
-        except ValueError, err:
-            # signature parsing failed
-            signode.clear()
-            signode += addnodes.desc_name(sig, sig)
-            continue             # we don't want an index entry here
-        # only add target and index entry if this is the first description of the
-        # function name in this desc block
-        if not noindex and name not in names:
-            fullname = (module and module + '.' or '') + name
-            # note target
-            if fullname not in state.document.ids:
-                signode['names'].append(fullname)
-                signode['ids'].append(fullname)
-                signode['first'] = (not names)
-                state.document.note_explicit_target(signode)
-                env.note_descref(fullname, desctype, lineno)
-            names.append(name)
-
-            indextext = desc_index_text(desctype, module, name,
-                                        env.config.add_module_names)
-            inode['entries'].append(('single', indextext, fullname, fullname))
-
-    subnode = addnodes.desc_content()
-    # needed for automatic qualification of members
-    clsname_set = False
-    if desctype in ('class', 'exception') and names:
-        env.currclass = names[0]
-        clsname_set = True
-    elif desctype in ('method', 'staticmethod', 'attribute') and \
-             clsname and not env.currclass:
-        env.currclass = clsname.strip('.')
-        clsname_set = True
-    # needed for association of version{added,changed} directives
-    if names:
-        env.currdesc = names[0]
-    state.nested_parse(content, content_offset, subnode)
-    handle_doc_fields(subnode, env)
-    if clsname_set:
-        env.currclass = None
-    env.currdesc = None
-    node.append(subnode)
-    return [inode, node]
-
-desc_directive.content = 1
-desc_directive.arguments = (1, 0, 1)
-desc_directive.options = {'noindex': directives.flag,
-                          'module': directives.unchanged}
-
-desctypes = [
-    # the Python ones
-    'function',
-    'data',
-    'class',
-    'method',
-    'staticmethod',
-    'attribute',
-    'exception',
-    # the C ones
-    'cfunction',
-    'cmember',
-    'cmacro',
-    'ctype',
-    'cvar',
-    # for command line options
-    'cmdoption',
-    # the generic one
-    'describe',
-    'envvar',
-]
-
-for _name in desctypes:
-    directives.register_directive(_name, desc_directive)
-
-_ = lambda x: x
-
-# Generic cross-reference types; they can be registered in the application;
-# the directives are either desc_directive or target_directive
-additional_xref_types = {
-    # directive name: (role name, index text, function to parse the desc node)
-    'envvar': ('envvar', _('environment variable; %s'), None),
-}
-
-del _
-
-
-# ------ target --------------------------------------------------------------------
-
-def target_directive(targettype, arguments, options, content, lineno,
-                     content_offset, block_text, state, state_machine):
-    """Generic target for user-defined cross-reference types."""
-    env = state.document.settings.env
-    rolename, indextemplate, foo = additional_xref_types[targettype]
-    # normalize whitespace in fullname like xfileref_role does
-    fullname = ws_re.sub('', arguments[0].strip())
-    targetname = '%s-%s' % (rolename, fullname)
-    node = nodes.target('', '', ids=[targetname])
-    state.document.note_explicit_target(node)
-    ret = [node]
-    if indextemplate:
-        indexentry = indextemplate % (fullname,)
-        indextype = 'single'
-        colon = indexentry.find(':')
-        if colon != -1:
-            indextype = indexentry[:colon].strip()
-            indexentry = indexentry[colon+1:].strip()
-        inode = addnodes.index(entries=[(indextype, indexentry, targetname, targetname)])
-        ret.insert(0, inode)
-    env.note_reftarget(rolename, fullname, targetname)
-    return ret
-
-target_directive.content = 0
-target_directive.arguments = (1, 0, 1)
-
-# note, the target directive is not registered here, it is used by the application
-# when registering additional xref types
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/directives/other.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,411 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.directives.other
-    ~~~~~~~~~~~~~~~~~~~~~~~
-
-    :copyright: 2007-2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import re
-import posixpath
-
-from docutils import nodes
-from docutils.parsers.rst import directives
-
-from sphinx import addnodes
-from sphinx.locale import pairindextypes
-from sphinx.util import patfilter, ws_re, caption_ref_re
-from sphinx.util.compat import make_admonition
-
-
-# ------ the TOC tree ---------------------------------------------------------------
-
-def toctree_directive(name, arguments, options, content, lineno,
-                      content_offset, block_text, state, state_machine):
-    env = state.document.settings.env
-    suffix = env.config.source_suffix
-    dirname = posixpath.dirname(env.docname)
-    glob = 'glob' in options
-
-    ret = []
-    subnode = addnodes.toctree()
-    includefiles = []
-    includetitles = {}
-    all_docnames = env.found_docs.copy()
-    # don't add the currently visited file in catch-all patterns
-    all_docnames.remove(env.docname)
-    for entry in content:
-        if not entry:
-            continue
-        if not glob:
-            # look for explicit titles and documents ("Some Title <document>").
-            m = caption_ref_re.match(entry)
-            if m:
-                docname = m.group(2)
-                includetitles[docname] = m.group(1)
-            else:
-                docname = entry
-            # remove suffixes (backwards compatibility)
-            if docname.endswith(suffix):
-                docname = docname[:-len(suffix)]
-            # absolutize filenames
-            docname = posixpath.normpath(posixpath.join(dirname, docname))
-            if docname not in env.found_docs:
-                ret.append(state.document.reporter.warning(
-                    'toctree references unknown document %r' % docname, line=lineno))
-            else:
-                includefiles.append(docname)
-        else:
-            patname = posixpath.normpath(posixpath.join(dirname, entry))
-            docnames = sorted(patfilter(all_docnames, patname))
-            for docname in docnames:
-                all_docnames.remove(docname) # don't include it again
-                includefiles.append(docname)
-            if not docnames:
-                ret.append(state.document.reporter.warning(
-                    'toctree glob pattern %r didn\'t match any documents' % entry,
-                    line=lineno))
-    subnode['includefiles'] = includefiles
-    subnode['includetitles'] = includetitles
-    subnode['maxdepth'] = options.get('maxdepth', -1)
-    subnode['glob'] = glob
-    ret.append(subnode)
-    return ret
-
-toctree_directive.content = 1
-toctree_directive.options = {'maxdepth': int, 'glob': directives.flag}
-directives.register_directive('toctree', toctree_directive)
-
-
-# ------ section metadata ----------------------------------------------------------
-
-def module_directive(name, arguments, options, content, lineno,
-                     content_offset, block_text, state, state_machine):
-    env = state.document.settings.env
-    modname = arguments[0].strip()
-    noindex = 'noindex' in options
-    env.currmodule = modname
-    env.note_module(modname, options.get('synopsis', ''),
-                    options.get('platform', ''),
-                    'deprecated' in options)
-    modulenode = addnodes.module()
-    modulenode['modname'] = modname
-    modulenode['synopsis'] = options.get('synopsis', '')
-    targetnode = nodes.target('', '', ids=['module-' + modname])
-    state.document.note_explicit_target(targetnode)
-    ret = [modulenode, targetnode]
-    if 'platform' in options:
-        modulenode['platform'] = options['platform']
-        node = nodes.paragraph()
-        node += nodes.emphasis('', _('Platforms: '))
-        node += nodes.Text(options['platform'], options['platform'])
-        ret.append(node)
-    # the synopsis isn't printed; in fact, it is only used in the modindex currently
-    if not noindex:
-        indextext = _('%s (module)') % modname
-        inode = addnodes.index(entries=[('single', indextext,
-                                         'module-' + modname, modname)])
-        ret.insert(0, inode)
-    return ret
-
-module_directive.arguments = (1, 0, 0)
-module_directive.options = {'platform': lambda x: x,
-                            'synopsis': lambda x: x,
-                            'noindex': directives.flag,
-                            'deprecated': directives.flag}
-directives.register_directive('module', module_directive)
-
-
-def currentmodule_directive(name, arguments, options, content, lineno,
-                            content_offset, block_text, state, state_machine):
-    # This directive is just to tell people that we're documenting
-    # stuff in module foo, but links to module foo won't lead here.
-    env = state.document.settings.env
-    modname = arguments[0].strip()
-    if modname == 'None':
-        env.currmodule = None
-    else:
-        env.currmodule = modname
-    return []
-
-currentmodule_directive.arguments = (1, 0, 0)
-directives.register_directive('currentmodule', currentmodule_directive)
-
-
-def author_directive(name, arguments, options, content, lineno,
-                     content_offset, block_text, state, state_machine):
-    # Show authors only if the show_authors option is on
-    env = state.document.settings.env
-    if not env.config.show_authors:
-        return []
-    para = nodes.paragraph()
-    emph = nodes.emphasis()
-    para += emph
-    if name == 'sectionauthor':
-        text = _('Section author: ')
-    elif name == 'moduleauthor':
-        text = _('Module author: ')
-    else:
-        text = _('Author: ')
-    emph += nodes.Text(text, text)
-    inodes, messages = state.inline_text(arguments[0], lineno)
-    emph.extend(inodes)
-    return [para] + messages
-
-author_directive.arguments = (1, 0, 1)
-directives.register_directive('sectionauthor', author_directive)
-directives.register_directive('moduleauthor', author_directive)
-
-
-def program_directive(name, arguments, options, content, lineno,
-                      content_offset, block_text, state, state_machine):
-    env = state.document.settings.env
-    program = ws_re.sub('-', arguments[0].strip())
-    if program == 'None':
-        env.currprogram = None
-    else:
-        env.currprogram = program
-    return []
-
-program_directive.arguments = (1, 0, 1)
-directives.register_directive('program', program_directive)
-
-
-# ------ index markup --------------------------------------------------------------
-
-indextypes = [
-    'single', 'pair', 'triple',
-]
-
-def index_directive(name, arguments, options, content, lineno,
-                    content_offset, block_text, state, state_machine):
-    arguments = arguments[0].split('\n')
-    env = state.document.settings.env
-    targetid = 'index-%s' % env.index_num
-    env.index_num += 1
-    targetnode = nodes.target('', '', ids=[targetid])
-    state.document.note_explicit_target(targetnode)
-    indexnode = addnodes.index()
-    indexnode['entries'] = ne = []
-    for entry in arguments:
-        entry = entry.strip()
-        for type in pairindextypes:
-            if entry.startswith(type+':'):
-                value = entry[len(type)+1:].strip()
-                value = pairindextypes[type] + '; ' + value
-                ne.append(('pair', value, targetid, value))
-                break
-        else:
-            for type in indextypes:
-                if entry.startswith(type+':'):
-                    value = entry[len(type)+1:].strip()
-                    ne.append((type, value, targetid, value))
-                    break
-            # shorthand notation for single entries
-            else:
-                for value in entry.split(','):
-                    value = value.strip()
-                    if not value:
-                        continue
-                    ne.append(('single', value, targetid, value))
-    return [indexnode, targetnode]
-
-index_directive.arguments = (1, 0, 1)
-directives.register_directive('index', index_directive)
-
-# ------ versionadded/versionchanged -----------------------------------------------
-
-def version_directive(name, arguments, options, content, lineno,
-                      content_offset, block_text, state, state_machine):
-    node = addnodes.versionmodified()
-    node['type'] = name
-    node['version'] = arguments[0]
-    if len(arguments) == 2:
-        inodes, messages = state.inline_text(arguments[1], lineno+1)
-        node.extend(inodes)
-        if content:
-            state.nested_parse(content, content_offset, node)
-        ret = [node] + messages
-    else:
-        ret = [node]
-    env = state.document.settings.env
-    env.note_versionchange(node['type'], node['version'], node, lineno)
-    return ret
-
-version_directive.arguments = (1, 1, 1)
-version_directive.content = 1
-
-directives.register_directive('deprecated', version_directive)
-directives.register_directive('versionadded', version_directive)
-directives.register_directive('versionchanged', version_directive)
-
-
-# ------ see also ------------------------------------------------------------------
-
-def seealso_directive(name, arguments, options, content, lineno,
-                      content_offset, block_text, state, state_machine):
-    ret = make_admonition(
-        addnodes.seealso, name, [_('See also')], options, content,
-        lineno, content_offset, block_text, state, state_machine)
-    if arguments:
-        argnodes, msgs = state.inline_text(arguments[0], lineno)
-        para = nodes.paragraph()
-        para += argnodes
-        para += msgs
-        ret[0].insert(1, para)
-    return ret
-
-seealso_directive.content = 1
-seealso_directive.arguments = (0, 1, 1)
-directives.register_directive('seealso', seealso_directive)
-
-
-# ------ production list (for the reference) ---------------------------------------
-
-token_re = re.compile('`([a-z_]+)`')
-
-def token_xrefs(text, env):
-    retnodes = []
-    pos = 0
-    for m in token_re.finditer(text):
-        if m.start() > pos:
-            txt = text[pos:m.start()]
-            retnodes.append(nodes.Text(txt, txt))
-        refnode = addnodes.pending_xref(m.group(1))
-        refnode['reftype'] = 'token'
-        refnode['reftarget'] = m.group(1)
-        refnode['modname'] = env.currmodule
-        refnode['classname'] = env.currclass
-        refnode += nodes.literal(m.group(1), m.group(1), classes=['xref'])
-        retnodes.append(refnode)
-        pos = m.end()
-    if pos < len(text):
-        retnodes.append(nodes.Text(text[pos:], text[pos:]))
-    return retnodes
-
-def productionlist_directive(name, arguments, options, content, lineno,
-                             content_offset, block_text, state, state_machine):
-    env = state.document.settings.env
-    node = addnodes.productionlist()
-    messages = []
-    i = 0
-
-    for rule in arguments[0].split('\n'):
-        if i == 0 and ':' not in rule:
-            # production group
-            continue
-        i += 1
-        try:
-            name, tokens = rule.split(':', 1)
-        except ValueError:
-            break
-        subnode = addnodes.production()
-        subnode['tokenname'] = name.strip()
-        if subnode['tokenname']:
-            idname = 'grammar-token-%s' % subnode['tokenname']
-            if idname not in state.document.ids:
-                subnode['ids'].append(idname)
-            state.document.note_implicit_target(subnode, subnode)
-            env.note_reftarget('token', subnode['tokenname'], idname)
-        subnode.extend(token_xrefs(tokens, env))
-        node.append(subnode)
-    return [node] + messages
-
-productionlist_directive.content = 0
-productionlist_directive.arguments = (1, 0, 1)
-directives.register_directive('productionlist', productionlist_directive)
-
-
-# ------ glossary directive ---------------------------------------------------------
-
-def glossary_directive(name, arguments, options, content, lineno,
-                       content_offset, block_text, state, state_machine):
-    """Glossary with cross-reference targets for :term: roles."""
-    env = state.document.settings.env
-    node = addnodes.glossary()
-    state.nested_parse(content, content_offset, node)
-
-    # the content should be definition lists
-    dls = [child for child in node if isinstance(child, nodes.definition_list)]
-    # now, extract definition terms to enable cross-reference creation
-    for dl in dls:
-        dl['classes'].append('glossary')
-        for li in dl.children:
-            if not li.children or not isinstance(li[0], nodes.term):
-                continue
-            termtext = li.children[0].astext()
-            new_id = 'term-' + nodes.make_id(termtext)
-            if new_id in env.gloss_entries:
-                new_id = 'term-' + str(len(env.gloss_entries))
-            env.gloss_entries.add(new_id)
-            li[0]['names'].append(new_id)
-            li[0]['ids'].append(new_id)
-            state.document.settings.env.note_reftarget('term', termtext.lower(),
-                                                       new_id)
-            # add an index entry too
-            indexnode = addnodes.index()
-            indexnode['entries'] = [('single', termtext, new_id, termtext)]
-            li.insert(0, indexnode)
-    return [node]
-
-glossary_directive.content = 1
-glossary_directive.arguments = (0, 0, 0)
-directives.register_directive('glossary', glossary_directive)
-
-
-# ------ miscellaneous markup -------------------------------------------------------
-
-def centered_directive(name, arguments, options, content, lineno,
-                       content_offset, block_text, state, state_machine):
-    if not arguments:
-        return []
-    subnode = addnodes.centered()
-    inodes, messages = state.inline_text(arguments[0], lineno)
-    subnode.extend(inodes)
-    return [subnode] + messages
-
-centered_directive.arguments = (1, 0, 1)
-directives.register_directive('centered', centered_directive)
-
-
-def acks_directive(name, arguments, options, content, lineno,
-                   content_offset, block_text, state, state_machine):
-    node = addnodes.acks()
-    state.nested_parse(content, content_offset, node)
-    if len(node.children) != 1 or not isinstance(node.children[0], nodes.bullet_list):
-        return [state.document.reporter.warning('.. acks content is not a list',
-                                                line=lineno)]
-    return [node]
-
-acks_directive.content = 1
-acks_directive.arguments = (0, 0, 0)
-directives.register_directive('acks', acks_directive)
-
-
-def tabularcolumns_directive(name, arguments, options, content, lineno,
-                             content_offset, block_text, state, state_machine):
-    # support giving explicit tabulary column definition to latex
-    node = addnodes.tabular_col_spec()
-    node['spec'] = arguments[0]
-    return [node]
-
-tabularcolumns_directive.content = 0
-tabularcolumns_directive.arguments = (1, 0, 1)
-directives.register_directive('tabularcolumns', tabularcolumns_directive)
-
-
-# register the standard rst class directive under a different name
-
-try:
-    # docutils 0.4
-    from docutils.parsers.rst.directives.misc import class_directive
-    directives.register_directive('cssclass', class_directive)
-except ImportError:
-    try:
-        # docutils 0.5
-        from docutils.parsers.rst.directives.misc import Class
-        directives.register_directive('cssclass', Class)
-    except ImportError:
-        # whatever :)
-        pass
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/environment.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1387 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.environment
-    ~~~~~~~~~~~~~~~~~~
-
-    Global creation environment.
-
-    :copyright: 2007-2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import re
-import os
-import time
-import heapq
-import types
-import imghdr
-import difflib
-import cPickle as pickle
-from os import path
-from glob import glob
-from string import uppercase
-from itertools import izip, groupby
-try:
-    import hashlib
-    md5 = hashlib.md5
-except ImportError:
-    # 2.4 compatibility
-    import md5
-    md5 = md5.new
-
-from docutils import nodes
-from docutils.io import FileInput, NullOutput
-from docutils.core import Publisher
-from docutils.utils import Reporter, relative_path
-from docutils.readers import standalone
-from docutils.parsers.rst import roles
-from docutils.parsers.rst.languages import en as english
-from docutils.parsers.rst.directives.html import MetaBody
-from docutils.writers import UnfilteredWriter
-from docutils.transforms import Transform
-from docutils.transforms.parts import ContentsFilter
-
-from sphinx import addnodes
-from sphinx.util import get_matching_docs, SEP, ustrftime
-from sphinx.directives import additional_xref_types
-
-default_settings = {
-    'embed_stylesheet': False,
-    'cloak_email_addresses': True,
-    'pep_base_url': 'http://www.python.org/dev/peps/',
-    'rfc_base_url': 'http://rfc.net/',
-    'input_encoding': 'utf-8',
-    'doctitle_xform': False,
-    'sectsubtitle_xform': False,
-}
-
-# This is increased every time an environment attribute is added
-# or changed to properly invalidate pickle files.
-ENV_VERSION = 26
-
-
-default_substitutions = set([
-    'version',
-    'release',
-    'today',
-])
-
-dummy_reporter = Reporter('', 4, 4)
-
-
-class RedirStream(object):
-    def __init__(self, writefunc):
-        self.writefunc = writefunc
-    def write(self, text):
-        if text.strip():
-            self.writefunc(text)
-
-
-class NoUri(Exception):
-    """Raised by get_relative_uri if there is no URI available."""
-    pass
-
-
-class DefaultSubstitutions(Transform):
-    """
-    Replace some substitutions if they aren't defined in the document.
-    """
-    # run before the default Substitutions
-    default_priority = 210
-
-    def apply(self):
-        config = self.document.settings.env.config
-        # only handle those not otherwise defined in the document
-        to_handle = default_substitutions - set(self.document.substitution_defs)
-        for ref in self.document.traverse(nodes.substitution_reference):
-            refname = ref['refname']
-            if refname in to_handle:
-                text = config[refname]
-                if refname == 'today' and not text:
-                    # special handling: can also specify a strftime format
-                    text = ustrftime(config.today_fmt or _('%B %d, %Y'))
-                ref.replace_self(nodes.Text(text, text))
-
-
-class MoveModuleTargets(Transform):
-    """
-    Move module targets to their nearest enclosing section title.
-    """
-    default_priority = 210
-
-    def apply(self):
-        for node in self.document.traverse(nodes.target):
-            if not node['ids']:
-                continue
-            if node['ids'][0].startswith('module-') and \
-                   node.parent.__class__ is nodes.section:
-                node.parent['ids'] = node['ids']
-                node.parent.remove(node)
-
-
-class HandleCodeBlocks(Transform):
-    """
-    Move doctest blocks out of blockquotes.
-    """
-    default_priority = 210
-
-    def apply(self):
-        for node in self.document.traverse(nodes.block_quote):
-            if len(node.children) == 1 and isinstance(node.children[0],
-                                                      nodes.doctest_block):
-                node.replace_self(node.children[0])
-
-class CitationReferences(Transform):
-    """
-    Handle citation references before the default docutils transform does.
-    """
-    default_priority = 619
-
-    def apply(self):
-        for citnode in self.document.traverse(nodes.citation_reference):
-            cittext = citnode.astext()
-            refnode = addnodes.pending_xref(cittext, reftype='citation',
-                                            reftarget=cittext)
-            refnode += nodes.Text('[' + cittext + ']')
-            citnode.parent.replace(citnode, refnode)
-
-
-class SphinxStandaloneReader(standalone.Reader):
-    """
-    Add our own transforms.
-    """
-    transforms = [CitationReferences, DefaultSubstitutions, MoveModuleTargets,
-                  HandleCodeBlocks]
-
-    def get_transforms(self):
-        return standalone.Reader.get_transforms(self) + self.transforms
-
-
-class SphinxDummyWriter(UnfilteredWriter):
-    supported = ('html',)  # needed to keep "meta" nodes
-
-    def translate(self):
-        pass
-
-
-
-class SphinxContentsFilter(ContentsFilter):
-    """
-    Used with BuildEnvironment.add_toc_from() to discard cross-file links
-    within table-of-contents link nodes.
-    """
-    def visit_pending_xref(self, node):
-        text = node.astext()
-        self.parent.append(nodes.literal(text, text))
-        raise nodes.SkipNode
-
-
-class BuildEnvironment:
-    """
-    The environment in which the ReST files are translated.
-    Stores an inventory of cross-file targets and provides doctree
-    transformations to resolve links to them.
-    """
-
-    # --------- ENVIRONMENT PERSISTENCE ----------------------------------------
-
-    @staticmethod
-    def frompickle(config, filename):
-        picklefile = open(filename, 'rb')
-        try:
-            env = pickle.load(picklefile)
-        finally:
-            picklefile.close()
-        env.config.values = config.values
-        if env.version != ENV_VERSION:
-            raise IOError('env version not current')
-        return env
-
-    def topickle(self, filename):
-        # remove unpicklable attributes
-        warnfunc = self._warnfunc
-        self.set_warnfunc(None)
-        values = self.config.values
-        del self.config.values
-        picklefile = open(filename, 'wb')
-        # remove potentially pickling-problematic values from config
-        for key, val in vars(self.config).items():
-            if key.startswith('_') or \
-                   isinstance(val, types.ModuleType) or \
-                   isinstance(val, types.FunctionType) or \
-                   isinstance(val, (type, types.ClassType)):
-                del self.config[key]
-        try:
-            pickle.dump(self, picklefile, pickle.HIGHEST_PROTOCOL)
-        finally:
-            picklefile.close()
-        # reset attributes
-        self.config.values = values
-        self.set_warnfunc(warnfunc)
-
-    # --------- ENVIRONMENT INITIALIZATION -------------------------------------
-
-    def __init__(self, srcdir, doctreedir, config):
-        self.doctreedir = doctreedir
-        self.srcdir = srcdir
-        self.config = config
-
-        # the application object; only set while update() runs
-        self.app = None
-
-        # the docutils settings for building
-        self.settings = default_settings.copy()
-        self.settings['env'] = self
-
-        # the function to write warning messages with
-        self._warnfunc = None
-
-        # this is to invalidate old pickles
-        self.version = ENV_VERSION
-
-        # All "docnames" here are /-separated and relative and exclude the source suffix.
-
-        self.found_docs = set()     # contains all existing docnames
-        self.all_docs = {}          # docname -> mtime at the time of build
-                                    # contains all built docnames
-        self.dependencies = {}      # docname -> set of dependent file names, relative to
-                                    # documentation root
-
-        # File metadata
-        self.metadata = {}          # docname -> dict of metadata items
-
-        # TOC inventory
-        self.titles = {}            # docname -> title node
-        self.tocs = {}              # docname -> table of contents nodetree
-        self.toc_num_entries = {}   # docname -> number of real entries
-                                    # used to determine when to show the TOC in a sidebar
-                                    # (don't show if it's only one item)
-        self.toctree_includes = {}  # docname -> list of toctree includefiles
-        self.files_to_rebuild = {}  # docname -> set of files (containing its TOCs)
-                                    # to rebuild too
-        self.glob_toctrees = set()  # docnames that have :glob: toctrees
-
-        # X-ref target inventory
-        self.descrefs = {}          # fullname -> docname, desctype
-        self.filemodules = {}       # docname -> [modules]
-        self.modules = {}           # modname -> docname, synopsis, platform, deprecated
-        self.labels = {}            # labelname -> docname, labelid, sectionname
-        self.anonlabels = {}        # labelname -> docname, labelid
-        self.progoptions = {}       # (program, name) -> docname, labelid
-        self.reftargets = {}        # (type, name) -> docname, labelid
-                                    # where type is term, token, envvar, citation
-
-        # Other inventories
-        self.indexentries = {}      # docname -> list of
-                                    # (type, string, target, aliasname)
-        self.versionchanges = {}    # version -> list of
-                                    # (type, docname, lineno, module, descname, content)
-        self.images = {}            # absolute path -> (docnames, unique filename)
-
-        # These are set while parsing a file
-        self.docname = None         # current document name
-        self.currmodule = None      # current module name
-        self.currclass = None       # current class name
-        self.currdesc = None        # current descref name
-        self.currprogram = None     # current program name
-        self.index_num = 0          # autonumber for index targets
-        self.gloss_entries = set()  # existing definition labels
-
-        # Some magically present labels
-        self.labels['genindex'] = ('genindex', '', _('Index'))
-        self.labels['modindex'] = ('modindex', '', _('Module Index'))
-        self.labels['search']   = ('search', '', _('Search Page'))
-
-    def set_warnfunc(self, func):
-        self._warnfunc = func
-        self.settings['warning_stream'] = RedirStream(func)
-
-    def warn(self, docname, msg, lineno=None):
-        if docname:
-            if lineno is None:
-                lineno = ''
-            self._warnfunc('%s:%s: %s' % (self.doc2path(docname), lineno, msg))
-        else:
-            self._warnfunc('GLOBAL:: ' + msg)
-
-    def clear_doc(self, docname):
-        """Remove all traces of a source file in the inventory."""
-        if docname in self.all_docs:
-            self.all_docs.pop(docname, None)
-            self.metadata.pop(docname, None)
-            self.dependencies.pop(docname, None)
-            self.titles.pop(docname, None)
-            self.tocs.pop(docname, None)
-            self.toc_num_entries.pop(docname, None)
-            self.toctree_includes.pop(docname, None)
-            self.filemodules.pop(docname, None)
-            self.indexentries.pop(docname, None)
-            self.glob_toctrees.discard(docname)
-
-            for subfn, fnset in self.files_to_rebuild.items():
-                fnset.discard(docname)
-                if not fnset:
-                    del self.files_to_rebuild[subfn]
-            for fullname, (fn, _) in self.descrefs.items():
-                if fn == docname:
-                    del self.descrefs[fullname]
-            for modname, (fn, _, _, _) in self.modules.items():
-                if fn == docname:
-                    del self.modules[modname]
-            for labelname, (fn, _, _) in self.labels.items():
-                if fn == docname:
-                    del self.labels[labelname]
-            for key, (fn, _) in self.reftargets.items():
-                if fn == docname:
-                    del self.reftargets[key]
-            for key, (fn, _) in self.progoptions.items():
-                if fn == docname:
-                    del self.progoptions[key]
-            for version, changes in self.versionchanges.items():
-                new = [change for change in changes if change[1] != docname]
-                changes[:] = new
-            for fullpath, (docs, _) in self.images.items():
-                docs.discard(docname)
-                if not docs:
-                    del self.images[fullpath]
-
-    def doc2path(self, docname, base=True, suffix=None):
-        """
-        Return the filename for the document name.
-        If base is True, return absolute path under self.srcdir.
-        If base is None, return relative path to self.srcdir.
-        If base is a path string, return absolute path under that.
-        If suffix is not None, add it instead of config.source_suffix.
-        """
-        suffix = suffix or self.config.source_suffix
-        if base is True:
-            return path.join(self.srcdir, docname.replace(SEP, path.sep)) + suffix
-        elif base is None:
-            return docname.replace(SEP, path.sep) + suffix
-        else:
-            return path.join(base, docname.replace(SEP, path.sep)) + suffix
-
-    def find_files(self, config):
-        """
-        Find all source files in the source dir and put them in self.found_docs.
-        """
-        exclude_dirs  = [d.replace(SEP, path.sep) for d in config.exclude_dirs]
-        exclude_trees = [d.replace(SEP, path.sep) for d in config.exclude_trees]
-        self.found_docs = set(get_matching_docs(
-            self.srcdir, config.source_suffix, exclude_docs=set(config.unused_docs),
-            exclude_dirs=exclude_dirs, exclude_trees=exclude_trees,
-            exclude_dirnames=['_sources'] + config.exclude_dirnames))
-
-    def get_outdated_files(self, config_changed):
-        """
-        Return (added, changed, removed) sets.
-        """
-        # clear all files no longer present
-        removed = set(self.all_docs) - self.found_docs
-
-        added = set()
-        changed = set()
-
-        if config_changed:
-            # config values affect e.g. substitutions
-            added = self.found_docs
-        else:
-            for docname in self.found_docs:
-                if docname not in self.all_docs:
-                    added.add(docname)
-                    continue
-                # if the doctree file is not there, rebuild
-                if not path.isfile(self.doc2path(docname, self.doctreedir,
-                                                 '.doctree')):
-                    changed.add(docname)
-                    continue
-                # check the mtime of the document
-                mtime = self.all_docs[docname]
-                newmtime = path.getmtime(self.doc2path(docname))
-                if newmtime > mtime:
-                    changed.add(docname)
-                    continue
-                # finally, check the mtime of dependencies
-                for dep in self.dependencies.get(docname, ()):
-                    try:
-                        # this will do the right thing when dep is absolute too
-                        deppath = path.join(self.srcdir, dep)
-                        if not path.isfile(deppath):
-                            changed.add(docname)
-                            break
-                        depmtime = path.getmtime(deppath)
-                        if depmtime > mtime:
-                            changed.add(docname)
-                            break
-                    except EnvironmentError:
-                        # give it another chance
-                        changed.add(docname)
-                        break
-
-        return added, changed, removed
-
-    def update(self, config, srcdir, doctreedir, app=None):
-        """(Re-)read all files new or changed since last update.  Yields a summary
-        and then docnames as it processes them.  Store all environment docnames
-        in the canonical format (ie using SEP as a separator in place of
-        os.path.sep)."""
-        config_changed = False
-        if self.config is None:
-            msg = '[new config] '
-            config_changed = True
-        else:
-            # check if a config value was changed that affects how doctrees are read
-            for key, descr in config.config_values.iteritems():
-                if not descr[1]:
-                    continue
-                if self.config[key] != config[key]:
-                    msg = '[config changed] '
-                    config_changed = True
-                    break
-            else:
-                msg = ''
-            # this value is not covered by the above loop because it is handled
-            # specially by the config class
-            if self.config.extensions != config.extensions:
-                msg = '[extensions changed] '
-                config_changed = True
-        # the source and doctree directories may have been relocated
-        self.srcdir = srcdir
-        self.doctreedir = doctreedir
-        self.find_files(config)
-
-        added, changed, removed = self.get_outdated_files(config_changed)
-
-        # if files were added or removed, all documents with globbed toctrees
-        # must be reread
-        if added or removed:
-            changed.update(self.glob_toctrees)
-
-        msg += '%s added, %s changed, %s removed' % (len(added), len(changed),
-                                                     len(removed))
-        yield msg
-
-        self.config = config
-        self.app = app
-
-        # clear all files no longer present
-        for docname in removed:
-            if app:
-                app.emit('env-purge-doc', self, docname)
-            self.clear_doc(docname)
-
-        # read all new and changed files
-        for docname in sorted(added | changed):
-            yield docname
-            self.read_doc(docname, app=app)
-
-        if config.master_doc not in self.all_docs:
-            self.warn(None, 'master file %s not found' %
-                      self.doc2path(config.master_doc))
-
-        self.app = None
-
-        # remove all non-existing images from inventory
-        for imgsrc in self.images.keys():
-            if not os.access(path.join(self.srcdir, imgsrc), os.R_OK):
-                del self.images[imgsrc]
-
-        if app:
-            app.emit('env-updated', self)
-
-
-    # --------- SINGLE FILE READING --------------------------------------------
-
-    def read_doc(self, docname, src_path=None, save_parsed=True, app=None):
-        """
-        Parse a file and add/update inventory entries for the doctree.
-        If srcpath is given, read from a different source file.
-        """
-        # remove all inventory entries for that file
-        if app:
-            app.emit('env-purge-doc', self, docname)
-        self.clear_doc(docname)
-
-        if src_path is None:
-            src_path = self.doc2path(docname)
-
-        if self.config.default_role:
-            role_fn, messages = roles.role(self.config.default_role, english,
-                                           0, dummy_reporter)
-            if role_fn:
-                roles._roles[''] = role_fn
-            else:
-                self.warn(docname, 'default role %s not found' %
-                          self.config.default_role)
-
-        self.docname = docname
-        self.settings['input_encoding'] = self.config.source_encoding
-
-        class SphinxSourceClass(FileInput):
-            def read(self):
-                data = FileInput.read(self)
-                if app:
-                    arg = [data]
-                    app.emit('source-read', docname, arg)
-                    data = arg[0]
-                return data
-
-        # publish manually
-        pub = Publisher(reader=SphinxStandaloneReader(),
-                        writer=SphinxDummyWriter(),
-                        source_class=SphinxSourceClass,
-                        destination_class=NullOutput)
-        pub.set_components(None, 'restructuredtext', None)
-        pub.process_programmatic_settings(None, self.settings, None)
-        pub.set_source(None, src_path)
-        pub.set_destination(None, None)
-        try:
-            pub.publish()
-            doctree = pub.document
-        except UnicodeError, err:
-            from sphinx.application import SphinxError
-            raise SphinxError(err.message)
-        self.filter_messages(doctree)
-        self.process_dependencies(docname, doctree)
-        self.process_images(docname, doctree)
-        self.process_metadata(docname, doctree)
-        self.create_title_from(docname, doctree)
-        self.note_labels_from(docname, doctree)
-        self.note_indexentries_from(docname, doctree)
-        self.note_citations_from(docname, doctree)
-        self.build_toc_from(docname, doctree)
-
-        # store time of reading, used to find outdated files
-        self.all_docs[docname] = time.time()
-
-        if app:
-            app.emit('doctree-read', doctree)
-
-        # make it picklable
-        doctree.reporter = None
-        doctree.transformer = None
-        doctree.settings.warning_stream = None
-        doctree.settings.env = None
-        doctree.settings.record_dependencies = None
-        for metanode in doctree.traverse(MetaBody.meta):
-            # docutils' meta nodes aren't picklable because the class is nested
-            metanode.__class__ = addnodes.meta
-
-        # cleanup
-        self.docname = None
-        self.currmodule = None
-        self.currclass = None
-        self.gloss_entries = set()
-
-        if save_parsed:
-            # save the parsed doctree
-            doctree_filename = self.doc2path(docname, self.doctreedir, '.doctree')
-            dirname = path.dirname(doctree_filename)
-            if not path.isdir(dirname):
-                os.makedirs(dirname)
-            f = open(doctree_filename, 'wb')
-            try:
-                pickle.dump(doctree, f, pickle.HIGHEST_PROTOCOL)
-            finally:
-                f.close()
-        else:
-            return doctree
-
-    def filter_messages(self, doctree):
-        """
-        Filter system messages from a doctree.
-        """
-        filterlevel = self.config.keep_warnings and 2 or 5
-        for node in doctree.traverse(nodes.system_message):
-            if node['level'] < filterlevel:
-                node.parent.remove(node)
-
-    def process_dependencies(self, docname, doctree):
-        """
-        Process docutils-generated dependency info.
-        """
-        deps = doctree.settings.record_dependencies
-        if not deps:
-            return
-        docdir = path.dirname(self.doc2path(docname, base=None))
-        for dep in deps.list:
-            dep = path.join(docdir, dep)
-            self.dependencies.setdefault(docname, set()).add(dep)
-
-    def process_images(self, docname, doctree):
-        """
-        Process and rewrite image URIs.
-        """
-        existing_names = set(v[1] for v in self.images.itervalues())
-        docdir = path.dirname(self.doc2path(docname, base=None))
-        for node in doctree.traverse(nodes.image):
-            # Map the mimetype to the corresponding image.  The writer may
-            # choose the best image from these candidates.  The special key * is
-            # set if there is only single candiate to be used by a writer.
-            # The special key ? is set for nonlocal URIs.
-            node['candidates'] = candidates = {}
-            imguri = node['uri']
-            if imguri.find('://') != -1:
-                self.warn(docname, 'Nonlocal image URI found: %s' % imguri, node.line)
-                candidates['?'] = imguri
-                continue
-            # imgpath is the image path *from srcdir*
-            imgpath = path.normpath(path.join(docdir, imguri))
-            # set imgpath as default URI
-            node['uri'] = imgpath
-            if imgpath.endswith(os.extsep + '*'):
-                for filename in glob(path.join(self.srcdir, imgpath)):
-                    new_imgpath = relative_path(self.srcdir, filename)
-                    if filename.lower().endswith('.pdf'):
-                        candidates['application/pdf'] = new_imgpath
-                    elif filename.lower().endswith('.svg'):
-                        candidates['image/svg+xml'] = new_imgpath
-                    else:
-                        try:
-                            f = open(filename, 'rb')
-                            try:
-                                imgtype = imghdr.what(f)
-                            finally:
-                                f.close()
-                        except (OSError, IOError):
-                            self.warn(docname, 'Image file %s not readable' % filename)
-                        if imgtype:
-                            candidates['image/' + imgtype] = new_imgpath
-            else:
-                candidates['*'] = imgpath
-            # map image paths to unique image names (so that they can be put
-            # into a single directory)
-            for imgpath in candidates.itervalues():
-                self.dependencies.setdefault(docname, set()).add(imgpath)
-                if not os.access(path.join(self.srcdir, imgpath), os.R_OK):
-                    self.warn(docname, 'Image file not readable: %s' % imgpath,
-                              node.line)
-                if imgpath in self.images:
-                    self.images[imgpath][0].add(docname)
-                    continue
-                uniquename = path.basename(imgpath)
-                base, ext = path.splitext(uniquename)
-                i = 0
-                while uniquename in existing_names:
-                    i += 1
-                    uniquename = '%s%s%s' % (base, i, ext)
-                self.images[imgpath] = (set([docname]), uniquename)
-                existing_names.add(uniquename)
-
-    def process_metadata(self, docname, doctree):
-        """
-        Process the docinfo part of the doctree as metadata.
-        """
-        self.metadata[docname] = md = {}
-        try:
-            docinfo = doctree[0]
-        except IndexError:
-            # probably an empty document
-            return
-        if docinfo.__class__ is not nodes.docinfo:
-            # nothing to see here
-            return
-        for node in docinfo:
-            if node.__class__ is nodes.author:
-                # handled specially by docutils
-                md['author'] = node.astext()
-            elif node.__class__ is nodes.field:
-                name, body = node
-                md[name.astext()] = body.astext()
-        del doctree[0]
-
-    def create_title_from(self, docname, document):
-        """
-        Add a title node to the document (just copy the first section title),
-        and store that title in the environment.
-        """
-        for node in document.traverse(nodes.section):
-            titlenode = nodes.title()
-            visitor = SphinxContentsFilter(document)
-            node[0].walkabout(visitor)
-            titlenode += visitor.get_entry_text()
-            self.titles[docname] = titlenode
-            return
-
-    def note_labels_from(self, docname, document):
-        for name, explicit in document.nametypes.iteritems():
-            if not explicit:
-                continue
-            labelid = document.nameids[name]
-            if labelid is None:
-                continue
-            node = document.ids[labelid]
-            if name.isdigit() or node.has_key('refuri') or \
-                   node.tagname.startswith('desc_'):
-                # ignore footnote labels, labels automatically generated from a
-                # link and description units
-                continue
-            if name in self.labels:
-                self.warn(docname, 'duplicate label %s, ' % name +
-                          'other instance in %s' % self.doc2path(self.labels[name][0]),
-                          node.line)
-            self.anonlabels[name] = docname, labelid
-            if node.tagname == 'section':
-                sectname = node[0].astext() # node[0] == title node
-            elif node.tagname == 'figure':
-                for n in node:
-                    if n.tagname == 'caption':
-                        sectname = n.astext()
-                        break
-                else:
-                    continue
-            else:
-                # anonymous-only labels
-                continue
-            self.labels[name] = docname, labelid, sectname
-
-    def note_indexentries_from(self, docname, document):
-        entries = self.indexentries[docname] = []
-        for node in document.traverse(addnodes.index):
-            entries.extend(node['entries'])
-
-    def note_citations_from(self, docname, document):
-        for node in document.traverse(nodes.citation):
-            label = node[0].astext()
-            if ('citation', label) in self.reftargets:
-                self.warn(docname, 'duplicate citation %s, ' % label +
-                          'other instance in %s' % self.doc2path(
-                    self.reftargets['citation', label][0]), node.line)
-            self.reftargets['citation', label] = (docname, node['ids'][0])
-
-    def note_toctree(self, docname, toctreenode):
-        """Note a TOC tree directive in a document and gather information about
-           file relations from it."""
-        if toctreenode['glob']:
-            self.glob_toctrees.add(docname)
-        includefiles = toctreenode['includefiles']
-        for includefile in includefiles:
-            # note that if the included file is rebuilt, this one must be
-            # too (since the TOC of the included file could have changed)
-            self.files_to_rebuild.setdefault(includefile, set()).add(docname)
-        self.toctree_includes.setdefault(docname, []).extend(includefiles)
-
-    def build_toc_from(self, docname, document):
-        """Build a TOC from the doctree and store it in the inventory."""
-        numentries = [0] # nonlocal again...
-
-        try:
-            maxdepth = int(self.metadata[docname].get('tocdepth', 0))
-        except ValueError:
-            maxdepth = 0
-
-        def build_toc(node, depth=1):
-            entries = []
-            for subnode in node:
-                if isinstance(subnode, addnodes.toctree):
-                    # just copy the toctree node which is then resolved
-                    # in self.get_and_resolve_doctree
-                    item = subnode.copy()
-                    entries.append(item)
-                    # do the inventory stuff
-                    self.note_toctree(docname, subnode)
-                    continue
-                if not isinstance(subnode, nodes.section):
-                    continue
-                title = subnode[0]
-                # copy the contents of the section title, but without references
-                # and unnecessary stuff
-                visitor = SphinxContentsFilter(document)
-                title.walkabout(visitor)
-                nodetext = visitor.get_entry_text()
-                if not numentries[0]:
-                    # for the very first toc entry, don't add an anchor
-                    # as it is the file's title anyway
-                    anchorname = ''
-                else:
-                    anchorname = '#' + subnode['ids'][0]
-                numentries[0] += 1
-                reference = nodes.reference('', '', refuri=docname,
-                                            anchorname=anchorname,
-                                            *nodetext)
-                para = addnodes.compact_paragraph('', '', reference)
-                item = nodes.list_item('', para)
-                if maxdepth == 0 or depth < maxdepth:
-                    item += build_toc(subnode, depth+1)
-                entries.append(item)
-            if entries:
-                return nodes.bullet_list('', *entries)
-            return []
-        toc = build_toc(document)
-        if toc:
-            self.tocs[docname] = toc
-        else:
-            self.tocs[docname] = nodes.bullet_list('')
-        self.toc_num_entries[docname] = numentries[0]
-
-    def get_toc_for(self, docname):
-        """Return a TOC nodetree -- for use on the same page only!"""
-        toc = self.tocs[docname].deepcopy()
-        for node in toc.traverse(nodes.reference):
-            node['refuri'] = node['anchorname']
-        return toc
-
-    # -------
-    # these are called from docutils directives and therefore use self.docname
-    #
-    def note_descref(self, fullname, desctype, line):
-        if fullname in self.descrefs:
-            self.warn(self.docname,
-                      'duplicate canonical description name %s, ' % fullname +
-                      'other instance in %s' % self.doc2path(self.descrefs[fullname][0]),
-                      line)
-        self.descrefs[fullname] = (self.docname, desctype)
-
-    def note_module(self, modname, synopsis, platform, deprecated):
-        self.modules[modname] = (self.docname, synopsis, platform, deprecated)
-        self.filemodules.setdefault(self.docname, []).append(modname)
-
-    def note_progoption(self, optname, labelid):
-        self.progoptions[self.currprogram, optname] = (self.docname, labelid)
-
-    def note_reftarget(self, type, name, labelid):
-        self.reftargets[type, name] = (self.docname, labelid)
-
-    def note_versionchange(self, type, version, node, lineno):
-        self.versionchanges.setdefault(version, []).append(
-            (type, self.docname, lineno, self.currmodule, self.currdesc, node.astext()))
-
-    def note_dependency(self, filename):
-        basename = path.dirname(self.doc2path(self.docname, base=None))
-        # this will do the right thing when filename is absolute too
-        filename = path.join(basename, filename)
-        self.dependencies.setdefault(self.docname, set()).add(filename)
-    # -------
-
-    # --------- RESOLVING REFERENCES AND TOCTREES ------------------------------
-
-    def get_doctree(self, docname):
-        """Read the doctree for a file from the pickle and return it."""
-        doctree_filename = self.doc2path(docname, self.doctreedir, '.doctree')
-        f = open(doctree_filename, 'rb')
-        try:
-            doctree = pickle.load(f)
-        finally:
-            f.close()
-        doctree.settings.env = self
-        doctree.reporter = Reporter(self.doc2path(docname), 2, 4,
-                                    stream=RedirStream(self._warnfunc))
-        return doctree
-
-
-    def get_and_resolve_doctree(self, docname, builder, doctree=None,
-                                prune_toctrees=True):
-        """Read the doctree from the pickle, resolve cross-references and
-           toctrees and return it."""
-        if doctree is None:
-            doctree = self.get_doctree(docname)
-
-        # resolve all pending cross-references
-        self.resolve_references(doctree, docname, builder)
-
-        # now, resolve all toctree nodes
-        for toctreenode in doctree.traverse(addnodes.toctree):
-            result = self.resolve_toctree(docname, builder, toctreenode,
-                                          prune=prune_toctrees)
-            if result is None:
-                toctreenode.replace_self([])
-            else:
-                toctreenode.replace_self(result)
-
-        return doctree
-
-    def resolve_toctree(self, docname, builder, toctree, prune=True, maxdepth=0,
-                        titles_only=False):
-        """
-        Resolve a *toctree* node into individual bullet lists with titles
-        as items, returning None (if no containing titles are found) or
-        a new node.
-
-        If *prune* is True, the tree is pruned to *maxdepth*, or if that is 0,
-        to the value of the *maxdepth* option on the *toctree* node.
-        If *titles_only* is True, only toplevel document titles will be in the
-        resulting tree.
-        """
-
-        def _walk_depth(node, depth, maxdepth, titleoverrides):
-            """Utility: Cut a TOC at a specified depth."""
-            for subnode in node.children[:]:
-                if isinstance(subnode, (addnodes.compact_paragraph, nodes.list_item)):
-                    subnode['classes'].append('toctree-l%d' % (depth-1))
-                    _walk_depth(subnode, depth, maxdepth, titleoverrides)
-                elif isinstance(subnode, nodes.bullet_list):
-                    if maxdepth > 0 and depth > maxdepth:
-                        subnode.parent.replace(subnode, [])
-                    else:
-                        _walk_depth(subnode, depth+1, maxdepth, titleoverrides)
-
-        def _entries_from_toctree(toctreenode, separate=False):
-            """Return TOC entries for a toctree node."""
-            includefiles = map(str, toctreenode['includefiles'])
-
-            entries = []
-            for includefile in includefiles:
-                try:
-                    toc = self.tocs[includefile].deepcopy()
-                    if not toc.children:
-                        # empty toc means: no titles will show up in the toctree
-                        self.warn(docname, 'toctree contains reference to document '
-                                  '%r that doesn\'t have a title: no link will be '
-                                  'generated' % includefile)
-                except KeyError:
-                    # this is raised if the included file does not exist
-                    self.warn(docname, 'toctree contains reference to nonexisting '
-                              'document %r' % includefile)
-                else:
-                    # if titles_only is given, only keep the main title and
-                    # sub-toctrees
-                    if titles_only:
-                        # delete everything but the toplevel title(s) and toctrees
-                        for toplevel in toc:
-                            # nodes with length 1 don't have any children anyway
-                            if len(toplevel) > 1:
-                                subtoctrees = toplevel.traverse(addnodes.toctree)
-                                toplevel[1][:] = subtoctrees
-                    # resolve all sub-toctrees
-                    for toctreenode in toc.traverse(addnodes.toctree):
-                        i = toctreenode.parent.index(toctreenode) + 1
-                        for item in _entries_from_toctree(toctreenode):
-                            toctreenode.parent.insert(i, item)
-                            i += 1
-                        toctreenode.parent.remove(toctreenode)
-                    if separate:
-                        entries.append(toc)
-                    else:
-                        entries.extend(toc.children)
-            return entries
-
-        maxdepth = maxdepth or toctree.get('maxdepth', -1)
-        titleoverrides = toctree.get('includetitles', {})
-
-        tocentries = _entries_from_toctree(toctree, separate=True)
-        if not tocentries:
-            return None
-
-        newnode = addnodes.compact_paragraph('', '', *tocentries)
-        newnode['toctree'] = True
-        # prune the tree to maxdepth and replace titles, also set level classes
-        _walk_depth(newnode, 1, prune and maxdepth or 0, titleoverrides)
-        # replace titles, if needed, and set the target paths in the
-        # toctrees (they are not known at TOC generation time)
-        for refnode in newnode.traverse(nodes.reference):
-            refnode['refuri'] = builder.get_relative_uri(
-                docname, refnode['refuri']) + refnode['anchorname']
-            if titleoverrides and not refnode['anchorname'] \
-                   and refnode['refuri'] in titleoverrides:
-                newtitle = titleoverrides[refnode['refuri']]
-                refnode.children = [nodes.Text(newtitle)]
-        return newnode
-
-    descroles = frozenset(('data', 'exc', 'func', 'class', 'const', 'attr', 'obj',
-                           'meth', 'cfunc', 'cmember', 'cdata', 'ctype', 'cmacro'))
-
-    def resolve_references(self, doctree, fromdocname, builder):
-        reftarget_roles = set(('token', 'term', 'citation'))
-        # add all custom xref types too
-        reftarget_roles.update(i[0] for i in additional_xref_types.values())
-
-        for node in doctree.traverse(addnodes.pending_xref):
-            contnode = node[0].deepcopy()
-            newnode = None
-
-            typ = node['reftype']
-            target = node['reftarget']
-
-            try:
-                if typ == 'ref':
-                    if node['refcaption']:
-                        # reference to anonymous label; the reference uses the supplied
-                        # link caption
-                        docname, labelid = self.anonlabels.get(target, ('',''))
-                        sectname = node.astext()
-                        if not docname:
-                            newnode = doctree.reporter.system_message(
-                                2, 'undefined label: %s' % target)
-                    else:
-                        # reference to the named label; the final node will contain the
-                        # section name after the label
-                        docname, labelid, sectname = self.labels.get(target, ('','',''))
-                        if not docname:
-                            newnode = doctree.reporter.system_message(
-                                2, 'undefined label: %s -- if you don\'t ' % target +
-                                'give a link caption the label must precede a section '
-                                'header.')
-                    if docname:
-                        newnode = nodes.reference('', '')
-                        innernode = nodes.emphasis(sectname, sectname)
-                        if docname == fromdocname:
-                            newnode['refid'] = labelid
-                        else:
-                            # set more info in contnode in case the get_relative_uri call
-                            # raises NoUri, the builder will then have to resolve these
-                            contnode = addnodes.pending_xref('')
-                            contnode['refdocname'] = docname
-                            contnode['refsectname'] = sectname
-                            newnode['refuri'] = builder.get_relative_uri(
-                                fromdocname, docname)
-                            if labelid:
-                                newnode['refuri'] += '#' + labelid
-                        newnode.append(innernode)
-                elif typ == 'keyword':
-                    # keywords are referenced by named labels
-                    docname, labelid, _ = self.labels.get(target, ('','',''))
-                    if not docname:
-                        #self.warn(fromdocname, 'unknown keyword: %s' % target)
-                        newnode = contnode
-                    else:
-                        newnode = nodes.reference('', '')
-                        if docname == fromdocname:
-                            newnode['refid'] = labelid
-                        else:
-                            newnode['refuri'] = builder.get_relative_uri(
-                                fromdocname, docname) + '#' + labelid
-                        newnode.append(contnode)
-                elif typ == 'option':
-                    progname = node['refprogram']
-                    docname, labelid = self.progoptions.get((progname, target), ('', ''))
-                    if not docname:
-                        newnode = contnode
-                    else:
-                        newnode = nodes.reference('', '')
-                        if docname == fromdocname:
-                            newnode['refid'] = labelid
-                        else:
-                            newnode['refuri'] = builder.get_relative_uri(
-                                fromdocname, docname) + '#' + labelid
-                        newnode.append(contnode)
-                elif typ in reftarget_roles:
-                    docname, labelid = self.reftargets.get((typ, target), ('', ''))
-                    if not docname:
-                        if typ == 'term':
-                            self.warn(fromdocname, 'term not in glossary: %s' % target,
-                                      node.line)
-                        elif typ == 'citation':
-                            self.warn(fromdocname, 'citation not found: %s' % target,
-                                      node.line)
-                        newnode = contnode
-                    else:
-                        newnode = nodes.reference('', '')
-                        if docname == fromdocname:
-                            newnode['refid'] = labelid
-                        else:
-                            newnode['refuri'] = builder.get_relative_uri(
-                                fromdocname, docname, typ) + '#' + labelid
-                        newnode.append(contnode)
-                elif typ == 'mod':
-                    docname, synopsis, platform, deprecated = \
-                        self.modules.get(target, ('','','', ''))
-                    if not docname:
-                        newnode = builder.app.emit_firstresult('missing-reference',
-                                                               self, node, contnode)
-                        if not newnode:
-                            newnode = contnode
-                    elif docname == fromdocname:
-                        # don't link to self
-                        newnode = contnode
-                    else:
-                        newnode = nodes.reference('', '')
-                        newnode['refuri'] = builder.get_relative_uri(
-                            fromdocname, docname) + '#module-' + target
-                        newnode['reftitle'] = '%s%s%s' % (
-                            (platform and '(%s) ' % platform),
-                            synopsis, (deprecated and ' (deprecated)' or ''))
-                        newnode.append(contnode)
-                elif typ in self.descroles:
-                    # "descrefs"
-                    modname = node['modname']
-                    clsname = node['classname']
-                    searchorder = node.hasattr('refspecific') and 1 or 0
-                    name, desc = self.find_desc(modname, clsname,
-                                                target, typ, searchorder)
-                    if not desc:
-                        newnode = builder.app.emit_firstresult('missing-reference',
-                                                               self, node, contnode)
-                        if not newnode:
-                            newnode = contnode
-                    else:
-                        newnode = nodes.reference('', '')
-                        if desc[0] == fromdocname:
-                            newnode['refid'] = name
-                        else:
-                            newnode['refuri'] = (
-                                builder.get_relative_uri(fromdocname, desc[0])
-                                + '#' + name)
-                        newnode['reftitle'] = name
-                        newnode.append(contnode)
-                else:
-                    raise RuntimeError('unknown xfileref node encountered: %s' % node)
-            except NoUri:
-                newnode = contnode
-            if newnode:
-                node.replace_self(newnode)
-
-        # allow custom references to be resolved
-        builder.app.emit('doctree-resolved', doctree, fromdocname)
-
-    def create_index(self, builder, _fixre=re.compile(r'(.*) ([(][^()]*[)])')):
-        """Create the real index from the collected index entries."""
-        new = {}
-
-        def add_entry(word, subword, dic=new):
-            entry = dic.get(word)
-            if not entry:
-                dic[word] = entry = [[], {}]
-            if subword:
-                add_entry(subword, '', dic=entry[1])
-            else:
-                try:
-                    entry[0].append(builder.get_relative_uri('genindex', fn)
-                                    + '#' + tid)
-                except NoUri:
-                    pass
-
-        for fn, entries in self.indexentries.iteritems():
-            # new entry types must be listed in directives/other.py!
-            for type, string, tid, alias in entries:
-                if type == 'single':
-                    try:
-                        entry, subentry = string.split(';', 1)
-                    except ValueError:
-                        entry, subentry = string, ''
-                    if not entry:
-                        self.warn(fn, 'invalid index entry %r' % string)
-                        continue
-                    add_entry(entry.strip(), subentry.strip())
-                elif type == 'pair':
-                    try:
-                        first, second = map(lambda x: x.strip(),
-                                            string.split(';', 1))
-                        if not first or not second:
-                            raise ValueError
-                    except ValueError:
-                        self.warn(fn, 'invalid pair index entry %r' % string)
-                        continue
-                    add_entry(first, second)
-                    add_entry(second, first)
-                elif type == 'triple':
-                    try:
-                        first, second, third = map(lambda x: x.strip(),
-                                                   string.split(';', 2))
-                        if not first or not second or not third:
-                            raise ValueError
-                    except ValueError:
-                        self.warn(fn, 'invalid triple index entry %r' % string)
-                        continue
-                    add_entry(first, second+' '+third)
-                    add_entry(second, third+', '+first)
-                    add_entry(third, first+' '+second)
-                else:
-                    self.warn(fn, 'unknown index entry type %r' % type)
-
-        newlist = new.items()
-        newlist.sort(key=lambda t: t[0].lower())
-
-        # fixup entries: transform
-        #   func() (in module foo)
-        #   func() (in module bar)
-        # into
-        #   func()
-        #     (in module foo)
-        #     (in module bar)
-        oldkey = ''
-        oldsubitems = None
-        i = 0
-        while i < len(newlist):
-            key, (targets, subitems) = newlist[i]
-            # cannot move if it hassubitems; structure gets too complex
-            if not subitems:
-                m = _fixre.match(key)
-                if m:
-                    if oldkey == m.group(1):
-                        # prefixes match: add entry as subitem of the previous entry
-                        oldsubitems.setdefault(m.group(2), [[], {}])[0].extend(targets)
-                        del newlist[i]
-                        continue
-                    oldkey = m.group(1)
-                else:
-                    oldkey = key
-            oldsubitems = subitems
-            i += 1
-
-        # group the entries by letter
-        def keyfunc((k, v), ltrs=uppercase+'_'):
-            # hack: mutate the subitems dicts to a list in the keyfunc
-            v[1] = sorted((si, se) for (si, (se, void)) in v[1].iteritems())
-            # now calculate the key
-            letter = k[0].upper()
-            if letter in ltrs:
-                return letter
-            else:
-                # get all other symbols under one heading
-                return 'Symbols'
-        return [(key, list(group)) for (key, group) in groupby(newlist, keyfunc)]
-
-    def collect_relations(self):
-        relations = {}
-        getinc = self.toctree_includes.get
-        def collect(parents, docname, previous, next):
-            includes = getinc(docname)
-            # previous
-            if not previous:
-                # if no previous sibling, go to parent
-                previous = parents[0][0]
-            else:
-                # else, go to previous sibling, or if it has children, to
-                # the last of its children, or if that has children, to the
-                # last of those, and so forth
-                while 1:
-                    previncs = getinc(previous)
-                    if previncs:
-                        previous = previncs[-1]
-                    else:
-                        break
-            # next
-            if includes:
-                # if it has children, go to first of them
-                next = includes[0]
-            elif next:
-                # else, if next sibling, go to it
-                pass
-            else:
-                # else, go to the next sibling of the parent, if present,
-                # else the grandparent's sibling, if present, and so forth
-                for parname, parindex in parents:
-                    parincs = getinc(parname)
-                    if parincs and parindex + 1 < len(parincs):
-                        next = parincs[parindex+1]
-                        break
-                # else it will stay None
-            # same for children
-            if includes:
-                for subindex, args in enumerate(izip(includes, [None] + includes,
-                                                     includes[1:] + [None])):
-                    collect([(docname, subindex)] + parents, *args)
-            relations[docname] = [parents[0][0], previous, next]
-        collect([(None, 0)], self.config.master_doc, None, None)
-        return relations
-
-    def check_consistency(self):
-        """Do consistency checks."""
-
-        for docname in sorted(self.all_docs):
-            if docname not in self.files_to_rebuild:
-                if docname == self.config.master_doc:
-                    # the master file is not included anywhere ;)
-                    continue
-                self.warn(docname, 'document isn\'t included in any toctree')
-
-    # --------- QUERYING -------------------------------------------------------
-
-    def find_desc(self, modname, classname, name, type, searchorder=0):
-        """Find a description node matching "name", perhaps using
-           the given module and/or classname."""
-        # skip parens
-        if name[-2:] == '()':
-            name = name[:-2]
-
-        if not name:
-            return None, None
-
-        # don't add module and class names for C things
-        if type[0] == 'c' and type not in ('class', 'const'):
-            # skip trailing star and whitespace
-            name = name.rstrip(' *')
-            if name in self.descrefs and self.descrefs[name][1][0] == 'c':
-                return name, self.descrefs[name]
-            return None, None
-
-        newname = None
-        if searchorder == 1:
-            if modname and classname and \
-                   modname + '.' + classname + '.' + name in self.descrefs:
-                newname = modname + '.' + classname + '.' + name
-            elif modname and modname + '.' + name in self.descrefs:
-                newname = modname + '.' + name
-            elif name in self.descrefs:
-                newname = name
-        else:
-            if name in self.descrefs:
-                newname = name
-            elif modname and modname + '.' + name in self.descrefs:
-                newname = modname + '.' + name
-            elif modname and classname and \
-                     modname + '.' + classname + '.' + name in self.descrefs:
-                newname = modname + '.' + classname + '.' + name
-            # special case: builtin exceptions have module "exceptions" set
-            elif type == 'exc' and '.' not in name and \
-                 'exceptions.' + name in self.descrefs:
-                newname = 'exceptions.' + name
-            # special case: object methods
-            elif type in ('func', 'meth') and '.' not in name and \
-                 'object.' + name in self.descrefs:
-                newname = 'object.' + name
-        if newname is None:
-            return None, None
-        return newname, self.descrefs[newname]
-
-    def find_keyword(self, keyword, avoid_fuzzy=False, cutoff=0.6, n=20):
-        """
-        Find keyword matches for a keyword. If there's an exact match, just return
-        it, else return a list of fuzzy matches if avoid_fuzzy isn't True.
-
-        Keywords searched are: first modules, then descrefs.
-
-        Returns: None if nothing found
-                 (type, docname, anchorname) if exact match found
-                 list of (quality, type, docname, anchorname, description) if fuzzy
-        """
-
-        if keyword in self.modules:
-            docname, title, system, deprecated = self.modules[keyword]
-            return 'module', docname, 'module-' + keyword
-        if keyword in self.descrefs:
-            docname, ref_type = self.descrefs[keyword]
-            return ref_type, docname, keyword
-        # special cases
-        if '.' not in keyword:
-            # exceptions are documented in the exceptions module
-            if 'exceptions.'+keyword in self.descrefs:
-                docname, ref_type = self.descrefs['exceptions.'+keyword]
-                return ref_type, docname, 'exceptions.'+keyword
-            # special methods are documented as object methods
-            if 'object.'+keyword in self.descrefs:
-                docname, ref_type = self.descrefs['object.'+keyword]
-                return ref_type, docname, 'object.'+keyword
-
-        if avoid_fuzzy:
-            return
-
-        # find fuzzy matches
-        s = difflib.SequenceMatcher()
-        s.set_seq2(keyword.lower())
-
-        def possibilities():
-            for title, (fn, desc, _, _) in self.modules.iteritems():
-                yield ('module', fn, 'module-'+title, desc)
-            for title, (fn, desctype) in self.descrefs.iteritems():
-                yield (desctype, fn, title, '')
-
-        def dotsearch(string):
-            parts = string.lower().split('.')
-            for idx in xrange(0, len(parts)):
-                yield '.'.join(parts[idx:])
-
-        result = []
-        for type, docname, title, desc in possibilities():
-            best_res = 0
-            for part in dotsearch(title):
-                s.set_seq1(part)
-                if s.real_quick_ratio() >= cutoff and \
-                   s.quick_ratio() >= cutoff and \
-                   s.ratio() >= cutoff and \
-                   s.ratio() > best_res:
-                    best_res = s.ratio()
-            if best_res:
-                result.append((best_res, type, docname, title, desc))
-
-        return heapq.nlargest(n, result)
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.ext
-    ~~~~~~~~~~
-
-    Contains Sphinx features not activated by default.
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/autodoc.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,655 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.ext.autodoc
-    ~~~~~~~~~~~~~~~~~~
-
-    Automatically insert docstrings for functions, classes or whole modules into
-    the doctree, thus avoiding duplication between docstrings and documentation
-    for those who like elaborate docstrings.
-
-    :copyright: 2008 by Georg Brandl, Pauli Virtanen, Martin Hans.
-    :license: BSD.
-"""
-
-import re
-import sys
-import types
-import inspect
-import linecache
-from types import FunctionType, BuiltinMethodType, MethodType
-
-from docutils import nodes
-from docutils.parsers.rst import directives
-from docutils.statemachine import ViewList
-
-from sphinx.util import rpartition, nested_parse_with_titles
-from sphinx.directives.desc import py_sig_re
-
-try:
-    base_exception = BaseException
-except NameError:
-    base_exception = Exception
-
-_charset_re = re.compile(r'coding[:=]\s*([-\w.]+)')
-_module_charsets = {}
-
-
-class Options(object):
-    pass
-
-
-def is_static_method(obj):
-    """Check if the object given is a static method."""
-    if isinstance(obj, (FunctionType, classmethod)):
-        return True
-    elif isinstance(obj, BuiltinMethodType):
-        return obj.__self__ is not None
-    elif isinstance(obj, MethodType):
-        return obj.im_self is not None
-    return False
-
-
-class AutodocReporter(object):
-    """
-    A reporter replacement that assigns the correct source name
-    and line number to a system message, as recorded in a ViewList.
-    """
-    def __init__(self, viewlist, reporter):
-        self.viewlist = viewlist
-        self.reporter = reporter
-
-    def __getattr__(self, name):
-        return getattr(self.reporter, name)
-
-    def system_message(self, level, message, *children, **kwargs):
-        if 'line' in kwargs:
-            try:
-                source, line = self.viewlist.items[kwargs['line']]
-            except IndexError:
-                pass
-            else:
-                kwargs['source'] = source
-                kwargs['line'] = line
-        return self.reporter.system_message(level, message,
-                                            *children, **kwargs)
-
-    def debug(self, *args, **kwargs):
-        if self.reporter.debug_flag:
-            return self.system_message(0, *args, **kwargs)
-
-    def info(self, *args, **kwargs):
-        return self.system_message(1, *args, **kwargs)
-
-    def warning(self, *args, **kwargs):
-        return self.system_message(2, *args, **kwargs)
-
-    def error(self, *args, **kwargs):
-        return self.system_message(3, *args, **kwargs)
-
-    def severe(self, *args, **kwargs):
-        return self.system_message(4, *args, **kwargs)
-
-
-# Some useful event listener factories for autodoc-process-docstring.
-
-def cut_lines(pre, post=0, what=None):
-    """
-    Return a listener that removes the first *pre* and last *post*
-    lines of every docstring.  If *what* is a sequence of strings,
-    only docstrings of a type in *what* will be processed.
-
-    Use like this (e.g. in the ``setup()`` function of :file:`conf.py`)::
-
-       from sphinx.ext.autodoc import cut_lines
-       app.connect('autodoc-process-docstring', cut_lines(4, what=['module']))
-
-    This can (and should) be used in place of :confval:`automodule_skip_lines`.
-    """
-    def process(app, what_, name, obj, options, lines):
-        if what and what_ not in what:
-            return
-        del lines[:pre]
-        if post:
-            # remove one trailing blank line.
-            if lines and not lines[-1]:
-                lines.pop(-1)
-            del lines[-post:]
-        # make sure there is a blank line at the end
-        if lines and lines[-1]:
-            lines.append('')
-    return process
-
-def between(marker, what=None, keepempty=False):
-    """
-    Return a listener that only keeps lines between lines that match the
-    *marker* regular expression.  If no line matches, the resulting docstring
-    would be empty, so no change will be made unless *keepempty* is true.
-
-    If *what* is a sequence of strings, only docstrings of a type in *what* will
-    be processed.
-    """
-    marker_re = re.compile(marker)
-    def process(app, what_, name, obj, options, lines):
-        if what and what_ not in what:
-            return
-        deleted = 0
-        delete = True
-        orig_lines = lines[:]
-        for i, line in enumerate(orig_lines):
-            if delete:
-                lines.pop(i - deleted)
-                deleted += 1
-            if marker_re.match(line):
-                delete = not delete
-                if delete:
-                    lines.pop(i - deleted)
-                    deleted += 1
-        if not lines and not keepempty:
-            lines[:] = orig_lines
-        # make sure there is a blank line at the end
-        if lines and lines[-1]:
-            lines.append('')
-    return process
-
-
-def isdescriptor(x):
-    """Check if the object is some kind of descriptor."""
-    for item in '__get__', '__set__', '__delete__':
-        if callable(getattr(x, item, None)):
-            return True
-    return False
-
-
-def prepare_docstring(s):
-    """
-    Convert a docstring into lines of parseable reST.  Return it as a list of
-    lines usable for inserting into a docutils ViewList (used as argument
-    of nested_parse().)  An empty line is added to act as a separator between
-    this docstring and following content.
-    """
-    lines = s.expandtabs().splitlines()
-    # Find minimum indentation of any non-blank lines after first line.
-    margin = sys.maxint
-    for line in lines[1:]:
-        content = len(line.lstrip())
-        if content:
-            indent = len(line) - content
-            margin = min(margin, indent)
-    # Remove indentation.
-    if lines:
-        lines[0] = lines[0].lstrip()
-    if margin < sys.maxint:
-        for i in range(1, len(lines)): lines[i] = lines[i][margin:]
-    # Remove any leading blank lines.
-    while lines and not lines[0]:
-        lines.pop(0)
-    # make sure there is an empty line at the end
-    if lines and lines[-1]:
-        lines.append('')
-    return lines
-
-
-def get_module_charset(module):
-    """Return the charset of the given module (cached in _module_charsets)."""
-    if module in _module_charsets:
-        return _module_charsets[module]
-    try:
-        filename = __import__(module, None, None, ['foo']).__file__
-    except (ImportError, AttributeError):
-        return None
-    if filename[-4:].lower() in ('.pyc', '.pyo'):
-        filename = filename[:-1]
-    for line in [linecache.getline(filename, x) for x in (1, 2)]:
-        match = _charset_re.search(line)
-        if match is not None:
-            charset = match.group(1)
-            break
-    else:
-        charset = 'ascii'
-    _module_charsets[module] = charset
-    return charset
-
-
-class RstGenerator(object):
-    def __init__(self, options, document, lineno):
-        self.options = options
-        self.env = document.settings.env
-        self.reporter = document.reporter
-        self.lineno = lineno
-        self.filename_set = set()
-        self.warnings = []
-        self.result = ViewList()
-
-    def warn(self, msg):
-        self.warnings.append(self.reporter.warning(msg, line=self.lineno))
-
-    def get_doc(self, what, name, obj):
-        """Format and yield lines of the docstring(s) for the object."""
-        docstrings = []
-        if getattr(obj, '__doc__', None):
-            docstrings.append(obj.__doc__)
-        # skip some lines in module docstrings if configured
-        if what == 'module' and self.env.config.automodule_skip_lines and docstrings:
-            docstrings[0] = '\n'.join(docstrings[0].splitlines()
-                                      [self.env.config.automodule_skip_lines:])
-        # for classes, what the "docstring" is can be controlled via an option
-        if what in ('class', 'exception'):
-            content = self.env.config.autoclass_content
-            if content in ('both', 'init'):
-                initdocstring = getattr(obj, '__init__', None).__doc__
-                # for new-style classes, no __init__ means default __init__
-                if initdocstring == object.__init__.__doc__:
-                    initdocstring = None
-                if initdocstring:
-                    if content == 'init':
-                        docstrings = [initdocstring]
-                    else:
-                        docstrings.append(initdocstring)
-            # the default is only the class docstring
-
-        # decode the docstrings using the module's source encoding
-        charset = None
-        module = getattr(obj, '__module__', None)
-        if module is not None:
-            charset = get_module_charset(module)
-
-        for docstring in docstrings:
-            if isinstance(docstring, str):
-                if charset:
-                    docstring = docstring.decode(charset)
-                else:
-                    try:
-                        # try decoding with utf-8, should only work for real UTF-8
-                        docstring = docstring.decode('utf-8')
-                    except UnicodeError:
-                        # last resort -- can't fail
-                        docstring = docstring.decode('latin1')
-            docstringlines = prepare_docstring(docstring)
-            if self.env.app:
-                # let extensions preprocess docstrings
-                self.env.app.emit('autodoc-process-docstring',
-                                  what, name, obj, self.options, docstringlines)
-            for line in docstringlines:
-                yield line
-
-    def resolve_name(self, what, name):
-        """
-        Determine what module to import and what attribute to document.
-
-        Returns a tuple of: the full name, the module name, a path of
-        names to get via getattr, the signature and return annotation.
-        """
-        # first, parse the definition -- auto directives for classes and functions
-        # can contain a signature which is then used instead of an autogenerated one
-        try:
-            path, base, args, retann = py_sig_re.match(name).groups()
-        except:
-            self.warn('invalid signature for auto%s (%r)' % (what, name))
-            return
-        # fullname is the fully qualified name, base the name after the last dot
-        fullname = (path or '') + base
-
-        if what == 'module':
-            if args or retann:
-                self.warn('ignoring signature arguments and return annotation '
-                          'for automodule %s' % fullname)
-            return fullname, fullname, [], None, None
-
-        elif what in ('class', 'exception', 'function'):
-            if path:
-                mod = path.rstrip('.')
-            else:
-                mod = None
-                # if documenting a toplevel object without explicit module, it can
-                # be contained in another auto directive ...
-                if hasattr(self.env, 'autodoc_current_module'):
-                    mod = self.env.autodoc_current_module
-                # ... or in the scope of a module directive
-                if not mod:
-                    mod = self.env.currmodule
-            return fullname, mod, [base], args, retann
-
-        else:
-            if path:
-                mod_cls = path.rstrip('.')
-            else:
-                mod_cls = None
-                # if documenting a class-level object without path, there must be a
-                # current class, either from a parent auto directive ...
-                if hasattr(self.env, 'autodoc_current_class'):
-                    mod_cls = self.env.autodoc_current_class
-                # ... or from a class directive
-                if mod_cls is None:
-                    mod_cls = self.env.currclass
-                # ... if still None, there's no way to know
-                if mod_cls is None:
-                    return fullname, None, [], args, retann
-            mod, cls = rpartition(mod_cls, '.')
-            # if the module name is still missing, get it like above
-            if not mod and hasattr(self.env, 'autodoc_current_module'):
-                mod = self.env.autodoc_current_module
-            if not mod:
-                mod = self.env.currmodule
-            return fullname, mod, [cls, base], args, retann
-
-    def format_signature(self, what, name, obj, args, retann):
-        """
-        Return the signature of the object, formatted for display.
-        """
-        if what not in ('class', 'method', 'function'):
-            return ''
-
-        err = None
-        if args is not None:
-            # signature given explicitly
-            args = "(%s)" % args
-        else:
-            # try to introspect the signature
-            try:
-                args = None
-                getargs = True
-                if what == 'class':
-                    # for classes, the relevant signature is the __init__ method's
-                    obj = getattr(obj, '__init__', None)
-                    # classes without __init__ method, default __init__ or
-                    # __init__ written in C?
-                    if obj is None or obj is object.__init__ or not \
-                       (inspect.ismethod(obj) or inspect.isfunction(obj)):
-                        getargs = False
-                elif inspect.isbuiltin(obj) or inspect.ismethoddescriptor(obj):
-                    # can never get arguments of a C function or method
-                    getargs = False
-                if getargs:
-                    argspec = inspect.getargspec(obj)
-                    if what in ('class', 'method') and argspec[0] and \
-                           argspec[0][0] in ('cls', 'self'):
-                        del argspec[0][0]
-                    args = inspect.formatargspec(*argspec)
-            except Exception, e:
-                args = None
-                err = e
-
-        result = self.env.app.emit_firstresult('autodoc-process-signature', what,
-                                               name, obj, self.options, args, retann)
-        if result:
-            args, retann = result
-
-        if args is not None:
-            return '%s%s' % (args, retann or '')
-        elif err:
-            # re-raise the error for perusal of the handler in generate()
-            raise RuntimeError(err)
-        else:
-            return ''
-
-    def generate(self, what, name, members, add_content, indent=u'', check_module=False):
-        """
-        Generate reST for the object in self.result.
-        """
-        fullname, mod, objpath, args, retann = self.resolve_name(what, name)
-        if not mod:
-            # need a module to import
-            self.warn('don\'t know which module to import for autodocumenting %r '
-                      '(try placing a "module" or "currentmodule" directive in the '
-                      'document, or giving an explicit module name)' % fullname)
-            return
-
-        # the name to put into the generated directive -- doesn't contain the module
-        name_in_directive = '.'.join(objpath) or mod
-
-        # now, import the module and get object to document
-        try:
-            todoc = module = __import__(mod, None, None, ['foo'])
-            if hasattr(module, '__file__') and module.__file__:
-                modfile = module.__file__
-                if modfile[-4:].lower() in ('.pyc', '.pyo'):
-                    modfile = modfile[:-1]
-                self.filename_set.add(modfile)
-            else:
-                modfile = None  # e.g. for builtin and C modules
-            for part in objpath:
-                todoc = getattr(todoc, part)
-        except (ImportError, AttributeError), err:
-            self.warn('autodoc can\'t import/find %s %r, it reported error: "%s", '
-                      'please check your spelling and sys.path' %
-                      (what, str(fullname), err))
-            return
-
-        # check __module__ of object if wanted (for members not given explicitly)
-        if check_module:
-            if hasattr(todoc, '__module__'):
-                if todoc.__module__ != mod:
-                    return
-
-        # format the object's signature, if any
-        try:
-            sig = self.format_signature(what, name, todoc, args, retann)
-        except Exception, err:
-            self.warn('error while formatting signature for %s: %s' %
-                      (fullname, err))
-            sig = ''
-
-        # make sure that the result starts with an empty line.  This is
-        # necessary for some situations where another directive preprocesses
-        # reST and no starting newline is present
-        self.result.append(u'', '')
-
-        # now, create the directive header
-        directive = (what == 'method' and is_static_method(todoc)) \
-                    and 'staticmethod' or what
-        self.result.append(indent + u'.. %s:: %s%s' %
-                           (directive, name_in_directive, sig), '<autodoc>')
-        if what == 'module':
-            # Add some module-specific options
-            if self.options.synopsis:
-                self.result.append(indent + u'   :synopsis: ' + self.options.synopsis,
-                              '<autodoc>')
-            if self.options.platform:
-                self.result.append(indent + u'   :platform: ' + self.options.platform,
-                              '<autodoc>')
-            if self.options.deprecated:
-                self.result.append(indent + u'   :deprecated:', '<autodoc>')
-        else:
-            # Be explicit about the module, this is necessary since .. class:: doesn't
-            # support a prepended module name
-            self.result.append(indent + u'   :module: %s' % mod, '<autodoc>')
-        if self.options.noindex:
-            self.result.append(indent + u'   :noindex:', '<autodoc>')
-        self.result.append(u'', '<autodoc>')
-
-        if self.options.show_inheritance and what in ('class', 'exception'):
-            if len(todoc.__bases__):
-                bases = [b.__module__ == '__builtin__' and
-                         u':class:`%s`' % b.__name__ or
-                         u':class:`%s.%s`' % (b.__module__, b.__name__)
-                         for b in todoc.__bases__]
-                self.result.append(indent + u'   Bases: %s' % ', '.join(bases),
-                                   '<autodoc>')
-                self.result.append(u'', '<autodoc>')
-
-        # the module directive doesn't have content
-        if what != 'module':
-            indent += u'   '
-
-        if modfile:
-            sourcename = '%s:docstring of %s' % (modfile, fullname)
-        else:
-            sourcename = 'docstring of %s' % fullname
-
-        # add content from docstrings
-        for i, line in enumerate(self.get_doc(what, fullname, todoc)):
-            self.result.append(indent + line, sourcename, i)
-
-        # add source content, if present
-        if add_content:
-            for line, src in zip(add_content.data, add_content.items):
-                self.result.append(indent + line, src[0], src[1])
-
-        # document members?
-        if not members or what in ('function', 'method', 'attribute'):
-            return
-
-        # set current namespace for finding members
-        self.env.autodoc_current_module = mod
-        if objpath:
-            self.env.autodoc_current_class = objpath[0]
-
-        # add members, if possible
-        _all = members == ['__all__']
-        members_check_module = False
-        if _all:
-            # unqualified :members: given
-            if what == 'module':
-                if hasattr(todoc, '__all__'):
-                    members_check_module = False
-                    all_members = []
-                    for mname in todoc.__all__:
-                        try:
-                            all_members.append((mname, getattr(todoc, mname)))
-                        except AttributeError:
-                            self.warn('missing attribute mentioned in __all__: '
-                                      'module %s, attribute %s' %
-                                      (todoc.__name__, mname))
-                else:
-                    # for implicit module members, check __module__ to avoid
-                    # documenting imported objects
-                    members_check_module = True
-                    all_members = inspect.getmembers(todoc)
-            else:
-                if self.options.inherited_members:
-                    # getmembers() uses dir() which pulls in members from all
-                    # base classes
-                    all_members = inspect.getmembers(todoc)
-                else:
-                    # __dict__ contains only the members directly defined in the class
-                    all_members = sorted(todoc.__dict__.iteritems())
-        else:
-            all_members = [(mname, getattr(todoc, mname)) for mname in members]
-        for (membername, member) in all_members:
-            # ignore members whose name starts with _ by default
-            if _all and membername.startswith('_'):
-                continue
-
-            # ignore undocumented members if :undoc-members: is not given
-            doc = getattr(member, '__doc__', None)
-            skip = not self.options.undoc_members and not doc
-            # give the user a chance to decide whether this member should be skipped
-            if self.env.app:
-                # let extensions preprocess docstrings
-                skip_user = self.env.app.emit_firstresult(
-                    'autodoc-skip-member', what, membername, member, skip, self.options)
-                if skip_user is not None:
-                    skip = skip_user
-            if skip:
-                continue
-
-            if what == 'module':
-                if isinstance(member, (types.FunctionType,
-                                       types.BuiltinFunctionType)):
-                    memberwhat = 'function'
-                elif isinstance(member, types.ClassType) or \
-                     isinstance(member, type):
-                    if issubclass(member, base_exception):
-                        memberwhat = 'exception'
-                    else:
-                        memberwhat = 'class'
-                else:
-                    # XXX: todo -- attribute docs
-                    continue
-            else:
-                if callable(member):
-                    memberwhat = 'method'
-                elif isdescriptor(member):
-                    memberwhat = 'attribute'
-                else:
-                    # XXX: todo -- attribute docs
-                    continue
-            full_membername = fullname + '.' + membername
-            self.generate(memberwhat, full_membername, ['__all__'], None, indent,
-                          check_module=members_check_module)
-
-        self.env.autodoc_current_module = None
-        self.env.autodoc_current_class = None
-
-
-def _auto_directive(dirname, arguments, options, content, lineno,
-                    content_offset, block_text, state, state_machine):
-    what = dirname[4:]  # strip "auto"
-    name = arguments[0]
-    genopt = Options()
-    members = options.get('members', [])
-    genopt.inherited_members = 'inherited-members' in options
-    if genopt.inherited_members and not members:
-        # :inherited-members: implies :members:
-        members = ['__all__']
-    genopt.undoc_members = 'undoc-members' in options
-    genopt.show_inheritance = 'show-inheritance' in options
-    genopt.noindex = 'noindex' in options
-    genopt.synopsis = options.get('synopsis', '')
-    genopt.platform = options.get('platform', '')
-    genopt.deprecated = 'deprecated' in options
-
-    generator = RstGenerator(genopt, state.document, lineno)
-    generator.generate(what, name, members, content)
-    if not generator.result:
-        return generator.warnings
-
-    # record all filenames as dependencies -- this will at least partially make
-    # automatic invalidation possible
-    for fn in generator.filename_set:
-        state.document.settings.env.note_dependency(fn)
-
-    # use a custom reporter that correctly assigns lines to source and lineno
-    old_reporter = state.memo.reporter
-    state.memo.reporter = AutodocReporter(generator.result, state.memo.reporter)
-    if dirname == 'automodule':
-        node = nodes.section()
-        nested_parse_with_titles(state, generator.result, node)
-    else:
-        node = nodes.paragraph()
-        state.nested_parse(generator.result, 0, node)
-    state.memo.reporter = old_reporter
-    return generator.warnings + node.children
-
-def auto_directive(*args, **kwds):
-    return _auto_directive(*args, **kwds)
-
-def automodule_directive(*args, **kwds):
-    return _auto_directive(*args, **kwds)
-
-def autoclass_directive(*args, **kwds):
-    return _auto_directive(*args, **kwds)
-
-
-def members_option(arg):
-    if arg is None:
-        return ['__all__']
-    return [x.strip() for x in arg.split(',')]
-
-
-def setup(app):
-    mod_options = {'members': members_option, 'undoc-members': directives.flag,
-                   'noindex': directives.flag, 'inherited-members': directives.flag,
-                   'show-inheritance': directives.flag, 'synopsis': lambda x: x,
-                   'platform': lambda x: x, 'deprecated': directives.flag}
-    cls_options = {'members': members_option, 'undoc-members': directives.flag,
-                   'noindex': directives.flag, 'inherited-members': directives.flag,
-                   'show-inheritance': directives.flag}
-    app.add_directive('automodule', automodule_directive,
-                      1, (1, 0, 1), **mod_options)
-    app.add_directive('autoclass', autoclass_directive,
-                      1, (1, 0, 1), **cls_options)
-    app.add_directive('autoexception', autoclass_directive,
-                      1, (1, 0, 1), **cls_options)
-    app.add_directive('autofunction', auto_directive, 1, (1, 0, 1),
-                      noindex=directives.flag)
-    app.add_directive('automethod', auto_directive, 1, (1, 0, 1),
-                      noindex=directives.flag)
-    app.add_directive('autoattribute', auto_directive, 1, (1, 0, 1),
-                      noindex=directives.flag)
-    # deprecated: remove in some future version.
-    app.add_config_value('automodule_skip_lines', 0, True)
-    app.add_config_value('autoclass_content', 'class', True)
-    app.add_event('autodoc-process-docstring')
-    app.add_event('autodoc-process-signature')
-    app.add_event('autodoc-skip-member')
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/coverage.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,241 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.ext.coverage
-    ~~~~~~~~~~~~~~~~~~~
-
-    Check Python modules and C API for coverage.  Mostly written by Josip
-    Dzolonga for the Google Highly Open Participation contest.
-
-    :copyright: 2008 by Josip Dzolonga, Georg Brandl.
-    :license: BSD.
-"""
-
-import re
-import glob
-import inspect
-import cPickle as pickle
-from os import path
-
-from sphinx.builder import Builder
-
-
-# utility
-def write_header(f, text, char='-'):
-    f.write(text + '\n')
-    f.write(char * len(text) + '\n')
-
-def compile_regex_list(name, exps, warnfunc):
-    lst = []
-    for exp in exps:
-        try:
-            lst.append(re.compile(exp))
-        except Exception:
-            warnfunc('invalid regex %r in %s' % (exp, name))
-    return lst
-
-
-class CoverageBuilder(Builder):
-
-    name = 'coverage'
-
-    def init(self):
-        self.c_sourcefiles = []
-        for pattern in self.config.coverage_c_path:
-            pattern = path.join(self.srcdir, pattern)
-            self.c_sourcefiles.extend(glob.glob(pattern))
-
-        self.c_regexes = []
-        for (name, exp) in self.config.coverage_c_regexes.items():
-            try:
-                self.c_regexes.append((name, re.compile(exp)))
-            except Exception:
-                self.warn('invalid regex %r in coverage_c_regexes' % exp)
-
-        self.c_ignorexps = {}
-        for (name, exps) in self.config.coverage_ignore_c_items.iteritems():
-            self.c_ignorexps[name] = compile_regex_list('coverage_ignore_c_items',
-                                                        exps, self.warn)
-        self.mod_ignorexps = compile_regex_list('coverage_ignore_modules',
-                                                self.config.coverage_ignore_modules,
-                                                self.warn)
-        self.cls_ignorexps = compile_regex_list('coverage_ignore_classes',
-                                                self.config.coverage_ignore_classes,
-                                                self.warn)
-        self.fun_ignorexps = compile_regex_list('coverage_ignore_functions',
-                                                self.config.coverage_ignore_functions,
-                                                self.warn)
-
-    def get_outdated_docs(self):
-        return 'coverage overview'
-
-    def write(self, *ignored):
-        self.py_undoc = {}
-        self.build_py_coverage()
-        self.write_py_coverage()
-
-        self.c_undoc = {}
-        self.build_c_coverage()
-        self.write_c_coverage()
-
-    def build_c_coverage(self):
-        # Fetch all the info from the header files
-        for filename in self.c_sourcefiles:
-            undoc = []
-            f = open(filename, 'r')
-            try:
-                for line in f:
-                    for key, regex in self.c_regexes:
-                        match = regex.match(line)
-                        if match:
-                            name = match.groups()[0]
-                            if name not in self.env.descrefs:
-                                for exp in self.c_ignorexps.get(key, ()):
-                                    if exp.match(name):
-                                        break
-                                else:
-                                    undoc.append((key, name))
-                            continue
-            finally:
-                f.close()
-            if undoc:
-                self.c_undoc[filename] = undoc
-
-    def write_c_coverage(self):
-        output_file = path.join(self.outdir, 'c.txt')
-        op = open(output_file, 'w')
-        try:
-            write_header(op, 'Undocumented C API elements', '=')
-            op.write('\n')
-
-            for filename, undoc in self.c_undoc.iteritems():
-                write_header(op, filename)
-                for typ, name in undoc:
-                    op.write(' * %-50s [%9s]\n' % (name, typ))
-                op.write('\n')
-        finally:
-            op.close()
-
-    def build_py_coverage(self):
-        for mod_name in self.env.modules:
-            ignore = False
-            for exp in self.mod_ignorexps:
-                if exp.match(mod_name):
-                    ignore = True
-                    break
-            if ignore:
-                continue
-
-            try:
-                mod = __import__(mod_name, fromlist=['foo'])
-            except ImportError, err:
-                self.warn('module %s could not be imported: %s' % (mod_name, err))
-                self.py_undoc[mod_name] = {'error': err}
-                continue
-
-            funcs = []
-            classes = {}
-
-            for name, obj in inspect.getmembers(mod):
-                # diverse module attributes are ignored:
-                if name[0] == '_':
-                    # begins in an underscore
-                    continue
-                if not hasattr(obj, '__module__'):
-                    # cannot be attributed to a module
-                    continue
-                if obj.__module__ != mod_name:
-                    # is not defined in this module
-                    continue
-
-                full_name = '%s.%s' % (mod_name, name)
-
-                if inspect.isfunction(obj):
-                    if full_name not in self.env.descrefs:
-                        for exp in self.fun_ignorexps:
-                            if exp.match(name):
-                                break
-                        else:
-                            funcs.append(name)
-                elif inspect.isclass(obj):
-                    for exp in self.cls_ignorexps:
-                        if exp.match(name):
-                            break
-                    else:
-                        if full_name not in self.env.descrefs:
-                            # not documented at all
-                            classes[name] = []
-                            continue
-
-                        attrs = []
-
-                        for attr_name, attr in inspect.getmembers(obj, inspect.ismethod):
-                            if attr_name[0] == '_':
-                                # starts with an underscore, ignore it
-                                continue
-
-                            full_attr_name = '%s.%s' % (full_name, attr_name)
-                            if full_attr_name not in self.env.descrefs:
-                                attrs.append(attr_name)
-
-                        if attrs:
-                            # some attributes are undocumented
-                            classes[name] = attrs
-
-            self.py_undoc[mod_name] = {'funcs': funcs, 'classes': classes}
-
-    def write_py_coverage(self):
-        output_file = path.join(self.outdir, 'python.txt')
-        op = open(output_file, 'w')
-        failed = []
-        try:
-            write_header(op, 'Undocumented Python objects', '=')
-
-            keys = self.py_undoc.keys()
-            keys.sort()
-            for name in keys:
-                undoc = self.py_undoc[name]
-                if 'error' in undoc:
-                    failed.append((name, undoc['error']))
-                else:
-                    if not undoc['classes'] and not undoc['funcs']:
-                        continue
-
-                    write_header(op, name)
-                    if undoc['funcs']:
-                        op.write('Functions:\n')
-                        op.writelines(' * %s\n' % x for x in undoc['funcs'])
-                        op.write('\n')
-                    if undoc['classes']:
-                        op.write('Classes:\n')
-                        for name, methods in undoc['classes'].iteritems():
-                            if not methods:
-                                op.write(' * %s\n' % name)
-                            else:
-                                op.write(' * %s -- missing methods:\n' % name)
-                                op.writelines('   - %s\n' % x for x in methods)
-                        op.write('\n')
-
-            if failed:
-                write_header(op, 'Modules that failed to import')
-                op.writelines(' * %s -- %s\n' % x for x in failed)
-        finally:
-            op.close()
-
-    def finish(self):
-        # dump the coverage data to a pickle file too
-        picklepath = path.join(self.outdir, 'undoc.pickle')
-        dumpfile = open(picklepath, 'wb')
-        try:
-            pickle.dump((self.py_undoc, self.c_undoc), dumpfile)
-        finally:
-            dumpfile.close()
-
-
-def setup(app):
-    app.add_builder(CoverageBuilder)
-    app.add_config_value('coverage_ignore_modules', [], False)
-    app.add_config_value('coverage_ignore_functions', [], False)
-    app.add_config_value('coverage_ignore_classes', [], False)
-    app.add_config_value('coverage_c_path', [], False)
-    app.add_config_value('coverage_c_regexes', {}, False)
-    app.add_config_value('coverage_ignore_c_items', {}, False)
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/doctest.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,337 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.ext.doctest
-    ~~~~~~~~~~~~~~~~~~
-
-    Mimic doctest by automatically executing code snippets and checking
-    their results.
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import re
-import sys
-import time
-import codecs
-import StringIO
-from os import path
-# circumvent relative import
-doctest = __import__('doctest')
-
-from docutils import nodes
-from docutils.parsers.rst import directives
-
-from sphinx.builder import Builder
-from sphinx.util.console import bold
-
-blankline_re = re.compile(r'^\s*<BLANKLINE>', re.MULTILINE)
-doctestopt_re = re.compile(r'#\s*doctest:.+$', re.MULTILINE)
-
-# set up the necessary directives
-
-def test_directive(name, arguments, options, content, lineno,
-                   content_offset, block_text, state, state_machine):
-    # use ordinary docutils nodes for test code: they get special attributes
-    # so that our builder recognizes them, and the other builders are happy.
-    code = '\n'.join(content)
-    test = None
-    if name == 'doctest':
-        if '<BLANKLINE>' in code:
-            # convert <BLANKLINE>s to ordinary blank lines for presentation
-            test = code
-            code = blankline_re.sub('', code)
-        if doctestopt_re.search(code):
-            if not test:
-                test = code
-            code = doctestopt_re.sub('', code)
-    nodetype = nodes.literal_block
-    if name == 'testsetup' or 'hide' in options:
-        nodetype = nodes.comment
-    if arguments:
-        groups = [x.strip() for x in arguments[0].split(',')]
-    else:
-        groups = ['default']
-    node = nodetype(code, code, testnodetype=name, groups=groups)
-    node.line = lineno
-    if test is not None:
-        # only save if it differs from code
-        node['test'] = test
-    if name == 'testoutput':
-        # don't try to highlight output
-        node['language'] = 'none'
-    node['options'] = {}
-    if name in ('doctest', 'testoutput') and 'options' in options:
-        # parse doctest-like output comparison flags
-        option_strings = options['options'].replace(',', ' ').split()
-        for option in option_strings:
-            if (option[0] not in '+-' or option[1:] not in
-                doctest.OPTIONFLAGS_BY_NAME):
-                # XXX warn?
-                continue
-            flag = doctest.OPTIONFLAGS_BY_NAME[option[1:]]
-            node['options'][flag] = (option[0] == '+')
-    return [node]
-
-# need to have individual functions for each directive due to different
-# options they accept
-
-def testsetup_directive(*args):
-    return test_directive(*args)
-
-def doctest_directive(*args):
-    return test_directive(*args)
-
-def testcode_directive(*args):
-    return test_directive(*args)
-
-def testoutput_directive(*args):
-    return test_directive(*args)
-
-
-parser = doctest.DocTestParser()
-
-# helper classes
-
-class TestGroup(object):
-    def __init__(self, name):
-        self.name = name
-        self.setup = []
-        self.tests = []
-
-    def add_code(self, code):
-        if code.type == 'testsetup':
-            self.setup.append(code)
-        elif code.type == 'doctest':
-            self.tests.append([code])
-        elif code.type == 'testcode':
-            self.tests.append([code, None])
-        elif code.type == 'testoutput':
-            if self.tests and len(self.tests[-1]) == 2:
-                self.tests[-1][1] = code
-        else:
-            raise RuntimeError('invalid TestCode type')
-
-    def __repr__(self):
-        return 'TestGroup(name=%r, setup=%r, tests=%r)' % (
-            self.name, self.setup, self.tests)
-
-
-class TestCode(object):
-    def __init__(self, code, type, lineno, options=None):
-        self.code = code
-        self.type = type
-        self.lineno = lineno
-        self.options = options or {}
-
-    def __repr__(self):
-        return 'TestCode(%r, %r, %r, options=%r)' % (
-            self.code, self.type, self.lineno, self.options)
-
-
-class SphinxDocTestRunner(doctest.DocTestRunner):
-    def summarize(self, out, verbose=None):
-        io = StringIO.StringIO()
-        old_stdout = sys.stdout
-        sys.stdout = io
-        try:
-            res = doctest.DocTestRunner.summarize(self, verbose)
-        finally:
-            sys.stdout = old_stdout
-        out(io.getvalue())
-        return res
-
-# the new builder -- use sphinx-build.py -b doctest to run
-
-class DocTestBuilder(Builder):
-    """
-    Runs test snippets in the documentation.
-    """
-    name = 'doctest'
-
-    def init(self):
-        # default options
-        self.opt = doctest.DONT_ACCEPT_TRUE_FOR_1 | doctest.ELLIPSIS | \
-                   doctest.IGNORE_EXCEPTION_DETAIL
-
-        # HACK HACK HACK
-        # doctest compiles its snippets with type 'single'. That is nice
-        # for doctest examples but unusable for multi-statement code such
-        # as setup code -- to be able to use doctest error reporting with
-        # that code nevertheless, we monkey-patch the "compile" it uses.
-        doctest.compile = self.compile
-
-        self.type = 'single'
-
-        self.total_failures = 0
-        self.total_tries = 0
-        self.setup_failures = 0
-        self.setup_tries = 0
-
-        date = time.strftime('%Y-%m-%d %H:%M:%S')
-
-        self.outfile = codecs.open(path.join(self.outdir, 'output.txt'),
-                                   'w', encoding='utf-8')
-        self.outfile.write('''\
-Results of doctest builder run on %s
-==================================%s
-''' % (date, '='*len(date)))
-
-    def _out(self, text):
-        self.info(text, nonl=True)
-        self.outfile.write(text)
-
-    def _warn_out(self, text):
-        self.info(text, nonl=True)
-        if self.app.quiet:
-            self.warn(text)
-        self.outfile.write(text)
-
-    def get_target_uri(self, docname, typ=None):
-        return ''
-
-    def get_outdated_docs(self):
-        return self.env.found_docs
-
-    def finish(self):
-        # write executive summary
-        def s(v):
-            return v != 1 and 's' or ''
-        self._out('''
-Doctest summary
-===============
-%5d test%s
-%5d failure%s in tests
-%5d failure%s in setup code
-''' % (self.total_tries, s(self.total_tries),
-       self.total_failures, s(self.total_failures),
-       self.setup_failures, s(self.setup_failures)))
-        self.outfile.close()
-
-        if self.total_failures or self.setup_failures:
-            self.app.statuscode = 1
-
-        sys.path[0:0] = self.config.doctest_path
-
-    def write(self, build_docnames, updated_docnames, method='update'):
-        if build_docnames is None:
-            build_docnames = sorted(self.env.all_docs)
-
-        self.info(bold('running tests...'))
-        for docname in build_docnames:
-            # no need to resolve the doctree
-            doctree = self.env.get_doctree(docname)
-            self.test_doc(docname, doctree)
-
-    def test_doc(self, docname, doctree):
-        groups = {}
-        add_to_all_groups = []
-        self.setup_runner = SphinxDocTestRunner(verbose=False,
-                                                optionflags=self.opt)
-        self.test_runner = SphinxDocTestRunner(verbose=False,
-                                               optionflags=self.opt)
-        if self.config.doctest_test_doctest_blocks:
-            def condition(node):
-                return (isinstance(node, (nodes.literal_block, nodes.comment))
-                        and node.has_key('testnodetype')) or \
-                       isinstance(node, nodes.doctest_block)
-        else:
-            def condition(node):
-                return isinstance(node, (nodes.literal_block, nodes.comment)) \
-                        and node.has_key('testnodetype')
-        for node in doctree.traverse(condition):
-            source = node.has_key('test') and node['test'] or node.astext()
-            if not source:
-                self.warn('no code/output in %s block at %s:%s' %
-                          (node.get('testnodetype', 'doctest'),
-                           self.env.doc2path(docname), node.line))
-            code = TestCode(source, type=node.get('testnodetype', 'doctest'),
-                            lineno=node.line, options=node.get('options'))
-            node_groups = node.get('groups', ['default'])
-            if '*' in node_groups:
-                add_to_all_groups.append(code)
-                continue
-            for groupname in node_groups:
-                if groupname not in groups:
-                    groups[groupname] = TestGroup(groupname)
-                groups[groupname].add_code(code)
-        for code in add_to_all_groups:
-            for group in groups.itervalues():
-                group.add_code(code)
-        if not groups:
-            return
-
-        self._out('\nDocument: %s\n----------%s\n' % (docname, '-'*len(docname)))
-        for group in groups.itervalues():
-            self.test_group(group, self.env.doc2path(docname, base=None))
-        # Separately count results from setup code
-        res_f, res_t = self.setup_runner.summarize(self._out, verbose=False)
-        self.setup_failures += res_f
-        self.setup_tries += res_t
-        if self.test_runner.tries:
-            res_f, res_t = self.test_runner.summarize(self._out, verbose=True)
-            self.total_failures += res_f
-            self.total_tries += res_t
-
-    def compile(self, code, name, type, flags, dont_inherit):
-        return compile(code, name, self.type, flags, dont_inherit)
-
-    def test_group(self, group, filename):
-        ns = {}
-        examples = []
-        for setup in group.setup:
-            examples.append(doctest.Example(setup.code, '', lineno=setup.lineno))
-        if examples:
-            # simulate a doctest with the setup code
-            setup_doctest = doctest.DocTest(examples, {},
-                                            '%s (setup code)' % group.name,
-                                            filename, 0, None)
-            setup_doctest.globs = ns
-            old_f = self.setup_runner.failures
-            self.type = 'exec' # the snippet may contain multiple statements
-            self.setup_runner.run(setup_doctest, out=self._warn_out,
-                                  clear_globs=False)
-            if self.setup_runner.failures > old_f:
-                # don't run the group
-                return
-        for code in group.tests:
-            if len(code) == 1:
-                test = parser.get_doctest(code[0].code, {},
-                                          group.name, filename, code[0].lineno)
-                if not test.examples:
-                    continue
-                for example in test.examples:
-                    # apply directive's comparison options
-                    new_opt = code[0].options.copy()
-                    new_opt.update(example.options)
-                    example.options = new_opt
-                self.type = 'single' # ordinary doctests
-            else:
-                output = code[1] and code[1].code or ''
-                options = code[1] and code[1].options or {}
-                # disable <BLANKLINE> processing as it is not needed
-                options[doctest.DONT_ACCEPT_BLANKLINE] = True
-                example = doctest.Example(code[0].code, output,
-                                          lineno=code[0].lineno,
-                                          options=options)
-                test = doctest.DocTest([example], {}, group.name,
-                                       filename, code[0].lineno, None)
-                self.type = 'exec' # multiple statements again
-            # DocTest.__init__ copies the globs namespace, which we don't want
-            test.globs = ns
-            # also don't clear the globs namespace after running the doctest
-            self.test_runner.run(test, out=self._warn_out, clear_globs=False)
-
-
-def setup(app):
-    app.add_directive('testsetup', testsetup_directive, 1, (0, 1, 1))
-    app.add_directive('doctest', doctest_directive, 1, (0, 1, 1),
-                      hide=directives.flag, options=directives.unchanged)
-    app.add_directive('testcode', testcode_directive, 1, (0, 1, 1),
-                      hide=directives.flag)
-    app.add_directive('testoutput', testoutput_directive, 1, (0, 1, 1),
-                      hide=directives.flag, options=directives.unchanged)
-    app.add_builder(DocTestBuilder)
-    # this config value adds to sys.path
-    app.add_config_value('doctest_path', [], False)
-    app.add_config_value('doctest_test_doctest_blocks', 'default', False)
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/ifconfig.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.ext.ifconfig
-    ~~~~~~~~~~~~~~~~~~~
-
-    Provides the ``ifconfig`` directive that allows to write documentation
-    that is included depending on configuration variables.
-
-    Usage::
-
-        .. ifconfig:: releaselevel in ('alpha', 'beta', 'rc')
-
-           This stuff is only included in the built docs for unstable versions.
-
-    The argument for ``ifconfig`` is a plain Python expression, evaluated in the
-    namespace of the project configuration (that is, all variables from ``conf.py``
-    are available.)
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-from docutils import nodes
-
-
-class ifconfig(nodes.Element): pass
-
-
-def ifconfig_directive(name, arguments, options, content, lineno,
-                       content_offset, block_text, state, state_machine):
-    node = ifconfig()
-    node.line = lineno
-    node['expr'] = arguments[0]
-    state.nested_parse(content, content_offset, node)
-    return [node]
-
-
-def process_ifconfig_nodes(app, doctree, docname):
-    ns = app.config.__dict__.copy()
-    ns['builder'] = app.builder.name
-    for node in doctree.traverse(ifconfig):
-        try:
-            res = eval(node['expr'], ns)
-        except Exception, err:
-            # handle exceptions in a clean fashion
-            from traceback import format_exception_only
-            msg = ''.join(format_exception_only(err.__class__, err))
-            newnode = doctree.reporter.error('Exception occured in '
-                                             'ifconfig expression: \n%s' %
-                                             msg, base_node=node)
-            node.replace_self(newnode)
-        else:
-            if not res:
-                node.replace_self([])
-            else:
-                node.replace_self(node.children)
-
-
-def setup(app):
-    app.add_node(ifconfig)
-    app.add_directive('ifconfig', ifconfig_directive, 1, (1, 0, 1))
-    app.connect('doctree-resolved', process_ifconfig_nodes)
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/intersphinx.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,141 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.ext.intersphinx
-    ~~~~~~~~~~~~~~~~~~~~~~
-
-    Insert links to Python objects documented in remote Sphinx documentation.
-
-    This works as follows:
-
-    * Each Sphinx HTML build creates a file named "objects.inv" that contains
-      a mapping from Python identifiers to URIs relative to the HTML set's root.
-
-    * Projects using the Intersphinx extension can specify links to such mapping
-      files in the `intersphinx_mapping` config value.  The mapping will then be
-      used to resolve otherwise missing references to Python objects into links
-      to the other documentation.
-
-    * By default, the mapping file is assumed to be at the same location as the
-      rest of the documentation; however, the location of the mapping file can
-      also be specified individually, e.g. if the docs should be buildable
-      without Internet access.
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import time
-import urllib
-import posixpath
-from os import path
-
-from docutils import nodes
-
-from sphinx.builder import INVENTORY_FILENAME
-
-
-def fetch_inventory(app, uri, inv):
-    """Fetch, parse and return an intersphinx inventory file."""
-    invdata = {}
-    # both *uri* (base URI of the links to generate) and *inv* (actual
-    # location of the inventory file) can be local or remote URIs
-    localuri = uri.find('://') == -1
-    try:
-        if inv.find('://') != -1:
-            f = urllib.urlopen(inv)
-        else:
-            f = open(path.join(app.srcdir, inv))
-    except Exception, err:
-        app.warn('intersphinx inventory %r not fetchable due to '
-                 '%s: %s' % (inv, err.__class__, err))
-        return
-    try:
-        line = f.next()
-        if line.rstrip() != '# Sphinx inventory version 1':
-            raise ValueError('unknown or unsupported inventory version')
-        line = f.next()
-        projname = line.rstrip()[11:].decode('utf-8')
-        line = f.next()
-        version = line.rstrip()[11:]
-        for line in f:
-            name, type, location = line.rstrip().split(None, 2)
-            if localuri:
-                location = path.join(uri, location)
-            else:
-                location = posixpath.join(uri, location)
-            invdata[name] = (type, projname, version, location)
-        f.close()
-    except Exception, err:
-        app.warn('intersphinx inventory %r not readable due to '
-                 '%s: %s' % (inv, err.__class__, err))
-    else:
-        return invdata
-
-
-def load_mappings(app):
-    """Load all intersphinx mappings into the environment."""
-    now = int(time.time())
-    cache_time = now - app.config.intersphinx_cache_limit * 86400
-    env = app.builder.env
-    if not hasattr(env, 'intersphinx_cache'):
-        env.intersphinx_cache = {}
-    cache = env.intersphinx_cache
-    update = False
-    for uri, inv in app.config.intersphinx_mapping.iteritems():
-        # we can safely assume that the uri<->inv mapping is not changed
-        # during partial rebuilds since a changed intersphinx_mapping
-        # setting will cause a full environment reread
-        if not inv:
-            inv = posixpath.join(uri, INVENTORY_FILENAME)
-        # decide whether the inventory must be read: always read local
-        # files; remote ones only if the cache time is expired
-        if '://' not in inv or uri not in cache \
-               or cache[uri][0] < cache_time:
-            invdata = fetch_inventory(app, uri, inv)
-            cache[uri] = (now, invdata)
-            update = True
-    if update:
-        env.intersphinx_inventory = {}
-        for _, invdata in cache.itervalues():
-            if invdata:
-                env.intersphinx_inventory.update(invdata)
-
-
-def missing_reference(app, env, node, contnode):
-    """Attempt to resolve a missing reference via intersphinx references."""
-    type = node['reftype']
-    target = node['reftarget']
-    if type == 'mod':
-        type, proj, version, uri = env.intersphinx_inventory.get(target,
-                                                                 ('','','',''))
-        if type != 'mod':
-            return None
-        target = 'module-' + target   # for link anchor
-    else:
-        if target[-2:] == '()':
-            target = target[:-2]
-        target = target.rstrip(' *')
-        # special case: exceptions and object methods
-        if type == 'exc' and '.' not in target and \
-           'exceptions.' + target in env.intersphinx_inventory:
-            target = 'exceptions.' + target
-        elif type in ('func', 'meth') and '.' not in target and \
-           'object.' + target in env.intersphinx_inventory:
-            target = 'object.' + target
-        if target not in env.intersphinx_inventory:
-            return None
-        type, proj, version, uri = env.intersphinx_inventory[target]
-    print "Intersphinx hit:", target, uri
-    newnode = nodes.reference('', '')
-    newnode['refuri'] = uri + '#' + target
-    newnode['reftitle'] = '(in %s v%s)' % (proj, version)
-    newnode['class'] = 'external-xref'
-    newnode.append(contnode)
-    return newnode
-
-
-def setup(app):
-    app.add_config_value('intersphinx_mapping', {}, True)
-    app.add_config_value('intersphinx_cache_limit', 5, False)
-    app.connect('missing-reference', missing_reference)
-    app.connect('builder-inited', load_mappings)
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/jsmath.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.ext.jsmath
-    ~~~~~~~~~~~~~~~~~
-
-    Set up everything for use of JSMath to display math in HTML
-    via JavaScript.
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-from docutils import nodes
-
-from sphinx.application import ExtensionError
-from sphinx.ext.mathbase import setup as mathbase_setup
-
-
-def html_visit_math(self, node):
-    self.body.append(self.starttag(node, 'span', '', CLASS='math'))
-    self.body.append(self.encode(node['latex']) + '</span>')
-    raise nodes.SkipNode
-
-def html_visit_displaymath(self, node):
-    if node['nowrap']:
-        self.body.append(self.starttag(node, 'div', CLASS='math'))
-        self.body.append(node['latex'])
-        self.body.append('</div>')
-        raise nodes.SkipNode
-    for i, part in enumerate(node['latex'].split('\n\n')):
-        part = self.encode(part)
-        if i == 0:
-            # necessary to e.g. set the id property correctly
-            if node['number']:
-                self.body.append('<span class="eqno">(%s)</span>' % node['number'])
-            self.body.append(self.starttag(node, 'div', CLASS='math'))
-        else:
-            # but only once!
-            self.body.append('<div class="math">')
-        if '&' in part or '\\\\' in part:
-            self.body.append('\\begin{split}' + part + '\\end{split}')
-        else:
-            self.body.append(part)
-        self.body.append('</div>\n')
-    raise nodes.SkipNode
-
-def builder_inited(app):
-    if not app.config.jsmath_path:
-        raise ExtensionError('jsmath_path config value must be set for the '
-                             'jsmath extension to work')
-    app.add_javascript(app.config.jsmath_path)
-
-
-def setup(app):
-    mathbase_setup(app, (html_visit_math, None), (html_visit_displaymath, None))
-    app.add_config_value('jsmath_path', '', False)
-    app.connect('builder-inited', builder_inited)
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/mathbase.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,139 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.ext.mathbase
-    ~~~~~~~~~~~~~~~~~~~
-
-    Set up math support in source files and LaTeX/text output.
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-from docutils import nodes, utils
-from docutils.parsers.rst import directives
-
-
-class math(nodes.Inline, nodes.TextElement):
-    pass
-
-class displaymath(nodes.Part, nodes.Element):
-    pass
-
-class eqref(nodes.Inline, nodes.TextElement):
-    pass
-
-
-def wrap_displaymath(math, label):
-    parts = math.split('\n\n')
-    ret = []
-    for i, part in enumerate(parts):
-        if label is not None and i == 0:
-            ret.append('\\begin{split}%s\\end{split}' % part +
-                       (label and '\\label{'+label+'}' or ''))
-        else:
-            ret.append('\\begin{split}%s\\end{split}\\notag' % part)
-    return '\\begin{gather}\n' + '\\\\'.join(ret) + '\n\\end{gather}'
-
-
-def math_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
-    latex = utils.unescape(text, restore_backslashes=True)
-    return [math(latex=latex)], []
-
-def eq_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
-    text = utils.unescape(text)
-    node = eqref('(?)', '(?)', target=text)
-    node['docname'] = inliner.document.settings.env.docname
-    return [node], []
-
-def math_directive(name, arguments, options, content, lineno,
-                   content_offset, block_text, state, state_machine):
-    latex = '\n'.join(content)
-    if arguments and arguments[0]:
-        latex = arguments[0] + '\n\n' + latex
-    node = displaymath()
-    node['latex'] = latex
-    node['label'] = options.get('label', None)
-    node['nowrap'] = 'nowrap' in options
-    node['docname'] = state.document.settings.env.docname
-    ret = [node]
-    if node['label']:
-        tnode = nodes.target('', '', ids=['equation-' + node['label']])
-        state.document.note_explicit_target(tnode)
-        ret.insert(0, tnode)
-    return ret
-
-
-def latex_visit_math(self, node):
-    self.body.append('$' + node['latex'] + '$')
-    raise nodes.SkipNode
-
-def latex_visit_displaymath(self, node):
-    if node['nowrap']:
-        self.body.append(node['latex'])
-    else:
-        label = node['label'] and node['docname'] + '-' + node['label'] or None
-        self.body.append(wrap_displaymath(node['latex'], label))
-    raise nodes.SkipNode
-
-def latex_visit_eqref(self, node):
-    self.body.append('\\eqref{%s-%s}' % (node['docname'], node['target']))
-    raise nodes.SkipNode
-
-
-def text_visit_math(self, node):
-    self.add_text(node['latex'])
-    raise nodes.SkipNode
-
-def text_visit_displaymath(self, node):
-    self.new_state()
-    self.add_text(node['latex'])
-    self.end_state()
-    raise nodes.SkipNode
-
-def text_visit_eqref(self, node):
-    self.add_text(node['target'])
-    raise nodes.SkipNode
-
-
-def html_visit_eqref(self, node):
-    self.body.append('<a href="#equation-%s">' % node['target'])
-
-def html_depart_eqref(self, node):
-    self.body.append('</a>')
-
-
-def number_equations(app, doctree, docname):
-    num = 0
-    numbers = {}
-    for node in doctree.traverse(displaymath):
-        if node['label'] is not None:
-            num += 1
-            node['number'] = num
-            numbers[node['label']] = num
-        else:
-            node['number'] = None
-    for node in doctree.traverse(eqref):
-        if node['target'] not in numbers:
-            continue
-        num = '(%d)' % numbers[node['target']]
-        node[0] = nodes.Text(num, num)
-
-
-def setup(app, htmlinlinevisitors, htmldisplayvisitors):
-    app.add_node(math,
-                 latex=(latex_visit_math, None),
-                 text=(text_visit_math, None),
-                 html=htmlinlinevisitors)
-    app.add_node(displaymath,
-                 latex=(latex_visit_displaymath, None),
-                 text=(text_visit_displaymath, None),
-                 html=htmldisplayvisitors)
-    app.add_node(eqref,
-                 latex=(latex_visit_eqref, None),
-                 text=(text_visit_eqref, None),
-                 html=(html_visit_eqref, html_depart_eqref))
-    app.add_role('math', math_role)
-    app.add_role('eq', eq_role)
-    app.add_directive('math', math_directive, 1, (0, 1, 1),
-                      label=directives.unchanged, nowrap=directives.flag)
-    app.connect('doctree-resolved', number_equations)
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/pngmath.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,224 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.ext.pngmath
-    ~~~~~~~~~~~~~~~~~~
-
-    Render math in HTML via dvipng.
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import re
-import shutil
-import tempfile
-import posixpath
-from os import path, getcwd, chdir
-from subprocess import Popen, PIPE
-try:
-    from hashlib import sha1 as sha
-except ImportError:
-    from sha import sha
-
-from docutils import nodes
-
-from sphinx.util import ensuredir
-from sphinx.util.png import read_png_depth, write_png_depth
-from sphinx.application import SphinxError
-from sphinx.ext.mathbase import setup as mathbase_setup, wrap_displaymath
-
-class MathExtError(SphinxError):
-    category = 'Math extension error'
-
-
-DOC_HEAD = r'''
-\documentclass[12pt]{article}
-\usepackage[utf8]{inputenc}
-\usepackage{amsmath}
-\usepackage{amsthm}
-\usepackage{amssymb}
-\usepackage{amsfonts}
-\usepackage{bm}
-\pagestyle{empty}
-'''
-
-DOC_BODY = r'''
-\begin{document}
-%s
-\end{document}
-'''
-
-DOC_BODY_PREVIEW = r'''
-\usepackage[active]{preview}
-\begin{document}
-\begin{preview}
-%s
-\end{preview}
-\end{document}
-'''
-
-depth_re = re.compile(r'\[\d+ depth=(-?\d+)\]')
-
-def render_math(self, math):
-    """
-    Render the LaTeX math expression *math* using latex and dvipng.
-
-    Return the filename relative to the built document and the "depth",
-    that is, the distance of image bottom and baseline in pixels, if the
-    option to use preview_latex is switched on.
-
-    Error handling may seem strange, but follows a pattern: if LaTeX or
-    dvipng aren't available, only a warning is generated (since that enables
-    people on machines without these programs to at least build the rest
-    of the docs successfully).  If the programs are there, however, they
-    may not fail since that indicates a problem in the math source.
-    """
-    use_preview = self.builder.config.pngmath_use_preview
-
-    shasum = "%s.png" % sha(math.encode('utf-8')).hexdigest()
-    relfn = posixpath.join(self.builder.imgpath, 'math', shasum)
-    outfn = path.join(self.builder.outdir, '_images', 'math', shasum)
-    if path.isfile(outfn):
-        depth = read_png_depth(outfn)
-        return relfn, depth
-
-    latex = DOC_HEAD + self.builder.config.pngmath_latex_preamble
-    latex += (use_preview and DOC_BODY_PREVIEW or DOC_BODY) % math
-    if isinstance(latex, unicode):
-        latex = latex.encode('utf-8')
-
-    # use only one tempdir per build -- the use of a directory is cleaner
-    # than using temporary files, since we can clean up everything at once
-    # just removing the whole directory (see cleanup_tempdir)
-    if not hasattr(self.builder, '_mathpng_tempdir'):
-        tempdir = self.builder._mathpng_tempdir = tempfile.mkdtemp()
-    else:
-        tempdir = self.builder._mathpng_tempdir
-
-    tf = open(path.join(tempdir, 'math.tex'), 'w')
-    tf.write(latex)
-    tf.close()
-
-    # build latex command; old versions of latex don't have the
-    # --output-directory option, so we have to manually chdir to the
-    # temp dir to run it.
-    ltx_args = [self.builder.config.pngmath_latex, '--interaction=nonstopmode']
-    # add custom args from the config file
-    ltx_args.extend(self.builder.config.pngmath_latex_args)
-    ltx_args.append('math.tex')
-
-    curdir = getcwd()
-    chdir(tempdir)
-
-    try:
-        try:
-            p = Popen(ltx_args, stdout=PIPE, stderr=PIPE)
-        except OSError, err:
-            if err.errno != 2:   # No such file or directory
-                raise
-            if not hasattr(self.builder, '_mathpng_warned_latex'):
-                self.builder.warn('LaTeX command %r cannot be run (needed for math '
-                                  'display), check the pngmath_latex setting' %
-                                  self.builder.config.pngmath_latex)
-                self.builder._mathpng_warned_latex = True
-            return relfn, None
-    finally:
-        chdir(curdir)
-
-    stdout, stderr = p.communicate()
-    if p.returncode != 0:
-        raise MathExtError('latex exited with error:\n[stderr]\n%s\n[stdout]\n%s'
-                           % (stderr, stdout))
-
-    ensuredir(path.dirname(outfn))
-    # use some standard dvipng arguments
-    dvipng_args = [self.builder.config.pngmath_dvipng]
-    dvipng_args += ['-o', outfn, '-T', 'tight', '-z9']
-    # add custom ones from config value
-    dvipng_args.extend(self.builder.config.pngmath_dvipng_args)
-    if use_preview:
-        dvipng_args.append('--depth')
-    # last, the input file name
-    dvipng_args.append(path.join(tempdir, 'math.dvi'))
-    try:
-        p = Popen(dvipng_args, stdout=PIPE, stderr=PIPE)
-    except OSError, err:
-        if err.errno != 2:   # No such file or directory
-            raise
-        if not hasattr(self.builder, '_mathpng_warned_dvipng'):
-            self.builder.warn('dvipng command %r cannot be run (needed for math '
-                              'display), check the pngmath_dvipng setting' %
-                              self.builder.config.pngmath_dvipng)
-            self.builder._mathpng_warned_dvipng = True
-        return relfn, None
-    stdout, stderr = p.communicate()
-    if p.returncode != 0:
-        raise MathExtError('dvipng exited with error:\n[stderr]\n%s\n[stdout]\n%s'
-                           % (stderr, stdout))
-    depth = None
-    if use_preview:
-        for line in stdout.splitlines():
-            m = depth_re.match(line)
-            if m:
-                depth = int(m.group(1))
-                write_png_depth(outfn, depth)
-                break
-
-    return relfn, depth
-
-def cleanup_tempdir(app, exc):
-    if exc:
-        return
-    if not hasattr(app.builder, '_mathpng_tempdir'):
-        return
-    try:
-        shutil.rmtree(app.builder._mathpng_tempdir)
-    except Exception:
-        pass
-
-def html_visit_math(self, node):
-    try:
-        fname, depth = render_math(self, '$'+node['latex']+'$')
-    except MathExtError, exc:
-        sm = nodes.system_message(str(exc), type='WARNING', level=2,
-                                  backrefs=[], source=node['latex'])
-        sm.walkabout(self)
-        self.builder.warn('display latex %r: ' % node['latex'] + str(exc))
-        raise nodes.SkipNode
-    self.body.append('<img class="math" src="%s" alt="%s" %s/>' %
-                     (fname, self.encode(node['latex']).strip(),
-                      depth and 'style="vertical-align: %dpx" ' % (-depth) or ''))
-    raise nodes.SkipNode
-
-def html_visit_displaymath(self, node):
-    if node['nowrap']:
-        latex = node['latex']
-    else:
-        latex = wrap_displaymath(node['latex'], None)
-    try:
-        fname, depth = render_math(self, latex)
-    except MathExtError, exc:
-        sm = nodes.system_message(str(exc), type='WARNING', level=2,
-                                  backrefs=[], source=node['latex'])
-        sm.walkabout(self)
-        self.builder.warn('inline latex %r: ' % node['latex'] + str(exc))
-        raise nodes.SkipNode
-    self.body.append(self.starttag(node, 'div', CLASS='math'))
-    self.body.append('<p>')
-    if node['number']:
-        self.body.append('<span class="eqno">(%s)</span>' % node['number'])
-    self.body.append('<img src="%s" alt="%s" />\n</div>' %
-                     (fname, self.encode(node['latex']).strip()))
-    self.body.append('</p>')
-    raise nodes.SkipNode
-
-
-def setup(app):
-    mathbase_setup(app, (html_visit_math, None), (html_visit_displaymath, None))
-    app.add_config_value('pngmath_dvipng', 'dvipng', False)
-    app.add_config_value('pngmath_latex', 'latex', False)
-    app.add_config_value('pngmath_use_preview', False, False)
-    app.add_config_value('pngmath_dvipng_args', ['-gamma 1.5', '-D 110'], False)
-    app.add_config_value('pngmath_latex_args', [], False)
-    app.add_config_value('pngmath_latex_preamble', '', False)
-    app.connect('build-finished', cleanup_tempdir)
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/refcounting.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.ext.refcounting
-    ~~~~~~~~~~~~~~~~~~~~~~
-
-    Supports reference count annotations for C API functions.  Based on
-    refcount.py and anno-api.py in the old Python documentation tools.
-
-    Usage: Set the `refcount_file` config value to the path to the reference
-    count data file.
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-from os import path
-from docutils import nodes
-
-from sphinx import addnodes
-
-
-# refcount annotation
-class refcount(nodes.emphasis): pass
-
-
-class RCEntry:
-    def __init__(self, name):
-        self.name = name
-        self.args = []
-        self.result_type = ''
-        self.result_refs = None
-
-
-class Refcounts(dict):
-    @classmethod
-    def fromfile(cls, filename):
-        d = cls()
-        fp = open(filename, 'r')
-        try:
-            for line in fp:
-                line = line.strip()
-                if line[:1] in ("", "#"):
-                    # blank lines and comments
-                    continue
-                parts = line.split(":", 4)
-                if len(parts) != 5:
-                    raise ValueError("Wrong field count in %r" % line)
-                function, type, arg, refcount, comment = parts
-                # Get the entry, creating it if needed:
-                try:
-                    entry = d[function]
-                except KeyError:
-                    entry = d[function] = RCEntry(function)
-                if not refcount or refcount == "null":
-                    refcount = None
-                else:
-                    refcount = int(refcount)
-                # Update the entry with the new parameter or the result information.
-                if arg:
-                    entry.args.append((arg, type, refcount))
-                else:
-                    entry.result_type = type
-                    entry.result_refs = refcount
-        finally:
-            fp.close()
-        return d
-
-    def add_refcount_annotations(self, app, doctree):
-        for node in doctree.traverse(addnodes.desc_content):
-            par = node.parent
-            if par['desctype'] != 'cfunction':
-                continue
-            if not par[0].has_key('names') or not par[0]['names']:
-                continue
-            entry = self.get(par[0]['names'][0])
-            if not entry:
-                continue
-            elif entry.result_type not in ("PyObject*", "PyVarObject*"):
-                continue
-            rc = 'Return value: '
-            if entry.result_refs is None:
-                rc += "Always NULL."
-            else:
-                rc += (entry.result_refs and "New" or "Borrowed") + " reference."
-            node.insert(0, refcount(rc, rc))
-
-
-def init_refcounts(app):
-    if app.config.refcount_file:
-        refcounts = Refcounts.fromfile(
-            path.join(app.srcdir, app.config.refcount_file))
-        app.connect('doctree-read', refcounts.add_refcount_annotations)
-
-
-def setup(app):
-    app.add_node(refcount)
-    app.add_config_value('refcount_file', '', True)
-    app.connect('builder-inited', init_refcounts)
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/ext/todo.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.ext.todo
-    ~~~~~~~~~~~~~~~
-
-    Allow todos to be inserted into your documentation.  Inclusion of todos can
-    be switched of by a configuration variable.  The todolist directive collects
-    all todos of your project and lists them along with a backlink to the
-    original location.
-
-    :copyright: 2008 Daniel Bültmann.
-    :license: BSD.
-"""
-
-from docutils import nodes
-
-from sphinx.util.compat import make_admonition
-
-class todo_node(nodes.Admonition, nodes.Element): pass
-class todolist(nodes.General, nodes.Element): pass
-
-
-def todo_directive(name, arguments, options, content, lineno,
-                   content_offset, block_text, state, state_machine):
-    env = state.document.settings.env
-
-    targetid = "todo-%s" % env.index_num
-    env.index_num += 1
-    targetnode = nodes.target('', '', ids=[targetid])
-
-    ad = make_admonition(todo_node, name, [_('Todo')], options, content, lineno,
-                         content_offset, block_text, state, state_machine)
-
-    # Attach a list of all todos to the environment,
-    # the todolist works with the collected todo nodes
-    if not hasattr(env, 'todo_all_todos'):
-        env.todo_all_todos = []
-    env.todo_all_todos.append({
-        'docname': env.docname,
-        'lineno': lineno,
-        'todo': ad[0].deepcopy(),
-        'target': targetnode,
-    })
-
-    return [targetnode] + ad
-
-
-def todolist_directive(name, arguments, options, content, lineno,
-                       content_offset, block_text, state, state_machine):
-    # Simply insert an empty todolist node which will be replaced later
-    # when process_todo_nodes is called
-    return [todolist('')]
-
-
-def process_todo_nodes(app, doctree, fromdocname):
-    if not app.config['todo_include_todos']:
-        for node in doctree.traverse(todo_node):
-            node.parent.remove(node)
-
-    # Replace all todolist nodes with a list of the collected todos.
-    # Augment each todo with a backlink to the original location.
-    env = app.builder.env
-
-    for node in doctree.traverse(todolist):
-        if not app.config['todo_include_todos']:
-            node.replace_self([])
-            continue
-
-        content = []
-
-        for todo_info in env.todo_all_todos:
-            para = nodes.paragraph()
-            filename = env.doc2path(todo_info['docname'], base=None)
-            description = (
-                _('(The original entry is located in %s, line %d and can be found ') %
-                (filename, todo_info['lineno']))
-            para += nodes.Text(description, description)
-
-            # Create a reference
-            newnode = nodes.reference('', '')
-            innernode = nodes.emphasis(_('here'), _('here'))
-            newnode['refdocname'] = todo_info['docname']
-            newnode['refuri'] = app.builder.get_relative_uri(
-                fromdocname, todo_info['docname'])
-            newnode['refuri'] += '#' + todo_info['target']['refid']
-            newnode.append(innernode)
-            para += newnode
-            para += nodes.Text('.)', '.)')
-
-            # Insert into the todolist
-            content.append(todo_info['todo'])
-            content.append(para)
-
-        node.replace_self(content)
-
-
-def purge_todos(app, env, docname):
-    if not hasattr(env, 'todo_all_todos'):
-        return
-    env.todo_all_todos = [todo for todo in env.todo_all_todos
-                          if todo['docname'] != docname]
-
-
-def visit_todo_node(self, node):
-    self.visit_admonition(node)
-
-def depart_todo_node(self, node):
-    self.depart_admonition(node)
-
-def setup(app):
-    app.add_config_value('todo_include_todos', False, False)
-
-    app.add_node(todolist)
-    app.add_node(todo_node,
-                 html=(visit_todo_node, depart_todo_node),
-                 latex=(visit_todo_node, depart_todo_node),
-                 text=(visit_todo_node, depart_todo_node))
-
-    app.add_directive('todo', todo_directive, 1, (0, 0, 1))
-    app.add_directive('todolist', todolist_directive, 0, (0, 0, 0))
-    app.connect('doctree-resolved', process_todo_nodes)
-    app.connect('env-purge-doc', purge_todos)
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/highlighting.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,195 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.highlighting
-    ~~~~~~~~~~~~~~~~~~~
-
-    Highlight code blocks using Pygments.
-
-    :copyright: 2007-2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import sys
-import cgi
-import re
-import parser
-
-from sphinx.util.texescape import tex_hl_escape_map
-
-try:
-    import pygments
-    from pygments import highlight
-    from pygments.lexers import PythonLexer, PythonConsoleLexer, CLexer, \
-         TextLexer, RstLexer
-    from pygments.lexers import get_lexer_by_name, guess_lexer
-    from pygments.formatters import HtmlFormatter, LatexFormatter
-    from pygments.filters import ErrorToken
-    from pygments.style import Style
-    from pygments.styles import get_style_by_name
-    from pygments.styles.friendly import FriendlyStyle
-    from pygments.token import Generic, Comment, Number
-except ImportError:
-    pygments = None
-else:
-    class SphinxStyle(Style):
-        """
-        Like friendly, but a bit darker to enhance contrast on the green
-        background.
-        """
-
-        background_color = '#eeffcc'
-        default_style = ''
-
-        styles = FriendlyStyle.styles
-        styles.update({
-            Generic.Output: '#333',
-            Comment: 'italic #408090',
-            Number: '#208050',
-        })
-
-    lexers = dict(
-        none = TextLexer(),
-        python = PythonLexer(),
-        pycon = PythonConsoleLexer(),
-        # the python3 option exists as of Pygments 0.12, but it doesn't
-        # do any harm in previous versions
-        pycon3 = PythonConsoleLexer(python3=True),
-        rest = RstLexer(),
-        c = CLexer(),
-    )
-    for _lexer in lexers.values():
-        _lexer.add_filter('raiseonerror')
-
-
-escape_hl_chars = {ord(u'@'): u'@PYGZat[]',
-                   ord(u'['): u'@PYGZlb[]',
-                   ord(u']'): u'@PYGZrb[]'}
-
-# used if Pygments is not available
-_LATEX_STYLES = r'''
-\newcommand\PYGZat{@}
-\newcommand\PYGZlb{[}
-\newcommand\PYGZrb{]}
-'''
-
-
-parsing_exceptions = (SyntaxError, UnicodeEncodeError)
-if sys.version_info < (2, 5):
-    # Python <= 2.4 raises MemoryError when parsing an
-    # invalid encoding cookie
-    parsing_exceptions += MemoryError,
-
-
-class PygmentsBridge(object):
-    def __init__(self, dest='html', stylename='sphinx'):
-        self.dest = dest
-        if not pygments:
-            return
-        if stylename == 'sphinx':
-            style = SphinxStyle
-        elif '.' in stylename:
-            module, stylename = stylename.rsplit('.', 1)
-            style = getattr(__import__(module, None, None, ['']), stylename)
-        else:
-            style = get_style_by_name(stylename)
-        self.hfmter = {False: HtmlFormatter(style=style),
-                       True: HtmlFormatter(style=style, linenos=True)}
-        self.lfmter = {False: LatexFormatter(style=style, commandprefix='PYG'),
-                       True: LatexFormatter(style=style, linenos=True,
-                                            commandprefix='PYG')}
-
-    def unhighlighted(self, source):
-        if self.dest == 'html':
-            return '<pre>' + cgi.escape(source) + '</pre>\n'
-        else:
-            # first, escape highlighting characters like Pygments does
-            source = source.translate(escape_hl_chars)
-            # then, escape all characters nonrepresentable in LaTeX
-            source = source.translate(tex_hl_escape_map)
-            return '\\begin{Verbatim}[commandchars=@\\[\\]]\n' + \
-                   source + '\\end{Verbatim}\n'
-
-    def try_parse(self, src):
-        # Make sure it ends in a newline
-        src += '\n'
-
-        # Replace "..." by a mark which is also a valid python expression
-        # (Note, the highlighter gets the original source, this is only done
-        #  to allow "..." in code and still highlight it as Python code.)
-        mark = "__highlighting__ellipsis__"
-        src = src.replace("...", mark)
-
-        # lines beginning with "..." are probably placeholders for suite
-        src = re.sub(r"(?m)^(\s*)" + mark + "(.)", r"\1"+ mark + r"# \2", src)
-
-        # if we're using 2.5, use the with statement
-        if sys.version_info >= (2, 5):
-            src = 'from __future__ import with_statement\n' + src
-
-        if isinstance(src, unicode):
-            # Non-ASCII chars will only occur in string literals
-            # and comments.  If we wanted to give them to the parser
-            # correctly, we'd have to find out the correct source
-            # encoding.  Since it may not even be given in a snippet,
-            # just replace all non-ASCII characters.
-            src = src.encode('ascii', 'replace')
-
-        try:
-            parser.suite(src)
-        except parsing_exceptions:
-            return False
-        else:
-            return True
-
-    def highlight_block(self, source, lang, linenos=False):
-        if not pygments:
-            return self.unhighlighted(source)
-        if lang in ('py', 'python'):
-            if source.startswith('>>>'):
-                # interactive session
-                lexer = lexers['pycon']
-            else:
-                # maybe Python -- try parsing it
-                if self.try_parse(source):
-                    lexer = lexers['python']
-                else:
-                    return self.unhighlighted(source)
-        elif lang in ('python3', 'py3') and source.startswith('>>>'):
-            # for py3, recognize interactive sessions, but do not try parsing...
-            lexer = lexers['pycon3']
-        elif lang == 'guess':
-            try:
-                lexer = guess_lexer(source)
-            except Exception:
-                return self.unhighlighted(source)
-        else:
-            if lang in lexers:
-                lexer = lexers[lang]
-            else:
-                lexer = lexers[lang] = get_lexer_by_name(lang)
-                lexer.add_filter('raiseonerror')
-        try:
-            if self.dest == 'html':
-                return highlight(source, lexer, self.hfmter[bool(linenos)])
-            else:
-                hlsource = highlight(source, lexer, self.lfmter[bool(linenos)])
-                return hlsource.translate(tex_hl_escape_map)
-        except ErrorToken:
-            # this is most probably not the selected language,
-            # so let it pass unhighlighted
-            return self.unhighlighted(source)
-
-    def get_stylesheet(self):
-        if not pygments:
-            if self.dest == 'latex':
-                return _LATEX_STYLES
-            # no HTML styles needed
-            return ''
-        if self.dest == 'html':
-            return self.hfmter[0].get_style_defs()
-        else:
-            styledefs = self.lfmter[0].get_style_defs()
-            # workaround for Pygments < 0.12
-            if styledefs.startswith('\\newcommand\\at{@}'):
-                styledefs += _LATEX_STYLES
-            return styledefs
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/htmlhelp.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,220 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.htmlhelp
-    ~~~~~~~~~~~~~~~
-
-    Build HTML help support files.
-    Adapted from the original Doc/tools/prechm.py.
-
-    :copyright: 2007-2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import os
-import cgi
-from os import path
-
-from docutils import nodes
-
-from sphinx import addnodes
-
-# Project file (*.hhp) template.  'outname' is the file basename (like
-# the pythlp in pythlp.hhp); 'version' is the doc version number (like
-# the 2.2 in Python 2.2).
-# The magical numbers in the long line under [WINDOWS] set most of the
-# user-visible features (visible buttons, tabs, etc).
-# About 0x10384e:  This defines the buttons in the help viewer.  The
-# following defns are taken from htmlhelp.h.  Not all possibilities
-# actually work, and not all those that work are available from the Help
-# Workshop GUI.  In particular, the Zoom/Font button works and is not
-# available from the GUI.  The ones we're using are marked with 'x':
-#
-#    0x000002   Hide/Show   x
-#    0x000004   Back        x
-#    0x000008   Forward     x
-#    0x000010   Stop
-#    0x000020   Refresh
-#    0x000040   Home        x
-#    0x000080   Forward
-#    0x000100   Back
-#    0x000200   Notes
-#    0x000400   Contents
-#    0x000800   Locate      x
-#    0x001000   Options     x
-#    0x002000   Print       x
-#    0x004000   Index
-#    0x008000   Search
-#    0x010000   History
-#    0x020000   Favorites
-#    0x040000   Jump 1
-#    0x080000   Jump 2
-#    0x100000   Zoom/Font   x
-#    0x200000   TOC Next
-#    0x400000   TOC Prev
-
-project_template = '''\
-[OPTIONS]
-Binary TOC=Yes
-Binary Index=No
-Compiled file=%(outname)s.chm
-Contents file=%(outname)s.hhc
-Default Window=%(outname)s
-Default topic=index.html
-Display compile progress=No
-Full text search stop list file=%(outname)s.stp
-Full-text search=Yes
-Index file=%(outname)s.hhk
-Language=0x409
-Title=%(title)s
-
-[WINDOWS]
-%(outname)s="%(title)s","%(outname)s.hhc","%(outname)s.hhk",\
-"index.html","index.html",,,,,0x63520,220,0x10384e,[0,0,1024,768],,,,,,,0
-
-[FILES]
-'''
-
-contents_header = '''\
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<HTML>
-<HEAD>
-<meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
-<!-- Sitemap 1.0 -->
-</HEAD><BODY>
-<OBJECT type="text/site properties">
-        <param name="Window Styles" value="0x801227">
-        <param name="ImageType" value="Folder">
-</OBJECT>
-<UL>
-'''
-
-contents_footer = '''\
-</UL></BODY></HTML>
-'''
-
-object_sitemap = '''\
-<OBJECT type="text/sitemap">
-    <param name="Name" value="%s">
-    <param name="Local" value="%s">
-</OBJECT>
-'''
-
-# List of words the full text search facility shouldn't index.  This
-# becomes file outname.stp.  Note that this list must be pretty small!
-# Different versions of the MS docs claim the file has a maximum size of
-# 256 or 512 bytes (including \r\n at the end of each line).
-# Note that "and", "or", "not" and "near" are operators in the search
-# language, so no point indexing them even if we wanted to.
-stopwords = """
-a  and  are  as  at
-be  but  by
-for
-if  in  into  is  it
-near  no  not
-of  on  or
-such
-that  the  their  then  there  these  they  this  to
-was  will  with
-""".split()
-
-
-def build_hhx(builder, outdir, outname):
-    builder.info('dumping stopword list...')
-    f = open(path.join(outdir, outname+'.stp'), 'w')
-    try:
-        for word in sorted(stopwords):
-            print >>f, word
-    finally:
-        f.close()
-
-    builder.info('writing project file...')
-    f = open(path.join(outdir, outname+'.hhp'), 'w')
-    try:
-        f.write(project_template % {'outname': outname,
-                                    'title': builder.config.html_title,
-                                    'version': builder.config.version,
-                                    'project': builder.config.project})
-        if not outdir.endswith(os.sep):
-            outdir += os.sep
-        olen = len(outdir)
-        for root, dirs, files in os.walk(outdir):
-            staticdir = (root == path.join(outdir, '_static'))
-            for fn in files:
-                if (staticdir and not fn.endswith('.js')) or fn.endswith('.html'):
-                    print >>f, path.join(root, fn)[olen:].replace(os.sep, '\\')
-    finally:
-        f.close()
-
-    builder.info('writing TOC file...')
-    f = open(path.join(outdir, outname+'.hhc'), 'w')
-    try:
-        f.write(contents_header)
-        # special books
-        f.write('<LI> ' + object_sitemap % (builder.config.html_short_title,
-                                            'index.html'))
-        if builder.config.html_use_modindex:
-            f.write('<LI> ' + object_sitemap % (_('Global Module Index'),
-                                                'modindex.html'))
-        # the TOC
-        tocdoc = builder.env.get_and_resolve_doctree(builder.config.master_doc, builder,
-                                                     prune_toctrees=False)
-        def write_toc(node, ullevel=0):
-            if isinstance(node, nodes.list_item):
-                f.write('<LI> ')
-                for subnode in node:
-                    write_toc(subnode, ullevel)
-            elif isinstance(node, nodes.reference):
-                link = node['refuri']
-                title = cgi.escape(node.astext()).replace('"','&quot;')
-                item = object_sitemap % (title, link)
-                f.write(item.encode('ascii', 'xmlcharrefreplace'))
-            elif isinstance(node, nodes.bullet_list):
-                if ullevel != 0:
-                    f.write('<UL>\n')
-                for subnode in node:
-                    write_toc(subnode, ullevel+1)
-                if ullevel != 0:
-                    f.write('</UL>\n')
-            elif isinstance(node, addnodes.compact_paragraph):
-                for subnode in node:
-                    write_toc(subnode, ullevel)
-        istoctree = lambda node: isinstance(node, addnodes.compact_paragraph) and \
-                    node.has_key('toctree')
-        for node in tocdoc.traverse(istoctree):
-            write_toc(node)
-        f.write(contents_footer)
-    finally:
-        f.close()
-
-    builder.info('writing index file...')
-    index = builder.env.create_index(builder)
-    f = open(path.join(outdir, outname+'.hhk'), 'w')
-    try:
-        f.write('<UL>\n')
-        def write_index(title, refs, subitems):
-            def write_param(name, value):
-                item = '    <param name="%s" value="%s">\n' % (name, value)
-                f.write(item.encode('ascii', 'xmlcharrefreplace'))
-            title = cgi.escape(title)
-            f.write('<LI> <OBJECT type="text/sitemap">\n')
-            write_param('Keyword', title)
-            if len(refs) == 0:
-                write_param('See Also', title)
-            elif len(refs) == 1:
-                write_param('Local', refs[0])
-            else:
-                for i, ref in enumerate(refs):
-                    write_param('Name', '[%d] %s' % (i, ref)) # XXX: better title?
-                    write_param('Local', ref)
-            f.write('</OBJECT>\n')
-            if subitems:
-                f.write('<UL> ')
-                for subitem in subitems:
-                    write_index(subitem[0], subitem[1], [])
-                f.write('</UL>')
-        for (key, group) in index:
-            for title, (refs, subitems) in group:
-                write_index(title, refs, subitems)
-        f.write('</UL>\n')
-    finally:
-        f.close()
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/htmlwriter.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,457 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.htmlwriter
-    ~~~~~~~~~~~~~~~~~
-
-    docutils writers handling Sphinx' custom nodes.
-
-    :copyright: 2007-2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import sys
-import posixpath
-import os
-
-from docutils import nodes
-from docutils.writers.html4css1 import Writer, HTMLTranslator as BaseTranslator
-
-from sphinx.locale import admonitionlabels, versionlabels
-from sphinx.highlighting import PygmentsBridge
-from sphinx.util.smartypants import sphinx_smarty_pants
-
-try:
-    import Image                        # check for the Python Imaging Library
-except ImportError:
-    Image = None
-
-class HTMLWriter(Writer):
-    def __init__(self, builder):
-        Writer.__init__(self)
-        self.builder = builder
-
-    def translate(self):
-        # sadly, this is mostly copied from parent class
-        self.visitor = visitor = self.builder.translator_class(self.builder,
-                                                               self.document)
-        self.document.walkabout(visitor)
-        self.output = visitor.astext()
-        for attr in ('head_prefix', 'stylesheet', 'head', 'body_prefix',
-                     'body_pre_docinfo', 'docinfo', 'body', 'fragment',
-                     'body_suffix', 'meta', 'title', 'subtitle', 'header',
-                     'footer', 'html_prolog', 'html_head', 'html_title',
-                     'html_subtitle', 'html_body', ):
-            setattr(self, attr, getattr(visitor, attr, None))
-        self.clean_meta = ''.join(visitor.meta[2:])
-
-
-class HTMLTranslator(BaseTranslator):
-    """
-    Our custom HTML translator.
-    """
-
-    def __init__(self, builder, *args, **kwds):
-        BaseTranslator.__init__(self, *args, **kwds)
-        self.highlighter = PygmentsBridge('html', builder.config.pygments_style)
-        self.no_smarty = 0
-        self.builder = builder
-        self.highlightlang = builder.config.highlight_language
-        self.highlightlinenothreshold = sys.maxint
-        self.protect_literal_text = 0
-
-    def visit_desc(self, node):
-        self.body.append(self.starttag(node, 'dl', CLASS=node['desctype']))
-    def depart_desc(self, node):
-        self.body.append('</dl>\n\n')
-
-    def visit_desc_signature(self, node):
-        # the id is set automatically
-        self.body.append(self.starttag(node, 'dt'))
-        # anchor for per-desc interactive data
-        if node.parent['desctype'] != 'describe' and node['ids'] and node['first']:
-            self.body.append('<!--[%s]-->' % node['ids'][0])
-        if node.parent['desctype'] in ('class', 'exception'):
-            self.body.append('%s ' % node.parent['desctype'])
-    def depart_desc_signature(self, node):
-        if node['ids'] and self.builder.add_definition_links:
-            self.body.append(u'<a class="headerlink" href="#%s" ' % node['ids'][0] +
-                             u'title="%s">\u00B6</a>' %
-                             _('Permalink to this definition'))
-        self.body.append('</dt>\n')
-
-    def visit_desc_addname(self, node):
-        self.body.append(self.starttag(node, 'tt', '', CLASS='descclassname'))
-    def depart_desc_addname(self, node):
-        self.body.append('</tt>')
-
-    def visit_desc_type(self, node):
-        pass
-    def depart_desc_type(self, node):
-        pass
-
-    def visit_desc_name(self, node):
-        self.body.append(self.starttag(node, 'tt', '', CLASS='descname'))
-    def depart_desc_name(self, node):
-        self.body.append('</tt>')
-
-    def visit_desc_parameterlist(self, node):
-        self.body.append('<big>(</big>')
-        self.first_param = 1
-    def depart_desc_parameterlist(self, node):
-        self.body.append('<big>)</big>')
-
-    def visit_desc_parameter(self, node):
-        if not self.first_param:
-            self.body.append(', ')
-        else:
-            self.first_param = 0
-        if not node.hasattr('noemph'):
-            self.body.append('<em>')
-    def depart_desc_parameter(self, node):
-        if not node.hasattr('noemph'):
-            self.body.append('</em>')
-
-    def visit_desc_optional(self, node):
-        self.body.append('<span class="optional">[</span>')
-    def depart_desc_optional(self, node):
-        self.body.append('<span class="optional">]</span>')
-
-    def visit_desc_annotation(self, node):
-        self.body.append(self.starttag(node, 'em', CLASS='property'))
-    def depart_desc_annotation(self, node):
-        self.body.append('</em>')
-
-    def visit_desc_content(self, node):
-        self.body.append(self.starttag(node, 'dd', ''))
-    def depart_desc_content(self, node):
-        self.body.append('</dd>')
-
-    def visit_refcount(self, node):
-        self.body.append(self.starttag(node, 'em', '', CLASS='refcount'))
-    def depart_refcount(self, node):
-        self.body.append('</em>')
-
-    def visit_versionmodified(self, node):
-        self.body.append(self.starttag(node, 'p'))
-        text = versionlabels[node['type']] % node['version']
-        if len(node):
-            text += ': '
-        else:
-            text += '.'
-        self.body.append('<span class="versionmodified">%s</span>' % text)
-    def depart_versionmodified(self, node):
-        self.body.append('</p>\n')
-
-    # overwritten
-    def visit_reference(self, node):
-        BaseTranslator.visit_reference(self, node)
-        if node.hasattr('reftitle'):
-            # ugly hack to add a title attribute
-            starttag = self.body[-1]
-            if not starttag.startswith('<a '):
-                return
-            self.body[-1] = '<a title="%s"' % self.attval(node['reftitle']) + \
-                            starttag[2:]
-
-    # overwritten -- we don't want source comments to show up in the HTML
-    def visit_comment(self, node):
-        raise nodes.SkipNode
-
-    # overwritten
-    def visit_admonition(self, node, name=''):
-        self.body.append(self.starttag(
-            node, 'div', CLASS=('admonition ' + name)))
-        if name and name != 'seealso':
-            node.insert(0, nodes.title(name, admonitionlabels[name]))
-        self.set_first_last(node)
-
-    def visit_seealso(self, node):
-        self.visit_admonition(node, 'seealso')
-    def depart_seealso(self, node):
-        self.depart_admonition(node)
-
-    # overwritten for docutils 0.4
-    if hasattr(BaseTranslator, 'start_tag_with_title'):
-        def visit_section(self, node):
-            # the 0.5 version, to get the id attribute in the <div> tag
-            self.section_level += 1
-            self.body.append(self.starttag(node, 'div', CLASS='section'))
-
-        def visit_title(self, node):
-            # don't move the id attribute inside the <h> tag
-            BaseTranslator.visit_title(self, node, move_ids=0)
-
-    # overwritten
-    def visit_literal_block(self, node):
-        if node.rawsource != node.astext():
-            # most probably a parsed-literal block -- don't highlight
-            return BaseTranslator.visit_literal_block(self, node)
-        lang = self.highlightlang
-        linenos = node.rawsource.count('\n') >= self.highlightlinenothreshold - 1
-        if node.has_key('language'):
-            # code-block directives
-            lang = node['language']
-        if node.has_key('linenos'):
-            linenos = node['linenos']
-        highlighted = self.highlighter.highlight_block(node.rawsource, lang, linenos)
-        starttag = self.starttag(node, 'div', suffix='', CLASS='highlight-%s' % lang)
-        self.body.append(starttag + highlighted + '</div>\n')
-        raise nodes.SkipNode
-
-    def visit_doctest_block(self, node):
-        self.visit_literal_block(node)
-
-    # overwritten
-    def visit_literal(self, node):
-        if len(node.children) == 1 and \
-               node.children[0] in ('None', 'True', 'False'):
-            node['classes'].append('xref')
-        self.body.append(self.starttag(node, 'tt', '', CLASS='docutils literal'))
-        self.protect_literal_text += 1
-    def depart_literal(self, node):
-        self.protect_literal_text -= 1
-        self.body.append('</tt>')
-
-    def visit_productionlist(self, node):
-        self.body.append(self.starttag(node, 'pre'))
-        names = []
-        for production in node:
-            names.append(production['tokenname'])
-        maxlen = max(len(name) for name in names)
-        for production in node:
-            if production['tokenname']:
-                lastname = production['tokenname'].ljust(maxlen)
-                self.body.append(self.starttag(production, 'strong', ''))
-                self.body.append(lastname + '</strong> ::= ')
-            else:
-                self.body.append('%s     ' % (' '*len(lastname)))
-            production.walkabout(self)
-            self.body.append('\n')
-        self.body.append('</pre>\n')
-        raise nodes.SkipNode
-    def depart_productionlist(self, node):
-        pass
-
-    def visit_production(self, node):
-        pass
-    def depart_production(self, node):
-        pass
-
-    def visit_centered(self, node):
-        self.body.append(self.starttag(node, 'p', CLASS="centered") + '<strong>')
-    def depart_centered(self, node):
-        self.body.append('</strong></p>')
-
-    def visit_compact_paragraph(self, node):
-        pass
-    def depart_compact_paragraph(self, node):
-        pass
-
-    def visit_highlightlang(self, node):
-        self.highlightlang = node['lang']
-        self.highlightlinenothreshold = node['linenothreshold']
-    def depart_highlightlang(self, node):
-        pass
-
-    # overwritten
-    def visit_image(self, node):
-        olduri = node['uri']
-        # rewrite the URI if the environment knows about it
-        if olduri in self.builder.images:
-            node['uri'] = posixpath.join(self.builder.imgpath,
-                                         self.builder.images[olduri])
-
-        if node.has_key('scale'):
-            if Image and not (node.has_key('width')
-                              and node.has_key('height')):
-                try:
-                    im = Image.open(os.path.join(self.builder.srcdir,
-                                                    olduri))
-                except (IOError, # Source image can't be found or opened
-                        UnicodeError):  # PIL doesn't like Unicode paths.
-                    print olduri
-                    pass
-                else:
-                    if not node.has_key('width'):
-                        node['width'] = str(im.size[0])
-                    if not node.has_key('height'):
-                        node['height'] = str(im.size[1])
-                    del im
-        BaseTranslator.visit_image(self, node)
-
-    def visit_toctree(self, node):
-        # this only happens when formatting a toc from env.tocs -- in this
-        # case we don't want to include the subtree
-        raise nodes.SkipNode
-
-    def visit_index(self, node):
-        raise nodes.SkipNode
-
-    def visit_tabular_col_spec(self, node):
-        raise nodes.SkipNode
-
-    def visit_glossary(self, node):
-        pass
-    def depart_glossary(self, node):
-        pass
-
-    def visit_acks(self, node):
-        pass
-    def depart_acks(self, node):
-        pass
-
-    def visit_module(self, node):
-        pass
-    def depart_module(self, node):
-        pass
-
-    def bulk_text_processor(self, text):
-        return text
-
-    # overwritten
-    def visit_Text(self, node):
-        text = node.astext()
-        encoded = self.encode(text)
-        if self.protect_literal_text:
-            # moved here from base class's visit_literal to support
-            # more formatting in literal nodes
-            for token in self.words_and_spaces.findall(encoded):
-                if token.strip():
-                    # protect literal text from line wrapping
-                    self.body.append('<span class="pre">%s</span>' % token)
-                elif token in ' \n':
-                    # allow breaks at whitespace
-                    self.body.append(token)
-                else:
-                    # protect runs of multiple spaces; the last one can wrap
-                    self.body.append('&nbsp;' * (len(token)-1) + ' ')
-        else:
-            if self.in_mailto and self.settings.cloak_email_addresses:
-                encoded = self.cloak_email(encoded)
-            else:
-                encoded = self.bulk_text_processor(encoded)
-            self.body.append(encoded)
-
-    # these are all for docutils 0.5 compatibility
-
-    def visit_note(self, node):
-        self.visit_admonition(node, 'note')
-    def depart_note(self, node):
-        self.depart_admonition(node)
-
-    def visit_warning(self, node):
-        self.visit_admonition(node, 'warning')
-    def depart_warning(self, node):
-        self.depart_admonition(node)
-
-    def visit_attention(self, node):
-        self.visit_admonition(node, 'attention')
-
-    def depart_attention(self, node):
-        self.depart_admonition()
-
-    def visit_caution(self, node):
-        self.visit_admonition(node, 'caution')
-    def depart_caution(self, node):
-        self.depart_admonition()
-
-    def visit_danger(self, node):
-        self.visit_admonition(node, 'danger')
-    def depart_danger(self, node):
-        self.depart_admonition()
-
-    def visit_error(self, node):
-        self.visit_admonition(node, 'error')
-    def depart_error(self, node):
-        self.depart_admonition()
-
-    def visit_hint(self, node):
-        self.visit_admonition(node, 'hint')
-    def depart_hint(self, node):
-        self.depart_admonition()
-
-    def visit_important(self, node):
-        self.visit_admonition(node, 'important')
-    def depart_important(self, node):
-        self.depart_admonition()
-
-    def visit_tip(self, node):
-        self.visit_admonition(node, 'tip')
-    def depart_tip(self, node):
-        self.depart_admonition()
-
-    # these are only handled specially in the SmartyPantsHTMLTranslator
-    def visit_literal_emphasis(self, node):
-        return self.visit_emphasis(node)
-    def depart_literal_emphasis(self, node):
-        return self.depart_emphasis(node)
-
-    def depart_title(self, node):
-        close_tag = self.context[-1]
-        if self.builder.add_header_links and \
-               (close_tag.startswith('</h') or
-                close_tag.startswith('</a></h')) and \
-               node.parent.hasattr('ids') and node.parent['ids']:
-            aname = node.parent['ids'][0]
-            # add permalink anchor
-            self.body.append(u'<a class="headerlink" href="#%s" ' % aname +
-                             u'title="%s">\u00B6</a>' %
-                             _('Permalink to this headline'))
-        BaseTranslator.depart_title(self, node)
-
-    def unknown_visit(self, node):
-        raise NotImplementedError('Unknown node: ' + node.__class__.__name__)
-
-
-class SmartyPantsHTMLTranslator(HTMLTranslator):
-    """
-    Handle ordinary text via smartypants, converting quotes and dashes
-    to the correct entities.
-    """
-
-    def __init__(self, *args, **kwds):
-        self.no_smarty = 0
-        HTMLTranslator.__init__(self, *args, **kwds)
-
-    def visit_literal(self, node):
-        self.no_smarty += 1
-        try:
-            # this raises SkipNode
-            HTMLTranslator.visit_literal(self, node)
-        finally:
-            self.no_smarty -= 1
-
-    def visit_literal_emphasis(self, node):
-        self.no_smarty += 1
-        self.visit_emphasis(node)
-
-    def depart_literal_emphasis(self, node):
-        self.depart_emphasis(node)
-        self.no_smarty -= 1
-
-    def visit_desc_signature(self, node):
-        self.no_smarty += 1
-        HTMLTranslator.visit_desc_signature(self, node)
-
-    def depart_desc_signature(self, node):
-        self.no_smarty -= 1
-        HTMLTranslator.depart_desc_signature(self, node)
-
-    def visit_productionlist(self, node):
-        self.no_smarty += 1
-        try:
-            HTMLTranslator.visit_productionlist(self, node)
-        finally:
-            self.no_smarty -= 1
-
-    def visit_option(self, node):
-        self.no_smarty += 1
-        HTMLTranslator.visit_option(self, node)
-    def depart_option(self, node):
-        self.no_smarty -= 1
-        HTMLTranslator.depart_option(self, node)
-
-    def bulk_text_processor(self, text):
-        if self.no_smarty <= 0:
-            return sphinx_smarty_pants(text)
-        return text
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/latexwriter.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1192 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.latexwriter
-    ~~~~~~~~~~~~~~~~~~
-
-    Custom docutils writer for LaTeX.
-
-    Much of this code is adapted from Dave Kuhlman's "docpy" writer from his
-    docutils sandbox.
-
-    :copyright: 2007-2008 by Georg Brandl, Dave Kuhlman.
-    :license: BSD.
-"""
-
-import re
-import sys
-from os import path
-
-from docutils import nodes, writers
-from docutils.writers.latex2e import Babel
-
-from sphinx import addnodes
-from sphinx import highlighting
-from sphinx.locale import admonitionlabels, versionlabels
-from sphinx.util import ustrftime
-from sphinx.util.texescape import tex_escape_map
-from sphinx.util.smartypants import educateQuotesLatex
-
-HEADER = r'''%% Generated by Sphinx.
-\documentclass[%(papersize)s,%(pointsize)s%(classoptions)s]{%(docclass)s}
-%(inputenc)s
-%(fontenc)s
-%(babel)s
-%(fontpkg)s
-%(fncychap)s
-\usepackage{sphinx}
-%(preamble)s
-
-\title{%(title)s}
-\date{%(date)s}
-\release{%(release)s}
-\author{%(author)s}
-\newcommand{\sphinxlogo}{%(logo)s}
-\renewcommand{\releasename}{%(releasename)s}
-%(makeindex)s
-%(makemodindex)s
-'''
-
-BEGIN_DOC = r'''
-\begin{document}
-%(shorthandoff)s
-%(maketitle)s
-%(tableofcontents)s
-'''
-
-FOOTER = r'''
-%(footer)s
-\renewcommand{\indexname}{%(modindexname)s}
-%(printmodindex)s
-\renewcommand{\indexname}{%(indexname)s}
-%(printindex)s
-\end{document}
-'''
-
-
-class LaTeXWriter(writers.Writer):
-
-    supported = ('sphinxlatex',)
-
-    settings_spec = ('LaTeX writer options', '', (
-        ('Document name', ['--docname'], {'default': ''}),
-        ('Document class', ['--docclass'], {'default': 'manual'}),
-        ('Author', ['--author'], {'default': ''}),
-        ))
-    settings_defaults = {}
-
-    output = None
-
-    def __init__(self, builder):
-        writers.Writer.__init__(self)
-        self.builder = builder
-
-    def translate(self):
-        visitor = LaTeXTranslator(self.document, self.builder)
-        self.document.walkabout(visitor)
-        self.output = visitor.astext()
-
-
-# Helper classes
-
-class ExtBabel(Babel):
-    def get_shorthandoff(self):
-        shortlang = self.language.split('_')[0]
-        if shortlang in ('de', 'sl', 'pt', 'es', 'nl', 'pl'):
-            return '\\shorthandoff{"}'
-        return ''
-
-    _ISO639_TO_BABEL = Babel._ISO639_TO_BABEL.copy()
-    _ISO639_TO_BABEL['sl'] = 'slovene'
-
-
-class Table(object):
-    def __init__(self):
-        self.col = 0
-        self.colcount = 0
-        self.colspec = None
-        self.had_head = False
-        self.has_verbatim = False
-        self.caption = None
-
-
-class Desc(object):
-    def __init__(self, node):
-        self.env = LaTeXTranslator.desc_map.get(node['desctype'], 'describe')
-        self.type = self.cls = self.name = self.params = self.annotation = ''
-        self.count = 0
-
-
-class LaTeXTranslator(nodes.NodeVisitor):
-    sectionnames = ["part", "chapter", "section", "subsection",
-                    "subsubsection", "paragraph", "subparagraph"]
-
-    ignore_missing_images = False
-
-    default_elements = {
-        'docclass':        'manual',
-        'papersize':       'letterpaper',
-        'pointsize':       '10pt',
-        'classoptions':    '',
-        'inputenc':        '\\usepackage[utf8]{inputenc}',
-        'fontenc':         '\\usepackage[T1]{fontenc}',
-        'babel':           '\\usepackage{babel}',
-        'fontpkg':         '\\usepackage{times}',
-        'fncychap':        '\\usepackage[Bjarne]{fncychap}',
-        'preamble':        '',
-        'title':           '',
-        'date':            '',
-        'release':         '',
-        'author':          '',
-        'logo':            '',
-        'releasename':     'Release',
-        'makeindex':       '\\makeindex',
-        'makemodindex':    '\\makemodindex',
-        'shorthandoff':    '',
-        'maketitle':       '\\maketitle',
-        'tableofcontents': '\\tableofcontents',
-        'footer':          '',
-        'printmodindex':   '\\printmodindex',
-        'printindex':      '\\printindex',
-    }
-
-    def __init__(self, document, builder):
-        nodes.NodeVisitor.__init__(self, document)
-        self.builder = builder
-        self.body = []
-
-        # sort out some elements
-        papersize = builder.config.latex_paper_size + 'paper'
-        if papersize == 'paper': # e.g. command line "-D latex_paper_size="
-            papersize = 'letterpaper'
-
-        self.elements = self.default_elements.copy()
-        self.elements.update({
-            'docclass':     document.settings.docclass,
-            'papersize':    papersize,
-            'pointsize':    builder.config.latex_font_size,
-            # if empty, the title is set to the first section title
-            'title':        document.settings.title,
-            'date':         ustrftime(builder.config.today_fmt or _('%B %d, %Y')),
-            'release':      builder.config.release,
-            'author':       document.settings.author,
-            'releasename':  _('Release'),
-            'preamble':     builder.config.latex_preamble,
-            'modindexname': _('Module Index'),
-            'indexname':    _('Index'),
-        })
-        if builder.config.latex_logo:
-            self.elements['logo'] = '\\includegraphics{%s}\\par' % \
-                                    path.basename(builder.config.latex_logo)
-        if builder.config.language:
-            babel = ExtBabel(builder.config.language)
-            lang = babel.get_language()
-            if lang:
-                self.elements['classoptions'] += ',' + babel.get_language()
-            else:
-                self.builder.warn('no Babel option known for language %r' %
-                                  builder.config.language)
-            self.elements['shorthandoff'] = babel.get_shorthandoff()
-            self.elements['fncychap'] = '\\usepackage[Sonny]{fncychap}'
-        else:
-            self.elements['classoptions'] += ',english'
-        if not builder.config.latex_use_modindex:
-            self.elements['makemodindex'] = ''
-            self.elements['printmodindex'] = ''
-        # allow the user to override them all
-        self.elements.update(builder.config.latex_elements)
-
-        self.highlighter = highlighting.PygmentsBridge(
-            'latex', builder.config.pygments_style)
-        self.context = []
-        self.descstack = []
-        self.bibitems = []
-        self.table = None
-        self.next_table_colspec = None
-        self.highlightlang = builder.config.highlight_language
-        self.highlightlinenothreshold = sys.maxint
-        self.written_ids = set()
-        self.footnotestack = []
-        if self.elements['docclass'] == 'manual':
-            if builder.config.latex_use_parts:
-                self.top_sectionlevel = 0
-            else:
-                self.top_sectionlevel = 1
-        else:
-            self.top_sectionlevel = 2
-        self.next_section_target = None
-        # flags
-        self.verbatim = None
-        self.in_title = 0
-        self.in_production_list = 0
-        self.first_document = 1
-        self.this_is_the_title = 1
-        self.literal_whitespace = 0
-        self.no_contractions = 0
-
-    def astext(self):
-        return (HEADER % self.elements + self.highlighter.get_stylesheet() +
-                u''.join(self.body) + FOOTER % self.elements)
-
-    def visit_document(self, node):
-        self.footnotestack.append(self.collect_footnotes(node))
-        if self.first_document == 1:
-            # the first document is all the regular content ...
-            self.body.append(BEGIN_DOC % self.elements)
-            self.first_document = 0
-        elif self.first_document == 0:
-            # ... and all others are the appendices
-            self.body.append('\n\\appendix\n')
-            self.first_document = -1
-        # "- 1" because the level is increased before the title is visited
-        self.sectionlevel = self.top_sectionlevel - 1
-    def depart_document(self, node):
-        if self.bibitems:
-            widest_label = ""
-            for bi in self.bibitems:
-                if len(widest_label) < len(bi[0]):
-                    widest_label = bi[0]
-            self.body.append('\n\\begin{thebibliography}{%s}\n' % widest_label)
-            for bi in self.bibitems:
-                # cite_key: underscores must not be escaped
-                cite_key = bi[0].replace(r"\_", "_")
-                self.body.append('\\bibitem[%s]{%s}{%s}\n' % (bi[0], cite_key, bi[1]))
-            self.body.append('\\end{thebibliography}\n')
-            self.bibitems = []
-
-    def visit_start_of_file(self, node):
-        # This marks the begin of a new file; therefore the current module and
-        # class must be reset
-        self.body.append('\n\\resetcurrentobjects\n')
-        # and also, new footnotes
-        self.footnotestack.append(self.collect_footnotes(node))
-
-    def collect_footnotes(self, node):
-        fnotes = {}
-        def footnotes_under(n):
-            if isinstance(n, nodes.footnote):
-                yield n
-            else:
-                for c in n.children:
-                    if isinstance(c, addnodes.start_of_file):
-                        continue
-                    for k in footnotes_under(c):
-                        yield k
-        for fn in footnotes_under(node):
-            num = fn.children[0].astext().strip()
-            fnotes[num] = fn
-            fn.parent.remove(fn)
-        return fnotes
-
-    def depart_start_of_file(self, node):
-        self.footnotestack.pop()
-
-    def visit_highlightlang(self, node):
-        self.highlightlang = node['lang']
-        self.highlightlinenothreshold = node['linenothreshold']
-        raise nodes.SkipNode
-
-    def visit_section(self, node):
-        if not self.this_is_the_title:
-            self.sectionlevel += 1
-        self.body.append('\n\n')
-        if self.next_section_target:
-            self.body.append(r'\hypertarget{%s}{}' % self.next_section_target)
-            self.next_section_target = None
-        #if node.get('ids'):
-        #    for id in node['ids']:
-        #        if id not in self.written_ids:
-        #            self.body.append(r'\hypertarget{%s}{}' % id)
-        #            self.written_ids.add(id)
-    def depart_section(self, node):
-        self.sectionlevel = max(self.sectionlevel - 1, self.top_sectionlevel - 1)
-
-    def visit_problematic(self, node):
-        self.body.append(r'{\color{red}\bfseries{}')
-    def depart_problematic(self, node):
-        self.body.append('}')
-
-    def visit_topic(self, node):
-        self.body.append('\\setbox0\\vbox{\n'
-                         '\\begin{minipage}{0.95\\textwidth}\n')
-    def depart_topic(self, node):
-        self.body.append('\\end{minipage}}\n'
-                         '\\begin{center}\\setlength{\\fboxsep}{5pt}'
-                         '\\shadowbox{\\box0}\\end{center}\n')
-    visit_sidebar = visit_topic
-    depart_sidebar = depart_topic
-
-    def visit_glossary(self, node):
-        pass
-    def depart_glossary(self, node):
-        pass
-
-    def visit_productionlist(self, node):
-        self.body.append('\n\n\\begin{productionlist}\n')
-        self.in_production_list = 1
-    def depart_productionlist(self, node):
-        self.body.append('\\end{productionlist}\n\n')
-        self.in_production_list = 0
-
-    def visit_production(self, node):
-        if node['tokenname']:
-            self.body.append('\\production{%s}{' % self.encode(node['tokenname']))
-        else:
-            self.body.append('\\productioncont{')
-    def depart_production(self, node):
-        self.body.append('}\n')
-
-    def visit_transition(self, node):
-        self.body.append('\n\n\\bigskip\\hrule{}\\bigskip\n\n')
-    def depart_transition(self, node):
-        pass
-
-    def visit_title(self, node):
-        parent = node.parent
-        if isinstance(parent, addnodes.seealso):
-            # the environment already handles this
-            raise nodes.SkipNode
-        elif self.this_is_the_title:
-            if len(node.children) != 1 and not isinstance(node.children[0], nodes.Text):
-                self.builder.warn('document title is not a single Text node')
-            if not self.elements['title']:
-                # text needs to be escaped since it is inserted into
-                # the output literally
-                self.elements['title'] = node.astext().translate(tex_escape_map)
-            self.this_is_the_title = 0
-            raise nodes.SkipNode
-        elif isinstance(parent, nodes.section):
-            try:
-                self.body.append(r'\%s{' % self.sectionnames[self.sectionlevel])
-            except IndexError:
-                from sphinx.application import SphinxError
-                raise SphinxError('too many nesting section levels for LaTeX, '
-                                  'at heading: %s' % node.astext())
-            self.context.append('}\n')
-        elif isinstance(parent, (nodes.topic, nodes.sidebar)):
-            self.body.append(r'\textbf{')
-            self.context.append('}\n\n\medskip\n\n')
-        elif isinstance(parent, nodes.Admonition):
-            self.body.append('{')
-            self.context.append('}\n')
-        elif isinstance(parent, nodes.table):
-            self.table.caption = self.encode(node.astext())
-            raise nodes.SkipNode
-        else:
-            self.builder.warn('encountered title node not in section, topic, '
-                              'table, admonition or sidebar')
-            self.body.append('\\textbf{')
-            self.context.append('}\n')
-        self.in_title = 1
-    def depart_title(self, node):
-        self.in_title = 0
-        self.body.append(self.context.pop())
-
-    def visit_subtitle(self, node):
-        if isinstance(node.parent, nodes.sidebar):
-            self.body.append('~\\\\\n\\textbf{')
-            self.context.append('}\n\\smallskip\n')
-        else:
-            self.context.append('')
-    def depart_subtitle(self, node):
-        self.body.append(self.context.pop())
-
-    desc_map = {
-        'function' : 'funcdesc',
-        'class': 'classdesc',
-        'method': 'methoddesc',
-        'staticmethod': 'staticmethoddesc',
-        'exception': 'excdesc',
-        'data': 'datadesc',
-        'attribute': 'memberdesc',
-        'opcode': 'opcodedesc',
-
-        'cfunction': 'cfuncdesc',
-        'cmember': 'cmemberdesc',
-        'cmacro': 'csimplemacrodesc',
-        'ctype': 'ctypedesc',
-        'cvar': 'cvardesc',
-
-        'describe': 'describe',
-        # and all others are 'describe' too
-    }
-
-    def visit_desc(self, node):
-        self.descstack.append(Desc(node))
-    def depart_desc(self, node):
-        d = self.descstack.pop()
-        self.body.append("\\end{%s}\n" % d.env)
-
-    def visit_desc_signature(self, node):
-        d = self.descstack[-1]
-        # reset these for every signature
-        d.type = d.cls = d.name = d.params = ''
-    def depart_desc_signature(self, node):
-        d = self.descstack[-1]
-        d.cls = d.cls.rstrip('.')
-        if node.parent['desctype'] != 'describe' and node['ids']:
-            hyper = '\\hypertarget{%s}{}' % node['ids'][0]
-        else:
-            hyper = ''
-        if d.count == 0:
-            t1 = "\n\n%s\\begin{%s}" % (hyper, d.env)
-        else:
-            t1 = "\n%s\\%sline" % (hyper, d.env[:-4])
-        d.count += 1
-        if d.env in ('funcdesc', 'classdesc', 'excclassdesc'):
-            t2 = "{%s}{%s}" % (d.name, d.params)
-        elif d.env in ('datadesc', 'excdesc', 'csimplemacrodesc'):
-            t2 = "{%s}" % (d.name)
-        elif d.env in ('methoddesc', 'staticmethoddesc'):
-            if d.cls:
-                t2 = "[%s]{%s}{%s}" % (d.cls, d.name, d.params)
-            else:
-                t2 = "{%s}{%s}" % (d.name, d.params)
-        elif d.env == 'memberdesc':
-            if d.cls:
-                t2 = "[%s]{%s}" % (d.cls, d.name)
-            else:
-                t2 = "{%s}" % d.name
-        elif d.env == 'cfuncdesc':
-            if d.cls:
-                # C++ class names
-                d.name = '%s::%s' % (d.cls, d.name)
-            t2 = "{%s}{%s}{%s}" % (d.type, d.name, d.params)
-        elif d.env == 'cmemberdesc':
-            try:
-                type, container = d.type.rsplit(' ', 1)
-                container = container.rstrip('.')
-            except ValueError:
-                container = ''
-                type = d.type
-            t2 = "{%s}{%s}{%s}" % (container, type, d.name)
-        elif d.env == 'cvardesc':
-            t2 = "{%s}{%s}" % (d.type, d.name)
-        elif d.env == 'ctypedesc':
-            t2 = "{%s}" % (d.name)
-        elif d.env == 'opcodedesc':
-            t2 = "{%s}{%s}" % (d.name, d.params)
-        elif d.env == 'describe':
-            t2 = "{%s}" % d.name
-        self.body.append(t1 + t2)
-
-    def visit_desc_type(self, node):
-        d = self.descstack[-1]
-        if d.env == 'describe':
-            d.name += self.encode(node.astext())
-        else:
-            self.descstack[-1].type = self.encode(node.astext().strip())
-        raise nodes.SkipNode
-
-    def visit_desc_name(self, node):
-        d = self.descstack[-1]
-        if d.env == 'describe':
-            d.name += self.encode(node.astext())
-        else:
-            self.descstack[-1].name = self.encode(node.astext().strip())
-        raise nodes.SkipNode
-
-    def visit_desc_addname(self, node):
-        d = self.descstack[-1]
-        if d.env == 'describe':
-            d.name += self.encode(node.astext())
-        else:
-            self.descstack[-1].cls = self.encode(node.astext().strip())
-        raise nodes.SkipNode
-
-    def visit_desc_parameterlist(self, node):
-        d = self.descstack[-1]
-        if d.env == 'describe':
-            d.name += self.encode(node.astext())
-        else:
-            self.descstack[-1].params = self.encode(node.astext().strip())
-        raise nodes.SkipNode
-
-    def visit_desc_annotation(self, node):
-        d = self.descstack[-1]
-        if d.env == 'describe':
-            d.name += self.encode(node.astext())
-        else:
-            self.descstack[-1].annotation = self.encode(node.astext().strip())
-        raise nodes.SkipNode
-
-    def visit_refcount(self, node):
-        self.body.append("\\emph{")
-    def depart_refcount(self, node):
-        self.body.append("}\\\\")
-
-    def visit_desc_content(self, node):
-        if node.children and not isinstance(node.children[0], nodes.paragraph):
-            # avoid empty desc environment which causes a formatting bug
-            self.body.append('~')
-    def depart_desc_content(self, node):
-        pass
-
-    def visit_seealso(self, node):
-        self.body.append("\n\n\\strong{%s:}\n\n" % admonitionlabels['seealso'])
-    def depart_seealso(self, node):
-        self.body.append("\n\n")
-
-    def visit_rubric(self, node):
-        if len(node.children) == 1 and node.children[0].astext() == 'Footnotes':
-            raise nodes.SkipNode
-        self.body.append('\\paragraph{')
-        self.context.append('}\n')
-    def depart_rubric(self, node):
-        self.body.append(self.context.pop())
-
-    def visit_footnote(self, node):
-        pass
-    def depart_footnote(self, node):
-        pass
-
-    def visit_label(self, node):
-        if isinstance(node.parent, nodes.citation):
-            self.bibitems[-1][0] = node.astext()
-        raise nodes.SkipNode
-
-    def visit_tabular_col_spec(self, node):
-        self.next_table_colspec = node['spec']
-        raise nodes.SkipNode
-
-    def visit_table(self, node):
-        if self.table:
-            raise NotImplementedError('Nested tables are not supported.')
-        self.table = Table()
-        self.tablebody = []
-        # Redirect body output until table is finished.
-        self._body = self.body
-        self.body = self.tablebody
-    def depart_table(self, node):
-        self.body = self._body
-        if self.table.caption is not None:
-            self.body.append('\n\\begin{threeparttable}\n'
-                             '\\caption{%s}\n' % self.table.caption)
-        if self.table.has_verbatim:
-            self.body.append('\n\\begin{tabular}')
-        else:
-            self.body.append('\n\\begin{tabulary}{\\textwidth}')
-        if self.table.colspec:
-            self.body.append(self.table.colspec)
-        else:
-            if self.table.has_verbatim:
-                colwidth = 0.95 / self.table.colcount
-                colspec = ('p{%.3f\\textwidth}|' % colwidth) * self.table.colcount
-                self.body.append('{|' + colspec + '}\n')
-            else:
-                self.body.append('{|' + ('L|' * self.table.colcount) + '}\n')
-        self.body.extend(self.tablebody)
-        if self.table.has_verbatim:
-            self.body.append('\\end{tabular}\n\n')
-        else:
-            self.body.append('\\end{tabulary}\n\n')
-        if self.table.caption is not None:
-            self.body.append('\\end{threeparttable}\n\n')
-        self.table = None
-        self.tablebody = None
-
-    def visit_colspec(self, node):
-        self.table.colcount += 1
-    def depart_colspec(self, node):
-        pass
-
-    def visit_tgroup(self, node):
-        pass
-    def depart_tgroup(self, node):
-        pass
-
-    def visit_thead(self, node):
-        if self.next_table_colspec:
-            self.table.colspec = '{%s}\n' % self.next_table_colspec
-        self.next_table_colspec = None
-        self.body.append('\\hline\n')
-        self.table.had_head = True
-    def depart_thead(self, node):
-        self.body.append('\\hline\n')
-
-    def visit_tbody(self, node):
-        if not self.table.had_head:
-            self.visit_thead(node)
-    def depart_tbody(self, node):
-        self.body.append('\\hline\n')
-
-    def visit_row(self, node):
-        self.table.col = 0
-    def depart_row(self, node):
-        self.body.append('\\\\\n')
-
-    def visit_entry(self, node):
-        if node.has_key('morerows') or node.has_key('morecols'):
-            raise NotImplementedError('Column or row spanning cells are '
-                                      'not implemented.')
-        if self.table.col > 0:
-            self.body.append(' & ')
-        self.table.col += 1
-        if isinstance(node.parent.parent, nodes.thead):
-            self.body.append('\\textbf{')
-            self.context.append('}')
-        else:
-            self.context.append('')
-    def depart_entry(self, node):
-        self.body.append(self.context.pop()) # header
-
-    def visit_acks(self, node):
-        # this is a list in the source, but should be rendered as a
-        # comma-separated list here
-        self.body.append('\n\n')
-        self.body.append(', '.join(n.astext() for n in node.children[0].children) + '.')
-        self.body.append('\n\n')
-        raise nodes.SkipNode
-
-    def visit_bullet_list(self, node):
-        self.body.append('\\begin{itemize}\n' )
-    def depart_bullet_list(self, node):
-        self.body.append('\\end{itemize}\n' )
-
-    def visit_enumerated_list(self, node):
-        self.body.append('\\begin{enumerate}\n' )
-    def depart_enumerated_list(self, node):
-        self.body.append('\\end{enumerate}\n' )
-
-    def visit_list_item(self, node):
-        # Append "{}" in case the next character is "[", which would break
-        # LaTeX's list environment (no numbering and the "[" is not printed).
-        self.body.append(r'\item {} ')
-    def depart_list_item(self, node):
-        self.body.append('\n')
-
-    def visit_definition_list(self, node):
-        self.body.append('\\begin{description}\n')
-    def depart_definition_list(self, node):
-        self.body.append('\\end{description}\n')
-
-    def visit_definition_list_item(self, node):
-        pass
-    def depart_definition_list_item(self, node):
-        pass
-
-    def visit_term(self, node):
-        ctx = ']'
-        if node.has_key('ids') and node['ids']:
-            ctx += '\\hypertarget{%s}{}' % node['ids'][0]
-        self.body.append('\\item[')
-        self.context.append(ctx)
-    def depart_term(self, node):
-        self.body.append(self.context.pop())
-
-    def visit_classifier(self, node):
-        self.body.append('{[}')
-    def depart_classifier(self, node):
-        self.body.append('{]}')
-
-    def visit_definition(self, node):
-        pass
-    def depart_definition(self, node):
-        self.body.append('\n')
-
-    def visit_field_list(self, node):
-        self.body.append('\\begin{quote}\\begin{description}\n')
-    def depart_field_list(self, node):
-        self.body.append('\\end{description}\\end{quote}\n')
-
-    def visit_field(self, node):
-        pass
-    def depart_field(self, node):
-        pass
-
-    visit_field_name = visit_term
-    depart_field_name = depart_term
-
-    visit_field_body = visit_definition
-    depart_field_body = depart_definition
-
-    def visit_paragraph(self, node):
-        self.body.append('\n')
-    def depart_paragraph(self, node):
-        self.body.append('\n')
-
-    def visit_centered(self, node):
-        self.body.append('\n\\begin{centering}')
-    def depart_centered(self, node):
-        self.body.append('\n\\end{centering}')
-
-    def visit_module(self, node):
-        modname = node['modname']
-        self.body.append('\n\\declaremodule[%s]{}{%s}' % (modname.replace('_', ''),
-                                                          self.encode(modname)))
-        self.body.append('\n\\modulesynopsis{%s}' % self.encode(node['synopsis']))
-        if node.has_key('platform'):
-            self.body.append('\\platform{%s}' % self.encode(node['platform']))
-    def depart_module(self, node):
-        pass
-
-    def latex_image_length(self, width_str):
-        match = re.match('(\d*\.?\d*)\s*(\S*)', width_str)
-        if not match:
-            # fallback
-            return width_str
-        res = width_str
-        amount, unit = match.groups()[:2]
-        if not unit or unit == "px":
-            # pixels: let LaTeX alone
-            return None
-        elif unit == "%":
-            res = "%.3f\\linewidth" % (float(amount) / 100.0)
-        return res
-
-    def visit_image(self, node):
-        attrs = node.attributes
-        pre = []                        # in reverse order
-        post = []
-        include_graphics_options = []
-        inline = isinstance(node.parent, nodes.TextElement)
-        if attrs.has_key('scale'):
-            # Could also be done with ``scale`` option to
-            # ``\includegraphics``; doing it this way for consistency.
-            pre.append('\\scalebox{%f}{' % (attrs['scale'] / 100.0,))
-            post.append('}')
-        if attrs.has_key('width'):
-            w = self.latex_image_length(attrs['width'])
-            if w:
-                include_graphics_options.append('width=%s' % w)
-        if attrs.has_key('height'):
-            h = self.latex_image_length(attrs['height'])
-            if h:
-                include_graphics_options.append('height=%s' % h)
-        if attrs.has_key('align'):
-            align_prepost = {
-                # By default latex aligns the top of an image.
-                (1, 'top'): ('', ''),
-                (1, 'middle'): ('\\raisebox{-0.5\\height}{', '}'),
-                (1, 'bottom'): ('\\raisebox{-\\height}{', '}'),
-                (0, 'center'): ('{\\hfill', '\\hfill}'),
-                # These 2 don't exactly do the right thing.  The image should
-                # be floated alongside the paragraph.  See
-                # http://www.w3.org/TR/html4/struct/objects.html#adef-align-IMG
-                (0, 'left'): ('{', '\\hfill}'),
-                (0, 'right'): ('{\\hfill', '}'),}
-            try:
-                pre.append(align_prepost[inline, attrs['align']][0])
-                post.append(align_prepost[inline, attrs['align']][1])
-            except KeyError:
-                pass                    # XXX complain here?
-        if not inline:
-            pre.append('\n')
-            post.append('\n')
-        pre.reverse()
-        if node['uri'] in self.builder.images:
-            uri = self.builder.images[node['uri']]
-        else:
-            # missing image!
-            if self.ignore_missing_images:
-                return
-            uri = node['uri']
-        if uri.find('://') != -1:
-            # ignore remote images
-            return
-        self.body.extend(pre)
-        options = ''
-        if include_graphics_options:
-            options = '[%s]' % ','.join(include_graphics_options)
-        self.body.append('\\includegraphics%s{%s}' % (options, uri))
-        self.body.extend(post)
-    def depart_image(self, node):
-        pass
-
-    def visit_figure(self, node):
-        if (not node.attributes.has_key('align') or
-            node.attributes['align'] == 'center'):
-            # centering does not add vertical space like center.
-            align = '\n\\centering'
-            align_end = ''
-        else:
-            # TODO non vertical space for other alignments.
-            align = '\\begin{flush%s}' % node.attributes['align']
-            align_end = '\\end{flush%s}' % node.attributes['align']
-        self.body.append('\\begin{figure}[htbp]%s\n' % align)
-        self.context.append('%s\\end{figure}\n' % align_end)
-    def depart_figure(self, node):
-        self.body.append(self.context.pop())
-
-    def visit_caption(self, node):
-        self.body.append('\\caption{')
-    def depart_caption(self, node):
-        self.body.append('}')
-
-    def visit_legend(self, node):
-        self.body.append('{\\small ')
-    def depart_legend(self, node):
-        self.body.append('}')
-
-    def visit_admonition(self, node):
-        self.body.append('\n\\begin{notice}{note}')
-    def depart_admonition(self, node):
-        self.body.append('\\end{notice}\n')
-
-    def _make_visit_admonition(name):
-        def visit_admonition(self, node):
-            self.body.append('\n\\begin{notice}{%s}{%s:}' %
-                             (name, admonitionlabels[name]))
-        return visit_admonition
-    def _depart_named_admonition(self, node):
-        self.body.append('\\end{notice}\n')
-
-    visit_attention = _make_visit_admonition('attention')
-    depart_attention = _depart_named_admonition
-    visit_caution = _make_visit_admonition('caution')
-    depart_caution = _depart_named_admonition
-    visit_danger = _make_visit_admonition('danger')
-    depart_danger = _depart_named_admonition
-    visit_error = _make_visit_admonition('error')
-    depart_error = _depart_named_admonition
-    visit_hint = _make_visit_admonition('hint')
-    depart_hint = _depart_named_admonition
-    visit_important = _make_visit_admonition('important')
-    depart_important = _depart_named_admonition
-    visit_note = _make_visit_admonition('note')
-    depart_note = _depart_named_admonition
-    visit_tip = _make_visit_admonition('tip')
-    depart_tip = _depart_named_admonition
-    visit_warning = _make_visit_admonition('warning')
-    depart_warning = _depart_named_admonition
-
-    def visit_versionmodified(self, node):
-        intro = versionlabels[node['type']] % node['version']
-        if node.children:
-            intro += ': '
-        else:
-            intro += '.'
-        self.body.append(intro)
-    def depart_versionmodified(self, node):
-        pass
-
-    def visit_target(self, node):
-        def add_target(id):
-            # indexing uses standard LaTeX index markup, so the targets
-            # will be generated differently
-            if not id.startswith('index-'):
-                self.body.append(r'\hypertarget{%s}{}' % id)
-
-        if node.has_key('refid') and node['refid'] not in self.written_ids:
-            parindex = node.parent.index(node)
-            try:
-                next = node.parent[parindex+1]
-                if isinstance(next, nodes.section):
-                    self.next_section_target = node['refid']
-                    return
-            except IndexError:
-                pass
-            add_target(node['refid'])
-            self.written_ids.add(node['refid'])
-    def depart_target(self, node):
-        pass
-
-    def visit_attribution(self, node):
-        self.body.append('\n\\begin{flushright}\n')
-        self.body.append('---')
-    def depart_attribution(self, node):
-        self.body.append('\n\\end{flushright}\n')
-
-    def visit_index(self, node, scre=re.compile(r';\s*')):
-        entries = node['entries']
-        for type, string, tid, _ in entries:
-            if type == 'single':
-                self.body.append(r'\index{%s}' % scre.sub('!', self.encode(string)))
-            elif type == 'pair':
-                parts = tuple(self.encode(x.strip()) for x in string.split(';', 1))
-                try:
-                    self.body.append(r'\indexii{%s}{%s}' % parts)
-                except TypeError:
-                    self.builder.warn('invalid pair index entry %r' % string)
-            elif type == 'triple':
-                parts = tuple(self.encode(x.strip()) for x in string.split(';', 2))
-                try:
-                    self.body.append(r'\indexiii{%s}{%s}{%s}' % parts)
-                except TypeError:
-                    self.builder.warn('invalid triple index entry %r' % string)
-            else:
-                self.builder.warn('unknown index entry type %s found' % type)
-        raise nodes.SkipNode
-
-    def visit_raw(self, node):
-        if 'latex' in node.get('format', '').split():
-            self.body.append(node.astext())
-        raise nodes.SkipNode
-
-    def visit_reference(self, node):
-        uri = node.get('refuri', '')
-        if self.in_title or not uri:
-            self.context.append('')
-        elif uri.startswith('mailto:') or uri.startswith('http:') or \
-             uri.startswith('https:') or uri.startswith('ftp:'):
-            self.body.append('\\href{%s}{' % self.encode(uri))
-            self.context.append('}')
-        elif uri.startswith('#'):
-            self.body.append('\\hyperlink{%s}{' % uri[1:])
-            self.context.append('}')
-        elif uri.startswith('@token'):
-            if self.in_production_list:
-                self.body.append('\\token{')
-            else:
-                self.body.append('\\grammartoken{')
-            self.context.append('}')
-        else:
-            self.builder.warn('unusable reference target found: %s' % uri)
-            self.context.append('')
-    def depart_reference(self, node):
-        self.body.append(self.context.pop())
-
-    def visit_pending_xref(self, node):
-        pass
-    def depart_pending_xref(self, node):
-        pass
-
-    def visit_emphasis(self, node):
-        self.body.append(r'\emph{')
-    def depart_emphasis(self, node):
-        self.body.append('}')
-
-    def visit_literal_emphasis(self, node):
-        self.body.append(r'\emph{\texttt{')
-        self.no_contractions += 1
-    def depart_literal_emphasis(self, node):
-        self.body.append('}}')
-        self.no_contractions -= 1
-
-    def visit_strong(self, node):
-        self.body.append(r'\textbf{')
-    def depart_strong(self, node):
-        self.body.append('}')
-
-    def visit_title_reference(self, node):
-        self.body.append(r'\emph{')
-    def depart_title_reference(self, node):
-        self.body.append('}')
-
-    def visit_citation(self, node):
-        # TODO maybe use cite bibitems
-        self.bibitems.append(['', ''])
-        self.context.append(len(self.body))
-    def depart_citation(self, node):
-        size = self.context.pop()
-        text = ''.join(self.body[size:])
-        del self.body[size:]
-        self.bibitems[-1][1] = text
-
-    def visit_citation_reference(self, node):
-        citeid = node.astext()
-        self.body.append('\\cite{%s}' % citeid)
-        raise nodes.SkipNode
-
-    def visit_literal(self, node):
-        content = self.encode(node.astext().strip())
-        if self.in_title:
-            self.body.append(r'\texttt{%s}' % content)
-        elif node.has_key('role') and node['role'] == 'samp':
-            self.body.append(r'\samp{%s}' % content)
-        else:
-            self.body.append(r'\code{%s}' % content)
-        raise nodes.SkipNode
-
-    def visit_footnote_reference(self, node):
-        num = node.astext().strip()
-        try:
-            fn = self.footnotestack[-1][num]
-        except (KeyError, IndexError):
-            raise nodes.SkipNode
-        self.body.append('\\footnote{')
-        fn.walkabout(self)
-        raise nodes.SkipChildren
-    def depart_footnote_reference(self, node):
-        self.body.append('}')
-
-    def visit_literal_block(self, node):
-        self.verbatim = ''
-    def depart_literal_block(self, node):
-        code = self.verbatim.rstrip('\n')
-        lang = self.highlightlang
-        linenos = code.count('\n') >= self.highlightlinenothreshold - 1
-        if node.has_key('language'):
-            # code-block directives
-            lang = node['language']
-        if node.has_key('linenos'):
-            linenos = node['linenos']
-        hlcode = self.highlighter.highlight_block(code, lang, linenos)
-        # workaround for Unicode issue
-        hlcode = hlcode.replace(u'€', u'@texteuro[]')
-        # must use original Verbatim environment and "tabular" environment
-        if self.table:
-            hlcode = hlcode.replace('\\begin{Verbatim}',
-                                    '\\begin{OriginalVerbatim}')
-            self.table.has_verbatim = True
-        # get consistent trailer
-        hlcode = hlcode.rstrip()[:-14] # strip \end{Verbatim}
-        hlcode = hlcode.rstrip() + '\n'
-        self.body.append('\n' + hlcode + '\\end{%sVerbatim}\n' %
-                         (self.table and 'Original' or ''))
-        self.verbatim = None
-    visit_doctest_block = visit_literal_block
-    depart_doctest_block = depart_literal_block
-
-    def visit_line_block(self, node):
-        """line-block:
-        * whitespace (including linebreaks) is significant
-        * inline markup is supported.
-        * serif typeface
-        """
-        self.body.append('{\\raggedright{}')
-        self.literal_whitespace = 1
-    def depart_line_block(self, node):
-        self.literal_whitespace = 0
-        # remove the last \\
-        del self.body[-1]
-        self.body.append('}\n')
-
-    def visit_line(self, node):
-        self._line_start = len(self.body)
-    def depart_line(self, node):
-        if self._line_start == len(self.body):
-            # no output in this line -- add a nonbreaking space, else the
-            # \\ command will give an error
-            self.body.append('~')
-        if self.table is not None:
-            self.body.append('\\newline\n')
-        else:
-            self.body.append('\\\\\n')
-
-    def visit_block_quote(self, node):
-        # If the block quote contains a single object and that object
-        # is a list, then generate a list not a block quote.
-        # This lets us indent lists.
-        done = 0
-        if len(node.children) == 1:
-            child = node.children[0]
-            if isinstance(child, nodes.bullet_list) or \
-                    isinstance(child, nodes.enumerated_list):
-                done = 1
-        if not done:
-            self.body.append('\\begin{quote}\n')
-    def depart_block_quote(self, node):
-        done = 0
-        if len(node.children) == 1:
-            child = node.children[0]
-            if isinstance(child, nodes.bullet_list) or \
-                    isinstance(child, nodes.enumerated_list):
-                done = 1
-        if not done:
-            self.body.append('\\end{quote}\n')
-
-    # option node handling copied from docutils' latex writer
-
-    def visit_option(self, node):
-        if self.context[-1]:
-            # this is not the first option
-            self.body.append(', ')
-    def depart_option(self, node):
-        # flag that the first option is done.
-        self.context[-1] += 1
-
-    def visit_option_argument(self, node):
-        """The delimiter betweeen an option and its argument."""
-        self.body.append(node.get('delimiter', ' '))
-    def depart_option_argument(self, node):
-        pass
-
-    def visit_option_group(self, node):
-        self.body.append('\\item [')
-        # flag for first option
-        self.context.append(0)
-    def depart_option_group(self, node):
-        self.context.pop() # the flag
-        self.body.append('] ')
-
-    def visit_option_list(self, node):
-        self.body.append('\\begin{optionlist}{3cm}\n')
-    def depart_option_list(self, node):
-        self.body.append('\\end{optionlist}\n')
-
-    def visit_option_list_item(self, node):
-        pass
-    def depart_option_list_item(self, node):
-        pass
-
-    def visit_option_string(self, node):
-        ostring = node.astext()
-        self.body.append(self.encode(ostring.replace('--', u'-{-}')))
-        raise nodes.SkipNode
-
-    def visit_description(self, node):
-        self.body.append( ' ' )
-    def depart_description(self, node):
-        pass
-
-    def visit_superscript(self, node):
-        self.body.append('$^{\\text{')
-    def depart_superscript(self, node):
-        self.body.append('}}$')
-
-    def visit_subscript(self, node):
-        self.body.append('$_{\\text{')
-    def depart_subscript(self, node):
-        self.body.append('}}$')
-
-    def visit_substitution_definition(self, node):
-        raise nodes.SkipNode
-
-    def visit_substitution_reference(self, node):
-        raise nodes.SkipNode
-
-    def visit_generated(self, node):
-        pass
-    def depart_generated(self, node):
-        pass
-
-    def visit_compound(self, node):
-        pass
-    def depart_compound(self, node):
-        pass
-
-    def visit_container(self, node):
-        pass
-    def depart_container(self, node):
-        pass
-
-    def visit_decoration(self, node):
-        pass
-    def depart_decoration(self, node):
-        pass
-
-    # text handling
-
-    def encode(self, text):
-        text = unicode(text).translate(tex_escape_map)
-        if self.literal_whitespace:
-            # Insert a blank before the newline, to avoid
-            # ! LaTeX Error: There's no line here to end.
-            text = text.replace(u'\n', u'~\\\\\n').replace(u' ', u'~')
-        if self.no_contractions:
-            text = text.replace('--', u'-{-}')
-        return text
-
-    def visit_Text(self, node):
-        if self.verbatim is not None:
-            self.verbatim += node.astext()
-        else:
-            text = self.encode(node.astext())
-            self.body.append(educateQuotesLatex(text))
-    def depart_Text(self, node):
-        pass
-
-    def visit_comment(self, node):
-        raise nodes.SkipNode
-
-    def visit_meta(self, node):
-        # only valid for HTML
-        raise nodes.SkipNode
-
-    def visit_system_message(self, node):
-        pass
-    def depart_system_message(self, node):
-        self.body.append('\n')
-
-    def unknown_visit(self, node):
-        raise NotImplementedError('Unknown node: ' + node.__class__.__name__)
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/linkcheck.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,130 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.linkcheck
-    ~~~~~~~~~~~~~~~~
-
-    The CheckExternalLinksBuilder class.
-
-    :copyright: 2008 by Georg Brandl, Thomas Lamb.
-    :license: BSD.
-"""
-
-import socket
-from os import path
-from urllib2 import build_opener, HTTPError
-
-from docutils import nodes
-
-from sphinx.builder import Builder
-from sphinx.util.console import purple, red, darkgreen
-
-# create an opener that will simulate a browser user-agent
-opener = build_opener()
-opener.addheaders = [('User-agent', 'Mozilla/5.0')]
-
-
-class CheckExternalLinksBuilder(Builder):
-    """
-    Checks for broken external links.
-    """
-    name = 'linkcheck'
-
-    def init(self):
-        self.good = set()
-        self.broken = {}
-        self.redirected = {}
-        # set a timeout for non-responding servers
-        socket.setdefaulttimeout(5.0)
-        # create output file
-        open(path.join(self.outdir, 'output.txt'), 'w').close()
-
-    def get_target_uri(self, docname, typ=None):
-        return ''
-
-    def get_outdated_docs(self):
-        return self.env.found_docs
-
-    def prepare_writing(self, docnames):
-        return
-
-    def write_doc(self, docname, doctree):
-        self.info()
-        for node in doctree.traverse(nodes.reference):
-            try:
-                self.check(node, docname)
-            except KeyError:
-                continue
-
-    def check(self, node, docname):
-        uri = node['refuri']
-
-        if '#' in uri:
-            uri = uri.split('#')[0]
-
-        if uri in self.good:
-            return
-
-        lineno = None
-        while lineno is None and node:
-            node = node.parent
-            lineno = node.line
-
-        if uri[0:5] == 'http:' or uri[0:6] == 'https:':
-            self.info(uri, nonl=1)
-
-            if uri in self.broken:
-                (r, s) = self.broken[uri]
-            elif uri in self.redirected:
-                (r, s) = self.redirected[uri]
-            else:
-                (r, s) = self.resolve(uri)
-
-            if r == 0:
-                self.info(' - ' + darkgreen('working'))
-                self.good.add(uri)
-            elif r == 2:
-                self.info(' - ' + red('broken: ') + s)
-                self.write_entry('broken', docname, lineno, uri + ': ' + s)
-                self.broken[uri] = (r, s)
-                if self.app.quiet:
-                    self.warn('%s:%s: broken link: %s' % (docname, lineno, uri))
-            else:
-                self.info(' - ' + purple('redirected') + ' to ' + s)
-                self.write_entry('redirected', docname, lineno, uri + ' to ' + s)
-                self.redirected[uri] = (r, s)
-        elif len(uri) == 0 or uri[0:7] == 'mailto:' or uri[0:4] == 'ftp:':
-            return
-        else:
-            self.warn(uri + ' - ' + red('malformed!'))
-            self.write_entry('malformed', docname, lineno, uri)
-            if self.app.quiet:
-                self.warn('%s:%s: malformed link: %s' % (docname, lineno, uri))
-            self.app.statuscode = 1
-
-        if self.broken:
-            self.app.statuscode = 1
-
-    def write_entry(self, what, docname, line, uri):
-        output = open(path.join(self.outdir, 'output.txt'), 'a')
-        output.write("%s:%s: [%s] %s\n" % (self.env.doc2path(docname, None),
-                                           line, what, uri))
-        output.close()
-
-    def resolve(self, uri):
-        try:
-            f = opener.open(uri)
-            f.close()
-        except HTTPError, err:
-            #if err.code == 403 and uri.startswith('http://en.wikipedia.org/'):
-            #    # Wikipedia blocks requests from urllib User-Agent
-            #    return (0, 0)
-            return (2, str(err))
-        except Exception, err:
-            return (2, str(err))
-        if f.url.rstrip('/') == uri.rstrip('/'):
-            return (0, 0)
-        else:
-            return (1, f.url)
-
-    def finish(self):
-        return
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.locale
-    ~~~~~~~~~~~~~
-
-    Locale utilities.
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-_ = lambda x: x
-
-admonitionlabels = {
-    'attention': _('Attention'),
-    'caution':   _('Caution'),
-    'danger':    _('Danger'),
-    'error':     _('Error'),
-    'hint':      _('Hint'),
-    'important': _('Important'),
-    'note':      _('Note'),
-    'seealso':   _('See Also'),
-    'tip':       _('Tip'),
-    'warning':   _('Warning'),
-}
-
-versionlabels = {
-    'versionadded':   _('New in version %s'),
-    'versionchanged': _('Changed in version %s'),
-    'deprecated':     _('Deprecated since version %s'),
-}
-
-pairindextypes = {
-    'module':    _('module'),
-    'keyword':   _('keyword'),
-    'operator':  _('operator'),
-    'object':    _('object'),
-    'exception': _('exception'),
-    'statement': _('statement'),
-    'builtin':   _('built-in function'),
-}
-
-del _
-
-def init():
-    for dct in (admonitionlabels, versionlabels, pairindextypes):
-        for key in dct:
-            dct[key] = _(dct[key])
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-Documentation.addTranslations({"locale": "cs", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"module, in ": "modul", "Preparing search...": "", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "", "Search finished, found %s page(s) matching the search query.": "", ", in ": "", "Permalink to this headline": "Trval\u00fd odkaz na tento nadpis", "Searching": "hledej", "Permalink to this definition": "Trval\u00fd odkaz na tuto definici", "Hide Search Matches": "", "Search Results": "V\u00fdsledky hled\u00e1n\u00ed"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.mo has changed
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,604 +0,0 @@
-# Czech translations for Sphinx.
-# Copyright (C) 2008 ORGANIZATION
-# This file is distributed under the same license as the Sphinx project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Sphinx 0.5\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2008-08-10 11:43+0000\n"
-"PO-Revision-Date: 2008-11-27 18:40+0100\n"
-"Last-Translator: Pavel Kosina <pavel.kosina@gmail.com>\n"
-"Language-Team: Pavel Kosina <pavel.kosina@gmail.com>\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
-"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.4\n"
-
-#: sphinx/builder.py:408
-#, python-format
-msgid "%b %d, %Y"
-msgstr "%d.%m.%Y"
-
-#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
-msgid "General Index"
-msgstr "Rejstřík indexů"
-
-#: sphinx/builder.py:427
-msgid "index"
-msgstr "index"
-
-#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
-#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
-#: sphinx/templates/modindex.html:13
-msgid "Global Module Index"
-msgstr "Rejstřík modulů"
-
-#: sphinx/builder.py:429
-msgid "modules"
-msgstr "moduly"
-
-#: sphinx/builder.py:466
-msgid "next"
-msgstr "další"
-
-#: sphinx/builder.py:473
-msgid "previous"
-msgstr "předchozí"
-
-#: sphinx/builder.py:1054
-msgid " (in "
-msgstr ""
-
-#: sphinx/builder.py:1129
-msgid "Builtins"
-msgstr "Vestavěné funkce"
-
-#: sphinx/builder.py:1131
-msgid "Module level"
-msgstr "Úroveň modulů"
-
-#: sphinx/environment.py:102 sphinx/latexwriter.py:169
-#, python-format
-msgid "%B %d, %Y"
-msgstr "%d.%m.%Y"
-
-#: sphinx/environment.py:291 sphinx/latexwriter.py:175
-#: sphinx/templates/genindex-single.html:2
-#: sphinx/templates/genindex-split.html:2
-#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
-#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
-#: sphinx/templates/layout.html:130
-msgid "Index"
-msgstr "Index"
-
-#: sphinx/environment.py:292 sphinx/latexwriter.py:174
-#, fuzzy
-msgid "Module Index"
-msgstr "Rejstřík modulů"
-
-#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
-#, fuzzy
-msgid "Search Page"
-msgstr "Vyhledávací stránka"
-
-#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
-msgid "Permalink to this definition"
-msgstr "Trvalý odkaz na tuto definici"
-
-#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
-msgid "Permalink to this headline"
-msgstr "Trvalý odkaz na tento nadpis"
-
-#: sphinx/latexwriter.py:172
-msgid "Release"
-msgstr "Vydání"
-
-#: sphinx/roles.py:53 sphinx/directives/desc.py:537
-#, python-format
-msgid "environment variable; %s"
-msgstr "promměná prostředí, %s"
-
-#: sphinx/roles.py:60
-#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
-
-#: sphinx/textwriter.py:166
-#, python-format
-msgid "Platform: %s"
-msgstr "Platforma: %s"
-
-#: sphinx/textwriter.py:422
-msgid "[image]"
-msgstr "[obrázek]"
-
-#: sphinx/directives/desc.py:25
-#, python-format
-msgid "%s() (built-in function)"
-msgstr "%s() (vestavěná funkce)"
-
-#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
-#: sphinx/directives/desc.py:54
-#, python-format
-msgid "%s() (in module %s)"
-msgstr "%s() (v modulu %s)"
-
-#: sphinx/directives/desc.py:29
-#, python-format
-msgid "%s (built-in variable)"
-msgstr "%s() (vestavěná proměnná)"
-
-#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
-#, python-format
-msgid "%s (in module %s)"
-msgstr "%s() (v modulu %s)"
-
-#: sphinx/directives/desc.py:33
-#, fuzzy, python-format
-msgid "%s (built-in class)"
-msgstr "%s() (vestavěná proměnná)"
-
-#: sphinx/directives/desc.py:34
-#, python-format
-msgid "%s (class in %s)"
-msgstr "%s() (třída v %s)"
-
-#: sphinx/directives/desc.py:46
-#, python-format
-msgid "%s() (%s.%s method)"
-msgstr "%s() (metoda %s.%s)"
-
-#: sphinx/directives/desc.py:48
-#, python-format
-msgid "%s() (%s method)"
-msgstr "%s() (metoda %s)"
-
-#: sphinx/directives/desc.py:58
-#, python-format
-msgid "%s() (%s.%s static method)"
-msgstr "%s() (statická metoda %s.%s)"
-
-#: sphinx/directives/desc.py:60
-#, python-format
-msgid "%s() (%s static method)"
-msgstr "%s() (statická metoda %s)"
-
-#: sphinx/directives/desc.py:70
-#, python-format
-msgid "%s (%s.%s attribute)"
-msgstr "%s() (atribut %s.%s)"
-
-#: sphinx/directives/desc.py:72
-#, python-format
-msgid "%s (%s attribute)"
-msgstr "%s() (atribut %s)"
-
-#: sphinx/directives/desc.py:74
-#, python-format
-msgid "%s (C function)"
-msgstr "%s (C funkce)"
-
-#: sphinx/directives/desc.py:76
-#, python-format
-msgid "%s (C member)"
-msgstr "%s (Älen C)"
-
-#: sphinx/directives/desc.py:78
-#, python-format
-msgid "%s (C macro)"
-msgstr "%s (C makro)"
-
-#: sphinx/directives/desc.py:80
-#, python-format
-msgid "%s (C type)"
-msgstr "%s (C typ)"
-
-#: sphinx/directives/desc.py:82
-#, python-format
-msgid "%s (C variable)"
-msgstr "%s (C proměnná)"
-
-#: sphinx/directives/desc.py:100
-msgid "Raises"
-msgstr "Vyvolá"
-
-#: sphinx/directives/desc.py:104
-msgid "Variable"
-msgstr "Proměnná"
-
-#: sphinx/directives/desc.py:107
-msgid "Returns"
-msgstr "Vrací"
-
-#: sphinx/directives/desc.py:116
-msgid "Return type"
-msgstr "Typ navrácené hodnoty"
-
-#: sphinx/directives/desc.py:143
-msgid "Parameters"
-msgstr "Parametry"
-
-#: sphinx/directives/desc.py:423
-#, fuzzy, python-format
-msgid "%scommand line option; %s"
-msgstr "%sparametry příkazového řádku; %s"
-
-#: sphinx/directives/other.py:101
-msgid "Platforms: "
-msgstr "Platformy: "
-
-#: sphinx/directives/other.py:106
-#, python-format
-msgid "%s (module)"
-msgstr "%s (module)"
-
-#: sphinx/directives/other.py:146
-msgid "Section author: "
-msgstr "Autor sekce: "
-
-#: sphinx/directives/other.py:148
-msgid "Module author: "
-msgstr "Autor modulu: "
-
-#: sphinx/directives/other.py:150
-msgid "Author: "
-msgstr "Autor: "
-
-#: sphinx/directives/other.py:246
-msgid "See also"
-msgstr "Viz také"
-
-#: sphinx/ext/todo.py:31
-msgid "Todo"
-msgstr ""
-
-#: sphinx/ext/todo.py:75
-#, python-format
-msgid "(The original entry is located in %s, line %d and can be found "
-msgstr ""
-
-#: sphinx/ext/todo.py:81
-msgid "here"
-msgstr ""
-
-#: sphinx/locale/__init__.py:15
-msgid "Attention"
-msgstr "Výstraha"
-
-#: sphinx/locale/__init__.py:16
-msgid "Caution"
-msgstr "Upozornění"
-
-#: sphinx/locale/__init__.py:17
-msgid "Danger"
-msgstr "NebezpeÄí"
-
-#: sphinx/locale/__init__.py:18
-msgid "Error"
-msgstr "Chyba"
-
-#: sphinx/locale/__init__.py:19
-msgid "Hint"
-msgstr "Rada"
-
-#: sphinx/locale/__init__.py:20
-msgid "Important"
-msgstr "Důležité"
-
-#: sphinx/locale/__init__.py:21
-msgid "Note"
-msgstr "Poznámka"
-
-#: sphinx/locale/__init__.py:22
-msgid "See Also"
-msgstr "Viz také"
-
-#: sphinx/locale/__init__.py:23
-msgid "Tip"
-msgstr "Tip"
-
-#: sphinx/locale/__init__.py:24
-msgid "Warning"
-msgstr "Varování"
-
-#: sphinx/locale/__init__.py:28
-#, python-format
-msgid "New in version %s"
-msgstr "Nové ve verzi %s"
-
-#: sphinx/locale/__init__.py:29
-#, python-format
-msgid "Changed in version %s"
-msgstr "Změněno ve verzi %s"
-
-#: sphinx/locale/__init__.py:30
-#, python-format
-msgid "Deprecated since version %s"
-msgstr "Zastaralé od verze %s"
-
-#: sphinx/locale/__init__.py:34
-msgid "module"
-msgstr "modul"
-
-#: sphinx/locale/__init__.py:35
-msgid "keyword"
-msgstr "klíÄové slovo"
-
-#: sphinx/locale/__init__.py:36
-msgid "operator"
-msgstr "operátor"
-
-#: sphinx/locale/__init__.py:37
-msgid "object"
-msgstr "objekt"
-
-#: sphinx/locale/__init__.py:38
-msgid "exception"
-msgstr "výjimka"
-
-#: sphinx/locale/__init__.py:39
-msgid "statement"
-msgstr "příkaz"
-
-#: sphinx/locale/__init__.py:40
-msgid "built-in function"
-msgstr "vestavěná funkce"
-
-#: sphinx/static/doctools.js:174
-msgid "Hide Search Matches"
-msgstr ""
-
-#: sphinx/static/searchtools.js:274
-#, fuzzy
-msgid "Searching"
-msgstr "hledej"
-
-#: sphinx/static/searchtools.js:279
-msgid "Preparing search..."
-msgstr ""
-
-#: sphinx/static/searchtools.js:338
-#, fuzzy
-msgid "module, in "
-msgstr "modul"
-
-#: sphinx/static/searchtools.js:347
-msgid ", in "
-msgstr ""
-
-#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
-msgid "Search Results"
-msgstr "Výsledky hledání"
-
-#: sphinx/static/searchtools.js:449
-msgid ""
-"Your search did not match any documents. Please make sure that all words "
-"are spelled correctly and that you've selected enough categories."
-msgstr ""
-
-#: sphinx/static/searchtools.js:451
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr ""
-
-#: sphinx/templates/defindex.html:2
-msgid "Overview"
-msgstr "Přehled"
-
-#: sphinx/templates/defindex.html:11
-msgid "Indices and tables:"
-msgstr "Rejstříky a tabulky:"
-
-#: sphinx/templates/defindex.html:14
-msgid "Complete Table of Contents"
-msgstr "Celkový obsah"
-
-#: sphinx/templates/defindex.html:15
-msgid "lists all sections and subsections"
-msgstr "seznam všech sekcí a podsekcí"
-
-#: sphinx/templates/defindex.html:17
-msgid "search this documentation"
-msgstr "prohledej tuto dokumentaci"
-
-#: sphinx/templates/defindex.html:20
-msgid "quick access to all modules"
-msgstr "rychlý přístup ke všem modulům"
-
-#: sphinx/templates/defindex.html:22
-msgid "all functions, classes, terms"
-msgstr "všechny funkce, třídy, termíny"
-
-#: sphinx/templates/genindex-single.html:5
-#, python-format
-msgid "Index &ndash; %(key)s"
-msgstr "Index &ndash; %(key)s"
-
-#: sphinx/templates/genindex-single.html:44
-#: sphinx/templates/genindex-split.html:14
-#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
-msgid "Full index on one page"
-msgstr "Plný index na jedné stránce"
-
-#: sphinx/templates/genindex-split.html:7
-msgid "Index pages by letter"
-msgstr "Index podle písmene"
-
-#: sphinx/templates/genindex-split.html:15
-msgid "can be huge"
-msgstr "může být obrovský"
-
-#: sphinx/templates/layout.html:9
-msgid "Navigation"
-msgstr "Navigace"
-
-#: sphinx/templates/layout.html:40
-msgid "Table Of Contents"
-msgstr "Obsah"
-
-#: sphinx/templates/layout.html:46
-msgid "Previous topic"
-msgstr "Přechozí téma"
-
-#: sphinx/templates/layout.html:47
-msgid "previous chapter"
-msgstr "předchozí kapitola"
-
-#: sphinx/templates/layout.html:50
-msgid "Next topic"
-msgstr "Další téma"
-
-#: sphinx/templates/layout.html:51
-msgid "next chapter"
-msgstr "další kapitola"
-
-#: sphinx/templates/layout.html:55
-msgid "This Page"
-msgstr "Tato stránka"
-
-#: sphinx/templates/layout.html:59
-msgid "Suggest Change"
-msgstr "Návrh změnu"
-
-#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
-msgid "Show Source"
-msgstr "Ukázat zdroj"
-
-#: sphinx/templates/layout.html:71
-msgid "Quick search"
-msgstr "Rychlé vyhledávání"
-
-#: sphinx/templates/layout.html:71
-msgid "Keyword search"
-msgstr "Hledání dle klíÄe"
-
-#: sphinx/templates/layout.html:73
-msgid "Go"
-msgstr "hledej"
-
-#: sphinx/templates/layout.html:78
-msgid "Enter a module, class or function name."
-msgstr "Zadej jméno modulu, třídy nebo funkce."
-
-#: sphinx/templates/layout.html:119
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "Hledání uvnitř %(docstitle)s"
-
-#: sphinx/templates/layout.html:128
-msgid "About these documents"
-msgstr "O těchto dokumentech"
-
-#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
-#: sphinx/templates/search.html:5
-msgid "Search"
-msgstr "Hledání"
-
-#: sphinx/templates/layout.html:133
-msgid "Copyright"
-msgstr "Veškerá práva vyhrazena"
-
-#: sphinx/templates/layout.html:178
-#, python-format
-msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-
-#: sphinx/templates/layout.html:180
-#, python-format
-msgid "&copy; Copyright %(copyright)s."
-msgstr "&copy; Copyright %(copyright)s."
-
-#: sphinx/templates/layout.html:183
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "Naposledy aktualizováno dne %(last_updated)s."
-
-#: sphinx/templates/layout.html:186
-#, python-format
-msgid ""
-"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-msgstr ""
-"Vytvořeno pomocí <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-
-#: sphinx/templates/modindex.html:15
-msgid "Most popular modules:"
-msgstr "Nejpopulárnější moduly:"
-
-#: sphinx/templates/modindex.html:24
-msgid "Show modules only available on these platforms"
-msgstr "Zobrazit moduly dostupné na této platformě"
-
-#: sphinx/templates/modindex.html:56
-msgid "Deprecated"
-msgstr "Zastaralé"
-
-#: sphinx/templates/opensearch.xml:4
-#, python-format
-msgid "Search %(docstitle)s"
-msgstr "Prohledat %(docstitle)s"
-
-#: sphinx/templates/page.html:8
-msgid ""
-"<strong>Note:</strong> You requested an out-of-date URL from this server."
-" We've tried to redirect you to the new location of this page, but it may"
-" not be the right one."
-msgstr ""
-"<strong>Poznámka:</strong> Stránka, kterou hledáte, "
-"neexistuje.<br>Snažili jsme se najít nové umístění této stránky, ale "
-"nepovedlo se."
-
-#: sphinx/templates/search.html:7
-#, fuzzy
-msgid ""
-"From here you can search these documents. Enter your search\n"
-"    words into the box below and click \"search\". Note that the search\n"
-"    function will automatically search for all of the words. Pages\n"
-"    containing fewer words won't appear in the result list."
-msgstr ""
-"Toto je vyhledávací stránka. Zadejte klíÄová slova    do pole níže a "
-"klikněte na \"hledej\". \n"
-"Prohledávání funkcí  hledá automaticky všechna slova. Stránky obsahující"
-"    slov méně, nebudou nalezeny."
-
-#: sphinx/templates/search.html:14
-msgid "search"
-msgstr "hledej"
-
-#: sphinx/templates/search.html:20
-msgid "Your search did not match any results."
-msgstr "Nic jsme nenašli."
-
-#: sphinx/templates/changes/frameset.html:5
-#: sphinx/templates/changes/versionchanges.html:12
-#, python-format
-msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
-msgstr "Změny ve verzi %(version)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/rstsource.html:5
-#, python-format
-msgid "%(filename)s &mdash; %(docstitle)s"
-msgstr "%(filename)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/versionchanges.html:17
-#, python-format
-msgid "Automatically generated list of changes in version %(version)s"
-msgstr "Automaticky generovaný seznam změn ve verzi %(version)s"
-
-#: sphinx/templates/changes/versionchanges.html:18
-msgid "Library changes"
-msgstr "Změny v knihovnách"
-
-#: sphinx/templates/changes/versionchanges.html:23
-msgid "C API changes"
-msgstr "Změny API"
-
-#: sphinx/templates/changes/versionchanges.html:25
-msgid "Other changes"
-msgstr "Ostatní změny"
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-Documentation.addTranslations({"locale": "de", "plural_expr": "(n != 1)", "messages": {"module, in ": "Modul, in ", "Preparing search...": "Suche wird vorbereitet...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Es wurden keine Dokumente gefunden. Haben Sie alle Suchworte richtig geschrieben und gen\u00fcgend Kategorien ausgew\u00e4hlt?", "Search finished, found %s page(s) matching the search query.": "Suche beendet, %s Seite(n) mit Ergebnissen wurden gefunden.", ", in ": "", "Permalink to this headline": "Permalink zu dieser \u00dcberschrift", "Searching": "Suchen...", "Permalink to this definition": "Permalink zu dieser Definition", "Hide Search Matches": "Suchergebnisse ausblenden", "Search Results": "Suchergebnisse"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.mo has changed
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,601 +0,0 @@
-# German translations for Sphinx.
-# Copyright (C) 2008 Translators.
-# This file is distributed under the same license as the Sphinx project.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PROJECT VERSION\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2008-08-07 21:40+0200\n"
-"PO-Revision-Date: 2008-11-27 18:40+0100\n"
-"Last-Translator: Horst Gutmann <zerok@zerokspot.com>\n"
-"Language-Team: de <LL@li.org>\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.4\n"
-
-#: sphinx/builder.py:408
-#, python-format
-msgid "%b %d, %Y"
-msgstr "%d. %m. %Y"
-
-#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
-msgid "General Index"
-msgstr "Allgemeiner Index"
-
-#: sphinx/builder.py:427
-msgid "index"
-msgstr "Index"
-
-#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
-#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
-#: sphinx/templates/modindex.html:13
-msgid "Global Module Index"
-msgstr "Globaler Modulindex"
-
-#: sphinx/builder.py:429
-msgid "modules"
-msgstr "Module"
-
-#: sphinx/builder.py:466
-msgid "next"
-msgstr "weiter"
-
-#: sphinx/builder.py:473
-msgid "previous"
-msgstr "zurück"
-
-#: sphinx/builder.py:1054
-msgid " (in "
-msgstr ""
-
-#: sphinx/builder.py:1129
-msgid "Builtins"
-msgstr "Builtins"
-
-#: sphinx/builder.py:1131
-msgid "Module level"
-msgstr "Modulebene"
-
-#: sphinx/environment.py:102 sphinx/latexwriter.py:169
-#, python-format
-msgid "%B %d, %Y"
-msgstr "%d. %m. %Y"
-
-#: sphinx/environment.py:291 sphinx/latexwriter.py:175
-#: sphinx/templates/genindex-single.html:2
-#: sphinx/templates/genindex-split.html:2
-#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
-#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
-#: sphinx/templates/layout.html:130
-msgid "Index"
-msgstr "Stichwortverzeichnis"
-
-#: sphinx/environment.py:292 sphinx/latexwriter.py:174
-msgid "Module Index"
-msgstr "Modulindex"
-
-#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
-msgid "Search Page"
-msgstr "Suche"
-
-#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
-msgid "Permalink to this definition"
-msgstr "Permalink zu dieser Definition"
-
-#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
-msgid "Permalink to this headline"
-msgstr "Permalink zu dieser Ãœberschrift"
-
-#: sphinx/latexwriter.py:172
-msgid "Release"
-msgstr "Release"
-
-#: sphinx/roles.py:53 sphinx/directives/desc.py:537
-#, python-format
-msgid "environment variable; %s"
-msgstr "Umgebungsvariable; %s"
-
-#: sphinx/roles.py:60
-#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
-
-#: sphinx/textwriter.py:166
-#, python-format
-msgid "Platform: %s"
-msgstr "Plattform: %s"
-
-#: sphinx/textwriter.py:422
-msgid "[image]"
-msgstr "[Bild]"
-
-#: sphinx/directives/desc.py:25
-#, python-format
-msgid "%s() (built-in function)"
-msgstr "%s() (eingebaute Funktion)"
-
-#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
-#: sphinx/directives/desc.py:54
-#, python-format
-msgid "%s() (in module %s)"
-msgstr "%s() (in Modul %s)"
-
-#: sphinx/directives/desc.py:29
-#, python-format
-msgid "%s (built-in variable)"
-msgstr "%s (eingebaute Variable)"
-
-#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
-#, python-format
-msgid "%s (in module %s)"
-msgstr "%s (in Modul %s)"
-
-#: sphinx/directives/desc.py:33
-#, python-format
-msgid "%s (built-in class)"
-msgstr "%s (eingebaute Klasse)"
-
-#: sphinx/directives/desc.py:34
-#, python-format
-msgid "%s (class in %s)"
-msgstr "%s (Klasse in %s)"
-
-#: sphinx/directives/desc.py:46
-#, python-format
-msgid "%s() (%s.%s method)"
-msgstr "%s() (Methode von %s.%s)"
-
-#: sphinx/directives/desc.py:48
-#, python-format
-msgid "%s() (%s method)"
-msgstr "%s() (Methode von %s)"
-
-#: sphinx/directives/desc.py:58
-#, python-format
-msgid "%s() (%s.%s static method)"
-msgstr "%s() (statische Methode von %s.%s)"
-
-#: sphinx/directives/desc.py:60
-#, python-format
-msgid "%s() (%s static method)"
-msgstr "%s() (statische Methode von %s)"
-
-#: sphinx/directives/desc.py:70
-#, python-format
-msgid "%s (%s.%s attribute)"
-msgstr "%s (Attribut von %s.%s)"
-
-#: sphinx/directives/desc.py:72
-#, python-format
-msgid "%s (%s attribute)"
-msgstr "%s (Attribut von %s)"
-
-#: sphinx/directives/desc.py:74
-#, python-format
-msgid "%s (C function)"
-msgstr "%s (C-Funktion)"
-
-#: sphinx/directives/desc.py:76
-#, python-format
-msgid "%s (C member)"
-msgstr "%s (C-Member)"
-
-#: sphinx/directives/desc.py:78
-#, python-format
-msgid "%s (C macro)"
-msgstr "%s (C-Makro)"
-
-#: sphinx/directives/desc.py:80
-#, python-format
-msgid "%s (C type)"
-msgstr "%s (C-Typ)"
-
-#: sphinx/directives/desc.py:82
-#, python-format
-msgid "%s (C variable)"
-msgstr "%s (C-Variable)"
-
-#: sphinx/directives/desc.py:100
-msgid "Raises"
-msgstr "Verursacht:"
-
-#: sphinx/directives/desc.py:104
-msgid "Variable"
-msgstr "Variable"
-
-#: sphinx/directives/desc.py:107
-msgid "Returns"
-msgstr "Rückgabe"
-
-#: sphinx/directives/desc.py:116
-msgid "Return type"
-msgstr "Rückgabetyp"
-
-#: sphinx/directives/desc.py:143
-msgid "Parameters"
-msgstr "Parameter"
-
-#: sphinx/directives/desc.py:423
-#, python-format
-msgid "%scommand line option; %s"
-msgstr "%sKommandozeilenoption; %s"
-
-#: sphinx/directives/other.py:101
-msgid "Platforms: "
-msgstr "Plattformen: "
-
-#: sphinx/directives/other.py:106
-#, python-format
-msgid "%s (module)"
-msgstr "%s (Modul)"
-
-#: sphinx/directives/other.py:146
-msgid "Section author: "
-msgstr "Autor des Abschnitts: "
-
-#: sphinx/directives/other.py:148
-msgid "Module author: "
-msgstr "Autor des Moduls: "
-
-#: sphinx/directives/other.py:150
-msgid "Author: "
-msgstr "Autor: "
-
-#: sphinx/directives/other.py:246
-msgid "See also"
-msgstr "Siehe auch"
-
-#: sphinx/ext/todo.py:31
-msgid "Todo"
-msgstr ""
-
-#: sphinx/ext/todo.py:75
-#, python-format
-msgid "(The original entry is located in %s, line %d and can be found "
-msgstr ""
-
-#: sphinx/ext/todo.py:81
-msgid "here"
-msgstr ""
-
-#: sphinx/locale/__init__.py:15
-msgid "Attention"
-msgstr "Achtung"
-
-#: sphinx/locale/__init__.py:16
-msgid "Caution"
-msgstr "Vorsicht"
-
-#: sphinx/locale/__init__.py:17
-msgid "Danger"
-msgstr "Gefahr"
-
-#: sphinx/locale/__init__.py:18
-msgid "Error"
-msgstr "Fehler"
-
-#: sphinx/locale/__init__.py:19
-msgid "Hint"
-msgstr "Hinweis"
-
-#: sphinx/locale/__init__.py:20
-msgid "Important"
-msgstr "Wichtig"
-
-#: sphinx/locale/__init__.py:21
-msgid "Note"
-msgstr "Bemerkung"
-
-#: sphinx/locale/__init__.py:22
-msgid "See Also"
-msgstr "Siehe auch"
-
-#: sphinx/locale/__init__.py:23
-msgid "Tip"
-msgstr "Tipp"
-
-#: sphinx/locale/__init__.py:24
-msgid "Warning"
-msgstr "Warnung"
-
-#: sphinx/locale/__init__.py:28
-#, python-format
-msgid "New in version %s"
-msgstr "Neu in Version %s"
-
-#: sphinx/locale/__init__.py:29
-#, python-format
-msgid "Changed in version %s"
-msgstr "Geändert in Version %s"
-
-#: sphinx/locale/__init__.py:30
-#, python-format
-msgid "Deprecated since version %s"
-msgstr "Veraltet ab Version %s"
-
-#: sphinx/locale/__init__.py:34
-msgid "module"
-msgstr "Module"
-
-#: sphinx/locale/__init__.py:35
-msgid "keyword"
-msgstr "Schlüsselwort"
-
-#: sphinx/locale/__init__.py:36
-msgid "operator"
-msgstr "Operator"
-
-#: sphinx/locale/__init__.py:37
-msgid "object"
-msgstr "Objekt"
-
-#: sphinx/locale/__init__.py:38
-msgid "exception"
-msgstr "Exception"
-
-#: sphinx/locale/__init__.py:39
-msgid "statement"
-msgstr "Statement"
-
-#: sphinx/locale/__init__.py:40
-msgid "built-in function"
-msgstr "eingebaute Funktion"
-
-#: sphinx/static/doctools.js:174
-msgid "Hide Search Matches"
-msgstr "Suchergebnisse ausblenden"
-
-#: sphinx/static/searchtools.js:274
-msgid "Searching"
-msgstr "Suchen..."
-
-#: sphinx/static/searchtools.js:279
-msgid "Preparing search..."
-msgstr "Suche wird vorbereitet..."
-
-#: sphinx/static/searchtools.js:338
-msgid "module, in "
-msgstr "Modul, in "
-
-#: sphinx/static/searchtools.js:347
-msgid ", in "
-msgstr ""
-
-#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
-msgid "Search Results"
-msgstr "Suchergebnisse"
-
-#: sphinx/static/searchtools.js:449
-msgid ""
-"Your search did not match any documents. Please make sure that all words "
-"are spelled correctly and that you've selected enough categories."
-msgstr ""
-"Es wurden keine Dokumente gefunden. Haben Sie alle Suchworte richtig "
-"geschrieben und genügend Kategorien ausgewählt?"
-
-#: sphinx/static/searchtools.js:451
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Suche beendet, %s Seite(n) mit Ergebnissen wurden gefunden."
-
-#: sphinx/templates/defindex.html:2
-msgid "Overview"
-msgstr "Ãœbersicht"
-
-#: sphinx/templates/defindex.html:11
-msgid "Indices and tables:"
-msgstr "Indizes und Tabellen:"
-
-#: sphinx/templates/defindex.html:14
-msgid "Complete Table of Contents"
-msgstr "Vollständiges Inhaltsverzeichnis"
-
-#: sphinx/templates/defindex.html:15
-msgid "lists all sections and subsections"
-msgstr "Liste aller Kapitel und Unterkapitel"
-
-#: sphinx/templates/defindex.html:17
-msgid "search this documentation"
-msgstr "Durchsuche diese Dokumentation"
-
-#: sphinx/templates/defindex.html:20
-msgid "quick access to all modules"
-msgstr "Schneller Zugriff auf alle Module"
-
-#: sphinx/templates/defindex.html:22
-msgid "all functions, classes, terms"
-msgstr "Alle Funktionen, Klassen, Begriffe"
-
-#: sphinx/templates/genindex-single.html:5
-#, python-format
-msgid "Index &ndash; %(key)s"
-msgstr "Stichwortverzeichnis &ndash; %(key)s"
-
-#: sphinx/templates/genindex-single.html:44
-#: sphinx/templates/genindex-split.html:14
-#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
-msgid "Full index on one page"
-msgstr "Gesamtes Stichwortverzeichnis auf einer Seite"
-
-#: sphinx/templates/genindex-split.html:7
-msgid "Index pages by letter"
-msgstr "Stichwortverzeichnis nach Anfangsbuchstabe"
-
-#: sphinx/templates/genindex-split.html:15
-msgid "can be huge"
-msgstr "kann groß sein"
-
-#: sphinx/templates/layout.html:9
-msgid "Navigation"
-msgstr "Navigation"
-
-#: sphinx/templates/layout.html:40
-msgid "Table Of Contents"
-msgstr "Inhalt"
-
-#: sphinx/templates/layout.html:46
-msgid "Previous topic"
-msgstr "Vorheriges Thema"
-
-#: sphinx/templates/layout.html:47
-msgid "previous chapter"
-msgstr "vorheriges Kapitel"
-
-#: sphinx/templates/layout.html:50
-msgid "Next topic"
-msgstr "Nächstes Thema"
-
-#: sphinx/templates/layout.html:51
-msgid "next chapter"
-msgstr "nächstes Kapitel"
-
-#: sphinx/templates/layout.html:55
-msgid "This Page"
-msgstr "Diese Seite"
-
-#: sphinx/templates/layout.html:59
-msgid "Suggest Change"
-msgstr "Änderung vorschlagen"
-
-#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
-msgid "Show Source"
-msgstr "Quelltext anzeigen"
-
-#: sphinx/templates/layout.html:71
-msgid "Quick search"
-msgstr "Schnellsuche"
-
-#: sphinx/templates/layout.html:71
-msgid "Keyword search"
-msgstr "Stichwortsuche"
-
-#: sphinx/templates/layout.html:73
-msgid "Go"
-msgstr "Los"
-
-#: sphinx/templates/layout.html:78
-msgid "Enter a module, class or function name."
-msgstr "Gib einen Modul-, Klassen- oder Funktionsnamen an."
-
-#: sphinx/templates/layout.html:119
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "Suche in %(docstitle)s"
-
-#: sphinx/templates/layout.html:128
-msgid "About these documents"
-msgstr "Ãœber diese Dokumentation"
-
-#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
-#: sphinx/templates/search.html:5
-msgid "Search"
-msgstr "Suche"
-
-#: sphinx/templates/layout.html:133
-msgid "Copyright"
-msgstr "Copyright"
-
-#: sphinx/templates/layout.html:178
-#, python-format
-msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-
-#: sphinx/templates/layout.html:180
-#, python-format
-msgid "&copy; Copyright %(copyright)s."
-msgstr "&copy; Copyright %(copyright)s."
-
-#: sphinx/templates/layout.html:183
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "Zuletzt aktualisiert am %(last_updated)s."
-
-#: sphinx/templates/layout.html:186
-#, python-format
-msgid ""
-"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-msgstr ""
-"Mit <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s "
-"erstellt."
-
-#: sphinx/templates/modindex.html:15
-msgid "Most popular modules:"
-msgstr "Beliebteste Module:"
-
-#: sphinx/templates/modindex.html:24
-msgid "Show modules only available on these platforms"
-msgstr "Zeige nur Module, die auf diesen Plattformen verfügbar sind"
-
-#: sphinx/templates/modindex.html:56
-msgid "Deprecated"
-msgstr "Veraltet"
-
-#: sphinx/templates/opensearch.xml:4
-#, python-format
-msgid "Search %(docstitle)s"
-msgstr "Suche in %(docstitle)s"
-
-#: sphinx/templates/page.html:8
-msgid ""
-"<strong>Note:</strong> You requested an out-of-date URL from this server."
-" We've tried to redirect you to the new location of this page, but it may"
-" not be the right one."
-msgstr ""
-"<strong>Anmerkung:</strong> Du hast eine nicht länger gültige URL von "
-"diesem Server angefragt. Wir haben versucht dich auf die neue Adresse "
-"dieser Seite umzuleiten, aber dies muss nicht die richtige Seite sein."
-
-#: sphinx/templates/search.html:7
-#, fuzzy
-msgid ""
-"From here you can search these documents. Enter your search\n"
-"    words into the box below and click \"search\". Note that the search\n"
-"    function will automatically search for all of the words. Pages\n"
-"    containing fewer words won't appear in the result list."
-msgstr ""
-"Von hier aus kannst du die Dokumentation durchsuchen. Gib deine "
-"Suchbegriffe in das untenstehende Feld ein und klicke auf \"suchen\". "
-"Bitte beachte, dass die Suchfunktion automatisch nach all diesen Worten "
-"suchen wird. Seiten, die nicht alle Worte enthalten, werden nicht in der "
-"Ergebnisliste erscheinen."
-
-#: sphinx/templates/search.html:14
-msgid "search"
-msgstr "suchen"
-
-#: sphinx/templates/search.html:20
-msgid "Your search did not match any results."
-msgstr "Deine Suche ergab leider keine Treffer."
-
-#: sphinx/templates/changes/frameset.html:5
-#: sphinx/templates/changes/versionchanges.html:12
-#, python-format
-msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
-msgstr "Änderungen in Version %(version)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/rstsource.html:5
-#, python-format
-msgid "%(filename)s &mdash; %(docstitle)s"
-msgstr "%(filename)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/versionchanges.html:17
-#, python-format
-msgid "Automatically generated list of changes in version %(version)s"
-msgstr "Automatisch generierte Liste der Änderungen in Version %(version)s"
-
-#: sphinx/templates/changes/versionchanges.html:18
-msgid "Library changes"
-msgstr "Bibliotheksänderungen"
-
-#: sphinx/templates/changes/versionchanges.html:23
-msgid "C API changes"
-msgstr "C API-Änderungen"
-
-#: sphinx/templates/changes/versionchanges.html:25
-msgid "Other changes"
-msgstr "Andere Änderungen"
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-Documentation.addTranslations({"locale": "es", "plural_expr": "(n != 1)", "messages": {"module, in ": "m\u00f3dulo", "Preparing search...": "Preparando la b\u00fasqueda", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "La b\u00fasqueda no dio ning\u00fan resultado.  Por favor aseg\u00farese que escribi\u00f3 todas las palabras correctamente y que ha seleccionado suficientes categor\u00edas", "Search finished, found %s page(s) matching the search query.": "B\u00fasqueda finalizada, se han encontrado %s p\u00e1gina(s) que concuerdan con su consulta", ", in ": "", "Permalink to this headline": "Enlazar permanentemente con este t\u00edtulo", "Searching": "Buscando", "Permalink to this definition": "Enlazar permanentemente con esta definici\u00f3n", "Hide Search Matches": "Coincidencias de la b\u00fasqueda", "Search Results": "Resultados de la b\u00fasqueda"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.mo has changed
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,611 +0,0 @@
-# Spanish translations for Sphinx.
-# Copyright (C) 2008 ORGANIZATION
-# This file is distributed under the same license as the Sphinx project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Sphinx 0.5\n"
-"Report-Msgid-Bugs-To: guillem@torroja.dmt.upm.es\n"
-"POT-Creation-Date: 2008-09-11 23:58+0200\n"
-"PO-Revision-Date: 2008-11-27 18:40+0100\n"
-"Last-Translator: Guillem Borrell <guillem@torroja.dmt.upm.es>\n"
-"Language-Team: es <LL@li.org>\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.4\n"
-
-#: sphinx/builder.py:408
-#, python-format
-msgid "%b %d, %Y"
-msgstr "%d %b, %Y"
-
-#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
-msgid "General Index"
-msgstr "Ãndice General"
-
-#: sphinx/builder.py:427
-msgid "index"
-msgstr "índice"
-
-#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
-#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
-#: sphinx/templates/modindex.html:13
-msgid "Global Module Index"
-msgstr "Ãndice Global de Módulos"
-
-#: sphinx/builder.py:429
-msgid "modules"
-msgstr "módulos"
-
-#: sphinx/builder.py:466
-msgid "next"
-msgstr "siguiente"
-
-#: sphinx/builder.py:473
-msgid "previous"
-msgstr "anterior"
-
-#: sphinx/builder.py:1054
-msgid " (in "
-msgstr ""
-
-#: sphinx/builder.py:1129
-#, fuzzy
-msgid "Builtins"
-msgstr "Funciones de base"
-
-#: sphinx/builder.py:1131
-#, fuzzy
-msgid "Module level"
-msgstr "Módulos"
-
-#: sphinx/environment.py:102 sphinx/latexwriter.py:169
-#, fuzzy, python-format
-msgid "%B %d, %Y"
-msgstr "%d de %B de %Y"
-
-#: sphinx/environment.py:291 sphinx/latexwriter.py:175
-#: sphinx/templates/genindex-single.html:2
-#: sphinx/templates/genindex-split.html:2
-#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
-#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
-#: sphinx/templates/layout.html:130
-msgid "Index"
-msgstr "Ãndice"
-
-#: sphinx/environment.py:292 sphinx/latexwriter.py:174
-msgid "Module Index"
-msgstr "Ãndice de Módulos"
-
-#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
-msgid "Search Page"
-msgstr "Página de Búsqueda"
-
-#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
-msgid "Permalink to this definition"
-msgstr "Enlazar permanentemente con esta definición"
-
-#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
-msgid "Permalink to this headline"
-msgstr "Enlazar permanentemente con este título"
-
-#: sphinx/latexwriter.py:172
-#, fuzzy
-msgid "Release"
-msgstr "Versión"
-
-#: sphinx/roles.py:53 sphinx/directives/desc.py:537
-#, python-format
-msgid "environment variable; %s"
-msgstr "variables de entorno; %s"
-
-#: sphinx/roles.py:60
-#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
-
-#: sphinx/textwriter.py:166
-#, python-format
-msgid "Platform: %s"
-msgstr "Plataforma: %s"
-
-#: sphinx/textwriter.py:422
-msgid "[image]"
-msgstr "[imagen]"
-
-#: sphinx/directives/desc.py:25
-#, fuzzy, python-format
-msgid "%s() (built-in function)"
-msgstr "%s() (función de base)"
-
-#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
-#: sphinx/directives/desc.py:54
-#, python-format
-msgid "%s() (in module %s)"
-msgstr "%s() (en el módulo %s)"
-
-#: sphinx/directives/desc.py:29
-#, fuzzy, python-format
-msgid "%s (built-in variable)"
-msgstr "%s (variable de base)"
-
-#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
-#, python-format
-msgid "%s (in module %s)"
-msgstr "%s (en el módulo %s)"
-
-#: sphinx/directives/desc.py:33
-#, fuzzy, python-format
-msgid "%s (built-in class)"
-msgstr "%s (variable de base)"
-
-#: sphinx/directives/desc.py:34
-#, python-format
-msgid "%s (class in %s)"
-msgstr "%s (clase en %s)"
-
-#: sphinx/directives/desc.py:46
-#, python-format
-msgid "%s() (%s.%s method)"
-msgstr "%s() (%s.%s método)"
-
-#: sphinx/directives/desc.py:48
-#, python-format
-msgid "%s() (%s method)"
-msgstr "%s() (%s método)"
-
-#: sphinx/directives/desc.py:58
-#, python-format
-msgid "%s() (%s.%s static method)"
-msgstr "%s() (%s.%s método estático)"
-
-#: sphinx/directives/desc.py:60
-#, python-format
-msgid "%s() (%s static method)"
-msgstr "%s() (%s método estático)"
-
-#: sphinx/directives/desc.py:70
-#, python-format
-msgid "%s (%s.%s attribute)"
-msgstr "%s (%s.%s atributo)"
-
-#: sphinx/directives/desc.py:72
-#, python-format
-msgid "%s (%s attribute)"
-msgstr "%s (%s atributo)"
-
-#: sphinx/directives/desc.py:74
-#, python-format
-msgid "%s (C function)"
-msgstr "%s (función C)"
-
-#: sphinx/directives/desc.py:76
-#, python-format
-msgid "%s (C member)"
-msgstr "%s (miembro C)"
-
-#: sphinx/directives/desc.py:78
-#, python-format
-msgid "%s (C macro)"
-msgstr "%s (macro C)"
-
-#: sphinx/directives/desc.py:80
-#, python-format
-msgid "%s (C type)"
-msgstr "%s (tipo C)"
-
-#: sphinx/directives/desc.py:82
-#, python-format
-msgid "%s (C variable)"
-msgstr "%s (variable C)"
-
-#: sphinx/directives/desc.py:100
-msgid "Raises"
-msgstr "Muestra"
-
-#: sphinx/directives/desc.py:104
-msgid "Variable"
-msgstr "Variable"
-
-#: sphinx/directives/desc.py:107
-msgid "Returns"
-msgstr "Devuelve"
-
-#: sphinx/directives/desc.py:116
-#, fuzzy
-msgid "Return type"
-msgstr "Tipo del argumento devuelto"
-
-#: sphinx/directives/desc.py:143
-msgid "Parameters"
-msgstr "Parámetros"
-
-#: sphinx/directives/desc.py:423
-#, fuzzy, python-format
-msgid "%scommand line option; %s"
-msgstr "%sOpciones en línea de comandos; %s"
-
-#: sphinx/directives/other.py:101
-msgid "Platforms: "
-msgstr "Plataformas:"
-
-#: sphinx/directives/other.py:106
-#, python-format
-msgid "%s (module)"
-msgstr "%s (módulo)"
-
-#: sphinx/directives/other.py:146
-msgid "Section author: "
-msgstr "Autor de la sección"
-
-#: sphinx/directives/other.py:148
-msgid "Module author: "
-msgstr "Autor del módulo"
-
-#: sphinx/directives/other.py:150
-msgid "Author: "
-msgstr "Autor:"
-
-#: sphinx/directives/other.py:246
-msgid "See also"
-msgstr "Ver también"
-
-#: sphinx/ext/todo.py:31
-msgid "Todo"
-msgstr ""
-
-#: sphinx/ext/todo.py:75
-#, python-format
-msgid "(The original entry is located in %s, line %d and can be found "
-msgstr ""
-
-#: sphinx/ext/todo.py:81
-msgid "here"
-msgstr ""
-
-#: sphinx/locale/__init__.py:15
-msgid "Attention"
-msgstr "Atención"
-
-#: sphinx/locale/__init__.py:16
-msgid "Caution"
-msgstr "Prudencia"
-
-#: sphinx/locale/__init__.py:17
-msgid "Danger"
-msgstr "Peligro"
-
-#: sphinx/locale/__init__.py:18
-msgid "Error"
-msgstr "Error"
-
-#: sphinx/locale/__init__.py:19
-msgid "Hint"
-msgstr "Consejo"
-
-#: sphinx/locale/__init__.py:20
-msgid "Important"
-msgstr "Importante"
-
-#: sphinx/locale/__init__.py:21
-msgid "Note"
-msgstr "Nota"
-
-#: sphinx/locale/__init__.py:22
-msgid "See Also"
-msgstr "Ver También"
-
-#: sphinx/locale/__init__.py:23
-msgid "Tip"
-msgstr "Truco"
-
-#: sphinx/locale/__init__.py:24
-msgid "Warning"
-msgstr "Advertencia"
-
-#: sphinx/locale/__init__.py:28
-#, python-format
-msgid "New in version %s"
-msgstr "Nuevo en la versión %s"
-
-#: sphinx/locale/__init__.py:29
-#, python-format
-msgid "Changed in version %s"
-msgstr "Distinto en la versión %s"
-
-#: sphinx/locale/__init__.py:30
-#, python-format
-msgid "Deprecated since version %s"
-msgstr "Obsoleto desde la versión %s"
-
-#: sphinx/locale/__init__.py:34
-msgid "module"
-msgstr "módulo"
-
-#: sphinx/locale/__init__.py:35
-msgid "keyword"
-msgstr "palabra clave"
-
-#: sphinx/locale/__init__.py:36
-msgid "operator"
-msgstr "operador"
-
-#: sphinx/locale/__init__.py:37
-msgid "object"
-msgstr "objeto"
-
-#: sphinx/locale/__init__.py:38
-msgid "exception"
-msgstr "excepción"
-
-#: sphinx/locale/__init__.py:39
-msgid "statement"
-msgstr "sentencia"
-
-#: sphinx/locale/__init__.py:40
-#, fuzzy
-msgid "built-in function"
-msgstr "función de base"
-
-#: sphinx/static/doctools.js:174
-#, fuzzy
-msgid "Hide Search Matches"
-msgstr "Coincidencias de la búsqueda"
-
-#: sphinx/static/searchtools.js:274
-msgid "Searching"
-msgstr "Buscando"
-
-#: sphinx/static/searchtools.js:279
-msgid "Preparing search..."
-msgstr "Preparando la búsqueda"
-
-#: sphinx/static/searchtools.js:338
-#, fuzzy
-msgid "module, in "
-msgstr "módulo"
-
-#: sphinx/static/searchtools.js:347
-msgid ", in "
-msgstr ""
-
-#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
-msgid "Search Results"
-msgstr "Resultados de la búsqueda"
-
-#: sphinx/static/searchtools.js:449
-msgid ""
-"Your search did not match any documents. Please make sure that all words "
-"are spelled correctly and that you've selected enough categories."
-msgstr ""
-"La búsqueda no dio ningún resultado.  Por favor asegúrese que escribió "
-"todas las palabras correctamente y que ha seleccionado suficientes "
-"categorías"
-
-#: sphinx/static/searchtools.js:451
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr ""
-"Búsqueda finalizada, se han encontrado %s página(s) que concuerdan con su"
-" consulta"
-
-#: sphinx/templates/defindex.html:2
-msgid "Overview"
-msgstr "Resumen"
-
-#: sphinx/templates/defindex.html:11
-msgid "Indices and tables:"
-msgstr "Ãndices y tablas:"
-
-#: sphinx/templates/defindex.html:14
-msgid "Complete Table of Contents"
-msgstr "Ãndice de contenidos completo"
-
-#: sphinx/templates/defindex.html:15
-msgid "lists all sections and subsections"
-msgstr "Muestra todas las secciones"
-
-#: sphinx/templates/defindex.html:17
-msgid "search this documentation"
-msgstr "buscar en esta documentación"
-
-#: sphinx/templates/defindex.html:20
-msgid "quick access to all modules"
-msgstr "acceso rápido a todos los módulos"
-
-#: sphinx/templates/defindex.html:22
-msgid "all functions, classes, terms"
-msgstr "todas las funciones, clases, términos"
-
-#: sphinx/templates/genindex-single.html:5
-#, python-format
-msgid "Index &ndash; %(key)s"
-msgstr "Ãndice &ndash; %(key)s"
-
-#: sphinx/templates/genindex-single.html:44
-#: sphinx/templates/genindex-split.html:14
-#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
-msgid "Full index on one page"
-msgstr "Ãndice completo en una página"
-
-#: sphinx/templates/genindex-split.html:7
-msgid "Index pages by letter"
-msgstr "Ãndice alfabético"
-
-#: sphinx/templates/genindex-split.html:15
-msgid "can be huge"
-msgstr "puede ser muy grande"
-
-#: sphinx/templates/layout.html:9
-msgid "Navigation"
-msgstr "Navegación"
-
-#: sphinx/templates/layout.html:40
-msgid "Table Of Contents"
-msgstr "Contenidos"
-
-#: sphinx/templates/layout.html:46
-msgid "Previous topic"
-msgstr "Tema anterior"
-
-#: sphinx/templates/layout.html:47
-msgid "previous chapter"
-msgstr "Capítulo anterior"
-
-#: sphinx/templates/layout.html:50
-msgid "Next topic"
-msgstr "Próximo tema"
-
-#: sphinx/templates/layout.html:51
-msgid "next chapter"
-msgstr "Próximo capítulo"
-
-#: sphinx/templates/layout.html:55
-msgid "This Page"
-msgstr "Esta página"
-
-#: sphinx/templates/layout.html:59
-msgid "Suggest Change"
-msgstr "Sugerir una modificación"
-
-#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
-msgid "Show Source"
-msgstr "Enseñar el código"
-
-#: sphinx/templates/layout.html:71
-msgid "Quick search"
-msgstr "Búsqueda rápida"
-
-#: sphinx/templates/layout.html:71
-msgid "Keyword search"
-msgstr "Búsqueda por palabras clave"
-
-#: sphinx/templates/layout.html:73
-msgid "Go"
-msgstr "Ir a"
-
-#: sphinx/templates/layout.html:78
-msgid "Enter a module, class or function name."
-msgstr "Introducir en nombre de un módulo, clase o función"
-
-#: sphinx/templates/layout.html:119
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "Buscar en %(docstitle)s"
-
-#: sphinx/templates/layout.html:128
-msgid "About these documents"
-msgstr "Sobre este documento"
-
-#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
-#: sphinx/templates/search.html:5
-msgid "Search"
-msgstr "Búsqueda"
-
-#: sphinx/templates/layout.html:133
-msgid "Copyright"
-msgstr "Copyright"
-
-#: sphinx/templates/layout.html:178
-#, python-format
-msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-msgstr "&copy; <a href=\\\"%(path)s\\\">Copyright</a> %(copyright)s."
-
-#: sphinx/templates/layout.html:180
-#, python-format
-msgid "&copy; Copyright %(copyright)s."
-msgstr "&copy; Copyright %(copyright)s."
-
-#: sphinx/templates/layout.html:183
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "Actualizado por última vez en %(last_updated)s."
-
-#: sphinx/templates/layout.html:186
-#, python-format
-msgid ""
-"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-msgstr ""
-"Creado con <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-
-#: sphinx/templates/modindex.html:15
-msgid "Most popular modules:"
-msgstr "Módulos más comunes:"
-
-#: sphinx/templates/modindex.html:24
-msgid "Show modules only available on these platforms"
-msgstr "Mostrar sólo los módulos disponibles en estas plataformas"
-
-#: sphinx/templates/modindex.html:56
-msgid "Deprecated"
-msgstr "Obsoleto"
-
-#: sphinx/templates/opensearch.xml:4
-#, python-format
-msgid "Search %(docstitle)s"
-msgstr "Buscar en %(docstitle)s"
-
-#: sphinx/templates/page.html:8
-msgid ""
-"<strong>Note:</strong> You requested an out-of-date URL from this server."
-" We've tried to redirect you to the new location of this page, but it may"
-" not be the right one."
-msgstr ""
-"<strong>Nota:</strong> Has solicitado una dirección desactualizada a este"
-" servidor.  Hemos intentado redirigirte a la nueva dirección de la misma "
-"página pero puede no ser la correcta."
-
-#: sphinx/templates/search.html:7
-#, fuzzy
-msgid ""
-"From here you can search these documents. Enter your search\n"
-"    words into the box below and click \"search\". Note that the search\n"
-"    function will automatically search for all of the words. Pages\n"
-"    containing fewer words won't appear in the result list."
-msgstr ""
-"Este es el diálogo de búsqueda.  Introduce los términos en el diálogo "
-"siguiente y pulsa \"buscar\".  El asistente buscará automáticamente todas"
-" las palabras.  Las páginas que contengan menos palabras no aparecerán en"
-" la lista de resultados."
-
-#: sphinx/templates/search.html:14
-msgid "search"
-msgstr "buscar"
-
-#: sphinx/templates/search.html:20
-msgid "Your search did not match any results."
-msgstr "Tu consulta no obtuvo ningún resultado"
-
-#: sphinx/templates/changes/frameset.html:5
-#: sphinx/templates/changes/versionchanges.html:12
-#, python-format
-msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
-msgstr "Cambios en la versión %(version)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/rstsource.html:5
-#, python-format
-msgid "%(filename)s &mdash; %(docstitle)s"
-msgstr "%(filename)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/versionchanges.html:17
-#, python-format
-msgid "Automatically generated list of changes in version %(version)s"
-msgstr "Lista de cambios generada automáticamente en la versión %(version)s"
-
-#: sphinx/templates/changes/versionchanges.html:18
-msgid "Library changes"
-msgstr "Cambios en la biblioteca"
-
-#: sphinx/templates/changes/versionchanges.html:23
-msgid "C API changes"
-msgstr "Cambios en la API C"
-
-#: sphinx/templates/changes/versionchanges.html:25
-msgid "Other changes"
-msgstr "Otros cambios"
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-Documentation.addTranslations({"locale": "fr", "plural_expr": "(n > 1)", "messages": {"module, in ": "module, dans", "Preparing search...": "Pr\u00e9paration de la recherche...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Votre recherche ne correspond \u00e0 aucun document. V\u00e9rifiez l'orthographe des termes de recherche et que vous avez s\u00e9lectionn\u00e9 suffisamment de cat\u00e9gories.", "Search finished, found %s page(s) matching the search query.": "La recherche est termin\u00e9e, %s page(s) correspond(ent) \u00e0 la requ\u00eate.", ", in ": ", dans", "Permalink to this headline": "Lien permanent vers ce titre", "Searching": "En cours de recherche", "Permalink to this definition": "Lien permanent vers cette d\u00e9finition", "Hide Search Matches": "Cacher les r\u00e9sultats de la recherche", "Search Results": "R\u00e9sultats de la recherche"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.mo has changed
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,606 +0,0 @@
-# French translations for Sphinx.
-# Copyright (C) 2008 ORGANIZATION
-# This file is distributed under the same license as the Sphinx project.
-# David Larlet <larlet@gmail.com>, 2008.
-# Sebastien Douche <sdouche@gmail.com>, 2008.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Sphinx 0.5\n"
-"Report-Msgid-Bugs-To: larlet@gmail.com\n"
-"POT-Creation-Date: 2008-08-08 12:39+0000\n"
-"PO-Revision-Date: 2008-11-27 18:40+0100\n"
-"Last-Translator: Sébastien Douche <sdouche@gmail.com>\n"
-"Language-Team: French Translation Team <sphinx-dev@googlegroups.com>\n"
-"Plural-Forms: nplurals=2; plural=(n > 1)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.4\n"
-
-#: sphinx/builder.py:408
-#, python-format
-msgid "%b %d, %Y"
-msgstr "%d %b %Y"
-
-#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
-msgid "General Index"
-msgstr "Index général"
-
-#: sphinx/builder.py:427
-msgid "index"
-msgstr "index"
-
-#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
-#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
-#: sphinx/templates/modindex.html:13
-msgid "Global Module Index"
-msgstr "Index général des modules"
-
-#: sphinx/builder.py:429
-msgid "modules"
-msgstr "modules"
-
-#: sphinx/builder.py:466
-msgid "next"
-msgstr "suivant"
-
-#: sphinx/builder.py:473
-msgid "previous"
-msgstr "précédent"
-
-#: sphinx/builder.py:1054
-msgid " (in "
-msgstr "(dans"
-
-#: sphinx/builder.py:1129
-msgid "Builtins"
-msgstr "Fonctions de base"
-
-#: sphinx/builder.py:1131
-msgid "Module level"
-msgstr "Module"
-
-#: sphinx/environment.py:102 sphinx/latexwriter.py:169
-#, python-format
-msgid "%B %d, %Y"
-msgstr "%d %B %Y"
-
-#: sphinx/environment.py:291 sphinx/latexwriter.py:175
-#: sphinx/templates/genindex-single.html:2
-#: sphinx/templates/genindex-split.html:2
-#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
-#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
-#: sphinx/templates/layout.html:130
-msgid "Index"
-msgstr "Index"
-
-#: sphinx/environment.py:292 sphinx/latexwriter.py:174
-msgid "Module Index"
-msgstr "Index du module"
-
-#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
-msgid "Search Page"
-msgstr "Page de recherche"
-
-#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
-msgid "Permalink to this definition"
-msgstr "Lien permanent vers cette définition"
-
-#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
-msgid "Permalink to this headline"
-msgstr "Lien permanent vers ce titre"
-
-#: sphinx/latexwriter.py:172
-msgid "Release"
-msgstr "Version"
-
-#: sphinx/roles.py:53 sphinx/directives/desc.py:537
-#, python-format
-msgid "environment variable; %s"
-msgstr "variable d'environnement; %s"
-
-#: sphinx/roles.py:60
-#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
-
-#: sphinx/textwriter.py:166
-#, python-format
-msgid "Platform: %s"
-msgstr "Plateforme : %s"
-
-#: sphinx/textwriter.py:422
-msgid "[image]"
-msgstr "[image]"
-
-#: sphinx/directives/desc.py:25
-#, python-format
-msgid "%s() (built-in function)"
-msgstr "%s() (fonction de base)"
-
-#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
-#: sphinx/directives/desc.py:54
-#, python-format
-msgid "%s() (in module %s)"
-msgstr "%s() (dans le module %s)"
-
-#: sphinx/directives/desc.py:29
-#, python-format
-msgid "%s (built-in variable)"
-msgstr "%s (variable de base)"
-
-#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
-#, python-format
-msgid "%s (in module %s)"
-msgstr "%s (dans le module %s)"
-
-#: sphinx/directives/desc.py:33
-#, python-format
-msgid "%s (built-in class)"
-msgstr "%s (classe de base)"
-
-#: sphinx/directives/desc.py:34
-#, python-format
-msgid "%s (class in %s)"
-msgstr "%s (classe dans %s)"
-
-#: sphinx/directives/desc.py:46
-#, python-format
-msgid "%s() (%s.%s method)"
-msgstr "%s() (méthode %s.%s)"
-
-#: sphinx/directives/desc.py:48
-#, python-format
-msgid "%s() (%s method)"
-msgstr "%s() (méthode %s)"
-
-#: sphinx/directives/desc.py:58
-#, python-format
-msgid "%s() (%s.%s static method)"
-msgstr "%s() (méthode statique %s.%s)"
-
-#: sphinx/directives/desc.py:60
-#, python-format
-msgid "%s() (%s static method)"
-msgstr "%s() (méthode statique %s)"
-
-#: sphinx/directives/desc.py:70
-#, python-format
-msgid "%s (%s.%s attribute)"
-msgstr "%s (attribut %s.%s)"
-
-#: sphinx/directives/desc.py:72
-#, python-format
-msgid "%s (%s attribute)"
-msgstr "%s (attribut %s)"
-
-#: sphinx/directives/desc.py:74
-#, python-format
-msgid "%s (C function)"
-msgstr "%s (fonction C)"
-
-#: sphinx/directives/desc.py:76
-#, python-format
-msgid "%s (C member)"
-msgstr "%s (membre C)"
-
-#: sphinx/directives/desc.py:78
-#, python-format
-msgid "%s (C macro)"
-msgstr "%s (macro C)"
-
-#: sphinx/directives/desc.py:80
-#, python-format
-msgid "%s (C type)"
-msgstr "%s (type C)"
-
-#: sphinx/directives/desc.py:82
-#, python-format
-msgid "%s (C variable)"
-msgstr "%s (variable C)"
-
-#: sphinx/directives/desc.py:100
-msgid "Raises"
-msgstr "Lève"
-
-#: sphinx/directives/desc.py:104
-msgid "Variable"
-msgstr "Variable"
-
-#: sphinx/directives/desc.py:107
-msgid "Returns"
-msgstr "Retourne"
-
-#: sphinx/directives/desc.py:116
-msgid "Return type"
-msgstr "Type retourné"
-
-#: sphinx/directives/desc.py:143
-msgid "Parameters"
-msgstr "Paramètres"
-
-#: sphinx/directives/desc.py:423
-#, python-format
-msgid "%scommand line option; %s"
-msgstr "%soption de ligne de commande; %s"
-
-#: sphinx/directives/other.py:101
-msgid "Platforms: "
-msgstr "Plateformes : "
-
-#: sphinx/directives/other.py:106
-#, python-format
-msgid "%s (module)"
-msgstr "%s (module)"
-
-#: sphinx/directives/other.py:146
-msgid "Section author: "
-msgstr "Auteur de la section : "
-
-#: sphinx/directives/other.py:148
-msgid "Module author: "
-msgstr "Auteur du module : "
-
-#: sphinx/directives/other.py:150
-msgid "Author: "
-msgstr "Auteur : "
-
-#: sphinx/directives/other.py:246
-msgid "See also"
-msgstr "Voir aussi"
-
-#: sphinx/ext/todo.py:31
-msgid "Todo"
-msgstr "A faire"
-
-#: sphinx/ext/todo.py:75
-#, python-format
-msgid "(The original entry is located in %s, line %d and can be found "
-msgstr "(L'entrée orginale se trouve dans %s, à la ligne %d et peut être trouvé"
-
-#: sphinx/ext/todo.py:81
-msgid "here"
-msgstr "ici"
-
-#: sphinx/locale/__init__.py:15
-msgid "Attention"
-msgstr "Attention"
-
-#: sphinx/locale/__init__.py:16
-msgid "Caution"
-msgstr "Prudence"
-
-#: sphinx/locale/__init__.py:17
-msgid "Danger"
-msgstr "Danger"
-
-#: sphinx/locale/__init__.py:18
-msgid "Error"
-msgstr "Erreur"
-
-#: sphinx/locale/__init__.py:19
-msgid "Hint"
-msgstr "Indice"
-
-#: sphinx/locale/__init__.py:20
-msgid "Important"
-msgstr "Important"
-
-#: sphinx/locale/__init__.py:21
-msgid "Note"
-msgstr "Note"
-
-#: sphinx/locale/__init__.py:22
-msgid "See Also"
-msgstr "Voir aussi"
-
-#: sphinx/locale/__init__.py:23
-msgid "Tip"
-msgstr "Astuce"
-
-#: sphinx/locale/__init__.py:24
-msgid "Warning"
-msgstr "Warning"
-
-#: sphinx/locale/__init__.py:28
-#, python-format
-msgid "New in version %s"
-msgstr "Introduit dans la version %s"
-
-#: sphinx/locale/__init__.py:29
-#, python-format
-msgid "Changed in version %s"
-msgstr "Modifié dans la version %s"
-
-#: sphinx/locale/__init__.py:30
-#, python-format
-msgid "Deprecated since version %s"
-msgstr "Obsolète depuis la version %s"
-
-#: sphinx/locale/__init__.py:34
-msgid "module"
-msgstr "module"
-
-#: sphinx/locale/__init__.py:35
-msgid "keyword"
-msgstr "mot-clé"
-
-#: sphinx/locale/__init__.py:36
-msgid "operator"
-msgstr "opérateur"
-
-#: sphinx/locale/__init__.py:37
-msgid "object"
-msgstr "objet"
-
-#: sphinx/locale/__init__.py:38
-msgid "exception"
-msgstr "exception"
-
-#: sphinx/locale/__init__.py:39
-msgid "statement"
-msgstr "état"
-
-#: sphinx/locale/__init__.py:40
-msgid "built-in function"
-msgstr "fonction de base"
-
-#: sphinx/static/doctools.js:174
-msgid "Hide Search Matches"
-msgstr "Cacher les résultats de la recherche"
-
-#: sphinx/static/searchtools.js:274
-msgid "Searching"
-msgstr "En cours de recherche"
-
-#: sphinx/static/searchtools.js:279
-msgid "Preparing search..."
-msgstr "Préparation de la recherche..."
-
-#: sphinx/static/searchtools.js:338
-msgid "module, in "
-msgstr "module, dans"
-
-#: sphinx/static/searchtools.js:347
-msgid ", in "
-msgstr ", dans"
-
-#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
-msgid "Search Results"
-msgstr "Résultats de la recherche"
-
-#: sphinx/static/searchtools.js:449
-msgid ""
-"Your search did not match any documents. Please make sure that all words "
-"are spelled correctly and that you've selected enough categories."
-msgstr ""
-"Votre recherche ne correspond à aucun document. Vérifiez l'orthographe "
-"des termes de recherche et que vous avez sélectionné suffisamment de "
-"catégories."
-
-#: sphinx/static/searchtools.js:451
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "La recherche est terminée, %s page(s) correspond(ent) à la requête."
-
-#: sphinx/templates/defindex.html:2
-msgid "Overview"
-msgstr "Résumé"
-
-#: sphinx/templates/defindex.html:11
-msgid "Indices and tables:"
-msgstr "Indices et tables :"
-
-#: sphinx/templates/defindex.html:14
-msgid "Complete Table of Contents"
-msgstr "Table des matières complète"
-
-#: sphinx/templates/defindex.html:15
-msgid "lists all sections and subsections"
-msgstr "lister l'ensemble des sections et sous-sections"
-
-#: sphinx/templates/defindex.html:17
-msgid "search this documentation"
-msgstr "rechercher dans cette documentation"
-
-#: sphinx/templates/defindex.html:20
-msgid "quick access to all modules"
-msgstr "accès rapide à l'ensemble des modules"
-
-#: sphinx/templates/defindex.html:22
-msgid "all functions, classes, terms"
-msgstr "toutes les fonctions, classes, termes"
-
-#: sphinx/templates/genindex-single.html:5
-#, python-format
-msgid "Index &ndash; %(key)s"
-msgstr "Index &ndash; %(key)s"
-
-#: sphinx/templates/genindex-single.html:44
-#: sphinx/templates/genindex-split.html:14
-#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
-msgid "Full index on one page"
-msgstr "Index complet sur une seule page"
-
-#: sphinx/templates/genindex-split.html:7
-msgid "Index pages by letter"
-msgstr "Indexer les pages par lettre"
-
-#: sphinx/templates/genindex-split.html:15
-msgid "can be huge"
-msgstr "peut être énorme"
-
-#: sphinx/templates/layout.html:9
-msgid "Navigation"
-msgstr "Navigation"
-
-#: sphinx/templates/layout.html:40
-msgid "Table Of Contents"
-msgstr "Table des matières"
-
-#: sphinx/templates/layout.html:46
-msgid "Previous topic"
-msgstr "Sujet précédent"
-
-#: sphinx/templates/layout.html:47
-msgid "previous chapter"
-msgstr "Chapitre précédent"
-
-#: sphinx/templates/layout.html:50
-msgid "Next topic"
-msgstr "Sujet suivant"
-
-#: sphinx/templates/layout.html:51
-msgid "next chapter"
-msgstr "Chapitre suivant"
-
-#: sphinx/templates/layout.html:55
-msgid "This Page"
-msgstr "Cette page"
-
-#: sphinx/templates/layout.html:59
-msgid "Suggest Change"
-msgstr "Suggérer une modification"
-
-#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
-msgid "Show Source"
-msgstr "Montrer la source"
-
-#: sphinx/templates/layout.html:71
-msgid "Quick search"
-msgstr "Recherche rapide"
-
-#: sphinx/templates/layout.html:71
-msgid "Keyword search"
-msgstr "Recherche par mot-clé"
-
-#: sphinx/templates/layout.html:73
-msgid "Go"
-msgstr "Go"
-
-#: sphinx/templates/layout.html:78
-msgid "Enter a module, class or function name."
-msgstr "Saisissez un nom de module, classe ou fonction."
-
-#: sphinx/templates/layout.html:119
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "Recherchez dans %(docstitle)s"
-
-#: sphinx/templates/layout.html:128
-msgid "About these documents"
-msgstr "À propos de ces documents"
-
-#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
-#: sphinx/templates/search.html:5
-msgid "Search"
-msgstr "Recherche"
-
-#: sphinx/templates/layout.html:133
-msgid "Copyright"
-msgstr "Copyright"
-
-#: sphinx/templates/layout.html:178
-#, python-format
-msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-
-#: sphinx/templates/layout.html:180
-#, python-format
-msgid "&copy; Copyright %(copyright)s."
-msgstr "&copy; Copyright %(copyright)s."
-
-#: sphinx/templates/layout.html:183
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "Mis à jour le %(last_updated)s."
-
-#: sphinx/templates/layout.html:186
-#, python-format
-msgid ""
-"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-msgstr ""
-"Créé avec <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-
-#: sphinx/templates/modindex.html:15
-msgid "Most popular modules:"
-msgstr "Modules les plus utilisés :"
-
-#: sphinx/templates/modindex.html:24
-msgid "Show modules only available on these platforms"
-msgstr "N'afficher que les modules disponibles sur ces plateformes"
-
-#: sphinx/templates/modindex.html:56
-msgid "Deprecated"
-msgstr "Obsolète"
-
-#: sphinx/templates/opensearch.xml:4
-#, python-format
-msgid "Search %(docstitle)s"
-msgstr "Rechercher %(docstitle)s"
-
-#: sphinx/templates/page.html:8
-msgid ""
-"<strong>Note:</strong> You requested an out-of-date URL from this server."
-" We've tried to redirect you to the new location of this page, but it may"
-" not be the right one."
-msgstr ""
-"<strong>Note :</strong> Vous tentez d'accéder à une ancienne URL de ce "
-"serveur. Nous avons essayé de vous rediriger vers la nouvelle adresse de "
-"cette page, mais ce n'est peut-être pas la bonne."
-
-#: sphinx/templates/search.html:7
-#, fuzzy
-msgid ""
-"From here you can search these documents. Enter your search\n"
-"    words into the box below and click \"search\". Note that the search\n"
-"    function will automatically search for all of the words. Pages\n"
-"    containing fewer words won't appear in the result list."
-msgstr ""
-"Vous pouvez effectuer une recherche au sein des documents. Saisissez les "
-"termes\n"
-"    de votre recherche dans le champs ci-dessous et cliquez sur "
-"\"rechercher\". Notez que la fonctionnalité de recherche\n"
-"    va automatique chercher pour tous les mots. Les pages\n"
-"    contenant moins de mots n'apparaîtront pas dans la liste des "
-"résultats."
-
-#: sphinx/templates/search.html:14
-msgid "search"
-msgstr "rechercher"
-
-#: sphinx/templates/search.html:20
-msgid "Your search did not match any results."
-msgstr "Votre recherche n'a retourné aucun résultat"
-
-#: sphinx/templates/changes/frameset.html:5
-#: sphinx/templates/changes/versionchanges.html:12
-#, python-format
-msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
-msgstr "Modifications dans la version %(version)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/rstsource.html:5
-#, python-format
-msgid "%(filename)s &mdash; %(docstitle)s"
-msgstr "%(filename)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/versionchanges.html:17
-#, python-format
-msgid "Automatically generated list of changes in version %(version)s"
-msgstr "Liste auto-générée des modifications dans la version %(version)s"
-
-#: sphinx/templates/changes/versionchanges.html:18
-msgid "Library changes"
-msgstr "Modifications de la bibliothèque"
-
-#: sphinx/templates/changes/versionchanges.html:23
-msgid "C API changes"
-msgstr "Modifications de l'API C"
-
-#: sphinx/templates/changes/versionchanges.html:25
-msgid "Other changes"
-msgstr "Autres modifications"
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-Documentation.addTranslations({"locale": "ja", "plural_expr": "0", "messages": {"module, in ": "\u30e2\u30b8\u30e5\u30fc\u30eb", "Preparing search...": "\u691c\u7d22\u306e\u6e96\u5099\u4e2d...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u691c\u7d22\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u691c\u7d22\u3057\u305f\u3044\u8a00\u8449\u3092\u6b63\u3057\u3044\u3064\u3065\u308a\u3067\u5165\u529b\u3057\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u307e\u305f\u3001\u6b63\u3057\u3044\u30ab\u30c6\u30b4\u30ea\u306e\u691c\u7d22\u3092\u884c\u3063\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002", "Search finished, found %s page(s) matching the search query.": "\u691c\u7d22\u304c\u7d42\u4e86\u3057\u3001\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30da\u30fc\u30b8\u304c %s \u500b\u307f\u3064\u304b\u308a\u307e\u3057\u305f\u3002", ", in ": "", "Permalink to this headline": "\u3053\u306e\u30d8\u30c3\u30c9\u30e9\u30a4\u30f3\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Searching": "\u691c\u7d22\u4e2d", "Permalink to this definition": "\u3053\u306e\u5b9a\u7fa9\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Hide Search Matches": "\u691c\u7d22\u7d50\u679c\u3092\u96a0\u3059", "Search Results": "\u691c\u7d22\u7d50\u679c"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.mo has changed
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,595 +0,0 @@
-# Japanese translations for Sphinx.
-# Copyright (C) 2008 ORGANIZATION
-# This file is distributed under the same license as the Sphinx project.
-# Yasushi Masuda <whosaysni@gmail.com>, 2008.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Sphinx 0.5\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2008-09-11 23:58+0200\n"
-"PO-Revision-Date: 2008-11-27 18:40+0100\n"
-"Last-Translator: Yasushi MASUDA <whosaysni@gmail.com>\n"
-"Language-Team: ja <LL@li.org>\n"
-"Plural-Forms: nplurals=1; plural=0\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.4\n"
-
-#: sphinx/builder.py:408
-#, python-format
-msgid "%b %d, %Y"
-msgstr "%Y 年 %m 月 %d 日"
-
-#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
-msgid "General Index"
-msgstr "ç·åˆç´¢å¼•"
-
-#: sphinx/builder.py:427
-msgid "index"
-msgstr "索引"
-
-#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
-#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
-#: sphinx/templates/modindex.html:13
-msgid "Global Module Index"
-msgstr "モジュールç·ç´¢å¼•"
-
-#: sphinx/builder.py:429
-msgid "modules"
-msgstr "モジュール"
-
-#: sphinx/builder.py:466
-msgid "next"
-msgstr "次ã¸"
-
-#: sphinx/builder.py:473
-msgid "previous"
-msgstr "å‰ã¸"
-
-#: sphinx/builder.py:1054
-msgid " (in "
-msgstr ""
-
-#: sphinx/builder.py:1129
-msgid "Builtins"
-msgstr "組ã¿è¾¼ã¿"
-
-#: sphinx/builder.py:1131
-msgid "Module level"
-msgstr "モジュールレベル"
-
-#: sphinx/environment.py:102 sphinx/latexwriter.py:169
-#, python-format
-msgid "%B %d, %Y"
-msgstr "%Y 年 %m 月 %d 日"
-
-#: sphinx/environment.py:291 sphinx/latexwriter.py:175
-#: sphinx/templates/genindex-single.html:2
-#: sphinx/templates/genindex-split.html:2
-#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
-#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
-#: sphinx/templates/layout.html:130
-msgid "Index"
-msgstr "索引"
-
-#: sphinx/environment.py:292 sphinx/latexwriter.py:174
-msgid "Module Index"
-msgstr "モジュール索引"
-
-#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
-msgid "Search Page"
-msgstr "検索ページ"
-
-#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
-msgid "Permalink to this definition"
-msgstr "ã“ã®å®šç¾©ã¸ã®ãƒ‘ーマリンク"
-
-#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
-msgid "Permalink to this headline"
-msgstr "ã“ã®ãƒ˜ãƒƒãƒ‰ãƒ©ã‚¤ãƒ³ã¸ã®ãƒ‘ーマリンク"
-
-#: sphinx/latexwriter.py:172
-msgid "Release"
-msgstr "リリース"
-
-#: sphinx/roles.py:53 sphinx/directives/desc.py:537
-#, python-format
-msgid "environment variable; %s"
-msgstr "環境変数; %s"
-
-#: sphinx/roles.py:60
-#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
-
-#: sphinx/textwriter.py:166
-#, python-format
-msgid "Platform: %s"
-msgstr "プラットフォーム: %s"
-
-#: sphinx/textwriter.py:422
-msgid "[image]"
-msgstr "[ç”»åƒ]"
-
-#: sphinx/directives/desc.py:25
-#, python-format
-msgid "%s() (built-in function)"
-msgstr "%s() (組ã¿è¾¼ã¿é–¢æ•°)"
-
-#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
-#: sphinx/directives/desc.py:54
-#, python-format
-msgid "%s() (in module %s)"
-msgstr "%s() (%s モジュール)"
-
-#: sphinx/directives/desc.py:29
-#, python-format
-msgid "%s (built-in variable)"
-msgstr "%s (組ã¿è¾¼ã¿å¤‰æ•°)"
-
-#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
-#, python-format
-msgid "%s (in module %s)"
-msgstr "%s (%s モジュール)"
-
-#: sphinx/directives/desc.py:33
-#, fuzzy, python-format
-msgid "%s (built-in class)"
-msgstr "%s (組ã¿è¾¼ã¿å¤‰æ•°)"
-
-#: sphinx/directives/desc.py:34
-#, python-format
-msgid "%s (class in %s)"
-msgstr "%s (%s ã®ã‚¯ãƒ©ã‚¹)"
-
-#: sphinx/directives/desc.py:46
-#, python-format
-msgid "%s() (%s.%s method)"
-msgstr "%s() (%s.%s ã®ãƒ¡ã‚½ãƒƒãƒ‰)"
-
-#: sphinx/directives/desc.py:48
-#, python-format
-msgid "%s() (%s method)"
-msgstr "%s() (%s ã®ãƒ¡ã‚½ãƒƒãƒ‰)"
-
-#: sphinx/directives/desc.py:58
-#, python-format
-msgid "%s() (%s.%s static method)"
-msgstr "%s() (%s.%s ã®é™çš„メソッド)"
-
-#: sphinx/directives/desc.py:60
-#, python-format
-msgid "%s() (%s static method)"
-msgstr "%s() (%s ã®é™çš„メソッド)"
-
-#: sphinx/directives/desc.py:70
-#, python-format
-msgid "%s (%s.%s attribute)"
-msgstr "%s (%s.%s ã®å±žæ€§)"
-
-#: sphinx/directives/desc.py:72
-#, python-format
-msgid "%s (%s attribute)"
-msgstr "%s (%s ã®å±žæ€§)"
-
-#: sphinx/directives/desc.py:74
-#, python-format
-msgid "%s (C function)"
-msgstr "%s (C ã®é–¢æ•°)"
-
-#: sphinx/directives/desc.py:76
-#, python-format
-msgid "%s (C member)"
-msgstr "%s (C ã®ãƒ¡ãƒ³ãƒå¤‰æ•°)"
-
-#: sphinx/directives/desc.py:78
-#, python-format
-msgid "%s (C macro)"
-msgstr "%s (C ã®ãƒžã‚¯ãƒ­)"
-
-#: sphinx/directives/desc.py:80
-#, python-format
-msgid "%s (C type)"
-msgstr "%s (C ã®ãƒ‡ãƒ¼ã‚¿åž‹)"
-
-#: sphinx/directives/desc.py:82
-#, python-format
-msgid "%s (C variable)"
-msgstr "%s (C ã®å¤‰æ•°)"
-
-#: sphinx/directives/desc.py:100
-msgid "Raises"
-msgstr "例外"
-
-#: sphinx/directives/desc.py:104
-msgid "Variable"
-msgstr "変数"
-
-#: sphinx/directives/desc.py:107
-msgid "Returns"
-msgstr "戻り値"
-
-#: sphinx/directives/desc.py:116
-msgid "Return type"
-msgstr "戻り値ã®åž‹"
-
-#: sphinx/directives/desc.py:143
-msgid "Parameters"
-msgstr "パラメタ"
-
-#: sphinx/directives/desc.py:423
-#, fuzzy, python-format
-msgid "%scommand line option; %s"
-msgstr "%sコマンドラインオプション; %s"
-
-#: sphinx/directives/other.py:101
-msgid "Platforms: "
-msgstr "プラットフォーム: "
-
-#: sphinx/directives/other.py:106
-#, python-format
-msgid "%s (module)"
-msgstr "%s (モジュール)"
-
-#: sphinx/directives/other.py:146
-msgid "Section author: "
-msgstr "ã“ã®ç¯€ã®ä½œè€…: "
-
-#: sphinx/directives/other.py:148
-msgid "Module author: "
-msgstr "モジュールã®ä½œè€…: "
-
-#: sphinx/directives/other.py:150
-msgid "Author: "
-msgstr "作者: "
-
-#: sphinx/directives/other.py:246
-msgid "See also"
-msgstr "å‚考"
-
-#: sphinx/ext/todo.py:31
-msgid "Todo"
-msgstr ""
-
-#: sphinx/ext/todo.py:75
-#, python-format
-msgid "(The original entry is located in %s, line %d and can be found "
-msgstr ""
-
-#: sphinx/ext/todo.py:81
-msgid "here"
-msgstr ""
-
-#: sphinx/locale/__init__.py:15
-msgid "Attention"
-msgstr "注æ„"
-
-#: sphinx/locale/__init__.py:16
-msgid "Caution"
-msgstr "ã”用心"
-
-#: sphinx/locale/__init__.py:17
-msgid "Danger"
-msgstr "å±é™º"
-
-#: sphinx/locale/__init__.py:18
-msgid "Error"
-msgstr "エラー"
-
-#: sphinx/locale/__init__.py:19
-msgid "Hint"
-msgstr "ヒント"
-
-#: sphinx/locale/__init__.py:20
-msgid "Important"
-msgstr "é‡è¦"
-
-#: sphinx/locale/__init__.py:21
-msgid "Note"
-msgstr "ノート"
-
-#: sphinx/locale/__init__.py:22
-msgid "See Also"
-msgstr "å‚考"
-
-#: sphinx/locale/__init__.py:23
-msgid "Tip"
-msgstr "ã¡ãªã¿ã«"
-
-#: sphinx/locale/__init__.py:24
-msgid "Warning"
-msgstr "警告"
-
-#: sphinx/locale/__init__.py:28
-#, python-format
-msgid "New in version %s"
-msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§è¿½åŠ "
-
-#: sphinx/locale/__init__.py:29
-#, python-format
-msgid "Changed in version %s"
-msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§å¤‰æ›´"
-
-#: sphinx/locale/__init__.py:30
-#, python-format
-msgid "Deprecated since version %s"
-msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§æ’¤å»ƒ"
-
-#: sphinx/locale/__init__.py:34
-msgid "module"
-msgstr "モジュール"
-
-#: sphinx/locale/__init__.py:35
-msgid "keyword"
-msgstr "キーワード"
-
-#: sphinx/locale/__init__.py:36
-msgid "operator"
-msgstr "演算å­"
-
-#: sphinx/locale/__init__.py:37
-msgid "object"
-msgstr "オブジェクト"
-
-#: sphinx/locale/__init__.py:38
-msgid "exception"
-msgstr "例外"
-
-#: sphinx/locale/__init__.py:39
-msgid "statement"
-msgstr "æ–‡"
-
-#: sphinx/locale/__init__.py:40
-msgid "built-in function"
-msgstr "組ã¿è¾¼ã¿é–¢æ•°"
-
-#: sphinx/static/doctools.js:174
-msgid "Hide Search Matches"
-msgstr "検索çµæžœã‚’éš ã™"
-
-#: sphinx/static/searchtools.js:274
-msgid "Searching"
-msgstr "検索中"
-
-#: sphinx/static/searchtools.js:279
-msgid "Preparing search..."
-msgstr "検索ã®æº–備中..."
-
-#: sphinx/static/searchtools.js:338
-#, fuzzy
-msgid "module, in "
-msgstr "モジュール"
-
-#: sphinx/static/searchtools.js:347
-msgid ", in "
-msgstr ""
-
-#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
-msgid "Search Results"
-msgstr "検索çµæžœ"
-
-#: sphinx/static/searchtools.js:449
-msgid ""
-"Your search did not match any documents. Please make sure that all words "
-"are spelled correctly and that you've selected enough categories."
-msgstr "検索æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¯ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚検索ã—ãŸã„言葉を正ã—ã„ã¤ã¥ã‚Šã§å…¥åŠ›ã—ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。ã¾ãŸã€æ­£ã—ã„カテゴリã®æ¤œç´¢ã‚’è¡Œã£ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。"
-
-#: sphinx/static/searchtools.js:451
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "検索ãŒçµ‚了ã—ã€æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹ãƒšãƒ¼ã‚¸ãŒ %s 個ã¿ã¤ã‹ã‚Šã¾ã—ãŸã€‚"
-
-#: sphinx/templates/defindex.html:2
-msgid "Overview"
-msgstr "概è¦"
-
-#: sphinx/templates/defindex.html:11
-msgid "Indices and tables:"
-msgstr "索引ã¨è¡¨ä¸€è¦§:"
-
-#: sphinx/templates/defindex.html:14
-msgid "Complete Table of Contents"
-msgstr "ç·åˆç›®æ¬¡"
-
-#: sphinx/templates/defindex.html:15
-msgid "lists all sections and subsections"
-msgstr "ç« ï¼ç¯€ä¸€è¦§"
-
-#: sphinx/templates/defindex.html:17
-msgid "search this documentation"
-msgstr "ドキュメントを検索"
-
-#: sphinx/templates/defindex.html:20
-msgid "quick access to all modules"
-msgstr "全モジュール早見表"
-
-#: sphinx/templates/defindex.html:22
-msgid "all functions, classes, terms"
-msgstr "関数ã€ã‚¯ãƒ©ã‚¹ãŠã‚ˆã³ç”¨èªžç·è¦§"
-
-#: sphinx/templates/genindex-single.html:5
-#, python-format
-msgid "Index &ndash; %(key)s"
-msgstr "索引 &ndash; %(key)s"
-
-#: sphinx/templates/genindex-single.html:44
-#: sphinx/templates/genindex-split.html:14
-#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
-msgid "Full index on one page"
-msgstr "ç·ç´¢å¼•"
-
-#: sphinx/templates/genindex-split.html:7
-msgid "Index pages by letter"
-msgstr "頭文字別索引"
-
-#: sphinx/templates/genindex-split.html:15
-msgid "can be huge"
-msgstr "大ãã„å ´åˆãŒã‚ã‚‹ã®ã§æ³¨æ„"
-
-#: sphinx/templates/layout.html:9
-msgid "Navigation"
-msgstr "ナビゲーション"
-
-#: sphinx/templates/layout.html:40
-msgid "Table Of Contents"
-msgstr "目次"
-
-#: sphinx/templates/layout.html:46
-msgid "Previous topic"
-msgstr "å‰ã®ãƒˆãƒ”ックã¸"
-
-#: sphinx/templates/layout.html:47
-msgid "previous chapter"
-msgstr "å‰ã®ç« ã¸"
-
-#: sphinx/templates/layout.html:50
-msgid "Next topic"
-msgstr "次ã®ãƒˆãƒ”ックã¸"
-
-#: sphinx/templates/layout.html:51
-msgid "next chapter"
-msgstr "次ã®ç« ã¸"
-
-#: sphinx/templates/layout.html:55
-msgid "This Page"
-msgstr "ã“ã®ãƒšãƒ¼ã‚¸"
-
-#: sphinx/templates/layout.html:59
-msgid "Suggest Change"
-msgstr "変更ã®ã‚µã‚¸ã‚§ã‚¹ãƒˆ"
-
-#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
-msgid "Show Source"
-msgstr "ソースコードを表示"
-
-#: sphinx/templates/layout.html:71
-msgid "Quick search"
-msgstr "クイック検索"
-
-#: sphinx/templates/layout.html:71
-msgid "Keyword search"
-msgstr "キーワード検索"
-
-#: sphinx/templates/layout.html:73
-msgid "Go"
-msgstr "検索"
-
-#: sphinx/templates/layout.html:78
-msgid "Enter a module, class or function name."
-msgstr "モジュールã€ã‚¯ãƒ©ã‚¹ã€ã¾ãŸã¯é–¢æ•°åを入力ã—ã¦ãã ã•ã„"
-
-#: sphinx/templates/layout.html:119
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "%(docstitle)s 内を検索"
-
-#: sphinx/templates/layout.html:128
-msgid "About these documents"
-msgstr "ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«ã¤ã„ã¦"
-
-#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
-#: sphinx/templates/search.html:5
-msgid "Search"
-msgstr "検索"
-
-#: sphinx/templates/layout.html:133
-msgid "Copyright"
-msgstr "著作権"
-
-#: sphinx/templates/layout.html:178
-#, python-format
-msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-
-#: sphinx/templates/layout.html:180
-#, python-format
-msgid "&copy; Copyright %(copyright)s."
-msgstr "&copy; Copyright %(copyright)s."
-
-#: sphinx/templates/layout.html:183
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "最終更新: %(last_updated)s"
-
-#: sphinx/templates/layout.html:186
-#, python-format
-msgid ""
-"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-msgstr ""
-"ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¯ <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s ã§ç”Ÿæˆã—ã¾ã—ãŸã€‚"
-
-#: sphinx/templates/modindex.html:15
-msgid "Most popular modules:"
-msgstr "よãå‚ç…§ã•ã‚Œã¦ã„るモジュール:"
-
-#: sphinx/templates/modindex.html:24
-msgid "Show modules only available on these platforms"
-msgstr "ã“ã®ãƒ—ラットフォームã§åˆ©ç”¨å¯èƒ½ãªãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã ã‘を表示ã™ã‚‹"
-
-#: sphinx/templates/modindex.html:56
-msgid "Deprecated"
-msgstr "撤廃"
-
-#: sphinx/templates/opensearch.xml:4
-#, python-format
-msgid "Search %(docstitle)s"
-msgstr "%(docstitle)s 内を検索"
-
-#: sphinx/templates/page.html:8
-msgid ""
-"<strong>Note:</strong> You requested an out-of-date URL from this server."
-" We've tried to redirect you to the new location of this page, but it may"
-" not be the right one."
-msgstr ""
-"<strong>注æ„:</strong> ã‚ãªãŸãŒè¡¨ç¤ºã—よã†ã¨ã—ã¦ã„ã‚‹ã®ã¯å¤ã„ URL ã§ã™ã€‚ã“ã®ãƒšãƒ¼ã‚¸ã«å¯¾å¿œã™ã‚‹æ–°ã—ã„ URL "
-"ã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã‚’試ã¿ã¾ã™ãŒã€é©åˆ‡ãªãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆå…ˆã§ãªã„ã‹ã‚‚ã—ã‚Œãªã„ã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。"
-
-#: sphinx/templates/search.html:7
-#, fuzzy
-msgid ""
-"From here you can search these documents. Enter your search\n"
-"    words into the box below and click \"search\". Note that the search\n"
-"    function will automatically search for all of the words. Pages\n"
-"    containing fewer words won't appear in the result list."
-msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’検索ã§ãã¾ã™ã€‚キーワードを下ã®ãƒœãƒƒã‚¯ã‚¹ã«å…¥åŠ›ã—ã¦ã€ã€Œæ¤œç´¢ã€ã‚’クリックã—ã¦ãã ã•ã„。入力ã•ã‚ŒãŸå…¨ã¦ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’å«ã‚€ãƒšãƒ¼ã‚¸ãŒæ¤œç´¢ã•ã‚Œã¾ã™ã€‚一部ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã—ã‹å«ã¾ãªã„ページã¯æ¤œç´¢çµæžœã«è¡¨ç¤ºã•ã‚Œãªã„ã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。"
-
-#: sphinx/templates/search.html:14
-msgid "search"
-msgstr "検索"
-
-#: sphinx/templates/search.html:20
-msgid "Your search did not match any results."
-msgstr "検索æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹é …ç›®ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
-
-#: sphinx/templates/changes/frameset.html:5
-#: sphinx/templates/changes/versionchanges.html:12
-#, python-format
-msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
-msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %(version)s ã®å¤‰æ›´ç‚¹ &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/rstsource.html:5
-#, python-format
-msgid "%(filename)s &mdash; %(docstitle)s"
-msgstr "%(filename)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/versionchanges.html:17
-#, python-format
-msgid "Automatically generated list of changes in version %(version)s"
-msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %(version)s ã®å¤‰æ›´ç‚¹ï¼ˆã“ã®ãƒªã‚¹ãƒˆã¯è‡ªå‹•ç”Ÿæˆã•ã‚Œã¦ã„ã¾ã™ï¼‰"
-
-#: sphinx/templates/changes/versionchanges.html:18
-msgid "Library changes"
-msgstr "ライブラリã«é–¢ã™ã‚‹å¤‰æ›´"
-
-#: sphinx/templates/changes/versionchanges.html:23
-msgid "C API changes"
-msgstr "C API ã«é–¢ã™ã‚‹å¤‰æ›´"
-
-#: sphinx/templates/changes/versionchanges.html:25
-msgid "Other changes"
-msgstr "ãã®å¤šã®å¤‰æ›´"
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-Documentation.addTranslations({"locale": "nl", "plural_expr": "(n != 1)", "messages": {"module, in ": "module", "Preparing search...": "Het zoeken wordt voorbereid", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Uw zoekopdracht leverde geen resultaten op.  Controleer of alle woordencorrect gespeld zijn en dat u genoeg categori\u00ebn hebt geselecteerd.", "Search finished, found %s page(s) matching the search query.": "Zoeken voltooid, %s pagina(s) gevonden.", ", in ": "", "Permalink to this headline": "Permanente link naar deze titel", "Searching": "Zoeken", "Permalink to this definition": "Permanente link naar deze definitie", "Hide Search Matches": "Zoekresultaten verbergen", "Search Results": "Zoekresultaten"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.mo has changed
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,603 +0,0 @@
-# Copyright (C) 2008 ORGANIZATION
-# This file is distributed under the same license as the Sphinx project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Sphinx 0.5\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2008-09-11 23:58+0200\n"
-"PO-Revision-Date: 2008-11-27 18:40+0100\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: nl <LL@li.org>\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.4\n"
-
-#: sphinx/builder.py:408
-#, python-format
-msgid "%b %d, %Y"
-msgstr "%d.%b.%Y"
-
-#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
-msgid "General Index"
-msgstr "Algemene index"
-
-#: sphinx/builder.py:427
-msgid "index"
-msgstr "Index"
-
-#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
-#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
-#: sphinx/templates/modindex.html:13
-msgid "Global Module Index"
-msgstr "Globale Module-index"
-
-#: sphinx/builder.py:429
-msgid "modules"
-msgstr "modules"
-
-#: sphinx/builder.py:466
-msgid "next"
-msgstr "volgende"
-
-#: sphinx/builder.py:473
-msgid "previous"
-msgstr "vorige"
-
-#: sphinx/builder.py:1054
-msgid " (in "
-msgstr ""
-
-#: sphinx/builder.py:1129
-msgid "Builtins"
-msgstr "Builtins"
-
-#: sphinx/builder.py:1131
-msgid "Module level"
-msgstr "Moduleniveau"
-
-#: sphinx/environment.py:102 sphinx/latexwriter.py:169
-#, python-format
-msgid "%B %d, %Y"
-msgstr "%d. %B %Y"
-
-#: sphinx/environment.py:291 sphinx/latexwriter.py:175
-#: sphinx/templates/genindex-single.html:2
-#: sphinx/templates/genindex-split.html:2
-#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
-#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
-#: sphinx/templates/layout.html:130
-msgid "Index"
-msgstr "Index"
-
-#: sphinx/environment.py:292 sphinx/latexwriter.py:174
-msgid "Module Index"
-msgstr "Module-index"
-
-#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
-msgid "Search Page"
-msgstr "Zoekpagina"
-
-#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
-msgid "Permalink to this definition"
-msgstr "Permanente link naar deze definitie"
-
-#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
-msgid "Permalink to this headline"
-msgstr "Permanente link naar deze titel"
-
-#: sphinx/latexwriter.py:172
-msgid "Release"
-msgstr "Release"
-
-#: sphinx/roles.py:53 sphinx/directives/desc.py:537
-#, python-format
-msgid "environment variable; %s"
-msgstr "Omgevingsvariabele; %s"
-
-#: sphinx/roles.py:60
-#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
-
-#: sphinx/textwriter.py:166
-#, python-format
-msgid "Platform: %s"
-msgstr "Platform: %s"
-
-#: sphinx/textwriter.py:422
-msgid "[image]"
-msgstr "[afbeelding]"
-
-#: sphinx/directives/desc.py:25
-#, python-format
-msgid "%s() (built-in function)"
-msgstr "%s() (geïntegreerde functie)"
-
-#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
-#: sphinx/directives/desc.py:54
-#, python-format
-msgid "%s() (in module %s)"
-msgstr "%s() (in module %s)"
-
-#: sphinx/directives/desc.py:29
-#, python-format
-msgid "%s (built-in variable)"
-msgstr "%s (geïntegreerde variabele)"
-
-#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
-#, python-format
-msgid "%s (in module %s)"
-msgstr "%s (in module %s)"
-
-#: sphinx/directives/desc.py:33
-#, fuzzy, python-format
-msgid "%s (built-in class)"
-msgstr "%s (geïntegreerde variabele)"
-
-#: sphinx/directives/desc.py:34
-#, python-format
-msgid "%s (class in %s)"
-msgstr "%s (klasse in %s)"
-
-#: sphinx/directives/desc.py:46
-#, python-format
-msgid "%s() (%s.%s method)"
-msgstr "%s() (%s.%s methode)"
-
-#: sphinx/directives/desc.py:48
-#, python-format
-msgid "%s() (%s method)"
-msgstr "%s() (%s methode)"
-
-#: sphinx/directives/desc.py:58
-#, python-format
-msgid "%s() (%s.%s static method)"
-msgstr "%s() (%s.%s statische methode)"
-
-#: sphinx/directives/desc.py:60
-#, python-format
-msgid "%s() (%s static method)"
-msgstr "%s() (%s statische methode)"
-
-#: sphinx/directives/desc.py:70
-#, python-format
-msgid "%s (%s.%s attribute)"
-msgstr "%s (%s.%s attribuut)"
-
-#: sphinx/directives/desc.py:72
-#, python-format
-msgid "%s (%s attribute)"
-msgstr "%s (%s attribuut)"
-
-#: sphinx/directives/desc.py:74
-#, python-format
-msgid "%s (C function)"
-msgstr "%s (C-functie)"
-
-#: sphinx/directives/desc.py:76
-#, python-format
-msgid "%s (C member)"
-msgstr "%s (C member)"
-
-#: sphinx/directives/desc.py:78
-#, python-format
-msgid "%s (C macro)"
-msgstr "%s (C-macro)"
-
-#: sphinx/directives/desc.py:80
-#, python-format
-msgid "%s (C type)"
-msgstr "%s (C type)"
-
-#: sphinx/directives/desc.py:82
-#, python-format
-msgid "%s (C variable)"
-msgstr "%s (C-variabele)"
-
-#: sphinx/directives/desc.py:100
-msgid "Raises"
-msgstr "Veroorzaakt"
-
-#: sphinx/directives/desc.py:104
-msgid "Variable"
-msgstr "Variabele"
-
-#: sphinx/directives/desc.py:107
-msgid "Returns"
-msgstr "Returns"
-
-#: sphinx/directives/desc.py:116
-msgid "Return type"
-msgstr "Return type"
-
-#: sphinx/directives/desc.py:143
-msgid "Parameters"
-msgstr "Parameters"
-
-#: sphinx/directives/desc.py:423
-#, fuzzy, python-format
-msgid "%scommand line option; %s"
-msgstr "%scommandolijn optie; %s"
-
-#: sphinx/directives/other.py:101
-msgid "Platforms: "
-msgstr "Platformen: "
-
-#: sphinx/directives/other.py:106
-#, python-format
-msgid "%s (module)"
-msgstr "%s (module)"
-
-#: sphinx/directives/other.py:146
-msgid "Section author: "
-msgstr "Auteur van deze sectie: "
-
-#: sphinx/directives/other.py:148
-msgid "Module author: "
-msgstr "Auteur van deze module: "
-
-#: sphinx/directives/other.py:150
-msgid "Author: "
-msgstr "Auteur: "
-
-#: sphinx/directives/other.py:246
-msgid "See also"
-msgstr "Zie ook"
-
-#: sphinx/ext/todo.py:31
-msgid "Todo"
-msgstr ""
-
-#: sphinx/ext/todo.py:75
-#, python-format
-msgid "(The original entry is located in %s, line %d and can be found "
-msgstr ""
-
-#: sphinx/ext/todo.py:81
-msgid "here"
-msgstr ""
-
-#: sphinx/locale/__init__.py:15
-msgid "Attention"
-msgstr "Let op!"
-
-#: sphinx/locale/__init__.py:16
-msgid "Caution"
-msgstr "Pas op!"
-
-#: sphinx/locale/__init__.py:17
-msgid "Danger"
-msgstr "Gevaar"
-
-#: sphinx/locale/__init__.py:18
-msgid "Error"
-msgstr "Fout"
-
-#: sphinx/locale/__init__.py:19
-msgid "Hint"
-msgstr "Hint"
-
-#: sphinx/locale/__init__.py:20
-msgid "Important"
-msgstr "Belangrijk"
-
-#: sphinx/locale/__init__.py:21
-msgid "Note"
-msgstr "Notitie"
-
-#: sphinx/locale/__init__.py:22
-msgid "See Also"
-msgstr "Zie Ook"
-
-#: sphinx/locale/__init__.py:23
-msgid "Tip"
-msgstr "Tip"
-
-#: sphinx/locale/__init__.py:24
-msgid "Warning"
-msgstr "Waarschuwing"
-
-#: sphinx/locale/__init__.py:28
-#, python-format
-msgid "New in version %s"
-msgstr "Nieuw in versie %s"
-
-#: sphinx/locale/__init__.py:29
-#, python-format
-msgid "Changed in version %s"
-msgstr "Veranderd in versie %s"
-
-#: sphinx/locale/__init__.py:30
-#, python-format
-msgid "Deprecated since version %s"
-msgstr "Verouderd sinds versie %s"
-
-#: sphinx/locale/__init__.py:34
-msgid "module"
-msgstr "module"
-
-#: sphinx/locale/__init__.py:35
-msgid "keyword"
-msgstr "trefwoord"
-
-#: sphinx/locale/__init__.py:36
-msgid "operator"
-msgstr "operator"
-
-#: sphinx/locale/__init__.py:37
-msgid "object"
-msgstr "object"
-
-#: sphinx/locale/__init__.py:38
-msgid "exception"
-msgstr "foutmelding"
-
-#: sphinx/locale/__init__.py:39
-msgid "statement"
-msgstr "statement"
-
-#: sphinx/locale/__init__.py:40
-msgid "built-in function"
-msgstr "geïntegreerde functie"
-
-#: sphinx/static/doctools.js:174
-msgid "Hide Search Matches"
-msgstr "Zoekresultaten verbergen"
-
-#: sphinx/static/searchtools.js:274
-msgid "Searching"
-msgstr "Zoeken"
-
-#: sphinx/static/searchtools.js:279
-msgid "Preparing search..."
-msgstr "Het zoeken wordt voorbereid"
-
-#: sphinx/static/searchtools.js:338
-#, fuzzy
-msgid "module, in "
-msgstr "module"
-
-#: sphinx/static/searchtools.js:347
-msgid ", in "
-msgstr ""
-
-#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
-msgid "Search Results"
-msgstr "Zoekresultaten"
-
-#: sphinx/static/searchtools.js:449
-msgid ""
-"Your search did not match any documents. Please make sure that all words "
-"are spelled correctly and that you've selected enough categories."
-msgstr ""
-"Uw zoekopdracht leverde geen resultaten op.  Controleer of alle "
-"woordencorrect gespeld zijn en dat u genoeg categoriën hebt geselecteerd."
-
-#: sphinx/static/searchtools.js:451
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Zoeken voltooid, %s pagina(s) gevonden."
-
-#: sphinx/templates/defindex.html:2
-msgid "Overview"
-msgstr "Overzicht"
-
-#: sphinx/templates/defindex.html:11
-msgid "Indices and tables:"
-msgstr "Indices en tabellen:"
-
-#: sphinx/templates/defindex.html:14
-msgid "Complete Table of Contents"
-msgstr "Volledige inhoudstafel"
-
-#: sphinx/templates/defindex.html:15
-msgid "lists all sections and subsections"
-msgstr "geeft alle secties en subsecties weer"
-
-#: sphinx/templates/defindex.html:17
-msgid "search this documentation"
-msgstr "zoeken in deze documentatie"
-
-#: sphinx/templates/defindex.html:20
-msgid "quick access to all modules"
-msgstr "sneltoegang naar alle modules"
-
-#: sphinx/templates/defindex.html:22
-msgid "all functions, classes, terms"
-msgstr "alle functies, klasses en begrippen"
-
-#: sphinx/templates/genindex-single.html:5
-#, python-format
-msgid "Index &ndash; %(key)s"
-msgstr "Index &ndash; %(key)s"
-
-#: sphinx/templates/genindex-single.html:44
-#: sphinx/templates/genindex-split.html:14
-#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
-msgid "Full index on one page"
-msgstr "Volledige index op een pagina"
-
-#: sphinx/templates/genindex-split.html:7
-msgid "Index pages by letter"
-msgstr "Index pagineerd per letter"
-
-#: sphinx/templates/genindex-split.html:15
-msgid "can be huge"
-msgstr "kan heel groot zijn"
-
-#: sphinx/templates/layout.html:9
-msgid "Navigation"
-msgstr "Navigatie"
-
-#: sphinx/templates/layout.html:40
-msgid "Table Of Contents"
-msgstr "Inhoudstafel"
-
-#: sphinx/templates/layout.html:46
-msgid "Previous topic"
-msgstr "Vorig onderwerp"
-
-#: sphinx/templates/layout.html:47
-msgid "previous chapter"
-msgstr "Vorig hoofdstuk"
-
-#: sphinx/templates/layout.html:50
-msgid "Next topic"
-msgstr "Volgend onderwerp"
-
-#: sphinx/templates/layout.html:51
-msgid "next chapter"
-msgstr "volgend hoofdstuk"
-
-#: sphinx/templates/layout.html:55
-msgid "This Page"
-msgstr "Deze Pagina"
-
-#: sphinx/templates/layout.html:59
-msgid "Suggest Change"
-msgstr "Wijziging Voorstellen"
-
-#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
-msgid "Show Source"
-msgstr "Broncode weergeven"
-
-#: sphinx/templates/layout.html:71
-msgid "Quick search"
-msgstr "Snel zoeken"
-
-#: sphinx/templates/layout.html:71
-msgid "Keyword search"
-msgstr "Trefwoord opzoeken"
-
-#: sphinx/templates/layout.html:73
-msgid "Go"
-msgstr "Go"
-
-#: sphinx/templates/layout.html:78
-msgid "Enter a module, class or function name."
-msgstr "Geef de naam van een module, klasse of functie."
-
-#: sphinx/templates/layout.html:119
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "Zoeken in %(docstitle)s"
-
-#: sphinx/templates/layout.html:128
-msgid "About these documents"
-msgstr "Over deze documenten"
-
-#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
-#: sphinx/templates/search.html:5
-msgid "Search"
-msgstr "Zoeken"
-
-#: sphinx/templates/layout.html:133
-msgid "Copyright"
-msgstr "Copyright"
-
-#: sphinx/templates/layout.html:178
-#, python-format
-msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-
-#: sphinx/templates/layout.html:180
-#, python-format
-msgid "&copy; Copyright %(copyright)s."
-msgstr "&copy; Copyright %(copyright)s."
-
-#: sphinx/templates/layout.html:183
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "Laatste aanpassing op %(last_updated)s."
-
-#: sphinx/templates/layout.html:186
-#, python-format
-msgid ""
-"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-msgstr ""
-"Aangemaakt met <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-
-#: sphinx/templates/modindex.html:15
-msgid "Most popular modules:"
-msgstr "Populairste modules:"
-
-#: sphinx/templates/modindex.html:24
-msgid "Show modules only available on these platforms"
-msgstr "Enkel modules weergeven die op deze platformen beschikbaar zijn"
-
-#: sphinx/templates/modindex.html:56
-msgid "Deprecated"
-msgstr "Verouderd"
-
-#: sphinx/templates/opensearch.xml:4
-#, python-format
-msgid "Search %(docstitle)s"
-msgstr "Zoeken %(docstitle)s"
-
-#: sphinx/templates/page.html:8
-msgid ""
-"<strong>Note:</strong> You requested an out-of-date URL from this server."
-" We've tried to redirect you to the new location of this page, but it may"
-" not be the right one."
-msgstr ""
-"<strong>Opgelet:</strong> U heeft een verouderde URL aangevraagd op deze "
-"server. Wij hebben probeerd u door te verwijzen naar de nieuwe locatie "
-"van deze pagina,  maar dat is misschien niet gelukt."
-
-#: sphinx/templates/search.html:7
-#, fuzzy
-msgid ""
-"From here you can search these documents. Enter your search\n"
-"    words into the box below and click \"search\". Note that the search\n"
-"    function will automatically search for all of the words. Pages\n"
-"    containing fewer words won't appear in the result list."
-msgstr ""
-"Hier kan u de documenten doorzoeken.  Geef enkele trefwoorden\n"
-"    in het veld hieronder en klik \"zoeken\".  Merk op dat de zoekfunctie"
-"\n"
-"    steeds naar alle woorden zoekt.  Pagina's die minder woorden bevatten"
-"\n"
-"    zullen niet tussen de resultaten verschijnen."
-
-#: sphinx/templates/search.html:14
-msgid "search"
-msgstr "zoeken"
-
-#: sphinx/templates/search.html:20
-msgid "Your search did not match any results."
-msgstr "Uw zoekopdracht leverde geen resultaten op."
-
-#: sphinx/templates/changes/frameset.html:5
-#: sphinx/templates/changes/versionchanges.html:12
-#, python-format
-msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
-msgstr "Veranderingen in versie %(version)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/rstsource.html:5
-#, python-format
-msgid "%(filename)s &mdash; %(docstitle)s"
-msgstr "%(filename)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/versionchanges.html:17
-#, python-format
-msgid "Automatically generated list of changes in version %(version)s"
-msgstr "Automatisch genereerde lijst van veranderingen in versie %(version)s"
-
-#: sphinx/templates/changes/versionchanges.html:18
-msgid "Library changes"
-msgstr "Veranderingen in de bibliotheek"
-
-#: sphinx/templates/changes/versionchanges.html:23
-msgid "C API changes"
-msgstr "Veranderingen in de C-API"
-
-#: sphinx/templates/changes/versionchanges.html:25
-msgid "Other changes"
-msgstr "Andere veranderingen"
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-Documentation.addTranslations({"locale": "pl", "plural_expr": "(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"module, in ": "modu\u0142", "Preparing search...": "Przygotowanie wyszukiwania...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Nie znaleziono \u017cadnych pasuj\u0105cych dokument\u00f3w. Upewnij si\u0119, \u017ce wszystkie s\u0142owa s\u0105 poprawnie wpisane i \u017ce wybra\u0142e\u015b wystarczaj\u0105c\u0105liczb\u0119 kategorii.", "Search finished, found %s page(s) matching the search query.": "Przeszukiwanie zako\u0144czone, znaleziono %s pasuj\u0105cych stron.", ", in ": "", "Permalink to this headline": "Sta\u0142y odno\u015bnik do tego nag\u0142\u00f3wka", "Searching": "Wyszukiwanie", "Permalink to this definition": "Sta\u0142y odno\u015bnik do tej definicji", "Hide Search Matches": "Ukryj wyniki wyszukiwania", "Search Results": "Wyniki wyszukiwania"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.mo has changed
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,600 +0,0 @@
-
-msgid ""
-msgstr ""
-"Project-Id-Version: Sphinx 0.5\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2008-08-10 11:43+0000\n"
-"PO-Revision-Date: 2008-11-27 18:40+0100\n"
-"Last-Translator: Michał Kandulski <Michal.Kandulski@poczta.onet.pl>\n"
-"Language-Team: \n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && "
-"(n%100<10 || n%100>=20) ? 1 : 2)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.4\n"
-
-#: sphinx/builder.py:408
-#, python-format
-msgid "%b %d, %Y"
-msgstr "%b %d %Y"
-
-#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
-msgid "General Index"
-msgstr "Indeks ogólny"
-
-#: sphinx/builder.py:427
-msgid "index"
-msgstr "indeks"
-
-#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
-#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
-#: sphinx/templates/modindex.html:13
-msgid "Global Module Index"
-msgstr "Indeks modułów"
-
-#: sphinx/builder.py:429
-msgid "modules"
-msgstr "moduły"
-
-#: sphinx/builder.py:466
-msgid "next"
-msgstr "dalej"
-
-#: sphinx/builder.py:473
-msgid "previous"
-msgstr "wstecz"
-
-#: sphinx/builder.py:1054
-msgid " (in "
-msgstr ""
-
-#: sphinx/builder.py:1129
-msgid "Builtins"
-msgstr "Wbudowane"
-
-#: sphinx/builder.py:1131
-msgid "Module level"
-msgstr "Poziom modułu"
-
-#: sphinx/environment.py:102 sphinx/latexwriter.py:169
-#, python-format
-msgid "%B %d, %Y"
-msgstr "%B %d %Y"
-
-#: sphinx/environment.py:291 sphinx/latexwriter.py:175
-#: sphinx/templates/genindex-single.html:2
-#: sphinx/templates/genindex-split.html:2
-#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
-#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
-#: sphinx/templates/layout.html:130
-msgid "Index"
-msgstr "Indeks"
-
-#: sphinx/environment.py:292 sphinx/latexwriter.py:174
-msgid "Module Index"
-msgstr "Indeks modułów"
-
-#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
-msgid "Search Page"
-msgstr "Wyszukiwanie"
-
-#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
-msgid "Permalink to this definition"
-msgstr "Stały odnośnik do tej definicji"
-
-#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
-msgid "Permalink to this headline"
-msgstr "Stały odnośnik do tego nagłówka"
-
-#: sphinx/latexwriter.py:172
-msgid "Release"
-msgstr "Wydanie"
-
-#: sphinx/roles.py:53 sphinx/directives/desc.py:537
-#, python-format
-msgid "environment variable; %s"
-msgstr "zmienna środowiskowa; %s"
-
-#: sphinx/roles.py:60
-#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
-
-#: sphinx/textwriter.py:166
-#, python-format
-msgid "Platform: %s"
-msgstr "Platforma: %s"
-
-#: sphinx/textwriter.py:422
-msgid "[image]"
-msgstr "[obrazek]"
-
-#: sphinx/directives/desc.py:25
-#, python-format
-msgid "%s() (built-in function)"
-msgstr "%s() (funkcja wbudowana)"
-
-#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
-#: sphinx/directives/desc.py:54
-#, python-format
-msgid "%s() (in module %s)"
-msgstr "%s() (w module %s)"
-
-#: sphinx/directives/desc.py:29
-#, python-format
-msgid "%s (built-in variable)"
-msgstr "%s (zmienna wbudowana)"
-
-#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
-#, python-format
-msgid "%s (in module %s)"
-msgstr "%s (w module %s)"
-
-#: sphinx/directives/desc.py:33
-#, fuzzy, python-format
-msgid "%s (built-in class)"
-msgstr "%s (zmienna wbudowana)"
-
-#: sphinx/directives/desc.py:34
-#, python-format
-msgid "%s (class in %s)"
-msgstr "%s (w klasie %s)"
-
-#: sphinx/directives/desc.py:46
-#, python-format
-msgid "%s() (%s.%s method)"
-msgstr "%s() (%s.%s metoda)"
-
-#: sphinx/directives/desc.py:48
-#, python-format
-msgid "%s() (%s method)"
-msgstr "%s() (%s metoda)"
-
-#: sphinx/directives/desc.py:58
-#, python-format
-msgid "%s() (%s.%s static method)"
-msgstr "%s() (%s.%s statyczna metoda)"
-
-#: sphinx/directives/desc.py:60
-#, python-format
-msgid "%s() (%s static method)"
-msgstr "%s() (%s statyczna metoda)"
-
-#: sphinx/directives/desc.py:70
-#, python-format
-msgid "%s (%s.%s attribute)"
-msgstr "%s (%s.%s atrybut)"
-
-#: sphinx/directives/desc.py:72
-#, python-format
-msgid "%s (%s attribute)"
-msgstr "%s (%s atrybut)"
-
-#: sphinx/directives/desc.py:74
-#, python-format
-msgid "%s (C function)"
-msgstr "%s (funkcja C)"
-
-#: sphinx/directives/desc.py:76
-#, python-format
-msgid "%s (C member)"
-msgstr "%s (pole C)"
-
-#: sphinx/directives/desc.py:78
-#, python-format
-msgid "%s (C macro)"
-msgstr "%s (makro C)"
-
-#: sphinx/directives/desc.py:80
-#, python-format
-msgid "%s (C type)"
-msgstr "%s (typ C)"
-
-#: sphinx/directives/desc.py:82
-#, python-format
-msgid "%s (C variable)"
-msgstr "%s (zmienna C)"
-
-#: sphinx/directives/desc.py:100
-msgid "Raises"
-msgstr "Wyrzuca"
-
-#: sphinx/directives/desc.py:104
-msgid "Variable"
-msgstr "Zmienna"
-
-#: sphinx/directives/desc.py:107
-msgid "Returns"
-msgstr "Zwraca"
-
-#: sphinx/directives/desc.py:116
-msgid "Return type"
-msgstr "Typ zwracany"
-
-#: sphinx/directives/desc.py:143
-msgid "Parameters"
-msgstr "Parametry"
-
-#: sphinx/directives/desc.py:423
-#, fuzzy, python-format
-msgid "%scommand line option; %s"
-msgstr "%sopcja linii komend; %s"
-
-#: sphinx/directives/other.py:101
-msgid "Platforms: "
-msgstr "Platformy: "
-
-#: sphinx/directives/other.py:106
-#, python-format
-msgid "%s (module)"
-msgstr "%s (moduł)"
-
-#: sphinx/directives/other.py:146
-msgid "Section author: "
-msgstr "Autor rozdziału: "
-
-#: sphinx/directives/other.py:148
-msgid "Module author: "
-msgstr "Autor modułu: "
-
-#: sphinx/directives/other.py:150
-msgid "Author: "
-msgstr "Autor: "
-
-#: sphinx/directives/other.py:246
-msgid "See also"
-msgstr "Zobacz także"
-
-#: sphinx/ext/todo.py:31
-msgid "Todo"
-msgstr ""
-
-#: sphinx/ext/todo.py:75
-#, python-format
-msgid "(The original entry is located in %s, line %d and can be found "
-msgstr ""
-
-#: sphinx/ext/todo.py:81
-msgid "here"
-msgstr ""
-
-#: sphinx/locale/__init__.py:15
-msgid "Attention"
-msgstr "Uwaga"
-
-#: sphinx/locale/__init__.py:16
-msgid "Caution"
-msgstr "Ostrożnie"
-
-#: sphinx/locale/__init__.py:17
-msgid "Danger"
-msgstr "Niebezpieczeństwo"
-
-#: sphinx/locale/__init__.py:18
-msgid "Error"
-msgstr "BÅ‚Ä…d"
-
-#: sphinx/locale/__init__.py:19
-msgid "Hint"
-msgstr "Podpowiedź"
-
-#: sphinx/locale/__init__.py:20
-msgid "Important"
-msgstr "Ważne"
-
-#: sphinx/locale/__init__.py:21
-msgid "Note"
-msgstr "Uwaga"
-
-#: sphinx/locale/__init__.py:22
-msgid "See Also"
-msgstr "Zobacz także"
-
-#: sphinx/locale/__init__.py:23
-msgid "Tip"
-msgstr "Wskazówka"
-
-#: sphinx/locale/__init__.py:24
-msgid "Warning"
-msgstr "Ostrzeżenie"
-
-#: sphinx/locale/__init__.py:28
-#, python-format
-msgid "New in version %s"
-msgstr "Nowe w wersji %s"
-
-#: sphinx/locale/__init__.py:29
-#, python-format
-msgid "Changed in version %s"
-msgstr "Zmienione w wersji %s"
-
-#: sphinx/locale/__init__.py:30
-#, python-format
-msgid "Deprecated since version %s"
-msgstr "Niezalecane od wersji %s"
-
-#: sphinx/locale/__init__.py:34
-msgid "module"
-msgstr "moduł"
-
-#: sphinx/locale/__init__.py:35
-msgid "keyword"
-msgstr "słowo kluczowe"
-
-#: sphinx/locale/__init__.py:36
-msgid "operator"
-msgstr "operator"
-
-#: sphinx/locale/__init__.py:37
-msgid "object"
-msgstr "obiekt"
-
-#: sphinx/locale/__init__.py:38
-msgid "exception"
-msgstr "wyjÄ…tek"
-
-#: sphinx/locale/__init__.py:39
-msgid "statement"
-msgstr "instrukcja"
-
-#: sphinx/locale/__init__.py:40
-msgid "built-in function"
-msgstr "funkcja wbudowana"
-
-#: sphinx/static/doctools.js:174
-msgid "Hide Search Matches"
-msgstr "Ukryj wyniki wyszukiwania"
-
-#: sphinx/static/searchtools.js:274
-msgid "Searching"
-msgstr "Wyszukiwanie"
-
-#: sphinx/static/searchtools.js:279
-msgid "Preparing search..."
-msgstr "Przygotowanie wyszukiwania..."
-
-#: sphinx/static/searchtools.js:338
-#, fuzzy
-msgid "module, in "
-msgstr "moduł"
-
-#: sphinx/static/searchtools.js:347
-msgid ", in "
-msgstr ""
-
-#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
-msgid "Search Results"
-msgstr "Wyniki wyszukiwania"
-
-#: sphinx/static/searchtools.js:449
-msgid ""
-"Your search did not match any documents. Please make sure that all words "
-"are spelled correctly and that you've selected enough categories."
-msgstr ""
-"Nie znaleziono żadnych pasujących dokumentów. Upewnij się, że wszystkie "
-"słowa są poprawnie wpisane i że wybrałeś wystarczającąliczbę kategorii."
-
-#: sphinx/static/searchtools.js:451
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Przeszukiwanie zakończone, znaleziono %s pasujących stron."
-
-#: sphinx/templates/defindex.html:2
-msgid "Overview"
-msgstr "PrzeglÄ…d"
-
-#: sphinx/templates/defindex.html:11
-msgid "Indices and tables:"
-msgstr "Indeksy i tablice:"
-
-#: sphinx/templates/defindex.html:14
-msgid "Complete Table of Contents"
-msgstr "Kompletny spis treści"
-
-#: sphinx/templates/defindex.html:15
-msgid "lists all sections and subsections"
-msgstr "wymień wszystkie rozdziały i podrozdziały"
-
-#: sphinx/templates/defindex.html:17
-msgid "search this documentation"
-msgstr "wyszukaj w dokumentacji"
-
-#: sphinx/templates/defindex.html:20
-msgid "quick access to all modules"
-msgstr "szybki dostęp do wszystkich modułów"
-
-#: sphinx/templates/defindex.html:22
-msgid "all functions, classes, terms"
-msgstr "wszystkie funkcje, klasy, terminy"
-
-#: sphinx/templates/genindex-single.html:5
-#, python-format
-msgid "Index &ndash; %(key)s"
-msgstr "Indeks &ndash; %(key)s"
-
-#: sphinx/templates/genindex-single.html:44
-#: sphinx/templates/genindex-split.html:14
-#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
-msgid "Full index on one page"
-msgstr "Cały indeks na jednej stronie"
-
-#: sphinx/templates/genindex-split.html:7
-msgid "Index pages by letter"
-msgstr "Strony indeksu alfabetycznie"
-
-#: sphinx/templates/genindex-split.html:15
-msgid "can be huge"
-msgstr "może być ogromny"
-
-#: sphinx/templates/layout.html:9
-msgid "Navigation"
-msgstr "Nawigacja"
-
-#: sphinx/templates/layout.html:40
-msgid "Table Of Contents"
-msgstr "Spis treści"
-
-#: sphinx/templates/layout.html:46
-msgid "Previous topic"
-msgstr "Poprzedni temat"
-
-#: sphinx/templates/layout.html:47
-msgid "previous chapter"
-msgstr "poprzedni rozdział"
-
-#: sphinx/templates/layout.html:50
-msgid "Next topic"
-msgstr "Następny temat"
-
-#: sphinx/templates/layout.html:51
-msgid "next chapter"
-msgstr "następny rozdział"
-
-#: sphinx/templates/layout.html:55
-msgid "This Page"
-msgstr "Ta strona"
-
-#: sphinx/templates/layout.html:59
-msgid "Suggest Change"
-msgstr "Zasugeruj zmianÄ™"
-
-#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
-msgid "Show Source"
-msgstr "Pokaż źródło"
-
-#: sphinx/templates/layout.html:71
-msgid "Quick search"
-msgstr "Szybkie wyszukiwanie"
-
-#: sphinx/templates/layout.html:71
-msgid "Keyword search"
-msgstr "Szukanie wg słowa kluczowego"
-
-#: sphinx/templates/layout.html:73
-msgid "Go"
-msgstr "Szukaj"
-
-#: sphinx/templates/layout.html:78
-msgid "Enter a module, class or function name."
-msgstr "Wprowadź nazwę modułu, klasy lub funkcji."
-
-#: sphinx/templates/layout.html:119
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "Szukaj pośród %(docstitle)s"
-
-#: sphinx/templates/layout.html:128
-msgid "About these documents"
-msgstr "O tych dokumentach"
-
-#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
-#: sphinx/templates/search.html:5
-msgid "Search"
-msgstr "Szukaj"
-
-#: sphinx/templates/layout.html:133
-msgid "Copyright"
-msgstr "Copyright"
-
-#: sphinx/templates/layout.html:178
-#, python-format
-msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-
-#: sphinx/templates/layout.html:180
-#, python-format
-msgid "&copy; Copyright %(copyright)s."
-msgstr "&copy; Copyright %(copyright)s."
-
-#: sphinx/templates/layout.html:183
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "Ostatnia modyfikacja %(last_updated)s."
-
-#: sphinx/templates/layout.html:186
-#, python-format
-msgid ""
-"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-msgstr ""
-"Utworzone przy pomocy <a href=\"http://sphinx.pocoo.org/\">Sphinx</a>'a "
-"%(sphinx_version)s."
-
-#: sphinx/templates/modindex.html:15
-msgid "Most popular modules:"
-msgstr "Najbardziej popularne moduły:"
-
-#: sphinx/templates/modindex.html:24
-msgid "Show modules only available on these platforms"
-msgstr "Pokaż moduły dostępne tylko na tych platformach"
-
-#: sphinx/templates/modindex.html:56
-msgid "Deprecated"
-msgstr "Niezalecane"
-
-#: sphinx/templates/opensearch.xml:4
-#, python-format
-msgid "Search %(docstitle)s"
-msgstr "Przeszukaj %(docstitle)s"
-
-#: sphinx/templates/page.html:8
-msgid ""
-"<strong>Note:</strong> You requested an out-of-date URL from this server."
-" We've tried to redirect you to the new location of this page, but it may"
-" not be the right one."
-msgstr ""
-"<strong>Uwaga:</strong> Zażądano przedawnionego URL'a z tego serwera. "
-"Nastąpiła próba przekierowania do nowej lokalizacji, ale może ona być "
-"niewłaściwa."
-
-#: sphinx/templates/search.html:7
-#, fuzzy
-msgid ""
-"From here you can search these documents. Enter your search\n"
-"    words into the box below and click \"search\". Note that the search\n"
-"    function will automatically search for all of the words. Pages\n"
-"    containing fewer words won't appear in the result list."
-msgstr ""
-"Stąd możesz przeszukać dokumentację. Wprowadź szukane\n"
-"    słowa w poniższym okienku i kliknij \"Szukaj\". Zwróć uwagę, że\n"
-"    funkcja szukająca będzie automatycznie szukała wszystkich słów.     "
-"Strony nie zawierające wszystkich słów nie znajdą się na wynikowej     "
-"liście."
-
-#: sphinx/templates/search.html:14
-msgid "search"
-msgstr "Szukaj"
-
-#: sphinx/templates/search.html:20
-msgid "Your search did not match any results."
-msgstr "Nie znaleziono żadnych pasujących stron."
-
-#: sphinx/templates/changes/frameset.html:5
-#: sphinx/templates/changes/versionchanges.html:12
-#, python-format
-msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
-msgstr "Zmiany w wesji %(version)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/rstsource.html:5
-#, python-format
-msgid "%(filename)s &mdash; %(docstitle)s"
-msgstr "%(filename)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/versionchanges.html:17
-#, python-format
-msgid "Automatically generated list of changes in version %(version)s"
-msgstr "Automatycznie wygenerowana lista zmian w wersji %(version)s"
-
-#: sphinx/templates/changes/versionchanges.html:18
-msgid "Library changes"
-msgstr "Zmiany w bibliotekach"
-
-#: sphinx/templates/changes/versionchanges.html:23
-msgid "C API changes"
-msgstr "Zmiany w C API"
-
-#: sphinx/templates/changes/versionchanges.html:25
-msgid "Other changes"
-msgstr "Inne zmiany"
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-Documentation.addTranslations({"locale": "pt_BR", "plural_expr": "(n > 1)", "messages": {"module, in ": "m\u00f3dulo, em ", "Preparing search...": "Preparando pesquisa...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Sua pesquisa n\u00e3o encontrou nenhum documento. Por favor assegure-se de que todas as palavras foram digitadas corretamente e de que voc\u00ea tenha selecionado o m\u00ednimo de categorias.", "Search finished, found %s page(s) matching the search query.": "Pesquisa finalizada, foram encontrada(s) %s p\u00e1gina(s) que conferem com o crit\u00e9rio de pesquisa.", ", in ": ", em ", "Permalink to this headline": "Link permanente para este t\u00edtulo", "Searching": "Pesquisando", "Permalink to this definition": "Link permanente para esta defini\u00e7\u00e3o", "Hide Search Matches": "Esconder Resultados da Pesquisa", "Search Results": "Resultados da Pesquisa"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo has changed
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,606 +0,0 @@
-# Portuguese (Brazil) translations for Sphinx.
-# Copyright (C) 2008 ORGANIZATION
-# This file is distributed under the same license as the Sphinx project.
-# FIRST AUTHOR <roger.demetrescu@gmail.com>, 2008.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Sphinx 0.5\n"
-"Report-Msgid-Bugs-To: roger.demetrescu@gmail.com\n"
-"POT-Creation-Date: 2008-11-09 19:46+0100\n"
-"PO-Revision-Date: 2008-11-27 18:40+0100\n"
-"Last-Translator: Roger Demetrescu <roger.demetrescu@gmail.com>\n"
-"Language-Team: pt_BR <roger.demetrescu@gmail.com>\n"
-"Plural-Forms: nplurals=2; plural=(n > 1)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.4\n"
-
-#: sphinx/builder.py:408
-#, python-format
-msgid "%b %d, %Y"
-msgstr "%d/%m/%Y"
-
-#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
-msgid "General Index"
-msgstr "Ãndice Geral"
-
-#: sphinx/builder.py:427
-msgid "index"
-msgstr "índice"
-
-#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
-#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
-#: sphinx/templates/modindex.html:13
-msgid "Global Module Index"
-msgstr "Ãndice Global de Módulos"
-
-#: sphinx/builder.py:429
-msgid "modules"
-msgstr "módulos"
-
-#: sphinx/builder.py:466
-msgid "next"
-msgstr "próximo"
-
-#: sphinx/builder.py:473
-msgid "previous"
-msgstr "anterior"
-
-#: sphinx/builder.py:1054
-msgid " (in "
-msgstr " (em "
-
-#: sphinx/builder.py:1129
-msgid "Builtins"
-msgstr "Internos"
-
-#: sphinx/builder.py:1131
-msgid "Module level"
-msgstr "Módulo"
-
-#: sphinx/environment.py:102 sphinx/latexwriter.py:169
-#, python-format
-msgid "%B %d, %Y"
-msgstr "%d/%m/%Y"
-
-#: sphinx/environment.py:291 sphinx/latexwriter.py:175
-#: sphinx/templates/genindex-single.html:2
-#: sphinx/templates/genindex-split.html:2
-#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
-#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
-#: sphinx/templates/layout.html:130
-msgid "Index"
-msgstr "Ãndice"
-
-#: sphinx/environment.py:292 sphinx/latexwriter.py:174
-msgid "Module Index"
-msgstr "Ãndice do Módulo"
-
-#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
-msgid "Search Page"
-msgstr "Página de Pesquisa"
-
-#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
-msgid "Permalink to this definition"
-msgstr "Link permanente para esta definição"
-
-#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
-msgid "Permalink to this headline"
-msgstr "Link permanente para este título"
-
-#: sphinx/latexwriter.py:172
-msgid "Release"
-msgstr "Versão"
-
-#: sphinx/roles.py:53 sphinx/directives/desc.py:537
-#, python-format
-msgid "environment variable; %s"
-msgstr "váriavel de ambiente; %s"
-
-#: sphinx/roles.py:60
-#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
-
-#: sphinx/textwriter.py:166
-#, python-format
-msgid "Platform: %s"
-msgstr "Plataforma: %s"
-
-#: sphinx/textwriter.py:422
-msgid "[image]"
-msgstr "[imagem]"
-
-#: sphinx/directives/desc.py:25
-#, python-format
-msgid "%s() (built-in function)"
-msgstr "%s() (função interna)"
-
-#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
-#: sphinx/directives/desc.py:54
-#, python-format
-msgid "%s() (in module %s)"
-msgstr "%s() (no módulo %s)"
-
-#: sphinx/directives/desc.py:29
-#, python-format
-msgid "%s (built-in variable)"
-msgstr "%s (variável interna)"
-
-#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
-#, python-format
-msgid "%s (in module %s)"
-msgstr "%s (no módulo %s)"
-
-#: sphinx/directives/desc.py:33
-#, python-format
-msgid "%s (built-in class)"
-msgstr "%s (classe interna)"
-
-#: sphinx/directives/desc.py:34
-#, python-format
-msgid "%s (class in %s)"
-msgstr "%s (classe em %s)"
-
-#: sphinx/directives/desc.py:46
-#, python-format
-msgid "%s() (%s.%s method)"
-msgstr "%s() (método %s.%s)"
-
-#: sphinx/directives/desc.py:48
-#, python-format
-msgid "%s() (%s method)"
-msgstr "%s() (método %s)"
-
-#: sphinx/directives/desc.py:58
-#, python-format
-msgid "%s() (%s.%s static method)"
-msgstr "%s() (método estático %s.%s)"
-
-#: sphinx/directives/desc.py:60
-#, python-format
-msgid "%s() (%s static method)"
-msgstr "%s() (método estático %s)"
-
-#: sphinx/directives/desc.py:70
-#, python-format
-msgid "%s (%s.%s attribute)"
-msgstr "%s (atributo %s.%s)"
-
-#: sphinx/directives/desc.py:72
-#, python-format
-msgid "%s (%s attribute)"
-msgstr "%s (atributo %s)"
-
-#: sphinx/directives/desc.py:74
-#, python-format
-msgid "%s (C function)"
-msgstr "%s (função C)"
-
-#: sphinx/directives/desc.py:76
-#, python-format
-msgid "%s (C member)"
-msgstr "%s (membro C)"
-
-#: sphinx/directives/desc.py:78
-#, python-format
-msgid "%s (C macro)"
-msgstr "%s (macro C)"
-
-#: sphinx/directives/desc.py:80
-#, python-format
-msgid "%s (C type)"
-msgstr "%s (tipo C)"
-
-#: sphinx/directives/desc.py:82
-#, python-format
-msgid "%s (C variable)"
-msgstr "%s (variável C)"
-
-#: sphinx/directives/desc.py:100
-msgid "Raises"
-msgstr "Levanta"
-
-#: sphinx/directives/desc.py:104
-msgid "Variable"
-msgstr "Variável"
-
-#: sphinx/directives/desc.py:107
-msgid "Returns"
-msgstr "Retorna"
-
-#: sphinx/directives/desc.py:116
-msgid "Return type"
-msgstr "Tipo de retorno"
-
-#: sphinx/directives/desc.py:143
-msgid "Parameters"
-msgstr "Parâmetros"
-
-#: sphinx/directives/desc.py:423
-#, python-format
-msgid "%scommand line option; %s"
-msgstr "%sopção de linha de comando; %s"
-
-#: sphinx/directives/other.py:101
-msgid "Platforms: "
-msgstr "Plataformas: "
-
-#: sphinx/directives/other.py:106
-#, python-format
-msgid "%s (module)"
-msgstr "%s (módulo)"
-
-#: sphinx/directives/other.py:146
-msgid "Section author: "
-msgstr "Autor da seção: "
-
-#: sphinx/directives/other.py:148
-msgid "Module author: "
-msgstr "Autor do módulo: "
-
-#: sphinx/directives/other.py:150
-msgid "Author: "
-msgstr "Autor: "
-
-#: sphinx/directives/other.py:246
-msgid "See also"
-msgstr "Veja também"
-
-#: sphinx/ext/todo.py:31
-msgid "Todo"
-msgstr "Por fazer"
-
-#: sphinx/ext/todo.py:75
-#, python-format
-msgid "(The original entry is located in %s, line %d and can be found "
-msgstr "(A entrada original está localizada em %s, linha %d e pode ser encontrada "
-
-#: sphinx/ext/todo.py:81
-msgid "here"
-msgstr "aqui"
-
-#: sphinx/locale/__init__.py:15
-msgid "Attention"
-msgstr "Atenção"
-
-#: sphinx/locale/__init__.py:16
-msgid "Caution"
-msgstr "Cuidado"
-
-#: sphinx/locale/__init__.py:17
-msgid "Danger"
-msgstr "Perigo"
-
-#: sphinx/locale/__init__.py:18
-msgid "Error"
-msgstr "Erro"
-
-#: sphinx/locale/__init__.py:19
-msgid "Hint"
-msgstr "Dica"
-
-#: sphinx/locale/__init__.py:20
-msgid "Important"
-msgstr "Importante"
-
-#: sphinx/locale/__init__.py:21
-msgid "Note"
-msgstr "Nota"
-
-#: sphinx/locale/__init__.py:22
-msgid "See Also"
-msgstr "Veja Também"
-
-#: sphinx/locale/__init__.py:23
-msgid "Tip"
-msgstr "Dica"
-
-#: sphinx/locale/__init__.py:24
-msgid "Warning"
-msgstr "Aviso"
-
-#: sphinx/locale/__init__.py:28
-#, python-format
-msgid "New in version %s"
-msgstr "Novo na versão %s"
-
-#: sphinx/locale/__init__.py:29
-#, python-format
-msgid "Changed in version %s"
-msgstr "Alterado na versão %s"
-
-#: sphinx/locale/__init__.py:30
-#, python-format
-msgid "Deprecated since version %s"
-msgstr "Obsoleto desde a versão %s"
-
-#: sphinx/locale/__init__.py:34
-msgid "module"
-msgstr "módulo"
-
-#: sphinx/locale/__init__.py:35
-msgid "keyword"
-msgstr "palavra-chave"
-
-#: sphinx/locale/__init__.py:36
-msgid "operator"
-msgstr "operador"
-
-#: sphinx/locale/__init__.py:37
-msgid "object"
-msgstr "objeto"
-
-#: sphinx/locale/__init__.py:38
-msgid "exception"
-msgstr "exceção"
-
-#: sphinx/locale/__init__.py:39
-msgid "statement"
-msgstr "comando"
-
-#: sphinx/locale/__init__.py:40
-msgid "built-in function"
-msgstr "função interna"
-
-#: sphinx/static/doctools.js:174
-msgid "Hide Search Matches"
-msgstr "Esconder Resultados da Pesquisa"
-
-#: sphinx/static/searchtools.js:274
-msgid "Searching"
-msgstr "Pesquisando"
-
-#: sphinx/static/searchtools.js:279
-msgid "Preparing search..."
-msgstr "Preparando pesquisa..."
-
-#: sphinx/static/searchtools.js:338
-msgid "module, in "
-msgstr "módulo, em "
-
-#: sphinx/static/searchtools.js:347
-msgid ", in "
-msgstr ", em "
-
-#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
-msgid "Search Results"
-msgstr "Resultados da Pesquisa"
-
-#: sphinx/static/searchtools.js:449
-msgid ""
-"Your search did not match any documents. Please make sure that all words "
-"are spelled correctly and that you've selected enough categories."
-msgstr ""
-"Sua pesquisa não encontrou nenhum documento. Por favor assegure-se de que"
-" todas as palavras foram digitadas corretamente e de que você tenha "
-"selecionado o mínimo de categorias."
-
-#: sphinx/static/searchtools.js:451
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr ""
-"Pesquisa finalizada, foram encontrada(s) %s página(s) que conferem com o "
-"critério de pesquisa."
-
-#: sphinx/templates/defindex.html:2
-msgid "Overview"
-msgstr "Visão geral"
-
-#: sphinx/templates/defindex.html:11
-msgid "Indices and tables:"
-msgstr "Ãndices e tabelas:"
-
-#: sphinx/templates/defindex.html:14
-msgid "Complete Table of Contents"
-msgstr "Tabela de Conteúdo Completa"
-
-#: sphinx/templates/defindex.html:15
-msgid "lists all sections and subsections"
-msgstr "Lista todas seções e subseções"
-
-#: sphinx/templates/defindex.html:17
-msgid "search this documentation"
-msgstr "Pesquisar esta documentação"
-
-#: sphinx/templates/defindex.html:20
-msgid "quick access to all modules"
-msgstr "acesso rápido para todos os módulos"
-
-#: sphinx/templates/defindex.html:22
-msgid "all functions, classes, terms"
-msgstr "todas funções, classes, termos"
-
-#: sphinx/templates/genindex-single.html:5
-#, python-format
-msgid "Index &ndash; %(key)s"
-msgstr "Ãndice &ndash; %(key)s"
-
-#: sphinx/templates/genindex-single.html:44
-#: sphinx/templates/genindex-split.html:14
-#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
-msgid "Full index on one page"
-msgstr "Ãndice completo em uma página"
-
-#: sphinx/templates/genindex-split.html:7
-msgid "Index pages by letter"
-msgstr "Paginas de índice por letra"
-
-#: sphinx/templates/genindex-split.html:15
-msgid "can be huge"
-msgstr "pode ser enorme"
-
-#: sphinx/templates/layout.html:9
-msgid "Navigation"
-msgstr "Navegação"
-
-#: sphinx/templates/layout.html:40
-msgid "Table Of Contents"
-msgstr "Tabela de Conteúdo"
-
-#: sphinx/templates/layout.html:46
-msgid "Previous topic"
-msgstr "Tópico anterior"
-
-#: sphinx/templates/layout.html:47
-msgid "previous chapter"
-msgstr "capítulo anterior"
-
-#: sphinx/templates/layout.html:50
-msgid "Next topic"
-msgstr "Próximo tópico"
-
-#: sphinx/templates/layout.html:51
-msgid "next chapter"
-msgstr "próximo capítulo"
-
-#: sphinx/templates/layout.html:55
-msgid "This Page"
-msgstr "Esta Página"
-
-#: sphinx/templates/layout.html:59
-msgid "Suggest Change"
-msgstr "Sugerir Alteração"
-
-#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
-msgid "Show Source"
-msgstr "Exibir Fonte"
-
-#: sphinx/templates/layout.html:71
-msgid "Quick search"
-msgstr "Pesquisa rápida"
-
-#: sphinx/templates/layout.html:71
-msgid "Keyword search"
-msgstr "Pesquisa de palavras-chave"
-
-#: sphinx/templates/layout.html:73
-msgid "Go"
-msgstr "Ir"
-
-#: sphinx/templates/layout.html:78
-msgid "Enter a module, class or function name."
-msgstr "Informe o nome de um módulo, classe ou função."
-
-#: sphinx/templates/layout.html:119
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "Pesquisar dentro de %(docstitle)s"
-
-#: sphinx/templates/layout.html:128
-msgid "About these documents"
-msgstr "Sobre estes documentos"
-
-#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
-#: sphinx/templates/search.html:5
-msgid "Search"
-msgstr "Pesquisar"
-
-#: sphinx/templates/layout.html:133
-msgid "Copyright"
-msgstr "Copyright"
-
-#: sphinx/templates/layout.html:178
-#, python-format
-msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-
-#: sphinx/templates/layout.html:180
-#, python-format
-msgid "&copy; Copyright %(copyright)s."
-msgstr "&copy; Copyright %(copyright)s."
-
-#: sphinx/templates/layout.html:183
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "Última atualização em %(last_updated)s."
-
-#: sphinx/templates/layout.html:186
-#, python-format
-msgid ""
-"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-msgstr ""
-"Criado com <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-
-#: sphinx/templates/modindex.html:15
-msgid "Most popular modules:"
-msgstr "Módulos mais populares:"
-
-#: sphinx/templates/modindex.html:24
-msgid "Show modules only available on these platforms"
-msgstr "Exibir somente módulos disponíveis nestas plataformas"
-
-#: sphinx/templates/modindex.html:56
-msgid "Deprecated"
-msgstr "Obsoleto"
-
-#: sphinx/templates/opensearch.xml:4
-#, python-format
-msgid "Search %(docstitle)s"
-msgstr "Pesquisar em %(docstitle)s"
-
-#: sphinx/templates/page.html:8
-msgid ""
-"<strong>Note:</strong> You requested an out-of-date URL from this server."
-" We've tried to redirect you to the new location of this page, but it may"
-" not be the right one."
-msgstr ""
-"<strong>Nota:</strong> Você requisitou uma URL desatualizada deste "
-"servidor. Tentamos redirecioná-lo para um novo endereço desta página, "
-"porém é possível que o mesmo não seja o correto."
-
-#: sphinx/templates/search.html:7
-#, fuzzy
-msgid ""
-"From here you can search these documents. Enter your search\n"
-"    words into the box below and click \"search\". Note that the search\n"
-"    function will automatically search for all of the words. Pages\n"
-"    containing fewer words won't appear in the result list."
-msgstr ""
-"A partir daqui você pode pesquisar estes documentos. Preencha suas \n"
-"    palavras de pesquisa na caixa abaixo e clique em  \"pesquisar\". "
-"Observe que a função de pesquisa\n"
-"    irá pesquisar automaticamente por todas as palavras.\n"
-"    Páginas contendo menos palavras não irão aparecer na lista de "
-"resultado."
-
-#: sphinx/templates/search.html:14
-msgid "search"
-msgstr "pesquisar"
-
-#: sphinx/templates/search.html:20
-msgid "Your search did not match any results."
-msgstr "Sua pesquisa não encontrou nenhum resultado."
-
-#: sphinx/templates/changes/frameset.html:5
-#: sphinx/templates/changes/versionchanges.html:12
-#, python-format
-msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
-msgstr "Alterações na Versão%(version)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/rstsource.html:5
-#, python-format
-msgid "%(filename)s &mdash; %(docstitle)s"
-msgstr "%(filename)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/versionchanges.html:17
-#, python-format
-msgid "Automatically generated list of changes in version %(version)s"
-msgstr "Lista de alterações na versão %(version)s gerada automaticamente"
-
-#: sphinx/templates/changes/versionchanges.html:18
-msgid "Library changes"
-msgstr "Alterações na biblioteca"
-
-#: sphinx/templates/changes/versionchanges.html:23
-msgid "C API changes"
-msgstr "Alterações na API C"
-
-#: sphinx/templates/changes/versionchanges.html:25
-msgid "Other changes"
-msgstr "Outras alterações"
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-Documentation.addTranslations({"locale": "sl", "plural_expr": "0", "messages": {"module, in ": "modul, v ", "Preparing search...": "Pripravljam iskanje...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Za va\u0161e iskanje ni rezultatov. Prosimo preglejte ali so vse besede pravilno \u010drkovane in ali ste izbrali dovolj kategorij.", "Search finished, found %s page(s) matching the search query.": "Iskanje kon\u010dano, najdeno %s strani, ki ustrezajo iskalnemu nizu.", ", in ": ", v ", "Permalink to this headline": "Povezava na naslov", "Searching": "I\u0161\u010dem", "Permalink to this definition": "Povezava na to definicijo", "Hide Search Matches": "Skrij Resultate Iskanja", "Search Results": "Rezultati Iskanja"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.mo has changed
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,597 +0,0 @@
-
-msgid ""
-msgstr ""
-"Project-Id-Version:  Sphinx\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2008-09-11 23:58+0200\n"
-"PO-Revision-Date: 2008-11-27 18:40+0100\n"
-"Last-Translator: Rok Garbas <rok.garbas@gmail.com>\n"
-"Language-Team: Rok Garbas <rok.garbas@gmail.com>\n"
-"Plural-Forms: nplurals=1; plural=0\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.4\n"
-
-#: sphinx/builder.py:408
-#, python-format
-msgid "%b %d, %Y"
-msgstr "%d %b, %Y"
-
-#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
-msgid "General Index"
-msgstr "Splošni abecedni seznam"
-
-#: sphinx/builder.py:427
-msgid "index"
-msgstr "abecedni seznam"
-
-#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
-#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
-#: sphinx/templates/modindex.html:13
-msgid "Global Module Index"
-msgstr "Splošen Seznam Modulov"
-
-#: sphinx/builder.py:429
-msgid "modules"
-msgstr "Moduli"
-
-#: sphinx/builder.py:466
-msgid "next"
-msgstr "naprej"
-
-#: sphinx/builder.py:473
-msgid "previous"
-msgstr "nazaj"
-
-#: sphinx/builder.py:1054
-msgid " (in "
-msgstr "(v "
-
-#: sphinx/builder.py:1129
-msgid "Builtins"
-msgstr "Vgrajeni deli"
-
-#: sphinx/builder.py:1131
-msgid "Module level"
-msgstr "Nivo modula"
-
-#: sphinx/environment.py:102 sphinx/latexwriter.py:169
-#, python-format
-msgid "%B %d, %Y"
-msgstr "%d %B, %Y"
-
-#: sphinx/environment.py:291 sphinx/latexwriter.py:175
-#: sphinx/templates/genindex-single.html:2
-#: sphinx/templates/genindex-split.html:2
-#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
-#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
-#: sphinx/templates/layout.html:130
-msgid "Index"
-msgstr "Abecedni seznam"
-
-#: sphinx/environment.py:292 sphinx/latexwriter.py:174
-msgid "Module Index"
-msgstr "Seznam modulov"
-
-#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
-msgid "Search Page"
-msgstr "Iskalna stran"
-
-#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
-msgid "Permalink to this definition"
-msgstr "Povezava na to definicijo"
-
-#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
-msgid "Permalink to this headline"
-msgstr "Povezava na naslov"
-
-#: sphinx/latexwriter.py:172
-msgid "Release"
-msgstr "Izdaja"
-
-#: sphinx/roles.py:53 sphinx/directives/desc.py:537
-#, python-format
-msgid "environment variable; %s"
-msgstr "globalna spremenljivka; %s"
-
-#: sphinx/roles.py:60
-#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python Enhancement Proposals!PEP %s"
-
-#: sphinx/textwriter.py:166
-#, python-format
-msgid "Platform: %s"
-msgstr "Platforma: %s"
-
-#: sphinx/textwriter.py:422
-msgid "[image]"
-msgstr "[slika]"
-
-#: sphinx/directives/desc.py:25
-#, python-format
-msgid "%s() (built-in function)"
-msgstr "%s() (vgrajene funkcije)"
-
-#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
-#: sphinx/directives/desc.py:54
-#, python-format
-msgid "%s() (in module %s)"
-msgstr "%s() (v modulu %s)"
-
-#: sphinx/directives/desc.py:29
-#, python-format
-msgid "%s (built-in variable)"
-msgstr "%s (vgrajene spremenljivke)"
-
-#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
-#, python-format
-msgid "%s (in module %s)"
-msgstr "%s (v modulu %s)"
-
-#: sphinx/directives/desc.py:33
-#, python-format
-msgid "%s (built-in class)"
-msgstr "%s (vgrajen razred)"
-
-#: sphinx/directives/desc.py:34
-#, python-format
-msgid "%s (class in %s)"
-msgstr "%s (razred v %s)"
-
-#: sphinx/directives/desc.py:46
-#, python-format
-msgid "%s() (%s.%s method)"
-msgstr "%s() (%s.%s metoda)"
-
-#: sphinx/directives/desc.py:48
-#, python-format
-msgid "%s() (%s method)"
-msgstr "%s() (%s metoda)"
-
-#: sphinx/directives/desc.py:58
-#, python-format
-msgid "%s() (%s.%s static method)"
-msgstr "%s() (%s.%s statiÄna metoda)"
-
-#: sphinx/directives/desc.py:60
-#, python-format
-msgid "%s() (%s static method)"
-msgstr "%s() (%s statiÄna metoda)"
-
-#: sphinx/directives/desc.py:70
-#, python-format
-msgid "%s (%s.%s attribute)"
-msgstr "%s (%s.%s atribut)"
-
-#: sphinx/directives/desc.py:72
-#, python-format
-msgid "%s (%s attribute)"
-msgstr "%s (%s atribut)"
-
-#: sphinx/directives/desc.py:74
-#, python-format
-msgid "%s (C function)"
-msgstr "%s (C funkcija)"
-
-#: sphinx/directives/desc.py:76
-#, python-format
-msgid "%s (C member)"
-msgstr "%s (C Älan)"
-
-#: sphinx/directives/desc.py:78
-#, python-format
-msgid "%s (C macro)"
-msgstr "%s (C makro)"
-
-#: sphinx/directives/desc.py:80
-#, python-format
-msgid "%s (C type)"
-msgstr "%s (C tip)"
-
-#: sphinx/directives/desc.py:82
-#, python-format
-msgid "%s (C variable)"
-msgstr "%s (C spremenljivka)"
-
-#: sphinx/directives/desc.py:100
-msgid "Raises"
-msgstr "Javi"
-
-#: sphinx/directives/desc.py:104
-msgid "Variable"
-msgstr "Spremenljivka"
-
-#: sphinx/directives/desc.py:107
-msgid "Returns"
-msgstr "Vrne"
-
-#: sphinx/directives/desc.py:116
-msgid "Return type"
-msgstr "Vrne tip"
-
-#: sphinx/directives/desc.py:143
-msgid "Parameters"
-msgstr "Parametri"
-
-#: sphinx/directives/desc.py:423
-#, python-format
-msgid "%scommand line option; %s"
-msgstr "%sopcija komandne linije; %s"
-
-#: sphinx/directives/other.py:101
-msgid "Platforms: "
-msgstr "Platforma:"
-
-#: sphinx/directives/other.py:106
-#, python-format
-msgid "%s (module)"
-msgstr "%s (modul)"
-
-#: sphinx/directives/other.py:146
-msgid "Section author: "
-msgstr "Avtor sekcije:"
-
-#: sphinx/directives/other.py:148
-msgid "Module author: "
-msgstr "Avtor modula:"
-
-#: sphinx/directives/other.py:150
-msgid "Author: "
-msgstr "Avtor:"
-
-#: sphinx/directives/other.py:246
-msgid "See also"
-msgstr "Poglej tudi"
-
-#: sphinx/ext/todo.py:31
-msgid "Todo"
-msgstr "Naredi"
-
-#: sphinx/ext/todo.py:75
-#, python-format
-msgid "(The original entry is located in %s, line %d and can be found "
-msgstr "(Originalen vnos se nahajana v %s, vrstica %d in jo je moÄ poiskati "
-
-#: sphinx/ext/todo.py:81
-msgid "here"
-msgstr "tukaj"
-
-#: sphinx/locale/__init__.py:15
-msgid "Attention"
-msgstr "Pozor"
-
-#: sphinx/locale/__init__.py:16
-msgid "Caution"
-msgstr "Previdno"
-
-#: sphinx/locale/__init__.py:17
-msgid "Danger"
-msgstr "Navarno"
-
-#: sphinx/locale/__init__.py:18
-msgid "Error"
-msgstr "Napaka"
-
-#: sphinx/locale/__init__.py:19
-msgid "Hint"
-msgstr "Nasvet"
-
-#: sphinx/locale/__init__.py:20
-msgid "Important"
-msgstr "Pomembno"
-
-#: sphinx/locale/__init__.py:21
-msgid "Note"
-msgstr "Opomba"
-
-#: sphinx/locale/__init__.py:22
-msgid "See Also"
-msgstr "Poglej Tudi"
-
-#: sphinx/locale/__init__.py:23
-msgid "Tip"
-msgstr "Nasvet"
-
-#: sphinx/locale/__init__.py:24
-msgid "Warning"
-msgstr "Opozorilo"
-
-#: sphinx/locale/__init__.py:28
-#, python-format
-msgid "New in version %s"
-msgstr "Novo v verziji %s"
-
-#: sphinx/locale/__init__.py:29
-#, python-format
-msgid "Changed in version %s"
-msgstr "Spemenjeno v verziji %s"
-
-#: sphinx/locale/__init__.py:30
-#, python-format
-msgid "Deprecated since version %s"
-msgstr "Zastarelo od verzije %s"
-
-#: sphinx/locale/__init__.py:34
-msgid "module"
-msgstr "modul"
-
-#: sphinx/locale/__init__.py:35
-msgid "keyword"
-msgstr "klluÄna beseda"
-
-#: sphinx/locale/__init__.py:36
-msgid "operator"
-msgstr "operator"
-
-#: sphinx/locale/__init__.py:37
-msgid "object"
-msgstr "objekt"
-
-#: sphinx/locale/__init__.py:38
-msgid "exception"
-msgstr "izjema"
-
-#: sphinx/locale/__init__.py:39
-msgid "statement"
-msgstr "izjava"
-
-#: sphinx/locale/__init__.py:40
-msgid "built-in function"
-msgstr "vgrajene funkcije"
-
-#: sphinx/static/doctools.js:174
-msgid "Hide Search Matches"
-msgstr "Skrij Resultate Iskanja"
-
-#: sphinx/static/searchtools.js:274
-msgid "Searching"
-msgstr "IÅ¡Äem"
-
-#: sphinx/static/searchtools.js:279
-msgid "Preparing search..."
-msgstr "Pripravljam iskanje..."
-
-#: sphinx/static/searchtools.js:338
-msgid "module, in "
-msgstr "modul, v "
-
-#: sphinx/static/searchtools.js:347
-msgid ", in "
-msgstr ", v "
-
-#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
-msgid "Search Results"
-msgstr "Rezultati Iskanja"
-
-#: sphinx/static/searchtools.js:449
-msgid ""
-"Your search did not match any documents. Please make sure that all words "
-"are spelled correctly and that you've selected enough categories."
-msgstr ""
-"Za vaše iskanje ni rezultatov. Prosimo preglejte ali so vse besede "
-"pravilno Ärkovane in ali ste izbrali dovolj kategorij."
-
-#: sphinx/static/searchtools.js:451
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr "Iskanje konÄano, najdeno %s strani, ki ustrezajo iskalnemu nizu."
-
-#: sphinx/templates/defindex.html:2
-msgid "Overview"
-msgstr "Pregled"
-
-#: sphinx/templates/defindex.html:11
-msgid "Indices and tables:"
-msgstr "Kazalo in tabele:"
-
-#: sphinx/templates/defindex.html:14
-msgid "Complete Table of Contents"
-msgstr "Popoln Seznam Vsebine"
-
-#: sphinx/templates/defindex.html:15
-msgid "lists all sections and subsections"
-msgstr "prikazi vse sekcije in podsekcije"
-
-#: sphinx/templates/defindex.html:17
-msgid "search this documentation"
-msgstr "isÄi po dokumentaciji"
-
-#: sphinx/templates/defindex.html:20
-msgid "quick access to all modules"
-msgstr "hiter dostop do vseh modulov"
-
-#: sphinx/templates/defindex.html:22
-msgid "all functions, classes, terms"
-msgstr "vse funkcije, rezredi, termini"
-
-#: sphinx/templates/genindex-single.html:5
-#, python-format
-msgid "Index &ndash; %(key)s"
-msgstr "Seznam &ndash; %(key)s"
-
-#: sphinx/templates/genindex-single.html:44
-#: sphinx/templates/genindex-split.html:14
-#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
-msgid "Full index on one page"
-msgstr "Poln indeks na eni strani"
-
-#: sphinx/templates/genindex-split.html:7
-msgid "Index pages by letter"
-msgstr "Indeksiraj strani po Ärki"
-
-#: sphinx/templates/genindex-split.html:15
-msgid "can be huge"
-msgstr "lahko je veliko"
-
-#: sphinx/templates/layout.html:9
-msgid "Navigation"
-msgstr "Navigacija"
-
-#: sphinx/templates/layout.html:40
-msgid "Table Of Contents"
-msgstr "Seznam Vsebine"
-
-#: sphinx/templates/layout.html:46
-msgid "Previous topic"
-msgstr "Prejšnja tema"
-
-#: sphinx/templates/layout.html:47
-msgid "previous chapter"
-msgstr "prejšnje poglavje"
-
-#: sphinx/templates/layout.html:50
-msgid "Next topic"
-msgstr "Naslednja tema"
-
-#: sphinx/templates/layout.html:51
-msgid "next chapter"
-msgstr "naslednje poglavje"
-
-#: sphinx/templates/layout.html:55
-msgid "This Page"
-msgstr "Ta stran"
-
-#: sphinx/templates/layout.html:59
-msgid "Suggest Change"
-msgstr "Predlagaj spremembo"
-
-#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
-msgid "Show Source"
-msgstr "Prikaži izvorno kodo"
-
-#: sphinx/templates/layout.html:71
-msgid "Quick search"
-msgstr "Hitro iskanje"
-
-#: sphinx/templates/layout.html:71
-msgid "Keyword search"
-msgstr "Iskanje po kljuÄniih besedah"
-
-#: sphinx/templates/layout.html:73
-msgid "Go"
-msgstr "Potrdi"
-
-#: sphinx/templates/layout.html:78
-msgid "Enter a module, class or function name."
-msgstr "Vnesi ime mudla, razreda ali funkcije."
-
-#: sphinx/templates/layout.html:119
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "IÅ¡Äi med %(docstitle)s"
-
-#: sphinx/templates/layout.html:128
-msgid "About these documents"
-msgstr "O teh dokumentih"
-
-#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
-#: sphinx/templates/search.html:5
-msgid "Search"
-msgstr "IÅ¡Äi"
-
-#: sphinx/templates/layout.html:133
-msgid "Copyright"
-msgstr "Vse pravice pridržane"
-
-#: sphinx/templates/layout.html:178
-#, python-format
-msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-msgstr "&copy; <a href=\"%(path)s\">Vse pravice pridržane</a> %(copyright)s."
-
-#: sphinx/templates/layout.html:180
-#, python-format
-msgid "&copy; Copyright %(copyright)s."
-msgstr "&copy; Vse pravice pridržane %(copyright)s."
-
-#: sphinx/templates/layout.html:183
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "ZadnjiÄ posodobljeno na %(last_updated)s."
-
-#: sphinx/templates/layout.html:186
-#, python-format
-msgid ""
-"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-msgstr ""
-"Narejeno s <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-
-#: sphinx/templates/modindex.html:15
-msgid "Most popular modules:"
-msgstr "Najbolj popularni moduli:"
-
-#: sphinx/templates/modindex.html:24
-msgid "Show modules only available on these platforms"
-msgstr "Prikaži module na razpolago na platformah"
-
-#: sphinx/templates/modindex.html:56
-msgid "Deprecated"
-msgstr "Zastarelo"
-
-#: sphinx/templates/opensearch.xml:4
-#, python-format
-msgid "Search %(docstitle)s"
-msgstr "IÅ¡Äi %(docstitle)s"
-
-#: sphinx/templates/page.html:8
-msgid ""
-"<strong>Note:</strong> You requested an out-of-date URL from this server."
-" We've tried to redirect you to the new location of this page, but it may"
-" not be the right one."
-msgstr ""
-"<strong>Opomba:</strong> Vaš zahtevek za URL s tega streznika je "
-"zastaral. Poskušali smo vas preusmeriti na novo lokacijo, vendar utegne "
-"biti napaÄna."
-
-#: sphinx/templates/search.html:7
-#, fuzzy
-msgid ""
-"From here you can search these documents. Enter your search\n"
-"    words into the box below and click \"search\". Note that the search\n"
-"    function will automatically search for all of the words. Pages\n"
-"    containing fewer words won't appear in the result list."
-msgstr ""
-"O tukaj lahko isÄete dokumente. Vnesite iskalni\n"
-"    niz v polje spodaj in pritisnite \"iÅ¡Äi\". Sproženo iskanje\n"
-"    bo iskalo po vseh besedah v iskalnem nizu. Strani, ki ne\n"
-"    vsebujejo vseh besed ne bodo prikazane na seznamu rezultatov."
-
-#: sphinx/templates/search.html:14
-msgid "search"
-msgstr "iÅ¡Äi"
-
-#: sphinx/templates/search.html:20
-msgid "Your search did not match any results."
-msgstr "Vaše iskanje ni imelo nobenega zadetka."
-
-#: sphinx/templates/changes/frameset.html:5
-#: sphinx/templates/changes/versionchanges.html:12
-#, python-format
-msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
-msgstr "Spremembe v Verziji %(version)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/rstsource.html:5
-#, python-format
-msgid "%(filename)s &mdash; %(docstitle)s"
-msgstr "%(filename)s &mdash; %(docstitle)s"
-
-#: sphinx/templates/changes/versionchanges.html:17
-#, python-format
-msgid "Automatically generated list of changes in version %(version)s"
-msgstr "Avtomatsko generiran seznam sprememb v verziji %(version)s"
-
-#: sphinx/templates/changes/versionchanges.html:18
-msgid "Library changes"
-msgstr "Spremembe knjižnice"
-
-#: sphinx/templates/changes/versionchanges.html:23
-msgid "C API changes"
-msgstr "C API spremembe"
-
-#: sphinx/templates/changes/versionchanges.html:25
-msgid "Other changes"
-msgstr "Ostale spremembe"
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sphinx.pot	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,589 +0,0 @@
-# Translations template for Sphinx.
-# Copyright (C) 2008 ORGANIZATION
-# This file is distributed under the same license as the Sphinx project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: Sphinx 0.5\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2008-11-27 18:39+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.4\n"
-
-#: sphinx/builder.py:408
-#, python-format
-msgid "%b %d, %Y"
-msgstr ""
-
-#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
-msgid "General Index"
-msgstr ""
-
-#: sphinx/builder.py:427
-msgid "index"
-msgstr ""
-
-#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
-#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
-#: sphinx/templates/modindex.html:13
-msgid "Global Module Index"
-msgstr ""
-
-#: sphinx/builder.py:429
-msgid "modules"
-msgstr ""
-
-#: sphinx/builder.py:466
-msgid "next"
-msgstr ""
-
-#: sphinx/builder.py:473
-msgid "previous"
-msgstr ""
-
-#: sphinx/builder.py:1054
-msgid " (in "
-msgstr ""
-
-#: sphinx/builder.py:1129
-msgid "Builtins"
-msgstr ""
-
-#: sphinx/builder.py:1131
-msgid "Module level"
-msgstr ""
-
-#: sphinx/environment.py:102 sphinx/latexwriter.py:169
-#, python-format
-msgid "%B %d, %Y"
-msgstr ""
-
-#: sphinx/environment.py:291 sphinx/latexwriter.py:175
-#: sphinx/templates/genindex-single.html:2
-#: sphinx/templates/genindex-split.html:2
-#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
-#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
-#: sphinx/templates/layout.html:130
-msgid "Index"
-msgstr ""
-
-#: sphinx/environment.py:292 sphinx/latexwriter.py:174
-msgid "Module Index"
-msgstr ""
-
-#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
-msgid "Search Page"
-msgstr ""
-
-#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
-msgid "Permalink to this definition"
-msgstr ""
-
-#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
-msgid "Permalink to this headline"
-msgstr ""
-
-#: sphinx/latexwriter.py:172
-msgid "Release"
-msgstr ""
-
-#: sphinx/roles.py:53 sphinx/directives/desc.py:537
-#, python-format
-msgid "environment variable; %s"
-msgstr ""
-
-#: sphinx/roles.py:60
-#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr ""
-
-#: sphinx/textwriter.py:166
-#, python-format
-msgid "Platform: %s"
-msgstr ""
-
-#: sphinx/textwriter.py:422
-msgid "[image]"
-msgstr ""
-
-#: sphinx/directives/desc.py:25
-#, python-format
-msgid "%s() (built-in function)"
-msgstr ""
-
-#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
-#: sphinx/directives/desc.py:54
-#, python-format
-msgid "%s() (in module %s)"
-msgstr ""
-
-#: sphinx/directives/desc.py:29
-#, python-format
-msgid "%s (built-in variable)"
-msgstr ""
-
-#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
-#, python-format
-msgid "%s (in module %s)"
-msgstr ""
-
-#: sphinx/directives/desc.py:33
-#, python-format
-msgid "%s (built-in class)"
-msgstr ""
-
-#: sphinx/directives/desc.py:34
-#, python-format
-msgid "%s (class in %s)"
-msgstr ""
-
-#: sphinx/directives/desc.py:46
-#, python-format
-msgid "%s() (%s.%s method)"
-msgstr ""
-
-#: sphinx/directives/desc.py:48
-#, python-format
-msgid "%s() (%s method)"
-msgstr ""
-
-#: sphinx/directives/desc.py:58
-#, python-format
-msgid "%s() (%s.%s static method)"
-msgstr ""
-
-#: sphinx/directives/desc.py:60
-#, python-format
-msgid "%s() (%s static method)"
-msgstr ""
-
-#: sphinx/directives/desc.py:70
-#, python-format
-msgid "%s (%s.%s attribute)"
-msgstr ""
-
-#: sphinx/directives/desc.py:72
-#, python-format
-msgid "%s (%s attribute)"
-msgstr ""
-
-#: sphinx/directives/desc.py:74
-#, python-format
-msgid "%s (C function)"
-msgstr ""
-
-#: sphinx/directives/desc.py:76
-#, python-format
-msgid "%s (C member)"
-msgstr ""
-
-#: sphinx/directives/desc.py:78
-#, python-format
-msgid "%s (C macro)"
-msgstr ""
-
-#: sphinx/directives/desc.py:80
-#, python-format
-msgid "%s (C type)"
-msgstr ""
-
-#: sphinx/directives/desc.py:82
-#, python-format
-msgid "%s (C variable)"
-msgstr ""
-
-#: sphinx/directives/desc.py:100
-msgid "Raises"
-msgstr ""
-
-#: sphinx/directives/desc.py:104
-msgid "Variable"
-msgstr ""
-
-#: sphinx/directives/desc.py:107
-msgid "Returns"
-msgstr ""
-
-#: sphinx/directives/desc.py:116
-msgid "Return type"
-msgstr ""
-
-#: sphinx/directives/desc.py:143
-msgid "Parameters"
-msgstr ""
-
-#: sphinx/directives/desc.py:423
-#, python-format
-msgid "%scommand line option; %s"
-msgstr ""
-
-#: sphinx/directives/other.py:101
-msgid "Platforms: "
-msgstr ""
-
-#: sphinx/directives/other.py:106
-#, python-format
-msgid "%s (module)"
-msgstr ""
-
-#: sphinx/directives/other.py:146
-msgid "Section author: "
-msgstr ""
-
-#: sphinx/directives/other.py:148
-msgid "Module author: "
-msgstr ""
-
-#: sphinx/directives/other.py:150
-msgid "Author: "
-msgstr ""
-
-#: sphinx/directives/other.py:246
-msgid "See also"
-msgstr ""
-
-#: sphinx/ext/todo.py:31
-msgid "Todo"
-msgstr ""
-
-#: sphinx/ext/todo.py:75
-#, python-format
-msgid "(The original entry is located in %s, line %d and can be found "
-msgstr ""
-
-#: sphinx/ext/todo.py:81
-msgid "here"
-msgstr ""
-
-#: sphinx/locale/__init__.py:15
-msgid "Attention"
-msgstr ""
-
-#: sphinx/locale/__init__.py:16
-msgid "Caution"
-msgstr ""
-
-#: sphinx/locale/__init__.py:17
-msgid "Danger"
-msgstr ""
-
-#: sphinx/locale/__init__.py:18
-msgid "Error"
-msgstr ""
-
-#: sphinx/locale/__init__.py:19
-msgid "Hint"
-msgstr ""
-
-#: sphinx/locale/__init__.py:20
-msgid "Important"
-msgstr ""
-
-#: sphinx/locale/__init__.py:21
-msgid "Note"
-msgstr ""
-
-#: sphinx/locale/__init__.py:22
-msgid "See Also"
-msgstr ""
-
-#: sphinx/locale/__init__.py:23
-msgid "Tip"
-msgstr ""
-
-#: sphinx/locale/__init__.py:24
-msgid "Warning"
-msgstr ""
-
-#: sphinx/locale/__init__.py:28
-#, python-format
-msgid "New in version %s"
-msgstr ""
-
-#: sphinx/locale/__init__.py:29
-#, python-format
-msgid "Changed in version %s"
-msgstr ""
-
-#: sphinx/locale/__init__.py:30
-#, python-format
-msgid "Deprecated since version %s"
-msgstr ""
-
-#: sphinx/locale/__init__.py:34
-msgid "module"
-msgstr ""
-
-#: sphinx/locale/__init__.py:35
-msgid "keyword"
-msgstr ""
-
-#: sphinx/locale/__init__.py:36
-msgid "operator"
-msgstr ""
-
-#: sphinx/locale/__init__.py:37
-msgid "object"
-msgstr ""
-
-#: sphinx/locale/__init__.py:38
-msgid "exception"
-msgstr ""
-
-#: sphinx/locale/__init__.py:39
-msgid "statement"
-msgstr ""
-
-#: sphinx/locale/__init__.py:40
-msgid "built-in function"
-msgstr ""
-
-#: sphinx/static/doctools.js:174
-msgid "Hide Search Matches"
-msgstr ""
-
-#: sphinx/static/searchtools.js:274
-msgid "Searching"
-msgstr ""
-
-#: sphinx/static/searchtools.js:279
-msgid "Preparing search..."
-msgstr ""
-
-#: sphinx/static/searchtools.js:338
-msgid "module, in "
-msgstr ""
-
-#: sphinx/static/searchtools.js:347
-msgid ", in "
-msgstr ""
-
-#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
-msgid "Search Results"
-msgstr ""
-
-#: sphinx/static/searchtools.js:449
-msgid ""
-"Your search did not match any documents. Please make sure that all words "
-"are spelled correctly and that you've selected enough categories."
-msgstr ""
-
-#: sphinx/static/searchtools.js:451
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr ""
-
-#: sphinx/templates/defindex.html:2
-msgid "Overview"
-msgstr ""
-
-#: sphinx/templates/defindex.html:11
-msgid "Indices and tables:"
-msgstr ""
-
-#: sphinx/templates/defindex.html:14
-msgid "Complete Table of Contents"
-msgstr ""
-
-#: sphinx/templates/defindex.html:15
-msgid "lists all sections and subsections"
-msgstr ""
-
-#: sphinx/templates/defindex.html:17
-msgid "search this documentation"
-msgstr ""
-
-#: sphinx/templates/defindex.html:20
-msgid "quick access to all modules"
-msgstr ""
-
-#: sphinx/templates/defindex.html:22
-msgid "all functions, classes, terms"
-msgstr ""
-
-#: sphinx/templates/genindex-single.html:5
-#, python-format
-msgid "Index &ndash; %(key)s"
-msgstr ""
-
-#: sphinx/templates/genindex-single.html:44
-#: sphinx/templates/genindex-split.html:14
-#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
-msgid "Full index on one page"
-msgstr ""
-
-#: sphinx/templates/genindex-split.html:7
-msgid "Index pages by letter"
-msgstr ""
-
-#: sphinx/templates/genindex-split.html:15
-msgid "can be huge"
-msgstr ""
-
-#: sphinx/templates/layout.html:9
-msgid "Navigation"
-msgstr ""
-
-#: sphinx/templates/layout.html:40
-msgid "Table Of Contents"
-msgstr ""
-
-#: sphinx/templates/layout.html:46
-msgid "Previous topic"
-msgstr ""
-
-#: sphinx/templates/layout.html:47
-msgid "previous chapter"
-msgstr ""
-
-#: sphinx/templates/layout.html:50
-msgid "Next topic"
-msgstr ""
-
-#: sphinx/templates/layout.html:51
-msgid "next chapter"
-msgstr ""
-
-#: sphinx/templates/layout.html:55
-msgid "This Page"
-msgstr ""
-
-#: sphinx/templates/layout.html:59
-msgid "Suggest Change"
-msgstr ""
-
-#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
-msgid "Show Source"
-msgstr ""
-
-#: sphinx/templates/layout.html:71
-msgid "Quick search"
-msgstr ""
-
-#: sphinx/templates/layout.html:71
-msgid "Keyword search"
-msgstr ""
-
-#: sphinx/templates/layout.html:73
-msgid "Go"
-msgstr ""
-
-#: sphinx/templates/layout.html:78
-msgid "Enter a module, class or function name."
-msgstr ""
-
-#: sphinx/templates/layout.html:119
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr ""
-
-#: sphinx/templates/layout.html:128
-msgid "About these documents"
-msgstr ""
-
-#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
-#: sphinx/templates/search.html:5
-msgid "Search"
-msgstr ""
-
-#: sphinx/templates/layout.html:133
-msgid "Copyright"
-msgstr ""
-
-#: sphinx/templates/layout.html:178
-#, python-format
-msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-msgstr ""
-
-#: sphinx/templates/layout.html:180
-#, python-format
-msgid "&copy; Copyright %(copyright)s."
-msgstr ""
-
-#: sphinx/templates/layout.html:183
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr ""
-
-#: sphinx/templates/layout.html:186
-#, python-format
-msgid ""
-"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-msgstr ""
-
-#: sphinx/templates/modindex.html:15
-msgid "Most popular modules:"
-msgstr ""
-
-#: sphinx/templates/modindex.html:24
-msgid "Show modules only available on these platforms"
-msgstr ""
-
-#: sphinx/templates/modindex.html:56
-msgid "Deprecated"
-msgstr ""
-
-#: sphinx/templates/opensearch.xml:4
-#, python-format
-msgid "Search %(docstitle)s"
-msgstr ""
-
-#: sphinx/templates/page.html:8
-msgid ""
-"<strong>Note:</strong> You requested an out-of-date URL from this server."
-" We've tried to redirect you to the new location of this page, but it may"
-" not be the right one."
-msgstr ""
-
-#: sphinx/templates/search.html:7
-msgid ""
-"From here you can search these documents. Enter your search\n"
-"    words into the box below and click \"search\". Note that the search\n"
-"    function will automatically search for all of the words. Pages\n"
-"    containing fewer words won't appear in the result list."
-msgstr ""
-
-#: sphinx/templates/search.html:14
-msgid "search"
-msgstr ""
-
-#: sphinx/templates/search.html:20
-msgid "Your search did not match any results."
-msgstr ""
-
-#: sphinx/templates/changes/frameset.html:5
-#: sphinx/templates/changes/versionchanges.html:12
-#, python-format
-msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
-msgstr ""
-
-#: sphinx/templates/changes/rstsource.html:5
-#, python-format
-msgid "%(filename)s &mdash; %(docstitle)s"
-msgstr ""
-
-#: sphinx/templates/changes/versionchanges.html:17
-#, python-format
-msgid "Automatically generated list of changes in version %(version)s"
-msgstr ""
-
-#: sphinx/templates/changes/versionchanges.html:18
-msgid "Library changes"
-msgstr ""
-
-#: sphinx/templates/changes/versionchanges.html:23
-msgid "C API changes"
-msgstr ""
-
-#: sphinx/templates/changes/versionchanges.html:25
-msgid "Other changes"
-msgstr ""
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-Documentation.addTranslations({"locale": "zh_TW", "plural_expr": "0", "messages": {"module, in ": "", "Preparing search...": "\u6e96\u5099\u641c\u5c0b...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "", "Search finished, found %s page(s) matching the search query.": "", ", in ": "", "Permalink to this headline": "", "Searching": "\u641c\u5c0b\u4e2d", "Permalink to this definition": "", "Hide Search Matches": "", "Search Results": "\u641c\u5c0b\u7d50\u679c"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo has changed
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,598 +0,0 @@
-# Chinese (Taiwan) translations for Sphinx.
-# Copyright (C) 2008 ORGANIZATION
-# This file is distributed under the same license as the Sphinx project.
-# Fred Lin <gasolin@gmail.com>, 2008.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Sphinx 0.5\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2008-11-09 19:46+0100\n"
-"PO-Revision-Date: 2008-11-27 18:40+0100\n"
-"Last-Translator: Fred Lin <gasolin@gmail.com>\n"
-"Language-Team: tw <LL@li.org>\n"
-"Plural-Forms: nplurals=1; plural=0\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.4\n"
-
-#: sphinx/builder.py:408
-#, python-format
-msgid "%b %d, %Y"
-msgstr "%Y 年 %m 月 %d 日"
-
-#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
-msgid "General Index"
-msgstr "總索引"
-
-#: sphinx/builder.py:427
-msgid "index"
-msgstr "索引"
-
-#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
-#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
-#: sphinx/templates/modindex.html:13
-msgid "Global Module Index"
-msgstr ""
-
-#: sphinx/builder.py:429
-msgid "modules"
-msgstr "模組"
-
-#: sphinx/builder.py:466
-msgid "next"
-msgstr "下一é "
-
-#: sphinx/builder.py:473
-msgid "previous"
-msgstr "上一é "
-
-#: sphinx/builder.py:1054
-msgid " (in "
-msgstr ""
-
-#: sphinx/builder.py:1129
-msgid "Builtins"
-msgstr ""
-
-#: sphinx/builder.py:1131
-msgid "Module level"
-msgstr ""
-
-#: sphinx/environment.py:102 sphinx/latexwriter.py:169
-#, python-format
-msgid "%B %d, %Y"
-msgstr "%Y 年 %m 月 %d 日"
-
-#: sphinx/environment.py:291 sphinx/latexwriter.py:175
-#: sphinx/templates/genindex-single.html:2
-#: sphinx/templates/genindex-split.html:2
-#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
-#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
-#: sphinx/templates/layout.html:130
-msgid "Index"
-msgstr "索引"
-
-#: sphinx/environment.py:292 sphinx/latexwriter.py:174
-msgid "Module Index"
-msgstr "模組索引"
-
-#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
-msgid "Search Page"
-msgstr "æœå°‹é é¢"
-
-#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
-msgid "Permalink to this definition"
-msgstr ""
-
-#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
-msgid "Permalink to this headline"
-msgstr ""
-
-#: sphinx/latexwriter.py:172
-msgid "Release"
-msgstr "釋出"
-
-#: sphinx/roles.py:53 sphinx/directives/desc.py:537
-#, python-format
-msgid "environment variable; %s"
-msgstr "環境變數; %s"
-
-#: sphinx/roles.py:60
-#, python-format
-msgid "Python Enhancement Proposals!PEP %s"
-msgstr "Python 建議文件!PEP %s"
-
-#: sphinx/textwriter.py:166
-#, python-format
-msgid "Platform: %s"
-msgstr "å¹³å°ï¼š%s"
-
-#: sphinx/textwriter.py:422
-msgid "[image]"
-msgstr "[圖片]"
-
-#: sphinx/directives/desc.py:25
-#, python-format
-msgid "%s() (built-in function)"
-msgstr "%s() (內建函å¼)"
-
-#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
-#: sphinx/directives/desc.py:54
-#, python-format
-msgid "%s() (in module %s)"
-msgstr "%s() (在 %s 模組中)"
-
-#: sphinx/directives/desc.py:29
-#, python-format
-msgid "%s (built-in variable)"
-msgstr "%s (內建變數)"
-
-#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
-#, python-format
-msgid "%s (in module %s)"
-msgstr "%s() (在 %s 模組中)"
-
-#: sphinx/directives/desc.py:33
-#, python-format
-msgid "%s (built-in class)"
-msgstr "%s (內建類別)"
-
-#: sphinx/directives/desc.py:34
-#, python-format
-msgid "%s (class in %s)"
-msgstr ""
-
-#: sphinx/directives/desc.py:46
-#, python-format
-msgid "%s() (%s.%s method)"
-msgstr "%s() (%s.%s 方法)"
-
-#: sphinx/directives/desc.py:48
-#, python-format
-msgid "%s() (%s method)"
-msgstr "%s() (%s 方法)"
-
-#: sphinx/directives/desc.py:58
-#, python-format
-msgid "%s() (%s.%s static method)"
-msgstr "%s() (%s.%s éœæ…‹æ–¹æ³•)"
-
-#: sphinx/directives/desc.py:60
-#, python-format
-msgid "%s() (%s static method)"
-msgstr "%s() (%s éœæ…‹æ–¹æ³•)"
-
-#: sphinx/directives/desc.py:70
-#, python-format
-msgid "%s (%s.%s attribute)"
-msgstr "%s (%s.%s 屬性)"
-
-#: sphinx/directives/desc.py:72
-#, python-format
-msgid "%s (%s attribute)"
-msgstr "%s (%s 屬性)"
-
-#: sphinx/directives/desc.py:74
-#, python-format
-msgid "%s (C function)"
-msgstr "%s (C 函å¼)"
-
-#: sphinx/directives/desc.py:76
-#, python-format
-msgid "%s (C member)"
-msgstr "%s (C æˆå“¡)"
-
-#: sphinx/directives/desc.py:78
-#, python-format
-msgid "%s (C macro)"
-msgstr "%s (C 巨集)"
-
-#: sphinx/directives/desc.py:80
-#, python-format
-msgid "%s (C type)"
-msgstr "%s (C 類別)"
-
-#: sphinx/directives/desc.py:82
-#, python-format
-msgid "%s (C variable)"
-msgstr "%s (C 變數)"
-
-#: sphinx/directives/desc.py:100
-msgid "Raises"
-msgstr ""
-
-#: sphinx/directives/desc.py:104
-msgid "Variable"
-msgstr "變數"
-
-#: sphinx/directives/desc.py:107
-msgid "Returns"
-msgstr "返回"
-
-#: sphinx/directives/desc.py:116
-msgid "Return type"
-msgstr "返回類別"
-
-#: sphinx/directives/desc.py:143
-msgid "Parameters"
-msgstr "åƒæ•¸"
-
-#: sphinx/directives/desc.py:423
-#, python-format
-msgid "%scommand line option; %s"
-msgstr "%s命令列é¸é …; %s"
-
-#: sphinx/directives/other.py:101
-msgid "Platforms: "
-msgstr "å¹³å°"
-
-#: sphinx/directives/other.py:106
-#, python-format
-msgid "%s (module)"
-msgstr "%s (模組)"
-
-#: sphinx/directives/other.py:146
-msgid "Section author: "
-msgstr "Section 作者:"
-
-#: sphinx/directives/other.py:148
-msgid "Module author: "
-msgstr "模組作者:"
-
-#: sphinx/directives/other.py:150
-msgid "Author: "
-msgstr "作者:"
-
-#: sphinx/directives/other.py:246
-msgid "See also"
-msgstr ""
-
-#: sphinx/ext/todo.py:31
-msgid "Todo"
-msgstr "待辦"
-
-#: sphinx/ext/todo.py:75
-#, python-format
-msgid "(The original entry is located in %s, line %d and can be found "
-msgstr ""
-
-#: sphinx/ext/todo.py:81
-msgid "here"
-msgstr ""
-
-#: sphinx/locale/__init__.py:15
-msgid "Attention"
-msgstr "注æ„"
-
-#: sphinx/locale/__init__.py:16
-msgid "Caution"
-msgstr "警示"
-
-#: sphinx/locale/__init__.py:17
-msgid "Danger"
-msgstr "å±éšª"
-
-#: sphinx/locale/__init__.py:18
-msgid "Error"
-msgstr "錯誤"
-
-#: sphinx/locale/__init__.py:19
-msgid "Hint"
-msgstr "æ示"
-
-#: sphinx/locale/__init__.py:20
-msgid "Important"
-msgstr "é‡è¦"
-
-#: sphinx/locale/__init__.py:21
-msgid "Note"
-msgstr "註解"
-
-#: sphinx/locale/__init__.py:22
-msgid "See Also"
-msgstr ""
-
-#: sphinx/locale/__init__.py:23
-msgid "Tip"
-msgstr "å°æŠ€å·§"
-
-#: sphinx/locale/__init__.py:24
-msgid "Warning"
-msgstr "警告"
-
-#: sphinx/locale/__init__.py:28
-#, python-format
-msgid "New in version %s"
-msgstr "%s 版新功能"
-
-#: sphinx/locale/__init__.py:29
-#, python-format
-msgid "Changed in version %s"
-msgstr "在 %s 版改變"
-
-#: sphinx/locale/__init__.py:30
-#, python-format
-msgid "Deprecated since version %s"
-msgstr "%s 版後已移除"
-
-#: sphinx/locale/__init__.py:34
-msgid "module"
-msgstr "模組"
-
-#: sphinx/locale/__init__.py:35
-msgid "keyword"
-msgstr "é—œéµå­—"
-
-#: sphinx/locale/__init__.py:36
-msgid "operator"
-msgstr "é‹ç®—å­"
-
-#: sphinx/locale/__init__.py:37
-msgid "object"
-msgstr "物件"
-
-#: sphinx/locale/__init__.py:38
-msgid "exception"
-msgstr "例外"
-
-#: sphinx/locale/__init__.py:39
-msgid "statement"
-msgstr ""
-
-#: sphinx/locale/__init__.py:40
-msgid "built-in function"
-msgstr "內建函å¼"
-
-#: sphinx/static/doctools.js:174
-msgid "Hide Search Matches"
-msgstr ""
-
-#: sphinx/static/searchtools.js:274
-msgid "Searching"
-msgstr "æœå°‹ä¸­"
-
-#: sphinx/static/searchtools.js:279
-msgid "Preparing search..."
-msgstr "準備æœå°‹..."
-
-#: sphinx/static/searchtools.js:338
-msgid "module, in "
-msgstr ""
-
-#: sphinx/static/searchtools.js:347
-msgid ", in "
-msgstr ""
-
-#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
-msgid "Search Results"
-msgstr "æœå°‹çµæžœ"
-
-#: sphinx/static/searchtools.js:449
-msgid ""
-"Your search did not match any documents. Please make sure that all words "
-"are spelled correctly and that you've selected enough categories."
-msgstr ""
-
-#: sphinx/static/searchtools.js:451
-#, python-format
-msgid "Search finished, found %s page(s) matching the search query."
-msgstr ""
-
-#: sphinx/templates/defindex.html:2
-msgid "Overview"
-msgstr ""
-
-#: sphinx/templates/defindex.html:11
-msgid "Indices and tables:"
-msgstr ""
-
-#: sphinx/templates/defindex.html:14
-msgid "Complete Table of Contents"
-msgstr ""
-
-#: sphinx/templates/defindex.html:15
-msgid "lists all sections and subsections"
-msgstr ""
-
-#: sphinx/templates/defindex.html:17
-msgid "search this documentation"
-msgstr ""
-
-#: sphinx/templates/defindex.html:20
-msgid "quick access to all modules"
-msgstr ""
-
-#: sphinx/templates/defindex.html:22
-msgid "all functions, classes, terms"
-msgstr ""
-
-#: sphinx/templates/genindex-single.html:5
-#, python-format
-msgid "Index &ndash; %(key)s"
-msgstr ""
-
-#: sphinx/templates/genindex-single.html:44
-#: sphinx/templates/genindex-split.html:14
-#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
-msgid "Full index on one page"
-msgstr ""
-
-#: sphinx/templates/genindex-split.html:7
-msgid "Index pages by letter"
-msgstr ""
-
-#: sphinx/templates/genindex-split.html:15
-msgid "can be huge"
-msgstr ""
-
-#: sphinx/templates/layout.html:9
-msgid "Navigation"
-msgstr "ç€è¦½"
-
-#: sphinx/templates/layout.html:40
-msgid "Table Of Contents"
-msgstr "內容目錄"
-
-#: sphinx/templates/layout.html:46
-msgid "Previous topic"
-msgstr "上一個主題"
-
-#: sphinx/templates/layout.html:47
-msgid "previous chapter"
-msgstr "上一章"
-
-#: sphinx/templates/layout.html:50
-msgid "Next topic"
-msgstr "下一個主題"
-
-#: sphinx/templates/layout.html:51
-msgid "next chapter"
-msgstr "下一章"
-
-#: sphinx/templates/layout.html:55
-msgid "This Page"
-msgstr "本é "
-
-#: sphinx/templates/layout.html:59
-msgid "Suggest Change"
-msgstr ""
-
-#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
-msgid "Show Source"
-msgstr "顯示原始碼"
-
-#: sphinx/templates/layout.html:71
-msgid "Quick search"
-msgstr "快速æœå°‹"
-
-#: sphinx/templates/layout.html:71
-msgid "Keyword search"
-msgstr "é—œéµå­—æœå°‹"
-
-#: sphinx/templates/layout.html:73
-msgid "Go"
-msgstr ""
-
-#: sphinx/templates/layout.html:78
-msgid "Enter a module, class or function name."
-msgstr "輸入一個模組ã€é¡žåˆ¥ã€æˆ–是函å¼å稱."
-
-#: sphinx/templates/layout.html:119
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "在 %(docstitle)s 中æœå°‹"
-
-#: sphinx/templates/layout.html:128
-msgid "About these documents"
-msgstr ""
-
-#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
-#: sphinx/templates/search.html:5
-msgid "Search"
-msgstr "æœå°‹"
-
-#: sphinx/templates/layout.html:133
-msgid "Copyright"
-msgstr "版權所有"
-
-#: sphinx/templates/layout.html:178
-#, python-format
-msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
-msgstr ""
-
-#: sphinx/templates/layout.html:180
-#, python-format
-msgid "&copy; Copyright %(copyright)s."
-msgstr ""
-
-#: sphinx/templates/layout.html:183
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "最後更新日期是 %(last_updated)s."
-
-#: sphinx/templates/layout.html:186
-#, python-format
-msgid ""
-"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
-"%(sphinx_version)s."
-msgstr ""
-
-#: sphinx/templates/modindex.html:15
-msgid "Most popular modules:"
-msgstr ""
-
-#: sphinx/templates/modindex.html:24
-msgid "Show modules only available on these platforms"
-msgstr ""
-
-#: sphinx/templates/modindex.html:56
-msgid "Deprecated"
-msgstr "已移除"
-
-#: sphinx/templates/opensearch.xml:4
-#, python-format
-msgid "Search %(docstitle)s"
-msgstr "æœå°‹ %(docstitle)s"
-
-#: sphinx/templates/page.html:8
-msgid ""
-"<strong>Note:</strong> You requested an out-of-date URL from this server."
-" We've tried to redirect you to the new location of this page, but it may"
-" not be the right one."
-msgstr ""
-
-#: sphinx/templates/search.html:7
-msgid ""
-"From here you can search these documents. Enter your search\n"
-"    words into the box below and click \"search\". Note that the search\n"
-"    function will automatically search for all of the words. Pages\n"
-"    containing fewer words won't appear in the result list."
-msgstr ""
-
-#: sphinx/templates/search.html:14
-msgid "search"
-msgstr "æœå°‹"
-
-#: sphinx/templates/search.html:20
-msgid "Your search did not match any results."
-msgstr ""
-
-#: sphinx/templates/changes/frameset.html:5
-#: sphinx/templates/changes/versionchanges.html:12
-#, python-format
-msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
-msgstr ""
-
-#: sphinx/templates/changes/rstsource.html:5
-#, python-format
-msgid "%(filename)s &mdash; %(docstitle)s"
-msgstr ""
-
-#: sphinx/templates/changes/versionchanges.html:17
-#, python-format
-msgid "Automatically generated list of changes in version %(version)s"
-msgstr ""
-
-#: sphinx/templates/changes/versionchanges.html:18
-msgid "Library changes"
-msgstr ""
-
-#: sphinx/templates/changes/versionchanges.html:23
-msgid "C API changes"
-msgstr "C API 改變"
-
-#: sphinx/templates/changes/versionchanges.html:25
-msgid "Other changes"
-msgstr "其他改變:"
-
-#~ msgid ""
-#~ "From here you can search these documents. Enter your search\n"
-#~ "    words into the box below and"
-#~ " click \"search\". Note that the "
-#~ "search\n"
-#~ "    function will automatically search for all of the words. Pages\n"
-#~ "    containing less words won't appear in the result list."
-#~ msgstr ""
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/quickstart.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,533 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.quickstart
-    ~~~~~~~~~~~~~~~~~
-
-    Quickly setup documentation source to work with Sphinx.
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import sys, os, time
-from os import path
-
-TERM_ENCODING = getattr(sys.stdin, 'encoding', None)
-
-from sphinx.util import make_filename
-from sphinx.util.console import purple, bold, red, turquoise, nocolor, color_terminal
-from sphinx.util.texescape import tex_escape_map
-
-
-PROMPT_PREFIX = '> '
-
-QUICKSTART_CONF = '''\
-# -*- coding: utf-8 -*-
-#
-# %(project)s documentation build configuration file, created by
-# sphinx-quickstart on %(now)s.
-#
-# This file is execfile()d with the current directory set to its containing dir.
-#
-# The contents of this file are pickled, so don't put values in the namespace
-# that aren't pickleable (module imports are okay, they're removed automatically).
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-import sys, os
-
-# If your extensions are in another directory, add it here. If the directory
-# is relative to the documentation root, use os.path.abspath to make it
-# absolute, like shown here.
-#sys.path.append(os.path.abspath('.'))
-
-# General configuration
-# ---------------------
-
-# Add any Sphinx extension module names here, as strings. They can be extensions
-# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = [%(extensions)s]
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['%(dot)stemplates']
-
-# The suffix of source filenames.
-source_suffix = '%(suffix)s'
-
-# The encoding of source files.
-#source_encoding = 'utf-8'
-
-# The master toctree document.
-master_doc = '%(master)s'
-
-# General information about the project.
-project = u'%(project)s'
-copyright = u'%(copyright)s'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = '%(version)s'
-# The full version, including alpha/beta/rc tags.
-release = '%(release)s'
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#language = None
-
-# There are two options for replacing |today|: either, you set today to some
-# non-false value, then it is used:
-#today = ''
-# Else, today_fmt is used as the format for a strftime call.
-#today_fmt = '%%B %%d, %%Y'
-
-# List of documents that shouldn't be included in the build.
-#unused_docs = []
-
-# List of directories, relative to source directory, that shouldn't be searched
-# for source files.
-exclude_trees = [%(exclude_trees)s]
-
-# The reST default role (used for this markup: `text`) to use for all documents.
-#default_role = None
-
-# If true, '()' will be appended to :func: etc. cross-reference text.
-#add_function_parentheses = True
-
-# If true, the current module name will be prepended to all description
-# unit titles (such as .. function::).
-#add_module_names = True
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-#show_authors = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-
-# Options for HTML output
-# -----------------------
-
-# The style sheet to use for HTML and HTML Help pages. A file of that name
-# must exist either in Sphinx' static/ path, or in one of the custom paths
-# given in html_static_path.
-html_style = 'default.css'
-
-# The name for this set of Sphinx documents.  If None, it defaults to
-# "<project> v<release> documentation".
-#html_title = None
-
-# A shorter title for the navigation bar.  Default is the same as html_title.
-#html_short_title = None
-
-# The name of an image file (relative to this directory) to place at the top
-# of the sidebar.
-#html_logo = None
-
-# The name of an image file (within the static path) to use as favicon of the
-# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
-# pixels large.
-#html_favicon = None
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['%(dot)sstatic']
-
-# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
-# using the given strftime format.
-#html_last_updated_fmt = '%%b %%d, %%Y'
-
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-#html_use_smartypants = True
-
-# Custom sidebar templates, maps document names to template names.
-#html_sidebars = {}
-
-# Additional templates that should be rendered to pages, maps page names to
-# template names.
-#html_additional_pages = {}
-
-# If false, no module index is generated.
-#html_use_modindex = True
-
-# If false, no index is generated.
-#html_use_index = True
-
-# If true, the index is split into individual pages for each letter.
-#html_split_index = False
-
-# If true, the reST sources are included in the HTML build as _sources/<name>.
-#html_copy_source = True
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a <link> tag referring to it.  The value of this option must be the
-# base URL from which the finished HTML is served.
-#html_use_opensearch = ''
-
-# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
-#html_file_suffix = ''
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = '%(project_fn)sdoc'
-
-
-# Options for LaTeX output
-# ------------------------
-
-# The paper size ('letter' or 'a4').
-#latex_paper_size = 'letter'
-
-# The font size ('10pt', '11pt' or '12pt').
-#latex_font_size = '10pt'
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title, author, document class [howto/manual]).
-latex_documents = [
-  ('%(master)s', '%(project_fn)s.tex', ur'%(project_doc_texescaped)s',
-   ur'%(author_texescaped)s', 'manual'),
-]
-
-# The name of an image file (relative to this directory) to place at the top of
-# the title page.
-#latex_logo = None
-
-# For "manual" documents, if this is true, then toplevel headings are parts,
-# not chapters.
-#latex_use_parts = False
-
-# Additional stuff for the LaTeX preamble.
-#latex_preamble = ''
-
-# Documents to append as an appendix to all manuals.
-#latex_appendices = []
-
-# If false, no module index is generated.
-#latex_use_modindex = True
-'''
-
-INTERSPHINX_CONFIG = '''
-
-# Example configuration for intersphinx: refer to the Python standard library.
-intersphinx_mapping = {'http://docs.python.org/dev': None}
-'''
-
-MASTER_FILE = '''\
-.. %(project)s documentation master file, created by sphinx-quickstart on %(now)s.
-   You can adapt this file completely to your liking, but it should at least
-   contain the root `toctree` directive.
-
-Welcome to %(project)s's documentation!
-===========%(underline)s=================
-
-Contents:
-
-.. toctree::
-   :maxdepth: 2
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
-
-'''
-
-MAKEFILE = '''\
-# 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 %(rbuilddir)s/doctrees $(PAPEROPT_$(PAPER)) \
-$(SPHINXOPTS) %(rsrcdir)s
-
-.PHONY: help clean html web pickle htmlhelp latex changes linkcheck
-
-help:
-\t@echo "Please use \\`make <target>' where <target> is one of"
-\t@echo "  html      to make standalone HTML files"
-\t@echo "  pickle    to make pickle files"
-\t@echo "  json      to make JSON files"
-\t@echo "  htmlhelp  to make HTML files and a HTML help project"
-\t@echo "  latex     to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
-\t@echo "  changes   to make an overview over all changed/added/deprecated items"
-\t@echo "  linkcheck to check all external links for integrity"
-
-clean:
-\t-rm -rf %(rbuilddir)s/*
-
-html:
-\tmkdir -p %(rbuilddir)s/html %(rbuilddir)s/doctrees
-\t$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) %(rbuilddir)s/html
-\t@echo
-\t@echo "Build finished. The HTML pages are in %(rbuilddir)s/html."
-
-pickle:
-\tmkdir -p %(rbuilddir)s/pickle %(rbuilddir)s/doctrees
-\t$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) %(rbuilddir)s/pickle
-\t@echo
-\t@echo "Build finished; now you can process the pickle files."
-
-web: pickle
-
-json:
-\tmkdir -p %(rbuilddir)s/json %(rbuilddir)s/doctrees
-\t$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) %(rbuilddir)s/json
-\t@echo
-\t@echo "Build finished; now you can process the JSON files."
-
-htmlhelp:
-\tmkdir -p %(rbuilddir)s/htmlhelp %(rbuilddir)s/doctrees
-\t$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) %(rbuilddir)s/htmlhelp
-\t@echo
-\t@echo "Build finished; now you can run HTML Help Workshop with the" \\
-\t      ".hhp project file in %(rbuilddir)s/htmlhelp."
-
-latex:
-\tmkdir -p %(rbuilddir)s/latex %(rbuilddir)s/doctrees
-\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) %(rbuilddir)s/latex
-\t@echo
-\t@echo "Build finished; the LaTeX files are in %(rbuilddir)s/latex."
-\t@echo "Run \\`make all-pdf' or \\`make all-ps' in that directory to" \\
-\t      "run these through (pdf)latex."
-
-changes:
-\tmkdir -p %(rbuilddir)s/changes %(rbuilddir)s/doctrees
-\t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) %(rbuilddir)s/changes
-\t@echo
-\t@echo "The overview file is in %(rbuilddir)s/changes."
-
-linkcheck:
-\tmkdir -p %(rbuilddir)s/linkcheck %(rbuilddir)s/doctrees
-\t$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) %(rbuilddir)s/linkcheck
-\t@echo
-\t@echo "Link check complete; look for any errors in the above output " \\
-\t      "or in %(rbuilddir)s/linkcheck/output.txt."
-'''
-
-
-def mkdir_p(dir):
-    if path.isdir(dir):
-        return
-    os.makedirs(dir)
-
-
-def is_path(x):
-    """Please enter a valid path name."""
-    return path.isdir(x) or not path.exists(x)
-
-def nonempty(x):
-    """Please enter some text."""
-    return len(x)
-
-def choice(*l):
-    def val(x):
-        return x in l
-    val.__doc__ = 'Please enter one of %s.' % ', '.join(l)
-    return val
-
-def boolean(x):
-    """Please enter either 'y' or 'n'."""
-    return x.upper() in ('Y', 'YES', 'N', 'NO')
-
-def suffix(x):
-    """Please enter a file suffix, e.g. '.rst' or '.txt'."""
-    return x[0:1] == '.' and len(x) > 1
-
-def ok(x):
-    return True
-
-
-def do_prompt(d, key, text, default=None, validator=nonempty):
-    while True:
-        if default:
-            prompt = purple(PROMPT_PREFIX + '%s [%s]: ' % (text, default))
-        else:
-            prompt = purple(PROMPT_PREFIX + text + ': ')
-        x = raw_input(prompt)
-        if default and not x:
-            x = default
-        if x.decode('ascii', 'replace').encode('ascii', 'replace') != x:
-            if TERM_ENCODING:
-                x = x.decode(TERM_ENCODING)
-            else:
-                print turquoise('* Note: non-ASCII characters entered and terminal '
-                                'encoding unknown -- assuming UTF-8 or Latin-1.')
-                try:
-                    x = x.decode('utf-8')
-                except UnicodeDecodeError:
-                    x = x.decode('latin1')
-        if validator and not validator(x):
-            print red('* ' + validator.__doc__)
-            continue
-        break
-    d[key] = x
-
-
-def inner_main(args):
-    d = {}
-
-    if not sys.stdout.isatty() or not color_terminal():
-        nocolor()
-
-    print bold('Welcome to the Sphinx quickstart utility.')
-    print '''
-Please enter values for the following settings (just press Enter to
-accept a default value, if one is given in brackets).'''
-
-    print '''
-Enter the root path for documentation.'''
-    do_prompt(d, 'path', 'Root path for the documentation', '.', is_path)
-
-    while path.isfile(path.join(d['path'], 'conf.py')) or \
-          path.isfile(path.join(d['path'], 'source', 'conf.py')):
-        print
-        print bold('Error: an existing conf.py has been found in the '
-                   'selected root path.')
-        print 'sphinx-quickstart will not overwrite existing Sphinx projects.'
-        print
-        do_prompt(d, 'path', 'Please enter a new root path (or just Enter to exit)',
-                  '', is_path)
-        if not d['path']:
-            sys.exit(1)
-
-    print '''
-You have two options for placing the build directory for Sphinx output.
-Either, you use a directory ".build" within the root path, or you separate
-"source" and "build" directories within the root path.'''
-    do_prompt(d, 'sep', 'Separate source and build directories (y/N)', 'n',
-              boolean)
-    print '''
-Inside the root directory, two more directories will be created; ".templates"
-for custom HTML templates and ".static" for custom stylesheets and other
-static files. Since the leading dot may be inconvenient for Windows users,
-you can enter another prefix (such as "_") to replace the dot.'''
-    do_prompt(d, 'dot', 'Name prefix for templates and static dir', '.', ok)
-
-    print '''
-The project name will occur in several places in the built documentation.'''
-    do_prompt(d, 'project', 'Project name')
-    do_prompt(d, 'author', 'Author name(s)')
-    print '''
-Sphinx has the notion of a "version" and a "release" for the
-software. Each version can have multiple releases. For example, for
-Python the version is something like 2.5 or 3.0, while the release is
-something like 2.5.1 or 3.0a1.  If you don't need this dual structure,
-just set both to the same value.'''
-    do_prompt(d, 'version', 'Project version')
-    do_prompt(d, 'release', 'Project release', d['version'])
-    print '''
-The file name suffix for source files. Commonly, this is either ".txt"
-or ".rst".  Only files with this suffix are considered documents.'''
-    do_prompt(d, 'suffix', 'Source file suffix', '.rst', suffix)
-    print '''
-One document is special in that it is considered the top node of the
-"contents tree", that is, it is the root of the hierarchical structure
-of the documents. Normally, this is "index", but if your "index"
-document is a custom template, you can also set this to another filename.'''
-    do_prompt(d, 'master', 'Name of your master document (without suffix)',
-              'index')
-    print '''
-Please indicate if you want to use one of the following Sphinx extensions:'''
-    do_prompt(d, 'ext_autodoc', 'autodoc: automatically insert docstrings '
-              'from modules (y/N)', 'n', boolean)
-    do_prompt(d, 'ext_doctest', 'doctest: automatically test code snippets '
-              'in doctest blocks (y/N)', 'n', boolean)
-    do_prompt(d, 'ext_intersphinx', 'intersphinx: link between Sphinx documentation '
-              'of different projects (y/N)', 'n', boolean)
-    print '''
-If you are under Unix, a Makefile can be generated for you so that you
-only have to run e.g. `make html' instead of invoking sphinx-build
-directly.'''
-    do_prompt(d, 'makefile', 'Create Makefile? (Y/n)',
-              os.name == 'posix' and 'y' or 'n', boolean)
-
-    d['project_fn'] = make_filename(d['project'])
-    d['now'] = time.asctime()
-    d['underline'] = len(d['project']) * '='
-    d['extensions'] = ', '.join(
-        repr('sphinx.ext.' + name) for name in ('autodoc', 'doctest', 'intersphinx')
-        if d['ext_' + name].upper() in ('Y', 'YES'))
-    d['copyright'] = time.strftime('%Y') + ', ' + d['author']
-    d['author_texescaped'] = unicode(d['author']).translate(tex_escape_map)
-    d['project_doc'] = d['project'] + ' Documentation'
-    d['project_doc_texescaped'] = \
-        unicode(d['project'] + ' Documentation').translate(tex_escape_map)
-
-    if not path.isdir(d['path']):
-        mkdir_p(d['path'])
-
-    separate = d['sep'].upper() in ('Y', 'YES')
-    srcdir = separate and path.join(d['path'], 'source') or d['path']
-
-    mkdir_p(srcdir)
-    if separate:
-        builddir = path.join(d['path'], 'build')
-        d['exclude_trees'] = ''
-    else:
-        builddir = path.join(srcdir, d['dot'] + 'build')
-        d['exclude_trees'] = repr(d['dot'] + 'build')
-    mkdir_p(builddir)
-    mkdir_p(path.join(srcdir, d['dot'] + 'templates'))
-    mkdir_p(path.join(srcdir, d['dot'] + 'static'))
-
-    conf_text = QUICKSTART_CONF % d
-    if d['ext_intersphinx'].upper() in ('Y', 'YES'):
-        conf_text += INTERSPHINX_CONFIG
-
-    f = open(path.join(srcdir, 'conf.py'), 'w')
-    f.write(conf_text.encode('utf-8'))
-    f.close()
-
-    masterfile = path.join(srcdir, d['master'] + d['suffix'])
-    f = open(masterfile, 'w')
-    f.write((MASTER_FILE % d).encode('utf-8'))
-    f.close()
-
-    create_makefile = d['makefile'].upper() in ('Y', 'YES')
-    if create_makefile:
-        d['rsrcdir'] = separate and 'source' or '.'
-        d['rbuilddir'] = separate and 'build' or d['dot'] + 'build'
-        f = open(path.join(d['path'], 'Makefile'), 'w')
-        f.write((MAKEFILE % d).encode('utf-8'))
-        f.close()
-
-    print
-    print bold('Finished: An initial directory structure has been created.')
-    print '''
-You should now populate your master file %s and create other documentation
-source files. ''' % masterfile + (create_makefile and '''\
-Use the Makefile to build the docs, like so:
-   make builder
-''' or '''\
-Use the sphinx-build command to build the docs, like so:
-   sphinx-build -b builder %s %s
-''' % (srcdir, builddir)) + '''\
-where "builder" is one of the supported builders, e.g. html, latex or linkcheck.
-'''
-
-
-def main(argv=sys.argv):
-    try:
-        return inner_main(argv)
-    except (KeyboardInterrupt, EOFError):
-        print
-        print '[Interrupted.]'
-        return
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/roles.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,245 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.roles
-    ~~~~~~~~~~~~
-
-    Handlers for additional ReST roles.
-
-    :copyright: 2007-2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import re
-
-from docutils import nodes, utils
-from docutils.parsers.rst import roles
-
-from sphinx import addnodes
-from sphinx.util import ws_re, caption_ref_re
-
-
-generic_docroles = {
-    'command' : nodes.strong,
-    'dfn' : nodes.emphasis,
-    'guilabel' : nodes.strong,
-    'kbd' : nodes.literal,
-    'mailheader' : addnodes.literal_emphasis,
-    'makevar' : nodes.Text,
-    'manpage' : addnodes.literal_emphasis,
-    'mimetype' : addnodes.literal_emphasis,
-    'newsgroup' : addnodes.literal_emphasis,
-    'program' : nodes.strong,
-    'regexp' : nodes.literal,
-}
-
-for rolename, nodeclass in generic_docroles.iteritems():
-    roles.register_generic_role(rolename, nodeclass)
-
-
-def indexmarkup_role(typ, rawtext, etext, lineno, inliner, options={}, content=[]):
-    env = inliner.document.settings.env
-    if not typ:
-        typ = env.config.default_role
-    else:
-        typ = typ.lower()
-    text = utils.unescape(etext)
-    targetid = 'index-%s' % env.index_num
-    env.index_num += 1
-    indexnode = addnodes.index()
-    targetnode = nodes.target('', '', ids=[targetid])
-    inliner.document.note_explicit_target(targetnode)
-    if typ == 'envvar':
-        indexnode['entries'] = [('single', text, targetid, text),
-                                ('single', _('environment variable; %s') % text,
-                                 targetid, text)]
-        xref_nodes = xfileref_role(typ, rawtext, etext, lineno, inliner,
-                                   options, content)[0]
-        return [indexnode, targetnode] + xref_nodes, []
-    elif typ == 'pep':
-        indexnode['entries'] = [('single',
-                                 _('Python Enhancement Proposals!PEP %s') % text,
-                                 targetid, 'PEP %s' % text)]
-        try:
-            pepnum = int(text)
-        except ValueError:
-            msg = inliner.reporter.error('invalid PEP number %s' % text, line=lineno)
-            prb = inliner.problematic(rawtext, rawtext, msg)
-            return [prb], [msg]
-        ref = inliner.document.settings.pep_base_url + 'pep-%04d' % pepnum
-        sn = nodes.strong('PEP '+text, 'PEP '+text)
-        rn = nodes.reference('', '', refuri=ref)
-        rn += sn
-        return [indexnode, targetnode, rn], []
-    elif typ == 'rfc':
-        indexnode['entries'] = [('single', 'RFC; RFC %s' % text,
-                                 targetid, 'RFC %s' % text)]
-        try:
-            rfcnum = int(text)
-        except ValueError:
-            msg = inliner.reporter.error('invalid RFC number %s' % text, line=lineno)
-            prb = inliner.problematic(rawtext, rawtext, msg)
-            return [prb], [msg]
-        ref = inliner.document.settings.rfc_base_url + inliner.rfc_url % rfcnum
-        sn = nodes.strong('RFC '+text, 'RFC '+text)
-        rn = nodes.reference('', '', refuri=ref)
-        rn += sn
-        return [indexnode, targetnode, rn], []
-
-roles.register_canonical_role('envvar', indexmarkup_role)
-roles.register_local_role('pep', indexmarkup_role)
-roles.register_local_role('rfc', indexmarkup_role)
-
-
-# default is `literal`
-innernodetypes = {
-    'ref': nodes.emphasis,
-    'term': nodes.emphasis,
-    'token': nodes.strong,
-    'envvar': nodes.strong,
-    'option': addnodes.literal_emphasis,
-}
-
-def _fix_parens(typ, text, env):
-    if typ in ('func', 'meth', 'cfunc'):
-        if text.endswith('()'):
-            # remove parentheses
-            text = text[:-2]
-        if env.config.add_function_parentheses:
-            # add them back to all occurrences if configured
-            text += '()'
-    return text
-
-def xfileref_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
-    env = inliner.document.settings.env
-    if not typ:
-        typ = env.config.default_role
-    else:
-        typ = typ.lower()
-    text = utils.unescape(text)
-    # if the first character is a bang, don't cross-reference at all
-    if text[0:1] == '!':
-        text = _fix_parens(typ, text[1:], env)
-        return [innernodetypes.get(typ, nodes.literal)(
-            rawtext, text, classes=['xref'])], []
-    # we want a cross-reference, create the reference node
-    pnode = addnodes.pending_xref(rawtext, reftype=typ, refcaption=False,
-                                  modname=env.currmodule, classname=env.currclass)
-    # we may need the line number for warnings
-    pnode.line = lineno
-    # the link title may differ from the target, but by default they are the same
-    title = target = text
-    titleistarget = True
-    # look if explicit title and target are given with `foo <bar>` syntax
-    brace = text.find('<')
-    if brace != -1:
-        titleistarget = False
-        pnode['refcaption'] = True
-        m = caption_ref_re.match(text)
-        if m:
-            target = m.group(2)
-            title = m.group(1)
-        else:
-            # fallback: everything after '<' is the target
-            target = text[brace+1:]
-            title = text[:brace]
-    # special target for Python object cross-references
-    if typ in ('data', 'exc', 'func', 'class', 'const', 'attr', 'meth', 'mod', 'obj'):
-        # fix-up parentheses in link title
-        if titleistarget:
-            title = title.lstrip('.')   # only has a meaning for the target
-            target = target.lstrip('~') # only has a meaning for the title
-            title = _fix_parens(typ, title, env)
-            # if the first character is a tilde, don't display the module/class
-            # parts of the contents
-            if title[0:1] == '~':
-                title = title[1:]
-                dot = title.rfind('.')
-                if dot != -1:
-                    title = title[dot+1:]
-        # remove parentheses from the target too
-        if target.endswith('()'):
-            target = target[:-2]
-        # if the first character is a dot, search more specific namespaces first
-        # else search builtins first
-        if target[0:1] == '.':
-            target = target[1:]
-            pnode['refspecific'] = True
-    # some other special cases for the target
-    elif typ == 'option':
-        program = env.currprogram
-        if titleistarget:
-            if ' ' in title and not (title.startswith('/') or title.startswith('-')):
-                program, target = re.split(' (?=-|--|/)', title, 1)
-                program = ws_re.sub('-', program)
-                target = target.strip()
-        elif ' ' in target:
-            program, target = re.split(' (?=-|--|/)', target, 1)
-            program = ws_re.sub('-', program)
-        pnode['refprogram'] = program
-    elif typ == 'term':
-        # normalize whitespace in definition terms (if the term reference is
-        # broken over a line, a newline will be in target)
-        target = ws_re.sub(' ', target).lower()
-    elif typ == 'ref':
-        # reST label names are always lowercased
-        target = ws_re.sub('', target).lower()
-    else:
-        # remove all whitespace to avoid referencing problems
-        target = ws_re.sub('', target)
-    pnode['reftarget'] = target
-    pnode += innernodetypes.get(typ, nodes.literal)(rawtext, title, classes=['xref'])
-    return [pnode], []
-
-
-def menusel_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
-    return [nodes.emphasis(
-        rawtext, utils.unescape(text).replace('-->', u'\N{TRIANGULAR BULLET}'))], []
-
-
-_litvar_re = re.compile('{([^}]+)}')
-
-def emph_literal_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
-    text = utils.unescape(text)
-    pos = 0
-    retnode = nodes.literal(role=typ.lower())
-    for m in _litvar_re.finditer(text):
-        if m.start() > pos:
-            txt = text[pos:m.start()]
-            retnode += nodes.Text(txt, txt)
-        retnode += nodes.emphasis(m.group(1), m.group(1))
-        pos = m.end()
-    if pos < len(text):
-        retnode += nodes.Text(text[pos:], text[pos:])
-    return [retnode], []
-
-
-specific_docroles = {
-    'data': xfileref_role,
-    'exc': xfileref_role,
-    'func': xfileref_role,
-    'class': xfileref_role,
-    'const': xfileref_role,
-    'attr': xfileref_role,
-    'meth': xfileref_role,
-    'obj': xfileref_role,
-    'cfunc' : xfileref_role,
-    'cmember': xfileref_role,
-    'cdata': xfileref_role,
-    'ctype': xfileref_role,
-    'cmacro': xfileref_role,
-
-    'mod': xfileref_role,
-
-    'keyword': xfileref_role,
-    'ref': xfileref_role,
-    'token': xfileref_role,
-    'term': xfileref_role,
-    'option': xfileref_role,
-
-    'menuselection': menusel_role,
-    'file': emph_literal_role,
-    'samp': emph_literal_role,
-}
-
-for rolename, func in specific_docroles.iteritems():
-    roles.register_canonical_role(rolename, func)
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/search.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,205 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.search
-    ~~~~~~~~~~~~~
-
-    Create a search index for offline search.
-
-    :copyright: 2007-2008 by Armin Ronacher.
-    :license: BSD.
-"""
-import re
-import cPickle as pickle
-from cStringIO import StringIO
-
-from docutils.nodes import Text, NodeVisitor
-
-from sphinx.util.stemmer import PorterStemmer
-from sphinx.util import jsdump, rpartition
-
-
-word_re = re.compile(r'\w+(?u)')
-
-stopwords = set("""
-a  and  are  as  at
-be  but  by
-for
-if  in  into  is  it
-near  no  not
-of  on  or
-such
-that  the  their  then  there  these  they  this  to
-was  will  with
-""".split())
-
-
-class _JavaScriptIndex(object):
-    """
-    The search index as javascript file that calls a function
-    on the documentation search object to register the index.
-    """
-
-    PREFIX = 'Search.setIndex('
-    SUFFIX = ')'
-
-    def dumps(self, data):
-        return self.PREFIX + jsdump.dumps(data) + self.SUFFIX
-
-    def loads(self, s):
-        data = s[len(self.PREFIX):-len(self.SUFFIX)]
-        if not data or not s.startswith(self.PREFIX) or not \
-           s.endswith(self.SUFFIX):
-            raise ValueError('invalid data')
-        return jsdump.loads(data)
-
-    def dump(self, data, f):
-        f.write(self.dumps(data))
-
-    def load(self, f):
-        return self.loads(f.read())
-
-
-js_index = _JavaScriptIndex()
-
-
-class Stemmer(PorterStemmer):
-    """
-    All those porter stemmer implementations look hideous.
-    make at least the stem method nicer.
-    """
-
-    def stem(self, word):
-        word = word.lower()
-        return PorterStemmer.stem(self, word, 0, len(word) - 1)
-
-
-class WordCollector(NodeVisitor):
-    """
-    A special visitor that collects words for the `IndexBuilder`.
-    """
-
-    def __init__(self, document):
-        NodeVisitor.__init__(self, document)
-        self.found_words = []
-
-    def dispatch_visit(self, node):
-        if node.__class__ is Text:
-            self.found_words.extend(word_re.findall(node.astext()))
-
-
-class IndexBuilder(object):
-    """
-    Helper class that creates a searchindex based on the doctrees
-    passed to the `feed` method.
-    """
-    formats = {
-        'jsdump':   jsdump,
-        'pickle':   pickle
-    }
-
-    def __init__(self, env):
-        self.env = env
-        self._stemmer = Stemmer()
-        # filename -> title
-        self._titles = {}
-        # stemmed word -> set(filenames)
-        self._mapping = {}
-        # desctypes -> index
-        self._desctypes = {}
-
-    def load(self, stream, format):
-        """Reconstruct from frozen data."""
-        if isinstance(format, basestring):
-            format = self.formats[format]
-        frozen = format.load(stream)
-        # if an old index is present, we treat it as not existing.
-        if not isinstance(frozen, dict):
-            raise ValueError('old format')
-        index2fn = frozen['filenames']
-        self._titles = dict(zip(index2fn, frozen['titles']))
-        self._mapping = {}
-        for k, v in frozen['terms'].iteritems():
-            if isinstance(v, int):
-                self._mapping[k] = set([index2fn[v]])
-            else:
-                self._mapping[k] = set(index2fn[i] for i in v)
-        # no need to load keywords/desctypes
-
-    def dump(self, stream, format):
-        """Dump the frozen index to a stream."""
-        if isinstance(format, basestring):
-            format = self.formats[format]
-        format.dump(self.freeze(), stream)
-
-    def get_modules(self, fn2index):
-        rv = {}
-        for name, (doc, _, _, _) in self.env.modules.iteritems():
-            rv[name] = fn2index[doc]
-        return rv
-
-    def get_descrefs(self, fn2index):
-        rv = {}
-        dt = self._desctypes
-        for fullname, (doc, desctype) in self.env.descrefs.iteritems():
-            prefix, name = rpartition(fullname, '.')
-            pdict = rv.setdefault(prefix, {})
-            try:
-                i = dt[desctype]
-            except KeyError:
-                i = len(dt)
-                dt[desctype] = i
-            pdict[name] = (fn2index[doc], i)
-        return rv
-
-    def get_terms(self, fn2index):
-        rv = {}
-        for k, v in self._mapping.iteritems():
-            if len(v) == 1:
-                fn, = v
-                rv[k] = fn2index[fn]
-            else:
-                rv[k] = [fn2index[fn] for fn in v]
-        return rv
-
-    def freeze(self):
-        """Create a usable data structure for serializing."""
-        filenames = self._titles.keys()
-        titles = self._titles.values()
-        fn2index = dict((f, i) for (i, f) in enumerate(filenames))
-        return dict(
-            filenames=filenames,
-            titles=titles,
-            terms=self.get_terms(fn2index),
-            descrefs=self.get_descrefs(fn2index),
-            modules=self.get_modules(fn2index),
-            desctypes=dict((v, k) for (k, v) in self._desctypes.items()),
-        )
-
-    def prune(self, filenames):
-        """Remove data for all filenames not in the list."""
-        new_titles = {}
-        for filename in filenames:
-            if filename in self._titles:
-                new_titles[filename] = self._titles[filename]
-        self._titles = new_titles
-        for wordnames in self._mapping.itervalues():
-            wordnames.intersection_update(filenames)
-
-    def feed(self, filename, title, doctree):
-        """Feed a doctree to the index."""
-        self._titles[filename] = title
-
-        visitor = WordCollector(doctree)
-        doctree.walk(visitor)
-
-        def add_term(word, prefix='', stem=self._stemmer.stem):
-            word = stem(word)
-            if len(word) < 3 or word in stopwords or word.isdigit():
-                return
-            self._mapping.setdefault(prefix + word, set()).add(filename)
-
-        for word in word_re.findall(title):
-            add_term(word)
-
-        for word in visitor.found_words:
-            add_term(word)
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/setup_command.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.setup_command
-    ~~~~~~~~~~~~~~~~~~~~
-
-    Setuptools/distutils commands to assist the building of sphinx
-    documentation.
-
-    :author: Sebastian Wiesner
-    :contact: basti.wiesner@gmx.net
-    :copyright: 2008 by Sebastian Wiesner.
-    :license: MIT.
-"""
-
-import sys
-import os
-from StringIO import StringIO
-from distutils.cmd import Command
-
-from sphinx.application import Sphinx
-from sphinx.util.console import darkred, nocolor
-
-
-class BuildDoc(Command):
-    """Distutils command to build Sphinx documentation."""
-
-    description = 'Build Sphinx documentation'
-    user_options = [
-        ('fresh-env', 'E', 'discard saved environment'),
-        ('all-files', 'a', 'build all files'),
-        ('source-dir=', 's', 'Source directory'),
-        ('build-dir=', None, 'Build directory'),
-        ('builder=', 'b', 'The builder to use. Defaults to "html"'),
-        ]
-    boolean_options = ['fresh-env', 'all-files']
-
-
-    def initialize_options(self):
-        self.fresh_env = self.all_files = False
-        self.source_dir = self.build_dir = None
-        self.conf_file_name = 'conf.py'
-        self.builder = 'html'
-
-    def finalize_options(self):
-        if self.source_dir is None:
-            if os.path.isdir('doc'):
-                for root, dirnames, filenames in os.walk('doc'):
-                    if 'conf.py' in filenames:
-                        self.source_dir = root
-                        self.announce('Using source directory %s' % root)
-                        break
-        self.ensure_dirname('source_dir')
-        self.source_dir = os.path.abspath(self.source_dir)
-
-        if self.build_dir is None:
-            build = self.get_finalized_command('build')
-            self.build_dir = os.path.join(build.build_base, 'sphinx')
-            self.mkpath(self.build_dir)
-        self.ensure_dirname('build_dir')
-        self.doctree_dir = os.path.join(self.build_dir, 'doctrees')
-        self.mkpath(self.doctree_dir)
-        self.builder_target_dir = os.path.join(self.build_dir, self.builder)
-        self.mkpath(self.builder_target_dir)
-
-    def run(self):
-        if not sys.stdout.isatty() or sys.platform == 'win32':
-            # Windows' poor cmd box doesn't understand ANSI sequences
-            nocolor()
-        if not self.verbose:
-            status_stream = StringIO()
-        else:
-            status_stream = sys.stdout
-        app = Sphinx(self.source_dir, self.source_dir,
-                     self.builder_target_dir, self.doctree_dir,
-                     self.builder, {}, status_stream,
-                     freshenv=self.fresh_env)
-
-        try:
-            if self.all_files:
-                app.builder.build_all()
-            else:
-                app.builder.build_update()
-        except Exception, err:
-            from docutils.utils import SystemMessage
-            if isinstance(err, SystemMessage):
-                sys.stderr, darkred('reST markup error:')
-                print >>sys.stderr, err.args[0].encode('ascii', 'backslashreplace')
-            else:
-                raise
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/contents.png has changed
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/default.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,657 +0,0 @@
-/**
- * Sphinx Doc Design
- */
-
-body {
-    font-family: sans-serif;
-    font-size: 100%;
-    background-color: #11303d;
-    color: #000;
-    margin: 0;
-    padding: 0;
-}
-
-/* :::: LAYOUT :::: */
-
-div.document {
-    background-color: #1c4e63;
-}
-
-div.documentwrapper {
-    float: left;
-    width: 100%;
-}
-
-div.bodywrapper {
-    margin: 0 0 0 230px;
-}
-
-div.body {
-    background-color: white;
-    padding: 0 20px 30px 20px;
-}
-
-div.sphinxsidebarwrapper {
-    padding: 10px 5px 0 10px;
-}
-
-div.sphinxsidebar {
-    float: left;
-    width: 230px;
-    margin-left: -100%;
-    font-size: 90%;
-}
-
-div.clearer {
-    clear: both;
-}
-
-div.footer {
-    color: #fff;
-    width: 100%;
-    padding: 9px 0 9px 0;
-    text-align: center;
-    font-size: 75%;
-}
-
-div.footer a {
-    color: #fff;
-    text-decoration: underline;
-}
-
-div.related {
-    background-color: #133f52;
-    color: #fff;
-    width: 100%;
-    line-height: 30px;
-    font-size: 90%;
-}
-
-div.related h3 {
-    display: none;
-}
-
-div.related ul {
-    margin: 0;
-    padding: 0 0 0 10px;
-    list-style: none;
-}
-
-div.related li {
-    display: inline;
-}
-
-div.related li.right {
-    float: right;
-    margin-right: 5px;
-}
-
-div.related a {
-    color: white;
-}
-
-/* ::: TOC :::: */
-div.sphinxsidebar h3 {
-    font-family: 'Trebuchet MS', sans-serif;
-    color: white;
-    font-size: 1.4em;
-    font-weight: normal;
-    margin: 0;
-    padding: 0;
-}
-
-div.sphinxsidebar h3 a {
-    color: white;
-}
-
-div.sphinxsidebar h4 {
-    font-family: 'Trebuchet MS', sans-serif;
-    color: white;
-    font-size: 1.3em;
-    font-weight: normal;
-    margin: 5px 0 0 0;
-    padding: 0;
-}
-
-div.sphinxsidebar p {
-    color: white;
-}
-
-div.sphinxsidebar p.topless {
-    margin: 5px 10px 10px 10px;
-}
-
-div.sphinxsidebar ul {
-    margin: 10px;
-    padding: 0;
-    list-style: none;
-    color: white;
-}
-
-div.sphinxsidebar ul ul,
-div.sphinxsidebar ul.want-points {
-    margin-left: 20px;
-    list-style: square;
-}
-
-div.sphinxsidebar ul ul {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-div.sphinxsidebar a {
-    color: #98dbcc;
-}
-
-div.sphinxsidebar form {
-    margin-top: 10px;
-}
-
-div.sphinxsidebar input {
-    border: 1px solid #98dbcc;
-    font-family: sans-serif;
-    font-size: 1em;
-}
-
-/* :::: MODULE CLOUD :::: */
-div.modulecloud {
-    margin: -5px 10px 5px 10px;
-    padding: 10px;
-    line-height: 160%;
-    border: 1px solid #cbe7e5;
-    background-color: #f2fbfd;
-}
-
-div.modulecloud a {
-    padding: 0 5px 0 5px;
-}
-
-/* :::: SEARCH :::: */
-ul.search {
-    margin: 10px 0 0 20px;
-    padding: 0;
-}
-
-ul.search li {
-    padding: 5px 0 5px 20px;
-    background-image: url(file.png);
-    background-repeat: no-repeat;
-    background-position: 0 7px;
-}
-
-ul.search li a {
-    font-weight: bold;
-}
-
-ul.search li div.context {
-    color: #888;
-    margin: 2px 0 0 30px;
-    text-align: left;
-}
-
-ul.keywordmatches li.goodmatch a {
-    font-weight: bold;
-}
-
-/* :::: COMMON FORM STYLES :::: */
-
-div.actions {
-    padding: 5px 10px 5px 10px;
-    border-top: 1px solid #cbe7e5;
-    border-bottom: 1px solid #cbe7e5;
-    background-color: #e0f6f4;
-}
-
-form dl {
-    color: #333;
-}
-
-form dt {
-    clear: both;
-    float: left;
-    min-width: 110px;
-    margin-right: 10px;
-    padding-top: 2px;
-}
-
-input#homepage {
-    display: none;
-}
-
-div.error {
-    margin: 5px 20px 0 0;
-    padding: 5px;
-    border: 1px solid #d00;
-    font-weight: bold;
-}
-
-/* :::: INDEX PAGE :::: */
-
-table.contentstable {
-    width: 90%;
-}
-
-table.contentstable p.biglink {
-    line-height: 150%;
-}
-
-a.biglink {
-    font-size: 1.3em;
-}
-
-span.linkdescr {
-    font-style: italic;
-    padding-top: 5px;
-    font-size: 90%;
-}
-
-/* :::: INDEX STYLES :::: */
-
-table.indextable td {
-    text-align: left;
-    vertical-align: top;
-}
-
-table.indextable dl, table.indextable dd {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-table.indextable tr.pcap {
-    height: 10px;
-}
-
-table.indextable tr.cap {
-    margin-top: 10px;
-    background-color: #f2f2f2;
-}
-
-img.toggler {
-    margin-right: 3px;
-    margin-top: 3px;
-    cursor: pointer;
-}
-
-form.pfform {
-    margin: 10px 0 20px 0;
-}
-
-/* :::: GLOBAL STYLES :::: */
-
-.docwarning {
-    background-color: #ffe4e4;
-    padding: 10px;
-    margin: 0 -20px 0 -20px;
-    border-bottom: 1px solid #f66;
-}
-
-p.subhead {
-    font-weight: bold;
-    margin-top: 20px;
-}
-
-a {
-    color: #355f7c;
-    text-decoration: none;
-}
-
-a:hover {
-    text-decoration: underline;
-}
-
-div.body h1,
-div.body h2,
-div.body h3,
-div.body h4,
-div.body h5,
-div.body h6 {
-    font-family: 'Trebuchet MS', sans-serif;
-    background-color: #f2f2f2;
-    font-weight: normal;
-    color: #20435c;
-    border-bottom: 1px solid #ccc;
-    margin: 20px -20px 10px -20px;
-    padding: 3px 0 3px 10px;
-}
-
-div.body h1 { margin-top: 0; font-size: 200%; }
-div.body h2 { font-size: 160%; }
-div.body h3 { font-size: 140%; }
-div.body h4 { font-size: 120%; }
-div.body h5 { font-size: 110%; }
-div.body h6 { font-size: 100%; }
-
-a.headerlink {
-    color: #c60f0f;
-    font-size: 0.8em;
-    padding: 0 4px 0 4px;
-    text-decoration: none;
-    visibility: hidden;
-}
-
-h1:hover > a.headerlink,
-h2:hover > a.headerlink,
-h3:hover > a.headerlink,
-h4:hover > a.headerlink,
-h5:hover > a.headerlink,
-h6:hover > a.headerlink,
-dt:hover > a.headerlink {
-    visibility: visible;
-}
-
-a.headerlink:hover {
-    background-color: #c60f0f;
-    color: white;
-}
-
-div.body p, div.body dd, div.body li {
-    text-align: justify;
-    line-height: 130%;
-}
-
-div.body p.caption {
-    text-align: inherit;
-}
-
-div.body td {
-    text-align: left;
-}
-
-ul.fakelist {
-    list-style: none;
-    margin: 10px 0 10px 20px;
-    padding: 0;
-}
-
-.field-list ul {
-    padding-left: 1em;
-}
-
-.first {
-    margin-top: 0 !important;
-}
-
-/* "Footnotes" heading */
-p.rubric {
-    margin-top: 30px;
-    font-weight: bold;
-}
-
-/* Sidebars */
-
-div.sidebar {
-    margin: 0 0 0.5em 1em;
-    border: 1px solid #ddb;
-    padding: 7px 7px 0 7px;
-    background-color: #ffe;
-    width: 40%;
-    float: right;
-}
-
-p.sidebar-title {
-    font-weight: bold;
-}
-
-/* "Topics" */
-
-div.topic {
-    background-color: #eee;
-    border: 1px solid #ccc;
-    padding: 7px 7px 0 7px;
-    margin: 10px 0 10px 0;
-}
-
-p.topic-title {
-    font-size: 1.1em;
-    font-weight: bold;
-    margin-top: 10px;
-}
-
-/* Admonitions */
-
-div.admonition {
-    margin-top: 10px;
-    margin-bottom: 10px;
-    padding: 7px;
-}
-
-div.admonition dt {
-    font-weight: bold;
-}
-
-div.admonition dl {
-    margin-bottom: 0;
-}
-
-div.admonition p.admonition-title + p {
-    display: inline;
-}
-
-div.seealso {
-    background-color: #ffc;
-    border: 1px solid #ff6;
-}
-
-div.warning {
-    background-color: #ffe4e4;
-    border: 1px solid #f66;
-}
-
-div.note {
-    background-color: #eee;
-    border: 1px solid #ccc;
-}
-
-p.admonition-title {
-    margin: 0px 10px 5px 0px;
-    font-weight: bold;
-    display: inline;
-}
-
-p.admonition-title:after {
-    content: ":";
-}
-
-div.body p.centered {
-    text-align: center;
-    margin-top: 25px;
-}
-
-table.docutils {
-    border: 0;
-}
-
-table.docutils td, table.docutils th {
-    padding: 1px 8px 1px 0;
-    border-top: 0;
-    border-left: 0;
-    border-right: 0;
-    border-bottom: 1px solid #aaa;
-}
-
-table.field-list td, table.field-list th {
-    border: 0 !important;
-}
-
-table.footnote td, table.footnote th {
-    border: 0 !important;
-}
-
-.field-list ul {
-    margin: 0;
-    padding-left: 1em;
-}
-
-.field-list p {
-    margin: 0;
-}
-
-dl {
-    margin-bottom: 15px;
-    clear: both;
-}
-
-dd p {
-    margin-top: 0px;
-}
-
-dd ul, dd table {
-    margin-bottom: 10px;
-}
-
-dd {
-    margin-top: 3px;
-    margin-bottom: 10px;
-    margin-left: 30px;
-}
-
-.refcount {
-    color: #060;
-}
-
-dt:target,
-.highlight {
-    background-color: #fbe54e;
-}
-
-dl.glossary dt {
-    font-weight: bold;
-    font-size: 1.1em;
-}
-
-th {
-    text-align: left;
-    padding-right: 5px;
-}
-
-pre {
-    padding: 5px;
-    background-color: #efc;
-    color: #333;
-    border: 1px solid #ac9;
-    border-left: none;
-    border-right: none;
-    overflow: auto;
-}
-
-td.linenos pre {
-    padding: 5px 0px;
-    border: 0;
-    background-color: transparent;
-    color: #aaa;
-}
-
-table.highlighttable {
-    margin-left: 0.5em;
-}
-
-table.highlighttable td {
-    padding: 0 0.5em 0 0.5em;
-}
-
-tt {
-    background-color: #ecf0f3;
-    padding: 0 1px 0 1px;
-    font-size: 0.95em;
-}
-
-tt.descname {
-    background-color: transparent;
-    font-weight: bold;
-    font-size: 1.2em;
-}
-
-tt.descclassname {
-    background-color: transparent;
-}
-
-tt.xref, a tt {
-    background-color: transparent;
-    font-weight: bold;
-}
-
-.footnote:target  { background-color: #ffa }
-
-h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
-    background-color: transparent;
-}
-
-.optional {
-    font-size: 1.3em;
-}
-
-.versionmodified {
-    font-style: italic;
-}
-
-form.comment {
-    margin: 0;
-    padding: 10px 30px 10px 30px;
-    background-color: #eee;
-}
-
-form.comment h3 {
-    background-color: #326591;
-    color: white;
-    margin: -10px -30px 10px -30px;
-    padding: 5px;
-    font-size: 1.4em;
-}
-
-form.comment input,
-form.comment textarea {
-    border: 1px solid #ccc;
-    padding: 2px;
-    font-family: sans-serif;
-    font-size: 100%;
-}
-
-form.comment input[type="text"] {
-    width: 240px;
-}
-
-form.comment textarea {
-    width: 100%;
-    height: 200px;
-    margin-bottom: 10px;
-}
-
-.system-message {
-    background-color: #fda;
-    padding: 5px;
-    border: 3px solid red;
-}
-
-img.math {
-    vertical-align: middle;
-}
-
-div.math p {
-    text-align: center;
-}
-
-span.eqno {
-    float: right;
-}
-
-img.logo {
-    border: 0;
-}
-
-/* :::: PRINT :::: */
-@media print {
-    div.document,
-    div.documentwrapper,
-    div.bodywrapper {
-        margin: 0;
-        width : 100%;
-    }
-
-    div.sphinxsidebar,
-    div.related,
-    div.footer,
-    div#comments div.new-comment-box,
-    #top-link {
-        display: none;
-    }
-}
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/doctools.js	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,232 +0,0 @@
-/// XXX: make it cross browser
-
-/**
- * make the code below compatible with browsers without
- * an installed firebug like debugger
- */
-if (!window.console || !console.firebug) {
-  var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
-      "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
-  window.console = {};
-  for (var i = 0; i < names.length; ++i)
-    window.console[names[i]] = function() {}
-}
-
-/**
- * small helper function to urldecode strings
- */
-jQuery.urldecode = function(x) {
-  return decodeURIComponent(x).replace(/\+/g, ' ');
-}
-
-/**
- * small helper function to urlencode strings
- */
-jQuery.urlencode = encodeURIComponent;
-
-/**
- * This function returns the parsed url parameters of the
- * current request. Multiple values per key are supported,
- * it will always return arrays of strings for the value parts.
- */
-jQuery.getQueryParameters = function(s) {
-  if (typeof s == 'undefined')
-    s = document.location.search;
-  var parts = s.substr(s.indexOf('?') + 1).split('&');
-  var result = {};
-  for (var i = 0; i < parts.length; i++) {
-    var tmp = parts[i].split('=', 2);
-    var key = jQuery.urldecode(tmp[0]);
-    var value = jQuery.urldecode(tmp[1]);
-    if (key in result)
-      result[key].push(value);
-    else
-      result[key] = [value];
-  }
-  return result;
-}
-
-/**
- * small function to check if an array contains
- * a given item.
- */
-jQuery.contains = function(arr, item) {
-  for (var i = 0; i < arr.length; i++) {
-    if (arr[i] == item)
-      return true;
-  }
-  return false;
-}
-
-/**
- * highlight a given string on a jquery object by wrapping it in
- * span elements with the given class name.
- */
-jQuery.fn.highlightText = function(text, className) {
-  function highlight(node) {
-    if (node.nodeType == 3) {
-      var val = node.nodeValue;
-      var pos = val.toLowerCase().indexOf(text);
-      if (pos >= 0 && !jQuery.className.has(node.parentNode, className)) {
-        var span = document.createElement("span");
-        span.className = className;
-        span.appendChild(document.createTextNode(val.substr(pos, text.length)));
-        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
-          document.createTextNode(val.substr(pos + text.length)),
-          node.nextSibling));
-        node.nodeValue = val.substr(0, pos);
-      }
-    }
-    else if (!jQuery(node).is("button, select, textarea")) {
-      jQuery.each(node.childNodes, function() {
-        highlight(this)
-      });
-    }
-  }
-  return this.each(function() {
-    highlight(this);
-  });
-}
-
-/**
- * Small JavaScript module for the documentation.
- */
-var Documentation = {
-
-  init : function() {
-    this.fixFirefoxAnchorBug();
-    this.highlightSearchWords();
-    this.initModIndex();
-  },
-
-  /**
-   * i18n support
-   */
-  TRANSLATIONS : {},
-  PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
-  LOCALE : 'unknown',
-
-  // gettext and ngettext don't access this so that the functions
-  // can savely bound to a different name (_ = Documentation.gettext)
-  gettext : function(string) {
-    var translated = Documentation.TRANSLATIONS[string];
-    if (typeof translated == 'undefined')
-      return string;
-    return (typeof translated == 'string') ? translated : translated[0];
-  },
-
-  ngettext : function(singular, plural, n) {
-    var translated = Documentation.TRANSLATIONS[singular];
-    if (typeof translated == 'undefined')
-      return (n == 1) ? singular : plural;
-    return translated[Documentation.PLURALEXPR(n)];
-  },
-
-  addTranslations : function(catalog) {
-    for (var key in catalog.messages)
-      this.TRANSLATIONS[key] = catalog.messages[key];
-    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
-    this.LOCALE = catalog.locale;
-  },
-
-  /**
-   * add context elements like header anchor links
-   */
-  addContextElements : function() {
-    $('div[@id] > :header:first').each(function() {
-      $('<a class="headerlink">\u00B6</a>').
-      attr('href', '#' + this.id).
-      attr('title', _('Permalink to this headline')).
-      appendTo(this);
-    });
-    $('dt[@id]').each(function() {
-      $('<a class="headerlink">\u00B6</a>').
-      attr('href', '#' + this.id).
-      attr('title', _('Permalink to this definition')).
-      appendTo(this);
-    });
-  },
-
-  /**
-   * workaround a firefox stupidity
-   */
-  fixFirefoxAnchorBug : function() {
-    if (document.location.hash && $.browser.mozilla)
-      window.setTimeout(function() {
-        document.location.href += '';
-      }, 10);
-  },
-
-  /**
-   * highlight the search words provided in the url in the text
-   */
-  highlightSearchWords : function() {
-    var params = $.getQueryParameters();
-    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
-    if (terms.length) {
-      var body = $('div.body');
-      window.setTimeout(function() {
-        $.each(terms, function() {
-          body.highlightText(this.toLowerCase(), 'highlight');
-        });
-      }, 10);
-      $('<li class="highlight-link"><a href="javascript:Documentation.' +
-        'hideSearchWords()">' + _('Hide Search Matches') + '</a></li>')
-          .appendTo($('.sidebar .this-page-menu'));
-    }
-  },
-
-  /**
-   * init the modindex toggle buttons
-   */
-  initModIndex : function() {
-    var togglers = $('img.toggler').click(function() {
-      var src = $(this).attr('src');
-      var idnum = $(this).attr('id').substr(7);
-      console.log($('tr.cg-' + idnum).toggle());
-      if (src.substr(-9) == 'minus.png')
-        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
-      else
-        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
-    }).css('display', '');
-    if (DOCUMENTATION_OPTIONS.COLLAPSE_MODINDEX) {
-        togglers.click();
-    }
-  },
-
-  /**
-   * helper function to hide the search marks again
-   */
-  hideSearchWords : function() {
-    $('.sidebar .this-page-menu li.highlight-link').fadeOut(300);
-    $('span.highlight').removeClass('highlight');
-  },
-
-  /**
-   * make the url absolute
-   */
-  makeURL : function(relativeURL) {
-    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
-  },
-
-  /**
-   * get the current relative url
-   */
-  getCurrentURL : function() {
-    var path = document.location.pathname;
-    var parts = path.split(/\//);
-    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
-      if (this == '..')
-        parts.pop();
-    });
-    var url = parts.join('/');
-    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
-  }
-};
-
-// quick alias for translations
-_ = Documentation.gettext;
-
-$(document).ready(function() {
-  Documentation.init();
-});
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/file.png has changed
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/jquery.js	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * jQuery 1.2.6 - New Wave Javascript
- *
- * Copyright (c) 2008 John Resig (jquery.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
- * $Rev: 5685 $
- */
-(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
-return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
-return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
-selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
-return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
-this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
-return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
-jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
-script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
-for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
-for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
-jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
-ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
-while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
-while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
-for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
-jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
-xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
-jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
-for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
-s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
-e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/minus.png has changed
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/navigation.png has changed
Binary file buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/plus.png has changed
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/rightsidebar.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-/**
- * Sphinx Doc Design -- Right Side Bar Overrides
- */
-
-
-div.sphinxsidebar {
-    float: right;
-}
-
-div.bodywrapper {
-    margin: 0 230px 0 0;
-}
-
-div.inlinecomments {
-    right: 250px;
-}
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/searchtools.js	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,467 +0,0 @@
-/**
- * helper function to return a node containing the
- * search summary for a given text. keywords is a list
- * of stemmed words, hlwords is the list of normal, unstemmed
- * words. the first one is used to find the occurance, the
- * latter for highlighting it.
- */
-
-jQuery.makeSearchSummary = function(text, keywords, hlwords) {
-  var textLower = text.toLowerCase();
-  var start = 0;
-  $.each(keywords, function() {
-    var i = textLower.indexOf(this.toLowerCase());
-    if (i > -1)
-      start = i;
-  });
-  start = Math.max(start - 120, 0);
-  var excerpt = ((start > 0) ? '...' : '') +
-  $.trim(text.substr(start, 240)) +
-  ((start + 240 - text.length) ? '...' : '');
-  var rv = $('<div class="context"></div>').text(excerpt);
-  $.each(hlwords, function() {
-    rv = rv.highlightText(this, 'highlight');
-  });
-  return rv;
-}
-
-/**
- * Porter Stemmer
- */
-var PorterStemmer = function() {
-
-  var step2list = {
-    ational: 'ate',
-    tional: 'tion',
-    enci: 'ence',
-    anci: 'ance',
-    izer: 'ize',
-    bli: 'ble',
-    alli: 'al',
-    entli: 'ent',
-    eli: 'e',
-    ousli: 'ous',
-    ization: 'ize',
-    ation: 'ate',
-    ator: 'ate',
-    alism: 'al',
-    iveness: 'ive',
-    fulness: 'ful',
-    ousness: 'ous',
-    aliti: 'al',
-    iviti: 'ive',
-    biliti: 'ble',
-    logi: 'log'
-  };
-
-  var step3list = {
-    icate: 'ic',
-    ative: '',
-    alize: 'al',
-    iciti: 'ic',
-    ical: 'ic',
-    ful: '',
-    ness: ''
-  };
-
-  var c = "[^aeiou]";          // consonant
-  var v = "[aeiouy]";          // vowel
-  var C = c + "[^aeiouy]*";    // consonant sequence
-  var V = v + "[aeiou]*";      // vowel sequence
-
-  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
-  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
-  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
-  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem
-
-  this.stemWord = function (w) {
-    var stem;
-    var suffix;
-    var firstch;
-    var origword = w;
-
-    if (w.length < 3)
-      return w;
-
-    var re;
-    var re2;
-    var re3;
-    var re4;
-
-    firstch = w.substr(0,1);
-    if (firstch == "y")
-      w = firstch.toUpperCase() + w.substr(1);
-
-    // Step 1a
-    re = /^(.+?)(ss|i)es$/;
-    re2 = /^(.+?)([^s])s$/;
-
-    if (re.test(w))
-      w = w.replace(re,"$1$2");
-    else if (re2.test(w))
-      w = w.replace(re2,"$1$2");
-
-    // Step 1b
-    re = /^(.+?)eed$/;
-    re2 = /^(.+?)(ed|ing)$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      re = new RegExp(mgr0);
-      if (re.test(fp[1])) {
-        re = /.$/;
-        w = w.replace(re,"");
-      }
-    }
-    else if (re2.test(w)) {
-      var fp = re2.exec(w);
-      stem = fp[1];
-      re2 = new RegExp(s_v);
-      if (re2.test(stem)) {
-        w = stem;
-        re2 = /(at|bl|iz)$/;
-        re3 = new RegExp("([^aeiouylsz])\\1$");
-        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
-        if (re2.test(w))
-          w = w + "e";
-        else if (re3.test(w)) {
-          re = /.$/;
-          w = w.replace(re,"");
-        }
-        else if (re4.test(w))
-          w = w + "e";
-      }
-    }
-
-    // Step 1c
-    re = /^(.+?)y$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      re = new RegExp(s_v);
-      if (re.test(stem))
-        w = stem + "i";
-    }
-
-    // Step 2
-    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      suffix = fp[2];
-      re = new RegExp(mgr0);
-      if (re.test(stem))
-        w = stem + step2list[suffix];
-    }
-
-    // Step 3
-    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      suffix = fp[2];
-      re = new RegExp(mgr0);
-      if (re.test(stem))
-        w = stem + step3list[suffix];
-    }
-
-    // Step 4
-    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
-    re2 = /^(.+?)(s|t)(ion)$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      re = new RegExp(mgr1);
-      if (re.test(stem))
-        w = stem;
-    }
-    else if (re2.test(w)) {
-      var fp = re2.exec(w);
-      stem = fp[1] + fp[2];
-      re2 = new RegExp(mgr1);
-      if (re2.test(stem))
-        w = stem;
-    }
-
-    // Step 5
-    re = /^(.+?)e$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      re = new RegExp(mgr1);
-      re2 = new RegExp(meq1);
-      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
-      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
-        w = stem;
-    }
-    re = /ll$/;
-    re2 = new RegExp(mgr1);
-    if (re.test(w) && re2.test(w)) {
-      re = /.$/;
-      w = w.replace(re,"");
-    }
-
-    // and turn initial Y back to y
-    if (firstch == "y")
-      w = firstch.toLowerCase() + w.substr(1);
-    return w;
-  }
-}
-
-
-/**
- * Search Module
- */
-var Search = {
-
-  _index : null,
-  _queued_query : null,
-  _pulse_status : -1,
-
-  init : function() {
-      var params = $.getQueryParameters();
-      if (params.q) {
-          var query = params.q[0];
-          $('input[@name="q"]')[0].value = query;
-          this.performSearch(query);
-      }
-  },
-
-  /**
-   * Sets the index
-   */
-  setIndex : function(index) {
-    var q;
-    this._index = index;
-    if ((q = this._queued_query) !== null) {
-      this._queued_query = null;
-      Search.query(q);
-    }
-  },
-
-  hasIndex : function() {
-      return this._index !== null;
-  },
-
-  deferQuery : function(query) {
-      this._queued_query = query;
-  },
-
-  stopPulse : function() {
-      this._pulse_status = 0;
-  },
-
-  startPulse : function() {
-    if (this._pulse_status >= 0)
-        return;
-    function pulse() {
-      Search._pulse_status = (Search._pulse_status + 1) % 4;
-      var dotString = '';
-      for (var i = 0; i < Search._pulse_status; i++)
-        dotString += '.';
-      Search.dots.text(dotString);
-      if (Search._pulse_status > -1)
-        window.setTimeout(pulse, 500);
-    };
-    pulse();
-  },
-
-  /**
-   * perform a search for something
-   */
-  performSearch : function(query) {
-    // create the required interface elements
-    this.out = $('#search-results');
-    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
-    this.dots = $('<span></span>').appendTo(this.title);
-    this.status = $('<p style="display: none"></p>').appendTo(this.out);
-    this.output = $('<ul class="search"/>').appendTo(this.out);
-
-    $('#search-progress').text(_('Preparing search...'));
-    this.startPulse();
-
-    // index already loaded, the browser was quick!
-    if (this.hasIndex())
-      this.query(query);
-    else
-      this.setQuery(query);
-  },
-
-  query : function(query) {
-    // stem the searchterms and add them to the
-    // correct list
-    var stemmer = new PorterStemmer();
-    var searchterms = [];
-    var excluded = [];
-    var hlterms = [];
-    var tmp = query.split(/\s+/);
-    var object = (tmp.length == 1) ? tmp[0].toLowerCase() : null;
-    for (var i = 0; i < tmp.length; i++) {
-      // stem the word
-      var word = stemmer.stemWord(tmp[i]).toLowerCase();
-      // select the correct list
-      if (word[0] == '-') {
-        var toAppend = excluded;
-        word = word.substr(1);
-      }
-      else {
-        var toAppend = searchterms;
-        hlterms.push(tmp[i].toLowerCase());
-      }
-      // only add if not already in the list
-      if (!$.contains(toAppend, word))
-        toAppend.push(word);
-    };
-    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
-
-    console.debug('SEARCH: searching for:');
-    console.info('required: ', searchterms);
-    console.info('excluded: ', excluded);
-
-    // prepare search
-    var filenames = this._index.filenames;
-    var titles = this._index.titles;
-    var terms = this._index.terms;
-    var descrefs = this._index.descrefs;
-    var modules = this._index.modules;
-    var desctypes = this._index.desctypes;
-    var fileMap = {};
-    var files = null;
-    var objectResults = [];
-    var regularResults = [];
-    $('#search-progress').empty();
-
-    // lookup as object
-    if (object != null) {
-      for (var module in modules) {
-        if (module.indexOf(object) > -1) {
-          fn = modules[module];
-          descr = _('module, in ') + titles[fn];
-          objectResults.push([filenames[fn], module, '#module-'+module, descr]);
-        }
-      }
-      for (var prefix in descrefs) {
-        for (var name in descrefs[prefix]) {
-          if (name.toLowerCase().indexOf(object) > -1) {
-            match = descrefs[prefix][name];
-            fullname = (prefix ? prefix + '.' : '') + name;
-            descr = desctypes[match[1]] + _(', in ') + titles[match[0]];
-            objectResults.push([filenames[match[0]], fullname, '#'+fullname, descr]);
-          }
-        }
-      }
-    }
-
-    // sort results descending
-    objectResults.sort(function(a, b) {
-      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
-    });
-
-
-    // perform the search on the required terms
-    for (var i = 0; i < searchterms.length; i++) {
-      var word = searchterms[i];
-      // no match but word was a required one
-      if ((files = terms[word]) == null)
-        break;
-      if (files.length == undefined) {
-        files = [files];
-      }
-      // create the mapping
-      for (var j = 0; j < files.length; j++) {
-        var file = files[j];
-        if (file in fileMap)
-          fileMap[file].push(word);
-        else
-          fileMap[file] = [word];
-      }
-    }
-
-    // now check if the files don't contain excluded terms
-    for (var file in fileMap) {
-      var valid = true;
-
-      // check if all requirements are matched
-      if (fileMap[file].length != searchterms.length)
-        continue;
-
-      // ensure that none of the excluded terms is in the
-      // search result.
-      for (var i = 0; i < excluded.length; i++) {
-        if (terms[excluded[i]] == file ||
-            $.contains(terms[excluded[i]] || [], file)) {
-          valid = false;
-          break;
-        }
-      }
-
-      // if we have still a valid result we can add it
-      // to the result list
-      if (valid)
-        regularResults.push([filenames[file], titles[file], '', null]);
-    }
-
-    // delete unused variables in order to not waste
-    // memory until list is retrieved completely
-    delete filenames, titles, terms;
-
-    // now sort the regular results descending by title
-    regularResults.sort(function(a, b) {
-      var left = a[1].toLowerCase();
-      var right = b[1].toLowerCase();
-      return (left > right) ? -1 : ((left < right) ? 1 : 0);
-    });
-
-    // combine both
-    var results = regularResults.concat(objectResults);
-
-    // print the results
-    var resultCount = results.length;
-    function displayNextItem() {
-      // results left, load the summary and display it
-      if (results.length) {
-        var item = results.pop();
-        var listItem = $('<li style="display:none"></li>');
-        listItem.append($('<a/>').attr(
-          'href',
-          item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
-          highlightstring + item[2]).html(item[1]));
-        if (item[3]) {
-          listItem.append($('<span> (' + item[3] + ')</span>'));
-          Search.output.append(listItem);
-          listItem.slideDown(5, function() {
-            displayNextItem();
-          });
-        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
-          $.get('_sources/' + item[0] + '.txt', function(data) {
-            listItem.append($.makeSearchSummary(data, searchterms, hlterms));
-            Search.output.append(listItem);
-            listItem.slideDown(5, function() {
-              displayNextItem();
-            });
-          });
-        } else {
-          // no source available, just display title
-          Search.output.append(listItem);
-          listItem.slideDown(5, function() {
-            displayNextItem();
-          });
-        }
-      }
-      // search finished, update title and status message
-      else {
-        Search.stopPulse();
-        Search.title.text(_('Search Results'));
-        if (!resultCount)
-          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
-        else
-            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
-        Search.status.fadeIn(500);
-      }
-    }
-    displayNextItem();
-  }
-}
-
-$(document).ready(function() {
-  Search.init();
-});
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/sphinxdoc.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,557 +0,0 @@
-/**
- * Alternate Sphinx design
- * Originally created by Armin Ronacher for Werkzeug, adapted by Georg Brandl.
- */
-
-body {
-    font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif;
-    font-size: 14px;
-    letter-spacing: -0.01em;
-    line-height: 150%;
-    text-align: center;
-    /*background-color: #AFC1C4; */
-    background-color: #BFD1D4;
-    color: black;
-    padding: 0;
-    border: 1px solid #aaa;
-
-    margin: 0px 80px 0px 80px;
-    min-width: 740px;
-}
-
-a {
-    color: #CA7900;
-    text-decoration: none;
-}
-
-a:hover {
-    color: #2491CF;
-}
-
-pre {
-    font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
-    font-size: 0.95em;
-    letter-spacing: 0.015em;
-    padding: 0.5em;
-    border: 1px solid #ccc;
-    background-color: #f8f8f8;
-}
-
-td.linenos pre {
-    padding: 0.5em 0;
-    border: 0;
-    background-color: transparent;
-    color: #aaa;
-}
-
-table.highlighttable {
-    margin-left: 0.5em;
-}
-
-table.highlighttable td {
-    padding: 0 0.5em 0 0.5em;
-}
-
-cite, code, tt {
-    font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
-    font-size: 0.95em;
-    letter-spacing: 0.01em;
-}
-
-hr {
-    border: 1px solid #abc;
-    margin: 2em;
-}
-
-tt {
-    background-color: #f2f2f2;
-    border-bottom: 1px solid #ddd;
-    color: #333;
-}
-
-tt.descname {
-    background-color: transparent;
-    font-weight: bold;
-    font-size: 1.2em;
-    border: 0;
-}
-
-tt.descclassname {
-    background-color: transparent;
-    border: 0;
-}
-
-tt.xref {
-    background-color: transparent;
-    font-weight: bold;
-    border: 0;
-}
-
-a tt {
-    background-color: transparent;
-    font-weight: bold;
-    border: 0;
-    color: #CA7900;
-}
-
-a tt:hover {
-    color: #2491CF;
-}
-
-.field-list ul {
-    margin: 0;
-    padding-left: 1em;
-}
-
-.field-list p {
-    margin: 0;
-}
-
-dl {
-    margin-bottom: 15px;
-}
-
-dd p {
-    margin-top: 0px;
-}
-
-dd ul, dd table {
-    margin-bottom: 10px;
-}
-
-dd {
-    margin-top: 3px;
-    margin-bottom: 10px;
-    margin-left: 30px;
-}
-
-.refcount {
-    color: #060;
-}
-
-dt:target,
-.highlight {
-    background-color: #fbe54e;
-}
-
-dl.glossary dt {
-    font-weight: bold;
-    font-size: 1.1em;
-}
-
-pre {
-    line-height: 120%;
-}
-
-pre a {
-    color: inherit;
-    text-decoration: underline;
-}
-
-.first {
-    margin-top: 0 !important;
-}
-
-div.document {
-    background-color: white;
-    text-align: left;
-    background-image: url(contents.png);
-    background-repeat: repeat-x;
-}
-
-/*
-div.documentwrapper {
-    width: 100%;
-}
-*/
-
-div.clearer {
-    clear: both;
-}
-
-div.related h3 {
-    display: none;
-}
-
-div.related ul {
-    background-image: url(navigation.png);
-    height: 2em;
-    list-style: none;
-    border-top: 1px solid #ddd;
-    border-bottom: 1px solid #ddd;
-    margin: 0;
-    padding-left: 10px;
-}
-
-div.related ul li {
-    margin: 0;
-    padding: 0;
-    height: 2em;
-    float: left;
-}
-
-div.related ul li.right {
-    float: right;
-    margin-right: 5px;
-}
-
-div.related ul li a {
-    margin: 0;
-    padding: 0 5px 0 5px;
-    line-height: 1.75em;
-    color: #EE9816;
-}
-
-div.related ul li a:hover {
-    color: #3CA8E7;
-}
-
-div.body {
-    margin: 0;
-    padding: 0.5em 20px 20px 20px;
-}
-
-div.bodywrapper {
-    margin: 0 240px 0 0;
-    border-right: 1px solid #ccc;
-}
-
-div.body a {
-    text-decoration: underline;
-}
-
-div.sphinxsidebar {
-    margin: 0;
-    padding: 0.5em 15px 15px 0;
-    width: 210px;
-    float: right;
-    text-align: left;
-/*    margin-left: -100%; */
-}
-
-div.sphinxsidebar h4, div.sphinxsidebar h3 {
-    margin: 1em 0 0.5em 0;
-    font-size: 0.9em;
-    padding: 0.1em 0 0.1em 0.5em;
-    color: white;
-    border: 1px solid #86989B;
-    background-color: #AFC1C4;
-}
-
-div.sphinxsidebar h3 a {
-    color: white;
-}
-
-div.sphinxsidebar ul {
-    padding-left: 1.5em;
-    margin-top: 7px;
-    list-style: none;
-    padding: 0;
-    line-height: 130%;
-}
-
-div.sphinxsidebar ul ul {
-    list-style: square;
-    margin-left: 20px;
-}
-
-p {
-    margin: 0.8em 0 0.5em 0;
-}
-
-p.rubric {
-    font-weight: bold;
-}
-
-div.sidebar {
-    margin: 0 0 0.5em 1em;
-    border: 1px solid #ddb;
-    padding: 7px 7px 0 7px;
-    background-color: #ffe;
-    width: 40%;
-    float: right;
-}
-
-div.quotebar {
-    background-color: #f8f8f8;
-    max-width: 250px;
-    float: right;
-    padding: 2px 7px;
-    border: 1px solid #ccc;
-}
-
-p.sidebar-title {
-    font-weight: bold;
-}
-
-div.topic {
-    background-color: #f8f8f8;
-    border: 1px solid #ccc;
-    padding: 7px 7px 0 7px;
-    margin: 10px 0 10px 0;
-}
-
-p.topic-title {
-    font-size: 1.1em;
-    font-weight: bold;
-}
-
-h1 {
-    margin: 0;
-    padding: 0.7em 0 0.3em 0;
-    font-size: 1.5em;
-    color: #11557C;
-}
-
-h2 {
-    margin: 1.3em 0 0.2em 0;
-    font-size: 1.35em;
-    padding: 0;
-}
-
-h3 {
-    margin: 1em 0 -0.3em 0;
-    font-size: 1.2em;
-}
-
-div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a {
-    color: black!important;
-}
-
-h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor {
-    display: none;
-    margin: 0 0 0 0.3em;
-    padding: 0 0.2em 0 0.2em;
-    color: #aaa!important;
-}
-
-h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor,
-h5:hover a.anchor, h6:hover a.anchor {
-    display: inline;
-}
-
-h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover,
-h5 a.anchor:hover, h6 a.anchor:hover {
-    color: #777;
-    background-color: #eee;
-}
-
-table {
-    border-collapse: collapse;
-    margin: 0 -0.5em 0 -0.5em;
-}
-
-table td, table th {
-    padding: 0.2em 0.5em 0.2em 0.5em;
-}
-
-div.footer {
-    background-color: #E3EFF1;
-    color: #86989B;
-    padding: 3px 8px 3px 0;
-    clear: both;
-    font-size: 0.8em;
-    text-align: right;
-}
-
-div.footer a {
-    color: #86989B;
-    text-decoration: underline;
-}
-
-div.pagination {
-    margin-top: 2em;
-    padding-top: 0.5em;
-    border-top: 1px solid black;
-    text-align: center;
-}
-
-div.sphinxsidebar ul.toc {
-    margin: 1em 0 1em 0;
-    padding: 0 0 0 0.5em;
-    list-style: none;
-}
-
-div.sphinxsidebar ul.toc li {
-    margin: 0.5em 0 0.5em 0;
-    font-size: 0.9em;
-    line-height: 130%;
-}
-
-div.sphinxsidebar ul.toc li p {
-    margin: 0;
-    padding: 0;
-}
-
-div.sphinxsidebar ul.toc ul {
-    margin: 0.2em 0 0.2em 0;
-    padding: 0 0 0 1.8em;
-}
-
-div.sphinxsidebar ul.toc ul li {
-    padding: 0;
-}
-
-div.admonition, div.warning {
-    font-size: 0.9em;
-    margin: 1em 0 0 0;
-    border: 1px solid #86989B;
-    background-color: #f7f7f7;
-}
-
-div.admonition p, div.warning p {
-    margin: 0.5em 1em 0.5em 1em;
-    padding: 0;
-}
-
-div.admonition pre, div.warning pre {
-    margin: 0.4em 1em 0.4em 1em;
-}
-
-div.admonition p.admonition-title,
-div.warning p.admonition-title {
-    margin: 0;
-    padding: 0.1em 0 0.1em 0.5em;
-    color: white;
-    border-bottom: 1px solid #86989B;
-    font-weight: bold;
-    background-color: #AFC1C4;
-}
-
-div.warning {
-    border: 1px solid #940000;
-}
-
-div.warning p.admonition-title {
-    background-color: #CF0000;
-    border-bottom-color: #940000;
-}
-
-div.admonition ul, div.admonition ol,
-div.warning ul, div.warning ol {
-    margin: 0.1em 0.5em 0.5em 3em;
-    padding: 0;
-}
-
-div.versioninfo {
-    margin: 1em 0 0 0;
-    border: 1px solid #ccc;
-    background-color: #DDEAF0;
-    padding: 8px;
-    line-height: 1.3em;
-    font-size: 0.9em;
-}
-
-
-a.headerlink {
-    color: #c60f0f!important;
-    font-size: 1em;
-    margin-left: 6px;
-    padding: 0 4px 0 4px;
-    text-decoration: none!important;
-    visibility: hidden;
-}
-
-h1:hover > a.headerlink,
-h2:hover > a.headerlink,
-h3:hover > a.headerlink,
-h4:hover > a.headerlink,
-h5:hover > a.headerlink,
-h6:hover > a.headerlink,
-dt:hover > a.headerlink {
-    visibility: visible;
-}
-
-a.headerlink:hover {
-    background-color: #ccc;
-    color: white!important;
-}
-
-table.indextable td {
-    text-align: left;
-    vertical-align: top;
-}
-
-table.indextable dl, table.indextable dd {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-table.indextable tr.pcap {
-    height: 10px;
-}
-
-table.indextable tr.cap {
-    margin-top: 10px;
-    background-color: #f2f2f2;
-}
-
-img.toggler {
-    margin-right: 3px;
-    margin-top: 3px;
-    cursor: pointer;
-}
-
-form.pfform {
-    margin: 10px 0 20px 0;
-}
-
-table.contentstable {
-    width: 90%;
-}
-
-table.contentstable p.biglink {
-    line-height: 150%;
-}
-
-a.biglink {
-    font-size: 1.3em;
-}
-
-span.linkdescr {
-    font-style: italic;
-    padding-top: 5px;
-    font-size: 90%;
-}
-
-ul.search {
-    margin: 10px 0 0 20px;
-    padding: 0;
-}
-
-ul.search li {
-    padding: 5px 0 5px 20px;
-    background-image: url(file.png);
-    background-repeat: no-repeat;
-    background-position: 0 7px;
-}
-
-ul.search li a {
-    font-weight: bold;
-}
-
-ul.search li div.context {
-    color: #888;
-    margin: 2px 0 0 30px;
-    text-align: left;
-}
-
-ul.keywordmatches li.goodmatch a {
-    font-weight: bold;
-}
-
-img.math {
-    vertical-align: center;
-}
-
-div.math {
-    text-align: center;
-}
-
-span.eqno {
-    float: right;
-}
-
-img.logo {
-    border: 0;
-}
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/stickysidebar.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/**
- * Sphinx Doc Design -- Sticky sidebar Overrides
- */
-
-div.sphinxsidebar {
-    top: 30px;
-    left: 0px;
-    position: fixed;
-    margin: 0;
-    float: none;
-}
-
-div.related {
-    position: fixed;
-}
-
-div.documentwrapper {
-    margin-top: 30px;
-}
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/static/traditional.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,700 +0,0 @@
-/**
- * Sphinx Doc Design -- traditional python.org style
- */
-
-body {
-    color: #000;
-    margin: 0;
-    padding: 0;
-}
-
-/* :::: LAYOUT :::: */
-
-div.documentwrapper {
-    float: left;
-    width: 100%;
-}
-
-div.bodywrapper {
-    margin: 0 230px 0 0;
-}
-
-div.body {
-    background-color: white;
-    padding: 0 20px 30px 20px;
-}
-
-div.sphinxsidebarwrapper {
-    border: 1px solid #99ccff;
-    padding: 10px;
-    margin: 10px 15px 10px 0;
-}
-
-div.sphinxsidebar {
-    float: right;
-    margin-left: -100%;
-    width: 230px;
-}
-
-div.clearer {
-    clear: both;
-}
-
-div.footer {
-    clear: both;
-    width: 100%;
-    background-color: #99ccff;
-    padding: 9px 0 9px 0;
-    text-align: center;
-}
-
-div.related {
-    background-color: #99ccff;
-    color: #333;
-    width: 100%;
-    height: 30px;
-    line-height: 30px;
-    border-bottom: 5px solid white;
-}
-
-div.related h3 {
-    display: none;
-}
-
-div.related ul {
-    margin: 0;
-    padding: 0 0 0 10px;
-    list-style: none;
-}
-
-div.related li {
-    display: inline;
-    font-weight: bold;
-}
-
-div.related li.right {
-    float: right;
-    margin-right: 5px;
-}
-
-/* ::: SIDEBAR :::: */
-div.sphinxsidebar h3 {
-    margin: 0;
-}
-
-div.sphinxsidebar h4 {
-    margin: 5px 0 0 0;
-}
-
-div.sphinxsidebar p.topless {
-    margin: 5px 10px 10px 10px;
-}
-
-div.sphinxsidebar ul {
-    margin: 10px;
-    margin-left: 15px;
-    padding: 0;
-}
-
-div.sphinxsidebar ul ul {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-div.sphinxsidebar form {
-    margin-top: 10px;
-}
-
-
-/* :::: SEARCH :::: */
-ul.search {
-    margin: 10px 0 0 20px;
-    padding: 0;
-}
-
-ul.search li {
-    padding: 5px 0 5px 20px;
-    background-image: url(file.png);
-    background-repeat: no-repeat;
-    background-position: 0 7px;
-}
-
-ul.search li a {
-    font-weight: bold;
-}
-
-ul.search li div.context {
-    color: #888;
-    margin: 2px 0 0 30px;
-    text-align: left;
-}
-
-ul.keywordmatches li.goodmatch a {
-    font-weight: bold;
-}
-
-/* :::: COMMON FORM STYLES :::: */
-
-div.actions {
-    border-top: 1px solid #aaa;
-    background-color: #ddd;
-    margin: 10px 0 0 -20px;
-    padding: 5px 0 5px 20px;
-}
-
-form dl {
-    color: #333;
-}
-
-form dt {
-    clear: both;
-    float: left;
-    min-width: 110px;
-    margin-right: 10px;
-    padding-top: 2px;
-}
-
-input#homepage {
-    display: none;
-}
-
-div.error {
-    margin: 5px 20px 0 0;
-    padding: 5px;
-    border: 1px solid #d00;
-    /*border: 2px solid #05171e;
-    background-color: #092835;
-    color: white;*/
-    font-weight: bold;
-}
-
-/* :::: INLINE COMMENTS :::: */
-
-div.inlinecommentswrapper {
-    float: right;
-    max-width: 40%;
-}
-
-div.commentmarker {
-    float: right;
-    background-image: url(style/comment.png);
-    background-repeat: no-repeat;
-    width: 25px;
-    height: 25px;
-    text-align: center;
-    padding-top: 3px;
-}
-
-div.nocommentmarker {
-    float: right;
-    background-image: url(style/nocomment.png);
-    background-repeat: no-repeat;
-    width: 25px;
-    height: 25px;
-}
-
-div.inlinecomments {
-    margin-left: 10px;
-    margin-bottom: 5px;
-    background-color: #eee;
-    border: 1px solid #ccc;
-    padding: 5px;
-}
-
-div.inlinecomment {
-    border-top: 1px solid #ccc;
-    padding-top: 5px;
-    margin-top: 5px;
-}
-
-.inlinecomments p {
-    margin: 5px 0 5px 0;
-}
-
-.inlinecomments .head {
-    font-weight: bold;
-}
-
-.inlinecomments .meta {
-    font-style: italic;
-}
-
-
-/* :::: COMMENTS :::: */
-
-div#comments h3 {
-    border-top: 1px solid #aaa;
-    padding: 5px 20px 5px 20px;
-    margin: 20px -20px 20px -20px;
-    background-color: #ddd;
-}
-
-/*
-div#comments {
-    background-color: #ccc;
-    margin: 40px -20px -30px -20px;
-    padding: 0 0 1px 0;
-}
-
-div#comments h4 {
-    margin: 30px 0 20px 0;
-    background-color: #aaa;
-    border-bottom: 1px solid #09232e;
-    color: #333;
-}
-
-div#comments form {
-    display: block;
-    margin: 0 0 0 20px;
-}
-
-div#comments textarea {
-    width: 98%;
-    height: 160px;
-}
-
-div#comments div.help {
-    margin: 20px 20px 10px 0;
-    background-color: #ccc;
-    color: #333;
-}
-
-div#comments div.help p {
-    margin: 0;
-    padding: 0 0 10px 0;
-}
-
-div#comments input, div#comments textarea {
-    font-family: 'Bitstream Vera Sans', 'Arial', sans-serif;
-    font-size: 13px;
-    color: black;
-    background-color: #aaa;
-    border: 1px solid #092835;
-}
-
-div#comments input[type="reset"],
-div#comments input[type="submit"] {
-    cursor: pointer;
-    font-weight: bold;
-    padding: 2px;
-    margin: 5px 5px 5px 0;
-    background-color: #666;
-    color: white;
-}
-
-div#comments div.comment {
-    margin: 10px 10px 10px 20px;
-    padding: 10px;
-    border: 1px solid #0f3646;
-    background-color: #aaa;
-    color: #333;
-}
-
-div#comments div.comment p {
-    margin: 5px 0 5px 0;
-}
-
-div#comments div.comment p.meta {
-    font-style: italic;
-    color: #444;
-    text-align: right;
-    margin: -5px 0 -5px 0;
-}
-
-div#comments div.comment h4 {
-    margin: -10px -10px 5px -10px;
-    padding: 3px;
-    font-size: 15px;
-    background-color: #888;
-    color: white;
-    border: 0;
-}
-
-div#comments div.comment pre,
-div#comments div.comment tt {
-    background-color: #ddd;
-    color: #111;
-    border: none;
-}
-
-div#comments div.comment a {
-    color: #fff;
-    text-decoration: underline;
-}
-
-div#comments div.comment blockquote {
-    margin: 10px;
-    padding: 10px;
-    border-left: 1px solid #0f3646;
-    /*border: 1px solid #0f3646;
-    background-color: #071c25;*/
-}
-
-div#comments em.important {
-    color: #d00;
-    font-weight: bold;
-    font-style: normal;
-}*/
-
-/* :::: SUGGEST CHANGES :::: */
-div#suggest-changes-box input, div#suggest-changes-box textarea {
-    border: 1px solid #ccc;
-    background-color: white;
-    color: black;
-}
-
-div#suggest-changes-box textarea {
-    width: 99%;
-    height: 400px;
-}
-
-
-/* :::: PREVIEW :::: */
-div.preview {
-    background-image: url(style/preview.png);
-    padding: 0 20px 20px 20px;
-    margin-bottom: 30px;
-}
-
-
-/* :::: INDEX PAGE :::: */
-
-table.contentstable {
-    width: 90%;
-}
-
-table.contentstable p.biglink {
-    line-height: 150%;
-}
-
-a.biglink {
-    font-size: 1.5em;
-}
-
-span.linkdescr {
-    font-style: italic;
-    padding-top: 5px;
-}
-
-/* :::: GENINDEX STYLES :::: */
-
-table.indextable td {
-    text-align: left;
-    vertical-align: top;
-}
-
-table.indextable dl, table.indextable dd {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-table.indextable tr.pcap {
-    height: 10px;
-}
-
-table.indextable tr.cap {
-    margin-top: 10px;
-    background-color: #f2f2f2;
-}
-
-img.toggler {
-    margin-right: 3px;
-    margin-top: 3px;
-    cursor: pointer;
-}
-
-/* :::: GLOBAL STYLES :::: */
-
-p.subhead {
-    font-weight: bold;
-    margin-top: 20px;
-}
-
-a:link:active           { color: #ff0000; }
-a:link:hover            { background-color: #bbeeff; }
-a:visited:hover         { background-color: #bbeeff; }
-a:visited               { color: #551a8b; }
-a:link                  { color: #0000bb; }
-
-div.body h1,
-div.body h2,
-div.body h3,
-div.body h4,
-div.body h5,
-div.body h6 {
-    font-family: avantgarde, sans-serif;
-    font-weight: bold;
-}
-
-div.body h1 { font-size: 180%; }
-div.body h2 { font-size: 150%; }
-div.body h3 { font-size: 120%; }
-div.body h4 { font-size: 120%; }
-
-a.headerlink,
-a.headerlink,
-a.headerlink,
-a.headerlink,
-a.headerlink,
-a.headerlink {
-    color: #c60f0f;
-    font-size: 0.8em;
-    padding: 0 4px 0 4px;
-    text-decoration: none;
-    visibility: hidden;
-}
-
-*:hover > a.headerlink,
-*:hover > a.headerlink,
-*:hover > a.headerlink,
-*:hover > a.headerlink,
-*:hover > a.headerlink,
-*:hover > a.headerlink {
-    visibility: visible;
-}
-
-a.headerlink:hover,
-a.headerlink:hover,
-a.headerlink:hover,
-a.headerlink:hover,
-a.headerlink:hover,
-a.headerlink:hover {
-    background-color: #c60f0f;
-    color: white;
-}
-
-div.body p, div.body dd, div.body li {
-    text-align: justify;
-}
-
-div.body td {
-    text-align: left;
-}
-
-ul.fakelist {
-    list-style: none;
-    margin: 10px 0 10px 20px;
-    padding: 0;
-}
-
-/* "Footnotes" heading */
-p.rubric {
-    margin-top: 30px;
-    font-weight: bold;
-}
-
-/* "Topics" */
-
-div.topic {
-    background-color: #eee;
-    border: 1px solid #ccc;
-    padding: 0 7px 0 7px;
-    margin: 10px 0 10px 0;
-}
-
-p.topic-title {
-    font-size: 1.1em;
-    font-weight: bold;
-    margin-top: 10px;
-}
-
-/* Admonitions */
-
-div.admonition {
-    margin-top: 10px;
-    margin-bottom: 10px;
-    padding: 7px;
-}
-
-div.admonition dt {
-    font-weight: bold;
-}
-
-div.admonition dd {
-    margin-bottom: 10px;
-}
-
-div.admonition dl {
-    margin-bottom: 0;
-}
-
-div.admonition p {
-    display: inline;
-}
-
-div.seealso {
-    background-color: #ffc;
-    border: 1px solid #ff6;
-}
-
-div.warning {
-    background-color: #ffe4e4;
-    border: 1px solid #f66;
-}
-
-div.note {
-    background-color: #eee;
-    border: 1px solid #ccc;
-}
-
-p.admonition-title {
-    margin: 0px 10px 5px 0px;
-    font-weight: bold;
-    display: inline;
-}
-
-p.admonition-title:after {
-    content: ":";
-}
-
-div.body p.centered {
-    text-align: center;
-    margin-top: 25px;
-}
-
-table.docutils {
-    border: 0;
-}
-
-table.docutils td, table.docutils th {
-    padding: 0 8px 2px 0;
-    border-top: 0;
-    border-left: 0;
-    border-right: 0;
-    border-bottom: 1px solid #aaa;
-}
-
-table.field-list td, table.field-list th {
-    border: 0 !important;
-}
-
-table.footnote td, table.footnote th {
-    border: 0 !important;
-}
-
-dl {
-    margin-bottom: 15px;
-    clear: both;
-}
-
-dd p {
-    margin-top: 0px;
-}
-
-dd ul, dd table {
-    margin-bottom: 10px;
-}
-
-dd {
-    margin-top: 3px;
-    margin-bottom: 10px;
-    margin-left: 30px;
-}
-
-dl.glossary dt {
-    font-weight: bold;
-    font-size: 1.1em;
-}
-
-.refcount {
-    color: #060;
-}
-
-th {
-    text-align: left;
-    padding-right: 5px;
-}
-
-pre {
-    font-family: monospace;
-    padding: 5px;
-    color: #00008b;
-    border-left: none;
-    border-right: none;
-}
-
-tt {
-    font-family: monospace;
-    background-color: #ecf0f3;
-    padding: 0 1px 0 1px;
-}
-
-tt.descname {
-    background-color: transparent;
-    font-weight: bold;
-    font-size: 1.2em;
-}
-
-tt.descclassname {
-    background-color: transparent;
-}
-
-tt.xref, a tt {
-    background-color: transparent;
-    font-weight: bold;
-}
-
-.footnote:target  { background-color: #ffa }
-
-h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
-    background-color: transparent;
-}
-
-.optional {
-    font-size: 1.3em;
-}
-
-.versionmodified {
-    font-style: italic;
-}
-
-form.comment {
-    margin: 0;
-    padding: 10px 30px 10px 30px;
-    background-color: #eee;
-}
-
-form.comment h3 {
-    background-color: #326591;
-    color: white;
-    margin: -10px -30px 10px -30px;
-    padding: 5px;
-    font-size: 1.4em;
-}
-
-form.comment input,
-form.comment textarea {
-    border: 1px solid #ccc;
-    padding: 2px;
-    font-family: sans-serif;
-    font-size: 13px;
-}
-
-form.comment input[type="text"] {
-    width: 240px;
-}
-
-form.comment textarea {
-    width: 100%;
-    height: 200px;
-    margin-bottom: 10px;
-}
-
-/* :::: PRINT :::: */
-@media print {
-    div.documentwrapper {
-        width: 100%;
-    }
-
-    div.body {
-        margin: 0;
-    }
-
-    div.sphinxsidebar,
-    div.related,
-    div.footer,
-    div#comments div.new-comment-box,
-    #top-link {
-        display: none;
-    }
-}
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/frameset.html	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
-  "http://www.w3.org/TR/html4/frameset.dtd">
-<html>
-  <head>
-    <title>{% trans version=version|e, docstitle=docstitle|e %}Changes in Version {{ version }} &mdash; {{ docstitle }}{% endtrans %}</title>
-  </head>
-  <frameset cols="45%,*">
-    <frame name="main" src="changes.html">
-    <frame name="src" src="about:blank">
-  </frameset>
-</html>
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/rstsource.html	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-  "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-  <head>
-    <title>{% trans filename=filename, docstitle=docstitle|e %}{{ filename }} &mdash; {{ docstitle }}{% endtrans %}</title>
-    <style type="text/css">
-      .hl { background-color: yellow }
-    </style>
-  </head>
-  <body style="font-size: 90%">
-    <pre>
-      {{ text }}
-    </pre>
-  </body>
-</html>
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/versionchanges.html	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-{% macro entries changes %}
-<ul>{% for entry, docname, lineno in changes %}
-<li><a href="rst/{{ docname }}.html#L{{ lineno-10 }}" target="src">{{ entry }}</a></li>
-{% endfor %}</ul>
-{% endmacro -%}
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-  "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-  <head>
-    <link rel="stylesheet" href="default.css">
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-    <title>{% trans version=version|e, docstitle=docstitle|e %}Changes in Version {{ version }} &mdash; {{ docstitle }}{% endtrans %}</title>
-  </head>
-  <body>
-    <div class="document">
-      <div class="body">
-    <h1>{% trans version=version|e %}Automatically generated list of changes in version {{ version }}{% endtrans %}</h1>
-    <h2>{{ _('Library changes') }}</h2>
-    {% for modname, changes in libchanges %}
-    <h4>{{ modname }}</h4>
-    {{ entries(changes) }}
-    {% endfor %}
-    <h2>{{ _('C API changes') }}</h2>
-    {{ entries(apichanges) }}
-    <h2>{{ _('Other changes') }}</h2>
-    {% for (fn, title), changes in otherchanges %}
-    <h4>{{ title }} <span style="font-size: 50%">({{ fn }})</span></h4>
-    {{ entries(changes) }}
-    {% endfor %}
-      </div>
-    </div>
-  </body>
-</html>
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/defindex.html	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-{% extends "layout.html" %}
-{% set title = _('Overview') %}
-{% block body %}
-  <h1>{{ docstitle|e }}</h1>
-  <p>
-    Welcome! This is
-    {% block description %}the documentation for {{ project|e }}
-    {{ release|e }}{% if last_updated %}, last updated {{ last_updated|e }}{% endif %}{% endblock %}.
-  </p>
-  {% block tables %}
-  <p><strong>{{ _('Indices and tables:') }}</strong></p>
-  <table class="contentstable" align="center"><tr>
-    <td width="50%">
-      <p class="biglink"><a class="biglink" href="{{ pathto("contents") }}">{{ _('Complete Table of Contents') }}</a><br>
-         <span class="linkdescr">{{ _('lists all sections and subsections') }}</span></p>
-      <p class="biglink"><a class="biglink" href="{{ pathto("search") }}">{{ _('Search Page') }}</a><br>
-         <span class="linkdescr">{{ _('search this documentation') }}</span></p>
-    </td><td width="50%">
-      <p class="biglink"><a class="biglink" href="{{ pathto("modindex") }}">{{ _('Global Module Index') }}</a><br>
-         <span class="linkdescr">{{ _('quick access to all modules') }}</span></p>
-      <p class="biglink"><a class="biglink" href="{{ pathto("genindex") }}">{{ _('General Index') }}</a><br>
-         <span class="linkdescr">{{ _('all functions, classes, terms') }}</span></p>
-    </td></tr>
-  </table>
-  {% endblock %}
-{% endblock %}
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex-single.html	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-{% extends "layout.html" %}
-{% set title = _('Index') %}
-{% block body %}
-
-   <h1 id="index">{% trans key=key %}Index &ndash; {{ key }}{% endtrans %}</h1>
-
-<table width="100%" class="indextable"><tr><td width="33%" valign="top">
-<dl>
-{%- set breakat = count // 2 %}
-{%- set numcols = 1 %}
-{%- set numitems = 0 %}
-{% for entryname, (links, subitems) in entries %}
-<dt>{%- if links -%}<a href="{{ links[0] }}">{{ entryname|e }}</a>
-  {%- for link in links[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
-  {%- else -%}
-{{ entryname|e }}
-  {%- endif -%}</dt>
-  {%- if subitems %}
-  <dd><dl>
-    {%- for subentryname, subentrylinks in subitems %}
-    <dt><a href="{{ subentrylinks[0] }}">{{ subentryname|e }}</a>
-    {%- for link in subentrylinks[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
-    </dt>
-    {%- endfor %}
-  </dl></dd>
-  {%- endif -%}
-{%- set numitems = numitems + 1 + (subitems|length) -%}
-{%- if numcols < 2 and numitems > breakat -%}
-{%- set numcols = numcols+1 -%}
-</dl></td><td width="33%" valign="top"><dl>
-{%- endif -%}
-{%- endfor %}
-</dl></td></tr></table>
-
-{% endblock %}
-
-{% block sidebarrel %}
-   <h4>Index</h4>
-   <p>{% for key, dummy in genindexentries -%}
-   <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
-     {% if not loop.last %}| {% endif %}
-   {%- endfor %}</p>
-
-   <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
-   {{ super() }}
-{% endblock %}
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex-split.html	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-{% extends "layout.html" %}
-{% set title = _('Index') %}
-{% block body %}
-
-   <h1 id="index">{{ _('Index') }}</h1>
-
-   <p>{{ _('Index pages by letter') }}:</p>
-
-   <p>{% for key, dummy in genindexentries -%}
-   <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
-     {% if not loop.last %}| {% endif %}
-   {%- endfor %}</p>
-
-   <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong>
-                                               ({{ _('can be huge') }})</a></p>
-
-{% endblock %}
-
-{% block sidebarrel %}
-{% if split_index %}
-   <h4>Index</h4>
-   <p>{% for key, dummy in genindexentries -%}
-   <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
-     {% if not loop.last %}| {% endif %}
-   {%- endfor %}</p>
-
-   <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
-{% endif %}
-   {{ super() }}
-{% endblock %}
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex.html	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-{% extends "layout.html" %}
-{% set title = _('Index') %}
-{% block body %}
-
-   <h1 id="index">{{ _('Index') }}</h1>
-
-   {% for key, dummy in genindexentries -%}
-   <a href="#{{ key }}"><strong>{{ key }}</strong></a> {% if not loop.last %}| {% endif %}
-   {%- endfor %}
-
-   <hr />
-
-   {% for key, entries in genindexentries %}
-<h2 id="{{ key }}">{{ key }}</h2>
-<table width="100%" class="indextable"><tr><td width="33%" valign="top">
-<dl>
-{%- set breakat = genindexcounts[loop.index0] // 2 %}
-{%- set numcols = 1 %}
-{%- set numitems = 0 %}
-{% for entryname, (links, subitems) in entries %}
-<dt>{%- if links -%}<a href="{{ links[0] }}">{{ entryname|e }}</a>
-  {%- for link in links[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
-  {%- else -%}
-{{ entryname|e }}
-  {%- endif -%}</dt>
-  {%- if subitems %}
-  <dd><dl>
-    {%- for subentryname, subentrylinks in subitems %}
-    <dt><a href="{{ subentrylinks[0] }}">{{ subentryname|e }}</a>
-    {%- for link in subentrylinks[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
-    </dt>
-    {%- endfor %}
-  </dl></dd>
-  {%- endif -%}
-{%- set numitems = numitems + 1 + (subitems|length) -%}
-{%- if numcols < 2 and numitems > breakat -%}
-{%- set numcols = numcols+1 -%}
-</dl></td><td width="33%" valign="top"><dl>
-{%- endif -%}
-{%- endfor %}
-</dl></td></tr></table>
-{% endfor %}
-
-{% endblock %}
-
-{% block sidebarrel %}
-{% if split_index %}
-   <h4>{{ _('Index') }}</h4>
-   <p>{% for key, dummy in genindexentries -%}
-   <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
-     {% if not loop.last %}| {% endif %}
-   {%- endfor %}</p>
-
-   <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
-{% endif %}
-   {{ super() }}
-{% endblock %}
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/layout.html	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,192 +0,0 @@
-{%- block doctype -%}
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-{%- endblock %}
-{%- set reldelim1 = reldelim1 is not defined and ' &raquo;' or reldelim1 %}
-{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
-{%- macro relbar %}
-    <div class="related">
-      <h3>{{ _('Navigation') }}</h3>
-      <ul>
-        {%- for rellink in rellinks %}
-        <li class="right" {% if loop.first %}style="margin-right: 10px"{% endif %}>
-          <a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags }}"
-             accesskey="{{ rellink[2] }}">{{ rellink[3] }}</a>
-          {%- if not loop.first %}{{ reldelim2 }}{% endif %}</li>
-        {%- endfor %}
-        {%- block rootrellink %}
-        <li><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a>{{ reldelim1 }}</li>
-        {%- endblock %}
-        {%- for parent in parents %}
-          <li><a href="{{ parent.link|e }}" accesskey="U">{{ parent.title }}</a>{{ reldelim1 }}</li>
-        {%- endfor %}
-        {%- block relbaritems %} {% endblock %}
-      </ul>
-    </div>
-{%- endmacro %}
-{%- macro sidebar %}
-      {%- if builder != 'htmlhelp' %}
-      <div class="sphinxsidebar">
-        <div class="sphinxsidebarwrapper">
-          {%- block sidebarlogo %}
-          {%- if logo %}
-            <p class="logo"><a href="{{ pathto(master_doc) }}">
-              <img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
-            </a></p>
-          {%- endif %}
-          {%- endblock %}
-          {%- block sidebartoc %}
-          {%- if display_toc %}
-            <h3><a href="{{ pathto(master_doc) }}">{{ _('Table Of Contents') }}</a></h3>
-            {{ toc }}
-          {%- endif %}
-          {%- endblock %}
-          {%- block sidebarrel %}
-          {%- if prev %}
-            <h4>{{ _('Previous topic') }}</h4>
-            <p class="topless"><a href="{{ prev.link|e }}" title="{{ _('previous chapter') }}">{{ prev.title }}</a></p>
-          {%- endif %}
-          {%- if next %}
-            <h4>{{ _('Next topic') }}</h4>
-            <p class="topless"><a href="{{ next.link|e }}" title="{{ _('next chapter') }}">{{ next.title }}</a></p>
-          {%- endif %}
-          {%- endblock %}
-          {%- if sourcename %}
-            <h3>{{ _('This Page') }}</h3>
-            <ul class="this-page-menu">
-            {%- if builder == 'web' %}
-              <li><a href="#comments">Comments ({{ comments|length }} so far)</a></li>
-              <li><a href="{{ pathto('@edit/' + sourcename)|e }}">{{ _('Suggest Change') }}</a></li>
-              <li><a href="{{ pathto('@source/' + sourcename)|e }}">{{ _('Show Source') }}</a></li>
-            {%- elif builder == 'html' %}
-              <li><a href="{{ pathto('_sources/' + sourcename, true)|e }}">{{ _('Show Source') }}</a></li>
-            {%- endif %}
-            </ul>
-          {%- endif %}
-          {%- if customsidebar %}
-          {{ rendertemplate(customsidebar) }}
-          {%- endif %}
-          {%- block sidebarsearch %}
-          {%- if pagename != "search" %}
-          <h3>{% if builder == 'web' %}{{ _('Keyword search')}}{% else %}{{ _('Quick search') }}{% endif %}</h3>
-            <form class="search" action="{{ pathto('search') }}" method="get">
-              <input type="text" name="q" size="18" /> <input type="submit" value="{{ _('Go') }}" />
-              <input type="hidden" name="check_keywords" value="yes" />
-              <input type="hidden" name="area" value="default" />
-            </form>
-            {%- if builder == 'web' %}
-            <p style="font-size: 90%">{{ _('Enter a module, class or function name.') }}</p>
-            {%- endif %}
-          {%- endif %}
-          {%- endblock %}
-        </div>
-      </div>
-      {%- endif %}
-{%- endmacro -%}
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    {{ metatags }}
-    {%- if builder != 'htmlhelp' %}
-      {%- set titlesuffix = " &mdash; " + docstitle|e %}
-    {%- endif %}
-    <title>{{ title|striptags }}{{ titlesuffix }}</title>
-    {%- if builder == 'web' %}
-    <link rel="stylesheet" href="{{ pathto('index') }}?do=stylesheet{%
-      if in_admin_panel %}&admin=yes{% endif %}" type="text/css" />
-    {%- for link, type, title in page_links %}
-    <link rel="alternate" type="{{ type|e(true) }}" title="{{ title|e(true) }}" href="{{ link|e(true) }}" />
-    {%- endfor %}
-    {%- else %}
-    <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
-    <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
-    {%- endif %}
-    {%- if builder != 'htmlhelp' %}
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    '{{ pathto("", 1) }}',
-        VERSION:     '{{ release|e }}',
-        COLLAPSE_MODINDEX: false,
-        FILE_SUFFIX: '{{ file_suffix }}',
-        HAS_SOURCE:  {{ has_source|lower }}
-      };
-    </script>
-    {%- for scriptfile in script_files %}
-    <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
-    {%- endfor %}
-    {%- if use_opensearch %}
-    <link rel="search" type="application/opensearchdescription+xml"
-          title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
-          href="{{ pathto('_static/opensearch.xml', 1) }}"/>
-    {%- endif %}
-    {%- if favicon %}
-    <link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
-    {%- endif %}
-    {%- endif %}
-{%- block linktags %}
-    {%- if hasdoc('about') %}
-    <link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
-    {%- endif %}
-    <link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
-    <link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
-    {%- if hasdoc('copyright') %}
-    <link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
-    {%- endif %}
-    <link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}" />
-    {%- if parents %}
-    <link rel="up" title="{{ parents[-1].title|striptags }}" href="{{ parents[-1].link|e }}" />
-    {%- endif %}
-    {%- if next %}
-    <link rel="next" title="{{ next.title|striptags }}" href="{{ next.link|e }}" />
-    {%- endif %}
-    {%- if prev %}
-    <link rel="prev" title="{{ prev.title|striptags }}" href="{{ prev.link|e }}" />
-    {%- endif %}
-{%- endblock %}
-{%- block extrahead %} {% endblock %}
-  </head>
-  <body>
-
-{%- block relbar1 %}{{ relbar() }}{% endblock %}
-
-{%- block sidebar1 %} {# possible location for sidebar #} {% endblock %}
-
-{%- block document %}
-    <div class="document">
-      <div class="documentwrapper">
-      {%- if builder != 'htmlhelp' %}
-        <div class="bodywrapper">
-      {%- endif %}
-          <div class="body">
-            {% block body %} {% endblock %}
-          </div>
-      {%- if builder != 'htmlhelp' %}
-        </div>
-      {%- endif %}
-      </div>
-{%- endblock %}
-
-{%- block sidebar2 %}{{ sidebar() }}{% endblock %}
-      <div class="clearer"></div>
-    </div>
-
-{%- block relbar2 %}{{ relbar() }}{% endblock %}
-
-{%- block footer %}
-    <div class="footer">
-    {%- if hasdoc('copyright') %}
-      {% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
-    {%- else %}
-      {% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
-    {%- endif %}
-    {%- if last_updated %}
-      {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
-    {%- endif %}
-    {%- if show_sphinx %}
-      {% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
-    {%- endif %}
-    </div>
-{%- endblock %}
-  </body>
-</html>
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/modindex.html	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-{% extends "layout.html" %}
-{% set title = _('Global Module Index') %}
-{% block extrahead %}
-{{ super() }}
-{% if builder != 'htmlhelp' and collapse_modindex %}
-    <script type="text/javascript">
-      DOCUMENTATION_OPTIONS.COLLAPSE_MODINDEX = true;
-    </script>
-{% endif %}
-{% endblock %}
-{% block body %}
-
-   <h1 id="global-module-index">{{ _('Global Module Index') }}</h1>
-{% if builder == 'web' and freqentries %}
-   <p>{{ _('Most popular modules:') }}</p>
-   <div class="modulecloud">
-   {%- for module in freqentries %}
-     <a href="../q/{{ module.name|e }}/" style="font-size: {{ module.size }}%">{{ module.name|e }}</a>
-   {%- endfor %}
-   </div>
-{% endif %}
-{% if builder == 'web' %}
-   <form class="pfform" action="" method="get">
-     {{ _('Show modules only available on these platforms') }}:<br>
-     {% for pl in platforms -%}
-     <input type="checkbox" name="pf" value="{{ pl }}" id="pl-{{ pl }}"
-            {%- if pl in showpf %} checked="checked"{% endif %}>
-     <label for="pl-{{ pl }}">{{ pl }}</label>
-     {% endfor %}
-     <input type="hidden" name="newpf" value="true">
-     <input type="submit" value="Apply">
-   </form>
-{% endif %}
-
-   {%- for letter in letters %}
-   <a href="#cap-{{ letter }}"><strong>{{ letter }}</strong></a> {% if not loop.last %}| {% endif %}
-   {%- endfor %}
-   <hr/>
-
-   <table width="100%" class="indextable" cellspacing="0" cellpadding="2">
-   {%- for modname, collapse, cgroup, indent, fname, synops, pform, dep in modindexentries %}
-   {%- if not modname -%}
-   <tr class="pcap"><td></td><td>&nbsp;</td><td></td></tr>
-   <tr class="cap"><td></td><td><a name="cap-{{ fname }}"><strong>{{ fname }}</strong></a></td><td></td></tr>
-   {%- else -%}
-   <tr{% if indent %} class="cg-{{ cgroup }}"{% endif %}>
-     <td>{% if collapse -%}
-       <img src="{{ pathto('_static/minus.png', 1) }}" id="toggle-{{ cgroup }}"
-            class="toggler" style="display: none" alt="-" />
-         {%- endif %}</td>
-     <td>{% if indent %}&nbsp;&nbsp;&nbsp;{% endif %}
-     {% if fname %}<a href="{{ fname }}">{% endif -%}
-     <tt class="xref">{{ modname|e }}</tt>
-     {%- if fname %}</a>{% endif %}
-   {%- if pform[0] %} <em>({{ pform|join(', ') }})</em>{% endif -%}
-   </td><td>{% if dep %}<strong>{{ _('Deprecated')}}:</strong>{% endif %}
-     <em>{{ synops|e }}</em></td></tr>
-   {%- endif -%}
-   {% endfor %}
-   </table>
-
-{% endblock %}
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/opensearch.xml	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
-  <ShortName>{{ project|e }}</ShortName>
-  <Description>{% trans docstitle=docstitle|e %}Search {{ docstitle }}{% endtrans %}</Description>
-  <InputEncoding>utf-8</InputEncoding>
-  <Url type="text/html" method="get"
-       template="{{ use_opensearch }}/{{ pathto('search') }}?q={searchTerms}&amp;check_keywords=yes&amp;area=default"/>
-  <LongName>{{ docstitle|e }}</LongName>
-{% block extra %} {# Put e.g. an <Image> element here. #} {% endblock %}
-</OpenSearchDescription>
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/page.html	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-{% extends "layout.html" %}
-{% set page_links = [
-  (pathto('@rss/' + sourcename), 'application/rss+xml', 'Page Comments'),
-] %}
-{% block body %}
-  {% if oldurl %}
-  <div class="docwarning">
-    {% trans %}<strong>Note:</strong> You requested an out-of-date URL from this server. We've tried to redirect you to the new location of this page, but it may not be the right one.{% endtrans %}
-  </div>
-  {% endif %}
-  {{ body }}
-{% endblock %}
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/templates/search.html	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-{% extends "layout.html" %}
-{% set title = _('Search') %}
-{% set script_files = script_files + ['_static/searchtools.js'] %}
-{% block body %}
-  <h1 id="search-documentation">{{ _('Search') }}</h1>
-  <p>
-    {% trans %}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.{% endtrans %}
-  </p>
-  <form action="" method="get">
-    <input type="text" name="q" value="" />
-    <input type="submit" value="{{ _('search') }}" />
-    <span id="search-progress" style="padding-left: 10px"></span>
-  </form>
-  {% if search_performed %}
-    <h2>{{ _('Search Results') }}</h2>
-    {% if not search_results %}
-      <p>{{ _('Your search did not match any results.') }}</p>
-    {% endif %}
-  {% endif %}
-  <div id="search-results">
-  {% if search_results %}
-    <ul>
-    {% for href, caption, context in search_results %}
-      <li><a href="{{ pathto(item.href) }}">{{ caption }}</a>
-        <div class="context">{{ context|e }}</div>
-      </li>
-    {% endfor %}
-    </ul>
-  {% endif %}
-  </div>
-{% endblock %}
-{% block footer %}
-  {{ super() }}
-  <script type="text/javascript" src="searchindex.js"></script>
-{% endblock %}
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/Makefile	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-# Makefile for Sphinx LaTeX output
-
-ALLDOCS = $(basename $(wildcard *.tex))
-ALLPDF = $(addsuffix .pdf,$(ALLDOCS))
-ALLDVI = $(addsuffix .dvi,$(ALLDOCS))
-
-# Prefix for archive names
-ARCHIVEPRREFIX =
-
-all: $(ALLPDF)
-all-pdf: $(ALLPDF)
-all-dvi: $(ALLDVI)
-all-ps: all-dvi
-	for f in *.dvi; do dvips $$f; done
-
-zip: all-$(FMT)
-	mkdir $(ARCHIVEPREFIX)docs-$(FMT)
-	cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT)
-	zip -q -r -9 $(ARCHIVEPREFIX)docs-$(FMT).zip $(ARCHIVEPREFIX)docs-$(FMT)
-	rm -r $(ARCHIVEPREFIX)docs-$(FMT)
-
-tar: all-$(FMT)
-	mkdir $(ARCHIVEPREFIX)docs-$(FMT)
-	cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT)
-	tar cf $(ARCHIVEPREFIX)docs-$(FMT).tar $(ARCHIVEPREFIX)docs-$(FMT)
-	rm -r $(ARCHIVEPREFIX)docs-$(FMT)
-
-bz2: tar
-	bzip2 -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar
-
-# The number of LaTeX runs is quite conservative, but I don't expect it
-# to get run often, so the little extra time won't hurt.
-%.dvi: %.tex
-	latex '$<'
-	latex '$<'
-	latex '$<'
-	-makeindex -s python.ist '$(basename $<).idx'
-	-makeindex -s python.ist '$(basename mod$<).idx'
-	latex '$<'
-	latex '$<'
-
-%.pdf: %.tex
-	pdflatex '$<'
-	pdflatex '$<'
-	pdflatex '$<'
-	-makeindex -s python.ist '$(basename $<).idx'
-	-makeindex -s python.ist '$(basename mod$<).idx'
-	pdflatex '$<'
-	pdflatex '$<'
-
-clean:
-	rm -f *.pdf *.dvi *.ps
-	rm -f *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla
-
-.PHONY: all all-pdf all-dvi all-ps clean
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/fncychap.sty	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,683 +0,0 @@
-%%% Copyright   Ulf A. Lindgren
-%%%
-%%% Note        Premission is granted to modify this file under
-%%%             the condition that it is saved using another
-%%%             file and package name.
-%%%
-%%% Revision    1.1 (1997)
-%%%
-%%%             Jan. 8th Modified package name base date option
-%%%             Jan. 22th Modified FmN and FmTi for error in book.cls
-%%%                  \MakeUppercase{#}->{\MakeUppercase#}
-%%%             Apr. 6th Modified Lenny option to prevent undesired 
-%%%                  skip of line.
-%%%             Nov. 8th Fixed \@chapapp for AMS
-%%%
-%%% Revision    1.2 (1998)
-%%%
-%%%             Feb. 11th Fixed appendix problem related to Bjarne
-%%%             Aug. 11th Fixed problem related to 11pt and 12pt 
-%%%                  suggested by Tomas Lundberg. THANKS!
-%%%
-%%% Revision    1.3 (2004)
-%%%             Sep. 20th problem with frontmatter, mainmatter and
-%%%                  backmatter, pointed out by Lapo Mori
-%%%
-%%% Revision    1.31 (2004)
-%%%             Sep. 21th problem with the Rejne definition streched text
-%%%                  caused ugly gaps in the vrule aligned with the title
-%%%                  text. Kindly pointed out to me by Hendri Adriaens
-%%%
-%%% Revision    1.32 (2005)
-%%%             Jun. 23th compatibility problem with the KOMA class 'scrbook.cls'
-%%%                  a remedy is a redefinition of '\@schapter' in
-%%%                  line with that used in KOMA. The problem was pointed
-%%%                  out to me by Mikkel Holm Olsen
-%%%
-%%% Revision    1.33 (2005)
-%%%             Aug. 9th misspelled ``TWELV'' corrected, the error was pointed
-%%%                  out to me by George Pearson
-%%%
-%%% Revision    1.34 (2007)
-%%%             Added an alternative to Lenny provided by Peter
-%%%             Osborne (2005-11-28)
-%%%             Corrected front, main and back matter, based on input
-%%%             from Bas van Gils (2006-04-24)
-%%%             Jul. 30th Added Bjornstrup option provided by Jean-Marc
-%%%             Francois (2007-01-05).
-%%%             Reverted to \MakeUppercase{#} see rev 1.1, solved
-%%%             problem with MakeUppercase and MakeLowercase pointed
-%%%             out by Marco Feuerstein  (2007-06-06) 
-
-
-%%% Last modified   Jul. 2007
-
-\NeedsTeXFormat{LaTeX2e}[1995/12/01]
-\ProvidesPackage{fncychap}
-             [2007/07/30 v1.34
-                 LaTeX package (Revised chapters)]
-
-%%%% For conditional inclusion of color
-\newif\ifusecolor
-\usecolorfalse
-
-
-
-%%%% DEFINITION OF Chapapp variables
-\newcommand{\CNV}{\huge\bfseries}
-\newcommand{\ChNameVar}[1]{\renewcommand{\CNV}{#1}}
-
-
-%%%% DEFINITION OF TheChapter variables
-\newcommand{\CNoV}{\huge\bfseries}
-\newcommand{\ChNumVar}[1]{\renewcommand{\CNoV}{#1}}
-
-\newif\ifUCN
-\UCNfalse
-\newif\ifLCN
-\LCNfalse
-\def\ChNameLowerCase{\LCNtrue\UCNfalse}
-\def\ChNameUpperCase{\UCNtrue\LCNfalse}
-\def\ChNameAsIs{\UCNfalse\LCNfalse}
-
-%%%%% Fix for AMSBook 971008
-
-\@ifundefined{@chapapp}{\let\@chapapp\chaptername}{}
-
-
-%%%%% Fix for Bjarne and appendix 980211
-
-\newif\ifinapp
-\inappfalse
-\renewcommand\appendix{\par
-  \setcounter{chapter}{0}%
-  \setcounter{section}{0}%
-  \inapptrue%
-  \renewcommand\@chapapp{\appendixname}%
-  \renewcommand\thechapter{\@Alph\c@chapter}}
-
-%%%%% Fix for frontmatter, mainmatter, and backmatter 040920
-
-\@ifundefined{@mainmatter}{\newif\if@mainmatter \@mainmattertrue}{}
-
-%%%%%
-
-
-
-\newcommand{\FmN}[1]{%
-\ifUCN
-   {\MakeUppercase{#1}}\LCNfalse
-\else
-   \ifLCN
-      {\MakeLowercase{#1}}\UCNfalse
-   \else #1
-   \fi
-\fi}
-
-
-%%%% DEFINITION OF Title variables
-\newcommand{\CTV}{\Huge\bfseries}
-\newcommand{\ChTitleVar}[1]{\renewcommand{\CTV}{#1}}
-
-%%%% DEFINITION OF the basic rule width
-\newlength{\RW}
-\setlength{\RW}{1pt}
-\newcommand{\ChRuleWidth}[1]{\setlength{\RW}{#1}}
-
-\newif\ifUCT
-\UCTfalse
-\newif\ifLCT
-\LCTfalse
-\def\ChTitleLowerCase{\LCTtrue\UCTfalse}
-\def\ChTitleUpperCase{\UCTtrue\LCTfalse}
-\def\ChTitleAsIs{\UCTfalse\LCTfalse}
-\newcommand{\FmTi}[1]{%
-\ifUCT
-   {\MakeUppercase{#1}}\LCTfalse
-\else
-   \ifLCT
-      {\MakeLowercase{#1}}\UCTfalse
-   \else {#1}
-   \fi
-\fi}
-
-
-
-\newlength{\mylen}
-\newlength{\myhi}
-\newlength{\px}
-\newlength{\py}
-\newlength{\pyy}
-\newlength{\pxx}
-
-
-\def\mghrulefill#1{\leavevmode\leaders\hrule\@height #1\hfill\kern\z@}
-
-\newcommand{\DOCH}{%
-  \CNV\FmN{\@chapapp}\space \CNoV\thechapter
-  \par\nobreak
-  \vskip 20\p@
-  }
-\newcommand{\DOTI}[1]{%
-    \CTV\FmTi{#1}\par\nobreak
-    \vskip 40\p@
-    }
-\newcommand{\DOTIS}[1]{%
-    \CTV\FmTi{#1}\par\nobreak
-    \vskip 40\p@
-    }
-
-%%%%%% SONNY DEF
-
-\DeclareOption{Sonny}{%
-  \ChNameVar{\Large\sf}
-  \ChNumVar{\Huge}
-  \ChTitleVar{\Large\sf}
-  \ChRuleWidth{0.5pt}
-  \ChNameUpperCase
-  \renewcommand{\DOCH}{%
-    \raggedleft
-    \CNV\FmN{\@chapapp}\space \CNoV\thechapter
-    \par\nobreak
-    \vskip 40\p@}
-  \renewcommand{\DOTI}[1]{%
-    \CTV\raggedleft\mghrulefill{\RW}\par\nobreak
-    \vskip 5\p@
-    \CTV\FmTi{#1}\par\nobreak
-    \mghrulefill{\RW}\par\nobreak
-    \vskip 40\p@}
-  \renewcommand{\DOTIS}[1]{%
-    \CTV\raggedleft\mghrulefill{\RW}\par\nobreak
-    \vskip 5\p@
-    \CTV\FmTi{#1}\par\nobreak
-    \mghrulefill{\RW}\par\nobreak
-    \vskip 40\p@}
-}
-
-%%%%%% LENNY DEF
-
-\DeclareOption{Lenny}{%
-
-  \ChNameVar{\fontsize{14}{16}\usefont{OT1}{phv}{m}{n}\selectfont}
-  \ChNumVar{\fontsize{60}{62}\usefont{OT1}{ptm}{m}{n}\selectfont}
-  \ChTitleVar{\Huge\bfseries\rm}
-  \ChRuleWidth{1pt}
-  \renewcommand{\DOCH}{%
-    \settowidth{\px}{\CNV\FmN{\@chapapp}}
-    \addtolength{\px}{2pt}
-    \settoheight{\py}{\CNV\FmN{\@chapapp}}
-    \addtolength{\py}{1pt}
-
-    \settowidth{\mylen}{\CNV\FmN{\@chapapp}\space\CNoV\thechapter}
-    \addtolength{\mylen}{1pt}
-    \settowidth{\pxx}{\CNoV\thechapter}
-    \addtolength{\pxx}{-1pt}
-
-    \settoheight{\pyy}{\CNoV\thechapter}
-    \addtolength{\pyy}{-2pt}
-    \setlength{\myhi}{\pyy}
-    \addtolength{\myhi}{-1\py}
-    \par
-    \parbox[b]{\textwidth}{%
-    \rule[\py]{\RW}{\myhi}%
-    \hskip -\RW%
-    \rule[\pyy]{\px}{\RW}%
-    \hskip -\px%
-    \raggedright%
-    \CNV\FmN{\@chapapp}\space\CNoV\thechapter%
-    \hskip1pt%
-    \mghrulefill{\RW}%
-    \rule{\RW}{\pyy}\par\nobreak%
-    \vskip -\baselineskip%
-    \vskip -\pyy%
-    \hskip \mylen%
-    \mghrulefill{\RW}\par\nobreak%
-    \vskip \pyy}%
-    \vskip 20\p@}
- 
-
-  \renewcommand{\DOTI}[1]{%
-    \raggedright
-    \CTV\FmTi{#1}\par\nobreak
-    \vskip 40\p@}
-
-  \renewcommand{\DOTIS}[1]{%
-    \raggedright
-    \CTV\FmTi{#1}\par\nobreak
-    \vskip 40\p@}
- }
-
-%%%%%% Peter Osbornes' version of LENNY DEF
-
-\DeclareOption{PetersLenny}{%
-
-% five new lengths 
-\newlength{\bl}                           %  bottom left   : orig \space
-\setlength{\bl}{6pt}
-\newcommand{\BL}[1]{\setlength{\bl}{#1}}
-\newlength{\br}                           %  bottom right  : orig 1pt
-\setlength{\br}{1pt}
-\newcommand{\BR}[1]{\setlength{\br}{#1}}
-\newlength{\tl}                           %  top left      : orig 2pt
-\setlength{\tl}{2pt}
-\newcommand{\TL}[1]{\setlength{\tl}{#1}}
-\newlength{\trr}                           %  top right      :orig 1pt 
-\setlength{\trr}{1pt}
-\newcommand{\TR}[1]{\setlength{\trr}{#1}}
-\newlength{\blrule}                           %  top right      :orig 1pt 
-\setlength{\trr}{0pt}
-\newcommand{\BLrule}[1]{\setlength{\blrule}{#1}}
-
-
-  \ChNameVar{\fontsize{14}{16}\usefont{OT1}{phv}{m}{n}\selectfont}
-  \ChNumVar{\fontsize{60}{62}\usefont{OT1}{ptm}{m}{n}\selectfont}
-  \ChTitleVar{\Huge\bfseries\rm}
-  \ChRuleWidth{1pt}
-\renewcommand{\DOCH}{%
-
-
-%%%%%%%                                   tweaks for 1--9 and A--Z
-\ifcase\c@chapter\relax%
-\or\BL{-3pt}\TL{-4pt}\BR{0pt}\TR{-6pt}%1
-\or\BL{0pt}\TL{-4pt}\BR{2pt}\TR{-4pt}%2
-\or\BL{0pt}\TL{-4pt}\BR{2pt}\TR{-4pt}%3
-\or\BL{0pt}\TL{5pt}\BR{2pt}\TR{-4pt}%4
-\or\BL{0pt}\TL{3pt}\BR{2pt}\TR{-4pt}%5
-\or\BL{-1pt}\TL{0pt}\BR{2pt}\TR{-2pt}%6
-\or\BL{0pt}\TL{-3pt}\BR{2pt}\TR{-2pt}%7
-\or\BL{0pt}\TL{-3pt}\BR{2pt}\TR{-2pt}%8
-\or\BL{0pt}\TL{-3pt}\BR{-4pt}\TR{-2pt}%9
-\or\BL{-3pt}\TL{-3pt}\BR{2pt}\TR{-7pt}%10
-\or\BL{-6pt}\TL{-6pt}\BR{0pt}\TR{-9pt}%11
-\or\BL{-6pt}\TL{-6pt}\BR{2pt}\TR{-7pt}%12
-\or\BL{-5pt}\TL{-5pt}\BR{0pt}\TR{-9pt}%13
-\or\BL{-6pt}\TL{-6pt}\BR{0pt}\TR{-9pt}%14
-\or\BL{-3pt}\TL{-3pt}\BR{3pt}\TR{-6pt}%15
-\or\BL{-3pt}\TL{-3pt}\BR{3pt}\TR{-6pt}%16
-\or\BL{-5pt}\TL{-3pt}\BR{-8pt}\TR{-6pt}%17
-\or\BL{-5pt}\TL{-5pt}\BR{0pt}\TR{-9pt}%18
-\or\BL{-3pt}\TL{-3pt}\BR{-6pt}\TR{-9pt}%19
-\or\BL{0pt}\TL{0pt}\BR{0pt}\TR{-5pt}%20
-\fi
-
-\ifinapp\ifcase\c@chapter\relax%
-\or\BL{0pt}\TL{14pt}\BR{5pt}\TR{-19pt}%A
-\or\BL{0pt}\TL{-5pt}\BR{-3pt}\TR{-8pt}%B
-\or\BL{-3pt}\TL{-2pt}\BR{1pt}\TR{-6pt}\BLrule{0pt}%C
-\or\BL{0pt}\TL{-5pt}\BR{-3pt}\TR{-8pt}\BLrule{0pt}%D
-\or\BL{0pt}\TL{-5pt}\BR{2pt}\TR{-3pt}%E
-\or\BL{0pt}\TL{-5pt}\BR{-10pt}\TR{-1pt}%F
-\or\BL{-3pt}\TL{0pt}\BR{0pt}\TR{-7pt}%G
-\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%H
-\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%I
-\or\BL{2pt}\TL{0pt}\BR{-3pt}\TR{1pt}%J
-\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%K
-\or\BL{0pt}\TL{-5pt}\BR{2pt}\TR{-19pt}%L
-\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%M
-\or\BL{0pt}\TL{-5pt}\BR{-2pt}\TR{-1pt}%N
-\or\BL{-3pt}\TL{-2pt}\BR{-3pt}\TR{-11pt}%O
-\or\BL{0pt}\TL{-5pt}\BR{-9pt}\TR{-3pt}%P
-\or\BL{-3pt}\TL{-2pt}\BR{-3pt}\TR{-11pt}%Q
-\or\BL{0pt}\TL{-5pt}\BR{4pt}\TR{-8pt}%R
-\or\BL{-2pt}\TL{-2pt}\BR{-2pt}\TR{-7pt}%S
-\or\BL{-3pt}\TL{0pt}\BR{-5pt}\TR{4pt}\BLrule{8pt}%T
-\or\BL{-7pt}\TL{-11pt}\BR{-5pt}\TR{-7pt}\BLrule{0pt}%U
-\or\BL{-14pt}\TL{-5pt}\BR{-14pt}\TR{-1pt}\BLrule{14pt}%V
-\or\BL{-10pt}\TL{-9pt}\BR{-13pt}\TR{-3pt}\BLrule{7pt}%W
-\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}\BLrule{0pt}%X
-\or\BL{-6pt}\TL{-4pt}\BR{-7pt}\TR{1pt}\BLrule{7pt}%Y
-\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}\BLrule{0pt}%Z
-\fi\fi
-%%%%%%%
-    \settowidth{\px}{\CNV\FmN{\@chapapp}}
-    \addtolength{\px}{\tl}        %MOD change 2pt to \tl
-    \settoheight{\py}{\CNV\FmN{\@chapapp}}
-    \addtolength{\py}{1pt}
-
-    \settowidth{\mylen}{\CNV\FmN{\@chapapp}\space\CNoV\thechapter}
-    \addtolength{\mylen}{\trr}% MOD change 1pt to \tr
-    \settowidth{\pxx}{\CNoV\thechapter}
-    \addtolength{\pxx}{-1pt}
-
-    \settoheight{\pyy}{\CNoV\thechapter}
-    \addtolength{\pyy}{-2pt}
-    \setlength{\myhi}{\pyy}
-    \addtolength{\myhi}{-1\py}
-    \par
-    \parbox[b]{\textwidth}{%
-    \rule[\py]{\RW}{\myhi}%
-    \hskip -\RW%
-    \rule[\pyy]{\px}{\RW}% 
-    \hskip -\px%
-    \raggedright%
-    \CNV\FmN{\@chapapp}\rule{\blrule}{\RW}\hskip\bl\CNoV\thechapter%MOD 
-%    \CNV\FmN{\@chapapp}\space\CNoV\thechapter                     %ORIGINAL
-    \hskip\br%                           %MOD 1pt to \br
-    \mghrulefill{\RW}% 
-    \rule{\RW}{\pyy}\par\nobreak% 
-    \vskip -\baselineskip%
-    \vskip -\pyy%
-    \hskip \mylen%
-    \mghrulefill{\RW}\par\nobreak%
-    \vskip \pyy}%
-    \vskip 20\p@}
- 
-
-  \renewcommand{\DOTI}[1]{%
-    \raggedright
-    \CTV\FmTi{#1}\par\nobreak
-    \vskip 40\p@}
-
-  \renewcommand{\DOTIS}[1]{%
-    \raggedright
-    \CTV\FmTi{#1}\par\nobreak
-    \vskip 40\p@}
- }
-
-
-%
-
-
-%%%%%% BJORNSTRUP DEF
-
-\DeclareOption{Bjornstrup}{%
-  \usecolortrue
-  % pzc (Zapf Chancelery) is nice.  ppl (Palatino) is cool too.
-  \ChNumVar{\fontsize{76}{80}\usefont{OT1}{pzc}{m}{n}\selectfont}
-  \ChTitleVar{\raggedleft\Large\sffamily\bfseries}
-
-  \setlength{\myhi}{10pt}         % Space between grey box border and text
-  \setlength{\mylen}{\textwidth}
-  \addtolength{\mylen}{-2\myhi}
-  \renewcommand{\DOCH}{%
-    \settowidth{\py}{\CNoV\thechapter}
-    \addtolength{\py}{-10pt}      % Amount of space by which the
-%                                  % number is shifted right
-    \fboxsep=0pt%
-    \colorbox[gray]{.85}{\rule{0pt}{40pt}\parbox[b]{\textwidth}{\hfill}}%
-    \kern-\py\raise20pt%
-    \hbox{\color[gray]{.5}\CNoV\thechapter}\\%
-  }
-  
-  \renewcommand{\DOTI}[1]{%
-    \nointerlineskip\raggedright%
-    \fboxsep=\myhi%
-    \vskip-1ex%
-    \colorbox[gray]{.85}{\parbox[t]{\mylen}{\CTV\FmTi{#1}}}\par\nobreak%
-    \vskip 40\p@%
-  }
-
-  \renewcommand{\DOTIS}[1]{%
-    \fboxsep=0pt
-    \colorbox[gray]{.85}{\rule{0pt}{40pt}\parbox[b]{\textwidth}{\hfill}}\\%
-    \nointerlineskip\raggedright%
-    \fboxsep=\myhi%
-    \colorbox[gray]{.85}{\parbox[t]{\mylen}{\CTV\FmTi{#1}}}\par\nobreak%
-    \vskip 40\p@%
-  }
-}
-
-
-%%%%%%% GLENN DEF
-
-
-\DeclareOption{Glenn}{%
-  \ChNameVar{\bfseries\Large\sf}
-  \ChNumVar{\Huge}
-  \ChTitleVar{\bfseries\Large\rm}
-  \ChRuleWidth{1pt}
-  \ChNameUpperCase
-  \ChTitleUpperCase
-  \renewcommand{\DOCH}{%
-    \settoheight{\myhi}{\CTV\FmTi{Test}}
-    \setlength{\py}{\baselineskip}
-    \addtolength{\py}{\RW}
-    \addtolength{\py}{\myhi}
-    \setlength{\pyy}{\py}
-    \addtolength{\pyy}{-1\RW}
-     
-    \raggedright
-    \CNV\FmN{\@chapapp}\space\CNoV\thechapter
-    \hskip 3pt\mghrulefill{\RW}\rule[-1\pyy]{2\RW}{\py}\par\nobreak}
-
-  \renewcommand{\DOTI}[1]{%
-    \addtolength{\pyy}{-4pt}
-    \settoheight{\myhi}{\CTV\FmTi{#1}}
-    \addtolength{\myhi}{\py}
-    \addtolength{\myhi}{-1\RW}
-    \vskip -1\pyy
-    \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 2pt
-    \raggedleft\CTV\FmTi{#1}\par\nobreak
-    \vskip 80\p@}
-
-\newlength{\backskip}
-  \renewcommand{\DOTIS}[1]{%
-%    \setlength{\py}{10pt}
-%    \setlength{\pyy}{\py}
-%    \addtolength{\pyy}{\RW}
-%    \setlength{\myhi}{\baselineskip}
-%    \addtolength{\myhi}{\pyy}
-%    \mghrulefill{\RW}\rule[-1\py]{2\RW}{\pyy}\par\nobreak
-%    \addtolength{}{}
-%\vskip -1\baselineskip
-%    \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 2pt
-%    \raggedleft\CTV\FmTi{#1}\par\nobreak
-%    \vskip 60\p@}
-%% Fix suggested by Tomas Lundberg
-    \setlength{\py}{25pt}  % eller vad man vill
-    \setlength{\pyy}{\py}
-    \setlength{\backskip}{\py}
-    \addtolength{\backskip}{2pt}
-    \addtolength{\pyy}{\RW}
-    \setlength{\myhi}{\baselineskip}
-    \addtolength{\myhi}{\pyy}
-    \mghrulefill{\RW}\rule[-1\py]{2\RW}{\pyy}\par\nobreak
-    \vskip -1\backskip
-    \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 3pt %
-    \raggedleft\CTV\FmTi{#1}\par\nobreak
-    \vskip 40\p@}
- }
-
-%%%%%%% CONNY DEF
-
-\DeclareOption{Conny}{%
-  \ChNameUpperCase
-  \ChTitleUpperCase  
-  \ChNameVar{\centering\Huge\rm\bfseries}
-  \ChNumVar{\Huge}
-  \ChTitleVar{\centering\Huge\rm}
-  \ChRuleWidth{2pt}
-
-  \renewcommand{\DOCH}{%
-    \mghrulefill{3\RW}\par\nobreak
-    \vskip -0.5\baselineskip
-    \mghrulefill{\RW}\par\nobreak
-    \CNV\FmN{\@chapapp}\space \CNoV\thechapter
-    \par\nobreak
-    \vskip -0.5\baselineskip
-   }
-  \renewcommand{\DOTI}[1]{%
-    \mghrulefill{\RW}\par\nobreak
-    \CTV\FmTi{#1}\par\nobreak
-    \vskip 60\p@
-    }
-  \renewcommand{\DOTIS}[1]{%
-    \mghrulefill{\RW}\par\nobreak
-    \CTV\FmTi{#1}\par\nobreak
-    \vskip 60\p@
-    }
-  }
-
-%%%%%%% REJNE DEF
-
-\DeclareOption{Rejne}{%
-
-  \ChNameUpperCase
-  \ChTitleUpperCase  
-  \ChNameVar{\centering\Large\rm}
-  \ChNumVar{\Huge}
-  \ChTitleVar{\centering\Huge\rm}
-  \ChRuleWidth{1pt}
-  \renewcommand{\DOCH}{%
-    \settoheight{\py}{\CNoV\thechapter}
-    \parskip=0pt plus 1pt % Set parskip to default, just in case v1.31
-    \addtolength{\py}{-1pt}
-    \CNV\FmN{\@chapapp}\par\nobreak
-    \vskip 20\p@
-    \setlength{\myhi}{2\baselineskip}
-    \setlength{\px}{\myhi}
-    \addtolength{\px}{-1\RW}
-    \rule[-1\px]{\RW}{\myhi}\mghrulefill{\RW}\hskip
-    10pt\raisebox{-0.5\py}{\CNoV\thechapter}\hskip 10pt\mghrulefill{\RW}\rule[-1\px]{\RW}{\myhi}\par\nobreak
-     \vskip -3\p@% Added -2pt vskip to correct for streched text v1.31
-    }
-  \renewcommand{\DOTI}[1]{%
-    \setlength{\mylen}{\textwidth}
-    \parskip=0pt plus 1pt % Set parskip to default, just in case v1.31
-    \addtolength{\mylen}{-2\RW}
-    {\vrule width\RW}\parbox{\mylen}{\CTV\FmTi{#1}}{\vrule width\RW}\par\nobreak%
-    \vskip -3pt\rule{\RW}{2\baselineskip}\mghrulefill{\RW}\rule{\RW}{2\baselineskip}%
-    \vskip 60\p@% Added -2pt in vskip to correct for streched text v1.31
-    }
-  \renewcommand{\DOTIS}[1]{%
-    \setlength{\py}{\fboxrule}
-    \setlength{\fboxrule}{\RW}
-    \setlength{\mylen}{\textwidth}
-    \addtolength{\mylen}{-2\RW}
-    \fbox{\parbox{\mylen}{\vskip 2\baselineskip\CTV\FmTi{#1}\par\nobreak\vskip \baselineskip}} 
-    \setlength{\fboxrule}{\py}
-    \vskip 60\p@
-    }
-  }
-
-
-%%%%%%% BJARNE DEF
-
-\DeclareOption{Bjarne}{%
-  \ChNameUpperCase
-  \ChTitleUpperCase  
-  \ChNameVar{\raggedleft\normalsize\rm}
-  \ChNumVar{\raggedleft \bfseries\Large}
-  \ChTitleVar{\raggedleft \Large\rm}
-  \ChRuleWidth{1pt}
-
-
-%% Note thechapter -> c@chapter fix appendix bug
-%% Fixed misspelled 12
-
-  \newcounter{AlphaCnt}
-  \newcounter{AlphaDecCnt}
-  \newcommand{\AlphaNo}{%
-    \ifcase\number\theAlphaCnt
-      \ifnum\c@chapter=0
-        ZERO\else{}\fi
-    \or ONE\or TWO\or THREE\or FOUR\or FIVE
-    \or SIX\or SEVEN\or EIGHT\or NINE\or TEN
-    \or ELEVEN\or TWELVE\or THIRTEEN\or FOURTEEN\or FIFTEEN
-    \or SIXTEEN\or SEVENTEEN\or EIGHTEEN\or NINETEEN\fi
-}
-
-  \newcommand{\AlphaDecNo}{%
-    \setcounter{AlphaDecCnt}{0}
-    \@whilenum\number\theAlphaCnt>0\do
-      {\addtocounter{AlphaCnt}{-10}
-       \addtocounter{AlphaDecCnt}{1}}
-     \ifnum\number\theAlphaCnt=0
-     \else
-       \addtocounter{AlphaDecCnt}{-1}
-       \addtocounter{AlphaCnt}{10}
-     \fi
-     
-     
-    \ifcase\number\theAlphaDecCnt\or TEN\or TWENTY\or THIRTY\or
-    FORTY\or FIFTY\or SIXTY\or SEVENTY\or EIGHTY\or NINETY\fi
-    }
-  \newcommand{\TheAlphaChapter}{%
-    
-    \ifinapp 
-      \thechapter
-    \else
-      \setcounter{AlphaCnt}{\c@chapter}
-      \ifnum\c@chapter<20
-        \AlphaNo
-      \else
-        \AlphaDecNo\AlphaNo
-      \fi
-    \fi
-    }  
-  \renewcommand{\DOCH}{%
-    \mghrulefill{\RW}\par\nobreak
-    \CNV\FmN{\@chapapp}\par\nobreak 
-    \CNoV\TheAlphaChapter\par\nobreak
-    \vskip -1\baselineskip\vskip 5pt\mghrulefill{\RW}\par\nobreak
-    \vskip 20\p@
-    }
-  \renewcommand{\DOTI}[1]{%
-    \CTV\FmTi{#1}\par\nobreak
-    \vskip 40\p@
-    }
-  \renewcommand{\DOTIS}[1]{%
-    \CTV\FmTi{#1}\par\nobreak
-    \vskip 40\p@
-    }
-}
-
-\DeclareOption*{%
-  \PackageWarning{fancychapter}{unknown style option}
-  }
-
-\ProcessOptions* \relax
-
-\ifusecolor
-  \RequirePackage{color} 
-\fi
-\def\@makechapterhead#1{%
-  \vspace*{50\p@}%
-  {\parindent \z@ \raggedright \normalfont
-    \ifnum \c@secnumdepth >\m@ne
-      \if@mainmatter%%%%% Fix for frontmatter, mainmatter, and backmatter 040920
-        \DOCH
-      \fi
-    \fi
-    \interlinepenalty\@M
-    \if@mainmatter%%%%% Fix for frontmatter, mainmatter, and backmatter 060424
-      \DOTI{#1}%
-    \else%
-      \DOTIS{#1}%
-    \fi
-  }}
-
-
-%%% Begin: To avoid problem with scrbook.cls (fncychap version 1.32)
-
-%%OUT:
-%\def\@schapter#1{\if@twocolumn
-%                   \@topnewpage[\@makeschapterhead{#1}]%
-%                 \else
-%                   \@makeschapterhead{#1}%
-%                   \@afterheading
-%                 \fi}
-
-%%IN:
-\def\@schapter#1{%
-\if@twocolumn%
-  \@makeschapterhead{#1}%
-\else%
-  \@makeschapterhead{#1}%
-  \@afterheading%
-\fi}
-
-%%% End: To avoid problem with scrbook.cls (fncychap version 1.32)
-
-\def\@makeschapterhead#1{%
-  \vspace*{50\p@}%
-  {\parindent \z@ \raggedright
-    \normalfont
-    \interlinepenalty\@M
-    \DOTIS{#1}
-    \vskip 40\p@
-  }}
-
-\endinput
-
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/howto.cls	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-%
-% howto.cls for Sphinx
-%
-
-\NeedsTeXFormat{LaTeX2e}[1995/12/01]
-\ProvidesClass{howto}[2008/10/18 Document class (Sphinx HOWTO)]
-
-% Pass all given class options to the parent class.
-\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
-\ProcessOptions\relax
-\LoadClass[twoside]{article}
-
-% Set some sane defaults for section numbering depth and TOC depth.  You can
-% reset these counters in your preamble.
-%
-\setcounter{secnumdepth}{2}
-
-% Change the title page to look a bit better, and fit in with the fncychap
-% ``Bjarne'' style a bit better.
-%
-\renewcommand{\maketitle}{
-  \rule{\textwidth}{1pt}
-  \ifsphinxpdfoutput
-    \begingroup
-    % This \def is required to deal with multi-line authors; it
-    % changes \\ to ', ' (comma-space), making it pass muster for
-    % generating document info in the PDF file.
-    \def\\{, }
-    \pdfinfo{
-      /Author (\@author)
-      /Title (\@title)
-    }
-    \endgroup
-  \fi
-  \begin{flushright}
-    \sphinxlogo%
-    {\rm\Huge\py@HeaderFamily \@title} \par
-    {\em\large\py@HeaderFamily \py@release\releaseinfo} \par
-    \vspace{25pt}
-    {\Large\py@HeaderFamily \@author} \par
-    \vspace{25pt}
-    \@date \par
-    \py@authoraddress \par
-  \end{flushright}
-  \@thanks
-  \setcounter{footnote}{0}
-  \let\thanks\relax\let\maketitle\relax
-  %\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
-}
-
-\let\py@OldTableofcontents=\tableofcontents
-\renewcommand{\tableofcontents}{
-  \begingroup
-    \parskip = 0mm
-    \py@OldTableofcontents
-  \endgroup
-  \rule{\textwidth}{1pt}
-  \vspace{12pt}
-}  
-
-\@ifundefined{fancyhf}{
-  \pagestyle{plain}}{
-  \pagestyle{normal}}		% start this way; change for
-\pagenumbering{arabic}		% ToC & chapters
-
-\thispagestyle{empty}
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/manual.cls	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,103 +0,0 @@
-%
-% manual.cls for Sphinx
-%
-
-\NeedsTeXFormat{LaTeX2e}[1995/12/01]
-\ProvidesClass{manual}[2008/10/18 Document class (Sphinx manual)]
-
-% Pass all given class options to the parent class.
-\DeclareOption*{\PassOptionsToClass{\CurrentOption}{report}}
-\ProcessOptions\relax
-\LoadClass[twoside,openright]{report}
-
-% Set some sane defaults for section numbering depth and TOC depth.  You can
-% reset these counters in your preamble.
-%
-\setcounter{secnumdepth}{2}
-\setcounter{tocdepth}{1}
-
-% Change the title page to look a bit better, and fit in with the fncychap
-% ``Bjarne'' style a bit better.
-%
-\renewcommand{\maketitle}{%
-  \begin{titlepage}%
-    \let\footnotesize\small
-    \let\footnoterule\relax
-    \rule{\textwidth}{1pt}%
-    \ifsphinxpdfoutput
-      \begingroup
-      % This \def is required to deal with multi-line authors; it
-      % changes \\ to ', ' (comma-space), making it pass muster for
-      % generating document info in the PDF file.
-      \def\\{, }
-      \pdfinfo{
-        /Author (\@author)
-        /Title (\@title)
-      }
-      \endgroup
-    \fi
-    \begin{flushright}%
-      \sphinxlogo%
-      {\rm\Huge\py@HeaderFamily \@title \par}%
-      {\em\LARGE\py@HeaderFamily \py@release\releaseinfo \par}
-      \vfill
-      {\LARGE\py@HeaderFamily \@author \par}
-      \vfill\vfill
-      {\large
-       \@date \par
-       \vfill
-       \py@authoraddress \par
-      }%
-    \end{flushright}%\par
-    \@thanks
-  \end{titlepage}%
-  \cleardoublepage%
-  \setcounter{footnote}{0}%
-  \let\thanks\relax\let\maketitle\relax
-  %\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
-}
-
-
-% Catch the end of the {abstract} environment, but here make sure the abstract
-% is followed by a blank page if the 'openright' option is used.
-%
-\let\py@OldEndAbstract=\endabstract
-\renewcommand{\endabstract}{
-  \if@openright
-    \ifodd\value{page}
-      \typeout{Adding blank page after the abstract.}
-      \vfil\pagebreak
-    \fi
-  \fi
-  \py@OldEndAbstract
-}
-
-% This wraps the \tableofcontents macro with all the magic to get the spacing
-% right and have the right number of pages if the 'openright' option has been
-% used.  This eliminates a fair amount of crud in the individual document files.
-%
-\let\py@OldTableofcontents=\tableofcontents
-\renewcommand{\tableofcontents}{%
-  \setcounter{page}{1}%
-  \pagebreak%
-  \pagestyle{plain}%
-  {%
-    \parskip = 0mm%
-    \py@OldTableofcontents%
-    \if@openright%
-      \ifodd\value{page}%
-        \typeout{Adding blank page after the table of contents.}%
-        \pagebreak\hspace{0pt}%
-      \fi%
-    \fi%
-    \cleardoublepage%
-  }%
-  \pagenumbering{arabic}%
-  \@ifundefined{fancyhf}{}{\pagestyle{normal}}%
-}
-
-% This is needed to get the width of the section # area wide enough in the
-% library reference.  Doing it here keeps it the same for all the manuals.
-%
-\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.6em}}
-\renewcommand*\l@subsection{\@dottedtocline{2}{4.1em}{3.5em}}
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/python.ist	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-line_max 100
-headings_flag 1
-heading_prefix "  \\bigletter "
-
-preamble "\\begin{theindex}
-\\def\\bigletter#1{{\\Large\\sffamily#1}\\nopagebreak\\vspace{1mm}}
-
-"
-
-symhead_positive "{Symbols}"
-numhead_positive "{Numbers}"
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/sphinx.sty	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,709 +0,0 @@
-%
-% sphinx.sty
-%
-% Adapted from the old python.sty, mostly written by Fred Drake,
-% by Georg Brandl.
-%
-
-\NeedsTeXFormat{LaTeX2e}[1995/12/01]
-\ProvidesPackage{sphinx}[2008/05/01 LaTeX package (Sphinx markup)]
-
-\RequirePackage{textcomp}
-\RequirePackage{fancyhdr}
-\RequirePackage{fancybox}
-\RequirePackage{titlesec}
-\RequirePackage{tabulary}
-\RequirePackage{amsmath} % for \text
-\RequirePackage{makeidx}
-\RequirePackage{framed}
-\RequirePackage{color}
-\RequirePackage{fancyvrb}
-\RequirePackage{threeparttable}
-
-% Redefine these colors to your liking in the preamble.
-\definecolor{TitleColor}{rgb}{0.126,0.263,0.361}
-\definecolor{InnerLinkColor}{rgb}{0.208,0.374,0.486}
-\definecolor{OuterLinkColor}{rgb}{0.216,0.439,0.388}
-% Redefine these colors to something not white if you want to have colored
-% background and border for code examples.
-\definecolor{VerbatimColor}{rgb}{1,1,1}
-\definecolor{VerbatimBorderColor}{rgb}{1,1,1}
-
-% Uncomment these two lines to ignore the paper size and make the page 
-% size more like a typical published manual.
-%\renewcommand{\paperheight}{9in}
-%\renewcommand{\paperwidth}{8.5in}   % typical squarish manual
-%\renewcommand{\paperwidth}{7in}     % O'Reilly ``Programmming Python''
-
-% For graphicx, check if we are compiling under latex or pdflatex.
-\ifx\pdftexversion\undefined
-  \usepackage{graphicx}
-\else
-  \usepackage[pdftex]{graphicx}
-\fi
-
-% for PDF output, use colors and maximal compression
-\newif\ifsphinxpdfoutput\sphinxpdfoutputfalse
-\ifx\pdfoutput\undefined\else\ifcase\pdfoutput
-  \let\py@NormalColor\relax
-  \let\py@TitleColor\relax
-\else
-  \sphinxpdfoutputtrue
-  \input{pdfcolor}
-  \def\py@NormalColor{\color[rgb]{0.0,0.0,0.0}}
-  \def\py@TitleColor{\color{TitleColor}}
-  \pdfcompresslevel=9
-\fi\fi
-
-% XeLaTeX can do colors, too
-\ifx\XeTeXrevision\undefined\else
-  \def\py@NormalColor{\color[rgb]{0.0,0.0,0.0}}
-  \def\py@TitleColor{\color{TitleColor}}
-\fi
-
-% Increase printable page size (copied from fullpage.sty)
-\topmargin 0pt
-\advance \topmargin by -\headheight
-\advance \topmargin by -\headsep
-
-% attempt to work a little better for A4 users
-\textheight \paperheight
-\advance\textheight by -2in
-
-\oddsidemargin 0pt
-\evensidemargin 0pt
-%\evensidemargin -.25in  % for ``manual size'' documents
-\marginparwidth 0.5in
-
-\textwidth \paperwidth
-\advance\textwidth by -2in
-
-
-% Style parameters and macros used by most documents here
-\raggedbottom
-\sloppy
-\parindent = 0mm
-\parskip = 2mm
-\hbadness = 5000                % don't print trivial gripes
-
-\pagestyle{empty}               % start this way; change for
-\pagenumbering{roman}           % ToC & chapters
-
-% Use this to set the font family for headers and other decor:
-\newcommand{\py@HeaderFamily}{\sffamily\bfseries}
-
-% Redefine the 'normal' header/footer style when using "fancyhdr" package:
-\@ifundefined{fancyhf}{}{
-  % Use \pagestyle{normal} as the primary pagestyle for text.
-  \fancypagestyle{normal}{
-    \fancyhf{}
-    \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}}
-    \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}}
-    \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}}
-    \fancyhead[LE,RO]{{\py@HeaderFamily \@title, \py@release}}
-    \renewcommand{\headrulewidth}{0.4pt}
-    \renewcommand{\footrulewidth}{0.4pt}
-  }
-  % Update the plain style so we get the page number & footer line,
-  % but not a chapter or section title.  This is to keep the first
-  % page of a chapter and the blank page between chapters `clean.'
-  \fancypagestyle{plain}{
-    \fancyhf{}
-    \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}}
-    \renewcommand{\headrulewidth}{0pt}
-    \renewcommand{\footrulewidth}{0.4pt}
-  }
-}
-
-% Some custom font markup commands.
-%
-\newcommand{\strong}[1]{{\bf #1}}
-\newcommand{\code}[1]{\texttt{#1}}
-\newcommand{\bfcode}[1]{\code{\bfseries#1}}
-\newcommand{\samp}[1]{`\code{#1}'}
-\newcommand{\email}[1]{\textsf{#1}}
-
-\newcommand{\py@modulebadkey}{{--just-some-junk--}}
-
-% Redefine the Verbatim environment to allow border and background colors.
-% The original environment is still used for verbatims within tables.
-\let\OriginalVerbatim=\Verbatim
-\let\endOriginalVerbatim=\endVerbatim
-
-% Play with vspace to be able to keep the indentation.
-\newlength\distancetoright
-\newlength\leftsidespace
-\def\mycolorbox#1{%
-  \setlength\leftsidespace{\@totalleftmargin}%
-  \setlength\distancetoright{\textwidth}%
-  \advance\distancetoright -\@totalleftmargin %
-  \noindent\hspace*{\@totalleftmargin}%
-  \fcolorbox{VerbatimBorderColor}{VerbatimColor}{%
-  \begin{minipage}{\distancetoright}%
-    \smallskip%
-    \noindent\hspace*{-\leftsidespace}%
-    #1
-  \end{minipage}%
-  }%
-}
-\def\FrameCommand{\mycolorbox}
-
-\renewcommand{\Verbatim}[1][1]{%
-  % The list environement is needed to control perfectly the vertical
-  % space.
-  \list{}{%
-  \setlength\parskip{0pt}%
-  \setlength\itemsep{0ex}%
-  \setlength\topsep{0ex}%
-  \setlength\partopsep{0pt}%
-  \setlength\leftmargin{0pt}%
-  }%
-  \item\MakeFramed {\FrameRestore}%
-     \small%
-    \OriginalVerbatim[#1]%
-}
-\renewcommand{\endVerbatim}{%
-    \endOriginalVerbatim%
-  \endMakeFramed%
-  \endlist%
-}
-
-
-% Index-entry generation support.
-%
-
-% Command to generate two index entries (using subentries)
-\newcommand{\indexii}[2]{\index{#1!#2}\index{#2!#1}}
-
-% And three entries (using only one level of subentries)
-\newcommand{\indexiii}[3]{\index{#1!#2 #3}\index{#2!#3, #1}\index{#3!#1 #2}}
-
-% And four (again, using only one level of subentries)
-\newcommand{\indexiv}[4]{
-\index{#1!#2 #3 #4}
-\index{#2!#3 #4, #1}
-\index{#3!#4, #1 #2}
-\index{#4!#1 #2 #3}
-}
-
-% support for the module index
-\newif\ifpy@UseModuleIndex
-\py@UseModuleIndexfalse
-
-\newcommand{\makemodindex}{
-  \newwrite\modindexfile
-  \openout\modindexfile=mod\jobname.idx
-  \py@UseModuleIndextrue
-}
-
-\newcommand{\printmodindex}{
-  \@input@{mod\jobname.ind}
-}
-
-% Add the defining entry for a module
-\newcommand{\py@modindex}[2]{%
-  \renewcommand{\py@thismodule}{#1}
-  \ifpy@UseModuleIndex%
-    \@ifundefined{py@modplat@\py@thismodulekey}{
-      \write\modindexfile{\protect\indexentry{#1@{\texttt{#1}}|hyperpage}{\thepage}}%
-    }{\write\modindexfile{\protect\indexentry{#1@{\texttt{#1 }%
-        \emph{(\platformof{\py@thismodulekey})}}|hyperpage}{\thepage}}%
-    }
-  \fi%
-}
-
-% "Current" keys
-\newcommand{\py@thisclass}{}
-\newcommand{\py@thismodule}{}
-\newcommand{\py@thismodulekey}{}
-\newcommand{\py@thismoduletype}{}
-\newcommand{\py@emptymodule}{}
-
-% \declaremodule[key]{type}{name}
-\newcommand{\declaremodule}[3][\py@modulebadkey]{
-  \renewcommand{\py@thismoduletype}{#2}
-  \ifx\py@modulebadkey#1
-    \renewcommand{\py@thismodulekey}{#3}
-  \else
-    \renewcommand{\py@thismodulekey}{#1}
-  \fi
-  \py@modindex{#3}{}
-  %\label{module-\py@thismodulekey}
-}
-
-% Record module platforms for the Module Index
-\newif\ifpy@ModPlatformFileIsOpen \py@ModPlatformFileIsOpenfalse
-\long\def\py@writeModPlatformFile#1{%
-  \protected@write\py@ModPlatformFile%
-    {\let\label\@gobble \let\index\@gobble \let\glossary\@gobble}%
-    {\string#1}%
-}
-\newcommand{\py@ModPlatformFilename}{\jobname.pla}
-\newcommand{\platform}[1]{
-  \ifpy@ModPlatformFileIsOpen\else
-    \newwrite\py@ModPlatformFile
-    \openout\py@ModPlatformFile=\py@ModPlatformFilename
-    \py@ModPlatformFileIsOpentrue
-  \fi
-  \py@writeModPlatformFile{\py@defplatform{\py@thismodulekey}{#1}}
-}
-\newcommand{\py@defplatform}[2]{\expandafter\def\csname py@modplat@#1\endcsname{#2}}
-\newcommand{\platformof}[1]{\csname py@modplat@#1\endcsname}
-
-\InputIfFileExists{\jobname.pla}{}{}
-
-% \moduleauthor{name}{email}
-\newcommand{\moduleauthor}[2]{}
-
-% \sectionauthor{name}{email}
-\newcommand{\sectionauthor}[2]{}
-
-% Ignore module synopsis.
-\newcommand{\modulesynopsis}[1]{}
-
-% Reset "current" objects.
-\newcommand{\resetcurrentobjects}{
-  \renewcommand{\py@thisclass}{}
-  \renewcommand{\py@thismodule}{}
-  \renewcommand{\py@thismodulekey}{}
-  \renewcommand{\py@thismoduletype}{}
-}
-
-% Augment the sectioning commands used to get our own font family in place,
-% and reset some internal data items:
-\titleformat{\section}{\Large\py@HeaderFamily}%
-            {\py@TitleColor\thesection}{0.5em}{\py@TitleColor}{\py@NormalColor}
-\titleformat{\subsection}{\large\py@HeaderFamily}%
-            {\py@TitleColor\thesubsection}{0.5em}{\py@TitleColor}{\py@NormalColor}
-\titleformat{\subsubsection}{\py@HeaderFamily}%
-            {\py@TitleColor\thesubsubsection}{0.5em}{\py@TitleColor}{\py@NormalColor}
-\titleformat{\paragraph}{\large\py@HeaderFamily}%
-            {\py@TitleColor}{0em}{\py@TitleColor}{\py@NormalColor}
-
-
-% Now for a lot of semantically-loaded environments that do a ton of magical
-% things to get the right formatting and index entries for the stuff in
-% Python modules and C API.
-
-
-% {fulllineitems} is used in one place in libregex.tex, but is really for
-% internal use in this file.
-%
-\newcommand{\py@itemnewline}[1]{%
-  \@tempdima\linewidth%
-  \advance\@tempdima \leftmargin\makebox[\@tempdima][l]{#1}%
-}
-
-\newenvironment{fulllineitems}{
-  \begin{list}{}{\labelwidth \leftmargin \labelsep 0pt
-                 \rightmargin 0pt \topsep -\parskip \partopsep \parskip
-                 \itemsep -\parsep
-                 \let\makelabel=\py@itemnewline}
-}{\end{list}}
-
-% \optional is mostly for use in the arguments parameters to the various
-% {*desc} environments defined below, but may be used elsewhere.  Known to
-% be used in the debugger chapter.
-%
-% Typical usage:
-%
-%     \begin{funcdesc}{myfunc}{reqparm\optional{, optparm}}
-%                                    ^^^       ^^^
-%                          No space here       No space here
-%
-% When a function has multiple optional parameters, \optional should be
-% nested, not chained.  This is right:
-%
-%     \begin{funcdesc}{myfunc}{\optional{parm1\optional{, parm2}}}
-%
-\let\py@badkey=\@undefined
-
-\newcommand{\optional}[1]{%
-  {\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}}
-
-% This can be used when a function or method accepts an varying number 
-% of arguments, such as by using the *args syntax in the parameter list.
-\newcommand{\py@moreargs}{...}
-
-% This can be used when you don't want to document the parameters to a 
-% function or method, but simply state that it's an alias for
-% something else.
-\newcommand{\py@unspecified}{...}
-
-\newcommand{\py@varvars}[1]{{%
-    {\let\unspecified=\py@unspecified%
-      \let\moreargs=\py@moreargs%
-      \emph{#1}}}}
-
-\newlength{\py@argswidth}
-\newcommand{\py@sigparams}[1]{%
-  \parbox[t]{\py@argswidth}{\py@varvars{#1}\code{)}}}
-\newcommand{\py@sigline}[2]{%
-  \settowidth{\py@argswidth}{#1\code{(}}%
-  \addtolength{\py@argswidth}{-2\py@argswidth}%
-  \addtolength{\py@argswidth}{\textwidth}%
-  \item[#1\code{(}\py@sigparams{#2}]}
-
-% C functions ------------------------------------------------------------
-% \begin{cfuncdesc}[refcount]{type}{name}{arglist}
-% Note that the [refcount] slot should only be filled in by
-% tools/anno-api.py; it pulls the value from the refcounts database.
-\newcommand{\cfuncline}[3]{
-  \py@sigline{\code{#1 \bfcode{#2}}}{#3}%
-}
-\newenvironment{cfuncdesc}[3]{
-  \begin{fulllineitems}
-    \cfuncline{#1}{#2}{#3}
-}{\end{fulllineitems}}
-
-% C variables ------------------------------------------------------------
-% \begin{cvardesc}{type}{name}
-\newenvironment{cvardesc}[2]{
-  \begin{fulllineitems}
-    \item[\code{#1 \bfcode{#2}}]
-}{\end{fulllineitems}}
-
-% C data types -----------------------------------------------------------
-% \begin{ctypedesc}[index name]{typedef name}
-\newenvironment{ctypedesc}[2][\py@badkey]{
-  \begin{fulllineitems}
-    \item[\bfcode{#2}]
-}{\end{fulllineitems}}
-
-% C type fields ----------------------------------------------------------
-% \begin{cmemberdesc}{container type}{ctype}{membername}
-\newcommand{\cmemberline}[3]{
-  \item[\code{#2 \bfcode{#3}}]
-}
-\newenvironment{cmemberdesc}[3]{
-  \begin{fulllineitems}
-    \cmemberline{#1}{#2}{#3}
-}{\end{fulllineitems}}
-
-% Funky macros -----------------------------------------------------------
-% \begin{csimplemacrodesc}{name}
-% -- "simple" because it has no args; NOT for constant definitions!
-\newenvironment{csimplemacrodesc}[1]{
-  \begin{fulllineitems}
-    \item[\bfcode{#1}]
-}{\end{fulllineitems}}
-
-% simple functions (not methods) -----------------------------------------
-% \begin{funcdesc}{name}{args}
-\newcommand{\funcline}[2]{%
-  \py@sigline{\bfcode{#1}}{#2}}
-\newenvironment{funcdesc}[2]{
-  \begin{fulllineitems}
-    \funcline{#1}{#2}
-}{\end{fulllineitems}}
-
-% classes ----------------------------------------------------------------
-% \begin{classdesc}{name}{constructor args}
-\newcommand{\classline}[2]{
-  \py@sigline{\strong{class }\bfcode{#1}}{#2}}
-\newenvironment{classdesc}[2]{
-  % Using \renewcommand doesn't work for this, for unknown reasons:
-  \global\def\py@thisclass{#1}
-  \begin{fulllineitems}
-    \classline{#1}{#2}
-}{\end{fulllineitems}}
-
-% \begin{excclassdesc}{name}{constructor args}
-% but indexes as an exception
-\newenvironment{excclassdesc}[2]{
-  % Using \renewcommand doesn't work for this, for unknown reasons:
-  \global\def\py@thisclass{#1}
-  \begin{fulllineitems}
-    \py@sigline{\strong{exception }\bfcode{#1}}{#2}%
-}{\end{fulllineitems}}
-
-% There is no corresponding {excclassdesc*} environment.  To describe
-% a class exception without parameters, use the {excdesc} environment.
-
-
-\let\py@classbadkey=\@undefined
-
-% object method ----------------------------------------------------------
-% \begin{methoddesc}[classname]{methodname}{args}
-\newcommand{\methodline}[3][\@undefined]{
-  \py@sigline{\bfcode{#2}}{#3}}
-\newenvironment{methoddesc}[3][\@undefined]{
-  \begin{fulllineitems}
-    \ifx\@undefined#1\relax
-      \methodline{#2}{#3}
-    \else
-      \def\py@thisclass{#1}
-      \methodline{#2}{#3}
-    \fi
-}{\end{fulllineitems}}
-
-% static method ----------------------------------------------------------
-% \begin{staticmethoddesc}[classname]{methodname}{args}
-\newcommand{\staticmethodline}[3][\@undefined]{
-  \py@sigline{static \bfcode{#2}}{#3}}
-\newenvironment{staticmethoddesc}[3][\@undefined]{
-  \begin{fulllineitems}
-    \ifx\@undefined#1\relax
-      \staticmethodline{#2}{#3}
-    \else
-      \def\py@thisclass{#1}
-      \staticmethodline{#2}{#3}
-    \fi
-}{\end{fulllineitems}}
-
-% object data attribute --------------------------------------------------
-% \begin{memberdesc}[classname]{membername}
-\newcommand{\memberline}[2][\py@classbadkey]{%
-  \ifx\@undefined#1\relax
-    \item[\bfcode{#2}]
-  \else
-    \item[\bfcode{#2}]
-  \fi
-}
-\newenvironment{memberdesc}[2][\py@classbadkey]{
-  \begin{fulllineitems}
-    \ifx\@undefined#1\relax
-      \memberline{#2}
-    \else
-      \def\py@thisclass{#1}
-      \memberline{#2}
-    \fi
-}{\end{fulllineitems}}
-
-% For exceptions: --------------------------------------------------------
-% \begin{excdesc}{name}
-%  -- for constructor information, use excclassdesc instead
-\newenvironment{excdesc}[1]{
-  \begin{fulllineitems}
-    \item[\strong{exception }\bfcode{#1}]
-}{\end{fulllineitems}}
-
-% Module data or constants: ----------------------------------------------
-% \begin{datadesc}{name}
-\newcommand{\dataline}[1]{%
-  \item[\bfcode{#1}]\nopagebreak}
-\newenvironment{datadesc}[1]{
-  \begin{fulllineitems}
-    \dataline{#1}
-}{\end{fulllineitems}}
-
-% bytecode instruction ---------------------------------------------------
-% \begin{opcodedesc}{name}{var}
-% -- {var} may be {}
-\newenvironment{opcodedesc}[2]{
-  \begin{fulllineitems}
-    \item[\bfcode{#1}\quad\emph{#2}]
-}{\end{fulllineitems}}
-
-% generic description ----------------------------------------------------
-\newcommand{\descline}[1]{%
-  \item[\bfcode{#1}]\nopagebreak%
-}
-\newenvironment{describe}[1]{
-  \begin{fulllineitems}
-    \descline{#1}
-}{\end{fulllineitems}}
-
-% This version is being checked in for the historical record; it shows
-% how I've managed to get some aspects of this to work.  It will not
-% be used in practice, so a subsequent revision will change things
-% again.  This version has problems, but shows how to do something
-% that proved more tedious than I'd expected, so I don't want to lose
-% the example completely.
-%
-\newcommand{\grammartoken}[1]{\texttt{#1}}
-\newenvironment{productionlist}[1][\py@badkey]{
-  \def\optional##1{{\Large[}##1{\Large]}}
-  \def\production##1##2{\code{##1}&::=&\code{##2}\\}
-  \def\productioncont##1{& &\code{##1}\\}
-  \def\token##1{##1}
-  \let\grammartoken=\token
-  \parindent=2em
-  \indent
-  \begin{tabular}{lcl}
-}{%
-  \end{tabular}
-}
-
-% Notices / Admonitions
-%
-\newlength{\py@noticelength}
-
-\newcommand{\py@heavybox}{
-  \setlength{\fboxrule}{1pt}
-  \setlength{\fboxsep}{7pt}
-  \setlength{\py@noticelength}{\linewidth}
-  \addtolength{\py@noticelength}{-2\fboxsep}
-  \addtolength{\py@noticelength}{-2\fboxrule}
-  \setlength{\shadowsize}{3pt}
-  \Sbox
-  \minipage{\py@noticelength}
-}
-\newcommand{\py@endheavybox}{
-  \endminipage
-  \endSbox
-  \fbox{\TheSbox}
-}
-
-% Some are quite plain:
-\newcommand{\py@noticestart@note}{}
-\newcommand{\py@noticeend@note}{}
-\newcommand{\py@noticestart@hint}{}
-\newcommand{\py@noticeend@hint}{}
-\newcommand{\py@noticestart@important}{}
-\newcommand{\py@noticeend@important}{}
-\newcommand{\py@noticestart@tip}{}
-\newcommand{\py@noticeend@tip}{}
-
-% Others gets more visible distinction:
-\newcommand{\py@noticestart@warning}{\py@heavybox}
-\newcommand{\py@noticeend@warning}{\py@endheavybox}
-\newcommand{\py@noticestart@caution}{\py@heavybox}
-\newcommand{\py@noticeend@caution}{\py@endheavybox}
-\newcommand{\py@noticestart@attention}{\py@heavybox}
-\newcommand{\py@noticeend@attention}{\py@endheavybox}
-\newcommand{\py@noticestart@danger}{\py@heavybox}
-\newcommand{\py@noticeend@danger}{\py@endheavybox}
-\newcommand{\py@noticestart@error}{\py@heavybox}
-\newcommand{\py@noticeend@error}{\py@endheavybox}
-
-\newenvironment{notice}[2]{
-  \def\py@noticetype{#1}
-  \csname py@noticestart@#1\endcsname
-  \par\strong{#2}
-}{\csname py@noticeend@\py@noticetype\endcsname}
-
-% Allow the release number to be specified independently of the
-% \date{}.  This allows the date to reflect the document's date and
-% release to specify the release that is documented.
-%
-\newcommand{\py@release}{}
-\newcommand{\version}{}
-\newcommand{\shortversion}{}
-\newcommand{\releaseinfo}{}
-\newcommand{\releasename}{Release}
-\newcommand{\release}[1]{%
-  \renewcommand{\py@release}{\releasename\space\version}%
-  \renewcommand{\version}{#1}}
-\newcommand{\setshortversion}[1]{%
-  \renewcommand{\shortversion}{#1}}
-\newcommand{\setreleaseinfo}[1]{%
-  \renewcommand{\releaseinfo}{#1}}
-
-% Allow specification of the author's address separately from the
-% author's name.  This can be used to format them differently, which
-% is a good thing.
-%
-\newcommand{\py@authoraddress}{}
-\newcommand{\authoraddress}[1]{\renewcommand{\py@authoraddress}{#1}}
-
-% This sets up the fancy chapter headings that make the documents look
-% at least a little better than the usual LaTeX output.
-%
-\@ifundefined{ChTitleVar}{}{
-  \ChNameVar{\raggedleft\normalsize\py@HeaderFamily}
-  \ChNumVar{\raggedleft \bfseries\Large\py@HeaderFamily}
-  \ChTitleVar{\raggedleft \rm\Huge\py@HeaderFamily}
-  % This creates chapter heads without the leading \vspace*{}:
-  \def\@makechapterhead#1{%
-    {\parindent \z@ \raggedright \normalfont
-      \ifnum \c@secnumdepth >\m@ne
-        \DOCH
-      \fi
-      \interlinepenalty\@M
-      \DOTI{#1}
-    }
-  }
-}
-
-% Redefine description environment so that it is usable inside fulllineitems.
-%
-\renewcommand{\description}{%
-  \list{}{\labelwidth\z@%
-          \itemindent-\leftmargin%
-	  \labelsep5pt%
-          \let\makelabel=\descriptionlabel}}
-
-% Definition lists; requested by AMK for HOWTO documents.  Probably useful
-% elsewhere as well, so keep in in the general style support.
-%
-\newenvironment{definitions}{%
-  \begin{description}%
-  \def\term##1{\item[##1]\mbox{}\\*[0mm]}
-}{%
-  \end{description}%
-}
-
-% Tell TeX about pathological hyphenation cases:
-\hyphenation{Base-HTTP-Re-quest-Hand-ler}
-
-
-% The following is stuff copied from docutils' latex writer.
-%
-\newcommand{\optionlistlabel}[1]{\bf #1 \hfill}
-\newenvironment{optionlist}[1]
-{\begin{list}{}
-  {\setlength{\labelwidth}{#1}
-   \setlength{\rightmargin}{1cm}
-   \setlength{\leftmargin}{\rightmargin}
-   \addtolength{\leftmargin}{\labelwidth}
-   \addtolength{\leftmargin}{\labelsep}
-   \renewcommand{\makelabel}{\optionlistlabel}}
-}{\end{list}}
-
-\newlength{\lineblockindentation}
-\setlength{\lineblockindentation}{2.5em}
-\newenvironment{lineblock}[1]
-{\begin{list}{}
-  {\setlength{\partopsep}{\parskip}
-   \addtolength{\partopsep}{\baselineskip}
-   \topsep0pt\itemsep0.15\baselineskip\parsep0pt
-   \leftmargin#1}
- \raggedright}
-{\end{list}}
-
-% Redefine includgraphics for avoiding images larger than the screen size
-% If the size is not specified.
-\let\py@Oldincludegraphics\includegraphics
-
-\newbox\image@box%
-\newdimen\image@width%
-\renewcommand\includegraphics[2][\@empty]{%
-  \ifx#1\@empty%
-    \setbox\image@box=\hbox{\py@Oldincludegraphics{#2}}%
-    \image@width\wd\image@box%
-    \ifdim \image@width>\linewidth%
-      \setbox\image@box=\hbox{\py@Oldincludegraphics[width=\linewidth]{#2}}%
-    \fi%
-    \box\image@box%
-  \else%
-    \py@Oldincludegraphics[#1]{#2}%
-  \fi%
-}
-
-
-% Fix the index and bibliography environments to add an entry to the Table of
-% Contents; this is much nicer than just having to jump to the end of the book
-% and flip around, especially with multiple indexes.
-%
-\let\py@OldTheindex=\theindex
-\renewcommand{\theindex}{
-  \cleardoublepage
-  \phantomsection
-  \py@OldTheindex
-  \addcontentsline{toc}{chapter}{\indexname}
-}
-
-\let\py@OldThebibliography=\thebibliography
-\renewcommand{\thebibliography}[1]{
-  \cleardoublepage
-  \phantomsection
-  \py@OldThebibliography{1}
-  \addcontentsline{toc}{chapter}{\bibname}
-}
-
-% Include hyperref last.
-\RequirePackage[colorlinks,breaklinks,
-                linkcolor=InnerLinkColor,filecolor=OuterLinkColor,
-                menucolor=OuterLinkColor,pagecolor=OuterLinkColor,
-                urlcolor=OuterLinkColor]{hyperref}
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/tabulary.sty	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,449 +0,0 @@
-%%
-%% This is file `tabulary.sty',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% tabulary.dtx  (with options: `package')
-%% DRAFT VERSION
-%%
-%% File `tabulary.dtx'.
-%% Copyright (C) 1995 1996 2003 David Carlisle
-%% This file may be distributed under the terms of the LPPL.
-%% See 00readme.txt for details.
-%%
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{tabulary}
-          [2007/10/02 v0.9 tabulary package (DPC)]
-\RequirePackage{array}
-\catcode`\Z=14
-\DeclareOption{debugshow}{\catcode`\Z=9\relax}
-\ProcessOptions
-\def\arraybackslash{\let\\=\@arraycr}
-\def\@finalstrut#1{%
-  \unskip\ifhmode\nobreak\fi\vrule\@width\z@\@height\z@\@depth\dp#1}
-\newcount\TY@count
-\def\tabulary{%
-  \let\TY@final\tabular
-  \let\endTY@final\endtabular
-  \TY@tabular}
-\def\TY@tabular#1{%
-  \edef\TY@{\@currenvir}%
-  {\ifnum0=`}\fi
-  \@ovxx\TY@linewidth
-  \@ovyy\TY@tablewidth
-  \count@\z@
-  \@tempswatrue
-  \@whilesw\if@tempswa\fi{%
-  \advance\count@\@ne
-  \expandafter\ifx\csname TY@F\the\count@\endcsname\relax
-    \@tempswafalse
-  \else
-    \expandafter\let\csname TY@SF\the\count@\expandafter\endcsname
-                     \csname TY@F\the\count@\endcsname
-    \global\expandafter\let\csname TY@F\the\count@\endcsname\relax
-    \expandafter\let\csname TY@S\the\count@\expandafter\endcsname
-                     \csname TY@\the\count@\endcsname
-  \fi}%
-    \global\TY@count\@ne
-    \TY@width\xdef{0pt}%
-    \global\TY@tablewidth\z@
-    \global\TY@linewidth#1\relax
-Z\message{^^J^^JTable^^J%
-Z        Target Width: \the\TY@linewidth^^J%
-Z        \string\tabcolsep: \the\tabcolsep\space
-Z        \string\arrayrulewidth: \the\arrayrulewidth\space
-Z        \string\doublerulesep: \the\doublerulesep^^J%
-Z        \string\tymin: \the\tymin\space
-Z        \string\tymax: \the\tymax^^J}%
-    \let\@classz\TY@classz
-    \let\verb\TX@verb
-    \toks@{}\TY@get@body}
-\let\TY@@mkpream\@mkpream
-\def\TY@mkpream{%
-    \def\@addamp{%
-      \if@firstamp \@firstampfalse \else
-      \global\advance\TY@count\@ne
-      \edef\@preamble{\@preamble &}\fi
-      \TY@width\xdef{0pt}}%
-    \def\@acol{%
-      \TY@subwidth\col@sep
-      \@addtopreamble{\hskip\col@sep}}%
-    \let\@arrayrule\TY@arrayrule
-    \let\@classvi\TY@classvi
-    \def\@classv{\save@decl
-      \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@
-      \sbox\z@{\d@llarbegin\@nextchar\d@llarend}%
-      \TY@subwidth{\wd\z@}%
-      \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}%
-      \prepnext@tok}%
-  \global\let\@mkpream\TY@@mkpream
-  \TY@@mkpream}
-\def\TY@arrayrule{%
-  \TY@subwidth\arrayrulewidth
-  \@addtopreamble \vline}
-\def\TY@classvi{\ifcase \@lastchclass
-  \@acol \or
-  \TY@subwidth\doublerulesep
-  \@addtopreamble{\hskip \doublerulesep}\or
-  \@acol \or
-  \@classvii
-  \fi}
-\def\TY@tab{%
-  \setbox\z@\hbox\bgroup
-  \let\[$\let\]$%
-  \let\equation$\let\endequation$%
-    \col@sep\tabcolsep
-    \let\d@llarbegin\begingroup\let\d@llarend\endgroup
-    \let\@mkpream\TY@mkpream
-      \def\multicolumn##1##2##3{\multispan##1\relax}%
-    \CT@start\TY@tabarray}
-\def\TY@tabarray{\@ifnextchar[{\TY@array}{\@array[t]}}
-\def\TY@array[#1]{\@array[t]}
-\def\TY@width#1{%
-  \expandafter#1\csname TY@\the\TY@count\endcsname}
-\def\TY@subwidth#1{%
-  \TY@width\dimen@
-  \advance\dimen@-#1\relax
-  \TY@width\xdef{\the\dimen@}%
-  \global\advance\TY@linewidth-#1\relax}
-\def\endtabulary{%
-  \gdef\@halignto{}%
-  \expandafter\TY@tab\the\toks@
-  \crcr\omit
-  {\xdef\TY@save@row{}%
-     \loop
-    \advance\TY@count\m@ne
-    \ifnum\TY@count>\z@
-    \xdef\TY@save@row{\TY@save@row&\omit}%
-    \repeat}\TY@save@row
-  \endarray\global\setbox1=\lastbox\setbox0=\vbox{\unvbox1
-    \unskip\global\setbox1=\lastbox}\egroup
-  \dimen@\TY@linewidth
-  \divide\dimen@\TY@count
-  \ifdim\dimen@<\tymin
-    \TY@warn{tymin too large (\the\tymin), resetting to \the\dimen@}%
-    \tymin\dimen@
-  \fi
-  \setbox\tw@=\hbox{\unhbox\@ne
-    \loop
-\@tempdima=\lastskip
-\ifdim\@tempdima>\z@
-Z   \message{ecs=\the\@tempdima^^J}%
-   \global\advance\TY@linewidth-\@tempdima
-\fi
-    \unskip
-    \setbox\tw@=\lastbox
-    \ifhbox\tw@
-Z     \message{Col \the\TY@count: Initial=\the\wd\tw@\space}%
-      \ifdim\wd\tw@>\tymax
-        \wd\tw@\tymax
-Z       \message{> max\space}%
-Z     \else
-Z       \message{ \@spaces\space}%
-      \fi
-  \TY@width\dimen@
-Z \message{\the\dimen@\space}%
-  \advance\dimen@\wd\tw@
-Z \message{Final=\the\dimen@\space}%
-   \TY@width\xdef{\the\dimen@}%
-      \ifdim\dimen@<\tymin
-Z        \message{< tymin}%
-         \global\advance\TY@linewidth-\dimen@
-         \expandafter\xdef\csname TY@F\the\TY@count\endcsname
-                                                        {\the\dimen@}%
-       \else
-      \expandafter\ifx\csname TY@F\the\TY@count\endcsname\z@
-Z        \message{***}%
-         \global\advance\TY@linewidth-\dimen@
-         \expandafter\xdef\csname TY@F\the\TY@count\endcsname
-                                                        {\the\dimen@}%
-        \else
-Z        \message{> tymin}%
-         \global\advance\TY@tablewidth\dimen@
-         \global\expandafter\let\csname TY@F\the\TY@count\endcsname
-                                                               \maxdimen
-       \fi\fi
-       \advance\TY@count\m@ne
-    \repeat}%
-    \TY@checkmin
-    \TY@checkmin
-    \TY@checkmin
-    \TY@checkmin
-    \TY@count\z@
-    \let\TY@box\TY@box@v
-  {\expandafter\TY@final\the\toks@\endTY@final}%
-  \count@\z@
-  \@tempswatrue
-  \@whilesw\if@tempswa\fi{%
-  \advance\count@\@ne
-  \expandafter\ifx\csname TY@SF\the\count@\endcsname\relax
-    \@tempswafalse
-  \else
-    \global\expandafter\let\csname TY@F\the\count@\expandafter\endcsname
-                   \csname TY@SF\the\count@\endcsname
-    \global\expandafter\let\csname TY@\the\count@\expandafter\endcsname
-                   \csname TY@S\the\count@\endcsname
-  \fi}%
-  \TY@linewidth\@ovxx
-  \TY@tablewidth\@ovyy
-    \ifnum0=`{\fi}}
-\def\TY@checkmin{%
-  \let\TY@checkmin\relax
-\ifdim\TY@tablewidth>\z@
-  \Gscale@div\TY@ratio\TY@linewidth\TY@tablewidth
- \ifdim\TY@tablewidth <\linewidth
-   \def\TY@ratio{1}%
- \fi
-\else
-  \TY@warn{No suitable columns!}%
-  \def\TY@ratio{1}%
-\fi
-\count@\z@
-Z \message{^^JLine Width: \the\TY@linewidth,
-Z             Natural Width: \the\TY@tablewidth,
-Z             Ratio: \TY@ratio^^J}%
-\@tempdima\z@
-\loop
-\ifnum\count@<\TY@count
-\advance\count@\@ne
-  \ifdim\csname TY@F\the\count@\endcsname>\tymin
-    \dimen@\csname TY@\the\count@\endcsname
-    \dimen@\TY@ratio\dimen@
-    \ifdim\dimen@<\tymin
-Z     \message{Column \the\count@\space ->}%
-      \global\expandafter\let\csname TY@F\the\count@\endcsname\tymin
-      \global\advance\TY@linewidth-\tymin
-      \global\advance\TY@tablewidth-\csname TY@\the\count@\endcsname
-      \let\TY@checkmin\TY@@checkmin
-    \else
-      \expandafter\xdef\csname TY@F\the\count@\endcsname{\the\dimen@}%
-      \advance\@tempdima\csname TY@F\the\count@\endcsname
-    \fi
-  \fi
-Z \dimen@\csname TY@F\the\count@\endcsname\message{\the\dimen@, }%
-\repeat
-Z \message{^^JTotal:\the\@tempdima^^J}%
-}
-\let\TY@@checkmin\TY@checkmin
-\newdimen\TY@linewidth
-\def\tyformat{\everypar{{\nobreak\hskip\z@skip}}}
-\newdimen\tymin
-\tymin=10pt
-\newdimen\tymax
-\tymax=2\textwidth
-\def\@testpach{\@chclass
- \ifnum \@lastchclass=6 \@ne \@chnum \@ne \else
-  \ifnum \@lastchclass=7 5 \else
-   \ifnum \@lastchclass=8 \tw@ \else
-    \ifnum \@lastchclass=9 \thr@@
-   \else \z@
-   \ifnum \@lastchclass = 10 \else
-   \edef\@nextchar{\expandafter\string\@nextchar}%
-   \@chnum
-   \if \@nextchar c\z@ \else
-    \if \@nextchar l\@ne \else
-     \if \@nextchar r\tw@ \else
-   \if \@nextchar C7 \else
-    \if \@nextchar L8 \else
-     \if \@nextchar R9 \else
-     \if \@nextchar J10 \else
-   \z@ \@chclass
-   \if\@nextchar |\@ne \else
-    \if \@nextchar !6 \else
-     \if \@nextchar @7 \else
-      \if \@nextchar <8 \else
-       \if \@nextchar >9 \else
-  10
-  \@chnum
-  \if \@nextchar m\thr@@\else
-   \if \@nextchar p4 \else
-    \if \@nextchar b5 \else
-   \z@ \@chclass \z@ \@preamerr \z@ \fi \fi \fi \fi\fi \fi \fi\fi \fi
-     \fi  \fi  \fi  \fi  \fi  \fi \fi \fi \fi \fi \fi}
-\def\TY@classz{%
-  \@classx
-  \@tempcnta\count@
-  \ifx\TY@box\TY@box@v
-    \global\advance\TY@count\@ne
-  \fi
-  \let\centering c%
-  \let\raggedright\noindent
-  \let\raggedleft\indent
-  \let\arraybackslash\relax
-  \prepnext@tok
-  \ifnum\@chnum<4
-    \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@
-  \fi
-  \ifnum\@chnum=6
-    \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@
-  \fi
-  \@addtopreamble{%
-    \ifcase\@chnum
-      \hfil \d@llarbegin\insert@column\d@llarend \hfil \or
-      \kern\z@
-       \d@llarbegin \insert@column \d@llarend \hfil \or
-      \hfil\kern\z@ \d@llarbegin \insert@column \d@llarend \or
-      $\vcenter\@startpbox{\@nextchar}\insert@column \@endpbox $\or
-      \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or
-      \vbox \@startpbox{\@nextchar}\insert@column \@endpbox \or
-      \d@llarbegin \insert@column \d@llarend \or% dubious "s" case
-      \TY@box\centering\or
-      \TY@box\raggedright\or
-      \TY@box\raggedleft\or
-      \TY@box\relax
-    \fi}\prepnext@tok}
-\def\TY@box#1{%
-  \ifx\centering#1%
-      \hfil \d@llarbegin\insert@column\d@llarend \hfil \else
-  \ifx\raggedright#1%
-        \kern\z@%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-      \d@llarbegin \insert@column \d@llarend \hfil \else
-  \ifx\raggedleft#1%
-      \hfil\kern\z@ \d@llarbegin \insert@column \d@llarend \else
-  \ifx\relax#1%
-       \d@llarbegin \insert@column \d@llarend
-  \fi  \fi  \fi  \fi}
-\def\TY@box@v#1{%
-      \vtop \@startpbox{\csname TY@F\the\TY@count\endcsname}%
-              #1\arraybackslash\tyformat
-                              \insert@column\@endpbox}
-\newdimen\TY@tablewidth
-\def\Gscale@div#1#2#3{%
-  \setlength\dimen@{#3}%
-  \ifdim\dimen@=\z@
-    \PackageError{graphics}{Division by 0}\@eha
-    \dimen@#2%
-  \fi
-  \edef\@tempd{\the\dimen@}%
-  \setlength\dimen@{#2}%
-  \count@65536\relax
-  \ifdim\dimen@<\z@
-    \dimen@-\dimen@
-    \count@-\count@
-  \fi
-  \loop
-    \ifdim\dimen@<8192\p@
-      \dimen@\tw@\dimen@
-      \divide\count@\tw@
-  \repeat
-  \dimen@ii=\@tempd\relax
-  \divide\dimen@ii\count@
-  \divide\dimen@\dimen@ii
-  \edef#1{\strip@pt\dimen@}}
-\long\def\TY@get@body#1\end
-  {\toks@\expandafter{\the\toks@#1}\TY@find@end}
-\def\TY@find@end#1{%
-  \def\@tempa{#1}%
-  \ifx\@tempa\TY@\def\@tempa{\end{#1}}\expandafter\@tempa
-  \else\toks@\expandafter
-    {\the\toks@\end{#1}}\expandafter\TY@get@body\fi}
-\def\TY@warn{%
-  \PackageWarning{tabulary}}
-\catcode`\Z=11
-\AtBeginDocument{
-\@ifpackageloaded{colortbl}{%
-\expandafter\def\expandafter\@mkpream\expandafter#\expandafter1%
-  \expandafter{%
-    \expandafter\let\expandafter\CT@setup\expandafter\relax
-    \expandafter\let\expandafter\CT@color\expandafter\relax
-    \expandafter\let\expandafter\CT@do@color\expandafter\relax
-    \expandafter\let\expandafter\color\expandafter\relax
-    \expandafter\let\expandafter\CT@column@color\expandafter\relax
-    \expandafter\let\expandafter\CT@row@color\expandafter\relax
-    \@mkpream{#1}}
-\let\TY@@mkpream\@mkpream
-\def\TY@classz{%
-  \@classx
-  \@tempcnta\count@
-  \ifx\TY@box\TY@box@v
-    \global\advance\TY@count\@ne
-  \fi
-  \let\centering c%
-  \let\raggedright\noindent
-  \let\raggedleft\indent
-  \let\arraybackslash\relax
-  \prepnext@tok
-\expandafter\CT@extract\the\toks\@tempcnta\columncolor!\@nil
-  \ifnum\@chnum<4
-    \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@
-  \fi
-  \ifnum\@chnum=6
-    \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@
-  \fi
-  \@addtopreamble{%
-    \setbox\z@\hbox\bgroup\bgroup
-    \ifcase\@chnum
-      \hskip\stretch{.5}\kern\z@
-      \d@llarbegin\insert@column\d@llarend\hskip\stretch{.5}\or
-      \kern\z@%<<<<<<<<<<<<<<<<<<<<<<<<<<<
-       \d@llarbegin \insert@column \d@llarend \hfill \or
-      \hfill\kern\z@ \d@llarbegin \insert@column \d@llarend \or
-      $\vcenter\@startpbox{\@nextchar}\insert@column \@endpbox $\or
-      \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or
-      \vbox \@startpbox{\@nextchar}\insert@column \@endpbox \or
-      \d@llarbegin \insert@column \d@llarend \or% dubious s case
-      \TY@box\centering\or
-      \TY@box\raggedright\or
-      \TY@box\raggedleft\or
-      \TY@box\relax
-    \fi
- \egroup\egroup
-\begingroup
-  \CT@setup
-  \CT@column@color
-  \CT@row@color
-  \CT@do@color
-\endgroup
-        \@tempdima\ht\z@
-        \advance\@tempdima\minrowclearance
-        \vrule\@height\@tempdima\@width\z@
-\unhbox\z@
-}\prepnext@tok}%
-    \def\TY@arrayrule{%
-      \TY@subwidth\arrayrulewidth
-      \@addtopreamble{{\CT@arc@\vline}}}%
-    \def\TY@classvi{\ifcase \@lastchclass
-      \@acol \or
-      \TY@subwidth\doublerulesep
-      \ifx\CT@drsc@\relax
-        \@addtopreamble{\hskip\doublerulesep}%
-      \else
-        \@addtopreamble{{\CT@drsc@\vrule\@width\doublerulesep}}%
-      \fi\or
-      \@acol \or
-      \@classvii
-      \fi}%
-}{%
-\let\CT@start\relax
-}
-}
-{\uccode`\*=`\ %
-\uppercase{\gdef\TX@verb{%
-  \leavevmode\null\TX@vwarn
-  {\ifnum0=`}\fi\ttfamily\let\\\ignorespaces
-  \@ifstar{\let~*\TX@vb}{\TX@vb}}}}
-\def\TX@vb#1{\def\@tempa##1#1{\toks@{##1}\edef\@tempa{\the\toks@}%
-    \expandafter\TX@v\meaning\@tempa\\ \\\ifnum0=`{\fi}}\@tempa!}
-\def\TX@v#1!{\afterassignment\TX@vfirst\let\@tempa= }
-\begingroup
-\catcode`\*=\catcode`\#
-\catcode`\#=12
-\gdef\TX@vfirst{%
-  \if\@tempa#%
-    \def\@tempb{\TX@v@#}%
-  \else
-    \let\@tempb\TX@v@
-    \if\@tempa\space~\else\@tempa\fi
-  \fi
-  \@tempb}
-\gdef\TX@v@*1 *2{%
-  \TX@v@hash*1##\relax\if*2\\\else~\expandafter\TX@v@\fi*2}
-\gdef\TX@v@hash*1##*2{*1\ifx*2\relax\else#\expandafter\TX@v@hash\fi*2}
-\endgroup
-\def\TX@vwarn{%
-  \@warning{\noexpand\verb may be unreliable inside tabularx/y}%
-  \global\let\TX@vwarn\@empty}
-\endinput
-%%
-%% End of file `tabulary.sty'.
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/textwriter.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,679 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.textwriter
-    ~~~~~~~~~~~~~~~~~
-
-    Custom docutils writer for plain text.
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import re
-import textwrap
-
-from docutils import nodes, writers
-
-from sphinx import addnodes
-from sphinx.locale import admonitionlabels, versionlabels
-
-
-class TextWriter(writers.Writer):
-    supported = ('text',)
-    settings_spec = ('No options here.', '', ())
-    settings_defaults = {}
-
-    output = None
-
-    def __init__(self, builder):
-        writers.Writer.__init__(self)
-        self.builder = builder
-
-    def translate(self):
-        visitor = TextTranslator(self.document, self.builder)
-        self.document.walkabout(visitor)
-        self.output = visitor.body
-
-# monkey-patch...
-new_wordsep_re = re.compile(
-        r'(\s+|'                                  # any whitespace
-        r'(?<=\s)(?::[a-z-]+:)?`\S+|'             # interpreted text start
-        r'[^\s\w]*\w+[a-zA-Z]-(?=\w+[a-zA-Z])|'   # hyphenated words
-        r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))')   # em-dash
-textwrap.TextWrapper.wordsep_re = new_wordsep_re
-
-MAXWIDTH = 70
-STDINDENT = 3
-
-
-class TextTranslator(nodes.NodeVisitor):
-    sectionchars = '*=-~"+'
-
-    def __init__(self, document, builder):
-        nodes.NodeVisitor.__init__(self, document)
-
-        self.states = [[]]
-        self.stateindent = [0]
-        self.sectionlevel = 0
-        self.table = None
-
-    def add_text(self, text):
-        self.states[-1].append((-1, text))
-    def new_state(self, indent=STDINDENT):
-        self.states.append([])
-        self.stateindent.append(indent)
-    def end_state(self, wrap=True, end=[''], first=None):
-        content = self.states.pop()
-        maxindent = sum(self.stateindent)
-        indent = self.stateindent.pop()
-        result = []
-        toformat = []
-        def do_format():
-            if not toformat:
-                return
-            if wrap:
-                res = textwrap.wrap(''.join(toformat), width=MAXWIDTH-maxindent)
-            else:
-                res = ''.join(toformat).splitlines()
-            if end:
-                res += end
-            result.append((indent, res))
-        for itemindent, item in content:
-            if itemindent == -1:
-                toformat.append(item)
-            else:
-                do_format()
-                result.append((indent + itemindent, item))
-                toformat = []
-        do_format()
-        if first is not None and result:
-            itemindent, item = result[0]
-            if item:
-                result.insert(0, (itemindent - indent, [first + item[0]]))
-                result[1] = (itemindent, item[1:])
-        self.states[-1].extend(result)
-
-    def visit_document(self, node):
-        self.new_state(0)
-    def depart_document(self, node):
-        self.end_state()
-        self.body = '\n'.join(line and (' '*indent + line)
-                              for indent, lines in self.states[0]
-                              for line in lines)
-        # XXX header/footer?
-
-    def visit_highlightlang(self, node):
-        raise nodes.SkipNode
-
-    def visit_section(self, node):
-        self._title_char = self.sectionchars[self.sectionlevel]
-        self.sectionlevel += 1
-    def depart_section(self, node):
-        self.sectionlevel -= 1
-
-    def visit_topic(self, node):
-        self.new_state(0)
-    def depart_topic(self, node):
-        self.end_state()
-
-    visit_sidebar = visit_topic
-    depart_sidebar = depart_topic
-
-    def visit_rubric(self, node):
-        self.new_state(0)
-        self.add_text('-[ ')
-    def depart_rubric(self, node):
-        self.add_text(' ]-')
-        self.end_state()
-
-    def visit_compound(self, node):
-        pass
-    def depart_compound(self, node):
-        pass
-
-    def visit_glossary(self, node):
-        pass
-    def depart_glossary(self, node):
-        pass
-
-    def visit_title(self, node):
-        if isinstance(node.parent, nodes.Admonition):
-            self.add_text(node.astext()+': ')
-            raise nodes.SkipNode
-        self.new_state(0)
-    def depart_title(self, node):
-        if isinstance(node.parent, nodes.section):
-            char = self._title_char
-        else:
-            char = '^'
-        text = ''.join(x[1] for x in self.states.pop() if x[0] == -1)
-        self.stateindent.pop()
-        self.states[-1].append((0, ['', text, '%s' % (char * len(text)), '']))
-
-    def visit_subtitle(self, node):
-        pass
-    def depart_subtitle(self, node):
-        pass
-
-    def visit_attribution(self, node):
-        self.add_text('-- ')
-    def depart_attribution(self, node):
-        pass
-
-    def visit_module(self, node):
-        if node.has_key('platform'):
-            self.new_state(0)
-            self.add_text(_('Platform: %s') % node['platform'])
-            self.end_state()
-        raise nodes.SkipNode
-
-    def visit_desc(self, node):
-        pass
-    def depart_desc(self, node):
-        pass
-
-    def visit_desc_signature(self, node):
-        self.new_state(0)
-        if node.parent['desctype'] in ('class', 'exception'):
-            self.add_text('%s ' % node.parent['desctype'])
-    def depart_desc_signature(self, node):
-        # XXX: wrap signatures in a way that makes sense
-        self.end_state(wrap=False, end=None)
-
-    def visit_desc_name(self, node):
-        pass
-    def depart_desc_name(self, node):
-        pass
-
-    def visit_desc_addname(self, node):
-        pass
-    def depart_desc_addname(self, node):
-        pass
-
-    def visit_desc_type(self, node):
-        pass
-    def depart_desc_type(self, node):
-        pass
-
-    def visit_desc_parameterlist(self, node):
-        self.add_text('(')
-        self.first_param = 1
-    def depart_desc_parameterlist(self, node):
-        self.add_text(')')
-
-    def visit_desc_parameter(self, node):
-        if not self.first_param:
-            self.add_text(', ')
-        else:
-            self.first_param = 0
-        self.add_text(node.astext())
-        raise nodes.SkipNode
-
-    def visit_desc_optional(self, node):
-        self.add_text('[')
-    def depart_desc_optional(self, node):
-        self.add_text(']')
-
-    def visit_desc_annotation(self, node):
-        pass
-    def depart_desc_annotation(self, node):
-        pass
-
-    def visit_refcount(self, node):
-        pass
-    def depart_refcount(self, node):
-        pass
-
-    def visit_desc_content(self, node):
-        self.new_state()
-        self.add_text('\n')
-    def depart_desc_content(self, node):
-        self.end_state()
-
-    def visit_figure(self, node):
-        self.new_state()
-    def depart_figure(self, node):
-        self.end_state()
-
-    def visit_caption(self, node):
-        pass
-    def depart_caption(self, node):
-        pass
-
-    def visit_productionlist(self, node):
-        self.new_state()
-        names = []
-        for production in node:
-            names.append(production['tokenname'])
-        maxlen = max(len(name) for name in names)
-        for production in node:
-            if production['tokenname']:
-                self.add_text(production['tokenname'].ljust(maxlen) + ' ::=')
-                lastname = production['tokenname']
-            else:
-                self.add_text('%s    ' % (' '*len(lastname)))
-            self.add_text(production.astext() + '\n')
-        self.end_state(wrap=False)
-        raise nodes.SkipNode
-
-    def visit_seealso(self, node):
-        self.new_state()
-    def depart_seealso(self, node):
-        self.end_state(first='')
-
-    def visit_footnote(self, node):
-        self._footnote = node.children[0].astext().strip()
-        self.new_state(len(self._footnote) + 3)
-    def depart_footnote(self, node):
-        self.end_state(first='[%s] ' % self._footnote)
-
-    def visit_citation(self, node):
-        if len(node) and isinstance(node[0], nodes.label):
-            self._citlabel = node[0].astext()
-        else:
-            self._citlabel = ''
-        self.new_state(len(self._citlabel) + 3)
-    def depart_citation(self, node):
-        self.end_state(first='[%s] ' % self._citlabel)
-
-    def visit_label(self, node):
-        raise nodes.SkipNode
-
-    # XXX: option list could use some better styling
-
-    def visit_option_list(self, node):
-        pass
-    def depart_option_list(self, node):
-        pass
-
-    def visit_option_list_item(self, node):
-        self.new_state(0)
-    def depart_option_list_item(self, node):
-        self.end_state()
-
-    def visit_option_group(self, node):
-        self._firstoption = True
-    def depart_option_group(self, node):
-        self.add_text('     ')
-
-    def visit_option(self, node):
-        if self._firstoption:
-            self._firstoption = False
-        else:
-            self.add_text(', ')
-    def depart_option(self, node):
-        pass
-
-    def visit_option_string(self, node):
-        pass
-    def depart_option_string(self, node):
-        pass
-
-    def visit_option_argument(self, node):
-        self.add_text(node['delimiter'])
-    def depart_option_argument(self, node):
-        pass
-
-    def visit_description(self, node):
-        pass
-    def depart_description(self, node):
-        pass
-
-    def visit_tabular_col_spec(self, node):
-        raise nodes.SkipNode
-
-    def visit_colspec(self, node):
-        self.table[0].append(node['colwidth'])
-        raise nodes.SkipNode
-
-    def visit_tgroup(self, node):
-        pass
-    def depart_tgroup(self, node):
-        pass
-
-    def visit_thead(self, node):
-        pass
-    def depart_thead(self, node):
-        pass
-
-    def visit_tbody(self, node):
-        self.table.append('sep')
-    def depart_tbody(self, node):
-        pass
-
-    def visit_row(self, node):
-        self.table.append([])
-    def depart_row(self, node):
-        pass
-
-    def visit_entry(self, node):
-        if node.has_key('morerows') or node.has_key('morecols'):
-            raise NotImplementedError('Column or row spanning cells are '
-                                      'not implemented.')
-        self.new_state(0)
-    def depart_entry(self, node):
-        text = '\n'.join('\n'.join(x[1]) for x in self.states.pop())
-        self.stateindent.pop()
-        self.table[-1].append(text)
-
-    def visit_table(self, node):
-        if self.table:
-            raise NotImplementedError('Nested tables are not supported.')
-        self.new_state(0)
-        self.table = [[]]
-    def depart_table(self, node):
-        lines = self.table[1:]
-        fmted_rows = []
-        colwidths = self.table[0]
-        realwidths = colwidths[:]
-        separator = 0
-        # don't allow paragraphs in table cells for now
-        for line in lines:
-            if line == 'sep':
-                separator = len(fmted_rows)
-            else:
-                cells = []
-                for i, cell in enumerate(line):
-                    par = textwrap.wrap(cell, width=colwidths[i])
-                    if par:
-                        maxwidth = max(map(len, par))
-                    else:
-                        maxwidth = 0
-                    realwidths[i] = max(realwidths[i], maxwidth)
-                    cells.append(par)
-                fmted_rows.append(cells)
-
-        def writesep(char='-'):
-            out = ['+']
-            for width in realwidths:
-                out.append(char * (width+2))
-                out.append('+')
-            self.add_text(''.join(out) + '\n')
-
-        def writerow(row):
-            lines = map(None, *row)
-            for line in lines:
-                out = ['|']
-                for i, cell in enumerate(line):
-                    if cell:
-                        out.append(' ' + cell.ljust(realwidths[i]+1))
-                    else:
-                        out.append(' ' * (realwidths[i] + 2))
-                    out.append('|')
-                self.add_text(''.join(out) + '\n')
-
-        for i, row in enumerate(fmted_rows):
-            if separator and i == separator:
-                writesep('=')
-            else:
-                writesep('-')
-            writerow(row)
-        writesep('-')
-        self.table = None
-        self.end_state(wrap=False)
-
-    def visit_acks(self, node):
-        self.new_state(0)
-        self.add_text(', '.join(n.astext() for n in node.children[0].children) + '.')
-        self.end_state()
-        raise nodes.SkipNode
-
-    def visit_image(self, node):
-        self.add_text(_('[image]'))
-        raise nodes.SkipNode
-
-    def visit_transition(self, node):
-        indent = sum(self.stateindent)
-        self.new_state(0)
-        self.add_text('=' * (MAXWIDTH - indent))
-        self.end_state()
-        raise nodes.SkipNode
-
-    def visit_bullet_list(self, node):
-        self._list_counter = -1
-    def depart_bullet_list(self, node):
-        pass
-
-    def visit_enumerated_list(self, node):
-        self._list_counter = 0
-    def depart_enumerated_list(self, node):
-        pass
-
-    def visit_definition_list(self, node):
-        self._list_counter = -2
-    def depart_definition_list(self, node):
-        pass
-
-    def visit_list_item(self, node):
-        if self._list_counter == -1:
-            # bullet list
-            self.new_state(2)
-        elif self._list_counter == -2:
-            # definition list
-            pass
-        else:
-            # enumerated list
-            self._list_counter += 1
-            self.new_state(len(str(self._list_counter)) + 2)
-    def depart_list_item(self, node):
-        if self._list_counter == -1:
-            self.end_state(first='* ', end=None)
-        elif self._list_counter == -2:
-            pass
-        else:
-            self.end_state(first='%s. ' % self._list_counter, end=None)
-
-    def visit_definition_list_item(self, node):
-        self._li_has_classifier = len(node) >= 2 and \
-                                  isinstance(node[1], nodes.classifier)
-    def depart_definition_list_item(self, node):
-        pass
-
-    def visit_term(self, node):
-        self.new_state(0)
-    def depart_term(self, node):
-        if not self._li_has_classifier:
-            self.end_state(end=None)
-
-    def visit_classifier(self, node):
-        self.add_text(' : ')
-    def depart_classifier(self, node):
-        self.end_state(end=None)
-
-    def visit_definition(self, node):
-        self.new_state()
-    def depart_definition(self, node):
-        self.end_state()
-
-    def visit_field_list(self, node):
-        pass
-    def depart_field_list(self, node):
-        pass
-
-    def visit_field(self, node):
-        pass
-    def depart_field(self, node):
-        pass
-
-    def visit_field_name(self, node):
-        self.new_state(0)
-    def depart_field_name(self, node):
-        self.add_text(':')
-        self.end_state(end=None)
-
-    def visit_field_body(self, node):
-        self.new_state()
-    def depart_field_body(self, node):
-        self.end_state()
-
-    def visit_centered(self, node):
-        pass
-    def depart_centered(self, node):
-        pass
-
-    def visit_admonition(self, node):
-        self.new_state(0)
-    def depart_admonition(self, node):
-        self.end_state()
-
-    def _visit_admonition(self, node):
-        self.new_state(2)
-    def _make_depart_admonition(name):
-        def depart_admonition(self, node):
-            self.end_state(first=admonitionlabels[name] + ': ')
-        return depart_admonition
-
-    visit_attention = _visit_admonition
-    depart_attention = _make_depart_admonition('attention')
-    visit_caution = _visit_admonition
-    depart_caution = _make_depart_admonition('caution')
-    visit_danger = _visit_admonition
-    depart_danger = _make_depart_admonition('danger')
-    visit_error = _visit_admonition
-    depart_error = _make_depart_admonition('error')
-    visit_hint = _visit_admonition
-    depart_hint = _make_depart_admonition('hint')
-    visit_important = _visit_admonition
-    depart_important = _make_depart_admonition('important')
-    visit_note = _visit_admonition
-    depart_note = _make_depart_admonition('note')
-    visit_tip = _visit_admonition
-    depart_tip = _make_depart_admonition('tip')
-    visit_warning = _visit_admonition
-    depart_warning = _make_depart_admonition('warning')
-
-    def visit_versionmodified(self, node):
-        self.new_state(0)
-        if node.children:
-            self.add_text(versionlabels[node['type']] % node['version'] + ': ')
-        else:
-            self.add_text(versionlabels[node['type']] % node['version'] + '.')
-    def depart_versionmodified(self, node):
-        self.end_state()
-
-    def visit_literal_block(self, node):
-        self.new_state()
-    def depart_literal_block(self, node):
-        self.end_state(wrap=False)
-
-    def visit_doctest_block(self, node):
-        self.new_state(0)
-    def depart_doctest_block(self, node):
-        self.end_state(wrap=False)
-
-    def visit_line_block(self, node):
-        self.new_state(0)
-    def depart_line_block(self, node):
-        self.end_state(wrap=False)
-
-    def visit_line(self, node):
-        pass
-    def depart_line(self, node):
-        pass
-
-    def visit_block_quote(self, node):
-        self.new_state()
-    def depart_block_quote(self, node):
-        self.end_state()
-
-    def visit_compact_paragraph(self, node):
-        pass
-    def depart_compact_paragraph(self, node):
-        pass
-
-    def visit_paragraph(self, node):
-        if not isinstance(node.parent, nodes.Admonition) or \
-               isinstance(node.parent, addnodes.seealso):
-            self.new_state(0)
-    def depart_paragraph(self, node):
-        if not isinstance(node.parent, nodes.Admonition) or \
-               isinstance(node.parent, addnodes.seealso):
-            self.end_state()
-
-    def visit_target(self, node):
-        raise nodes.SkipNode
-
-    def visit_index(self, node):
-        raise nodes.SkipNode
-
-    def visit_substitution_definition(self, node):
-        raise nodes.SkipNode
-
-    def visit_pending_xref(self, node):
-        pass
-    def depart_pending_xref(self, node):
-        pass
-
-    def visit_reference(self, node):
-        pass
-    def depart_reference(self, node):
-        pass
-
-    def visit_emphasis(self, node):
-        self.add_text('*')
-    def depart_emphasis(self, node):
-        self.add_text('*')
-
-    def visit_literal_emphasis(self, node):
-        self.add_text('*')
-    def depart_literal_emphasis(self, node):
-        self.add_text('*')
-
-    def visit_strong(self, node):
-        self.add_text('**')
-    def depart_strong(self, node):
-        self.add_text('**')
-
-    def visit_title_reference(self, node):
-        self.add_text('*')
-    def depart_title_reference(self, node):
-        self.add_text('*')
-
-    def visit_literal(self, node):
-        self.add_text('``')
-    def depart_literal(self, node):
-        self.add_text('``')
-
-    def visit_subscript(self, node):
-        self.add_text('_')
-    def depart_subscript(self, node):
-        pass
-
-    def visit_superscript(self, node):
-        self.add_text('^')
-    def depart_superscript(self, node):
-        pass
-
-    def visit_footnote_reference(self, node):
-        self.add_text('[%s]' % node.astext())
-        raise nodes.SkipNode
-
-    def visit_citation_reference(self, node):
-        self.add_text('[%s]' % node.astext())
-        raise nodes.SkipNode
-
-    def visit_Text(self, node):
-        self.add_text(node.astext())
-    def depart_Text(self, node):
-        pass
-
-    def visit_problematic(self, node):
-        self.add_text('>>')
-    def depart_problematic(self, node):
-        self.add_text('<<')
-
-    def visit_system_message(self, node):
-        self.new_state(0)
-        self.add_text('<SYSTEM MESSAGE: %s>' % node.astext())
-        self.end_state()
-        raise nodes.SkipNode
-
-    def visit_comment(self, node):
-        raise nodes.SkipNode
-
-    def visit_meta(self, node):
-        # only valid for HTML
-        raise nodes.SkipNode
-
-    def unknown_visit(self, node):
-        raise NotImplementedError('Unknown node: ' + node.__class__.__name__)
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,284 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.util
-    ~~~~~~~~~~~
-
-    Utility functions for Sphinx.
-
-    :copyright: 2007-2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import os
-import re
-import sys
-import time
-import fnmatch
-import tempfile
-import traceback
-from os import path
-
-
-# Generally useful regular expressions.
-ws_re = re.compile(r'\s+')
-caption_ref_re = re.compile(r'^([^<]+?)\s*<(.+)>$')
-
-
-# SEP separates path elements in the canonical file names
-#
-# Define SEP as a manifest constant, not so much because we expect it to change
-# in the future as to avoid the suspicion that a stray "/" in the code is a
-# hangover from more *nix-oriented origins.
-SEP = "/"
-
-def os_path(canonicalpath):
-    return canonicalpath.replace(SEP, os.path.sep)
-
-
-def relative_uri(base, to):
-    """Return a relative URL from ``base`` to ``to``."""
-    b2 = base.split(SEP)
-    t2 = to.split(SEP)
-    # remove common segments
-    for x, y in zip(b2, t2):
-        if x != y:
-            break
-        b2.pop(0)
-        t2.pop(0)
-    return ('..' + SEP) * (len(b2)-1) + SEP.join(t2)
-
-
-def ensuredir(path):
-    """Ensure that a path exists."""
-    try:
-        os.makedirs(path)
-    except OSError, err:
-        if not err.errno == 17:
-            raise
-
-
-def walk(top, topdown=True, followlinks=False):
-    """
-    Backport of os.walk from 2.6, where the followlinks argument was added.
-    """
-    names = os.listdir(top)
-
-    dirs, nondirs = [], []
-    for name in names:
-        if path.isdir(path.join(top, name)):
-            dirs.append(name)
-        else:
-            nondirs.append(name)
-
-    if topdown:
-        yield top, dirs, nondirs
-    for name in dirs:
-        fullpath = path.join(top, name)
-        if followlinks or not path.islink(fullpath):
-            for x in walk(fullpath, topdown, followlinks):
-                yield x
-    if not topdown:
-        yield top, dirs, nondirs
-
-
-def get_matching_docs(dirname, suffix, exclude_docs=(), exclude_dirs=(),
-                      exclude_trees=(), exclude_dirnames=()):
-    """
-    Get all file names (without suffix) matching a suffix in a
-    directory, recursively.
-
-    Exclude docs in *exclude_docs*, exclude dirs in *exclude_dirs*,
-    prune dirs in *exclude_trees*, prune dirnames in *exclude_dirnames*.
-    """
-    pattern = '*' + suffix
-    # dirname is a normalized absolute path.
-    dirname = path.normpath(path.abspath(dirname))
-    dirlen = len(dirname) + 1    # exclude slash
-    for root, dirs, files in walk(dirname, followlinks=True):
-        if root[dirlen:] in exclude_dirs:
-            continue
-        if root[dirlen:] in exclude_trees:
-            del dirs[:]
-            continue
-        dirs.sort()
-        files.sort()
-        for prunedir in exclude_dirnames:
-            if prunedir in dirs:
-                dirs.remove(prunedir)
-        for sfile in files:
-            if not fnmatch.fnmatch(sfile, pattern):
-                continue
-            qualified_name = path.join(root[dirlen:], sfile[:-len(suffix)])
-            qualified_name = qualified_name.replace(os.path.sep, SEP)
-            if qualified_name in exclude_docs:
-                continue
-            yield qualified_name
-
-
-def mtimes_of_files(dirnames, suffix):
-    for dirname in dirnames:
-        for root, dirs, files in os.walk(dirname):
-            for sfile in files:
-                if sfile.endswith(suffix):
-                    try:
-                        yield path.getmtime(path.join(root, sfile))
-                    except EnvironmentError:
-                        pass
-
-
-def shorten_result(text='', keywords=[], maxlen=240, fuzz=60):
-    if not text:
-        text = ''
-    text_low = text.lower()
-    beg = -1
-    for k in keywords:
-        i = text_low.find(k.lower())
-        if (i > -1 and i < beg) or beg == -1:
-            beg = i
-    excerpt_beg = 0
-    if beg > fuzz:
-        for sep in ('.', ':', ';', '='):
-            eb = text.find(sep, beg - fuzz, beg - 1)
-            if eb > -1:
-                eb += 1
-                break
-        else:
-            eb = beg - fuzz
-        excerpt_beg = eb
-    if excerpt_beg < 0:
-        excerpt_beg = 0
-    msg = text[excerpt_beg:beg+maxlen]
-    if beg > fuzz:
-        msg = '... ' + msg
-    if beg < len(text)-maxlen:
-        msg = msg + ' ...'
-    return msg
-
-
-class attrdict(dict):
-    def __getattr__(self, key):
-        return self[key]
-    def __setattr__(self, key, val):
-        self[key] = val
-    def __delattr__(self, key):
-        del self[key]
-
-
-def fmt_ex(ex):
-    """Format a single line with an exception description."""
-    return traceback.format_exception_only(ex.__class__, ex)[-1].strip()
-
-
-def rpartition(s, t):
-    """Similar to str.rpartition from 2.5, but doesn't return the separator."""
-    i = s.rfind(t)
-    if i != -1:
-        return s[:i], s[i+len(t):]
-    return '', s
-
-
-def format_exception_cut_frames(x=1):
-    """
-    Format an exception with traceback, but only the last x frames.
-    """
-    typ, val, tb = sys.exc_info()
-    #res = ['Traceback (most recent call last):\n']
-    res = []
-    tbres = traceback.format_tb(tb)
-    res += tbres[-x:]
-    res += traceback.format_exception_only(typ, val)
-    return ''.join(res)
-
-
-def save_traceback():
-    """
-    Save the current exception's traceback in a temporary file.
-    """
-    exc = traceback.format_exc()
-    fd, path = tempfile.mkstemp('.log', 'sphinx-err-')
-    os.write(fd, exc)
-    os.close(fd)
-    return path
-
-
-def _translate_pattern(pat):
-    """
-    Translate a shell-style glob pattern to a regular expression.
-
-    Adapted from the fnmatch module, but enhanced so that single stars don't
-    match slashes.
-    """
-    i, n = 0, len(pat)
-    res = ''
-    while i < n:
-        c = pat[i]
-        i += 1
-        if c == '*':
-            if i < n and pat[i] == '*':
-                # double star matches slashes too
-                i += 1
-                res = res + '.*'
-            else:
-                # single star doesn't match slashes
-                res = res + '[^/]*'
-        elif c == '?':
-            # question mark doesn't match slashes too
-            res = res + '[^/]'
-        elif c == '[':
-            j = i
-            if j < n and pat[j] == '!':
-                j += 1
-            if j < n and pat[j] == ']':
-                j += 1
-            while j < n and pat[j] != ']':
-                j += 1
-            if j >= n:
-                res = res + '\\['
-            else:
-                stuff = pat[i:j].replace('\\', '\\\\')
-                i = j + 1
-                if stuff[0] == '!':
-                    # negative pattern mustn't match slashes too
-                    stuff = '^/' + stuff[1:]
-                elif stuff[0] == '^':
-                    stuff = '\\' + stuff
-                res = '%s[%s]' % (res, stuff)
-        else:
-            res += re.escape(c)
-    return res + '$'
-
-
-_pat_cache = {}
-
-def patfilter(names, pat):
-    """
-    Return the subset of the list NAMES that match PAT.
-    Adapted from fnmatch module.
-    """
-    result = []
-    if pat not in _pat_cache:
-        _pat_cache[pat] = re.compile(_translate_pattern(pat))
-    match = _pat_cache[pat].match
-    return filter(match, names)
-
-
-no_fn_re = re.compile(r'[^a-zA-Z0-9_-]')
-
-def make_filename(string):
-    return no_fn_re.sub('', string)
-
-
-def nested_parse_with_titles(state, content, node):
-    # hack around title style bookkeeping
-    surrounding_title_styles = state.memo.title_styles
-    surrounding_section_level = state.memo.section_level
-    state.memo.title_styles = []
-    state.memo.section_level = 0
-    state.nested_parse(content, 0, node, match_titles=1)
-    state.memo.title_styles = surrounding_title_styles
-    state.memo.section_level = surrounding_section_level
-
-
-def ustrftime(format, *args):
-    # strftime for unicode strings
-    return time.strftime(unicode(format).encode('utf-8'), *args).decode('utf-8')
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/compat.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.util.compat
-    ~~~~~~~~~~~~~~~~~~
-
-    Stuff for docutils compatibility.
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-from docutils import nodes
-
-
-# function missing in 0.5 SVN
-def make_admonition(node_class, name, arguments, options, content, lineno,
-                    content_offset, block_text, state, state_machine):
-    #if not content:
-    #    error = state_machine.reporter.error(
-    #        'The "%s" admonition is empty; content required.' % (name),
-    #        nodes.literal_block(block_text, block_text), line=lineno)
-    #    return [error]
-    text = '\n'.join(content)
-    admonition_node = node_class(text)
-    if arguments:
-        title_text = arguments[0]
-        textnodes, messages = state.inline_text(title_text, lineno)
-        admonition_node += nodes.title(title_text, '', *textnodes)
-        admonition_node += messages
-        if options.has_key('class'):
-            classes = options['class']
-        else:
-            classes = ['admonition-' + nodes.make_id(title_text)]
-        admonition_node['classes'] += classes
-    state.nested_parse(content, content_offset, admonition_node)
-    return [admonition_node]
-
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/console.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.util.console
-    ~~~~~~~~~~~~~~~~~~~
-
-    Format colored console output.
-
-    :copyright: 2007-2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import os
-
-codes = {}
-
-def get_terminal_width():
-    """Borrowed from the py lib."""
-    try:
-        import os, termios, fcntl, struct
-        call = fcntl.ioctl(0, termios.TIOCGWINSZ, "\000"*8)
-        height, width = struct.unpack("hhhh", call)[:2]
-        terminal_width = width
-    except (SystemExit, KeyboardInterrupt):
-        raise
-    except:
-        # FALLBACK
-        terminal_width = int(os.environ.get('COLUMNS', 80))-1
-    return terminal_width
-
-_tw = get_terminal_width()
-
-def print_and_backspace(text, func):
-    if not codes:
-        # if no coloring, don't output fancy backspaces
-        func(text)
-    else:
-        func(text.ljust(_tw) + _tw * "\b")
-
-def color_terminal():
-    if 'COLORTERM' in os.environ:
-        return True
-    term = os.environ.get('TERM', 'dumb').lower()
-    if 'xterm' in term or 'color' in term:
-        return True
-    return False
-
-
-def nocolor():
-    codes.clear()
-
-def coloron():
-    codes.update(_orig_codes)
-
-def colorize(name, text):
-    return codes.get(name, '') + text + codes.get('reset', '')
-
-def create_color_func(name):
-    def inner(text):
-        return colorize(name, text)
-    globals()[name] = inner
-
-_attrs = {
-    'reset':     '39;49;00m',
-    'bold':      '01m',
-    'faint':     '02m',
-    'standout':  '03m',
-    'underline': '04m',
-    'blink':     '05m',
-}
-
-for _name, _value in _attrs.items():
-    codes[_name] = '\x1b[' + _value
-
-_colors = [
-    ('black',     'darkgray'),
-    ('darkred',   'red'),
-    ('darkgreen', 'green'),
-    ('brown',     'yellow'),
-    ('darkblue',  'blue'),
-    ('purple',    'fuchsia'),
-    ('turquoise', 'teal'),
-    ('lightgray', 'white'),
-]
-
-for i, (dark, light) in enumerate(_colors):
-    codes[dark] = '\x1b[%im' % (i+30)
-    codes[light] = '\x1b[%i;01m' % (i+30)
-
-_orig_codes = codes.copy()
-
-for _name in codes:
-    create_color_func(_name)
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/jsdump.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,193 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.util.jsdump
-    ~~~~~~~~~~~~~~~~~~
-
-    This module implements a simple JavaScript serializer.
-    Uses the basestring encode function from simplejson.
-
-    :copyright: 2008 by Armin Ronacher, Bob Ippolito, Georg Brandl.
-    :license: BSD.
-"""
-
-import re
-
-_str_re  = re.compile(r'"(\\\\|\\"|[^"])*"')
-_int_re  = re.compile(r'\d+')
-_name_re = re.compile(r'[a-zA-Z]\w*')
-_nameonly_re = re.compile(r'[a-zA-Z]\w*$')
-
-# escape \, ", control characters and everything outside ASCII
-ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])')
-ESCAPE_DICT = {
-    '\\': '\\\\',
-    '"': '\\"',
-    '\b': '\\b',
-    '\f': '\\f',
-    '\n': '\\n',
-    '\r': '\\r',
-    '\t': '\\t',
-}
-
-ESCAPED = re.compile(r'\\u.{4}|\\.')
-
-
-def encode_string(s):
-    def replace(match):
-        s = match.group(0)
-        try:
-            return ESCAPE_DICT[s]
-        except KeyError:
-            n = ord(s)
-            if n < 0x10000:
-                return '\\u%04x' % (n,)
-            else:
-                # surrogate pair
-                n -= 0x10000
-                s1 = 0xd800 | ((n >> 10) & 0x3ff)
-                s2 = 0xdc00 | (n & 0x3ff)
-                return '\\u%04x\\u%04x' % (s1, s2)
-    return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"'
-
-def decode_string(s):
-    return ESCAPED.sub(lambda m: eval('u"'+m.group()+'"'), s)
-
-
-reswords = set("""\
-abstract   else   instanceof   switch
-boolean   enum   int   synchronized
-break   export   interface   this
-byte   extends   long   throw
-case   false   native   throws
-catch   final   new   transient
-char   finally   null   true
-class   float   package   try
-const   for   private   typeof
-continue   function   protected   var
-debugger   goto   public   void
-default   if   return   volatile
-delete   implements   short   while
-do   import   static   with
-double   in   super""".split())
-
-def dumps(obj, key=False):
-    if key:
-        if not isinstance(obj, basestring):
-            obj = str(obj)
-        if _nameonly_re.match(obj) and obj not in reswords:
-            return obj  # return it as a bare word
-        else:
-            return encode_string(obj)
-    if obj is None:
-        return 'null'
-    elif obj is True or obj is False:
-        return obj and 'true' or 'false'
-    elif isinstance(obj, (int, long, float)):
-        return str(obj)
-    elif isinstance(obj, dict):
-        return '{%s}' % ','.join('%s:%s' % (
-            dumps(key, True),
-            dumps(value)
-        ) for key, value in obj.iteritems())
-    elif isinstance(obj, (tuple, list, set)):
-        return '[%s]' % ','.join(dumps(x) for x in obj)
-    elif isinstance(obj, basestring):
-        return encode_string(obj)
-    raise TypeError(type(obj))
-
-def dump(obj, f):
-    f.write(dumps(obj))
-
-
-def loads(x):
-    """Loader that can read the JS subset the indexer produces."""
-    nothing = object()
-    i = 0
-    n = len(x)
-    stack = []
-    obj = nothing
-    key = False
-    keys = []
-    while i < n:
-        c = x[i]
-        if c == '{':
-            obj = {}
-            stack.append(obj)
-            key = True
-            keys.append(nothing)
-            i += 1
-        elif c == '[':
-            obj = []
-            stack.append(obj)
-            key = False
-            keys.append(nothing)
-            i += 1
-        elif c in '}]':
-            if key:
-                if keys[-1] is not nothing:
-                    raise ValueError("unfinished dict")
-                # empty dict
-                key = False
-            oldobj = stack.pop()
-            keys.pop()
-            if stack:
-                obj = stack[-1]
-                if isinstance(obj, dict):
-                    if keys[-1] is nothing:
-                        raise ValueError("invalid key object", oldobj)
-                    obj[keys[-1]] = oldobj
-                else:
-                    obj.append(oldobj)
-            else:
-                break
-            i += 1
-        elif c == ',':
-            if key:
-                raise ValueError("multiple keys")
-            if isinstance(obj, dict):
-                key = True
-            i += 1
-        elif c == ':':
-            if not isinstance(obj, dict):
-                raise ValueError("colon in list")
-            i += 1
-            if not key:
-                raise ValueError("multiple values")
-            key = False
-        else:
-            m = _str_re.match(x, i)
-            if m:
-                y = decode_string(m.group()[1:-1])
-            else:
-                m = _int_re.match(x, i)
-                if m:
-                    y = int(m.group())
-                else:
-                    m = _name_re.match(x, i)
-                    if m:
-                        y = m.group()
-                        if y == 'true':
-                            y = True
-                        elif y == 'false':
-                            y = False
-                        elif y == 'null':
-                            y = None
-                        elif not key:
-                            raise ValueError("bareword as value")
-                    else:
-                        raise ValueError("read error at pos %d" % i)
-            i = m.end()
-            if isinstance(obj, dict):
-                if key:
-                    keys[-1] = y
-                else:
-                    obj[keys[-1]] = y
-                    key = False
-            else:
-                obj.append(y)
-    if obj is nothing:
-        raise ValueError("nothing loaded from string")
-    return obj
-
-def load(f):
-    return loads(f.read())
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/png.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.util.png
-    ~~~~~~~~~~~~~~~
-
-    PNG image manipulation helpers.
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import struct
-import binascii
-
-LEN_IEND = 12
-LEN_DEPTH = 22
-
-DEPTH_CHUNK_LEN = struct.pack('!i', 10)
-DEPTH_CHUNK_START = 'tEXtDepth\x00'
-IEND_CHUNK = '\x00\x00\x00\x00IEND\xAE\x42\x60\x82'
-
-
-def read_png_depth(filename):
-    """
-    Read the special tEXt chunk indicating the depth from a PNG file.
-    """
-    result = None
-    f = open(filename, 'rb')
-    try:
-        f.seek(- (LEN_IEND + LEN_DEPTH), 2)
-        depthchunk = f.read(LEN_DEPTH)
-        if not depthchunk.startswith(DEPTH_CHUNK_LEN + DEPTH_CHUNK_START):
-            # either not a PNG file or not containing the depth chunk
-            return None
-        result = struct.unpack('!i', depthchunk[14:18])[0]
-    finally:
-        f.close()
-    return result
-
-
-def write_png_depth(filename, depth):
-    """
-    Write the special tEXt chunk indicating the depth to a PNG file.
-    The chunk is placed immediately before the special IEND chunk.
-    """
-    data = struct.pack('!i', depth)
-    f = open(filename, 'r+b')
-    try:
-        # seek to the beginning of the IEND chunk
-        f.seek(-LEN_IEND, 2)
-        # overwrite it with the depth chunk
-        f.write(DEPTH_CHUNK_LEN + DEPTH_CHUNK_START + data)
-        # calculate the checksum over chunk name and data
-        f.write(struct.pack('!i', binascii.crc32(DEPTH_CHUNK_START + data)))
-        # replace the IEND chunk
-        f.write(IEND_CHUNK)
-    finally:
-        f.close()
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/smartypants.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,303 +0,0 @@
-r"""
-This is based on SmartyPants.py by `Chad Miller`_.
-
-Copyright and License
-=====================
-
-SmartyPants_ license::
-
-    Copyright (c) 2003 John Gruber
-    (http://daringfireball.net/)
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are
-    met:
-
-    *   Redistributions of source code must retain the above copyright
-        notice, this list of conditions and the following disclaimer.
-
-    *   Redistributions in binary form must reproduce the above copyright
-        notice, this list of conditions and the following disclaimer in
-        the documentation and/or other materials provided with the
-        distribution.
-
-    *   Neither the name "SmartyPants" nor the names of its contributors
-        may be used to endorse or promote products derived from this
-        software without specific prior written permission.
-
-    This software is provided by the copyright holders and contributors "as
-    is" and any express or implied warranties, including, but not limited
-    to, the implied warranties of merchantability and fitness for a
-    particular purpose are disclaimed. In no event shall the copyright
-    owner or contributors be liable for any direct, indirect, incidental,
-    special, exemplary, or consequential damages (including, but not
-    limited to, procurement of substitute goods or services; loss of use,
-    data, or profits; or business interruption) however caused and on any
-    theory of liability, whether in contract, strict liability, or tort
-    (including negligence or otherwise) arising in any way out of the use
-    of this software, even if advised of the possibility of such damage.
-
-
-smartypants.py license::
-
-    smartypants.py is a derivative work of SmartyPants.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are
-    met:
-
-    *   Redistributions of source code must retain the above copyright
-        notice, this list of conditions and the following disclaimer.
-
-    *   Redistributions in binary form must reproduce the above copyright
-        notice, this list of conditions and the following disclaimer in
-        the documentation and/or other materials provided with the
-        distribution.
-
-    This software is provided by the copyright holders and contributors "as
-    is" and any express or implied warranties, including, but not limited
-    to, the implied warranties of merchantability and fitness for a
-    particular purpose are disclaimed. In no event shall the copyright
-    owner or contributors be liable for any direct, indirect, incidental,
-    special, exemplary, or consequential damages (including, but not
-    limited to, procurement of substitute goods or services; loss of use,
-    data, or profits; or business interruption) however caused and on any
-    theory of liability, whether in contract, strict liability, or tort
-    (including negligence or otherwise) arising in any way out of the use
-    of this software, even if advised of the possibility of such damage.
-
-.. _Chad Miller: http://web.chad.org/
-"""
-
-import re
-
-
-def sphinx_smarty_pants(t):
-    t = t.replace('&quot;', '"')
-    t = educateDashesOldSchool(t)
-    t = educateQuotes(t)
-    t = t.replace('"', '&quot;')
-    return t
-
-# Constants for quote education.
-
-punct_class = r"""[!"#\$\%'()*+,-.\/:;<=>?\@\[\\\]\^_`{|}~]"""
-close_class = r"""[^\ \t\r\n\[\{\(\-]"""
-dec_dashes = r"""&#8211;|&#8212;"""
-
-# Special case if the very first character is a quote
-# followed by punctuation at a non-word-break. Close the quotes by brute force:
-single_quote_start_re = re.compile(r"""^'(?=%s\\B)""" % (punct_class,))
-double_quote_start_re = re.compile(r"""^"(?=%s\\B)""" % (punct_class,))
-
-# Special case for double sets of quotes, e.g.:
-#   <p>He said, "'Quoted' words in a larger quote."</p>
-double_quote_sets_re = re.compile(r""""'(?=\w)""")
-single_quote_sets_re = re.compile(r"""'"(?=\w)""")
-
-# Special case for decade abbreviations (the '80s):
-decade_abbr_re = re.compile(r"""\b'(?=\d{2}s)""")
-
-# Get most opening double quotes:
-opening_double_quotes_regex = re.compile(r"""
-                (
-                        \s          |   # a whitespace char, or
-                        &nbsp;      |   # a non-breaking space entity, or
-                        --          |   # dashes, or
-                        &[mn]dash;  |   # named dash entities
-                        %s          |   # or decimal entities
-                        &\#x201[34];    # or hex
-                )
-                "                 # the quote
-                (?=\w)            # followed by a word character
-                """ % (dec_dashes,), re.VERBOSE)
-
-# Double closing quotes:
-closing_double_quotes_regex = re.compile(r"""
-                #(%s)?   # character that indicates the quote should be closing
-                "
-                (?=\s)
-                """ % (close_class,), re.VERBOSE)
-
-closing_double_quotes_regex_2 = re.compile(r"""
-                (%s)   # character that indicates the quote should be closing
-                "
-                """ % (close_class,), re.VERBOSE)
-
-# Get most opening single quotes:
-opening_single_quotes_regex = re.compile(r"""
-                (
-                        \s          |   # a whitespace char, or
-                        &nbsp;      |   # a non-breaking space entity, or
-                        --          |   # dashes, or
-                        &[mn]dash;  |   # named dash entities
-                        %s          |   # or decimal entities
-                        &\#x201[34];    # or hex
-                )
-                '                 # the quote
-                (?=\w)            # followed by a word character
-                """ % (dec_dashes,), re.VERBOSE)
-
-closing_single_quotes_regex = re.compile(r"""
-                (%s)
-                '
-                (?!\s | s\b | \d)
-                """ % (close_class,), re.VERBOSE)
-
-closing_single_quotes_regex_2 = re.compile(r"""
-                (%s)
-                '
-                (\s | s\b)
-                """ % (close_class,), re.VERBOSE)
-
-def educateQuotes(s):
-    """
-    Parameter:  String.
-
-    Returns:    The string, with "educated" curly quote HTML entities.
-
-    Example input:  "Isn't this fun?"
-    Example output: &#8220;Isn&#8217;t this fun?&#8221;
-    """
-
-    # Special case if the very first character is a quote
-    # followed by punctuation at a non-word-break. Close the quotes by brute force:
-    s = single_quote_start_re.sub("&#8217;", s)
-    s = double_quote_start_re.sub("&#8221;", s)
-
-    # Special case for double sets of quotes, e.g.:
-    #   <p>He said, "'Quoted' words in a larger quote."</p>
-    s = double_quote_sets_re.sub("&#8220;&#8216;", s)
-    s = single_quote_sets_re.sub("&#8216;&#8220;", s)
-
-    # Special case for decade abbreviations (the '80s):
-    s = decade_abbr_re.sub("&#8217;", s)
-
-    s = opening_single_quotes_regex.sub(r"\1&#8216;", s)
-    s = closing_single_quotes_regex.sub(r"\1&#8217;", s)
-    s = closing_single_quotes_regex_2.sub(r"\1&#8217;\2", s)
-
-    # Any remaining single quotes should be opening ones:
-    s = s.replace("'", "&#8216;")
-
-    s = opening_double_quotes_regex.sub(r"\1&#8220;", s)
-    s = closing_double_quotes_regex.sub(r"&#8221;", s)
-    s = closing_double_quotes_regex_2.sub(r"\1&#8221;", s)
-
-    # Any remaining quotes should be opening ones.
-    return s.replace('"', "&#8220;")
-
-
-def educateQuotesLatex(s, dquotes=("``", "''")):
-    """
-    Parameter:  String.
-
-    Returns:    The string, with double quotes corrected to LaTeX quotes.
-
-    Example input:  "Isn't this fun?"
-    Example output: ``Isn't this fun?'';
-    """
-
-    # Special case if the very first character is a quote
-    # followed by punctuation at a non-word-break. Close the quotes by brute force:
-    s = single_quote_start_re.sub("\x04", s)
-    s = double_quote_start_re.sub("\x02", s)
-
-    # Special case for double sets of quotes, e.g.:
-    #   <p>He said, "'Quoted' words in a larger quote."</p>
-    s = double_quote_sets_re.sub("\x01\x03", s)
-    s = single_quote_sets_re.sub("\x03\x01", s)
-
-    # Special case for decade abbreviations (the '80s):
-    s = decade_abbr_re.sub("\x04", s)
-
-    s = opening_single_quotes_regex.sub("\\1\x03", s)
-    s = closing_single_quotes_regex.sub("\\1\x04", s)
-    s = closing_single_quotes_regex_2.sub("\\1\x04\\2", s)
-
-    # Any remaining single quotes should be opening ones:
-    s = s.replace("'", "\x03")
-
-    s = opening_double_quotes_regex.sub("\\1\x01", s)
-    s = closing_double_quotes_regex.sub("\x02", s)
-    s = closing_double_quotes_regex_2.sub("\\1\x02", s)
-
-    # Any remaining quotes should be opening ones.
-    s = s.replace('"', "\x01")
-
-    # Finally, replace all helpers with quotes.
-    return s.replace("\x01", dquotes[0]).replace("\x02", dquotes[1]).\
-           replace("\x03", "`").replace("\x04", "'")
-
-
-def educateBackticks(s):
-    """
-    Parameter:  String.
-    Returns:    The string, with ``backticks'' -style double quotes
-        translated into HTML curly quote entities.
-    Example input:  ``Isn't this fun?''
-    Example output: &#8220;Isn't this fun?&#8221;
-    """
-    return s.replace("``", "&#8220;").replace("''", "&#8221;")
-
-
-def educateSingleBackticks(s):
-    """
-    Parameter:  String.
-    Returns:    The string, with `backticks' -style single quotes
-        translated into HTML curly quote entities.
-
-    Example input:  `Isn't this fun?'
-    Example output: &#8216;Isn&#8217;t this fun?&#8217;
-    """
-    return s.replace('`', "&#8216;").replace("'", "&#8217;")
-
-
-def educateDashesOldSchool(s):
-    """
-    Parameter:  String.
-
-    Returns:    The string, with each instance of "--" translated to
-        an en-dash HTML entity, and each "---" translated to
-        an em-dash HTML entity.
-    """
-    return s.replace('---', "&#8212;").replace('--', "&#8211;")
-
-
-def educateDashesOldSchoolInverted(s):
-    """
-    Parameter:  String.
-
-    Returns:    The string, with each instance of "--" translated to
-        an em-dash HTML entity, and each "---" translated to
-        an en-dash HTML entity. Two reasons why: First, unlike the
-        en- and em-dash syntax supported by
-        EducateDashesOldSchool(), it's compatible with existing
-        entries written before SmartyPants 1.1, back when "--" was
-        only used for em-dashes.  Second, em-dashes are more
-        common than en-dashes, and so it sort of makes sense that
-        the shortcut should be shorter to type. (Thanks to Aaron
-        Swartz for the idea.)
-    """
-    return s.replace('---', "&#8211;").replace('--', "&#8212;")
-
-
-
-def educateEllipses(s):
-    """
-    Parameter:  String.
-    Returns:    The string, with each instance of "..." translated to
-        an ellipsis HTML entity.
-
-    Example input:  Huh...?
-    Example output: Huh&#8230;?
-    """
-    return s.replace('...', "&#8230;").replace('. . .', "&#8230;")
-
-
-__author__ = "Chad Miller <smartypantspy@chad.org>"
-__version__ = "1.5_1.5: Sat, 13 Aug 2005 15:50:24 -0400"
-__url__ = "http://wiki.chad.org/SmartyPantsPy"
-__description__ = \
-    "Smart-quotes, smart-ellipses, and smart-dashes for weblog entries in pyblosxom"
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/stemmer.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,343 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.util.stemmer
-    ~~~~~~~~~~~~~~~~~~~
-
-    Porter Stemming Algorithm
-
-    This is the Porter stemming algorithm, ported to Python from the
-    version coded up in ANSI C by the author. It may be be regarded
-    as canonical, in that it follows the algorithm presented in
-
-    Porter, 1980, An algorithm for suffix stripping, Program, Vol. 14,
-    no. 3, pp 130-137,
-
-    only differing from it at the points maked --DEPARTURE-- below.
-
-    See also http://www.tartarus.org/~martin/PorterStemmer
-
-    The algorithm as described in the paper could be exactly replicated
-    by adjusting the points of DEPARTURE, but this is barely necessary,
-    because (a) the points of DEPARTURE are definitely improvements, and
-    (b) no encoding of the Porter stemmer I have seen is anything like
-    as exact as this version, even with the points of DEPARTURE!
-
-    Release 1: January 2001
-
-    :copyright: 2001 by Vivake Gupta <v@nano.com>.
-    :license: Public Domain ("can be used free of charge for any purpose").
-"""
-
-class PorterStemmer(object):
-
-    def __init__(self):
-        """The main part of the stemming algorithm starts here.
-        b is a buffer holding a word to be stemmed. The letters are in b[k0],
-        b[k0+1] ... ending at b[k]. In fact k0 = 0 in this demo program. k is
-        readjusted downwards as the stemming progresses. Zero termination is
-        not in fact used in the algorithm.
-
-        Note that only lower case sequences are stemmed. Forcing to lower case
-        should be done before stem(...) is called.
-        """
-
-        self.b = ""  # buffer for word to be stemmed
-        self.k = 0
-        self.k0 = 0
-        self.j = 0   # j is a general offset into the string
-
-    def cons(self, i):
-        """cons(i) is TRUE <=> b[i] is a consonant."""
-        if self.b[i] == 'a' or self.b[i] == 'e' or self.b[i] == 'i' \
-            or self.b[i] == 'o' or self.b[i] == 'u':
-            return 0
-        if self.b[i] == 'y':
-            if i == self.k0:
-                return 1
-            else:
-                return (not self.cons(i - 1))
-        return 1
-
-    def m(self):
-        """m() measures the number of consonant sequences between k0 and j.
-        if c is a consonant sequence and v a vowel sequence, and <..>
-        indicates arbitrary presence,
-
-           <c><v>       gives 0
-           <c>vc<v>     gives 1
-           <c>vcvc<v>   gives 2
-           <c>vcvcvc<v> gives 3
-           ....
-        """
-        n = 0
-        i = self.k0
-        while 1:
-            if i > self.j:
-                return n
-            if not self.cons(i):
-                break
-            i = i + 1
-        i = i + 1
-        while 1:
-            while 1:
-                if i > self.j:
-                    return n
-                if self.cons(i):
-                    break
-                i = i + 1
-            i = i + 1
-            n = n + 1
-            while 1:
-                if i > self.j:
-                    return n
-                if not self.cons(i):
-                    break
-                i = i + 1
-            i = i + 1
-
-    def vowelinstem(self):
-        """vowelinstem() is TRUE <=> k0,...j contains a vowel"""
-        for i in range(self.k0, self.j + 1):
-            if not self.cons(i):
-                return 1
-        return 0
-
-    def doublec(self, j):
-        """doublec(j) is TRUE <=> j,(j-1) contain a double consonant."""
-        if j < (self.k0 + 1):
-            return 0
-        if (self.b[j] != self.b[j-1]):
-            return 0
-        return self.cons(j)
-
-    def cvc(self, i):
-        """cvc(i) is TRUE <=> i-2,i-1,i has the form consonant - vowel - consonant
-        and also if the second c is not w,x or y. this is used when trying to
-        restore an e at the end of a short  e.g.
-
-           cav(e), lov(e), hop(e), crim(e), but
-           snow, box, tray.
-        """
-        if i < (self.k0 + 2) or not self.cons(i) or self.cons(i-1) or not self.cons(i-2):
-            return 0
-        ch = self.b[i]
-        if ch == 'w' or ch == 'x' or ch == 'y':
-            return 0
-        return 1
-
-    def ends(self, s):
-        """ends(s) is TRUE <=> k0,...k ends with the string s."""
-        length = len(s)
-        if s[length - 1] != self.b[self.k]: # tiny speed-up
-            return 0
-        if length > (self.k - self.k0 + 1):
-            return 0
-        if self.b[self.k-length+1:self.k+1] != s:
-            return 0
-        self.j = self.k - length
-        return 1
-
-    def setto(self, s):
-        """setto(s) sets (j+1),...k to the characters in the string s, readjusting k."""
-        length = len(s)
-        self.b = self.b[:self.j+1] + s + self.b[self.j+length+1:]
-        self.k = self.j + length
-
-    def r(self, s):
-        """r(s) is used further down."""
-        if self.m() > 0:
-            self.setto(s)
-
-    def step1ab(self):
-        """step1ab() gets rid of plurals and -ed or -ing. e.g.
-
-           caresses  ->  caress
-           ponies    ->  poni
-           ties      ->  ti
-           caress    ->  caress
-           cats      ->  cat
-
-           feed      ->  feed
-           agreed    ->  agree
-           disabled  ->  disable
-
-           matting   ->  mat
-           mating    ->  mate
-           meeting   ->  meet
-           milling   ->  mill
-           messing   ->  mess
-
-           meetings  ->  meet
-        """
-        if self.b[self.k] == 's':
-            if self.ends("sses"):
-                self.k = self.k - 2
-            elif self.ends("ies"):
-                self.setto("i")
-            elif self.b[self.k - 1] != 's':
-                self.k = self.k - 1
-        if self.ends("eed"):
-            if self.m() > 0:
-                self.k = self.k - 1
-        elif (self.ends("ed") or self.ends("ing")) and self.vowelinstem():
-            self.k = self.j
-            if self.ends("at"):   self.setto("ate")
-            elif self.ends("bl"): self.setto("ble")
-            elif self.ends("iz"): self.setto("ize")
-            elif self.doublec(self.k):
-                self.k = self.k - 1
-                ch = self.b[self.k]
-                if ch == 'l' or ch == 's' or ch == 'z':
-                    self.k = self.k + 1
-            elif (self.m() == 1 and self.cvc(self.k)):
-                self.setto("e")
-
-    def step1c(self):
-        """step1c() turns terminal y to i when there is another vowel in the stem."""
-        if (self.ends("y") and self.vowelinstem()):
-            self.b = self.b[:self.k] + 'i' + self.b[self.k+1:]
-
-    def step2(self):
-        """step2() maps double suffices to single ones.
-        so -ization ( = -ize plus -ation) maps to -ize etc. note that the
-        string before the suffix must give m() > 0.
-        """
-        if self.b[self.k - 1] == 'a':
-            if self.ends("ational"):   self.r("ate")
-            elif self.ends("tional"):  self.r("tion")
-        elif self.b[self.k - 1] == 'c':
-            if self.ends("enci"):      self.r("ence")
-            elif self.ends("anci"):    self.r("ance")
-        elif self.b[self.k - 1] == 'e':
-            if self.ends("izer"):      self.r("ize")
-        elif self.b[self.k - 1] == 'l':
-            if self.ends("bli"):       self.r("ble") # --DEPARTURE--
-            # To match the published algorithm, replace this phrase with
-            #   if self.ends("abli"):      self.r("able")
-            elif self.ends("alli"):    self.r("al")
-            elif self.ends("entli"):   self.r("ent")
-            elif self.ends("eli"):     self.r("e")
-            elif self.ends("ousli"):   self.r("ous")
-        elif self.b[self.k - 1] == 'o':
-            if self.ends("ization"):   self.r("ize")
-            elif self.ends("ation"):   self.r("ate")
-            elif self.ends("ator"):    self.r("ate")
-        elif self.b[self.k - 1] == 's':
-            if self.ends("alism"):     self.r("al")
-            elif self.ends("iveness"): self.r("ive")
-            elif self.ends("fulness"): self.r("ful")
-            elif self.ends("ousness"): self.r("ous")
-        elif self.b[self.k - 1] == 't':
-            if self.ends("aliti"):     self.r("al")
-            elif self.ends("iviti"):   self.r("ive")
-            elif self.ends("biliti"):  self.r("ble")
-        elif self.b[self.k - 1] == 'g': # --DEPARTURE--
-            if self.ends("logi"):      self.r("log")
-        # To match the published algorithm, delete this phrase
-
-    def step3(self):
-        """step3() dels with -ic-, -full, -ness etc. similar strategy to step2."""
-        if self.b[self.k] == 'e':
-            if self.ends("icate"):     self.r("ic")
-            elif self.ends("ative"):   self.r("")
-            elif self.ends("alize"):   self.r("al")
-        elif self.b[self.k] == 'i':
-            if self.ends("iciti"):     self.r("ic")
-        elif self.b[self.k] == 'l':
-            if self.ends("ical"):      self.r("ic")
-            elif self.ends("ful"):     self.r("")
-        elif self.b[self.k] == 's':
-            if self.ends("ness"):      self.r("")
-
-    def step4(self):
-        """step4() takes off -ant, -ence etc., in context <c>vcvc<v>."""
-        if self.b[self.k - 1] == 'a':
-            if self.ends("al"): pass
-            else: return
-        elif self.b[self.k - 1] == 'c':
-            if self.ends("ance"): pass
-            elif self.ends("ence"): pass
-            else: return
-        elif self.b[self.k - 1] == 'e':
-            if self.ends("er"): pass
-            else: return
-        elif self.b[self.k - 1] == 'i':
-            if self.ends("ic"): pass
-            else: return
-        elif self.b[self.k - 1] == 'l':
-            if self.ends("able"): pass
-            elif self.ends("ible"): pass
-            else: return
-        elif self.b[self.k - 1] == 'n':
-            if self.ends("ant"): pass
-            elif self.ends("ement"): pass
-            elif self.ends("ment"): pass
-            elif self.ends("ent"): pass
-            else: return
-        elif self.b[self.k - 1] == 'o':
-            if self.ends("ion") and (self.b[self.j] == 's' \
-                or self.b[self.j] == 't'): pass
-            elif self.ends("ou"): pass
-            # takes care of -ous
-            else: return
-        elif self.b[self.k - 1] == 's':
-            if self.ends("ism"): pass
-            else: return
-        elif self.b[self.k - 1] == 't':
-            if self.ends("ate"): pass
-            elif self.ends("iti"): pass
-            else: return
-        elif self.b[self.k - 1] == 'u':
-            if self.ends("ous"): pass
-            else: return
-        elif self.b[self.k - 1] == 'v':
-            if self.ends("ive"): pass
-            else: return
-        elif self.b[self.k - 1] == 'z':
-            if self.ends("ize"): pass
-            else: return
-        else:
-            return
-        if self.m() > 1:
-            self.k = self.j
-
-    def step5(self):
-        """step5() removes a final -e if m() > 1, and changes -ll to -l if
-        m() > 1.
-        """
-        self.j = self.k
-        if self.b[self.k] == 'e':
-            a = self.m()
-            if a > 1 or (a == 1 and not self.cvc(self.k-1)):
-                self.k = self.k - 1
-        if self.b[self.k] == 'l' and self.doublec(self.k) and self.m() > 1:
-            self.k = self.k -1
-
-    def stem(self, p, i, j):
-        """In stem(p,i,j), p is a char pointer, and the string to be stemmed
-        is from p[i] to p[j] inclusive. Typically i is zero and j is the
-        offset to the last character of a string, (p[j+1] == '\0'). The
-        stemmer adjusts the characters p[i] ... p[j] and returns the new
-        end-point of the string, k. Stemming never increases word length, so
-        i <= k <= j. To turn the stemmer into a module, declare 'stem' as
-        extern, and delete the remainder of this file.
-        """
-        # copy the parameters into statics
-        self.b = p
-        self.k = j
-        self.k0 = i
-        if self.k <= self.k0 + 1:
-            return self.b # --DEPARTURE--
-
-        # With this line, strings of length 1 or 2 don't go through the
-        # stemming process, although no mention is made of this in the
-        # published algorithm. Remove the line to match the published
-        # algorithm.
-
-        self.step1ab()
-        self.step1c()
-        self.step2()
-        self.step3()
-        self.step4()
-        self.step5()
-        return self.b[self.k0:self.k+1]
--- a/buildframework/helium/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx/util/texescape.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.util.texescape
-    ~~~~~~~~~~~~~~~~~~~~~
-
-    TeX escaping helper.
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-tex_replacements = [
-    # map TeX special chars
-    (u'$', ur'\$'),
-    (u'%', ur'\%'),
-    (u'&', ur'\&'),
-    (u'#', ur'\#'),
-    (u'_', ur'\_'),
-    (u'{', ur'\{'),
-    (u'}', ur'\}'),
-    (u'[', ur'{[}'),
-    (u']', ur'{]}'),
-    (u'`', ur'{}`'),
-    (u'\\',ur'\textbackslash{}'),
-    (u'~', ur'\textasciitilde{}'),
-    (u'<', ur'\textless{}'),
-    (u'>', ur'\textgreater{}'),
-    (u'^', ur'\textasciicircum{}'),
-    # map special Unicode characters to TeX commands
-    (u'¶', ur'\P{}'),
-    (u'§', ur'\S{}'),
-    (u'€', ur'\texteuro{}'),
-    (u'∞', ur'\(\infty\)'),
-    (u'±', ur'\(\pm\)'),
-    (u'→', ur'\(\rightarrow\)'),
-    (u'‣', ur'\(\rightarrow\)'),
-    # used to separate -- in options
-    (u'', ur'{}'),
-    # map some special Unicode characters to similar ASCII ones
-    (u'─', ur'-'),
-    (u'⎽', ur'\_'),
-    (u'╲', ur'\textbackslash{}'),
-    (u'│', ur'|'),
-    (u'ℯ', ur'e'),
-    (u'â…ˆ', ur'i'),
-    (u'â‚', ur'1'),
-    (u'â‚‚', ur'2'),
-    # map Greek alphabet
-    (u'α', ur'\(\alpha\)'),
-    (u'β', ur'\(\beta\)'),
-    (u'γ', ur'\(\gamma\)'),
-    (u'δ', ur'\(\delta\)'),
-    (u'ε', ur'\(\epsilon\)'),
-    (u'ζ', ur'\(\zeta\)'),
-    (u'η', ur'\(\eta\)'),
-    (u'θ', ur'\(\theta\)'),
-    (u'ι', ur'\(\iota\)'),
-    (u'κ', ur'\(\kappa\)'),
-    (u'λ', ur'\(\lambda\)'),
-    (u'μ', ur'\(\mu\)'),
-    (u'ν', ur'\(\nu\)'),
-    (u'ξ', ur'\(\xi\)'),
-    (u'ο', ur'o'),
-    (u'Ï€', ur'\(\pi\)'),
-    (u'Ï', ur'\(\rho\)'),
-    (u'σ', ur'\(\sigma\)'),
-    (u'Ï„', ur'\(\tau\)'),
-    (u'Ï…', u'\\(\\upsilon\\)'),
-    (u'φ', ur'\(\phi\)'),
-    (u'χ', ur'\(\chi\)'),
-    (u'ψ', ur'\(\psi\)'),
-    (u'ω', ur'\(\omega\)'),
-    (u'Α', ur'A'),
-    (u'Î’', ur'B'),
-    (u'Γ', ur'\(\Gamma\)'),
-    (u'Δ', ur'\(\Delta\)'),
-    (u'Ε', ur'E'),
-    (u'Ζ', ur'Z'),
-    (u'Η', ur'H'),
-    (u'Θ', ur'\(\Theta\)'),
-    (u'Ι', ur'I'),
-    (u'Κ', ur'K'),
-    (u'Λ', ur'\(\Lambda\)'),
-    (u'Μ', ur'M'),
-    (u'Î', ur'N'),
-    (u'Ξ', ur'\(\Xi\)'),
-    (u'Ο', ur'O'),
-    (u'Π', ur'\(\Pi\)'),
-    (u'Ρ', ur'P'),
-    (u'Σ', ur'\(\Sigma\)'),
-    (u'Τ', ur'T'),
-    (u'Î¥', u'\\(\\Upsilon\\)'),
-    (u'Φ', ur'\(\Phi\)'),
-    (u'Χ', ur'X'),
-    (u'Ψ', ur'\(\Psi\)'),
-    (u'Ω', ur'\(\Omega\)'),
-    (u'Ω', ur'\(\Omega\)'),
-]
-
-tex_escape_map = {}
-tex_hl_escape_map = {}
-_new_cmd_chars = {ord(u'\\'): u'@', ord(u'{'): u'[', ord(u'}'): u']'}
-
-def init():
-    for a, b in tex_replacements:
-        tex_escape_map[ord(a)] = b
-
-    for a, b in tex_replacements:
-        if a in u'[]{}\\': continue
-        tex_hl_escape_map[ord(a)] = b.translate(_new_cmd_chars)
Binary file buildframework/helium/external/python/lib/2.5/coverage-2.85-py2.5.egg has changed
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/PKG-INFO	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-Metadata-Version: 1.0
-Name: docutils
-Version: 0.5
-Summary: Docutils -- Python Documentation Utilities
-Home-page: http://docutils.sourceforge.net/
-Author: David Goodger
-Author-email: goodger@python.org
-License: public domain, Python, BSD, GPL (see COPYING.txt)
-Description: Docutils is a modular system for processing documentation
-        into useful formats, such as HTML, XML, and LaTeX.  For
-        input Docutils supports reStructuredText, an easy-to-read,
-        what-you-see-is-what-you-get plaintext markup syntax.
-Platform: OS-independent
-Classifier: Development Status :: 3 - Alpha
-Classifier: Environment :: Console
-Classifier: Intended Audience :: End Users/Desktop
-Classifier: Intended Audience :: Other Audience
-Classifier: Intended Audience :: Developers
-Classifier: Intended Audience :: System Administrators
-Classifier: License :: Public Domain
-Classifier: License :: OSI Approved :: Python Software Foundation License
-Classifier: License :: OSI Approved :: BSD License
-Classifier: License :: OSI Approved :: GNU General Public License (GPL)
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Topic :: Documentation
-Classifier: Topic :: Software Development :: Documentation
-Classifier: Topic :: Text Processing
-Classifier: Natural Language :: English
-Classifier: Natural Language :: Afrikaans
-Classifier: Natural Language :: Esperanto
-Classifier: Natural Language :: French
-Classifier: Natural Language :: German
-Classifier: Natural Language :: Italian
-Classifier: Natural Language :: Russian
-Classifier: Natural Language :: Slovak
-Classifier: Natural Language :: Spanish
-Classifier: Natural Language :: Swedish
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/SOURCES.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,482 +0,0 @@
-BUGS.txt
-COPYING.txt
-FAQ.txt
-HISTORY.txt
-MANIFEST.in
-README.txt
-RELEASE-NOTES.txt
-THANKS.txt
-install.py
-setup.py
-docs/index.txt
-docs/api/cmdline-tool.txt
-docs/api/publisher.txt
-docs/api/runtime-settings.txt
-docs/dev/distributing.txt
-docs/dev/enthought-plan.txt
-docs/dev/enthought-rfp.txt
-docs/dev/hacking.txt
-docs/dev/policies.txt
-docs/dev/pysource.dtd
-docs/dev/pysource.txt
-docs/dev/release.txt
-docs/dev/repository.txt
-docs/dev/semantics.txt
-docs/dev/testing.txt
-docs/dev/todo.txt
-docs/dev/website.txt
-docs/dev/rst/alternatives.txt
-docs/dev/rst/problems.txt
-docs/howto/html-stylesheets.txt
-docs/howto/i18n.txt
-docs/howto/rst-directives.txt
-docs/howto/rst-roles.txt
-docs/howto/security.txt
-docs/peps/pep-0256.txt
-docs/peps/pep-0257.txt
-docs/peps/pep-0258.txt
-docs/peps/pep-0287.txt
-docs/ref/doctree.txt
-docs/ref/docutils.dtd
-docs/ref/soextblx.dtd
-docs/ref/transforms.txt
-docs/ref/rst/definitions.txt
-docs/ref/rst/directives.txt
-docs/ref/rst/introduction.txt
-docs/ref/rst/restructuredtext.txt
-docs/ref/rst/roles.txt
-docs/user/Makefile.docutils-update
-docs/user/config.txt
-docs/user/emacs.txt
-docs/user/latex.txt
-docs/user/links.txt
-docs/user/mailing-lists.txt
-docs/user/slide-shows.txt
-docs/user/tools.txt
-docs/user/images/big-black.png
-docs/user/images/big-white.png
-docs/user/images/default.png
-docs/user/images/happy_monkey.png
-docs/user/images/medium-black.png
-docs/user/images/medium-white.png
-docs/user/images/rsp-all.png
-docs/user/images/rsp-breaks.png
-docs/user/images/rsp-covers.png
-docs/user/images/rsp-cuts.png
-docs/user/images/rsp-empty.png
-docs/user/images/rsp-objects.png
-docs/user/images/rsp.svg
-docs/user/images/s5-files.png
-docs/user/images/s5-files.svg
-docs/user/images/small-black.png
-docs/user/images/small-white.png
-docs/user/rst/cheatsheet.txt
-docs/user/rst/demo.txt
-docs/user/rst/quickref.html
-docs/user/rst/quickstart.txt
-docs/user/rst/images/ball1.gif
-docs/user/rst/images/biohazard.png
-docs/user/rst/images/title.png
-docutils/__init__.py
-docutils/core.py
-docutils/docutils.conf
-docutils/examples.py
-docutils/frontend.py
-docutils/io.py
-docutils/nodes.py
-docutils/statemachine.py
-docutils/urischemes.py
-docutils/utils.py
-docutils/languages/__init__.py
-docutils/languages/af.py
-docutils/languages/ca.py
-docutils/languages/cs.py
-docutils/languages/de.py
-docutils/languages/en.py
-docutils/languages/eo.py
-docutils/languages/es.py
-docutils/languages/fi.py
-docutils/languages/fr.py
-docutils/languages/he.py
-docutils/languages/it.py
-docutils/languages/ja.py
-docutils/languages/nl.py
-docutils/languages/pt_br.py
-docutils/languages/ru.py
-docutils/languages/sk.py
-docutils/languages/sv.py
-docutils/languages/zh_cn.py
-docutils/languages/zh_tw.py
-docutils/parsers/__init__.py
-docutils/parsers/null.py
-docutils/parsers/rst/__init__.py
-docutils/parsers/rst/roles.py
-docutils/parsers/rst/states.py
-docutils/parsers/rst/tableparser.py
-docutils/parsers/rst/directives/__init__.py
-docutils/parsers/rst/directives/admonitions.py
-docutils/parsers/rst/directives/body.py
-docutils/parsers/rst/directives/html.py
-docutils/parsers/rst/directives/images.py
-docutils/parsers/rst/directives/misc.py
-docutils/parsers/rst/directives/parts.py
-docutils/parsers/rst/directives/references.py
-docutils/parsers/rst/directives/tables.py
-docutils/parsers/rst/include/README.txt
-docutils/parsers/rst/include/isoamsa.txt
-docutils/parsers/rst/include/isoamsb.txt
-docutils/parsers/rst/include/isoamsc.txt
-docutils/parsers/rst/include/isoamsn.txt
-docutils/parsers/rst/include/isoamso.txt
-docutils/parsers/rst/include/isoamsr.txt
-docutils/parsers/rst/include/isobox.txt
-docutils/parsers/rst/include/isocyr1.txt
-docutils/parsers/rst/include/isocyr2.txt
-docutils/parsers/rst/include/isodia.txt
-docutils/parsers/rst/include/isogrk1.txt
-docutils/parsers/rst/include/isogrk2.txt
-docutils/parsers/rst/include/isogrk3.txt
-docutils/parsers/rst/include/isogrk4-wide.txt
-docutils/parsers/rst/include/isogrk4.txt
-docutils/parsers/rst/include/isolat1.txt
-docutils/parsers/rst/include/isolat2.txt
-docutils/parsers/rst/include/isomfrk-wide.txt
-docutils/parsers/rst/include/isomfrk.txt
-docutils/parsers/rst/include/isomopf-wide.txt
-docutils/parsers/rst/include/isomopf.txt
-docutils/parsers/rst/include/isomscr-wide.txt
-docutils/parsers/rst/include/isomscr.txt
-docutils/parsers/rst/include/isonum.txt
-docutils/parsers/rst/include/isopub.txt
-docutils/parsers/rst/include/isotech.txt
-docutils/parsers/rst/include/mmlalias.txt
-docutils/parsers/rst/include/mmlextra-wide.txt
-docutils/parsers/rst/include/mmlextra.txt
-docutils/parsers/rst/include/s5defs.txt
-docutils/parsers/rst/include/xhtml1-lat1.txt
-docutils/parsers/rst/include/xhtml1-special.txt
-docutils/parsers/rst/include/xhtml1-symbol.txt
-docutils/parsers/rst/languages/__init__.py
-docutils/parsers/rst/languages/af.py
-docutils/parsers/rst/languages/ca.py
-docutils/parsers/rst/languages/cs.py
-docutils/parsers/rst/languages/de.py
-docutils/parsers/rst/languages/en.py
-docutils/parsers/rst/languages/eo.py
-docutils/parsers/rst/languages/es.py
-docutils/parsers/rst/languages/fi.py
-docutils/parsers/rst/languages/fr.py
-docutils/parsers/rst/languages/he.py
-docutils/parsers/rst/languages/it.py
-docutils/parsers/rst/languages/ja.py
-docutils/parsers/rst/languages/nl.py
-docutils/parsers/rst/languages/pt_br.py
-docutils/parsers/rst/languages/ru.py
-docutils/parsers/rst/languages/sk.py
-docutils/parsers/rst/languages/sv.py
-docutils/parsers/rst/languages/zh_cn.py
-docutils/parsers/rst/languages/zh_tw.py
-docutils/readers/__init__.py
-docutils/readers/doctree.py
-docutils/readers/pep.py
-docutils/readers/standalone.py
-docutils/readers/python/__init__.py
-docutils/readers/python/moduleparser.py
-docutils/readers/python/pynodes.py
-docutils/transforms/__init__.py
-docutils/transforms/components.py
-docutils/transforms/frontmatter.py
-docutils/transforms/misc.py
-docutils/transforms/parts.py
-docutils/transforms/peps.py
-docutils/transforms/references.py
-docutils/transforms/universal.py
-docutils/transforms/writer_aux.py
-docutils/writers/__init__.py
-docutils/writers/docutils_xml.py
-docutils/writers/null.py
-docutils/writers/pseudoxml.py
-docutils/writers/html4css1/__init__.py
-docutils/writers/html4css1/html4css1.css
-docutils/writers/html4css1/template.txt
-docutils/writers/latex2e/__init__.py
-docutils/writers/latex2e/latex2e.tex
-docutils/writers/newlatex2e/__init__.py
-docutils/writers/newlatex2e/base.tex
-docutils/writers/newlatex2e/notes.txt
-docutils/writers/newlatex2e/tests.txt
-docutils/writers/newlatex2e/unicode_map.py
-docutils/writers/pep_html/__init__.py
-docutils/writers/pep_html/pep.css
-docutils/writers/pep_html/template.txt
-docutils/writers/s5_html/__init__.py
-docutils/writers/s5_html/themes/README.txt
-docutils/writers/s5_html/themes/big-black/__base__
-docutils/writers/s5_html/themes/big-black/framing.css
-docutils/writers/s5_html/themes/big-black/pretty.css
-docutils/writers/s5_html/themes/big-white/framing.css
-docutils/writers/s5_html/themes/big-white/pretty.css
-docutils/writers/s5_html/themes/default/blank.gif
-docutils/writers/s5_html/themes/default/framing.css
-docutils/writers/s5_html/themes/default/iepngfix.htc
-docutils/writers/s5_html/themes/default/opera.css
-docutils/writers/s5_html/themes/default/outline.css
-docutils/writers/s5_html/themes/default/pretty.css
-docutils/writers/s5_html/themes/default/print.css
-docutils/writers/s5_html/themes/default/s5-core.css
-docutils/writers/s5_html/themes/default/slides.css
-docutils/writers/s5_html/themes/default/slides.js
-docutils/writers/s5_html/themes/medium-black/__base__
-docutils/writers/s5_html/themes/medium-black/pretty.css
-docutils/writers/s5_html/themes/medium-white/framing.css
-docutils/writers/s5_html/themes/medium-white/pretty.css
-docutils/writers/s5_html/themes/small-black/__base__
-docutils/writers/s5_html/themes/small-black/pretty.css
-docutils/writers/s5_html/themes/small-white/framing.css
-docutils/writers/s5_html/themes/small-white/pretty.css
-extras/optparse.py
-extras/roman.py
-extras/textwrap.py
-extras/docutils.egg-info/PKG-INFO
-extras/docutils.egg-info/SOURCES.txt
-extras/docutils.egg-info/dependency_links.txt
-extras/docutils.egg-info/top_level.txt
-licenses/docutils.conf
-licenses/gpl.txt
-licenses/python-2-1-1.txt
-licenses/python-2-2.txt
-licenses/python-2-3.txt
-test/DocutilsTestSupport.py
-test/alltests.py
-test/coverage.sh
-test/docutils.conf
-test/docutils_difflib.py
-test/package_unittest.py
-test/test_dependencies.py
-test/test_functional.py
-test/test_io.py
-test/test_language.py
-test/test_nodes.py
-test/test_pickle.py
-test/test_publisher.py
-test/test_settings.py
-test/test_statemachine.py
-test/test_traversals.py
-test/test_utils.py
-test/test_viewlist.py
-test/data/config_1.txt
-test/data/config_2.txt
-test/data/config_error_handler.txt
-test/data/config_list.txt
-test/data/config_list_2.txt
-test/data/config_old.txt
-test/data/csv_data.txt
-test/data/csv_dep.txt
-test/data/dependencies.txt
-test/data/full-template.txt
-test/data/include.txt
-test/data/raw.txt
-test/data/stylesheet.txt
-test/functional/README.txt
-test/functional/expected/compact_lists.html
-test/functional/expected/dangerous.html
-test/functional/expected/field_name_limit.html
-test/functional/expected/latex_docinfo.tex
-test/functional/expected/misc_rst_html4css1.html
-test/functional/expected/pep_html.html
-test/functional/expected/standalone_rst_html4css1.html
-test/functional/expected/standalone_rst_latex.tex
-test/functional/expected/standalone_rst_pseudoxml.txt
-test/functional/expected/standalone_rst_s5_html_1.html
-test/functional/expected/standalone_rst_s5_html_2.html
-test/functional/expected/ui/default/blank.gif
-test/functional/expected/ui/default/framing.css
-test/functional/expected/ui/default/iepngfix.htc
-test/functional/expected/ui/default/opera.css
-test/functional/expected/ui/default/outline.css
-test/functional/expected/ui/default/pretty.css
-test/functional/expected/ui/default/print.css
-test/functional/expected/ui/default/s5-core.css
-test/functional/expected/ui/default/slides.css
-test/functional/expected/ui/default/slides.js
-test/functional/expected/ui/small-black/blank.gif
-test/functional/expected/ui/small-black/framing.css
-test/functional/expected/ui/small-black/iepngfix.htc
-test/functional/expected/ui/small-black/opera.css
-test/functional/expected/ui/small-black/outline.css
-test/functional/expected/ui/small-black/pretty.css
-test/functional/expected/ui/small-black/print.css
-test/functional/expected/ui/small-black/s5-core.css
-test/functional/expected/ui/small-black/slides.css
-test/functional/expected/ui/small-black/slides.js
-test/functional/input/compact_lists.txt
-test/functional/input/dangerous.txt
-test/functional/input/field_list.txt
-test/functional/input/latex_docinfo.txt
-test/functional/input/pep_html.txt
-test/functional/input/simple.txt
-test/functional/input/standalone_rst_html4css1.txt
-test/functional/input/standalone_rst_latex.txt
-test/functional/input/standalone_rst_newlatex.txt
-test/functional/input/standalone_rst_pseudoxml.txt
-test/functional/input/standalone_rst_s5_html.txt
-test/functional/input/data/custom_roles.txt
-test/functional/input/data/errors.txt
-test/functional/input/data/header_footer.txt
-test/functional/input/data/latex.txt
-test/functional/input/data/latex2e.txt
-test/functional/input/data/list_table.txt
-test/functional/input/data/nonalphanumeric.txt
-test/functional/input/data/standard.txt
-test/functional/input/data/table_colspan.txt
-test/functional/input/data/table_complex.txt
-test/functional/input/data/table_rowspan.txt
-test/functional/input/data/unicode.txt
-test/functional/output/README.txt
-test/functional/tests/_default.py
-test/functional/tests/_standalone_rst_defaults.py
-test/functional/tests/compact_lists.py
-test/functional/tests/dangerous.py
-test/functional/tests/field_name_limit.py
-test/functional/tests/latex_docinfo.py
-test/functional/tests/misc_rst_html4css1.py
-test/functional/tests/pep_html.py
-test/functional/tests/standalone_rst_html4css1.py
-test/functional/tests/standalone_rst_latex.py
-test/functional/tests/standalone_rst_pseudoxml.py
-test/functional/tests/standalone_rst_s5_html_1.py
-test/functional/tests/standalone_rst_s5_html_2.py
-test/test_parsers/__init__.py
-test/test_parsers/test_rst/__init__.py
-test/test_parsers/test_rst/test_SimpleTableParser.py
-test/test_parsers/test_rst/test_TableParser.py
-test/test_parsers/test_rst/test_block_quotes.py
-test/test_parsers/test_rst/test_bullet_lists.py
-test/test_parsers/test_rst/test_citations.py
-test/test_parsers/test_rst/test_comments.py
-test/test_parsers/test_rst/test_definition_lists.py
-test/test_parsers/test_rst/test_doctest_blocks.py
-test/test_parsers/test_rst/test_east_asian_text.py
-test/test_parsers/test_rst/test_enumerated_lists.py
-test/test_parsers/test_rst/test_field_lists.py
-test/test_parsers/test_rst/test_footnotes.py
-test/test_parsers/test_rst/test_functions.py
-test/test_parsers/test_rst/test_inline_markup.py
-test/test_parsers/test_rst/test_interpreted.py
-test/test_parsers/test_rst/test_line_blocks.py
-test/test_parsers/test_rst/test_literal_blocks.py
-test/test_parsers/test_rst/test_option_lists.py
-test/test_parsers/test_rst/test_outdenting.py
-test/test_parsers/test_rst/test_paragraphs.py
-test/test_parsers/test_rst/test_section_headers.py
-test/test_parsers/test_rst/test_substitutions.py
-test/test_parsers/test_rst/test_tables.py
-test/test_parsers/test_rst/test_targets.py
-test/test_parsers/test_rst/test_transitions.py
-test/test_parsers/test_rst/includes/include9.txt
-test/test_parsers/test_rst/test_directives/__init__.py
-test/test_parsers/test_rst/test_directives/empty.txt
-test/test_parsers/test_rst/test_directives/include 11.txt
-test/test_parsers/test_rst/test_directives/include1.txt
-test/test_parsers/test_rst/test_directives/include10.txt
-test/test_parsers/test_rst/test_directives/include12.txt
-test/test_parsers/test_rst/test_directives/include13.txt
-test/test_parsers/test_rst/test_directives/include2.txt
-test/test_parsers/test_rst/test_directives/include3.txt
-test/test_parsers/test_rst/test_directives/include8.txt
-test/test_parsers/test_rst/test_directives/raw1.txt
-test/test_parsers/test_rst/test_directives/test_admonitions.py
-test/test_parsers/test_rst/test_directives/test_block_quotes.py
-test/test_parsers/test_rst/test_directives/test_class.py
-test/test_parsers/test_rst/test_directives/test_compound.py
-test/test_parsers/test_rst/test_directives/test_container.py
-test/test_parsers/test_rst/test_directives/test_contents.py
-test/test_parsers/test_rst/test_directives/test_date.py
-test/test_parsers/test_rst/test_directives/test_decorations.py
-test/test_parsers/test_rst/test_directives/test_default_role.py
-test/test_parsers/test_rst/test_directives/test_figures.py
-test/test_parsers/test_rst/test_directives/test_images.py
-test/test_parsers/test_rst/test_directives/test_include.py
-test/test_parsers/test_rst/test_directives/test_line_blocks.py
-test/test_parsers/test_rst/test_directives/test_meta.py
-test/test_parsers/test_rst/test_directives/test_parsed_literals.py
-test/test_parsers/test_rst/test_directives/test_raw.py
-test/test_parsers/test_rst/test_directives/test_replace.py
-test/test_parsers/test_rst/test_directives/test_role.py
-test/test_parsers/test_rst/test_directives/test_rubrics.py
-test/test_parsers/test_rst/test_directives/test_sectnum.py
-test/test_parsers/test_rst/test_directives/test_sidebars.py
-test/test_parsers/test_rst/test_directives/test_tables.py
-test/test_parsers/test_rst/test_directives/test_target_notes.py
-test/test_parsers/test_rst/test_directives/test_test_directives.py
-test/test_parsers/test_rst/test_directives/test_title.py
-test/test_parsers/test_rst/test_directives/test_topics.py
-test/test_parsers/test_rst/test_directives/test_unicode.py
-test/test_parsers/test_rst/test_directives/test_unknown.py
-test/test_parsers/test_rst/test_directives/utf-16.csv
-test/test_parsers/test_rst/test_directives/includes/include4.txt
-test/test_parsers/test_rst/test_directives/includes/include5.txt
-test/test_parsers/test_rst/test_directives/includes/more/include6.txt
-test/test_parsers/test_rst/test_directives/includes/sibling/include7.txt
-test/test_readers/__init__.py
-test/test_readers/test_pep/__init__.py
-test/test_readers/test_pep/test_inline_markup.py
-test/test_readers/test_pep/test_rfc2822.py
-test/test_readers/test_python/__init__.py
-test/test_readers/test_python/showast
-test/test_readers/test_python/showdoc
-test/test_readers/test_python/showparse
-test/test_readers/test_python/showtok
-test/test_readers/test_python/test_functions.py
-test/test_readers/test_python/test_parser.py
-test/test_readers/test_python/test_token_parser.py
-test/test_transforms/__init__.py
-test/test_transforms/test___init__.py
-test/test_transforms/test_class.py
-test/test_transforms/test_contents.py
-test/test_transforms/test_docinfo.py
-test/test_transforms/test_doctitle.py
-test/test_transforms/test_expose_internals.py
-test/test_transforms/test_filter.py
-test/test_transforms/test_footnotes.py
-test/test_transforms/test_hyperlinks.py
-test/test_transforms/test_messages.py
-test/test_transforms/test_peps.py
-test/test_transforms/test_sectnum.py
-test/test_transforms/test_strip_comments.py
-test/test_transforms/test_substitutions.py
-test/test_transforms/test_target_notes.py
-test/test_transforms/test_transitions.py
-test/test_transforms/test_writer_aux.py
-test/test_writers/__init__.py
-test/test_writers/test_docutils_xml.py
-test/test_writers/test_html4css1_misc.py
-test/test_writers/test_html4css1_parts.py
-test/test_writers/test_html4css1_template.py
-test/test_writers/test_latex2e.py
-test/test_writers/test_null.py
-test/test_writers/test_pseudoxml.py
-test/test_writers/test_s5.py
-tools/buildhtml.py
-tools/docutils.conf
-tools/quicktest.py
-tools/rst2html.py
-tools/rst2latex.py
-tools/rst2newlatex.py
-tools/rst2pseudoxml.py
-tools/rst2s5.py
-tools/rst2xml.py
-tools/rstpep2html.py
-tools/dev/README.txt
-tools/dev/create_unimap.py
-tools/dev/profile_docutils.py
-tools/dev/unicode2rstsubs.py
-tools/editors/README.txt
-tools/editors/emacs/README.txt
-tools/editors/emacs/docutils.conf
-tools/editors/emacs/rst.el
-tools/editors/emacs/tests/Makefile
-tools/editors/emacs/tests/README.txt
-tools/editors/emacs/tests/tests-adjust-section.el
-tools/editors/emacs/tests/tests-basic.el
-tools/editors/emacs/tests/tests-runner.el
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/dependency_links.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/not-zip-safe	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2html.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-#!C:\Python25\python.exe
-
-# $Id: rst2html.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-A minimal front end to the Docutils Publisher, producing HTML.
-"""
-
-try:
-    import locale
-    locale.setlocale(locale.LC_ALL, '')
-except:
-    pass
-
-from docutils.core import publish_cmdline, default_description
-
-
-description = ('Generates (X)HTML documents from standalone reStructuredText '
-               'sources.  ' + default_description)
-
-publish_cmdline(writer_name='html', description=description)
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2latex.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-#!C:\Python25\python.exe
-
-# $Id: rst2latex.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-A minimal front end to the Docutils Publisher, producing LaTeX.
-"""
-
-try:
-    import locale
-    locale.setlocale(locale.LC_ALL, '')
-except:
-    pass
-
-from docutils.core import publish_cmdline, default_description
-
-
-description = ('Generates LaTeX documents from standalone reStructuredText '
-               'sources.  ' + default_description)
-
-publish_cmdline(writer_name='latex', description=description)
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2newlatex.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-#!C:\Python25\python.exe
-
-# $Id: rst2newlatex.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-A minimal front end to the Docutils Publisher, producing LaTeX using
-the new LaTeX writer.
-"""
-
-try:
-    import locale
-    locale.setlocale(locale.LC_ALL, '')
-except:
-    pass
-
-from docutils.core import publish_cmdline, default_description
-
-
-description = ('Generates LaTeX documents from standalone reStructuredText '
-               'sources. This writer is EXPERIMENTAL and should not be used '
-               'in a production environment. ' + default_description)
-
-publish_cmdline(writer_name='newlatex2e', description=description)
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2pseudoxml.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-#!C:\Python25\python.exe
-
-# $Id: rst2pseudoxml.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-A minimal front end to the Docutils Publisher, producing pseudo-XML.
-"""
-
-try:
-    import locale
-    locale.setlocale(locale.LC_ALL, '')
-except:
-    pass
-
-from docutils.core import publish_cmdline, default_description
-
-
-description = ('Generates pseudo-XML from standalone reStructuredText '
-               'sources (for testing purposes).  ' + default_description)
-
-publish_cmdline(description=description)
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2s5.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-#!C:\Python25\python.exe
-
-# $Id: rst2s5.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Chris Liechti <cliechti@gmx.net>
-# Copyright: This module has been placed in the public domain.
-
-"""
-A minimal front end to the Docutils Publisher, producing HTML slides using
-the S5 template system.
-"""
-
-try:
-    import locale
-    locale.setlocale(locale.LC_ALL, '')
-except:
-    pass
-
-from docutils.core import publish_cmdline, default_description
-
-
-description = ('Generates S5 (X)HTML slideshow documents from standalone '
-               'reStructuredText sources.  ' + default_description)
-
-publish_cmdline(writer_name='s5', description=description)
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2xml.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-#!C:\Python25\python.exe
-
-# $Id: rst2xml.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-A minimal front end to the Docutils Publisher, producing Docutils XML.
-"""
-
-try:
-    import locale
-    locale.setlocale(locale.LC_ALL, '')
-except:
-    pass
-
-from docutils.core import publish_cmdline, default_description
-
-
-description = ('Generates Docutils-native XML from standalone '
-               'reStructuredText sources.  ' + default_description)
-
-publish_cmdline(writer_name='xml', description=description)
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rstpep2html.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-#!C:\Python25\python.exe
-
-# $Id: rstpep2html.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-A minimal front end to the Docutils Publisher, producing HTML from PEP
-(Python Enhancement Proposal) documents.
-"""
-
-try:
-    import locale
-    locale.setlocale(locale.LC_ALL, '')
-except:
-    pass
-
-from docutils.core import publish_cmdline, default_description
-
-
-description = ('Generates (X)HTML from reStructuredText-format PEP files.  '
-               + default_description)
-
-publish_cmdline(reader_name='pep', writer_name='pep_html',
-                description=description)
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/EGG-INFO/top_level.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-docutils
-roman
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,204 +0,0 @@
-# $Id: __init__.py 4801 2006-11-12 18:02:08Z goodger $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-This is the Docutils (Python Documentation Utilities) package.
-
-Package Structure
-=================
-
-Modules:
-
-- __init__.py: Contains component base classes, exception classes, and
-  Docutils version information.
-
-- core.py: Contains the ``Publisher`` class and ``publish_*()`` convenience
-  functions.
-
-- frontend.py: Runtime settings (command-line interface, configuration files)
-  processing, for Docutils front-ends.
-
-- io.py: Provides a uniform API for low-level input and output.
-
-- nodes.py: Docutils document tree (doctree) node class library.
-
-- statemachine.py: A finite state machine specialized for
-  regular-expression-based text filters.
-
-- urischemes.py: Contains a complete mapping of known URI addressing
-  scheme names to descriptions.
-
-- utils.py: Contains the ``Reporter`` system warning class and miscellaneous
-  utilities.
-
-Subpackages:
-
-- languages: Language-specific mappings of terms.
-
-- parsers: Syntax-specific input parser modules or packages.
-
-- readers: Context-specific input handlers which understand the data
-  source and manage a parser.
-
-- transforms: Modules used by readers and writers to modify DPS
-  doctrees.
-
-- writers: Format-specific output translators.
-"""
-
-__docformat__ = 'reStructuredText'
-
-__version__ = '0.5'
-"""``major.minor.micro`` version number.  The micro number is bumped for API
-changes, for new functionality, and for interim project releases.  The minor
-number is bumped whenever there is a significant project release.  The major
-number will be bumped when the project is feature-complete, and perhaps if
-there is a major change in the design."""
-
-__version_details__ = 'snapshot 2007-11-01, r5461'
-"""Extra version details (e.g. 'snapshot 2005-05-29, r3410', 'repository',
-'release'), modified automatically & manually."""
-
-class ApplicationError(StandardError): pass
-class DataError(ApplicationError): pass
-
-
-class SettingsSpec:
-
-    """
-    Runtime setting specification base class.
-
-    SettingsSpec subclass objects used by `docutils.frontend.OptionParser`.
-    """
-
-    settings_spec = ()
-    """Runtime settings specification.  Override in subclasses.
-
-    Defines runtime settings and associated command-line options, as used by
-    `docutils.frontend.OptionParser`.  This is a tuple of:
-
-    - Option group title (string or `None` which implies no group, just a list
-      of single options).
-
-    - Description (string or `None`).
-
-    - A sequence of option tuples.  Each consists of:
-
-      - Help text (string)
-
-      - List of option strings (e.g. ``['-Q', '--quux']``).
-
-      - Dictionary of keyword arguments sent to the OptionParser/OptionGroup
-        ``add_option`` method.
-
-        Runtime setting names are derived implicitly from long option names
-        ('--a-setting' becomes ``settings.a_setting``) or explicitly from the
-        'dest' keyword argument.
-
-        Most settings will also have a 'validator' keyword & function.  The
-        validator function validates setting values (from configuration files
-        and command-line option arguments) and converts them to appropriate
-        types.  For example, the ``docutils.frontend.validate_boolean``
-        function, **required by all boolean settings**, converts true values
-        ('1', 'on', 'yes', and 'true') to 1 and false values ('0', 'off',
-        'no', 'false', and '') to 0.  Validators need only be set once per
-        setting.  See the `docutils.frontend.validate_*` functions.
-
-        See the optparse docs for more details.
-
-    - More triples of group title, description, options, as many times as
-      needed.  Thus, `settings_spec` tuples can be simply concatenated.
-    """
-
-    settings_defaults = None
-    """A dictionary of defaults for settings not in `settings_spec` (internal
-    settings, intended to be inaccessible by command-line and config file).
-    Override in subclasses."""
-
-    settings_default_overrides = None
-    """A dictionary of auxiliary defaults, to override defaults for settings
-    defined in other components.  Override in subclasses."""
-
-    relative_path_settings = ()
-    """Settings containing filesystem paths.  Override in subclasses.
-    Settings listed here are to be interpreted relative to the current working
-    directory."""
-
-    config_section = None
-    """The name of the config file section specific to this component
-    (lowercase, no brackets).  Override in subclasses."""
-
-    config_section_dependencies = None
-    """A list of names of config file sections that are to be applied before
-    `config_section`, in order (from general to specific).  In other words,
-    the settings in `config_section` are to be overlaid on top of the settings
-    from these sections.  The "general" section is assumed implicitly.
-    Override in subclasses."""
-
-
-class TransformSpec:
-
-    """
-    Runtime transform specification base class.
-
-    TransformSpec subclass objects used by `docutils.transforms.Transformer`.
-    """
-
-    def get_transforms(self):
-        """Transforms required by this class.  Override in subclasses."""
-        if self.default_transforms != ():
-            import warnings
-            warnings.warn('default_transforms attribute deprecated.\n'
-                          'Use get_transforms() method instead.',
-                          DeprecationWarning)
-            return list(self.default_transforms)
-        return []
-
-    # Deprecated; for compatibility.
-    default_transforms = ()
-
-    unknown_reference_resolvers = ()
-    """List of functions to try to resolve unknown references.  Unknown
-    references have a 'refname' attribute which doesn't correspond to any
-    target in the document.  Called when the transforms in
-    `docutils.tranforms.references` are unable to find a correct target.  The
-    list should contain functions which will try to resolve unknown
-    references, with the following signature::
-
-        def reference_resolver(node):
-            '''Returns boolean: true if resolved, false if not.'''
-
-    If the function is able to resolve the reference, it should also remove
-    the 'refname' attribute and mark the node as resolved::
-
-        del node['refname']
-        node.resolved = 1
-
-    Each function must have a "priority" attribute which will affect the order
-    the unknown_reference_resolvers are run::
-
-        reference_resolver.priority = 100
-
-    Override in subclasses."""
-
-
-class Component(SettingsSpec, TransformSpec):
-
-    """Base class for Docutils components."""
-
-    component_type = None
-    """Name of the component type ('reader', 'parser', 'writer').  Override in
-    subclasses."""
-
-    supported = ()
-    """Names for this component.  Override in subclasses."""
-
-    def supports(self, format):
-        """
-        Is `format` supported by this component?
-
-        To be used by transforms to ask the dependent component if it supports
-        a certain input context or output format.
-        """
-        return format in self.supported
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/core.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,613 +0,0 @@
-# $Id: core.py 5033 2007-03-21 19:51:22Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Calling the ``publish_*`` convenience functions (or instantiating a
-`Publisher` object) with component names will result in default
-behavior.  For custom behavior (setting component options), create
-custom component objects first, and pass *them* to
-``publish_*``/`Publisher`.  See `The Docutils Publisher`_.
-
-.. _The Docutils Publisher: http://docutils.sf.net/docs/api/publisher.html
-"""
-
-__docformat__ = 'reStructuredText'
-
-import sys
-import pprint
-from types import StringType
-from docutils import __version__, __version_details__, SettingsSpec
-from docutils import frontend, io, utils, readers, writers
-from docutils.frontend import OptionParser
-from docutils.transforms import Transformer
-import docutils.readers.doctree
-
-
-class Publisher:
-
-    """
-    A facade encapsulating the high-level logic of a Docutils system.
-    """
-
-    def __init__(self, reader=None, parser=None, writer=None,
-                 source=None, source_class=io.FileInput,
-                 destination=None, destination_class=io.FileOutput,
-                 settings=None):
-        """
-        Initial setup.  If any of `reader`, `parser`, or `writer` are not
-        specified, the corresponding ``set_...`` method should be called with
-        a component name (`set_reader` sets the parser as well).
-        """
-
-        self.document = None
-        """The document tree (`docutils.nodes` objects)."""
-
-        self.reader = reader
-        """A `docutils.readers.Reader` instance."""
-
-        self.parser = parser
-        """A `docutils.parsers.Parser` instance."""
-
-        self.writer = writer
-        """A `docutils.writers.Writer` instance."""
-
-        for component in 'reader', 'parser', 'writer':
-            assert not isinstance(getattr(self, component), StringType), \
-                   ('passed string as "%s" parameter; use "%s_name" instead'
-                    % (getattr(self, component), component, component))
-
-        self.source = source
-        """The source of input data, a `docutils.io.Input` instance."""
-
-        self.source_class = source_class
-        """The class for dynamically created source objects."""
-
-        self.destination = destination
-        """The destination for docutils output, a `docutils.io.Output`
-        instance."""
-
-        self.destination_class = destination_class
-        """The class for dynamically created destination objects."""
-
-        self.settings = settings
-        """An object containing Docutils settings as instance attributes.
-        Set by `self.process_command_line()` or `self.get_settings()`."""
-
-    def set_reader(self, reader_name, parser, parser_name):
-        """Set `self.reader` by name."""
-        reader_class = readers.get_reader_class(reader_name)
-        self.reader = reader_class(parser, parser_name)
-        self.parser = self.reader.parser
-
-    def set_writer(self, writer_name):
-        """Set `self.writer` by name."""
-        writer_class = writers.get_writer_class(writer_name)
-        self.writer = writer_class()
-
-    def set_components(self, reader_name, parser_name, writer_name):
-        if self.reader is None:
-            self.set_reader(reader_name, self.parser, parser_name)
-        if self.parser is None:
-            if self.reader.parser is None:
-                self.reader.set_parser(parser_name)
-            self.parser = self.reader.parser
-        if self.writer is None:
-            self.set_writer(writer_name)
-
-    def setup_option_parser(self, usage=None, description=None,
-                            settings_spec=None, config_section=None,
-                            **defaults):
-        if config_section:
-            if not settings_spec:
-                settings_spec = SettingsSpec()
-            settings_spec.config_section = config_section
-            parts = config_section.split()
-            if len(parts) > 1 and parts[-1] == 'application':
-                settings_spec.config_section_dependencies = ['applications']
-        #@@@ Add self.source & self.destination to components in future?
-        option_parser = OptionParser(
-            components=(self.parser, self.reader, self.writer, settings_spec),
-            defaults=defaults, read_config_files=1,
-            usage=usage, description=description)
-        return option_parser
-
-    def get_settings(self, usage=None, description=None,
-                     settings_spec=None, config_section=None, **defaults):
-        """
-        Set and return default settings (overrides in `defaults` dict).
-
-        Set components first (`self.set_reader` & `self.set_writer`).
-        Explicitly setting `self.settings` disables command line option
-        processing from `self.publish()`.
-        """
-        option_parser = self.setup_option_parser(
-            usage, description, settings_spec, config_section, **defaults)
-        self.settings = option_parser.get_default_values()
-        return self.settings
-
-    def process_programmatic_settings(self, settings_spec,
-                                      settings_overrides,
-                                      config_section):
-        if self.settings is None:
-            defaults = (settings_overrides or {}).copy()
-            # Propagate exceptions by default when used programmatically:
-            defaults.setdefault('traceback', 1)
-            self.get_settings(settings_spec=settings_spec,
-                              config_section=config_section,
-                              **defaults)
-
-    def process_command_line(self, argv=None, usage=None, description=None,
-                             settings_spec=None, config_section=None,
-                             **defaults):
-        """
-        Pass an empty list to `argv` to avoid reading `sys.argv` (the
-        default).
-
-        Set components first (`self.set_reader` & `self.set_writer`).
-        """
-        option_parser = self.setup_option_parser(
-            usage, description, settings_spec, config_section, **defaults)
-        if argv is None:
-            argv = sys.argv[1:]
-        self.settings = option_parser.parse_args(argv)
-
-    def set_io(self, source_path=None, destination_path=None):
-        if self.source is None:
-            self.set_source(source_path=source_path)
-        if self.destination is None:
-            self.set_destination(destination_path=destination_path)
-
-    def set_source(self, source=None, source_path=None):
-        if source_path is None:
-            source_path = self.settings._source
-        else:
-            self.settings._source = source_path
-        self.source = self.source_class(
-            source=source, source_path=source_path,
-            encoding=self.settings.input_encoding)
-
-    def set_destination(self, destination=None, destination_path=None):
-        if destination_path is None:
-            destination_path = self.settings._destination
-        else:
-            self.settings._destination = destination_path
-        self.destination = self.destination_class(
-            destination=destination, destination_path=destination_path,
-            encoding=self.settings.output_encoding,
-            error_handler=self.settings.output_encoding_error_handler)
-
-    def apply_transforms(self):
-        self.document.transformer.populate_from_components(
-            (self.source, self.reader, self.reader.parser, self.writer,
-             self.destination))
-        self.document.transformer.apply_transforms()
-
-    def publish(self, argv=None, usage=None, description=None,
-                settings_spec=None, settings_overrides=None,
-                config_section=None, enable_exit_status=None):
-        """
-        Process command line options and arguments (if `self.settings` not
-        already set), run `self.reader` and then `self.writer`.  Return
-        `self.writer`'s output.
-        """
-        exit = None
-        try:
-            if self.settings is None:
-                self.process_command_line(
-                    argv, usage, description, settings_spec, config_section,
-                    **(settings_overrides or {}))
-            self.set_io()
-            self.document = self.reader.read(self.source, self.parser,
-                                             self.settings)
-            self.apply_transforms()
-            output = self.writer.write(self.document, self.destination)
-            self.writer.assemble_parts()
-        except SystemExit, error:
-            exit = 1
-            exit_status = error.code
-        except Exception, error:
-            if not self.settings:       # exception too early to report nicely
-                raise
-            if self.settings.traceback: # Propagate exceptions?
-                self.debugging_dumps()
-                raise
-            self.report_Exception(error)
-            exit = 1
-            exit_status = 1
-        self.debugging_dumps()
-        if (enable_exit_status and self.document
-            and (self.document.reporter.max_level
-                 >= self.settings.exit_status_level)):
-            sys.exit(self.document.reporter.max_level + 10)
-        elif exit:
-            sys.exit(exit_status)
-        return output
-
-    def debugging_dumps(self):
-        if not self.document:
-            return
-        if self.settings.dump_settings:
-            print >>sys.stderr, '\n::: Runtime settings:'
-            print >>sys.stderr, pprint.pformat(self.settings.__dict__)
-        if self.settings.dump_internals:
-            print >>sys.stderr, '\n::: Document internals:'
-            print >>sys.stderr, pprint.pformat(self.document.__dict__)
-        if self.settings.dump_transforms:
-            print >>sys.stderr, '\n::: Transforms applied:'
-            print >>sys.stderr, (' (priority, transform class, '
-                                 'pending node details, keyword args)')
-            print >>sys.stderr, pprint.pformat(
-                [(priority, '%s.%s' % (xclass.__module__, xclass.__name__),
-                  pending and pending.details, kwargs)
-                 for priority, xclass, pending, kwargs
-                 in self.document.transformer.applied])
-        if self.settings.dump_pseudo_xml:
-            print >>sys.stderr, '\n::: Pseudo-XML:'
-            print >>sys.stderr, self.document.pformat().encode(
-                'raw_unicode_escape')
-
-    def report_Exception(self, error):
-        if isinstance(error, utils.SystemMessage):
-            self.report_SystemMessage(error)
-        elif isinstance(error, UnicodeError):
-            self.report_UnicodeError(error)
-        else:
-            print >>sys.stderr, '%s: %s' % (error.__class__.__name__, error)
-            print >>sys.stderr, ("""\
-Exiting due to error.  Use "--traceback" to diagnose.
-Please report errors to <docutils-users@lists.sf.net>.
-Include "--traceback" output, Docutils version (%s [%s]),
-Python version (%s), your OS type & version, and the
-command line used.""" % (__version__, __version_details__,
-                         sys.version.split()[0]))
-
-    def report_SystemMessage(self, error):
-        print >>sys.stderr, ('Exiting due to level-%s (%s) system message.'
-                             % (error.level,
-                                utils.Reporter.levels[error.level]))
-
-    def report_UnicodeError(self, error):
-        sys.stderr.write(
-            '%s: %s\n'
-            '\n'
-            'The specified output encoding (%s) cannot\n'
-            'handle all of the output.\n'
-            'Try setting "--output-encoding-error-handler" to\n'
-            '\n'
-            '* "xmlcharrefreplace" (for HTML & XML output);\n'
-            % (error.__class__.__name__, error,
-               self.settings.output_encoding))
-        try:
-            data = error.object[error.start:error.end]
-            sys.stderr.write(
-                '  the output will contain "%s" and should be usable.\n'
-                '* "backslashreplace" (for other output formats, Python 2.3+);\n'
-                '  look for "%s" in the output.\n'
-                % (data.encode('ascii', 'xmlcharrefreplace'),
-                   data.encode('ascii', 'backslashreplace')))
-        except AttributeError:
-            sys.stderr.write('  the output should be usable as-is.\n')
-        sys.stderr.write(
-            '* "replace"; look for "?" in the output.\n'
-            '\n'
-            '"--output-encoding-error-handler" is currently set to "%s".\n'
-            '\n'
-            'Exiting due to error.  Use "--traceback" to diagnose.\n'
-            'If the advice above doesn\'t eliminate the error,\n'
-            'please report it to <docutils-users@lists.sf.net>.\n'
-            'Include "--traceback" output, Docutils version (%s),\n'
-            'Python version (%s), your OS type & version, and the\n'
-            'command line used.\n'
-            % (self.settings.output_encoding_error_handler,
-               __version__, sys.version.split()[0]))
-
-default_usage = '%prog [options] [<source> [<destination>]]'
-default_description = ('Reads from <source> (default is stdin) and writes to '
-                       '<destination> (default is stdout).  See '
-                       '<http://docutils.sf.net/docs/user/config.html> for '
-                       'the full reference.')
-
-def publish_cmdline(reader=None, reader_name='standalone',
-                    parser=None, parser_name='restructuredtext',
-                    writer=None, writer_name='pseudoxml',
-                    settings=None, settings_spec=None,
-                    settings_overrides=None, config_section=None,
-                    enable_exit_status=1, argv=None,
-                    usage=default_usage, description=default_description):
-    """
-    Set up & run a `Publisher` for command-line-based file I/O (input and
-    output file paths taken automatically from the command line).  Return the
-    encoded string output also.
-
-    Parameters: see `publish_programmatically` for the remainder.
-
-    - `argv`: Command-line argument list to use instead of ``sys.argv[1:]``.
-    - `usage`: Usage string, output if there's a problem parsing the command
-      line.
-    - `description`: Program description, output for the "--help" option
-      (along with command-line option descriptions).
-    """
-    pub = Publisher(reader, parser, writer, settings=settings)
-    pub.set_components(reader_name, parser_name, writer_name)
-    output = pub.publish(
-        argv, usage, description, settings_spec, settings_overrides,
-        config_section=config_section, enable_exit_status=enable_exit_status)
-    return output
-
-def publish_file(source=None, source_path=None,
-                 destination=None, destination_path=None,
-                 reader=None, reader_name='standalone',
-                 parser=None, parser_name='restructuredtext',
-                 writer=None, writer_name='pseudoxml',
-                 settings=None, settings_spec=None, settings_overrides=None,
-                 config_section=None, enable_exit_status=None):
-    """
-    Set up & run a `Publisher` for programmatic use with file-like I/O.
-    Return the encoded string output also.
-
-    Parameters: see `publish_programmatically`.
-    """
-    output, pub = publish_programmatically(
-        source_class=io.FileInput, source=source, source_path=source_path,
-        destination_class=io.FileOutput,
-        destination=destination, destination_path=destination_path,
-        reader=reader, reader_name=reader_name,
-        parser=parser, parser_name=parser_name,
-        writer=writer, writer_name=writer_name,
-        settings=settings, settings_spec=settings_spec,
-        settings_overrides=settings_overrides,
-        config_section=config_section,
-        enable_exit_status=enable_exit_status)
-    return output
-
-def publish_string(source, source_path=None, destination_path=None,
-                   reader=None, reader_name='standalone',
-                   parser=None, parser_name='restructuredtext',
-                   writer=None, writer_name='pseudoxml',
-                   settings=None, settings_spec=None,
-                   settings_overrides=None, config_section=None,
-                   enable_exit_status=None):
-    """
-    Set up & run a `Publisher` for programmatic use with string I/O.  Return
-    the encoded string or Unicode string output.
-
-    For encoded string output, be sure to set the 'output_encoding' setting to
-    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
-    output.  Here's one way::
-
-        publish_string(..., settings_overrides={'output_encoding': 'unicode'})
-
-    Similarly for Unicode string input (`source`)::
-
-        publish_string(..., settings_overrides={'input_encoding': 'unicode'})
-
-    Parameters: see `publish_programmatically`.
-    """
-    output, pub = publish_programmatically(
-        source_class=io.StringInput, source=source, source_path=source_path,
-        destination_class=io.StringOutput,
-        destination=None, destination_path=destination_path,
-        reader=reader, reader_name=reader_name,
-        parser=parser, parser_name=parser_name,
-        writer=writer, writer_name=writer_name,
-        settings=settings, settings_spec=settings_spec,
-        settings_overrides=settings_overrides,
-        config_section=config_section,
-        enable_exit_status=enable_exit_status)
-    return output
-
-def publish_parts(source, source_path=None, source_class=io.StringInput,
-                  destination_path=None,
-                  reader=None, reader_name='standalone',
-                  parser=None, parser_name='restructuredtext',
-                  writer=None, writer_name='pseudoxml',
-                  settings=None, settings_spec=None,
-                  settings_overrides=None, config_section=None,
-                  enable_exit_status=None):
-    """
-    Set up & run a `Publisher`, and return a dictionary of document parts.
-    Dictionary keys are the names of parts, and values are Unicode strings;
-    encoding is up to the client.  For programmatic use with string I/O.
-
-    For encoded string input, be sure to set the 'input_encoding' setting to
-    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
-    input.  Here's how::
-
-        publish_parts(..., settings_overrides={'input_encoding': 'unicode'})
-
-    Parameters: see `publish_programmatically`.
-    """
-    output, pub = publish_programmatically(
-        source=source, source_path=source_path, source_class=source_class,
-        destination_class=io.StringOutput,
-        destination=None, destination_path=destination_path,
-        reader=reader, reader_name=reader_name,
-        parser=parser, parser_name=parser_name,
-        writer=writer, writer_name=writer_name,
-        settings=settings, settings_spec=settings_spec,
-        settings_overrides=settings_overrides,
-        config_section=config_section,
-        enable_exit_status=enable_exit_status)
-    return pub.writer.parts
-
-def publish_doctree(source, source_path=None,
-                    source_class=io.StringInput,
-                    reader=None, reader_name='standalone',
-                    parser=None, parser_name='restructuredtext',
-                    settings=None, settings_spec=None,
-                    settings_overrides=None, config_section=None,
-                    enable_exit_status=None):
-    """
-    Set up & run a `Publisher` for programmatic use with string I/O.
-    Return the document tree.
-
-    For encoded string input, be sure to set the 'input_encoding' setting to
-    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
-    input.  Here's one way::
-
-        publish_doctree(..., settings_overrides={'input_encoding': 'unicode'})
-
-    Parameters: see `publish_programmatically`.
-    """
-    pub = Publisher(reader=reader, parser=parser, writer=None,
-                    settings=settings,
-                    source_class=source_class,
-                    destination_class=io.NullOutput)
-    pub.set_components(reader_name, parser_name, 'null')
-    pub.process_programmatic_settings(
-        settings_spec, settings_overrides, config_section)
-    pub.set_source(source, source_path)
-    pub.set_destination(None, None)
-    output = pub.publish(enable_exit_status=enable_exit_status)
-    return pub.document
-
-def publish_from_doctree(document, destination_path=None,
-                         writer=None, writer_name='pseudoxml',
-                         settings=None, settings_spec=None,
-                         settings_overrides=None, config_section=None,
-                         enable_exit_status=None):
-    """
-    Set up & run a `Publisher` to render from an existing document
-    tree data structure, for programmatic use with string I/O.  Return
-    the encoded string output.
-
-    Note that document.settings is overridden; if you want to use the settings
-    of the original `document`, pass settings=document.settings.
-
-    Also, new document.transformer and document.reporter objects are
-    generated.
-
-    For encoded string output, be sure to set the 'output_encoding' setting to
-    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
-    output.  Here's one way::
-
-        publish_from_doctree(
-            ..., settings_overrides={'output_encoding': 'unicode'})
-
-    Parameters: `document` is a `docutils.nodes.document` object, an existing
-    document tree.
-
-    Other parameters: see `publish_programmatically`.
-    """
-    reader = docutils.readers.doctree.Reader(parser_name='null')
-    pub = Publisher(reader, None, writer,
-                    source=io.DocTreeInput(document),
-                    destination_class=io.StringOutput, settings=settings)
-    if not writer and writer_name:
-        pub.set_writer(writer_name)
-    pub.process_programmatic_settings(
-        settings_spec, settings_overrides, config_section)
-    pub.set_destination(None, destination_path)
-    return pub.publish(enable_exit_status=enable_exit_status)
-
-def publish_programmatically(source_class, source, source_path,
-                             destination_class, destination, destination_path,
-                             reader, reader_name,
-                             parser, parser_name,
-                             writer, writer_name,
-                             settings, settings_spec,
-                             settings_overrides, config_section,
-                             enable_exit_status):
-    """
-    Set up & run a `Publisher` for custom programmatic use.  Return the
-    encoded string output and the Publisher object.
-
-    Applications should not need to call this function directly.  If it does
-    seem to be necessary to call this function directly, please write to the
-    Docutils-develop mailing list
-    <http://docutils.sf.net/docs/user/mailing-lists.html#docutils-develop>.
-
-    Parameters:
-
-    * `source_class` **required**: The class for dynamically created source
-      objects.  Typically `io.FileInput` or `io.StringInput`.
-
-    * `source`: Type depends on `source_class`:
-
-      - If `source_class` is `io.FileInput`: Either a file-like object
-        (must have 'read' and 'close' methods), or ``None``
-        (`source_path` is opened).  If neither `source` nor
-        `source_path` are supplied, `sys.stdin` is used.
-
-      - If `source_class` is `io.StringInput` **required**: The input
-        string, either an encoded 8-bit string (set the
-        'input_encoding' setting to the correct encoding) or a Unicode
-        string (set the 'input_encoding' setting to 'unicode').
-
-    * `source_path`: Type depends on `source_class`:
-
-      - `io.FileInput`: Path to the input file, opened if no `source`
-        supplied.
-
-      - `io.StringInput`: Optional.  Path to the file or object that produced
-        `source`.  Only used for diagnostic output.
-
-    * `destination_class` **required**: The class for dynamically created
-      destination objects.  Typically `io.FileOutput` or `io.StringOutput`.
-
-    * `destination`: Type depends on `destination_class`:
-
-      - `io.FileOutput`: Either a file-like object (must have 'write' and
-        'close' methods), or ``None`` (`destination_path` is opened).  If
-        neither `destination` nor `destination_path` are supplied,
-        `sys.stdout` is used.
-
-      - `io.StringOutput`: Not used; pass ``None``.
-
-    * `destination_path`: Type depends on `destination_class`:
-
-      - `io.FileOutput`: Path to the output file.  Opened if no `destination`
-        supplied.
-
-      - `io.StringOutput`: Path to the file or object which will receive the
-        output; optional.  Used for determining relative paths (stylesheets,
-        source links, etc.).
-
-    * `reader`: A `docutils.readers.Reader` object.
-
-    * `reader_name`: Name or alias of the Reader class to be instantiated if
-      no `reader` supplied.
-
-    * `parser`: A `docutils.parsers.Parser` object.
-
-    * `parser_name`: Name or alias of the Parser class to be instantiated if
-      no `parser` supplied.
-
-    * `writer`: A `docutils.writers.Writer` object.
-
-    * `writer_name`: Name or alias of the Writer class to be instantiated if
-      no `writer` supplied.
-
-    * `settings`: A runtime settings (`docutils.frontend.Values`) object, for
-      dotted-attribute access to runtime settings.  It's the end result of the
-      `SettingsSpec`, config file, and option processing.  If `settings` is
-      passed, it's assumed to be complete and no further setting/config/option
-      processing is done.
-
-    * `settings_spec`: A `docutils.SettingsSpec` subclass or object.  Provides
-      extra application-specific settings definitions independently of
-      components.  In other words, the application becomes a component, and
-      its settings data is processed along with that of the other components.
-      Used only if no `settings` specified.
-
-    * `settings_overrides`: A dictionary containing application-specific
-      settings defaults that override the defaults of other components.
-      Used only if no `settings` specified.
-
-    * `config_section`: A string, the name of the configuration file section
-      for this application.  Overrides the ``config_section`` attribute
-      defined by `settings_spec`.  Used only if no `settings` specified.
-
-    * `enable_exit_status`: Boolean; enable exit status at end of processing?
-    """
-    pub = Publisher(reader, parser, writer, settings=settings,
-                    source_class=source_class,
-                    destination_class=destination_class)
-    pub.set_components(reader_name, parser_name, writer_name)
-    pub.process_programmatic_settings(
-        settings_spec, settings_overrides, config_section)
-    pub.set_source(source, source_path)
-    pub.set_destination(destination, destination_path)
-    output = pub.publish(enable_exit_status=enable_exit_status)
-    return output, pub
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/examples.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-# $Id: examples.py 4800 2006-11-12 18:02:01Z goodger $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-This module contains practical examples of Docutils client code.
-
-Importing this module from client code is not recommended; its contents are
-subject to change in future Docutils releases.  Instead, it is recommended
-that you copy and paste the parts you need into your own code, modifying as
-necessary.
-"""
-
-from docutils import core, io
-
-
-def html_parts(input_string, source_path=None, destination_path=None,
-               input_encoding='unicode', doctitle=1, initial_header_level=1):
-    """
-    Given an input string, returns a dictionary of HTML document parts.
-
-    Dictionary keys are the names of parts, and values are Unicode strings;
-    encoding is up to the client.
-
-    Parameters:
-
-    - `input_string`: A multi-line text string; required.
-    - `source_path`: Path to the source file or object.  Optional, but useful
-      for diagnostic output (system messages).
-    - `destination_path`: Path to the file or object which will receive the
-      output; optional.  Used for determining relative paths (stylesheets,
-      source links, etc.).
-    - `input_encoding`: The encoding of `input_string`.  If it is an encoded
-      8-bit string, provide the correct encoding.  If it is a Unicode string,
-      use "unicode", the default.
-    - `doctitle`: Disable the promotion of a lone top-level section title to
-      document title (and subsequent section title to document subtitle
-      promotion); enabled by default.
-    - `initial_header_level`: The initial level for header elements (e.g. 1
-      for "<h1>").
-    """
-    overrides = {'input_encoding': input_encoding,
-                 'doctitle_xform': doctitle,
-                 'initial_header_level': initial_header_level}
-    parts = core.publish_parts(
-        source=input_string, source_path=source_path,
-        destination_path=destination_path,
-        writer_name='html', settings_overrides=overrides)
-    return parts
-
-def html_body(input_string, source_path=None, destination_path=None,
-              input_encoding='unicode', output_encoding='unicode',
-              doctitle=1, initial_header_level=1):
-    """
-    Given an input string, returns an HTML fragment as a string.
-
-    The return value is the contents of the <body> element.
-
-    Parameters (see `html_parts()` for the remainder):
-
-    - `output_encoding`: The desired encoding of the output.  If a Unicode
-      string is desired, use the default value of "unicode" .
-    """
-    parts = html_parts(
-        input_string=input_string, source_path=source_path,
-        destination_path=destination_path,
-        input_encoding=input_encoding, doctitle=doctitle,
-        initial_header_level=initial_header_level)
-    fragment = parts['html_body']
-    if output_encoding != 'unicode':
-        fragment = fragment.encode(output_encoding)
-    return fragment
-
-def internals(input_string, source_path=None, destination_path=None,
-              input_encoding='unicode', settings_overrides=None):
-    """
-    Return the document tree and publisher, for exploring Docutils internals.
-
-    Parameters: see `html_parts()`.
-    """
-    if settings_overrides:
-        overrides = settings_overrides.copy()
-    else:
-        overrides = {}
-    overrides['input_encoding'] = input_encoding
-    output, pub = core.publish_programmatically(
-        source_class=io.StringInput, source=input_string,
-        source_path=source_path,
-        destination_class=io.NullOutput, destination=None,
-        destination_path=destination_path,
-        reader=None, reader_name='standalone',
-        parser=None, parser_name='restructuredtext',
-        writer=None, writer_name='null',
-        settings=None, settings_spec=None, settings_overrides=overrides,
-        config_section=None, enable_exit_status=None)
-    return pub.writer.document, pub
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/frontend.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,756 +0,0 @@
-# $Id: frontend.py 4913 2007-02-12 04:05:20Z goodger $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Command-line and common processing for Docutils front-end tools.
-
-Exports the following classes:
-
-* `OptionParser`: Standard Docutils command-line processing.
-* `Option`: Customized version of `optparse.Option`; validation support.
-* `Values`: Runtime settings; objects are simple structs
-  (``object.attribute``).  Supports cumulative list settings (attributes).
-* `ConfigParser`: Standard Docutils config file processing.
-
-Also exports the following functions:
-
-* Option callbacks: `store_multiple`, `read_config_file`.
-* Setting validators: `validate_encoding`,
-  `validate_encoding_error_handler`,
-  `validate_encoding_and_error_handler`, `validate_boolean`,
-  `validate_threshold`, `validate_colon_separated_string_list`,
-  `validate_dependency_file`.
-* `make_paths_absolute`.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import os
-import os.path
-import sys
-import types
-import warnings
-import ConfigParser as CP
-import codecs
-import docutils
-import docutils.utils
-import docutils.nodes
-try:
-    import optparse
-    from optparse import SUPPRESS_HELP
-except ImportError:
-    import optik as optparse
-    from optik import SUPPRESS_HELP
-
-
-def store_multiple(option, opt, value, parser, *args, **kwargs):
-    """
-    Store multiple values in `parser.values`.  (Option callback.)
-
-    Store `None` for each attribute named in `args`, and store the value for
-    each key (attribute name) in `kwargs`.
-    """
-    for attribute in args:
-        setattr(parser.values, attribute, None)
-    for key, value in kwargs.items():
-        setattr(parser.values, key, value)
-
-def read_config_file(option, opt, value, parser):
-    """
-    Read a configuration file during option processing.  (Option callback.)
-    """
-    try:
-        new_settings = parser.get_config_file_settings(value)
-    except ValueError, error:
-        parser.error(error)
-    parser.values.update(new_settings, parser)
-
-def validate_encoding(setting, value, option_parser,
-                      config_parser=None, config_section=None):
-    try:
-        codecs.lookup(value)
-    except LookupError:
-        raise (LookupError('setting "%s": unknown encoding: "%s"'
-                           % (setting, value)),
-               None, sys.exc_info()[2])
-    return value
-
-def validate_encoding_error_handler(setting, value, option_parser,
-                                    config_parser=None, config_section=None):
-    try:
-        codecs.lookup_error(value)
-    except AttributeError:              # prior to Python 2.3
-        if value not in ('strict', 'ignore', 'replace', 'xmlcharrefreplace'):
-            raise (LookupError(
-                'unknown encoding error handler: "%s" (choices: '
-                '"strict", "ignore", "replace", or "xmlcharrefreplace")' % value),
-                   None, sys.exc_info()[2])
-    except LookupError:
-        raise (LookupError(
-            'unknown encoding error handler: "%s" (choices: '
-            '"strict", "ignore", "replace", "backslashreplace", '
-            '"xmlcharrefreplace", and possibly others; see documentation for '
-            'the Python ``codecs`` module)' % value),
-               None, sys.exc_info()[2])
-    return value
-
-def validate_encoding_and_error_handler(
-    setting, value, option_parser, config_parser=None, config_section=None):
-    """
-    Side-effect: if an error handler is included in the value, it is inserted
-    into the appropriate place as if it was a separate setting/option.
-    """
-    if ':' in value:
-        encoding, handler = value.split(':')
-        validate_encoding_error_handler(
-            setting + '_error_handler', handler, option_parser,
-            config_parser, config_section)
-        if config_parser:
-            config_parser.set(config_section, setting + '_error_handler',
-                              handler)
-        else:
-            setattr(option_parser.values, setting + '_error_handler', handler)
-    else:
-        encoding = value
-    validate_encoding(setting, encoding, option_parser,
-                      config_parser, config_section)
-    return encoding
-
-def validate_boolean(setting, value, option_parser,
-                     config_parser=None, config_section=None):
-    if isinstance(value, types.UnicodeType):
-        try:
-            return option_parser.booleans[value.strip().lower()]
-        except KeyError:
-            raise (LookupError('unknown boolean value: "%s"' % value),
-                   None, sys.exc_info()[2])
-    return value
-
-def validate_nonnegative_int(setting, value, option_parser,
-                             config_parser=None, config_section=None):
-    value = int(value)
-    if value < 0:
-        raise ValueError('negative value; must be positive or zero')
-    return value
-
-def validate_threshold(setting, value, option_parser,
-                       config_parser=None, config_section=None):
-    try:
-        return int(value)
-    except ValueError:
-        try:
-            return option_parser.thresholds[value.lower()]
-        except (KeyError, AttributeError):
-            raise (LookupError('unknown threshold: %r.' % value),
-                   None, sys.exc_info[2])
-
-def validate_colon_separated_string_list(
-    setting, value, option_parser, config_parser=None, config_section=None):
-    if isinstance(value, types.UnicodeType):
-        value = value.split(':')
-    else:
-        last = value.pop()
-        value.extend(last.split(':'))
-    return value
-
-def validate_url_trailing_slash(
-    setting, value, option_parser, config_parser=None, config_section=None):
-    if not value:
-        return './'
-    elif value.endswith('/'):
-        return value
-    else:
-        return value + '/'
-
-def validate_dependency_file(setting, value, option_parser,
-                             config_parser=None, config_section=None):
-    try:
-        return docutils.utils.DependencyList(value)
-    except IOError:
-        return docutils.utils.DependencyList(None)
-
-def validate_strip_class(setting, value, option_parser,
-                         config_parser=None, config_section=None):
-    if config_parser:                   # validate all values
-        class_values = value
-    else:                               # just validate the latest value
-        class_values = [value[-1]]
-    for class_value in class_values:
-        normalized = docutils.nodes.make_id(class_value)
-        if class_value != normalized:
-            raise ValueError('invalid class value %r (perhaps %r?)'
-                             % (class_value, normalized))
-    return value
-
-def make_paths_absolute(pathdict, keys, base_path=None):
-    """
-    Interpret filesystem path settings relative to the `base_path` given.
-
-    Paths are values in `pathdict` whose keys are in `keys`.  Get `keys` from
-    `OptionParser.relative_path_settings`.
-    """
-    if base_path is None:
-        base_path = os.getcwd()
-    for key in keys:
-        if pathdict.has_key(key):
-            value = pathdict[key]
-            if isinstance(value, types.ListType):
-                value = [make_one_path_absolute(base_path, path)
-                         for path in value]
-            elif value:
-                value = make_one_path_absolute(base_path, value)
-            pathdict[key] = value
-
-def make_one_path_absolute(base_path, path):
-    return os.path.abspath(os.path.join(base_path, path))
-
-
-class Values(optparse.Values):
-
-    """
-    Updates list attributes by extension rather than by replacement.
-    Works in conjunction with the `OptionParser.lists` instance attribute.
-    """
-
-    def __init__(self, *args, **kwargs):
-        optparse.Values.__init__(self, *args, **kwargs)
-        if (not hasattr(self, 'record_dependencies')
-            or self.record_dependencies is None):
-            # Set up dependency list, in case it is needed.
-            self.record_dependencies = docutils.utils.DependencyList()
-
-    def update(self, other_dict, option_parser):
-        if isinstance(other_dict, Values):
-            other_dict = other_dict.__dict__
-        other_dict = other_dict.copy()
-        for setting in option_parser.lists.keys():
-            if (hasattr(self, setting) and other_dict.has_key(setting)):
-                value = getattr(self, setting)
-                if value:
-                    value += other_dict[setting]
-                    del other_dict[setting]
-        self._update_loose(other_dict)
-
-    def copy(self):
-        """Return a shallow copy of `self`."""
-        return self.__class__(defaults=self.__dict__)
-
-
-class Option(optparse.Option):
-
-    ATTRS = optparse.Option.ATTRS + ['validator', 'overrides']
-
-    def process(self, opt, value, values, parser):
-        """
-        Call the validator function on applicable settings and
-        evaluate the 'overrides' option.
-        Extends `optparse.Option.process`.
-        """
-        result = optparse.Option.process(self, opt, value, values, parser)
-        setting = self.dest
-        if setting:
-            if self.validator:
-                value = getattr(values, setting)
-                try:
-                    new_value = self.validator(setting, value, parser)
-                except Exception, error:
-                    raise (optparse.OptionValueError(
-                        'Error in option "%s":\n    %s: %s'
-                        % (opt, error.__class__.__name__, error)),
-                           None, sys.exc_info()[2])
-                setattr(values, setting, new_value)
-            if self.overrides:
-                setattr(values, self.overrides, None)
-        return result
-
-
-class OptionParser(optparse.OptionParser, docutils.SettingsSpec):
-
-    """
-    Parser for command-line and library use.  The `settings_spec`
-    specification here and in other Docutils components are merged to build
-    the set of command-line options and runtime settings for this process.
-
-    Common settings (defined below) and component-specific settings must not
-    conflict.  Short options are reserved for common settings, and components
-    are restrict to using long options.
-    """
-
-    standard_config_files = [
-        '/etc/docutils.conf',           # system-wide
-        './docutils.conf',              # project-specific
-        '~/.docutils']                  # user-specific
-    """Docutils configuration files, using ConfigParser syntax.  Filenames
-    will be tilde-expanded later.  Later files override earlier ones."""
-
-    threshold_choices = 'info 1 warning 2 error 3 severe 4 none 5'.split()
-    """Possible inputs for for --report and --halt threshold values."""
-
-    thresholds = {'info': 1, 'warning': 2, 'error': 3, 'severe': 4, 'none': 5}
-    """Lookup table for --report and --halt threshold values."""
-
-    booleans={'1': 1, 'on': 1, 'yes': 1, 'true': 1,
-              '0': 0, 'off': 0, 'no': 0, 'false': 0, '': 0}
-    """Lookup table for boolean configuration file settings."""
-
-    if hasattr(codecs, 'backslashreplace_errors'):
-        default_error_encoding_error_handler = 'backslashreplace'
-    else:
-        default_error_encoding_error_handler = 'replace'
-
-    settings_spec = (
-        'General Docutils Options',
-        None,
-        (('Specify the document title as metadata.',
-          ['--title'], {}),
-         ('Include a "Generated by Docutils" credit and link.',
-          ['--generator', '-g'], {'action': 'store_true',
-                                  'validator': validate_boolean}),
-         ('Do not include a generator credit.',
-          ['--no-generator'], {'action': 'store_false', 'dest': 'generator'}),
-         ('Include the date at the end of the document (UTC).',
-          ['--date', '-d'], {'action': 'store_const', 'const': '%Y-%m-%d',
-                             'dest': 'datestamp'}),
-         ('Include the time & date (UTC).',
-          ['--time', '-t'], {'action': 'store_const',
-                             'const': '%Y-%m-%d %H:%M UTC',
-                             'dest': 'datestamp'}),
-         ('Do not include a datestamp of any kind.',
-          ['--no-datestamp'], {'action': 'store_const', 'const': None,
-                               'dest': 'datestamp'}),
-         ('Include a "View document source" link.',
-          ['--source-link', '-s'], {'action': 'store_true',
-                                    'validator': validate_boolean}),
-         ('Use <URL> for a source link; implies --source-link.',
-          ['--source-url'], {'metavar': '<URL>'}),
-         ('Do not include a "View document source" link.',
-          ['--no-source-link'],
-          {'action': 'callback', 'callback': store_multiple,
-           'callback_args': ('source_link', 'source_url')}),
-         ('Link from section headers to TOC entries.  (default)',
-          ['--toc-entry-backlinks'],
-          {'dest': 'toc_backlinks', 'action': 'store_const', 'const': 'entry',
-           'default': 'entry'}),
-         ('Link from section headers to the top of the TOC.',
-          ['--toc-top-backlinks'],
-          {'dest': 'toc_backlinks', 'action': 'store_const', 'const': 'top'}),
-         ('Disable backlinks to the table of contents.',
-          ['--no-toc-backlinks'],
-          {'dest': 'toc_backlinks', 'action': 'store_false'}),
-         ('Link from footnotes/citations to references. (default)',
-          ['--footnote-backlinks'],
-          {'action': 'store_true', 'default': 1,
-           'validator': validate_boolean}),
-         ('Disable backlinks from footnotes and citations.',
-          ['--no-footnote-backlinks'],
-          {'dest': 'footnote_backlinks', 'action': 'store_false'}),
-         ('Enable section numbering.  (default)',
-          ['--section-numbering'],
-          {'action': 'store_true', 'dest': 'sectnum_xform',
-           'default': 1, 'validator': validate_boolean}),
-         ('Disable section numbering.',
-          ['--no-section-numbering'],
-          {'action': 'store_false', 'dest': 'sectnum_xform'}),
-         ('Remove comment elements from the document tree.',
-          ['--strip-comments'],
-          {'action': 'store_true', 'validator': validate_boolean}),
-         ('Leave comment elements in the document tree. (default)',
-          ['--leave-comments'],
-          {'action': 'store_false', 'dest': 'strip_comments'}),
-         ('Remove all elements with classes="<class>" from the document tree. '
-          '(Multiple-use option.)',
-          ['--strip-elements-with-class'],
-          {'action': 'append', 'dest': 'strip_elements_with_classes',
-           'metavar': '<class>', 'validator': validate_strip_class}),
-         ('Remove all classes="<class>" attributes from elements in the '
-          'document tree. (Multiple-use option.)',
-          ['--strip-class'],
-          {'action': 'append', 'dest': 'strip_classes',
-           'metavar': '<class>', 'validator': validate_strip_class}),
-         ('Report system messages at or higher than <level>: "info" or "1", '
-          '"warning"/"2" (default), "error"/"3", "severe"/"4", "none"/"5"',
-          ['--report', '-r'], {'choices': threshold_choices, 'default': 2,
-                               'dest': 'report_level', 'metavar': '<level>',
-                               'validator': validate_threshold}),
-         ('Report all system messages.  (Same as "--report=1".)',
-          ['--verbose', '-v'], {'action': 'store_const', 'const': 1,
-                                'dest': 'report_level'}),
-         ('Report no system messages.  (Same as "--report=5".)',
-          ['--quiet', '-q'], {'action': 'store_const', 'const': 5,
-                              'dest': 'report_level'}),
-         ('Halt execution at system messages at or above <level>.  '
-          'Levels as in --report.  Default: 4 (severe).',
-          ['--halt'], {'choices': threshold_choices, 'dest': 'halt_level',
-                       'default': 4, 'metavar': '<level>',
-                       'validator': validate_threshold}),
-         ('Halt at the slightest problem.  Same as "--halt=info".',
-          ['--strict'], {'action': 'store_const', 'const': 'info',
-                         'dest': 'halt_level'}),
-         ('Enable a non-zero exit status for non-halting system messages at '
-          'or above <level>.  Default: 5 (disabled).',
-          ['--exit-status'], {'choices': threshold_choices,
-                              'dest': 'exit_status_level',
-                              'default': 5, 'metavar': '<level>',
-                              'validator': validate_threshold}),
-         ('Enable debug-level system messages and diagnostics.',
-          ['--debug'], {'action': 'store_true', 'validator': validate_boolean}),
-         ('Disable debug output.  (default)',
-          ['--no-debug'], {'action': 'store_false', 'dest': 'debug'}),
-         ('Send the output of system messages to <file>.',
-          ['--warnings'], {'dest': 'warning_stream', 'metavar': '<file>'}),
-         ('Enable Python tracebacks when Docutils is halted.',
-          ['--traceback'], {'action': 'store_true', 'default': None,
-                            'validator': validate_boolean}),
-         ('Disable Python tracebacks.  (default)',
-          ['--no-traceback'], {'dest': 'traceback', 'action': 'store_false'}),
-         ('Specify the encoding and optionally the '
-          'error handler of input text.  Default: <locale-dependent>:strict.',
-          ['--input-encoding', '-i'],
-          {'metavar': '<name[:handler]>',
-           'validator': validate_encoding_and_error_handler}),
-         ('Specify the error handler for undecodable characters.  '
-          'Choices: "strict" (default), "ignore", and "replace".',
-          ['--input-encoding-error-handler'],
-          {'default': 'strict', 'validator': validate_encoding_error_handler}),
-         ('Specify the text encoding and optionally the error handler for '
-          'output.  Default: UTF-8:strict.',
-          ['--output-encoding', '-o'],
-          {'metavar': '<name[:handler]>', 'default': 'utf-8',
-           'validator': validate_encoding_and_error_handler}),
-         ('Specify error handler for unencodable output characters; '
-          '"strict" (default), "ignore", "replace", '
-          '"xmlcharrefreplace", "backslashreplace" (Python 2.3+).',
-          ['--output-encoding-error-handler'],
-          {'default': 'strict', 'validator': validate_encoding_error_handler}),
-         ('Specify text encoding and error handler for error output.  '
-          'Default: ASCII:%s.'
-          % default_error_encoding_error_handler,
-          ['--error-encoding', '-e'],
-          {'metavar': '<name[:handler]>', 'default': 'ascii',
-           'validator': validate_encoding_and_error_handler}),
-         ('Specify the error handler for unencodable characters in '
-          'error output.  Default: %s.'
-          % default_error_encoding_error_handler,
-          ['--error-encoding-error-handler'],
-          {'default': default_error_encoding_error_handler,
-           'validator': validate_encoding_error_handler}),
-         ('Specify the language (as 2-letter code).  Default: en.',
-          ['--language', '-l'], {'dest': 'language_code', 'default': 'en',
-                                 'metavar': '<name>'}),
-         ('Write output file dependencies to <file>.',
-          ['--record-dependencies'],
-          {'metavar': '<file>', 'validator': validate_dependency_file,
-           'default': None}),           # default set in Values class
-         ('Read configuration settings from <file>, if it exists.',
-          ['--config'], {'metavar': '<file>', 'type': 'string',
-                         'action': 'callback', 'callback': read_config_file}),
-         ("Show this program's version number and exit.",
-          ['--version', '-V'], {'action': 'version'}),
-         ('Show this help message and exit.',
-          ['--help', '-h'], {'action': 'help'}),
-         # Typically not useful for non-programmatical use:
-         (SUPPRESS_HELP, ['--id-prefix'], {'default': ''}),
-         (SUPPRESS_HELP, ['--auto-id-prefix'], {'default': 'id'}),
-         # Hidden options, for development use only:
-         (SUPPRESS_HELP, ['--dump-settings'], {'action': 'store_true'}),
-         (SUPPRESS_HELP, ['--dump-internals'], {'action': 'store_true'}),
-         (SUPPRESS_HELP, ['--dump-transforms'], {'action': 'store_true'}),
-         (SUPPRESS_HELP, ['--dump-pseudo-xml'], {'action': 'store_true'}),
-         (SUPPRESS_HELP, ['--expose-internal-attribute'],
-          {'action': 'append', 'dest': 'expose_internals',
-           'validator': validate_colon_separated_string_list}),
-         (SUPPRESS_HELP, ['--strict-visitor'], {'action': 'store_true'}),
-         ))
-    """Runtime settings and command-line options common to all Docutils front
-    ends.  Setting specs specific to individual Docutils components are also
-    used (see `populate_from_components()`)."""
-
-    settings_defaults = {'_disable_config': None,
-                         '_source': None,
-                         '_destination': None,
-                         '_config_files': None}
-    """Defaults for settings that don't have command-line option equivalents."""
-
-    relative_path_settings = ('warning_stream',)
-
-    config_section = 'general'
-
-    version_template = ('%%prog (Docutils %s [%s])'
-                        % (docutils.__version__, docutils.__version_details__))
-    """Default version message."""
-
-    def __init__(self, components=(), defaults=None, read_config_files=None,
-                 *args, **kwargs):
-        """
-        `components` is a list of Docutils components each containing a
-        ``.settings_spec`` attribute.  `defaults` is a mapping of setting
-        default overrides.
-        """
-
-        self.lists = {}
-        """Set of list-type settings."""
-
-        self.config_files = []
-        """List of paths of applied configuration files."""
-
-        optparse.OptionParser.__init__(
-            self, option_class=Option, add_help_option=None,
-            formatter=optparse.TitledHelpFormatter(width=78),
-            *args, **kwargs)
-        if not self.version:
-            self.version = self.version_template
-        # Make an instance copy (it will be modified):
-        self.relative_path_settings = list(self.relative_path_settings)
-        self.components = (self,) + tuple(components)
-        self.populate_from_components(self.components)
-        self.set_defaults_from_dict(defaults or {})
-        if read_config_files and not self.defaults['_disable_config']:
-            try:
-                config_settings = self.get_standard_config_settings()
-            except ValueError, error:
-                self.error(error)
-            self.set_defaults_from_dict(config_settings.__dict__)
-
-    def populate_from_components(self, components):
-        """
-        For each component, first populate from the `SettingsSpec.settings_spec`
-        structure, then from the `SettingsSpec.settings_defaults` dictionary.
-        After all components have been processed, check for and populate from
-        each component's `SettingsSpec.settings_default_overrides` dictionary.
-        """
-        for component in components:
-            if component is None:
-                continue
-            settings_spec = component.settings_spec
-            self.relative_path_settings.extend(
-                component.relative_path_settings)
-            for i in range(0, len(settings_spec), 3):
-                title, description, option_spec = settings_spec[i:i+3]
-                if title:
-                    group = optparse.OptionGroup(self, title, description)
-                    self.add_option_group(group)
-                else:
-                    group = self        # single options
-                for (help_text, option_strings, kwargs) in option_spec:
-                    option = group.add_option(help=help_text, *option_strings,
-                                              **kwargs)
-                    if kwargs.get('action') == 'append':
-                        self.lists[option.dest] = 1
-                if component.settings_defaults:
-                    self.defaults.update(component.settings_defaults)
-        for component in components:
-            if component and component.settings_default_overrides:
-                self.defaults.update(component.settings_default_overrides)
-
-    def get_standard_config_files(self):
-        """Return list of config files, from environment or standard."""
-        try:
-            config_files = os.environ['DOCUTILSCONFIG'].split(os.pathsep)
-        except KeyError:
-            config_files = self.standard_config_files
-
-        # If 'HOME' is not set, expandvars() requires the 'pwd' module which is
-        # not available under certain environments, for example, within
-        # mod_python.  The publisher ends up in here, and we need to publish
-        # from within mod_python.  Therefore we need to avoid expanding when we
-        # are in those environments.
-        expand = os.path.expanduser
-        if 'HOME' not in os.environ:
-            try:
-                import pwd
-            except ImportError:
-                expand = lambda x: x
-        return [expand(f) for f in config_files if f.strip()]
-
-    def get_standard_config_settings(self):
-        settings = Values()
-        for filename in self.get_standard_config_files():
-            settings.update(self.get_config_file_settings(filename), self)
-        return settings
-
-    def get_config_file_settings(self, config_file):
-        """Returns a dictionary containing appropriate config file settings."""
-        parser = ConfigParser()
-        parser.read(config_file, self)
-        self.config_files.extend(parser._files)
-        base_path = os.path.dirname(config_file)
-        applied = {}
-        settings = Values()
-        for component in self.components:
-            if not component:
-                continue
-            for section in (tuple(component.config_section_dependencies or ())
-                            + (component.config_section,)):
-                if applied.has_key(section):
-                    continue
-                applied[section] = 1
-                settings.update(parser.get_section(section), self)
-        make_paths_absolute(
-            settings.__dict__, self.relative_path_settings, base_path)
-        return settings.__dict__
-
-    def check_values(self, values, args):
-        """Store positional arguments as runtime settings."""
-        values._source, values._destination = self.check_args(args)
-        make_paths_absolute(values.__dict__, self.relative_path_settings,
-                            os.getcwd())
-        values._config_files = self.config_files
-        return values
-
-    def check_args(self, args):
-        source = destination = None
-        if args:
-            source = args.pop(0)
-            if source == '-':           # means stdin
-                source = None
-        if args:
-            destination = args.pop(0)
-            if destination == '-':      # means stdout
-                destination = None
-        if args:
-            self.error('Maximum 2 arguments allowed.')
-        if source and source == destination:
-            self.error('Do not specify the same file for both source and '
-                       'destination.  It will clobber the source file.')
-        return source, destination
-
-    def set_defaults_from_dict(self, defaults):
-        self.defaults.update(defaults)
-
-    def get_default_values(self):
-        """Needed to get custom `Values` instances."""
-        defaults = Values(self.defaults)
-        defaults._config_files = self.config_files
-        return defaults
-
-    def get_option_by_dest(self, dest):
-        """
-        Get an option by its dest.
-
-        If you're supplying a dest which is shared by several options,
-        it is undefined which option of those is returned.
-
-        A KeyError is raised if there is no option with the supplied
-        dest.
-        """
-        for group in self.option_groups + [self]:
-            for option in group.option_list:
-                if option.dest == dest:
-                    return option
-        raise KeyError('No option with dest == %r.' % dest)
-
-
-class ConfigParser(CP.ConfigParser):
-
-    old_settings = {
-        'pep_stylesheet': ('pep_html writer', 'stylesheet'),
-        'pep_stylesheet_path': ('pep_html writer', 'stylesheet_path'),
-        'pep_template': ('pep_html writer', 'template')}
-    """{old setting: (new section, new setting)} mapping, used by
-    `handle_old_config`, to convert settings from the old [options] section."""
-
-    old_warning = """
-The "[option]" section is deprecated.  Support for old-format configuration
-files may be removed in a future Docutils release.  Please revise your
-configuration files.  See <http://docutils.sf.net/docs/user/config.html>,
-section "Old-Format Configuration Files".
-"""
-
-    not_utf8_error = """\
-Unable to read configuration file "%s": content not encoded as UTF-8.
-Skipping "%s" configuration file.
-"""
-
-    def __init__(self, *args, **kwargs):
-        CP.ConfigParser.__init__(self, *args, **kwargs)
-
-        self._files = []
-        """List of paths of configuration files read."""
-
-    def read(self, filenames, option_parser):
-        if type(filenames) in (types.StringType, types.UnicodeType):
-            filenames = [filenames]
-        for filename in filenames:
-            try:
-                # Config files must be UTF-8-encoded:
-                fp = codecs.open(filename, 'r', 'utf-8')
-            except IOError:
-                continue
-            try:
-                CP.ConfigParser.readfp(self, fp, filename)
-            except UnicodeDecodeError:
-                sys.stderr.write(self.not_utf8_error % (filename, filename))
-                fp.close()
-                continue
-            fp.close()
-            self._files.append(filename)
-            if self.has_section('options'):
-                self.handle_old_config(filename)
-            self.validate_settings(filename, option_parser)
-
-    def handle_old_config(self, filename):
-        warnings.warn_explicit(self.old_warning, ConfigDeprecationWarning,
-                               filename, 0)
-        options = self.get_section('options')
-        if not self.has_section('general'):
-            self.add_section('general')
-        for key, value in options.items():
-            if self.old_settings.has_key(key):
-                section, setting = self.old_settings[key]
-                if not self.has_section(section):
-                    self.add_section(section)
-            else:
-                section = 'general'
-                setting = key
-            if not self.has_option(section, setting):
-                self.set(section, setting, value)
-        self.remove_section('options')
-
-    def validate_settings(self, filename, option_parser):
-        """
-        Call the validator function and implement overrides on all applicable
-        settings.
-        """
-        for section in self.sections():
-            for setting in self.options(section):
-                try:
-                    option = option_parser.get_option_by_dest(setting)
-                except KeyError:
-                    continue
-                if option.validator:
-                    value = self.get(section, setting, raw=1)
-                    try:
-                        new_value = option.validator(
-                            setting, value, option_parser,
-                            config_parser=self, config_section=section)
-                    except Exception, error:
-                        raise (ValueError(
-                            'Error in config file "%s", section "[%s]":\n'
-                            '    %s: %s\n        %s = %s'
-                            % (filename, section, error.__class__.__name__,
-                               error, setting, value)), None, sys.exc_info()[2])
-                    self.set(section, setting, new_value)
-                if option.overrides:
-                    self.set(section, option.overrides, None)
-
-    def optionxform(self, optionstr):
-        """
-        Transform '-' to '_' so the cmdline form of option names can be used.
-        """
-        return optionstr.lower().replace('-', '_')
-
-    def get_section(self, section):
-        """
-        Return a given section as a dictionary (empty if the section
-        doesn't exist).
-        """
-        section_dict = {}
-        if self.has_section(section):
-            for option in self.options(section):
-                section_dict[option] = self.get(section, option, raw=1)
-        return section_dict
-
-
-class ConfigDeprecationWarning(DeprecationWarning):
-    """Warning for deprecated configuration file features."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/io.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,412 +0,0 @@
-# $Id: io.py 4750 2006-09-16 21:32:29Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-I/O classes provide a uniform API for low-level input and output.  Subclasses
-will exist for a variety of input/output mechanisms.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import sys
-try:
-    import locale
-except:
-    pass
-import re
-from types import UnicodeType
-from docutils import TransformSpec
-
-
-class Input(TransformSpec):
-
-    """
-    Abstract base class for input wrappers.
-    """
-
-    component_type = 'input'
-
-    default_source_path = None
-
-    def __init__(self, source=None, source_path=None, encoding=None,
-                 error_handler='strict'):
-        self.encoding = encoding
-        """Text encoding for the input source."""
-
-        self.error_handler = error_handler
-        """Text decoding error handler."""
-
-        self.source = source
-        """The source of input data."""
-
-        self.source_path = source_path
-        """A text reference to the source."""
-
-        if not source_path:
-            self.source_path = self.default_source_path
-
-        self.successful_encoding = None
-        """The encoding that successfully decoded the source data."""
-
-    def __repr__(self):
-        return '%s: source=%r, source_path=%r' % (self.__class__, self.source,
-                                                  self.source_path)
-
-    def read(self):
-        raise NotImplementedError
-
-    def decode(self, data):
-        """
-        Decode a string, `data`, heuristically.
-        Raise UnicodeError if unsuccessful.
-
-        The client application should call ``locale.setlocale`` at the
-        beginning of processing::
-
-            locale.setlocale(locale.LC_ALL, '')
-        """
-        if self.encoding and self.encoding.lower() == 'unicode':
-            assert isinstance(data, UnicodeType), (
-                'input encoding is "unicode" '
-                'but input is not a unicode object')
-        if isinstance(data, UnicodeType):
-            # Accept unicode even if self.encoding != 'unicode'.
-            return data
-        if self.encoding:
-            # We believe the user/application when the encoding is
-            # explicitly given.
-            encodings = [self.encoding]
-        else:
-            data_encoding = self.determine_encoding_from_data(data)
-            if data_encoding:
-                # If the data declares its encoding (explicitly or via a BOM),
-                # we believe it.
-                encodings = [data_encoding]
-            else:
-                # Apply heuristics only if no encoding is explicitly given and
-                # no BOM found.  Start with UTF-8, because that only matches
-                # data that *IS* UTF-8:
-                encodings = ['utf-8']
-                try:
-                    # for Python 2.2 compatibility
-                    encodings.append(locale.nl_langinfo(locale.CODESET))
-                except:
-                    pass
-                try:
-                    encodings.append(locale.getlocale()[1])
-                except:
-                    pass
-                try:
-                    encodings.append(locale.getdefaultlocale()[1])
-                except:
-                    pass
-                # fallback encoding:
-                encodings.append('latin-1')
-        error = None
-        error_details = ''
-        for enc in encodings:
-            if not enc:
-                continue
-            try:
-                decoded = unicode(data, enc, self.error_handler)
-                self.successful_encoding = enc
-                # Return decoded, removing BOMs.
-                return decoded.replace(u'\ufeff', u'')
-            except (UnicodeError, LookupError), error:
-                pass
-        if error is not None:
-            error_details = '\n(%s: %s)' % (error.__class__.__name__, error)
-        raise UnicodeError(
-            'Unable to decode input data.  Tried the following encodings: '
-            '%s.%s'
-            % (', '.join([repr(enc) for enc in encodings if enc]),
-               error_details))
-
-    coding_slug = re.compile("coding[:=]\s*([-\w.]+)")
-    """Encoding declaration pattern."""
-
-    byte_order_marks = (('\xef\xbb\xbf', 'utf-8'),
-                        ('\xfe\xff', 'utf-16-be'),
-                        ('\xff\xfe', 'utf-16-le'),)
-    """Sequence of (start_bytes, encoding) tuples to for encoding detection.
-    The first bytes of input data are checked against the start_bytes strings.
-    A match indicates the given encoding."""
-
-    def determine_encoding_from_data(self, data):
-        """
-        Try to determine the encoding of `data` by looking *in* `data`.
-        Check for a byte order mark (BOM) or an encoding declaration.
-        """
-        # check for a byte order mark:
-        for start_bytes, encoding in self.byte_order_marks:
-            if data.startswith(start_bytes):
-                return encoding
-        # check for an encoding declaration pattern in first 2 lines of file:
-        for line in data.splitlines()[:2]:
-            match = self.coding_slug.search(line)
-            if match:
-                return match.group(1)
-        return None
-
-
-class Output(TransformSpec):
-
-    """
-    Abstract base class for output wrappers.
-    """
-
-    component_type = 'output'
-
-    default_destination_path = None
-
-    def __init__(self, destination=None, destination_path=None,
-                 encoding=None, error_handler='strict'):
-        self.encoding = encoding
-        """Text encoding for the output destination."""
-
-        self.error_handler = error_handler or 'strict'
-        """Text encoding error handler."""
-
-        self.destination = destination
-        """The destination for output data."""
-
-        self.destination_path = destination_path
-        """A text reference to the destination."""
-
-        if not destination_path:
-            self.destination_path = self.default_destination_path
-
-    def __repr__(self):
-        return ('%s: destination=%r, destination_path=%r'
-                % (self.__class__, self.destination, self.destination_path))
-
-    def write(self, data):
-        """`data` is a Unicode string, to be encoded by `self.encode`."""
-        raise NotImplementedError
-
-    def encode(self, data):
-        if self.encoding and self.encoding.lower() == 'unicode':
-            assert isinstance(data, UnicodeType), (
-                'the encoding given is "unicode" but the output is not '
-                'a Unicode string')
-            return data
-        if not isinstance(data, UnicodeType):
-            # Non-unicode (e.g. binary) output.
-            return data
-        else:
-            try:
-                return data.encode(self.encoding, self.error_handler)
-            except (LookupError, ValueError):
-                # LookupError is raised if there are unencodable chars
-                # in data and the error_handler isn't found. In old
-                # Python versions, ValueError is raised.
-                if self.error_handler == 'xmlcharrefreplace':
-                    # We are using xmlcharrefreplace with a Python
-                    # version that doesn't support it (2.1, 2.2, or
-                    # IronPython 1.0) so we emulate its behavior.
-                    return ''.join([self.xmlcharref_encode(char)
-                                    for char in data])
-                else:
-                    raise
-
-    def xmlcharref_encode(self, char):
-        """Emulate Python 2.3's 'xmlcharrefreplace' encoding error handler."""
-        try:
-            return char.encode(self.encoding, 'strict')
-        except UnicodeError:
-            return '&#%i;' % ord(char)
-
-
-class FileInput(Input):
-
-    """
-    Input for single, simple file-like objects.
-    """
-
-    def __init__(self, source=None, source_path=None,
-                 encoding=None, error_handler='strict',
-                 autoclose=1, handle_io_errors=1):
-        """
-        :Parameters:
-            - `source`: either a file-like object (which is read directly), or
-              `None` (which implies `sys.stdin` if no `source_path` given).
-            - `source_path`: a path to a file, which is opened and then read.
-            - `encoding`: the expected text encoding of the input file.
-            - `error_handler`: the encoding error handler to use.
-            - `autoclose`: close automatically after read (boolean); always
-              false if `sys.stdin` is the source.
-            - `handle_io_errors`: summarize I/O errors here, and exit?
-        """
-        Input.__init__(self, source, source_path, encoding, error_handler)
-        self.autoclose = autoclose
-        self.handle_io_errors = handle_io_errors
-        if source is None:
-            if source_path:
-                try:
-                    self.source = open(source_path)
-                except IOError, error:
-                    if not handle_io_errors:
-                        raise
-                    print >>sys.stderr, '%s: %s' % (error.__class__.__name__,
-                                                    error)
-                    print >>sys.stderr, (
-                        'Unable to open source file for reading (%r).  Exiting.'
-                        % source_path)
-                    sys.exit(1)
-            else:
-                self.source = sys.stdin
-                self.autoclose = None
-        if not source_path:
-            try:
-                self.source_path = self.source.name
-            except AttributeError:
-                pass
-
-    def read(self):
-        """
-        Read and decode a single file and return the data (Unicode string).
-        """
-        try:
-            data = self.source.read()
-        finally:
-            if self.autoclose:
-                self.close()
-        return self.decode(data)
-
-    def close(self):
-        self.source.close()
-
-
-class FileOutput(Output):
-
-    """
-    Output for single, simple file-like objects.
-    """
-
-    def __init__(self, destination=None, destination_path=None,
-                 encoding=None, error_handler='strict', autoclose=1,
-                 handle_io_errors=1):
-        """
-        :Parameters:
-            - `destination`: either a file-like object (which is written
-              directly) or `None` (which implies `sys.stdout` if no
-              `destination_path` given).
-            - `destination_path`: a path to a file, which is opened and then
-              written.
-            - `autoclose`: close automatically after write (boolean); always
-              false if `sys.stdout` is the destination.
-        """
-        Output.__init__(self, destination, destination_path,
-                        encoding, error_handler)
-        self.opened = 1
-        self.autoclose = autoclose
-        self.handle_io_errors = handle_io_errors
-        if destination is None:
-            if destination_path:
-                self.opened = None
-            else:
-                self.destination = sys.stdout
-                self.autoclose = None
-        if not destination_path:
-            try:
-                self.destination_path = self.destination.name
-            except AttributeError:
-                pass
-
-    def open(self):
-        try:
-            self.destination = open(self.destination_path, 'w')
-        except IOError, error:
-            if not self.handle_io_errors:
-                raise
-            print >>sys.stderr, '%s: %s' % (error.__class__.__name__,
-                                            error)
-            print >>sys.stderr, ('Unable to open destination file for writing '
-                                 '(%r).  Exiting.' % self.destination_path)
-            sys.exit(1)
-        self.opened = 1
-
-    def write(self, data):
-        """Encode `data`, write it to a single file, and return it."""
-        output = self.encode(data)
-        if not self.opened:
-            self.open()
-        try:
-            self.destination.write(output)
-        finally:
-            if self.autoclose:
-                self.close()
-        return output
-
-    def close(self):
-        self.destination.close()
-        self.opened = None
-
-
-class StringInput(Input):
-
-    """
-    Direct string input.
-    """
-
-    default_source_path = '<string>'
-
-    def read(self):
-        """Decode and return the source string."""
-        return self.decode(self.source)
-
-
-class StringOutput(Output):
-
-    """
-    Direct string output.
-    """
-
-    default_destination_path = '<string>'
-
-    def write(self, data):
-        """Encode `data`, store it in `self.destination`, and return it."""
-        self.destination = self.encode(data)
-        return self.destination
-
-
-class NullInput(Input):
-
-    """
-    Degenerate input: read nothing.
-    """
-
-    default_source_path = 'null input'
-
-    def read(self):
-        """Return a null string."""
-        return u''
-
-
-class NullOutput(Output):
-
-    """
-    Degenerate output: write nothing.
-    """
-
-    default_destination_path = 'null output'
-
-    def write(self, data):
-        """Do nothing ([don't even] send data to the bit bucket)."""
-        pass
-
-
-class DocTreeInput(Input):
-
-    """
-    Adapter for document tree input.
-
-    The document tree must be passed in the ``source`` parameter.
-    """
-
-    default_source_path = 'doctree input'
-
-    def read(self):
-        """Return the document tree."""
-        return self.source
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-# Internationalization details are documented in
-# <http://docutils.sf.net/docs/howto/i18n.html>.
-
-"""
-This package contains modules for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-_languages = {}
-
-def get_language(language_code):
-    if _languages.has_key(language_code):
-        return _languages[language_code]
-    module = __import__(language_code, globals(), locals())
-    _languages[language_code] = module
-    return module
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/af.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-# $Id: af.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Jannie Hofmeyr <jhsh@sun.ac.za>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Afrikaans-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      'author': 'Auteur',
-      'authors': 'Auteurs',
-      'organization': 'Organisasie',
-      'address': 'Adres',
-      'contact': 'Kontak',
-      'version': 'Weergawe',
-      'revision': 'Revisie',
-      'status': 'Status',
-      'date': 'Datum',
-      'copyright': 'Kopiereg',
-      'dedication': 'Opdrag',
-      'abstract': 'Opsomming',
-      'attention': 'Aandag!',
-      'caution': 'Wees versigtig!',
-      'danger': '!GEVAAR!',
-      'error': 'Fout',
-      'hint': 'Wenk',
-      'important': 'Belangrik',
-      'note': 'Nota',
-      'tip': 'Tip', # hint and tip both have the same translation: wenk
-      'warning': 'Waarskuwing',
-      'contents': 'Inhoud'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      'auteur': 'author',
-      'auteurs': 'authors',
-      'organisasie': 'organization',
-      'adres': 'address',
-      'kontak': 'contact',
-      'weergawe': 'version',
-      'revisie': 'revision',
-      'status': 'status',
-      'datum': 'date',
-      'kopiereg': 'copyright',
-      'opdrag': 'dedication',
-      'opsomming': 'abstract'}
-"""Afrikaans (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/ca.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-# $Id: ca.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Ivan Vilata i Balaguer <ivan@selidor.net>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Catalan-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      # fixed: language-dependent
-      'author': u'Autor',
-      'authors': u'Autors',
-      'organization': u'Organitzaci\u00F3',
-      'address': u'Adre\u00E7a',
-      'contact': u'Contacte',
-      'version': u'Versi\u00F3',
-      'revision': u'Revisi\u00F3',
-      'status': u'Estat',
-      'date': u'Data',
-      'copyright': u'Copyright',
-      'dedication': u'Dedicat\u00F2ria',
-      'abstract': u'Resum',
-      'attention': u'Atenci\u00F3!',
-      'caution': u'Compte!',
-      'danger': u'PERILL!',
-      'error': u'Error',
-      'hint': u'Suggeriment',
-      'important': u'Important',
-      'note': u'Nota',
-      'tip': u'Consell',
-      'warning': u'Av\u00EDs',
-      'contents': u'Contingut'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      # language-dependent: fixed
-      u'autor': 'author',
-      u'autors': 'authors',
-      u'organitzaci\u00F3': 'organization',
-      u'adre\u00E7a': 'address',
-      u'contacte': 'contact',
-      u'versi\u00F3': 'version',
-      u'revisi\u00F3': 'revision',
-      u'estat': 'status',
-      u'data': 'date',
-      u'copyright': 'copyright',
-      u'dedicat\u00F2ria': 'dedication',
-      u'resum': 'abstract'}
-"""Catalan (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/cs.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-# $Id: cs.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Marek Blaha <mb@dat.cz>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Czech-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      # fixed: language-dependent
-      'author': u'Autor',
-      'authors': u'Auto\u0159i',
-      'organization': u'Organizace',
-      'address': u'Adresa',
-      'contact': u'Kontakt',
-      'version': u'Verze',
-      'revision': u'Revize',
-      'status': u'Stav',
-      'date': u'Datum',
-      'copyright': u'Copyright',
-      'dedication': u'V\u011Bnov\u00E1n\u00ED',
-      'abstract': u'Abstrakt',
-      'attention': u'Pozor!',
-      'caution': u'Opatrn\u011B!',
-      'danger': u'!NEBEZPE\u010C\u00CD!',
-      'error': u'Chyba',
-      'hint': u'Rada',
-      'important': u'D\u016Fle\u017Eit\u00E9',
-      'note': u'Pozn\u00E1mka',
-      'tip': u'Tip',
-      'warning': u'Varov\u00E1n\u00ED',
-      'contents': u'Obsah'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      # language-dependent: fixed
-      u'autor': 'author',
-      u'auto\u0159i': 'authors',
-      u'organizace': 'organization',
-      u'adresa': 'address',
-      u'kontakt': 'contact',
-      u'verze': 'version',
-      u'revize': 'revision',
-      u'stav': 'status',
-      u'datum': 'date',
-      u'copyright': 'copyright',
-      u'v\u011Bnov\u00E1n\u00ED': 'dedication',
-      u'abstrakt': 'abstract'}
-"""Czech (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/de.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-# $Id: de.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Gunnar Schwant <g.schwant@gmx.de>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-German language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-    'author': 'Autor',
-    'authors': 'Autoren',
-    'organization': 'Organisation',
-    'address': 'Adresse',
-    'contact': 'Kontakt',
-    'version': 'Version',
-    'revision': 'Revision',
-    'status': 'Status',
-    'date': 'Datum',
-    'dedication': 'Widmung',
-    'copyright': 'Copyright',
-    'abstract': 'Zusammenfassung',
-    'attention': 'Achtung!',
-    'caution': 'Vorsicht!',
-    'danger': '!GEFAHR!',
-    'error': 'Fehler',
-    'hint': 'Hinweis',
-    'important': 'Wichtig',
-    'note': 'Bemerkung',
-    'tip': 'Tipp',
-    'warning': 'Warnung',
-    'contents': 'Inhalt'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-    'autor': 'author',
-    'autoren': 'authors',
-    'organisation': 'organization',
-    'adresse': 'address',
-    'kontakt': 'contact',
-    'version': 'version',
-    'revision': 'revision',
-    'status': 'status',
-    'datum': 'date',
-    'copyright': 'copyright',
-    'widmung': 'dedication',
-    'zusammenfassung': 'abstract'}
-"""German (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/en.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-# $Id: en.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-English-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      # fixed: language-dependent
-      'author': 'Author',
-      'authors': 'Authors',
-      'organization': 'Organization',
-      'address': 'Address',
-      'contact': 'Contact',
-      'version': 'Version',
-      'revision': 'Revision',
-      'status': 'Status',
-      'date': 'Date',
-      'copyright': 'Copyright',
-      'dedication': 'Dedication',
-      'abstract': 'Abstract',
-      'attention': 'Attention!',
-      'caution': 'Caution!',
-      'danger': '!DANGER!',
-      'error': 'Error',
-      'hint': 'Hint',
-      'important': 'Important',
-      'note': 'Note',
-      'tip': 'Tip',
-      'warning': 'Warning',
-      'contents': 'Contents'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      # language-dependent: fixed
-      'author': 'author',
-      'authors': 'authors',
-      'organization': 'organization',
-      'address': 'address',
-      'contact': 'contact',
-      'version': 'version',
-      'revision': 'revision',
-      'status': 'status',
-      'date': 'date',
-      'copyright': 'copyright',
-      'dedication': 'dedication',
-      'abstract': 'abstract'}
-"""English (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/eo.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-# $Id: eo.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Marcelo Huerta San Martin <richieadler@users.sourceforge.net>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Esperanto-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      # fixed: language-dependent
-      'author': u'A\u016dtoro',
-      'authors': u'A\u016dtoroj',
-      'organization': u'Organizo',
-      'address': u'Adreso',
-      'contact': u'Kontakto',
-      'version': u'Versio',
-      'revision': u'Revido',
-      'status': u'Stato',
-      'date': u'Dato',
-      # 'copyright': u'Kopirajto',
-      'copyright': u'A\u016dtorrajto',
-      'dedication': u'Dedi\u0109o',
-      'abstract': u'Resumo',
-      'attention': u'Atentu!',
-      'caution': u'Zorgu!',
-      'danger': u'DAN\u011cERO!',
-      'error': u'Eraro',
-      'hint': u'Spuro',
-      'important': u'Grava',
-      'note': u'Noto',
-      'tip': u'Helpeto',
-      'warning': u'Averto',
-      'contents': u'Enhavo'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      # language-dependent: fixed
-      'a\u016dtoro': 'author',
-      'a\u016dtoroj': 'authors',
-      'organizo': 'organization',
-      'adreso': 'address',
-      'kontakto': 'contact',
-      'versio': 'version',
-      'revido': 'revision',
-      'stato': 'status',
-      'dato': 'date',
-      'a\u016dtorrajto': 'copyright',
-      'dedi\u0109o': 'dedication',
-      'resumo': 'abstract'}
-"""Esperanto (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/es.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-# -*- coding: utf-8 -*-
-# $Id: es.py 4572 2006-05-25 20:48:37Z richieadler $
-# Author: Marcelo Huerta San Martín <richieadler@users.sourceforge.net>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Spanish-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      'author': u'Autor',
-      'authors': u'Autores',
-      'organization': u'Organizaci\u00f3n',
-      'address': u'Direcci\u00f3n',
-      'contact': u'Contacto',
-      'version': u'Versi\u00f3n',
-      'revision': u'Revisi\u00f3n',
-      'status': u'Estado',
-      'date': u'Fecha',
-      'copyright': u'Copyright',
-      'dedication': u'Dedicatoria',
-      'abstract': u'Resumen',
-      'attention': u'\u00a1Atenci\u00f3n!',
-      'caution': u'\u00a1Precauci\u00f3n!',
-      'danger': u'\u00a1PELIGRO!',
-      'error': u'Error',
-      'hint': u'Sugerencia',
-      'important': u'Importante',
-      'note': u'Nota',
-      'tip': u'Consejo',
-      'warning': u'Advertencia',
-      'contents': u'Contenido'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      u'autor': 'author',
-      u'autores': 'authors',
-      u'organizaci\u00f3n': 'organization',
-      u'direcci\u00f3n': 'address',
-      u'contacto': 'contact',
-      u'versi\u00f3n': 'version',
-      u'revisi\u00f3n': 'revision',
-      u'estado': 'status',
-      u'fecha': 'date',
-      u'copyright': 'copyright',
-      u'dedicatoria': 'dedication',
-      u'resumen': 'abstract'}
-"""Spanish (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/fi.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-# $Id: fi.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Asko Soukka <asko.soukka@iki.fi>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Finnish-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      # fixed: language-dependent
-      u'author': u'Tekij\u00e4',
-      u'authors': u'Tekij\u00e4t',
-      u'organization': u'Yhteis\u00f6',
-      u'address': u'Osoite',
-      u'contact': u'Yhteystiedot',
-      u'version': u'Versio',
-      u'revision': u'Vedos',
-      u'status': u'Tila',
-      u'date': u'P\u00e4iv\u00e4ys',
-      u'copyright': u'Tekij\u00e4noikeudet',
-      u'dedication': u'Omistuskirjoitus',
-      u'abstract': u'Tiivistelm\u00e4',
-      u'attention': u'Huomio!',
-      u'caution': u'Varo!',
-      u'danger': u'!VAARA!',
-      u'error': u'Virhe',
-      u'hint': u'Vihje',
-      u'important': u'T\u00e4rke\u00e4\u00e4',
-      u'note': u'Huomautus',
-      u'tip': u'Neuvo',
-      u'warning': u'Varoitus',
-      u'contents': u'Sis\u00e4llys'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      # language-dependent: fixed
-      u'tekij\u00e4': u'author',
-      u'tekij\u00e4t': u'authors',
-      u'yhteis\u00f6': u'organization',
-      u'osoite': u'address',
-      u'yhteystiedot': u'contact',
-      u'versio': u'version',
-      u'vedos': u'revision',
-      u'tila': u'status',
-      u'p\u00e4iv\u00e4ys': u'date',
-      u'tekij\u00e4noikeudet': u'copyright',
-      u'omistuskirjoitus': u'dedication',
-      u'tiivistelm\u00e4': u'abstract'}
-"""Finnish (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/fr.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-# $Id: fr.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Stefane Fermigier <sf@fermigier.com>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-French-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      u'author': u'Auteur',
-      u'authors': u'Auteurs',
-      u'organization': u'Organisation',
-      u'address': u'Adresse',
-      u'contact': u'Contact',
-      u'version': u'Version',
-      u'revision': u'R\u00e9vision',
-      u'status': u'Statut',
-      u'date': u'Date',
-      u'copyright': u'Copyright',
-      u'dedication': u'D\u00e9dicace',
-      u'abstract': u'R\u00e9sum\u00e9',
-      u'attention': u'Attention!',
-      u'caution': u'Avertissement!',
-      u'danger': u'!DANGER!',
-      u'error': u'Erreur',
-      u'hint': u'Indication',
-      u'important': u'Important',
-      u'note': u'Note',
-      u'tip': u'Astuce',
-      u'warning': u'Avis',
-      u'contents': u'Sommaire'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      u'auteur': u'author',
-      u'auteurs': u'authors',
-      u'organisation': u'organization',
-      u'adresse': u'address',
-      u'contact': u'contact',
-      u'version': u'version',
-      u'r\u00e9vision': u'revision',
-      u'statut': u'status',
-      u'date': u'date',
-      u'copyright': u'copyright',
-      u'd\u00e9dicace': u'dedication',
-      u'r\u00e9sum\u00e9': u'abstract'}
-"""French (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/he.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-# Author: Meir Kriheli
-# Id: $Id: he.py 4837 2006-12-26 09:59:41Z sfcben $
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Hebrew-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      # fixed: language-dependent
-      'author': u'\u05de\u05d7\u05d1\u05e8',
-      'authors': u'\u05de\u05d7\u05d1\u05e8\u05d9',
-      'organization': u'\u05d0\u05e8\u05d2\u05d5\u05df',
-      'address': u'\u05db\u05ea\u05d5\u05d1\u05ea',
-      'contact':  u'\u05d0\u05d9\u05e9 \u05e7\u05e9\u05e8',
-      'version': u'\u05d2\u05e8\u05e1\u05d4',
-      'revision': u'\u05de\u05d4\u05d3\u05d5\u05e8\u05d4',
-      'status': u'\u05e1\u05d8\u05d8\u05d5\u05e1',
-      'date': u'\u05ea\u05d0\u05e8\u05d9\u05da',
-      'copyright': u'\u05d6\u05db\u05d5\u05d9\u05d5\u05ea \u05e9\u05de\u05d5\u05e8\u05d5\u05ea',
-      'dedication': u'\u05d4\u05e7\u05d3\u05e9\u05d4',
-      'abstract': u'\u05ea\u05e7\u05e6\u05d9\u05e8',
-      'attention': u'\u05ea\u05e9\u05d5\u05de\u05ea \u05dc\u05d1',
-      'caution': u'\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea',
-      'danger': u'\u05e1\u05db\u05e0\u05d4',
-      'error': u'\u05e9\u05d2\u05d9\u05d0\u05d4' ,
-      'hint': u'\u05e8\u05de\u05d6',
-      'important': u'\u05d7\u05e9\u05d5\u05d1',
-      'note': u'\u05d4\u05e2\u05e8\u05d4',
-      'tip': u'\u05d8\u05d9\u05e4',
-      'warning': u'\u05d0\u05d6\u05d4\u05e8\u05d4',
-      'contents': u'\u05ea\u05d5\u05db\u05df'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      # language-dependent: fixed
-      u'\u05de\u05d7\u05d1\u05e8': 'author',
-      u'\u05de\u05d7\u05d1\u05e8\u05d9': 'authors',
-      u'\u05d0\u05e8\u05d2\u05d5\u05df': 'organization',
-      u'\u05db\u05ea\u05d5\u05d1\u05ea': 'address',
-      u'\u05d0\u05d9\u05e9 \u05e7\u05e9\u05e8': 'contact',
-      u'\u05d2\u05e8\u05e1\u05d4': 'version',
-      u'\u05de\u05d4\u05d3\u05d5\u05e8\u05d4': 'revision',
-      u'\u05e1\u05d8\u05d8\u05d5\u05e1': 'status',
-      u'\u05ea\u05d0\u05e8\u05d9\u05da': 'date',
-      u'\u05d6\u05db\u05d5\u05d9\u05d5\u05ea \u05e9\u05de\u05d5\u05e8\u05d5\u05ea': 'copyright',
-      u'\u05d4\u05e7\u05d3\u05e9\u05d4': 'dedication',
-      u'\u05ea\u05e7\u05e6\u05d9\u05e8': 'abstract'}
-"""Hebrew to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/it.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-# $Id: it.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Nicola Larosa <docutils@tekNico.net>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Italian-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      'author': 'Autore',
-      'authors': 'Autori',
-      'organization': 'Organizzazione',
-      'address': 'Indirizzo',
-      'contact': 'Contatti',
-      'version': 'Versione',
-      'revision': 'Revisione',
-      'status': 'Status',
-      'date': 'Data',
-      'copyright': 'Copyright',
-      'dedication': 'Dedica',
-      'abstract': 'Riassunto',
-      'attention': 'Attenzione!',
-      'caution': 'Cautela!',
-      'danger': '!PERICOLO!',
-      'error': 'Errore',
-      'hint': 'Suggerimento',
-      'important': 'Importante',
-      'note': 'Nota',
-      'tip': 'Consiglio',
-      'warning': 'Avvertenza',
-      'contents': 'Indice'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      'autore': 'author',
-      'autori': 'authors',
-      'organizzazione': 'organization',
-      'indirizzo': 'address',
-      'contatto': 'contact',
-      'versione': 'version',
-      'revisione': 'revision',
-      'status': 'status',
-      'data': 'date',
-      'copyright': 'copyright',
-      'dedica': 'dedication',
-      'riassunto': 'abstract'}
-"""Italian (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/ja.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-# -*- coding: utf-8 -*-
-# $Id: ja.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Hisashi Morita <hisashim@kt.rim.or.jp>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Japanese-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      # fixed: language-dependent
-      'author': u'著者',
-      'authors': u'著者',
-      'organization': u'組織',
-      'address': u'ä½æ‰€',
-      'contact': u'連絡先',
-      'version': u'ãƒãƒ¼ã‚¸ãƒ§ãƒ³',
-      'revision': u'リビジョン',
-      'status': u'ステータス',
-      'date': u'日付',
-      'copyright': u'著作権',
-      'dedication': u'献辞',
-      'abstract': u'概è¦',
-      'attention': u'注目!',
-      'caution': u'注æ„!',
-      'danger': u'!å±é™º!',
-      'error': u'エラー',
-      'hint': u'ヒント',
-      'important': u'é‡è¦',
-      'note': u'備考',
-      'tip': u'通報',
-      'warning': u'警告',
-      'contents': u'目次'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      # language-dependent: fixed
-      u'著者': 'author',
-      u' n/a': 'authors',
-      u'組織': 'organization',
-      u'ä½æ‰€': 'address',
-      u'連絡先': 'contact',
-      u'ãƒãƒ¼ã‚¸ãƒ§ãƒ³': 'version',
-      u'リビジョン': 'revision',
-      u'ステータス': 'status',
-      u'日付': 'date',
-      u'著作権': 'copyright',
-      u'献辞': 'dedication',
-      u'概è¦': 'abstract'}
-"""Japanese (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/nl.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-# $Id: nl.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Martijn Pieters <mjpieters@users.sourceforge.net>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Dutch-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      # fixed: language-dependent
-      'author': 'Auteur',
-      'authors': 'Auteurs',
-      'organization': 'Organisatie',
-      'address': 'Adres',
-      'contact': 'Contact',
-      'version': 'Versie',
-      'revision': 'Revisie',
-      'status': 'Status',
-      'date': 'Datum',
-      'copyright': 'Copyright',
-      'dedication': 'Toewijding',
-      'abstract': 'Samenvatting',
-      'attention': 'Attentie!',
-      'caution': 'Let op!',
-      'danger': '!GEVAAR!',
-      'error': 'Fout',
-      'hint': 'Hint',
-      'important': 'Belangrijk',
-      'note': 'Opmerking',
-      'tip': 'Tip',
-      'warning': 'Waarschuwing',
-      'contents': 'Inhoud'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      # language-dependent: fixed
-      'auteur': 'author',
-      'auteurs': 'authors',
-      'organisatie': 'organization',
-      'adres': 'address',
-      'contact': 'contact',
-      'versie': 'version',
-      'revisie': 'revision',
-      'status': 'status',
-      'datum': 'date',
-      'copyright': 'copyright',
-      'toewijding': 'dedication',
-      'samenvatting': 'abstract'}
-"""Dutch (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/pt_br.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-# $Id: pt_br.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Brazilian Portuguese-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      # fixed: language-dependent
-      'author': u'Autor',
-      'authors': u'Autores',
-      'organization': u'Organiza\u00E7\u00E3o',
-      'address': u'Endere\u00E7o',
-      'contact': u'Contato',
-      'version': u'Vers\u00E3o',
-      'revision': u'Revis\u00E3o',
-      'status': u'Estado',
-      'date': u'Data',
-      'copyright': u'Copyright',
-      'dedication': u'Dedicat\u00F3ria',
-      'abstract': u'Resumo',
-      'attention': u'Atten\u00E7\u00E3o!',
-      'caution': u'Cuidado!',
-      'danger': u'PERIGO!',
-      'error': u'Erro',
-      'hint': u'Sugest\u00E3o',
-      'important': u'Importante',
-      'note': u'Nota',
-      'tip': u'Dica',
-      'warning': u'Aviso',
-      'contents': u'Sum\u00E1rio'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      # language-dependent: fixed
-      u'autor': 'author',
-      u'autores': 'authors',
-      u'organiza\u00E7\u00E3o': 'organization',
-      u'endere\u00E7o': 'address',
-      u'contato': 'contact',
-      u'vers\u00E3o': 'version',
-      u'revis\u00E3o': 'revision',
-      u'estado': 'status',
-      u'data': 'date',
-      u'copyright': 'copyright',
-      u'dedicat\u00F3ria': 'dedication',
-      u'resumo': 'abstract'}
-"""Brazilian Portuguese (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/ru.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-# $Id: ru.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Roman Suzi <rnd@onego.ru>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Russian-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      u'abstract': u'\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f',
-      u'address': u'\u0410\u0434\u0440\u0435\u0441',
-      u'attention': u'\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435!',
-      u'author': u'\u0410\u0432\u0442\u043e\u0440',
-      u'authors': u'\u0410\u0432\u0442\u043e\u0440\u044b',
-      u'caution': u'\u041e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e!',
-      u'contact': u'\u041a\u043e\u043d\u0442\u0430\u043a\u0442',
-      u'contents':
-      u'\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435',
-      u'copyright': u'\u041f\u0440\u0430\u0432\u0430 '
-      u'\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f',
-      u'danger': u'\u041e\u041f\u0410\u0421\u041d\u041e!',
-      u'date': u'\u0414\u0430\u0442\u0430',
-      u'dedication':
-      u'\u041f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0438\u0435',
-      u'error': u'\u041e\u0448\u0438\u0431\u043a\u0430',
-      u'hint': u'\u0421\u043e\u0432\u0435\u0442',
-      u'important': u'\u0412\u0430\u0436\u043d\u043e',
-      u'note': u'\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435',
-      u'organization':
-      u'\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f',
-      u'revision': u'\u0420\u0435\u0434\u0430\u043a\u0446\u0438\u044f',
-      u'status': u'\u0421\u0442\u0430\u0442\u0443\u0441',
-      u'tip': u'\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430',
-      u'version': u'\u0412\u0435\u0440\u0441\u0438\u044f',
-      u'warning': u'\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436'
-      u'\u0434\u0435\u043d\u0438\u0435'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      u'\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f': u'abstract',
-      u'\u0430\u0434\u0440\u0435\u0441': u'address',
-      u'\u0430\u0432\u0442\u043e\u0440': u'author',
-      u'\u0430\u0432\u0442\u043e\u0440\u044b': u'authors',
-      u'\u043a\u043e\u043d\u0442\u0430\u043a\u0442': u'contact',
-      u'\u043f\u0440\u0430\u0432\u0430 \u043a\u043e\u043f\u0438\u0440\u043e'
-      u'\u0432\u0430\u043d\u0438\u044f': u'copyright',
-      u'\u0434\u0430\u0442\u0430': u'date',
-      u'\u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0438\u0435':
-      u'dedication',
-      u'\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f':
-      u'organization',
-      u'\u0440\u0435\u0434\u0430\u043a\u0446\u0438\u044f': u'revision',
-      u'\u0441\u0442\u0430\u0442\u0443\u0441': u'status',
-      u'\u0432\u0435\u0440\u0441\u0438\u044f': u'version'}
-"""Russian (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators =  [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/sk.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-# $Id: sk.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Miroslav Vasko <zemiak@zoznam.sk>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Slovak-language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      'author': u'Autor',
-      'authors': u'Autori',
-      'organization': u'Organiz\u00E1cia',
-      'address': u'Adresa',
-      'contact': u'Kontakt',
-      'version': u'Verzia',
-      'revision': u'Rev\u00EDzia',
-      'status': u'Stav',
-      'date': u'D\u00E1tum',
-      'copyright': u'Copyright',
-      'dedication': u'Venovanie',
-      'abstract': u'Abstraktne',
-      'attention': u'Pozor!',
-      'caution': u'Opatrne!',
-      'danger': u'!NEBEZPE\u010cENSTVO!',
-      'error': u'Chyba',
-      'hint': u'Rada',
-      'important': u'D\u00F4le\u017Eit\u00E9',
-      'note': u'Pozn\u00E1mka',
-      'tip': u'Tip',
-      'warning': u'Varovanie',
-      'contents': u'Obsah'}
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      u'autor': 'author',
-      u'autori': 'authors',
-      u'organiz\u00E1cia': 'organization',
-      u'adresa': 'address',
-      u'kontakt': 'contact',
-      u'verzia': 'version',
-      u'rev\u00EDzia': 'revision',
-      u'stav': 'status',
-      u'd\u00E1tum': 'date',
-      u'copyright': 'copyright',
-      u'venovanie': 'dedication',
-      u'abstraktne': 'abstract'}
-"""Slovak (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/sv.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-# $Id: sv.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Adam Chodorowski <chodorowski@users.sourceforge.net>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Swedish language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-    'author':       u'F\u00f6rfattare',
-    'authors':      u'F\u00f6rfattare',
-    'organization': u'Organisation',
-    'address':      u'Adress',
-    'contact':      u'Kontakt',
-    'version':      u'Version',
-    'revision':     u'Revision',
-    'status':       u'Status',
-    'date':         u'Datum',
-    'copyright':    u'Copyright',
-    'dedication':   u'Dedikation',
-    'abstract':     u'Sammanfattning',
-    'attention':    u'Observera!',
-    'caution':      u'Varning!',
-    'danger':       u'FARA!',
-    'error':        u'Fel',
-    'hint':         u'V\u00e4gledning',
-    'important':    u'Viktigt',
-    'note':         u'Notera',
-    'tip':          u'Tips',
-    'warning':      u'Varning',
-    'contents':     u'Inneh\u00e5ll' }
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-    # 'Author' and 'Authors' identical in Swedish; assume the plural:
-    u'f\u00f6rfattare': 'authors',
-    u' n/a':            'author',
-    u'organisation':    'organization',
-    u'adress':          'address',
-    u'kontakt':         'contact',
-    u'version':         'version',
-    u'revision':        'revision',
-    u'status':          'status',
-    u'datum':           'date',
-    u'copyright':       'copyright',
-    u'dedikation':      'dedication', 
-    u'sammanfattning':  'abstract' }
-"""Swedish (lowcased) to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',']
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/zh_cn.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-# -*- coding: utf-8 -*-
-# $Id: zh_cn.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Pan Junyong <panjy@zopechina.com>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Simplified Chinese language mappings for language-dependent features
-of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      # fixed: language-dependent
-      'author': u'作者',
-      'authors': u'作者群',
-      'organization': u'组织',
-      'address': u'地å€',
-      'contact': u'è”ç³»',
-      'version': u'版本',
-      'revision': u'修订',
-      'status': u'状æ€',
-      'date': u'日期',
-      'copyright': u'版æƒ',
-      'dedication': u'献辞',
-      'abstract': u'摘è¦',
-      'attention': u'注æ„',
-      'caution': u'å°å¿ƒ',
-      'danger': u'å±é™©',
-      'error': u'错误',
-      'hint': u'æ示',
-      'important': u'é‡è¦',
-      'note': u'注解',
-      'tip': u'技巧',
-      'warning': u'警告',
-      'contents': u'目录',
-} 
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      # language-dependent: fixed
-      u'作者': 'author',
-      u'作者群': 'authors',
-      u'组织': 'organization',
-      u'地å€': 'address',
-      u'è”ç³»': 'contact',
-      u'版本': 'version',
-      u'修订': 'revision',
-      u'状æ€': 'status',
-      u'时间': 'date',
-      u'版æƒ': 'copyright',
-      u'献辞': 'dedication',
-      u'摘è¦': 'abstract'}
-"""Simplified Chinese to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',',
-                     u'\uff1b', # 'ï¼›'
-                     u'\uff0c', # ','
-                     u'\u3001', # 'ã€'
-                    ]
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/languages/zh_tw.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-# -*- coding: utf-8 -*-
-# $Id: zh_tw.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Joe YS Jaw <joeysj@users.sourceforge.net>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Traditional Chinese language mappings for language-dependent features of Docutils.
-"""
-
-__docformat__ = 'reStructuredText'
-
-labels = {
-      # fixed: language-dependent
-      'author': u'\u4f5c\u8005', # '作者' <-- Chinese word
-      'authors': u'\u4f5c\u8005\u7fa4', # '作者群',
-      'organization': u'\u7d44\u7e54', # '組織',
-      'address': u'\u5730\u5740', # '地å€',
-      'contact': u'\u9023\u7d61', # '連絡',
-      'version': u'\u7248\u672c', # '版本',
-      'revision': u'\u4fee\u8a02', # '修訂',
-      'status': u'\u72c0\u614b', # '狀態',
-      'date': u'\u65e5\u671f', # '日期',
-      'copyright': u'\u7248\u6b0a', # '版權',
-      'dedication': u'\u984c\u737b', # 'é¡Œç»',
-      'abstract': u'\u6458\u8981', # '摘è¦',
-      'attention': u'\u6ce8\u610f\uff01', # '注æ„ï¼',
-      'caution': u'\u5c0f\u5fc3\uff01', # 'å°å¿ƒï¼',
-      'danger': u'\uff01\u5371\u96aa\uff01', # 'ï¼å±éšªï¼',
-      'error': u'\u932f\u8aa4', # '錯誤',
-      'hint': u'\u63d0\u793a', # 'æ示',
-      'important': u'\u91cd\u8981', # '注æ„ï¼',
-      'note': u'\u8a3b\u91cb', # '註釋',
-      'tip': u'\u79d8\u8a23', # '秘訣',
-      'warning': u'\u8b66\u544a', # '警告',
-      'contents': u'\u76ee\u9304' # '目錄'
-} 
-"""Mapping of node class name to label text."""
-
-bibliographic_fields = {
-      # language-dependent: fixed
-      'author (translation required)': 'author',
-      'authors (translation required)': 'authors',
-      'organization (translation required)': 'organization',
-      'address (translation required)': 'address',
-      'contact (translation required)': 'contact',
-      'version (translation required)': 'version',
-      'revision (translation required)': 'revision',
-      'status (translation required)': 'status',
-      'date (translation required)': 'date',
-      'copyright (translation required)': 'copyright',
-      'dedication (translation required)': 'dedication',
-      'abstract (translation required)': 'abstract'}
-"""Traditional Chinese to canonical name mapping for bibliographic fields."""
-
-author_separators = [';', ',',
-                     u'\uff1b', # 'ï¼›'
-                     u'\uff0c', # ','
-                     u'\u3001', # 'ã€'
-                    ]
-"""List of separator strings for the 'Authors' bibliographic field. Tried in
-order."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/nodes.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1801 +0,0 @@
-# $Id: nodes.py 5033 2007-03-21 19:51:22Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Docutils document tree element class library.
-
-Classes in CamelCase are abstract base classes or auxiliary classes. The one
-exception is `Text`, for a text (PCDATA) node; uppercase is used to
-differentiate from element classes.  Classes in lower_case_with_underscores
-are element classes, matching the XML element generic identifiers in the DTD_.
-
-The position of each node (the level at which it can occur) is significant and
-is represented by abstract base classes (`Root`, `Structural`, `Body`,
-`Inline`, etc.).  Certain transformations will be easier because we can use
-``isinstance(node, base_class)`` to determine the position of the node in the
-hierarchy.
-
-.. _DTD: http://docutils.sourceforge.net/docs/ref/docutils.dtd
-"""
-
-__docformat__ = 'reStructuredText'
-
-import sys
-import os
-import re
-import warnings
-from types import IntType, SliceType, StringType, UnicodeType, \
-     TupleType, ListType, ClassType, TypeType
-from UserString import UserString
-
-
-# ==============================
-#  Functional Node Base Classes
-# ==============================
-
-class Node:
-
-    """Abstract base class of nodes in a document tree."""
-
-    parent = None
-    """Back-reference to the Node immediately containing this Node."""
-
-    document = None
-    """The `document` node at the root of the tree containing this Node."""
-
-    source = None
-    """Path or description of the input source which generated this Node."""
-
-    line = None
-    """The line number (1-based) of the beginning of this Node in `source`."""
-
-    def __nonzero__(self):
-        """
-        Node instances are always true, even if they're empty.  A node is more
-        than a simple container.  Its boolean "truth" does not depend on
-        having one or more subnodes in the doctree.
-
-        Use `len()` to check node length.  Use `None` to represent a boolean
-        false value.
-        """
-        return 1
-
-    def __str__(self):
-        return self.__unicode__().encode('raw_unicode_escape')
-
-    def __unicode__(self):
-        # Override in subclass.
-        raise NotImplementedError
-
-    def asdom(self, dom=None):
-        """Return a DOM **fragment** representation of this Node."""
-        if dom is None:
-            import xml.dom.minidom as dom
-        domroot = dom.Document()
-        return self._dom_node(domroot)
-
-    def pformat(self, indent='    ', level=0):
-        """
-        Return an indented pseudo-XML representation, for test purposes.
-
-        Override in subclasses.
-        """
-        raise NotImplementedError
-
-    def copy(self):
-        """Return a copy of self."""
-        raise NotImplementedError
-
-    def deepcopy(self):
-        """Return a deep copy of self (also copying children)."""
-        raise NotImplementedError
-
-    def setup_child(self, child):
-        child.parent = self
-        if self.document:
-            child.document = self.document
-            if child.source is None:
-                child.source = self.document.current_source
-            if child.line is None:
-                child.line = self.document.current_line
-
-    def walk(self, visitor):
-        """
-        Traverse a tree of `Node` objects, calling the
-        `dispatch_visit()` method of `visitor` when entering each
-        node.  (The `walkabout()` method is similar, except it also
-        calls the `dispatch_departure()` method before exiting each
-        node.)
-
-        This tree traversal supports limited in-place tree
-        modifications.  Replacing one node with one or more nodes is
-        OK, as is removing an element.  However, if the node removed
-        or replaced occurs after the current node, the old node will
-        still be traversed, and any new nodes will not.
-
-        Within ``visit`` methods (and ``depart`` methods for
-        `walkabout()`), `TreePruningException` subclasses may be raised
-        (`SkipChildren`, `SkipSiblings`, `SkipNode`, `SkipDeparture`).
-
-        Parameter `visitor`: A `NodeVisitor` object, containing a
-        ``visit`` implementation for each `Node` subclass encountered.
-
-        Return true if we should stop the traversal.
-        """
-        stop = 0
-        visitor.document.reporter.debug(
-            'docutils.nodes.Node.walk calling dispatch_visit for %s'
-            % self.__class__.__name__)
-        try:
-            try:
-                visitor.dispatch_visit(self)
-            except (SkipChildren, SkipNode):
-                return stop
-            except SkipDeparture:           # not applicable; ignore
-                pass
-            children = self.children
-            try:
-                for child in children[:]:
-                    if child.walk(visitor):
-                        stop = 1
-                        break
-            except SkipSiblings:
-                pass
-        except StopTraversal:
-            stop = 1
-        return stop
-
-    def walkabout(self, visitor):
-        """
-        Perform a tree traversal similarly to `Node.walk()` (which
-        see), except also call the `dispatch_departure()` method
-        before exiting each node.
-
-        Parameter `visitor`: A `NodeVisitor` object, containing a
-        ``visit`` and ``depart`` implementation for each `Node`
-        subclass encountered.
-
-        Return true if we should stop the traversal.
-        """
-        call_depart = 1
-        stop = 0
-        visitor.document.reporter.debug(
-            'docutils.nodes.Node.walkabout calling dispatch_visit for %s'
-            % self.__class__.__name__)
-        try:
-            try:
-                visitor.dispatch_visit(self)
-            except SkipNode:
-                return stop
-            except SkipDeparture:
-                call_depart = 0
-            children = self.children
-            try:
-                for child in children[:]:
-                    if child.walkabout(visitor):
-                        stop = 1
-                        break
-            except SkipSiblings:
-                pass
-        except SkipChildren:
-            pass
-        except StopTraversal:
-            stop = 1
-        if call_depart:
-            visitor.document.reporter.debug(
-                'docutils.nodes.Node.walkabout calling dispatch_departure '
-                'for %s' % self.__class__.__name__)
-            visitor.dispatch_departure(self)
-        return stop
-
-    def traverse(self, condition=None,
-                 include_self=1, descend=1, siblings=0, ascend=0):
-        """
-        Return an iterable containing
-
-        * self (if include_self is true)
-        * all descendants in tree traversal order (if descend is true)
-        * all siblings (if siblings is true) and their descendants (if
-          also descend is true)
-        * the siblings of the parent (if ascend is true) and their
-          descendants (if also descend is true), and so on
-
-        If `condition` is not None, the iterable contains only nodes
-        for which ``condition(node)`` is true.  If `condition` is a
-        node class ``cls``, it is equivalent to a function consisting
-        of ``return isinstance(node, cls)``.
-
-        If ascend is true, assume siblings to be true as well.
-
-        For example, given the following tree::
-
-            <paragraph>
-                <emphasis>      <--- emphasis.traverse() and
-                    <strong>    <--- strong.traverse() are called.
-                        Foo
-                    Bar
-                <reference name="Baz" refid="baz">
-                    Baz
-
-        Then list(emphasis.traverse()) equals ::
-
-            [<emphasis>, <strong>, <#text: Foo>, <#text: Bar>]
-
-        and list(strong.traverse(ascend=1)) equals ::
-
-            [<strong>, <#text: Foo>, <#text: Bar>, <reference>, <#text: Baz>]
-        """
-        r = []
-        if ascend:
-            siblings=1
-        # Check if `condition` is a class (check for TypeType for Python
-        # implementations that use only new-style classes, like PyPy).
-        if isinstance(condition, (ClassType, TypeType)):
-            node_class = condition
-            def condition(node, node_class=node_class):
-                return isinstance(node, node_class)
-        if include_self and (condition is None or condition(self)):
-            r.append(self)
-        if descend and len(self.children):
-            for child in self:
-                r.extend(child.traverse(
-                    include_self=1, descend=1, siblings=0, ascend=0,
-                    condition=condition))
-        if siblings or ascend:
-            node = self
-            while node.parent:
-                index = node.parent.index(node)
-                for sibling in node.parent[index+1:]:
-                    r.extend(sibling.traverse(include_self=1, descend=descend,
-                                              siblings=0, ascend=0,
-                                              condition=condition))
-                if not ascend:
-                    break
-                else:
-                    node = node.parent
-        return r
-
-    def next_node(self, condition=None,
-                  include_self=0, descend=1, siblings=0, ascend=0):
-        """
-        Return the first node in the iterable returned by traverse(),
-        or None if the iterable is empty.
-
-        Parameter list is the same as of traverse.  Note that
-        include_self defaults to 0, though.
-        """
-        iterable = self.traverse(condition=condition,
-                                 include_self=include_self, descend=descend,
-                                 siblings=siblings, ascend=ascend)
-        try:
-            return iterable[0]
-        except IndexError:
-            return None
-
-class Text(Node, UserString):
-
-    """
-    Instances are terminal nodes (leaves) containing text only; no child
-    nodes or attributes.  Initialize by passing a string to the constructor.
-    Access the text itself with the `astext` method.
-    """
-
-    tagname = '#text'
-
-    children = ()
-    """Text nodes have no children, and cannot have children."""
-
-    def __init__(self, data, rawsource=''):
-        UserString.__init__(self, data)
-
-        self.rawsource = rawsource
-        """The raw text from which this element was constructed."""
-
-    def __repr__(self):
-        data = repr(self.data)
-        if len(data) > 70:
-            data = repr(self.data[:64] + ' ...')
-        return '<%s: %s>' % (self.tagname, data)
-
-    def __len__(self):
-        return len(self.data)
-
-    def shortrepr(self):
-        data = repr(self.data)
-        if len(data) > 20:
-            data = repr(self.data[:16] + ' ...')
-        return '<%s: %s>' % (self.tagname, data)
-
-    def _dom_node(self, domroot):
-        return domroot.createTextNode(self.data)
-
-    def astext(self):
-        return self.data
-
-    def __unicode__(self):
-        return self.data
-
-    def copy(self):
-        return self.__class__(self.data)
-
-    def deepcopy(self):
-        return self.copy()
-
-    def pformat(self, indent='    ', level=0):
-        result = []
-        indent = indent * level
-        for line in self.data.splitlines():
-            result.append(indent + line + '\n')
-        return ''.join(result)
-
-
-class Element(Node):
-
-    """
-    `Element` is the superclass to all specific elements.
-
-    Elements contain attributes and child nodes.  Elements emulate
-    dictionaries for attributes, indexing by attribute name (a string).  To
-    set the attribute 'att' to 'value', do::
-
-        element['att'] = 'value'
-
-    There are two special attributes: 'ids' and 'names'.  Both are
-    lists of unique identifiers, and names serve as human interfaces
-    to IDs.  Names are case- and whitespace-normalized (see the
-    fully_normalize_name() function), and IDs conform to the regular
-    expression ``[a-z](-?[a-z0-9]+)*`` (see the make_id() function).
-
-    Elements also emulate lists for child nodes (element nodes and/or text
-    nodes), indexing by integer.  To get the first child node, use::
-
-        element[0]
-
-    Elements may be constructed using the ``+=`` operator.  To add one new
-    child node to element, do::
-
-        element += node
-
-    This is equivalent to ``element.append(node)``.
-
-    To add a list of multiple child nodes at once, use the same ``+=``
-    operator::
-
-        element += [node1, node2]
-
-    This is equivalent to ``element.extend([node1, node2])``.
-    """
-
-    list_attributes = ('ids', 'classes', 'names', 'dupnames', 'backrefs')
-    """List attributes, automatically initialized to empty lists for
-    all nodes."""
-
-    tagname = None
-    """The element generic identifier. If None, it is set as an instance
-    attribute to the name of the class."""
-
-    child_text_separator = '\n\n'
-    """Separator for child nodes, used by `astext()` method."""
-
-    def __init__(self, rawsource='', *children, **attributes):
-        self.rawsource = rawsource
-        """The raw text from which this element was constructed."""
-
-        self.children = []
-        """List of child nodes (elements and/or `Text`)."""
-
-        self.extend(children)           # maintain parent info
-
-        self.attributes = {}
-        """Dictionary of attribute {name: value}."""
-
-        # Initialize list attributes.
-        for att in self.list_attributes:
-            self.attributes[att] = []
-
-        for att, value in attributes.items():
-            att = att.lower()
-            if att in self.list_attributes:
-                # mutable list; make a copy for this node
-                self.attributes[att] = value[:]
-            else:
-                self.attributes[att] = value
-
-        if self.tagname is None:
-            self.tagname = self.__class__.__name__
-
-    def _dom_node(self, domroot):
-        element = domroot.createElement(self.tagname)
-        for attribute, value in self.attlist():
-            if isinstance(value, ListType):
-                value = ' '.join([serial_escape('%s' % v) for v in value])
-            element.setAttribute(attribute, '%s' % value)
-        for child in self.children:
-            element.appendChild(child._dom_node(domroot))
-        return element
-
-    def __repr__(self):
-        data = ''
-        for c in self.children:
-            data += c.shortrepr()
-            if len(data) > 60:
-                data = data[:56] + ' ...'
-                break
-        if self['names']:
-            return '<%s "%s": %s>' % (self.__class__.__name__,
-                                      '; '.join(self['names']), data)
-        else:
-            return '<%s: %s>' % (self.__class__.__name__, data)
-
-    def shortrepr(self):
-        if self['names']:
-            return '<%s "%s"...>' % (self.__class__.__name__,
-                                     '; '.join(self['names']))
-        else:
-            return '<%s...>' % self.tagname
-
-    def __unicode__(self):
-        if self.children:
-            return u'%s%s%s' % (self.starttag(),
-                                ''.join([unicode(c) for c in self.children]),
-                                self.endtag())
-        else:
-            return self.emptytag()
-
-    def starttag(self):
-        parts = [self.tagname]
-        for name, value in self.attlist():
-            if value is None:           # boolean attribute
-                parts.append(name)
-            elif isinstance(value, ListType):
-                values = [serial_escape('%s' % v) for v in value]
-                parts.append('%s="%s"' % (name, ' '.join(values)))
-            else:
-                parts.append('%s="%s"' % (name, value))
-        return '<%s>' % ' '.join(parts)
-
-    def endtag(self):
-        return '</%s>' % self.tagname
-
-    def emptytag(self):
-        return u'<%s/>' % ' '.join([self.tagname] +
-                                    ['%s="%s"' % (n, v)
-                                     for n, v in self.attlist()])
-
-    def __len__(self):
-        return len(self.children)
-
-    def __getitem__(self, key):
-        if isinstance(key, UnicodeType) or isinstance(key, StringType):
-            return self.attributes[key]
-        elif isinstance(key, IntType):
-            return self.children[key]
-        elif isinstance(key, SliceType):
-            assert key.step in (None, 1), 'cannot handle slice with stride'
-            return self.children[key.start:key.stop]
-        else:
-            raise TypeError, ('element index must be an integer, a slice, or '
-                              'an attribute name string')
-
-    def __setitem__(self, key, item):
-        if isinstance(key, UnicodeType) or isinstance(key, StringType):
-            self.attributes[str(key)] = item
-        elif isinstance(key, IntType):
-            self.setup_child(item)
-            self.children[key] = item
-        elif isinstance(key, SliceType):
-            assert key.step in (None, 1), 'cannot handle slice with stride'
-            for node in item:
-                self.setup_child(node)
-            self.children[key.start:key.stop] = item
-        else:
-            raise TypeError, ('element index must be an integer, a slice, or '
-                              'an attribute name string')
-
-    def __delitem__(self, key):
-        if isinstance(key, UnicodeType) or isinstance(key, StringType):
-            del self.attributes[key]
-        elif isinstance(key, IntType):
-            del self.children[key]
-        elif isinstance(key, SliceType):
-            assert key.step in (None, 1), 'cannot handle slice with stride'
-            del self.children[key.start:key.stop]
-        else:
-            raise TypeError, ('element index must be an integer, a simple '
-                              'slice, or an attribute name string')
-
-    def __add__(self, other):
-        return self.children + other
-
-    def __radd__(self, other):
-        return other + self.children
-
-    def __iadd__(self, other):
-        """Append a node or a list of nodes to `self.children`."""
-        if isinstance(other, Node):
-            self.append(other)
-        elif other is not None:
-            self.extend(other)
-        return self
-
-    def astext(self):
-        return self.child_text_separator.join(
-              [child.astext() for child in self.children])
-
-    def non_default_attributes(self):
-        atts = {}
-        for key, value in self.attributes.items():
-            if self.is_not_default(key):
-                atts[key] = value
-        return atts
-
-    def attlist(self):
-        attlist = self.non_default_attributes().items()
-        attlist.sort()
-        return attlist
-
-    def get(self, key, failobj=None):
-        return self.attributes.get(key, failobj)
-
-    def hasattr(self, attr):
-        return self.attributes.has_key(attr)
-
-    def delattr(self, attr):
-        if self.attributes.has_key(attr):
-            del self.attributes[attr]
-
-    def setdefault(self, key, failobj=None):
-        return self.attributes.setdefault(key, failobj)
-
-    has_key = hasattr
-
-    def append(self, item):
-        self.setup_child(item)
-        self.children.append(item)
-
-    def extend(self, item):
-        for node in item:
-            self.append(node)
-
-    def insert(self, index, item):
-        if isinstance(item, Node):
-            self.setup_child(item)
-            self.children.insert(index, item)
-        elif item is not None:
-            self[index:index] = item
-
-    def pop(self, i=-1):
-        return self.children.pop(i)
-
-    def remove(self, item):
-        self.children.remove(item)
-
-    def index(self, item):
-        return self.children.index(item)
-
-    def is_not_default(self, key):
-        if self[key] == [] and key in self.list_attributes:
-            return 0
-        else:
-            return 1
-
-    def update_basic_atts(self, dict):
-        """
-        Update basic attributes ('ids', 'names', 'classes',
-        'dupnames', but not 'source') from node or dictionary `dict`.
-        """
-        if isinstance(dict, Node):
-            dict = dict.attributes
-        for att in ('ids', 'classes', 'names', 'dupnames'):
-            for value in dict.get(att, []):
-                if not value in self[att]:
-                    self[att].append(value)
-
-    def clear(self):
-        self.children = []
-
-    def replace(self, old, new):
-        """Replace one child `Node` with another child or children."""
-        index = self.index(old)
-        if isinstance(new, Node):
-            self.setup_child(new)
-            self[index] = new
-        elif new is not None:
-            self[index:index+1] = new
-
-    def replace_self(self, new):
-        """
-        Replace `self` node with `new`, where `new` is a node or a
-        list of nodes.
-        """
-        update = new
-        if not isinstance(new, Node):
-            # `new` is a list; update first child.
-            try:
-                update = new[0]
-            except IndexError:
-                update = None
-        if isinstance(update, Element):
-            update.update_basic_atts(self)
-        else:
-            # `update` is a Text node or `new` is an empty list.
-            # Assert that we aren't losing any attributes.
-            for att in ('ids', 'names', 'classes', 'dupnames'):
-                assert not self[att], \
-                       'Losing "%s" attribute: %s' % (att, self[att])
-        self.parent.replace(self, new)
-
-    def first_child_matching_class(self, childclass, start=0, end=sys.maxint):
-        """
-        Return the index of the first child whose class exactly matches.
-
-        Parameters:
-
-        - `childclass`: A `Node` subclass to search for, or a tuple of `Node`
-          classes. If a tuple, any of the classes may match.
-        - `start`: Initial index to check.
-        - `end`: Initial index to *not* check.
-        """
-        if not isinstance(childclass, TupleType):
-            childclass = (childclass,)
-        for index in range(start, min(len(self), end)):
-            for c in childclass:
-                if isinstance(self[index], c):
-                    return index
-        return None
-
-    def first_child_not_matching_class(self, childclass, start=0,
-                                       end=sys.maxint):
-        """
-        Return the index of the first child whose class does *not* match.
-
-        Parameters:
-
-        - `childclass`: A `Node` subclass to skip, or a tuple of `Node`
-          classes. If a tuple, none of the classes may match.
-        - `start`: Initial index to check.
-        - `end`: Initial index to *not* check.
-        """
-        if not isinstance(childclass, TupleType):
-            childclass = (childclass,)
-        for index in range(start, min(len(self), end)):
-            for c in childclass:
-                if isinstance(self.children[index], c):
-                    break
-            else:
-                return index
-        return None
-
-    def pformat(self, indent='    ', level=0):
-        return ''.join(['%s%s\n' % (indent * level, self.starttag())] +
-                       [child.pformat(indent, level+1)
-                        for child in self.children])
-
-    def copy(self):
-        return self.__class__(**self.attributes)
-
-    def deepcopy(self):
-        copy = self.copy()
-        copy.extend([child.deepcopy() for child in self.children])
-        return copy
-
-    def set_class(self, name):
-        """Add a new class to the "classes" attribute."""
-        warnings.warn('docutils.nodes.Element.set_class deprecated; '
-                      "append to Element['classes'] list attribute directly",
-                      DeprecationWarning, stacklevel=2)
-        assert ' ' not in name
-        self['classes'].append(name.lower())
-
-    def note_referenced_by(self, name=None, id=None):
-        """Note that this Element has been referenced by its name
-        `name` or id `id`."""
-        self.referenced = 1
-        # Element.expect_referenced_by_* dictionaries map names or ids
-        # to nodes whose ``referenced`` attribute is set to true as
-        # soon as this node is referenced by the given name or id.
-        # Needed for target propagation.
-        by_name = getattr(self, 'expect_referenced_by_name', {}).get(name)
-        by_id = getattr(self, 'expect_referenced_by_id', {}).get(id)
-        if by_name:
-            assert name is not None
-            by_name.referenced = 1
-        if by_id:
-            assert id is not None
-            by_id.referenced = 1
-
-
-class TextElement(Element):
-
-    """
-    An element which directly contains text.
-
-    Its children are all `Text` or `Inline` subclass nodes.  You can
-    check whether an element's context is inline simply by checking whether
-    its immediate parent is a `TextElement` instance (including subclasses).
-    This is handy for nodes like `image` that can appear both inline and as
-    standalone body elements.
-
-    If passing children to `__init__()`, make sure to set `text` to
-    ``''`` or some other suitable value.
-    """
-
-    child_text_separator = ''
-    """Separator for child nodes, used by `astext()` method."""
-
-    def __init__(self, rawsource='', text='', *children, **attributes):
-        if text != '':
-            textnode = Text(text)
-            Element.__init__(self, rawsource, textnode, *children,
-                              **attributes)
-        else:
-            Element.__init__(self, rawsource, *children, **attributes)
-
-
-class FixedTextElement(TextElement):
-
-    """An element which directly contains preformatted text."""
-
-    def __init__(self, rawsource='', text='', *children, **attributes):
-        TextElement.__init__(self, rawsource, text, *children, **attributes)
-        self.attributes['xml:space'] = 'preserve'
-
-
-# ========
-#  Mixins
-# ========
-
-class Resolvable:
-
-    resolved = 0
-
-
-class BackLinkable:
-
-    def add_backref(self, refid):
-        self['backrefs'].append(refid)
-
-
-# ====================
-#  Element Categories
-# ====================
-
-class Root: pass
-
-class Titular: pass
-
-class PreBibliographic:
-    """Category of Node which may occur before Bibliographic Nodes."""
-
-class Bibliographic: pass
-
-class Decorative(PreBibliographic): pass
-
-class Structural: pass
-
-class Body: pass
-
-class General(Body): pass
-
-class Sequential(Body):
-    """List-like elements."""
-
-class Admonition(Body): pass
-
-class Special(Body):
-    """Special internal body elements."""
-
-class Invisible(PreBibliographic):
-    """Internal elements that don't appear in output."""
-
-class Part: pass
-
-class Inline: pass
-
-class Referential(Resolvable): pass
-
-
-class Targetable(Resolvable):
-
-    referenced = 0
-
-    indirect_reference_name = None
-    """Holds the whitespace_normalized_name (contains mixed case) of a target.
-    Required for MoinMoin/reST compatibility."""
-
-
-class Labeled:
-    """Contains a `label` as its first element."""
-
-
-# ==============
-#  Root Element
-# ==============
-
-class document(Root, Structural, Element):
-
-    """
-    The document root element.
-
-    Do not instantiate this class directly; use
-    `docutils.utils.new_document()` instead.
-    """
-
-    def __init__(self, settings, reporter, *args, **kwargs):
-        Element.__init__(self, *args, **kwargs)
-
-        self.current_source = None
-        """Path to or description of the input source being processed."""
-
-        self.current_line = None
-        """Line number (1-based) of `current_source`."""
-
-        self.settings = settings
-        """Runtime settings data record."""
-
-        self.reporter = reporter
-        """System message generator."""
-
-        self.indirect_targets = []
-        """List of indirect target nodes."""
-
-        self.substitution_defs = {}
-        """Mapping of substitution names to substitution_definition nodes."""
-
-        self.substitution_names = {}
-        """Mapping of case-normalized substitution names to case-sensitive
-        names."""
-
-        self.refnames = {}
-        """Mapping of names to lists of referencing nodes."""
-
-        self.refids = {}
-        """Mapping of ids to lists of referencing nodes."""
-
-        self.nameids = {}
-        """Mapping of names to unique id's."""
-
-        self.nametypes = {}
-        """Mapping of names to hyperlink type (boolean: True => explicit,
-        False => implicit."""
-
-        self.ids = {}
-        """Mapping of ids to nodes."""
-
-        self.footnote_refs = {}
-        """Mapping of footnote labels to lists of footnote_reference nodes."""
-
-        self.citation_refs = {}
-        """Mapping of citation labels to lists of citation_reference nodes."""
-
-        self.autofootnotes = []
-        """List of auto-numbered footnote nodes."""
-
-        self.autofootnote_refs = []
-        """List of auto-numbered footnote_reference nodes."""
-
-        self.symbol_footnotes = []
-        """List of symbol footnote nodes."""
-
-        self.symbol_footnote_refs = []
-        """List of symbol footnote_reference nodes."""
-
-        self.footnotes = []
-        """List of manually-numbered footnote nodes."""
-
-        self.citations = []
-        """List of citation nodes."""
-
-        self.autofootnote_start = 1
-        """Initial auto-numbered footnote number."""
-
-        self.symbol_footnote_start = 0
-        """Initial symbol footnote symbol index."""
-
-        self.id_start = 1
-        """Initial ID number."""
-
-        self.parse_messages = []
-        """System messages generated while parsing."""
-
-        self.transform_messages = []
-        """System messages generated while applying transforms."""
-
-        import docutils.transforms
-        self.transformer = docutils.transforms.Transformer(self)
-        """Storage for transforms to be applied to this document."""
-
-        self.decoration = None
-        """Document's `decoration` node."""
-
-        self.document = self
-
-    def __getstate__(self):
-        """
-        Return dict with unpicklable references removed.
-        """
-        state = self.__dict__.copy()
-        state['reporter'] = None
-        state['transformer'] = None
-        return state
-
-    def asdom(self, dom=None):
-        """Return a DOM representation of this document."""
-        if dom is None:
-            import xml.dom.minidom as dom
-        domroot = dom.Document()
-        domroot.appendChild(self._dom_node(domroot))
-        return domroot
-
-    def set_id(self, node, msgnode=None):
-        for id in node['ids']:
-            if self.ids.has_key(id) and self.ids[id] is not node:
-                msg = self.reporter.severe('Duplicate ID: "%s".' % id)
-                if msgnode != None:
-                    msgnode += msg
-        if not node['ids']:
-            for name in node['names']:
-                id = self.settings.id_prefix + make_id(name)
-                if id and not self.ids.has_key(id):
-                    break
-            else:
-                id = ''
-                while not id or self.ids.has_key(id):
-                    id = (self.settings.id_prefix +
-                          self.settings.auto_id_prefix + str(self.id_start))
-                    self.id_start += 1
-            node['ids'].append(id)
-        self.ids[id] = node
-        return id
-
-    def set_name_id_map(self, node, id, msgnode=None, explicit=None):
-        """
-        `self.nameids` maps names to IDs, while `self.nametypes` maps names to
-        booleans representing hyperlink type (True==explicit,
-        False==implicit).  This method updates the mappings.
-
-        The following state transition table shows how `self.nameids` ("ids")
-        and `self.nametypes` ("types") change with new input (a call to this
-        method), and what actions are performed ("implicit"-type system
-        messages are INFO/1, and "explicit"-type system messages are ERROR/3):
-
-        ====  =====  ========  ========  =======  ====  =====  =====
-         Old State    Input          Action        New State   Notes
-        -----------  --------  -----------------  -----------  -----
-        ids   types  new type  sys.msg.  dupname  ids   types
-        ====  =====  ========  ========  =======  ====  =====  =====
-        -     -      explicit  -         -        new   True
-        -     -      implicit  -         -        new   False
-        None  False  explicit  -         -        new   True
-        old   False  explicit  implicit  old      new   True
-        None  True   explicit  explicit  new      None  True
-        old   True   explicit  explicit  new,old  None  True   [#]_
-        None  False  implicit  implicit  new      None  False
-        old   False  implicit  implicit  new,old  None  False
-        None  True   implicit  implicit  new      None  True
-        old   True   implicit  implicit  new      old   True
-        ====  =====  ========  ========  =======  ====  =====  =====
-
-        .. [#] Do not clear the name-to-id map or invalidate the old target if
-           both old and new targets are external and refer to identical URIs.
-           The new target is invalidated regardless.
-        """
-        for name in node['names']:
-            if self.nameids.has_key(name):
-                self.set_duplicate_name_id(node, id, name, msgnode, explicit)
-            else:
-                self.nameids[name] = id
-                self.nametypes[name] = explicit
-
-    def set_duplicate_name_id(self, node, id, name, msgnode, explicit):
-        old_id = self.nameids[name]
-        old_explicit = self.nametypes[name]
-        self.nametypes[name] = old_explicit or explicit
-        if explicit:
-            if old_explicit:
-                level = 2
-                if old_id is not None:
-                    old_node = self.ids[old_id]
-                    if node.has_key('refuri'):
-                        refuri = node['refuri']
-                        if old_node['names'] \
-                               and old_node.has_key('refuri') \
-                               and old_node['refuri'] == refuri:
-                            level = 1   # just inform if refuri's identical
-                    if level > 1:
-                        dupname(old_node, name)
-                        self.nameids[name] = None
-                msg = self.reporter.system_message(
-                    level, 'Duplicate explicit target name: "%s".' % name,
-                    backrefs=[id], base_node=node)
-                if msgnode != None:
-                    msgnode += msg
-                dupname(node, name)
-            else:
-                self.nameids[name] = id
-                if old_id is not None:
-                    old_node = self.ids[old_id]
-                    dupname(old_node, name)
-        else:
-            if old_id is not None and not old_explicit:
-                self.nameids[name] = None
-                old_node = self.ids[old_id]
-                dupname(old_node, name)
-            dupname(node, name)
-        if not explicit or (not old_explicit and old_id is not None):
-            msg = self.reporter.info(
-                'Duplicate implicit target name: "%s".' % name,
-                backrefs=[id], base_node=node)
-            if msgnode != None:
-                msgnode += msg
-
-    def has_name(self, name):
-        return self.nameids.has_key(name)
-
-    # "note" here is an imperative verb: "take note of".
-    def note_implicit_target(self, target, msgnode=None):
-        id = self.set_id(target, msgnode)
-        self.set_name_id_map(target, id, msgnode, explicit=None)
-
-    def note_explicit_target(self, target, msgnode=None):
-        id = self.set_id(target, msgnode)
-        self.set_name_id_map(target, id, msgnode, explicit=1)
-
-    def note_refname(self, node):
-        self.refnames.setdefault(node['refname'], []).append(node)
-
-    def note_refid(self, node):
-        self.refids.setdefault(node['refid'], []).append(node)
-
-    def note_indirect_target(self, target):
-        self.indirect_targets.append(target)
-        if target['names']:
-            self.note_refname(target)
-
-    def note_anonymous_target(self, target):
-        self.set_id(target)
-
-    def note_autofootnote(self, footnote):
-        self.set_id(footnote)
-        self.autofootnotes.append(footnote)
-
-    def note_autofootnote_ref(self, ref):
-        self.set_id(ref)
-        self.autofootnote_refs.append(ref)
-
-    def note_symbol_footnote(self, footnote):
-        self.set_id(footnote)
-        self.symbol_footnotes.append(footnote)
-
-    def note_symbol_footnote_ref(self, ref):
-        self.set_id(ref)
-        self.symbol_footnote_refs.append(ref)
-
-    def note_footnote(self, footnote):
-        self.set_id(footnote)
-        self.footnotes.append(footnote)
-
-    def note_footnote_ref(self, ref):
-        self.set_id(ref)
-        self.footnote_refs.setdefault(ref['refname'], []).append(ref)
-        self.note_refname(ref)
-
-    def note_citation(self, citation):
-        self.citations.append(citation)
-
-    def note_citation_ref(self, ref):
-        self.set_id(ref)
-        self.citation_refs.setdefault(ref['refname'], []).append(ref)
-        self.note_refname(ref)
-
-    def note_substitution_def(self, subdef, def_name, msgnode=None):
-        name = whitespace_normalize_name(def_name)
-        if self.substitution_defs.has_key(name):
-            msg = self.reporter.error(
-                  'Duplicate substitution definition name: "%s".' % name,
-                  base_node=subdef)
-            if msgnode != None:
-                msgnode += msg
-            oldnode = self.substitution_defs[name]
-            dupname(oldnode, name)
-        # keep only the last definition:
-        self.substitution_defs[name] = subdef
-        # case-insensitive mapping:
-        self.substitution_names[fully_normalize_name(name)] = name
-
-    def note_substitution_ref(self, subref, refname):
-        subref['refname'] = whitespace_normalize_name(refname)
-
-    def note_pending(self, pending, priority=None):
-        self.transformer.add_pending(pending, priority)
-
-    def note_parse_message(self, message):
-        self.parse_messages.append(message)
-
-    def note_transform_message(self, message):
-        self.transform_messages.append(message)
-
-    def note_source(self, source, offset):
-        self.current_source = source
-        if offset is None:
-            self.current_line = offset
-        else:
-            self.current_line = offset + 1
-
-    def copy(self):
-        return self.__class__(self.settings, self.reporter,
-                              **self.attributes)
-
-    def get_decoration(self):
-        if not self.decoration:
-            self.decoration = decoration()
-            index = self.first_child_not_matching_class(Titular)
-            if index is None:
-                self.append(self.decoration)
-            else:
-                self.insert(index, self.decoration)
-        return self.decoration
-
-
-# ================
-#  Title Elements
-# ================
-
-class title(Titular, PreBibliographic, TextElement): pass
-class subtitle(Titular, PreBibliographic, TextElement): pass
-class rubric(Titular, TextElement): pass
-
-
-# ========================
-#  Bibliographic Elements
-# ========================
-
-class docinfo(Bibliographic, Element): pass
-class author(Bibliographic, TextElement): pass
-class authors(Bibliographic, Element): pass
-class organization(Bibliographic, TextElement): pass
-class address(Bibliographic, FixedTextElement): pass
-class contact(Bibliographic, TextElement): pass
-class version(Bibliographic, TextElement): pass
-class revision(Bibliographic, TextElement): pass
-class status(Bibliographic, TextElement): pass
-class date(Bibliographic, TextElement): pass
-class copyright(Bibliographic, TextElement): pass
-
-
-# =====================
-#  Decorative Elements
-# =====================
-
-class decoration(Decorative, Element):
-
-    def get_header(self):
-        if not len(self.children) or not isinstance(self.children[0], header):
-            self.insert(0, header())
-        return self.children[0]
-
-    def get_footer(self):
-        if not len(self.children) or not isinstance(self.children[-1], footer):
-            self.append(footer())
-        return self.children[-1]
-
-
-class header(Decorative, Element): pass
-class footer(Decorative, Element): pass
-
-
-# =====================
-#  Structural Elements
-# =====================
-
-class section(Structural, Element): pass
-
-
-class topic(Structural, Element):
-
-    """
-    Topics are terminal, "leaf" mini-sections, like block quotes with titles,
-    or textual figures.  A topic is just like a section, except that it has no
-    subsections, and it doesn't have to conform to section placement rules.
-
-    Topics are allowed wherever body elements (list, table, etc.) are allowed,
-    but only at the top level of a section or document.  Topics cannot nest
-    inside topics, sidebars, or body elements; you can't have a topic inside a
-    table, list, block quote, etc.
-    """
-
-
-class sidebar(Structural, Element):
-
-    """
-    Sidebars are like miniature, parallel documents that occur inside other
-    documents, providing related or reference material.  A sidebar is
-    typically offset by a border and "floats" to the side of the page; the
-    document's main text may flow around it.  Sidebars can also be likened to
-    super-footnotes; their content is outside of the flow of the document's
-    main text.
-
-    Sidebars are allowed wherever body elements (list, table, etc.) are
-    allowed, but only at the top level of a section or document.  Sidebars
-    cannot nest inside sidebars, topics, or body elements; you can't have a
-    sidebar inside a table, list, block quote, etc.
-    """
-
-
-class transition(Structural, Element): pass
-
-
-# ===============
-#  Body Elements
-# ===============
-
-class paragraph(General, TextElement): pass
-class compound(General, Element): pass
-class container(General, Element): pass
-class bullet_list(Sequential, Element): pass
-class enumerated_list(Sequential, Element): pass
-class list_item(Part, Element): pass
-class definition_list(Sequential, Element): pass
-class definition_list_item(Part, Element): pass
-class term(Part, TextElement): pass
-class classifier(Part, TextElement): pass
-class definition(Part, Element): pass
-class field_list(Sequential, Element): pass
-class field(Part, Element): pass
-class field_name(Part, TextElement): pass
-class field_body(Part, Element): pass
-
-
-class option(Part, Element):
-
-    child_text_separator = ''
-
-
-class option_argument(Part, TextElement):
-
-    def astext(self):
-        return self.get('delimiter', ' ') + TextElement.astext(self)
-
-
-class option_group(Part, Element):
-
-    child_text_separator = ', '
-
-
-class option_list(Sequential, Element): pass
-
-
-class option_list_item(Part, Element):
-
-    child_text_separator = '  '
-
-
-class option_string(Part, TextElement): pass
-class description(Part, Element): pass
-class literal_block(General, FixedTextElement): pass
-class doctest_block(General, FixedTextElement): pass
-class line_block(General, Element): pass
-
-
-class line(Part, TextElement):
-
-    indent = None
-
-
-class block_quote(General, Element): pass
-class attribution(Part, TextElement): pass
-class attention(Admonition, Element): pass
-class caution(Admonition, Element): pass
-class danger(Admonition, Element): pass
-class error(Admonition, Element): pass
-class important(Admonition, Element): pass
-class note(Admonition, Element): pass
-class tip(Admonition, Element): pass
-class hint(Admonition, Element): pass
-class warning(Admonition, Element): pass
-class admonition(Admonition, Element): pass
-class comment(Special, Invisible, FixedTextElement): pass
-class substitution_definition(Special, Invisible, TextElement): pass
-class target(Special, Invisible, Inline, TextElement, Targetable): pass
-class footnote(General, BackLinkable, Element, Labeled, Targetable): pass
-class citation(General, BackLinkable, Element, Labeled, Targetable): pass
-class label(Part, TextElement): pass
-class figure(General, Element): pass
-class caption(Part, TextElement): pass
-class legend(Part, Element): pass
-class table(General, Element): pass
-class tgroup(Part, Element): pass
-class colspec(Part, Element): pass
-class thead(Part, Element): pass
-class tbody(Part, Element): pass
-class row(Part, Element): pass
-class entry(Part, Element): pass
-
-
-class system_message(Special, BackLinkable, PreBibliographic, Element):
-
-    """
-    System message element.
-
-    Do not instantiate this class directly; use
-    ``document.reporter.info/warning/error/severe()`` instead.
-    """
-
-    def __init__(self, message=None, *children, **attributes):
-        if message:
-            p = paragraph('', message)
-            children = (p,) + children
-        try:
-            Element.__init__(self, '', *children, **attributes)
-        except:
-            print 'system_message: children=%r' % (children,)
-            raise
-
-    def astext(self):
-        line = self.get('line', '')
-        return u'%s:%s: (%s/%s) %s' % (self['source'], line, self['type'],
-                                       self['level'], Element.astext(self))
-
-
-class pending(Special, Invisible, Element):
-
-    """
-    The "pending" element is used to encapsulate a pending operation: the
-    operation (transform), the point at which to apply it, and any data it
-    requires.  Only the pending operation's location within the document is
-    stored in the public document tree (by the "pending" object itself); the
-    operation and its data are stored in the "pending" object's internal
-    instance attributes.
-
-    For example, say you want a table of contents in your reStructuredText
-    document.  The easiest way to specify where to put it is from within the
-    document, with a directive::
-
-        .. contents::
-
-    But the "contents" directive can't do its work until the entire document
-    has been parsed and possibly transformed to some extent.  So the directive
-    code leaves a placeholder behind that will trigger the second phase of its
-    processing, something like this::
-
-        <pending ...public attributes...> + internal attributes
-
-    Use `document.note_pending()` so that the
-    `docutils.transforms.Transformer` stage of processing can run all pending
-    transforms.
-    """
-
-    def __init__(self, transform, details=None,
-                 rawsource='', *children, **attributes):
-        Element.__init__(self, rawsource, *children, **attributes)
-
-        self.transform = transform
-        """The `docutils.transforms.Transform` class implementing the pending
-        operation."""
-
-        self.details = details or {}
-        """Detail data (dictionary) required by the pending operation."""
-
-    def pformat(self, indent='    ', level=0):
-        internals = [
-              '.. internal attributes:',
-              '     .transform: %s.%s' % (self.transform.__module__,
-                                          self.transform.__name__),
-              '     .details:']
-        details = self.details.items()
-        details.sort()
-        for key, value in details:
-            if isinstance(value, Node):
-                internals.append('%7s%s:' % ('', key))
-                internals.extend(['%9s%s' % ('', line)
-                                  for line in value.pformat().splitlines()])
-            elif value and isinstance(value, ListType) \
-                  and isinstance(value[0], Node):
-                internals.append('%7s%s:' % ('', key))
-                for v in value:
-                    internals.extend(['%9s%s' % ('', line)
-                                      for line in v.pformat().splitlines()])
-            else:
-                internals.append('%7s%s: %r' % ('', key, value))
-        return (Element.pformat(self, indent, level)
-                + ''.join([('    %s%s\n' % (indent * level, line))
-                           for line in internals]))
-
-    def copy(self):
-        return self.__class__(self.transform, self.details, self.rawsource,
-                              **self.attributes)
-
-
-class raw(Special, Inline, PreBibliographic, FixedTextElement):
-
-    """
-    Raw data that is to be passed untouched to the Writer.
-    """
-
-    pass
-
-
-# =================
-#  Inline Elements
-# =================
-
-class emphasis(Inline, TextElement): pass
-class strong(Inline, TextElement): pass
-class literal(Inline, TextElement): pass
-class reference(General, Inline, Referential, TextElement): pass
-class footnote_reference(Inline, Referential, TextElement): pass
-class citation_reference(Inline, Referential, TextElement): pass
-class substitution_reference(Inline, TextElement): pass
-class title_reference(Inline, TextElement): pass
-class abbreviation(Inline, TextElement): pass
-class acronym(Inline, TextElement): pass
-class superscript(Inline, TextElement): pass
-class subscript(Inline, TextElement): pass
-
-
-class image(General, Inline, Element):
-
-    def astext(self):
-        return self.get('alt', '')
-
-
-class inline(Inline, TextElement): pass
-class problematic(Inline, TextElement): pass
-class generated(Inline, TextElement): pass
-
-
-# ========================================
-#  Auxiliary Classes, Functions, and Data
-# ========================================
-
-node_class_names = """
-    Text
-    abbreviation acronym address admonition attention attribution author
-        authors
-    block_quote bullet_list
-    caption caution citation citation_reference classifier colspec comment
-        compound contact container copyright
-    danger date decoration definition definition_list definition_list_item
-        description docinfo doctest_block document
-    emphasis entry enumerated_list error
-    field field_body field_list field_name figure footer
-        footnote footnote_reference
-    generated
-    header hint
-    image important inline
-    label legend line line_block list_item literal literal_block
-    note
-    option option_argument option_group option_list option_list_item
-        option_string organization
-    paragraph pending problematic
-    raw reference revision row rubric
-    section sidebar status strong subscript substitution_definition
-        substitution_reference subtitle superscript system_message
-    table target tbody term tgroup thead tip title title_reference topic
-        transition
-    version
-    warning""".split()
-"""A list of names of all concrete Node subclasses."""
-
-
-class NodeVisitor:
-
-    """
-    "Visitor" pattern [GoF95]_ abstract superclass implementation for
-    document tree traversals.
-
-    Each node class has corresponding methods, doing nothing by
-    default; override individual methods for specific and useful
-    behaviour.  The `dispatch_visit()` method is called by
-    `Node.walk()` upon entering a node.  `Node.walkabout()` also calls
-    the `dispatch_departure()` method before exiting a node.
-
-    The dispatch methods call "``visit_`` + node class name" or
-    "``depart_`` + node class name", resp.
-
-    This is a base class for visitors whose ``visit_...`` & ``depart_...``
-    methods should be implemented for *all* node types encountered (such as
-    for `docutils.writers.Writer` subclasses).  Unimplemented methods will
-    raise exceptions.
-
-    For sparse traversals, where only certain node types are of interest,
-    subclass `SparseNodeVisitor` instead.  When (mostly or entirely) uniform
-    processing is desired, subclass `GenericNodeVisitor`.
-
-    .. [GoF95] Gamma, Helm, Johnson, Vlissides. *Design Patterns: Elements of
-       Reusable Object-Oriented Software*. Addison-Wesley, Reading, MA, USA,
-       1995.
-    """
-
-    optional = ()
-    """
-    Tuple containing node class names (as strings).
-
-    No exception will be raised if writers do not implement visit
-    or departure functions for these node classes.
-
-    Used to ensure transitional compatibility with existing 3rd-party writers.
-    """
-
-    def __init__(self, document):
-        self.document = document
-
-    def dispatch_visit(self, node):
-        """
-        Call self."``visit_`` + node class name" with `node` as
-        parameter.  If the ``visit_...`` method does not exist, call
-        self.unknown_visit.
-        """
-        node_name = node.__class__.__name__
-        method = getattr(self, 'visit_' + node_name, self.unknown_visit)
-        self.document.reporter.debug(
-            'docutils.nodes.NodeVisitor.dispatch_visit calling %s for %s'
-            % (method.__name__, node_name))
-        return method(node)
-
-    def dispatch_departure(self, node):
-        """
-        Call self."``depart_`` + node class name" with `node` as
-        parameter.  If the ``depart_...`` method does not exist, call
-        self.unknown_departure.
-        """
-        node_name = node.__class__.__name__
-        method = getattr(self, 'depart_' + node_name, self.unknown_departure)
-        self.document.reporter.debug(
-            'docutils.nodes.NodeVisitor.dispatch_departure calling %s for %s'
-            % (method.__name__, node_name))
-        return method(node)
-
-    def unknown_visit(self, node):
-        """
-        Called when entering unknown `Node` types.
-
-        Raise an exception unless overridden.
-        """
-        if  (node.document.settings.strict_visitor
-             or node.__class__.__name__ not in self.optional):
-            raise NotImplementedError(
-                '%s visiting unknown node type: %s'
-                % (self.__class__, node.__class__.__name__))
-
-    def unknown_departure(self, node):
-        """
-        Called before exiting unknown `Node` types.
-
-        Raise exception unless overridden.
-        """
-        if  (node.document.settings.strict_visitor
-             or node.__class__.__name__ not in self.optional):
-            raise NotImplementedError(
-                '%s departing unknown node type: %s'
-                % (self.__class__, node.__class__.__name__))
-
-
-class SparseNodeVisitor(NodeVisitor):
-
-    """
-    Base class for sparse traversals, where only certain node types are of
-    interest.  When ``visit_...`` & ``depart_...`` methods should be
-    implemented for *all* node types (such as for `docutils.writers.Writer`
-    subclasses), subclass `NodeVisitor` instead.
-    """
-
-
-class GenericNodeVisitor(NodeVisitor):
-
-    """
-    Generic "Visitor" abstract superclass, for simple traversals.
-
-    Unless overridden, each ``visit_...`` method calls `default_visit()`, and
-    each ``depart_...`` method (when using `Node.walkabout()`) calls
-    `default_departure()`. `default_visit()` (and `default_departure()`) must
-    be overridden in subclasses.
-
-    Define fully generic visitors by overriding `default_visit()` (and
-    `default_departure()`) only. Define semi-generic visitors by overriding
-    individual ``visit_...()`` (and ``depart_...()``) methods also.
-
-    `NodeVisitor.unknown_visit()` (`NodeVisitor.unknown_departure()`) should
-    be overridden for default behavior.
-    """
-
-    def default_visit(self, node):
-        """Override for generic, uniform traversals."""
-        raise NotImplementedError
-
-    def default_departure(self, node):
-        """Override for generic, uniform traversals."""
-        raise NotImplementedError
-
-def _call_default_visit(self, node):
-    self.default_visit(node)
-
-def _call_default_departure(self, node):
-    self.default_departure(node)
-
-def _nop(self, node):
-    pass
-
-def _add_node_class_names(names):
-    """Save typing with dynamic assignments:"""
-    for _name in names:
-        setattr(GenericNodeVisitor, "visit_" + _name, _call_default_visit)
-        setattr(GenericNodeVisitor, "depart_" + _name, _call_default_departure)
-        setattr(SparseNodeVisitor, 'visit_' + _name, _nop)
-        setattr(SparseNodeVisitor, 'depart_' + _name, _nop)
-
-_add_node_class_names(node_class_names)
-
-
-class TreeCopyVisitor(GenericNodeVisitor):
-
-    """
-    Make a complete copy of a tree or branch, including element attributes.
-    """
-
-    def __init__(self, document):
-        GenericNodeVisitor.__init__(self, document)
-        self.parent_stack = []
-        self.parent = []
-
-    def get_tree_copy(self):
-        return self.parent[0]
-
-    def default_visit(self, node):
-        """Copy the current node, and make it the new acting parent."""
-        newnode = node.copy()
-        self.parent.append(newnode)
-        self.parent_stack.append(self.parent)
-        self.parent = newnode
-
-    def default_departure(self, node):
-        """Restore the previous acting parent."""
-        self.parent = self.parent_stack.pop()
-
-
-class TreePruningException(Exception):
-
-    """
-    Base class for `NodeVisitor`-related tree pruning exceptions.
-
-    Raise subclasses from within ``visit_...`` or ``depart_...`` methods
-    called from `Node.walk()` and `Node.walkabout()` tree traversals to prune
-    the tree traversed.
-    """
-
-    pass
-
-
-class SkipChildren(TreePruningException):
-
-    """
-    Do not visit any children of the current node.  The current node's
-    siblings and ``depart_...`` method are not affected.
-    """
-
-    pass
-
-
-class SkipSiblings(TreePruningException):
-
-    """
-    Do not visit any more siblings (to the right) of the current node.  The
-    current node's children and its ``depart_...`` method are not affected.
-    """
-
-    pass
-
-
-class SkipNode(TreePruningException):
-
-    """
-    Do not visit the current node's children, and do not call the current
-    node's ``depart_...`` method.
-    """
-
-    pass
-
-
-class SkipDeparture(TreePruningException):
-
-    """
-    Do not call the current node's ``depart_...`` method.  The current node's
-    children and siblings are not affected.
-    """
-
-    pass
-
-
-class NodeFound(TreePruningException):
-
-    """
-    Raise to indicate that the target of a search has been found.  This
-    exception must be caught by the client; it is not caught by the traversal
-    code.
-    """
-
-    pass
-
-
-class StopTraversal(TreePruningException):
-
-    """
-    Stop the traversal alltogether.  The current node's ``depart_...`` method
-    is not affected.  The parent nodes ``depart_...`` methods are also called
-    as usual.  No other nodes are visited.  This is an alternative to
-    NodeFound that does not cause exception handling to trickle up to the
-    caller.
-    """
-
-    pass
-
-
-def make_id(string):
-    """
-    Convert `string` into an identifier and return it.
-
-    Docutils identifiers will conform to the regular expression
-    ``[a-z](-?[a-z0-9]+)*``.  For CSS compatibility, identifiers (the "class"
-    and "id" attributes) should have no underscores, colons, or periods.
-    Hyphens may be used.
-
-    - The `HTML 4.01 spec`_ defines identifiers based on SGML tokens:
-
-          ID and NAME tokens must begin with a letter ([A-Za-z]) and may be
-          followed by any number of letters, digits ([0-9]), hyphens ("-"),
-          underscores ("_"), colons (":"), and periods (".").
-
-    - However the `CSS1 spec`_ defines identifiers based on the "name" token,
-      a tighter interpretation ("flex" tokenizer notation; "latin1" and
-      "escape" 8-bit characters have been replaced with entities)::
-
-          unicode     \\[0-9a-f]{1,4}
-          latin1      [&iexcl;-&yuml;]
-          escape      {unicode}|\\[ -~&iexcl;-&yuml;]
-          nmchar      [-a-z0-9]|{latin1}|{escape}
-          name        {nmchar}+
-
-    The CSS1 "nmchar" rule does not include underscores ("_"), colons (":"),
-    or periods ("."), therefore "class" and "id" attributes should not contain
-    these characters. They should be replaced with hyphens ("-"). Combined
-    with HTML's requirements (the first character must be a letter; no
-    "unicode", "latin1", or "escape" characters), this results in the
-    ``[a-z](-?[a-z0-9]+)*`` pattern.
-
-    .. _HTML 4.01 spec: http://www.w3.org/TR/html401
-    .. _CSS1 spec: http://www.w3.org/TR/REC-CSS1
-    """
-    id = _non_id_chars.sub('-', ' '.join(string.lower().split()))
-    id = _non_id_at_ends.sub('', id)
-    return str(id)
-
-_non_id_chars = re.compile('[^a-z0-9]+')
-_non_id_at_ends = re.compile('^[-0-9]+|-+$')
-
-def dupname(node, name):
-    node['dupnames'].append(name)
-    node['names'].remove(name)
-    # Assume that this method is referenced, even though it isn't; we
-    # don't want to throw unnecessary system_messages.
-    node.referenced = 1
-
-def fully_normalize_name(name):
-    """Return a case- and whitespace-normalized name."""
-    return ' '.join(name.lower().split())
-
-def whitespace_normalize_name(name):
-    """Return a whitespace-normalized name."""
-    return ' '.join(name.split())
-
-def serial_escape(value):
-    """Escape string values that are elements of a list, for serialization."""
-    return value.replace('\\', r'\\').replace(' ', r'\ ')
-
-# 
-#
-# Local Variables:
-# indent-tabs-mode: nil
-# sentence-end-double-space: t
-# fill-column: 78
-# End:
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-This package contains Docutils parser modules.
-"""
-
-__docformat__ = 'reStructuredText'
-
-from docutils import Component
-
-
-class Parser(Component):
-
-    component_type = 'parser'
-    config_section = 'parsers'
-
-    def parse(self, inputstring, document):
-        """Override to parse `inputstring` into document tree `document`."""
-        raise NotImplementedError('subclass must override this method')
-
-    def setup_parse(self, inputstring, document):
-        """Initial parse setup.  Call at start of `self.parse()`."""
-        self.inputstring = inputstring
-        self.document = document
-        document.reporter.attach_observer(document.note_parse_message)
-
-    def finish_parse(self):
-        """Finalize parse details.  Call at end of `self.parse()`."""
-        self.document.reporter.detach_observer(
-            self.document.note_parse_message)
-
-
-_parser_aliases = {
-      'restructuredtext': 'rst',
-      'rest': 'rst',
-      'restx': 'rst',
-      'rtxt': 'rst',}
-
-def get_parser_class(parser_name):
-    """Return the Parser class from the `parser_name` module."""
-    parser_name = parser_name.lower()
-    if _parser_aliases.has_key(parser_name):
-        parser_name = _parser_aliases[parser_name]
-    module = __import__(parser_name, globals(), locals())
-    return module.Parser
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/null.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-# $Id: null.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Martin Blais <blais@furius.ca>
-# Copyright: This module has been placed in the public domain.
-
-"""A do-nothing parser."""
-
-from docutils import parsers
-
-
-class Parser(parsers.Parser):
-
-    """A do-nothing parser."""
-
-    supported = ('null',)
-
-    config_section = 'null parser'
-    config_section_dependencies = ('parsers',)
-
-    def parse(self, inputstring, document):
-        pass
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,367 +0,0 @@
-# $Id: __init__.py 4802 2006-11-12 18:02:17Z goodger $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-This is ``docutils.parsers.rst`` package. It exports a single class, `Parser`,
-the reStructuredText parser.
-
-
-Usage
-=====
-
-1. Create a parser::
-
-       parser = docutils.parsers.rst.Parser()
-
-   Several optional arguments may be passed to modify the parser's behavior.
-   Please see `Customizing the Parser`_ below for details.
-
-2. Gather input (a multi-line string), by reading a file or the standard
-   input::
-
-       input = sys.stdin.read()
-
-3. Create a new empty `docutils.nodes.document` tree::
-
-       document = docutils.utils.new_document(source, settings)
-
-   See `docutils.utils.new_document()` for parameter details.
-
-4. Run the parser, populating the document tree::
-
-       parser.parse(input, document)
-
-
-Parser Overview
-===============
-
-The reStructuredText parser is implemented as a state machine, examining its
-input one line at a time. To understand how the parser works, please first
-become familiar with the `docutils.statemachine` module, then see the
-`states` module.
-
-
-Customizing the Parser
-----------------------
-
-Anything that isn't already customizable is that way simply because that type
-of customizability hasn't been implemented yet.  Patches welcome!
-
-When instantiating an object of the `Parser` class, two parameters may be
-passed: ``rfc2822`` and ``inliner``.  Pass ``rfc2822=1`` to enable an initial
-RFC-2822 style header block, parsed as a "field_list" element (with "class"
-attribute set to "rfc2822").  Currently this is the only body-level element
-which is customizable without subclassing.  (Tip: subclass `Parser` and change
-its "state_classes" and "initial_state" attributes to refer to new classes.
-Contact the author if you need more details.)
-
-The ``inliner`` parameter takes an instance of `states.Inliner` or a subclass.
-It handles inline markup recognition.  A common extension is the addition of
-further implicit hyperlinks, like "RFC 2822".  This can be done by subclassing
-`states.Inliner`, adding a new method for the implicit markup, and adding a
-``(pattern, method)`` pair to the "implicit_dispatch" attribute of the
-subclass.  See `states.Inliner.implicit_inline()` for details.  Explicit
-inline markup can be customized in a `states.Inliner` subclass via the
-``patterns.initial`` and ``dispatch`` attributes (and new methods as
-appropriate).
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import docutils.parsers
-import docutils.statemachine
-from docutils.parsers.rst import states
-from docutils import frontend, nodes
-
-
-class Parser(docutils.parsers.Parser):
-
-    """The reStructuredText parser."""
-
-    supported = ('restructuredtext', 'rst', 'rest', 'restx', 'rtxt', 'rstx')
-    """Aliases this parser supports."""
-
-    settings_spec = (
-        'reStructuredText Parser Options',
-        None,
-        (('Recognize and link to standalone PEP references (like "PEP 258").',
-          ['--pep-references'],
-          {'action': 'store_true', 'validator': frontend.validate_boolean}),
-         ('Base URL for PEP references '
-          '(default "http://www.python.org/dev/peps/").',
-          ['--pep-base-url'],
-          {'metavar': '<URL>', 'default': 'http://www.python.org/dev/peps/',
-           'validator': frontend.validate_url_trailing_slash}),
-         ('Template for PEP file part of URL. (default "pep-%04d")',
-          ['--pep-file-url-template'],
-          {'metavar': '<URL>', 'default': 'pep-%04d'}),
-         ('Recognize and link to standalone RFC references (like "RFC 822").',
-          ['--rfc-references'],
-          {'action': 'store_true', 'validator': frontend.validate_boolean}),
-         ('Base URL for RFC references (default "http://www.faqs.org/rfcs/").',
-          ['--rfc-base-url'],
-          {'metavar': '<URL>', 'default': 'http://www.faqs.org/rfcs/',
-           'validator': frontend.validate_url_trailing_slash}),
-         ('Set number of spaces for tab expansion (default 8).',
-          ['--tab-width'],
-          {'metavar': '<width>', 'type': 'int', 'default': 8,
-           'validator': frontend.validate_nonnegative_int}),
-         ('Remove spaces before footnote references.',
-          ['--trim-footnote-reference-space'],
-          {'action': 'store_true', 'validator': frontend.validate_boolean}),
-         ('Leave spaces before footnote references.',
-          ['--leave-footnote-reference-space'],
-          {'action': 'store_false', 'dest': 'trim_footnote_reference_space'}),
-         ('Disable directives that insert the contents of external file '
-          '("include" & "raw"); replaced with a "warning" system message.',
-          ['--no-file-insertion'],
-          {'action': 'store_false', 'default': 1,
-           'dest': 'file_insertion_enabled',
-           'validator': frontend.validate_boolean}),
-         ('Enable directives that insert the contents of external file '
-          '("include" & "raw").  Enabled by default.',
-          ['--file-insertion-enabled'],
-          {'action': 'store_true'}),
-         ('Disable the "raw" directives; replaced with a "warning" '
-          'system message.',
-          ['--no-raw'],
-          {'action': 'store_false', 'default': 1, 'dest': 'raw_enabled',
-           'validator': frontend.validate_boolean}),
-         ('Enable the "raw" directive.  Enabled by default.',
-          ['--raw-enabled'],
-          {'action': 'store_true'}),))
-
-    config_section = 'restructuredtext parser'
-    config_section_dependencies = ('parsers',)
-
-    def __init__(self, rfc2822=None, inliner=None):
-        if rfc2822:
-            self.initial_state = 'RFC2822Body'
-        else:
-            self.initial_state = 'Body'
-        self.state_classes = states.state_classes
-        self.inliner = inliner
-
-    def parse(self, inputstring, document):
-        """Parse `inputstring` and populate `document`, a document tree."""
-        self.setup_parse(inputstring, document)
-        self.statemachine = states.RSTStateMachine(
-              state_classes=self.state_classes,
-              initial_state=self.initial_state,
-              debug=document.reporter.debug_flag)
-        inputlines = docutils.statemachine.string2lines(
-              inputstring, tab_width=document.settings.tab_width,
-              convert_whitespace=1)
-        self.statemachine.run(inputlines, document, inliner=self.inliner)
-        self.finish_parse()
-
-
-class DirectiveError(Exception):
-
-    """
-    Store a message and a system message level.
-
-    To be thrown from inside directive code.
-
-    Do not instantiate directly -- use `Directive.directive_error()`
-    instead!
-    """
-
-    def __init__(self, level, message):
-        """
-        Initialize with message `message`.  `level` is a system message level.
-        """
-        Exception.__init__(self)
-        self.level = level
-        self.message = message
-
-
-class Directive:
-
-    """
-    Base class for reStructuredText directives.
-
-    The following attributes may be set by subclasses.  They are
-    interpreted by the directive parser (which runs the directive
-    class):
-
-    - `required_arguments`: The number of required arguments (default:
-      0).
-
-    - `optional_arguments`: The number of optional arguments (default:
-      0).
-
-    - `final_argument_whitespace`: A boolean, indicating if the final
-      argument may contain whitespace (default: False).
-
-    - `option_spec`: A dictionary, mapping known option names to
-      conversion functions such as `int` or `float` (default: {}, no
-      options).  Several conversion functions are defined in the
-      directives/__init__.py module.
-
-      Option conversion functions take a single parameter, the option
-      argument (a string or ``None``), validate it and/or convert it
-      to the appropriate form.  Conversion functions may raise
-      `ValueError` and `TypeError` exceptions.
-
-    - `has_content`: A boolean; True if content is allowed.  Client
-      code must handle the case where content is required but not
-      supplied (an empty content list will be supplied).
-
-    Arguments are normally single whitespace-separated words.  The
-    final argument may contain whitespace and/or newlines if
-    `final_argument_whitespace` is True.
-
-    If the form of the arguments is more complex, specify only one
-    argument (either required or optional) and set
-    `final_argument_whitespace` to True; the client code must do any
-    context-sensitive parsing.
-
-    When a directive implementation is being run, the directive class
-    is instantiated, and the `run()` method is executed.  During
-    instantiation, the following instance variables are set:
-
-    - ``name`` is the directive type or name (string).
-
-    - ``arguments`` is the list of positional arguments (strings).
-
-    - ``options`` is a dictionary mapping option names (strings) to
-      values (type depends on option conversion functions; see
-      `option_spec` above).
-
-    - ``content`` is a list of strings, the directive content line by line.
-
-    - ``lineno`` is the line number of the first line of the directive.
-
-    - ``content_offset`` is the line offset of the first line of the content from
-      the beginning of the current input.  Used when initiating a nested parse.
-
-    - ``block_text`` is a string containing the entire directive.
-
-    - ``state`` is the state which called the directive function.
-
-    - ``state_machine`` is the state machine which controls the state which called
-      the directive function.
-
-    Directive functions return a list of nodes which will be inserted
-    into the document tree at the point where the directive was
-    encountered.  This can be an empty list if there is nothing to
-    insert.
-
-    For ordinary directives, the list must contain body elements or
-    structural elements.  Some directives are intended specifically
-    for substitution definitions, and must return a list of `Text`
-    nodes and/or inline elements (suitable for inline insertion, in
-    place of the substitution reference).  Such directives must verify
-    substitution definition context, typically using code like this::
-
-        if not isinstance(state, states.SubstitutionDef):
-            error = state_machine.reporter.error(
-                'Invalid context: the "%s" directive can only be used '
-                'within a substitution definition.' % (name),
-                nodes.literal_block(block_text, block_text), line=lineno)
-            return [error]
-    """
-
-    # There is a "Creating reStructuredText Directives" how-to at
-    # <http://docutils.sf.net/docs/howto/rst-directives.html>.  If you
-    # update this docstring, please update the how-to as well.
-
-    required_arguments = 0
-    """Number of required directive arguments."""
-
-    optional_arguments = 0
-    """Number of optional arguments after the required arguments."""
-
-    final_argument_whitespace = False
-    """May the final argument contain whitespace?"""
-
-    option_spec = None
-    """Mapping of option names to validator functions."""
-
-    has_content = False
-    """May the directive have content?"""
-
-    def __init__(self, name, arguments, options, content, lineno,
-                 content_offset, block_text, state, state_machine):
-        self.name = name
-        self.arguments = arguments
-        self.options = options
-        self.content = content
-        self.lineno = lineno
-        self.content_offset = content_offset
-        self.block_text = block_text
-        self.state = state
-        self.state_machine = state_machine
-
-    def run(self):
-        raise NotImplementedError('Must override run() is subclass.')
-
-    # Directive errors:
-
-    def directive_error(self, level, message):
-        """
-        Return a DirectiveError suitable for being thrown as an exception.
-
-        Call "raise self.directive_error(level, message)" from within
-        a directive implementation to return one single system message
-        at level `level`, which automatically gets the directive block
-        and the line number added.
-
-        You'd often use self.error(message) instead, which will
-        generate an ERROR-level directive error.
-        """
-        return DirectiveError(level, message)
-
-    def debug(self, message):
-        return self.directive_error(0, message)
-
-    def info(self, message):
-        return self.directive_error(1, message)
-
-    def warning(self, message):
-        return self.directive_error(2, message)
-
-    def error(self, message):
-        return self.directive_error(3, message)
-
-    def severe(self, message):
-        return self.directive_error(4, message)
-
-    # Convenience methods:
-
-    def assert_has_content(self):
-        """
-        Throw an ERROR-level DirectiveError if the directive doesn't
-        have contents.
-        """
-        if not self.content:
-            raise self.error('Content block expected for the "%s" directive; '
-                             'none found.' % self.name)
-
-
-def convert_directive_function(directive_fn):
-    """
-    Define & return a directive class generated from `directive_fn`.
-
-    `directive_fn` uses the old-style, functional interface.
-    """
-
-    class FunctionalDirective(Directive):
-
-        option_spec = getattr(directive_fn, 'options', None)
-        has_content = getattr(directive_fn, 'content', False)
-        _argument_spec = getattr(directive_fn, 'arguments', (0, 0, False))
-        required_arguments, optional_arguments, final_argument_whitespace \
-            = _argument_spec
-
-        def run(self):
-            return directive_fn(
-                self.name, self.arguments, self.options, self.content,
-                self.lineno, self.content_offset, self.block_text,
-                self.state, self.state_machine)
-
-    # Return new-style directive.
-    return FunctionalDirective
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,367 +0,0 @@
-# $Id: __init__.py 4667 2006-07-12 21:40:56Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-This package contains directive implementation modules.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import re
-import codecs
-from docutils import nodes
-from docutils.parsers.rst.languages import en as _fallback_language_module
-
-
-_directive_registry = {
-      'attention': ('admonitions', 'Attention'),
-      'caution': ('admonitions', 'Caution'),
-      'danger': ('admonitions', 'Danger'),
-      'error': ('admonitions', 'Error'),
-      'important': ('admonitions', 'Important'),
-      'note': ('admonitions', 'Note'),
-      'tip': ('admonitions', 'Tip'),
-      'hint': ('admonitions', 'Hint'),
-      'warning': ('admonitions', 'Warning'),
-      'admonition': ('admonitions', 'Admonition'),
-      'sidebar': ('body', 'Sidebar'),
-      'topic': ('body', 'Topic'),
-      'line-block': ('body', 'LineBlock'),
-      'parsed-literal': ('body', 'ParsedLiteral'),
-      'rubric': ('body', 'Rubric'),
-      'epigraph': ('body', 'Epigraph'),
-      'highlights': ('body', 'Highlights'),
-      'pull-quote': ('body', 'PullQuote'),
-      'compound': ('body', 'Compound'),
-      'container': ('body', 'Container'),
-      #'questions': ('body', 'question_list'),
-      'table': ('tables', 'RSTTable'),
-      'csv-table': ('tables', 'CSVTable'),
-      'list-table': ('tables', 'ListTable'),
-      'image': ('images', 'Image'),
-      'figure': ('images', 'Figure'),
-      'contents': ('parts', 'Contents'),
-      'sectnum': ('parts', 'Sectnum'),
-      'header': ('parts', 'Header'),
-      'footer': ('parts', 'Footer'),
-      #'footnotes': ('parts', 'footnotes'),
-      #'citations': ('parts', 'citations'),
-      'target-notes': ('references', 'TargetNotes'),
-      'meta': ('html', 'Meta'),
-      #'imagemap': ('html', 'imagemap'),
-      'raw': ('misc', 'Raw'),
-      'include': ('misc', 'Include'),
-      'replace': ('misc', 'Replace'),
-      'unicode': ('misc', 'Unicode'),
-      'class': ('misc', 'Class'),
-      'role': ('misc', 'Role'),
-      'default-role': ('misc', 'DefaultRole'),
-      'title': ('misc', 'Title'),
-      'date': ('misc', 'Date'),
-      'restructuredtext-test-directive': ('misc', 'TestDirective'),}
-"""Mapping of directive name to (module name, class name).  The
-directive name is canonical & must be lowercase.  Language-dependent
-names are defined in the ``language`` subpackage."""
-
-_directives = {}
-"""Cache of imported directives."""
-
-def directive(directive_name, language_module, document):
-    """
-    Locate and return a directive function from its language-dependent name.
-    If not found in the current language, check English.  Return None if the
-    named directive cannot be found.
-    """
-    normname = directive_name.lower()
-    messages = []
-    msg_text = []
-    if _directives.has_key(normname):
-        return _directives[normname], messages
-    canonicalname = None
-    try:
-        canonicalname = language_module.directives[normname]
-    except AttributeError, error:
-        msg_text.append('Problem retrieving directive entry from language '
-                        'module %r: %s.' % (language_module, error))
-    except KeyError:
-        msg_text.append('No directive entry for "%s" in module "%s".'
-                        % (directive_name, language_module.__name__))
-    if not canonicalname:
-        try:
-            canonicalname = _fallback_language_module.directives[normname]
-            msg_text.append('Using English fallback for directive "%s".'
-                            % directive_name)
-        except KeyError:
-            msg_text.append('Trying "%s" as canonical directive name.'
-                            % directive_name)
-            # The canonical name should be an English name, but just in case:
-            canonicalname = normname
-    if msg_text:
-        message = document.reporter.info(
-            '\n'.join(msg_text), line=document.current_line)
-        messages.append(message)
-    try:
-        modulename, classname = _directive_registry[canonicalname]
-    except KeyError:
-        # Error handling done by caller.
-        return None, messages
-    try:
-        module = __import__(modulename, globals(), locals())
-    except ImportError, detail:
-        messages.append(document.reporter.error(
-            'Error importing directive module "%s" (directive "%s"):\n%s'
-            % (modulename, directive_name, detail),
-            line=document.current_line))
-        return None, messages
-    try:
-        directive = getattr(module, classname)
-        _directives[normname] = directive
-    except AttributeError:
-        messages.append(document.reporter.error(
-            'No directive class "%s" in module "%s" (directive "%s").'
-            % (classname, modulename, directive_name),
-            line=document.current_line))
-        return None, messages
-    return directive, messages
-
-def register_directive(name, directive):
-    """
-    Register a nonstandard application-defined directive function.
-    Language lookups are not needed for such functions.
-    """
-    _directives[name] = directive
-
-def flag(argument):
-    """
-    Check for a valid flag option (no argument) and return ``None``.
-    (Directive option conversion function.)
-
-    Raise ``ValueError`` if an argument is found.
-    """
-    if argument and argument.strip():
-        raise ValueError('no argument is allowed; "%s" supplied' % argument)
-    else:
-        return None
-
-def unchanged_required(argument):
-    """
-    Return the argument text, unchanged.
-    (Directive option conversion function.)
-
-    Raise ``ValueError`` if no argument is found.
-    """
-    if argument is None:
-        raise ValueError('argument required but none supplied')
-    else:
-        return argument  # unchanged!
-
-def unchanged(argument):
-    """
-    Return the argument text, unchanged.
-    (Directive option conversion function.)
-
-    No argument implies empty string ("").
-    """
-    if argument is None:
-        return u''
-    else:
-        return argument  # unchanged!
-
-def path(argument):
-    """
-    Return the path argument unwrapped (with newlines removed).
-    (Directive option conversion function.)
-
-    Raise ``ValueError`` if no argument is found.
-    """
-    if argument is None:
-        raise ValueError('argument required but none supplied')
-    else:
-        path = ''.join([s.strip() for s in argument.splitlines()])
-        return path
-
-def uri(argument):
-    """
-    Return the URI argument with whitespace removed.
-    (Directive option conversion function.)
-
-    Raise ``ValueError`` if no argument is found.
-    """
-    if argument is None:
-        raise ValueError('argument required but none supplied')
-    else:
-        uri = ''.join(argument.split())
-        return uri
-
-def nonnegative_int(argument):
-    """
-    Check for a nonnegative integer argument; raise ``ValueError`` if not.
-    (Directive option conversion function.)
-    """
-    value = int(argument)
-    if value < 0:
-        raise ValueError('negative value; must be positive or zero')
-    return value
-
-length_units = ['em', 'ex', 'px', 'in', 'cm', 'mm', 'pt', 'pc']
-
-def get_measure(argument, units):
-    """
-    Check for a positive argument of one of the units and return a
-    normalized string of the form "<value><unit>" (without space in
-    between).
-    
-    To be called from directive option conversion functions.
-    """
-    match = re.match(r'^([0-9.]+) *(%s)$' % '|'.join(units), argument)
-    try:
-        assert match is not None
-        float(match.group(1))
-    except (AssertionError, ValueError):
-        raise ValueError(
-            'not a positive measure of one of the following units:\n%s'
-            % ' '.join(['"%s"' % i for i in units]))
-    return match.group(1) + match.group(2)
-
-def length_or_unitless(argument):
-    return get_measure(argument, length_units + [''])
-
-def length_or_percentage_or_unitless(argument):
-    return get_measure(argument, length_units + ['%', ''])
-
-def class_option(argument):
-    """
-    Convert the argument into a list of ID-compatible strings and return it.
-    (Directive option conversion function.)
-
-    Raise ``ValueError`` if no argument is found.
-    """
-    if argument is None:
-        raise ValueError('argument required but none supplied')
-    names = argument.split()
-    class_names = []
-    for name in names:
-        class_name = nodes.make_id(name)
-        if not class_name:
-            raise ValueError('cannot make "%s" into a class name' % name)
-        class_names.append(class_name)
-    return class_names
-
-unicode_pattern = re.compile(
-    r'(?:0x|x|\\x|U\+?|\\u)([0-9a-f]+)$|&#x([0-9a-f]+);$', re.IGNORECASE)
-
-def unicode_code(code):
-    r"""
-    Convert a Unicode character code to a Unicode character.
-    (Directive option conversion function.)
-
-    Codes may be decimal numbers, hexadecimal numbers (prefixed by ``0x``,
-    ``x``, ``\x``, ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style
-    numeric character entities (e.g. ``&#x262E;``).  Other text remains as-is.
-
-    Raise ValueError for illegal Unicode code values.
-    """
-    try:
-        if code.isdigit():                  # decimal number
-            return unichr(int(code))
-        else:
-            match = unicode_pattern.match(code)
-            if match:                       # hex number
-                value = match.group(1) or match.group(2)
-                return unichr(int(value, 16))
-            else:                           # other text
-                return code
-    except OverflowError, detail:
-        raise ValueError('code too large (%s)' % detail)
-
-def single_char_or_unicode(argument):
-    """
-    A single character is returned as-is.  Unicode characters codes are
-    converted as in `unicode_code`.  (Directive option conversion function.)
-    """
-    char = unicode_code(argument)
-    if len(char) > 1:
-        raise ValueError('%r invalid; must be a single character or '
-                         'a Unicode code' % char)
-    return char
-
-def single_char_or_whitespace_or_unicode(argument):
-    """
-    As with `single_char_or_unicode`, but "tab" and "space" are also supported.
-    (Directive option conversion function.)
-    """
-    if argument == 'tab':
-        char = '\t'
-    elif argument == 'space':
-        char = ' '
-    else:
-        char = single_char_or_unicode(argument)
-    return char
-
-def positive_int(argument):
-    """
-    Converts the argument into an integer.  Raises ValueError for negative,
-    zero, or non-integer values.  (Directive option conversion function.)
-    """
-    value = int(argument)
-    if value < 1:
-        raise ValueError('negative or zero value; must be positive')
-    return value
-
-def positive_int_list(argument):
-    """
-    Converts a space- or comma-separated list of values into a Python list
-    of integers.
-    (Directive option conversion function.)
-
-    Raises ValueError for non-positive-integer values.
-    """
-    if ',' in argument:
-        entries = argument.split(',')
-    else:
-        entries = argument.split()
-    return [positive_int(entry) for entry in entries]
-
-def encoding(argument):
-    """
-    Verfies the encoding argument by lookup.
-    (Directive option conversion function.)
-
-    Raises ValueError for unknown encodings.
-    """
-    try:
-        codecs.lookup(argument)
-    except LookupError:
-        raise ValueError('unknown encoding: "%s"' % argument)
-    return argument
-
-def choice(argument, values):
-    """
-    Directive option utility function, supplied to enable options whose
-    argument must be a member of a finite set of possible values (must be
-    lower case).  A custom conversion function must be written to use it.  For
-    example::
-
-        from docutils.parsers.rst import directives
-
-        def yesno(argument):
-            return directives.choice(argument, ('yes', 'no'))
-
-    Raise ``ValueError`` if no argument is found or if the argument's value is
-    not valid (not an entry in the supplied list).
-    """
-    try:
-        value = argument.lower().strip()
-    except AttributeError:
-        raise ValueError('must supply an argument; choose from %s'
-                         % format_values(values))
-    if value in values:
-        return value
-    else:
-        raise ValueError('"%s" unknown; choose from %s'
-                         % (argument, format_values(values)))
-
-def format_values(values):
-    return '%s, or "%s"' % (', '.join(['"%s"' % s for s in values[:-1]]),
-                            values[-1])
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/admonitions.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-# $Id: admonitions.py 4667 2006-07-12 21:40:56Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Admonition directives.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-from docutils.parsers.rst import Directive
-from docutils.parsers.rst import states, directives
-from docutils import nodes
-
-
-class BaseAdmonition(Directive):
-
-    required_arguments = 0
-    optional_arguments = 0
-    final_argument_whitespace = True
-    option_spec = {}
-    has_content = True
-
-    node_class = None
-    """Subclasses must set this to the appropriate admonition node class."""
-
-    def run(self):
-        self.assert_has_content()
-        text = '\n'.join(self.content)
-        admonition_node = self.node_class(text)
-        if self.arguments:
-            title_text = self.arguments[0]
-            textnodes, messages = self.state.inline_text(title_text,
-                                                         self.lineno)
-            admonition_node += nodes.title(title_text, '', *textnodes)
-            admonition_node += messages
-            if self.options.has_key('class'):
-                classes = self.options['class']
-            else:
-                classes = ['admonition-' + nodes.make_id(title_text)]
-            admonition_node['classes'] += classes
-        self.state.nested_parse(self.content, self.content_offset,
-                                admonition_node)
-        return [admonition_node]
-
-
-class Admonition(BaseAdmonition):
-
-    required_arguments = 1
-    option_spec = {'class': directives.class_option}
-    node_class = nodes.admonition
-
-
-class Attention(BaseAdmonition):
-
-    node_class = nodes.attention
-
-
-class Caution(BaseAdmonition):
-
-    node_class = nodes.caution
-
-
-class Danger(BaseAdmonition):
-
-    node_class = nodes.danger
-
-
-class Error(BaseAdmonition):
-
-    node_class = nodes.error
-
-
-class Hint(BaseAdmonition):
-
-    node_class = nodes.hint
-
-
-class Important(BaseAdmonition):
-
-    node_class = nodes.important
-
-
-class Note(BaseAdmonition):
-
-    node_class = nodes.note
-
-
-class Tip(BaseAdmonition):
-
-    node_class = nodes.tip
-
-
-class Warning(BaseAdmonition):
-
-    node_class = nodes.warning
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/body.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,192 +0,0 @@
-# $Id: body.py 4667 2006-07-12 21:40:56Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Directives for additional body elements.
-
-See `docutils.parsers.rst.directives` for API details.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import sys
-from docutils import nodes
-from docutils.parsers.rst import Directive
-from docutils.parsers.rst import directives
-from docutils.parsers.rst.roles import set_classes
-
-
-class BasePseudoSection(Directive):
-
-    required_arguments = 1
-    optional_arguments = 0
-    final_argument_whitespace = True
-    option_spec = {'class': directives.class_option}
-    has_content = True
-
-    node_class = None
-    """Node class to be used (must be set in subclasses)."""
-
-    def run(self):
-        if not (self.state_machine.match_titles
-                or isinstance(self.state_machine.node, nodes.sidebar)):
-            raise self.error('The "%s" directive may not be used within '
-                             'topics or body elements.' % self.name)
-        self.assert_has_content()
-        title_text = self.arguments[0]
-        textnodes, messages = self.state.inline_text(title_text, self.lineno)
-        titles = [nodes.title(title_text, '', *textnodes)]
-        # Sidebar uses this code.
-        if self.options.has_key('subtitle'):
-            textnodes, more_messages = self.state.inline_text(
-                self.options['subtitle'], self.lineno)
-            titles.append(nodes.subtitle(self.options['subtitle'], '',
-                                         *textnodes))
-            messages.extend(more_messages)
-        text = '\n'.join(self.content)
-        node = self.node_class(text, *(titles + messages))
-        node['classes'] += self.options.get('class', [])
-        if text:
-            self.state.nested_parse(self.content, self.content_offset, node)
-        return [node]
-
-
-class Topic(BasePseudoSection):
-
-    node_class = nodes.topic
-
-
-class Sidebar(BasePseudoSection):
-
-    node_class = nodes.sidebar
-
-    option_spec = BasePseudoSection.option_spec.copy()
-    option_spec['subtitle'] = directives.unchanged_required
-
-    def run(self):
-        if isinstance(self.state_machine.node, nodes.sidebar):
-            raise self.error('The "%s" directive may not be used within a '
-                             'sidebar element.' % self.name)
-        return BasePseudoSection.run(self)
-
-
-class LineBlock(Directive):
-
-    option_spec = {'class': directives.class_option}
-    has_content = True
-
-    def run(self):
-        self.assert_has_content()
-        block = nodes.line_block(classes=self.options.get('class', []))
-        node_list = [block]
-        for line_text in self.content:
-            text_nodes, messages = self.state.inline_text(
-                line_text.strip(), self.lineno + self.content_offset)
-            line = nodes.line(line_text, '', *text_nodes)
-            if line_text.strip():
-                line.indent = len(line_text) - len(line_text.lstrip())
-            block += line
-            node_list.extend(messages)
-            self.content_offset += 1
-        self.state.nest_line_block_lines(block)
-        return node_list
-
-
-class ParsedLiteral(Directive):
-
-    option_spec = {'class': directives.class_option}
-    has_content = True
-
-    def run(self):
-        set_classes(self.options)
-        self.assert_has_content()
-        text = '\n'.join(self.content)
-        text_nodes, messages = self.state.inline_text(text, self.lineno)
-        node = nodes.literal_block(text, '', *text_nodes, **self.options)
-        node.line = self.content_offset + 1
-        return [node] + messages
-
-
-class Rubric(Directive):
-
-    required_arguments = 1
-    optional_arguments = 0
-    final_argument_whitespace = True
-    option_spec = {'class': directives.class_option}
-
-    def run(self):
-        set_classes(self.options)
-        rubric_text = self.arguments[0]
-        textnodes, messages = self.state.inline_text(rubric_text, self.lineno)
-        rubric = nodes.rubric(rubric_text, '', *textnodes, **self.options)
-        return [rubric] + messages
-
-
-class BlockQuote(Directive):
-
-    has_content = True
-    classes = []
-
-    def run(self):
-        self.assert_has_content()
-        elements = self.state.block_quote(self.content, self.content_offset)
-        for element in elements:
-            if isinstance(element, nodes.block_quote):
-                element['classes'] += self.classes
-        return elements
-
-
-class Epigraph(BlockQuote):
-
-    classes = ['epigraph']
-
-
-class Highlights(BlockQuote):
-
-    classes = ['highlights']
-
-
-class PullQuote(BlockQuote):
-
-    classes = ['pull-quote']
-
-
-class Compound(Directive):
-
-    option_spec = {'class': directives.class_option}
-    has_content = True
-
-    def run(self):
-        self.assert_has_content()
-        text = '\n'.join(self.content)
-        node = nodes.compound(text)
-        node['classes'] += self.options.get('class', [])
-        self.state.nested_parse(self.content, self.content_offset, node)
-        return [node]
-
-
-class Container(Directive):
-
-    required_arguments = 0
-    optional_arguments = 1
-    final_argument_whitespace = True
-    has_content = True
-
-    def run(self):
-        self.assert_has_content()
-        text = '\n'.join(self.content)
-        try:
-            if self.arguments:
-                classes = directives.class_option(self.arguments[0])
-            else:
-                classes = []
-        except ValueError:
-            raise self.error(
-                'Invalid class attribute value for "%s" directive: "%s".'
-                % (self.name, self.arguments[0]))
-        node = nodes.container(text)
-        node['classes'].extend(classes)
-        self.state.nested_parse(self.content, self.content_offset, node)
-        return [node]
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/html.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-# $Id: html.py 4667 2006-07-12 21:40:56Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Directives for typically HTML-specific constructs.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import sys
-from docutils import nodes, utils
-from docutils.parsers.rst import Directive
-from docutils.parsers.rst import states
-from docutils.transforms import components
-
-
-class MetaBody(states.SpecializedBody):
-
-    class meta(nodes.Special, nodes.PreBibliographic, nodes.Element):
-        """HTML-specific "meta" element."""
-        pass
-
-    def field_marker(self, match, context, next_state):
-        """Meta element."""
-        node, blank_finish = self.parsemeta(match)
-        self.parent += node
-        return [], next_state, []
-
-    def parsemeta(self, match):
-        name = self.parse_field_marker(match)
-        indented, indent, line_offset, blank_finish = \
-              self.state_machine.get_first_known_indented(match.end())
-        node = self.meta()
-        pending = nodes.pending(components.Filter,
-                                {'component': 'writer',
-                                 'format': 'html',
-                                 'nodes': [node]})
-        node['content'] = ' '.join(indented)
-        if not indented:
-            line = self.state_machine.line
-            msg = self.reporter.info(
-                  'No content for meta tag "%s".' % name,
-                  nodes.literal_block(line, line),
-                  line=self.state_machine.abs_line_number())
-            return msg, blank_finish
-        tokens = name.split()
-        try:
-            attname, val = utils.extract_name_value(tokens[0])[0]
-            node[attname.lower()] = val
-        except utils.NameValueError:
-            node['name'] = tokens[0]
-        for token in tokens[1:]:
-            try:
-                attname, val = utils.extract_name_value(token)[0]
-                node[attname.lower()] = val
-            except utils.NameValueError, detail:
-                line = self.state_machine.line
-                msg = self.reporter.error(
-                      'Error parsing meta tag attribute "%s": %s.'
-                      % (token, detail), nodes.literal_block(line, line),
-                      line=self.state_machine.abs_line_number())
-                return msg, blank_finish
-        self.document.note_pending(pending)
-        return pending, blank_finish
-
-
-class Meta(Directive):
-
-    has_content = True
-
-    SMkwargs = {'state_classes': (MetaBody,)}
-
-    def run(self):
-        self.assert_has_content()
-        node = nodes.Element()
-        new_line_offset, blank_finish = self.state.nested_list_parse(
-            self.content, self.content_offset, node,
-            initial_state='MetaBody', blank_finish=1,
-            state_machine_kwargs=self.SMkwargs)
-        if (new_line_offset - self.content_offset) != len(self.content):
-            # incomplete parse of block?
-            error = self.state_machine.reporter.error(
-                'Invalid meta directive.',
-                nodes.literal_block(self.block_text, self.block_text),
-                line=self.lineno)
-            node += error
-        return node.children
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/images.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,160 +0,0 @@
-# $Id: images.py 4667 2006-07-12 21:40:56Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Directives for figures and simple images.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import sys
-from docutils import nodes, utils
-from docutils.parsers.rst import Directive
-from docutils.parsers.rst import directives, states
-from docutils.nodes import fully_normalize_name, whitespace_normalize_name
-from docutils.parsers.rst.roles import set_classes
-
-try:
-    import Image as PIL                        # PIL
-except ImportError:
-    PIL = None
-
-
-class Image(Directive):
-
-    align_h_values = ('left', 'center', 'right')
-    align_v_values = ('top', 'middle', 'bottom')
-    align_values = align_v_values + align_h_values
-
-    def align(argument):
-        # This is not callable as self.align.  We cannot make it a
-        # staticmethod because we're saving an unbound method in
-        # option_spec below.
-        return directives.choice(argument, Image.align_values)
-
-    required_arguments = 1
-    optional_arguments = 0
-    final_argument_whitespace = True
-    option_spec = {'alt': directives.unchanged,
-                   'height': directives.length_or_unitless,
-                   'width': directives.length_or_percentage_or_unitless,
-                   'scale': directives.nonnegative_int,
-                   'align': align,
-                   'target': directives.unchanged_required,
-                   'class': directives.class_option}
-
-    def run(self):
-        if self.options.has_key('align'):
-            if isinstance(self.state, states.SubstitutionDef):
-                # Check for align_v_values.
-                if self.options['align'] not in self.align_v_values:
-                    raise self.error(
-                        'Error in "%s" directive: "%s" is not a valid value '
-                        'for the "align" option within a substitution '
-                        'definition.  Valid values for "align" are: "%s".'
-                        % (self.name, self.options['align'],
-                           '", "'.join(self.align_v_values)))
-            elif self.options['align'] not in self.align_h_values:
-                raise self.error(
-                    'Error in "%s" directive: "%s" is not a valid value for '
-                    'the "align" option.  Valid values for "align" are: "%s".'
-                    % (self.name, self.options['align'],
-                       '", "'.join(self.align_h_values)))
-        messages = []
-        reference = directives.uri(self.arguments[0])
-        self.options['uri'] = reference
-        reference_node = None
-        if self.options.has_key('target'):
-            block = states.escape2null(
-                self.options['target']).splitlines()
-            block = [line for line in block]
-            target_type, data = self.state.parse_target(
-                block, self.block_text, self.lineno)
-            if target_type == 'refuri':
-                reference_node = nodes.reference(refuri=data)
-            elif target_type == 'refname':
-                reference_node = nodes.reference(
-                    refname=fully_normalize_name(data),
-                    name=whitespace_normalize_name(data))
-                reference_node.indirect_reference_name = data
-                self.state.document.note_refname(reference_node)
-            else:                           # malformed target
-                messages.append(data)       # data is a system message
-            del self.options['target']
-        set_classes(self.options)
-        image_node = nodes.image(self.block_text, **self.options)
-        if reference_node:
-            reference_node += image_node
-            return messages + [reference_node]
-        else:
-            return messages + [image_node]
-
-
-class Figure(Image):
-
-    def align(argument):
-        return directives.choice(argument, Figure.align_h_values)
-
-    def figwidth_value(argument):
-        if argument.lower() == 'image':
-            return 'image'
-        else:
-            return directives.nonnegative_int(argument)
-
-    option_spec = Image.option_spec.copy()
-    option_spec['figwidth'] = figwidth_value
-    option_spec['figclass'] = directives.class_option
-    option_spec['align'] = align
-    has_content = True
-
-    def run(self):
-        figwidth = self.options.get('figwidth')
-        if figwidth:
-            del self.options['figwidth']
-        figclasses = self.options.get('figclass')
-        if figclasses:
-            del self.options['figclass']
-        align = self.options.get('align')
-        if align:
-            del self.options['align']
-        (image_node,) = Image.run(self)
-        if isinstance(image_node, nodes.system_message):
-            return [image_node]
-        figure_node = nodes.figure('', image_node)
-        if figwidth == 'image':
-            if PIL and self.state.document.settings.file_insertion_enabled:
-                # PIL doesn't like Unicode paths:
-                try:
-                    i = PIL.open(str(image_node['uri']))
-                except (IOError, UnicodeError):
-                    pass
-                else:
-                    self.state.document.settings.record_dependencies.add(
-                        image_node['uri'])
-                    figure_node['width'] = i.size[0]
-        elif figwidth is not None:
-            figure_node['width'] = figwidth
-        if figclasses:
-            figure_node['classes'] += figclasses
-        if align:
-            figure_node['align'] = align
-        if self.content:
-            node = nodes.Element()          # anonymous container for parsing
-            self.state.nested_parse(self.content, self.content_offset, node)
-            first_node = node[0]
-            if isinstance(first_node, nodes.paragraph):
-                caption = nodes.caption(first_node.rawsource, '',
-                                        *first_node.children)
-                figure_node += caption
-            elif not (isinstance(first_node, nodes.comment)
-                      and len(first_node) == 0):
-                error = self.state_machine.reporter.error(
-                      'Figure caption must be a paragraph or empty comment.',
-                      nodes.literal_block(self.block_text, self.block_text),
-                      line=self.lineno)
-                return [figure_node, error]
-            if len(node) > 1:
-                figure_node += nodes.legend('', *node[1:])
-        return [figure_node]
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/misc.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,462 +0,0 @@
-# $Id: misc.py 5015 2007-03-12 20:25:40Z wiemann $
-# Authors: David Goodger <goodger@python.org>; Dethe Elza
-# Copyright: This module has been placed in the public domain.
-
-"""Miscellaneous directives."""
-
-__docformat__ = 'reStructuredText'
-
-import sys
-import os.path
-import re
-import time
-from docutils import io, nodes, statemachine, utils
-from docutils.parsers.rst import Directive, convert_directive_function
-from docutils.parsers.rst import directives, roles, states
-from docutils.transforms import misc
-
-
-class Include(Directive):
-
-    """
-    Include content read from a separate source file.
-
-    Content may be parsed by the parser, or included as a literal
-    block.  The encoding of the included file can be specified.  Only
-    a part of the given file argument may be included by specifying
-    text to match before and/or after the text to be used.
-    """
-
-    required_arguments = 1
-    optional_arguments = 0
-    final_argument_whitespace = True
-    option_spec = {'literal': directives.flag,
-                   'encoding': directives.encoding,
-                   'start-after': directives.unchanged_required,
-                   'end-before': directives.unchanged_required}
-
-    standard_include_path = os.path.join(os.path.dirname(states.__file__),
-                                         'include')
-
-    def run(self):
-        """Include a reST file as part of the content of this reST file."""
-        if not self.state.document.settings.file_insertion_enabled:
-            raise self.warning('"%s" directive disabled.' % self.name)
-        source = self.state_machine.input_lines.source(
-            self.lineno - self.state_machine.input_offset - 1)
-        source_dir = os.path.dirname(os.path.abspath(source))
-        path = directives.path(self.arguments[0])
-        if path.startswith('<') and path.endswith('>'):
-            path = os.path.join(self.standard_include_path, path[1:-1])
-        path = os.path.normpath(os.path.join(source_dir, path))
-        path = utils.relative_path(None, path)
-        encoding = self.options.get(
-            'encoding', self.state.document.settings.input_encoding)
-        try:
-            self.state.document.settings.record_dependencies.add(path)
-            include_file = io.FileInput(
-                source_path=path, encoding=encoding,
-                error_handler=(self.state.document.settings.\
-                               input_encoding_error_handler),
-                handle_io_errors=None)
-        except IOError, error:
-            raise self.severe('Problems with "%s" directive path:\n%s: %s.'
-                              % (self.name, error.__class__.__name__, error))
-        try:
-            include_text = include_file.read()
-        except UnicodeError, error:
-            raise self.severe(
-                'Problem with "%s" directive:\n%s: %s'
-                % (self.name, error.__class__.__name__, error))
-        # start-after/end-before: no restrictions on newlines in match-text,
-        # and no restrictions on matching inside lines vs. line boundaries
-        after_text = self.options.get('start-after', None)
-        if after_text:
-            # skip content in include_text before *and incl.* a matching text
-            after_index = include_text.find(after_text)
-            if after_index < 0:
-                raise self.severe('Problem with "start-after" option of "%s" '
-                                  'directive:\nText not found.' % self.name)
-            include_text = include_text[after_index + len(after_text):]
-        before_text = self.options.get('end-before', None)
-        if before_text:
-            # skip content in include_text after *and incl.* a matching text
-            before_index = include_text.find(before_text)
-            if before_index < 0:
-                raise self.severe('Problem with "end-before" option of "%s" '
-                                  'directive:\nText not found.' % self.name)
-            include_text = include_text[:before_index]
-        if self.options.has_key('literal'):
-            literal_block = nodes.literal_block(include_text, include_text,
-                                                source=path)
-            literal_block.line = 1
-            return [literal_block]
-        else:
-            include_lines = statemachine.string2lines(include_text,
-                                                      convert_whitespace=1)
-            self.state_machine.insert_input(include_lines, path)
-            return []
-
-
-class Raw(Directive):
-
-    """
-    Pass through content unchanged
-
-    Content is included in output based on type argument
-
-    Content may be included inline (content section of directive) or
-    imported from a file or url.
-    """
-
-    required_arguments = 1
-    optional_arguments = 0
-    final_argument_whitespace = True
-    option_spec = {'file': directives.path,
-                   'url': directives.uri,
-                   'encoding': directives.encoding}
-    has_content = True
-
-    def run(self):
-        if (not self.state.document.settings.raw_enabled
-            or (not self.state.document.settings.file_insertion_enabled
-                and (self.options.has_key('file')
-                     or self.options.has_key('url')))):
-            raise self.warning('"%s" directive disabled.' % self.name)
-        attributes = {'format': ' '.join(self.arguments[0].lower().split())}
-        encoding = self.options.get(
-            'encoding', self.state.document.settings.input_encoding)
-        if self.content:
-            if self.options.has_key('file') or self.options.has_key('url'):
-                raise self.error(
-                    '"%s" directive may not both specify an external file '
-                    'and have content.' % self.name)
-            text = '\n'.join(self.content)
-        elif self.options.has_key('file'):
-            if self.options.has_key('url'):
-                raise self.error(
-                    'The "file" and "url" options may not be simultaneously '
-                    'specified for the "%s" directive.' % self.name)
-            source_dir = os.path.dirname(
-                os.path.abspath(self.state.document.current_source))
-            path = os.path.normpath(os.path.join(source_dir,
-                                                 self.options['file']))
-            path = utils.relative_path(None, path)
-            try:
-                self.state.document.settings.record_dependencies.add(path)
-                raw_file = io.FileInput(
-                    source_path=path, encoding=encoding,
-                    error_handler=(self.state.document.settings.\
-                                   input_encoding_error_handler),
-                    handle_io_errors=None)
-            except IOError, error:
-                raise self.severe('Problems with "%s" directive path:\n%s.'
-                                  % (self.name, error))
-            try:
-                text = raw_file.read()
-            except UnicodeError, error:
-                raise self.severe(
-                    'Problem with "%s" directive:\n%s: %s'
-                    % (self.name, error.__class__.__name__, error))
-            attributes['source'] = path
-        elif self.options.has_key('url'):
-            source = self.options['url']
-            # Do not import urllib2 at the top of the module because
-            # it may fail due to broken SSL dependencies, and it takes
-            # about 0.15 seconds to load.
-            import urllib2
-            try:
-                raw_text = urllib2.urlopen(source).read()
-            except (urllib2.URLError, IOError, OSError), error:
-                raise self.severe(
-                    'Problems with "%s" directive URL "%s":\n%s.'
-                    % (self.name, self.options['url'], error))
-            raw_file = io.StringInput(
-                source=raw_text, source_path=source, encoding=encoding,
-                error_handler=(self.state.document.settings.\
-                               input_encoding_error_handler))
-            try:
-                text = raw_file.read()
-            except UnicodeError, error:
-                raise self.severe(
-                    'Problem with "%s" directive:\n%s: %s'
-                    % (self.name, error.__class__.__name__, error))
-            attributes['source'] = source
-        else:
-            # This will always fail because there is no content.
-            self.assert_has_content()
-        raw_node = nodes.raw('', text, **attributes)
-        return [raw_node]
-
-
-class Replace(Directive):
-
-    has_content = True
-
-    def run(self):
-        if not isinstance(self.state, states.SubstitutionDef):
-            raise self.error(
-                'Invalid context: the "%s" directive can only be used within '
-                'a substitution definition.' % self.name)
-        self.assert_has_content()
-        text = '\n'.join(self.content)
-        element = nodes.Element(text)
-        self.state.nested_parse(self.content, self.content_offset,
-                                element)
-        if ( len(element) != 1
-             or not isinstance(element[0], nodes.paragraph)):
-            messages = []
-            for node in element:
-                if isinstance(node, nodes.system_message):
-                    node['backrefs'] = []
-                    messages.append(node)
-            error = self.state_machine.reporter.error(
-                'Error in "%s" directive: may contain a single paragraph '
-                'only.' % (self.name), line=self.lineno)
-            messages.append(error)
-            return messages
-        else:
-            return element[0].children
-
-
-class Unicode(Directive):
-
-    r"""
-    Convert Unicode character codes (numbers) to characters.  Codes may be
-    decimal numbers, hexadecimal numbers (prefixed by ``0x``, ``x``, ``\x``,
-    ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style numeric character
-    entities (e.g. ``&#x262E;``).  Text following ".." is a comment and is
-    ignored.  Spaces are ignored, and any other text remains as-is.
-    """
-
-    required_arguments = 1
-    optional_arguments = 0
-    final_argument_whitespace = True
-    option_spec = {'trim': directives.flag,
-                   'ltrim': directives.flag,
-                   'rtrim': directives.flag}
-
-    comment_pattern = re.compile(r'( |\n|^)\.\. ')
-
-    def run(self):
-        if not isinstance(self.state, states.SubstitutionDef):
-            raise self.error(
-                'Invalid context: the "%s" directive can only be used within '
-                'a substitution definition.' % self.name)
-        substitution_definition = self.state_machine.node
-        if self.options.has_key('trim'):
-            substitution_definition.attributes['ltrim'] = 1
-            substitution_definition.attributes['rtrim'] = 1
-        if self.options.has_key('ltrim'):
-            substitution_definition.attributes['ltrim'] = 1
-        if self.options.has_key('rtrim'):
-            substitution_definition.attributes['rtrim'] = 1
-        codes = self.comment_pattern.split(self.arguments[0])[0].split()
-        element = nodes.Element()
-        for code in codes:
-            try:
-                decoded = directives.unicode_code(code)
-            except ValueError, err:
-                raise self.error(
-                    'Invalid character code: %s\n%s: %s'
-                    % (code, err.__class__.__name__, err))
-            element += nodes.Text(decoded)
-        return element.children
-
-
-class Class(Directive):
-
-    """
-    Set a "class" attribute on the directive content or the next element.
-    When applied to the next element, a "pending" element is inserted, and a
-    transform does the work later.
-    """
-
-    required_arguments = 1
-    optional_arguments = 0
-    final_argument_whitespace = True
-    has_content = True
-
-    def run(self):
-        try:
-            class_value = directives.class_option(self.arguments[0])
-        except ValueError:
-            raise self.error(
-                'Invalid class attribute value for "%s" directive: "%s".'
-                % (self.name, self.arguments[0]))
-        node_list = []
-        if self.content:
-            container = nodes.Element()
-            self.state.nested_parse(self.content, self.content_offset,
-                                    container)
-            for node in container:
-                node['classes'].extend(class_value)
-            node_list.extend(container.children)
-        else:
-            pending = nodes.pending(
-                misc.ClassAttribute,
-                {'class': class_value, 'directive': self.name},
-                self.block_text)
-            self.state_machine.document.note_pending(pending)
-            node_list.append(pending)
-        return node_list
-
-
-class Role(Directive):
-
-    has_content = True
-
-    argument_pattern = re.compile(r'(%s)\s*(\(\s*(%s)\s*\)\s*)?$'
-                                  % ((states.Inliner.simplename,) * 2))
-
-    def run(self):
-        """Dynamically create and register a custom interpreted text role."""
-        if self.content_offset > self.lineno or not self.content:
-            raise self.error('"%s" directive requires arguments on the first '
-                             'line.' % self.name)
-        args = self.content[0]
-        match = self.argument_pattern.match(args)
-        if not match:
-            raise self.error('"%s" directive arguments not valid role names: '
-                             '"%s".' % (self.name, args))
-        new_role_name = match.group(1)
-        base_role_name = match.group(3)
-        messages = []
-        if base_role_name:
-            base_role, messages = roles.role(
-                base_role_name, self.state_machine.language, self.lineno,
-                self.state.reporter)
-            if base_role is None:
-                error = self.state.reporter.error(
-                    'Unknown interpreted text role "%s".' % base_role_name,
-                    nodes.literal_block(self.block_text, self.block_text),
-                    line=self.lineno)
-                return messages + [error]
-        else:
-            base_role = roles.generic_custom_role
-        assert not hasattr(base_role, 'arguments'), (
-            'Supplemental directive arguments for "%s" directive not '
-            'supported (specified by "%r" role).' % (self.name, base_role))
-        try:
-            converted_role = convert_directive_function(base_role)
-            (arguments, options, content, content_offset) = (
-                self.state.parse_directive_block(
-                self.content[1:], self.content_offset, converted_role,
-                option_presets={}))
-        except states.MarkupError, detail:
-            error = self.state_machine.reporter.error(
-                'Error in "%s" directive:\n%s.' % (self.name, detail),
-                nodes.literal_block(self.block_text, self.block_text),
-                line=self.lineno)
-            return messages + [error]
-        if not options.has_key('class'):
-            try:
-                options['class'] = directives.class_option(new_role_name)
-            except ValueError, detail:
-                error = self.state_machine.reporter.error(
-                    'Invalid argument for "%s" directive:\n%s.'
-                    % (self.name, detail), nodes.literal_block(
-                    self.block_text, self.block_text), line=self.lineno)
-                return messages + [error]
-        role = roles.CustomRole(new_role_name, base_role, options, content)
-        roles.register_local_role(new_role_name, role)
-        return messages
-
-
-class DefaultRole(Directive):
-
-    """Set the default interpreted text role."""
-
-    required_arguments = 0
-    optional_arguments = 1
-    final_argument_whitespace = False
-
-    def run(self):
-        if not self.arguments:
-            if roles._roles.has_key(''):
-                # restore the "default" default role
-                del roles._roles['']
-            return []
-        role_name = self.arguments[0]
-        role, messages = roles.role(role_name, self.state_machine.language,
-                                    self.lineno, self.state.reporter)
-        if role is None:
-            error = self.state.reporter.error(
-                'Unknown interpreted text role "%s".' % role_name,
-                nodes.literal_block(self.block_text, self.block_text),
-                line=self.lineno)
-            return messages + [error]
-        roles._roles[''] = role
-        # @@@ should this be local to the document, not the parser?
-        return messages
-
-
-class Title(Directive):
-
-    required_arguments = 1
-    optional_arguments = 0
-    final_argument_whitespace = True
-
-    def run(self):
-        self.state_machine.document['title'] = self.arguments[0]
-        return []
-
-
-class Date(Directive):
-
-    has_content = True
-
-    def run(self):
-        if not isinstance(self.state, states.SubstitutionDef):
-            raise self.error(
-                'Invalid context: the "%s" directive can only be used within '
-                'a substitution definition.' % self.name)
-        format = '\n'.join(self.content) or '%Y-%m-%d'
-        text = time.strftime(format)
-        return [nodes.Text(text)]
-
-
-class TestDirective(Directive):
-
-    """This directive is useful only for testing purposes."""
-
-    required_arguments = 0
-    optional_arguments = 1
-    final_argument_whitespace = True
-    option_spec = {'option': directives.unchanged_required}
-    has_content = True
-
-    def run(self):
-        if self.content:
-            text = '\n'.join(self.content)
-            info = self.state_machine.reporter.info(
-                'Directive processed. Type="%s", arguments=%r, options=%r, '
-                'content:' % (self.name, self.arguments, self.options),
-                nodes.literal_block(text, text), line=self.lineno)
-        else:
-            info = self.state_machine.reporter.info(
-                'Directive processed. Type="%s", arguments=%r, options=%r, '
-                'content: None' % (self.name, self.arguments, self.options),
-                line=self.lineno)
-        return [info]
-
-# Old-style, functional definition:
-#
-# def directive_test_function(name, arguments, options, content, lineno,
-#                             content_offset, block_text, state, state_machine):
-#     """This directive is useful only for testing purposes."""
-#     if content:
-#         text = '\n'.join(content)
-#         info = state_machine.reporter.info(
-#             'Directive processed. Type="%s", arguments=%r, options=%r, '
-#             'content:' % (name, arguments, options),
-#             nodes.literal_block(text, text), line=lineno)
-#     else:
-#         info = state_machine.reporter.info(
-#             'Directive processed. Type="%s", arguments=%r, options=%r, '
-#             'content: None' % (name, arguments, options), line=lineno)
-#     return [info]
-#
-# directive_test_function.arguments = (0, 1, 1)
-# directive_test_function.options = {'option': directives.unchanged_required}
-# directive_test_function.content = 1
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/parts.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +0,0 @@
-# $Id: parts.py 4667 2006-07-12 21:40:56Z wiemann $
-# Authors: David Goodger <goodger@python.org>; Dmitry Jemerov
-# Copyright: This module has been placed in the public domain.
-
-"""
-Directives for document parts.
-"""
-
-__docformat__ = 'reStructuredText'
-
-from docutils import nodes, languages
-from docutils.transforms import parts
-from docutils.parsers.rst import Directive
-from docutils.parsers.rst import directives
-
-
-class Contents(Directive):
-
-    """
-    Table of contents.
-
-    The table of contents is generated in two passes: initial parse and
-    transform.  During the initial parse, a 'pending' element is generated
-    which acts as a placeholder, storing the TOC title and any options
-    internally.  At a later stage in the processing, the 'pending' element is
-    replaced by a 'topic' element, a title and the table of contents proper.
-    """
-
-    backlinks_values = ('top', 'entry', 'none')
-
-    def backlinks(arg):
-        value = directives.choice(arg, Contents.backlinks_values)
-        if value == 'none':
-            return None
-        else:
-            return value
-
-    required_arguments = 0
-    optional_arguments = 1
-    final_argument_whitespace = True
-    option_spec = {'depth': directives.nonnegative_int,
-                   'local': directives.flag,
-                   'backlinks': backlinks,
-                   'class': directives.class_option}
-    
-    def run(self):
-        if not (self.state_machine.match_titles
-                or isinstance(self.state_machine.node, nodes.sidebar)):
-            raise self.error('The "%s" directive may not be used within '
-                             'topics or body elements.' % self.name)
-        document = self.state_machine.document
-        language = languages.get_language(document.settings.language_code)
-        if self.arguments:
-            title_text = self.arguments[0]
-            text_nodes, messages = self.state.inline_text(title_text,
-                                                          self.lineno)
-            title = nodes.title(title_text, '', *text_nodes)
-        else:
-            messages = []
-            if self.options.has_key('local'):
-                title = None
-            else:
-                title = nodes.title('', language.labels['contents'])
-        topic = nodes.topic(classes=['contents'])
-        topic['classes'] += self.options.get('class', [])
-        if self.options.has_key('local'):
-            topic['classes'].append('local')
-        if title:
-            name = title.astext()
-            topic += title
-        else:
-            name = language.labels['contents']
-        name = nodes.fully_normalize_name(name)
-        if not document.has_name(name):
-            topic['names'].append(name)
-        document.note_implicit_target(topic)
-        pending = nodes.pending(parts.Contents, rawsource=self.block_text)
-        pending.details.update(self.options)
-        document.note_pending(pending)
-        topic += pending
-        return [topic] + messages
-
-
-class Sectnum(Directive):
-
-    """Automatic section numbering."""
-
-    option_spec = {'depth': int,
-                   'start': int,
-                   'prefix': directives.unchanged_required,
-                   'suffix': directives.unchanged_required}
-
-    def run(self):
-        pending = nodes.pending(parts.SectNum)
-        pending.details.update(self.options)
-        self.state_machine.document.note_pending(pending)
-        return [pending]
-
-
-class Header(Directive):
-
-    """Contents of document header."""
-
-    has_content = True
-
-    def run(self):
-        self.assert_has_content()
-        header = self.state_machine.document.get_decoration().get_header()
-        self.state.nested_parse(self.content, self.content_offset, header)
-        return []
-
-
-class Footer(Directive):
-
-    """Contents of document footer."""
-
-    has_content = True
-
-    def run(self):
-        self.assert_has_content()
-        footer = self.state_machine.document.get_decoration().get_footer()
-        self.state.nested_parse(self.content, self.content_offset, footer)
-        return []
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/references.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-# $Id: references.py 4667 2006-07-12 21:40:56Z wiemann $
-# Authors: David Goodger <goodger@python.org>; Dmitry Jemerov
-# Copyright: This module has been placed in the public domain.
-
-"""
-Directives for references and targets.
-"""
-
-__docformat__ = 'reStructuredText'
-
-from docutils import nodes
-from docutils.transforms import references
-from docutils.parsers.rst import Directive
-from docutils.parsers.rst import directives
-
-
-class TargetNotes(Directive):
-
-    """Target footnote generation."""
-
-    option_spec = {'class': directives.class_option}
-
-    def run(self):
-        pending = nodes.pending(references.TargetNotes)
-        pending.details.update(self.options)
-        self.state_machine.document.note_pending(pending)
-        nodelist = [pending]
-        return nodelist
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/tables.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,444 +0,0 @@
-# $Id: tables.py 4667 2006-07-12 21:40:56Z wiemann $
-# Authors: David Goodger <goodger@python.org>; David Priest
-# Copyright: This module has been placed in the public domain.
-
-"""
-Directives for table elements.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import sys
-import os.path
-from docutils import io, nodes, statemachine, utils
-from docutils.utils import SystemMessagePropagation
-from docutils.parsers.rst import Directive
-from docutils.parsers.rst import directives
-
-try:
-    import csv                          # new in Python 2.3
-except ImportError:
-    csv = None
-
-
-class Table(Directive):
-
-    """
-    Generic table base class.
-    """
-
-    required_arguments = 0
-    optional_arguments = 1
-    final_argument_whitespace = True
-    option_spec = {'class': directives.class_option}
-    has_content = True
-
-    def make_title(self):
-        if self.arguments:
-            title_text = self.arguments[0]
-            text_nodes, messages = self.state.inline_text(title_text,
-                                                          self.lineno)
-            title = nodes.title(title_text, '', *text_nodes)
-        else:
-            title = None
-            messages = []
-        return title, messages
-
-    def process_header_option(self):
-        source = self.state_machine.get_source(self.lineno - 1)
-        table_head = []
-        max_header_cols = 0
-        if self.options.has_key('header'):   # separate table header in option
-            rows, max_header_cols = self.parse_csv_data_into_rows(
-                self.options['header'].split('\n'), self.HeaderDialect(),
-                source)
-            table_head.extend(rows)
-        return table_head, max_header_cols
-
-    def check_table_dimensions(self, rows, header_rows, stub_columns):
-        if len(rows) < header_rows:
-            error = self.state_machine.reporter.error(
-                '%s header row(s) specified but only %s row(s) of data '
-                'supplied ("%s" directive).'
-                % (header_rows, len(rows), self.name), nodes.literal_block(
-                self.block_text, self.block_text), line=self.lineno)
-            raise SystemMessagePropagation(error)
-        if len(rows) == header_rows > 0:
-            error = self.state_machine.reporter.error(
-                'Insufficient data supplied (%s row(s)); no data remaining '
-                'for table body, required by "%s" directive.'
-                % (len(rows), self.name), nodes.literal_block(
-                self.block_text, self.block_text), line=self.lineno)
-            raise SystemMessagePropagation(error)
-        for row in rows:
-            if len(row) < stub_columns:
-                error = self.state_machine.reporter.error(
-                    '%s stub column(s) specified but only %s columns(s) of '
-                    'data supplied ("%s" directive).' %
-                    (stub_columns, len(row), self.name), nodes.literal_block(
-                    self.block_text, self.block_text), line=self.lineno)
-                raise SystemMessagePropagation(error)
-            if len(row) == stub_columns > 0:
-                error = self.state_machine.reporter.error(
-                    'Insufficient data supplied (%s columns(s)); no data remaining '
-                    'for table body, required by "%s" directive.'
-                    % (len(row), self.name), nodes.literal_block(
-                    self.block_text, self.block_text), line=self.lineno)
-                raise SystemMessagePropagation(error)
-
-    def get_column_widths(self, max_cols):
-        if self.options.has_key('widths'):
-            col_widths = self.options['widths']
-            if len(col_widths) != max_cols:
-                error = self.state_machine.reporter.error(
-                    '"%s" widths do not match the number of columns in table '
-                    '(%s).' % (self.name, max_cols), nodes.literal_block(
-                    self.block_text, self.block_text), line=self.lineno)
-                raise SystemMessagePropagation(error)
-        elif max_cols:
-            col_widths = [100 // max_cols] * max_cols
-        else:
-            error = self.state_machine.reporter.error(
-                'No table data detected in CSV file.', nodes.literal_block(
-                self.block_text, self.block_text), line=self.lineno)
-            raise SystemMessagePropagation(error)
-        return col_widths
-
-    def extend_short_rows_with_empty_cells(self, columns, parts):
-        for part in parts:
-            for row in part:
-                if len(row) < columns:
-                    row.extend([(0, 0, 0, [])] * (columns - len(row)))
-
-
-class RSTTable(Table):
-
-    def run(self):
-        if not self.content:
-            warning = self.state_machine.reporter.warning(
-                'Content block expected for the "%s" directive; none found.'
-                % self.name, nodes.literal_block(
-                self.block_text, self.block_text), line=self.lineno)
-            return [warning]
-        title, messages = self.make_title()
-        node = nodes.Element()          # anonymous container for parsing
-        self.state.nested_parse(self.content, self.content_offset, node)
-        if len(node) != 1 or not isinstance(node[0], nodes.table):
-            error = self.state_machine.reporter.error(
-                'Error parsing content block for the "%s" directive: exactly '
-                'one table expected.' % self.name, nodes.literal_block(
-                self.block_text, self.block_text), line=self.lineno)
-            return [error]
-        table_node = node[0]
-        table_node['classes'] += self.options.get('class', [])
-        if title:
-            table_node.insert(0, title)
-        return [table_node] + messages
-
-
-class CSVTable(Table):
-
-    option_spec = {'header-rows': directives.nonnegative_int,
-                   'stub-columns': directives.nonnegative_int,
-                   'header': directives.unchanged,
-                   'widths': directives.positive_int_list,
-                   'file': directives.path,
-                   'url': directives.uri,
-                   'encoding': directives.encoding,
-                   'class': directives.class_option,
-                   # field delimiter char
-                   'delim': directives.single_char_or_whitespace_or_unicode,
-                   # treat whitespace after delimiter as significant
-                   'keepspace': directives.flag,
-                   # text field quote/unquote char:
-                   'quote': directives.single_char_or_unicode,
-                   # char used to escape delim & quote as-needed:
-                   'escape': directives.single_char_or_unicode,}
-
-    if csv:
-
-        class DocutilsDialect(csv.Dialect):
-
-            """CSV dialect for `csv_table` directive."""
-
-            delimiter = ','
-            quotechar = '"'
-            doublequote = True
-            skipinitialspace = True
-            lineterminator = '\n'
-            quoting = csv.QUOTE_MINIMAL
-
-            def __init__(self, options):
-                if options.has_key('delim'):
-                    self.delimiter = str(options['delim'])
-                if options.has_key('keepspace'):
-                    self.skipinitialspace = False
-                if options.has_key('quote'):
-                    self.quotechar = str(options['quote'])
-                if options.has_key('escape'):
-                    self.doublequote = False
-                    self.escapechar = str(options['escape'])
-                csv.Dialect.__init__(self)
-
-
-        class HeaderDialect(csv.Dialect):
-
-            """CSV dialect to use for the "header" option data."""
-
-            delimiter = ','
-            quotechar = '"'
-            escapechar = '\\'
-            doublequote = False
-            skipinitialspace = True
-            lineterminator = '\n'
-            quoting = csv.QUOTE_MINIMAL
-
-    def check_requirements(self):
-        if not csv:
-            error = self.state_machine.reporter.error(
-                'The "%s" directive is not compatible with this version of '
-                'Python (%s).  Requires the "csv" module, new in Python 2.3.'
-                % (self.name, sys.version.split()[0]), nodes.literal_block(
-                self.block_text, self.block_text), line=self.lineno)
-            raise SystemMessagePropagation(error)
-
-    def run(self):
-        try:
-            if (not self.state.document.settings.file_insertion_enabled
-                and (self.options.has_key('file')
-                     or self.options.has_key('url'))):
-                warning = self.state_machine.reporter.warning(
-                    'File and URL access deactivated; ignoring "%s" '
-                    'directive.' % self.name, nodes.literal_block(
-                    self.block_text, self.block_text), line=self.lineno)
-                return [warning]
-            self.check_requirements()
-            title, messages = self.make_title()
-            csv_data, source = self.get_csv_data()
-            table_head, max_header_cols = self.process_header_option()
-            rows, max_cols = self.parse_csv_data_into_rows(
-                csv_data, self.DocutilsDialect(self.options), source)
-            max_cols = max(max_cols, max_header_cols)
-            header_rows = self.options.get('header-rows', 0)
-            stub_columns = self.options.get('stub-columns', 0)
-            self.check_table_dimensions(rows, header_rows, stub_columns)
-            table_head.extend(rows[:header_rows])
-            table_body = rows[header_rows:]
-            col_widths = self.get_column_widths(max_cols)
-            self.extend_short_rows_with_empty_cells(max_cols,
-                                                    (table_head, table_body))
-        except SystemMessagePropagation, detail:
-            return [detail.args[0]]
-        except csv.Error, detail:
-            error = self.state_machine.reporter.error(
-                'Error with CSV data in "%s" directive:\n%s'
-                % (self.name, detail), nodes.literal_block(
-                self.block_text, self.block_text), line=self.lineno)
-            return [error]
-        table = (col_widths, table_head, table_body)
-        table_node = self.state.build_table(table, self.content_offset,
-                                            stub_columns)
-        table_node['classes'] += self.options.get('class', [])
-        if title:
-            table_node.insert(0, title)
-        return [table_node] + messages
-
-    def get_csv_data(self):
-        """
-        Get CSV data from the directive content, from an external
-        file, or from a URL reference.
-        """
-        encoding = self.options.get(
-            'encoding', self.state.document.settings.input_encoding)
-        if self.content:
-            # CSV data is from directive content.
-            if self.options.has_key('file') or self.options.has_key('url'):
-                error = self.state_machine.reporter.error(
-                    '"%s" directive may not both specify an external file and'
-                    ' have content.' % self.name, nodes.literal_block(
-                    self.block_text, self.block_text), line=self.lineno)
-                raise SystemMessagePropagation(error)
-            source = self.content.source(0)
-            csv_data = self.content
-        elif self.options.has_key('file'):
-            # CSV data is from an external file.
-            if self.options.has_key('url'):
-                error = self.state_machine.reporter.error(
-                      'The "file" and "url" options may not be simultaneously'
-                      ' specified for the "%s" directive.' % self.name,
-                      nodes.literal_block(self.block_text, self.block_text),
-                      line=self.lineno)
-                raise SystemMessagePropagation(error)
-            source_dir = os.path.dirname(
-                os.path.abspath(self.state.document.current_source))
-            source = os.path.normpath(os.path.join(source_dir,
-                                                   self.options['file']))
-            source = utils.relative_path(None, source)
-            try:
-                self.state.document.settings.record_dependencies.add(source)
-                csv_file = io.FileInput(
-                    source_path=source, encoding=encoding,
-                    error_handler=(self.state.document.settings.\
-                                   input_encoding_error_handler),
-                    handle_io_errors=None)
-                csv_data = csv_file.read().splitlines()
-            except IOError, error:
-                severe = self.state_machine.reporter.severe(
-                    'Problems with "%s" directive path:\n%s.'
-                    % (self.name, error), nodes.literal_block(
-                    self.block_text, self.block_text), line=self.lineno)
-                raise SystemMessagePropagation(severe)
-        elif self.options.has_key('url'):
-            # CSV data is from a URL.
-            # Do not import urllib2 at the top of the module because
-            # it may fail due to broken SSL dependencies, and it takes
-            # about 0.15 seconds to load.
-            import urllib2
-            source = self.options['url']
-            try:
-                csv_text = urllib2.urlopen(source).read()
-            except (urllib2.URLError, IOError, OSError, ValueError), error:
-                severe = self.state_machine.reporter.severe(
-                      'Problems with "%s" directive URL "%s":\n%s.'
-                      % (self.name, self.options['url'], error),
-                      nodes.literal_block(self.block_text, self.block_text),
-                      line=self.lineno)
-                raise SystemMessagePropagation(severe)
-            csv_file = io.StringInput(
-                source=csv_text, source_path=source, encoding=encoding,
-                error_handler=(self.state.document.settings.\
-                               input_encoding_error_handler))
-            csv_data = csv_file.read().splitlines()
-        else:
-            error = self.state_machine.reporter.warning(
-                'The "%s" directive requires content; none supplied.'
-                % self.name, nodes.literal_block(
-                self.block_text, self.block_text), line=self.lineno)
-            raise SystemMessagePropagation(error)
-        return csv_data, source
-
-    def parse_csv_data_into_rows(self, csv_data, dialect, source):
-        # csv.py doesn't do Unicode; encode temporarily as UTF-8
-        csv_reader = csv.reader([(line.encode('utf-8') + '\n')
-                                for line in csv_data],
-                                dialect=dialect)
-        rows = []
-        max_cols = 0
-        for row in csv_reader:
-            row_data = []
-            for cell in row:
-                # decode UTF-8 back to Unicode
-                cell_text = unicode(cell, 'utf-8')
-                cell_data = (0, 0, 0, statemachine.StringList(
-                    cell_text.splitlines(), source=source))
-                row_data.append(cell_data)
-            rows.append(row_data)
-            max_cols = max(max_cols, len(row))
-        return rows, max_cols
-
-
-class ListTable(Table):
-
-    """
-    Implement tables whose data is encoded as a uniform two-level bullet list.
-    For further ideas, see
-    http://docutils.sf.net/docs/dev/rst/alternatives.html#list-driven-tables
-    """ 
-
-    option_spec = {'header-rows': directives.nonnegative_int,
-                   'stub-columns': directives.nonnegative_int,
-                   'widths': directives.positive_int_list,
-                   'class': directives.class_option}
-
-    def run(self):
-        if not self.content:
-            error = self.state_machine.reporter.error(
-                'The "%s" directive is empty; content required.' % self.name,
-                nodes.literal_block(self.block_text, self.block_text),
-                line=self.lineno)
-            return [error]
-        title, messages = self.make_title()
-        node = nodes.Element()          # anonymous container for parsing
-        self.state.nested_parse(self.content, self.content_offset, node)
-        try:
-            num_cols, col_widths = self.check_list_content(node)
-            table_data = [[item.children for item in row_list[0]]
-                          for row_list in node[0]]
-            header_rows = self.options.get('header-rows', 0)
-            stub_columns = self.options.get('stub-columns', 0)
-            self.check_table_dimensions(table_data, header_rows, stub_columns)
-        except SystemMessagePropagation, detail:
-            return [detail.args[0]]
-        table_node = self.build_table_from_list(table_data, col_widths,
-                                                header_rows, stub_columns)
-        table_node['classes'] += self.options.get('class', [])
-        if title:
-            table_node.insert(0, title)
-        return [table_node] + messages
-
-    def check_list_content(self, node):
-        if len(node) != 1 or not isinstance(node[0], nodes.bullet_list):
-            error = self.state_machine.reporter.error(
-                'Error parsing content block for the "%s" directive: '
-                'exactly one bullet list expected.' % self.name,
-                nodes.literal_block(self.block_text, self.block_text),
-                line=self.lineno)
-            raise SystemMessagePropagation(error)
-        list_node = node[0]
-        # Check for a uniform two-level bullet list:
-        for item_index in range(len(list_node)):
-            item = list_node[item_index]
-            if len(item) != 1 or not isinstance(item[0], nodes.bullet_list):
-                error = self.state_machine.reporter.error(
-                    'Error parsing content block for the "%s" directive: '
-                    'two-level bullet list expected, but row %s does not '
-                    'contain a second-level bullet list.'
-                    % (self.name, item_index + 1), nodes.literal_block(
-                    self.block_text, self.block_text), line=self.lineno)
-                raise SystemMessagePropagation(error)
-            elif item_index:
-                # ATTN pychecker users: num_cols is guaranteed to be set in the
-                # "else" clause below for item_index==0, before this branch is
-                # triggered.
-                if len(item[0]) != num_cols:
-                    error = self.state_machine.reporter.error(
-                        'Error parsing content block for the "%s" directive: '
-                        'uniform two-level bullet list expected, but row %s '
-                        'does not contain the same number of items as row 1 '
-                        '(%s vs %s).'
-                        % (self.name, item_index + 1, len(item[0]), num_cols),
-                        nodes.literal_block(self.block_text, self.block_text),
-                        line=self.lineno)
-                    raise SystemMessagePropagation(error)
-            else:
-                num_cols = len(item[0])
-        col_widths = self.get_column_widths(num_cols)
-        return num_cols, col_widths
-
-    def build_table_from_list(self, table_data, col_widths, header_rows, stub_columns):
-        table = nodes.table()
-        tgroup = nodes.tgroup(cols=len(col_widths))
-        table += tgroup
-        for col_width in col_widths:
-            colspec = nodes.colspec(colwidth=col_width)
-            if stub_columns:
-                colspec.attributes['stub'] = 1
-                stub_columns -= 1
-            tgroup += colspec
-        rows = []
-        for row in table_data:
-            row_node = nodes.row()
-            for cell in row:
-                entry = nodes.entry()
-                entry += cell
-                row_node += entry
-            rows.append(row_node)
-        if header_rows:
-            thead = nodes.thead()
-            thead.extend(rows[:header_rows])
-            tgroup += thead
-        tbody = nodes.tbody()
-        tbody.extend(rows[header_rows:])
-        tgroup += tbody
-        return table
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/README.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-============================================
- ``docutils/parsers/rst/include`` Directory
-============================================
-
-This directory contains standard data files intended for inclusion in
-reStructuredText documents.  To access these files, use the "include"
-directive with the special syntax for standard "include" data files,
-angle brackets around the file name::
-
-    .. include:: <isonum.txt>
-
-See the documentation for the `"include" directive`__ and
-`reStructuredText Standard Substitution Definition Sets`__ for
-details.
-
-__ http://docutils.sf.net/docs/ref/rst/directives.html#include
-__ http://docutils.sf.net/docs/ref/rst/substitutions.html
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsa.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,162 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |angzarr|  unicode:: U+0237C .. RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
-.. |cirmid|   unicode:: U+02AEF .. VERTICAL LINE WITH CIRCLE ABOVE
-.. |cudarrl|  unicode:: U+02938 .. RIGHT-SIDE ARC CLOCKWISE ARROW
-.. |cudarrr|  unicode:: U+02935 .. ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
-.. |cularr|   unicode:: U+021B6 .. ANTICLOCKWISE TOP SEMICIRCLE ARROW
-.. |cularrp|  unicode:: U+0293D .. TOP ARC ANTICLOCKWISE ARROW WITH PLUS
-.. |curarr|   unicode:: U+021B7 .. CLOCKWISE TOP SEMICIRCLE ARROW
-.. |curarrm|  unicode:: U+0293C .. TOP ARC CLOCKWISE ARROW WITH MINUS
-.. |Darr|     unicode:: U+021A1 .. DOWNWARDS TWO HEADED ARROW
-.. |dArr|     unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
-.. |darr2|    unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
-.. |ddarr|    unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
-.. |DDotrahd| unicode:: U+02911 .. RIGHTWARDS ARROW WITH DOTTED STEM
-.. |dfisht|   unicode:: U+0297F .. DOWN FISH TAIL
-.. |dHar|     unicode:: U+02965 .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
-.. |dharl|    unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
-.. |dharr|    unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
-.. |dlarr|    unicode:: U+02199 .. SOUTH WEST ARROW
-.. |drarr|    unicode:: U+02198 .. SOUTH EAST ARROW
-.. |duarr|    unicode:: U+021F5 .. DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
-.. |duhar|    unicode:: U+0296F .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
-.. |dzigrarr| unicode:: U+027FF .. LONG RIGHTWARDS SQUIGGLE ARROW
-.. |erarr|    unicode:: U+02971 .. EQUALS SIGN ABOVE RIGHTWARDS ARROW
-.. |hArr|     unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
-.. |harr|     unicode:: U+02194 .. LEFT RIGHT ARROW
-.. |harrcir|  unicode:: U+02948 .. LEFT RIGHT ARROW THROUGH SMALL CIRCLE
-.. |harrw|    unicode:: U+021AD .. LEFT RIGHT WAVE ARROW
-.. |hoarr|    unicode:: U+021FF .. LEFT RIGHT OPEN-HEADED ARROW
-.. |imof|     unicode:: U+022B7 .. IMAGE OF
-.. |lAarr|    unicode:: U+021DA .. LEFTWARDS TRIPLE ARROW
-.. |Larr|     unicode:: U+0219E .. LEFTWARDS TWO HEADED ARROW
-.. |larr2|    unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
-.. |larrbfs|  unicode:: U+0291F .. LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
-.. |larrfs|   unicode:: U+0291D .. LEFTWARDS ARROW TO BLACK DIAMOND
-.. |larrhk|   unicode:: U+021A9 .. LEFTWARDS ARROW WITH HOOK
-.. |larrlp|   unicode:: U+021AB .. LEFTWARDS ARROW WITH LOOP
-.. |larrpl|   unicode:: U+02939 .. LEFT-SIDE ARC ANTICLOCKWISE ARROW
-.. |larrsim|  unicode:: U+02973 .. LEFTWARDS ARROW ABOVE TILDE OPERATOR
-.. |larrtl|   unicode:: U+021A2 .. LEFTWARDS ARROW WITH TAIL
-.. |lAtail|   unicode:: U+0291B .. LEFTWARDS DOUBLE ARROW-TAIL
-.. |latail|   unicode:: U+02919 .. LEFTWARDS ARROW-TAIL
-.. |lBarr|    unicode:: U+0290E .. LEFTWARDS TRIPLE DASH ARROW
-.. |lbarr|    unicode:: U+0290C .. LEFTWARDS DOUBLE DASH ARROW
-.. |ldca|     unicode:: U+02936 .. ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
-.. |ldrdhar|  unicode:: U+02967 .. LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
-.. |ldrushar| unicode:: U+0294B .. LEFT BARB DOWN RIGHT BARB UP HARPOON
-.. |ldsh|     unicode:: U+021B2 .. DOWNWARDS ARROW WITH TIP LEFTWARDS
-.. |lfisht|   unicode:: U+0297C .. LEFT FISH TAIL
-.. |lHar|     unicode:: U+02962 .. LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
-.. |lhard|    unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
-.. |lharu|    unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
-.. |lharul|   unicode:: U+0296A .. LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
-.. |llarr|    unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
-.. |llhard|   unicode:: U+0296B .. LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
-.. |loarr|    unicode:: U+021FD .. LEFTWARDS OPEN-HEADED ARROW
-.. |lrarr|    unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
-.. |lrarr2|   unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
-.. |lrhar|    unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
-.. |lrhar2|   unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
-.. |lrhard|   unicode:: U+0296D .. RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
-.. |lsh|      unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
-.. |lurdshar| unicode:: U+0294A .. LEFT BARB UP RIGHT BARB DOWN HARPOON
-.. |luruhar|  unicode:: U+02966 .. LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
-.. |Map|      unicode:: U+02905 .. RIGHTWARDS TWO-HEADED ARROW FROM BAR
-.. |map|      unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
-.. |midcir|   unicode:: U+02AF0 .. VERTICAL LINE WITH CIRCLE BELOW
-.. |mumap|    unicode:: U+022B8 .. MULTIMAP
-.. |nearhk|   unicode:: U+02924 .. NORTH EAST ARROW WITH HOOK
-.. |neArr|    unicode:: U+021D7 .. NORTH EAST DOUBLE ARROW
-.. |nearr|    unicode:: U+02197 .. NORTH EAST ARROW
-.. |nesear|   unicode:: U+02928 .. NORTH EAST ARROW AND SOUTH EAST ARROW
-.. |nhArr|    unicode:: U+021CE .. LEFT RIGHT DOUBLE ARROW WITH STROKE
-.. |nharr|    unicode:: U+021AE .. LEFT RIGHT ARROW WITH STROKE
-.. |nlArr|    unicode:: U+021CD .. LEFTWARDS DOUBLE ARROW WITH STROKE
-.. |nlarr|    unicode:: U+0219A .. LEFTWARDS ARROW WITH STROKE
-.. |nrArr|    unicode:: U+021CF .. RIGHTWARDS DOUBLE ARROW WITH STROKE
-.. |nrarr|    unicode:: U+0219B .. RIGHTWARDS ARROW WITH STROKE
-.. |nrarrc|   unicode:: U+02933 U+00338 .. WAVE ARROW POINTING DIRECTLY RIGHT with slash
-.. |nrarrw|   unicode:: U+0219D U+00338 .. RIGHTWARDS WAVE ARROW with slash
-.. |nvHarr|   unicode:: U+02904 .. LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
-.. |nvlArr|   unicode:: U+02902 .. LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
-.. |nvrArr|   unicode:: U+02903 .. RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
-.. |nwarhk|   unicode:: U+02923 .. NORTH WEST ARROW WITH HOOK
-.. |nwArr|    unicode:: U+021D6 .. NORTH WEST DOUBLE ARROW
-.. |nwarr|    unicode:: U+02196 .. NORTH WEST ARROW
-.. |nwnear|   unicode:: U+02927 .. NORTH WEST ARROW AND NORTH EAST ARROW
-.. |olarr|    unicode:: U+021BA .. ANTICLOCKWISE OPEN CIRCLE ARROW
-.. |orarr|    unicode:: U+021BB .. CLOCKWISE OPEN CIRCLE ARROW
-.. |origof|   unicode:: U+022B6 .. ORIGINAL OF
-.. |rAarr|    unicode:: U+021DB .. RIGHTWARDS TRIPLE ARROW
-.. |Rarr|     unicode:: U+021A0 .. RIGHTWARDS TWO HEADED ARROW
-.. |rarr2|    unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
-.. |rarrap|   unicode:: U+02975 .. RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
-.. |rarrbfs|  unicode:: U+02920 .. RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
-.. |rarrc|    unicode:: U+02933 .. WAVE ARROW POINTING DIRECTLY RIGHT
-.. |rarrfs|   unicode:: U+0291E .. RIGHTWARDS ARROW TO BLACK DIAMOND
-.. |rarrhk|   unicode:: U+021AA .. RIGHTWARDS ARROW WITH HOOK
-.. |rarrlp|   unicode:: U+021AC .. RIGHTWARDS ARROW WITH LOOP
-.. |rarrpl|   unicode:: U+02945 .. RIGHTWARDS ARROW WITH PLUS BELOW
-.. |rarrsim|  unicode:: U+02974 .. RIGHTWARDS ARROW ABOVE TILDE OPERATOR
-.. |Rarrtl|   unicode:: U+02916 .. RIGHTWARDS TWO-HEADED ARROW WITH TAIL
-.. |rarrtl|   unicode:: U+021A3 .. RIGHTWARDS ARROW WITH TAIL
-.. |rarrw|    unicode:: U+0219D .. RIGHTWARDS WAVE ARROW
-.. |rAtail|   unicode:: U+0291C .. RIGHTWARDS DOUBLE ARROW-TAIL
-.. |ratail|   unicode:: U+0291A .. RIGHTWARDS ARROW-TAIL
-.. |RBarr|    unicode:: U+02910 .. RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
-.. |rBarr|    unicode:: U+0290F .. RIGHTWARDS TRIPLE DASH ARROW
-.. |rbarr|    unicode:: U+0290D .. RIGHTWARDS DOUBLE DASH ARROW
-.. |rdca|     unicode:: U+02937 .. ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
-.. |rdldhar|  unicode:: U+02969 .. RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
-.. |rdsh|     unicode:: U+021B3 .. DOWNWARDS ARROW WITH TIP RIGHTWARDS
-.. |rfisht|   unicode:: U+0297D .. RIGHT FISH TAIL
-.. |rHar|     unicode:: U+02964 .. RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
-.. |rhard|    unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
-.. |rharu|    unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
-.. |rharul|   unicode:: U+0296C .. RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
-.. |rlarr|    unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
-.. |rlarr2|   unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
-.. |rlhar|    unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
-.. |rlhar2|   unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
-.. |roarr|    unicode:: U+021FE .. RIGHTWARDS OPEN-HEADED ARROW
-.. |rrarr|    unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
-.. |rsh|      unicode:: U+021B1 .. UPWARDS ARROW WITH TIP RIGHTWARDS
-.. |ruluhar|  unicode:: U+02968 .. RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
-.. |searhk|   unicode:: U+02925 .. SOUTH EAST ARROW WITH HOOK
-.. |seArr|    unicode:: U+021D8 .. SOUTH EAST DOUBLE ARROW
-.. |searr|    unicode:: U+02198 .. SOUTH EAST ARROW
-.. |seswar|   unicode:: U+02929 .. SOUTH EAST ARROW AND SOUTH WEST ARROW
-.. |simrarr|  unicode:: U+02972 .. TILDE OPERATOR ABOVE RIGHTWARDS ARROW
-.. |slarr|    unicode:: U+02190 .. LEFTWARDS ARROW
-.. |srarr|    unicode:: U+02192 .. RIGHTWARDS ARROW
-.. |swarhk|   unicode:: U+02926 .. SOUTH WEST ARROW WITH HOOK
-.. |swArr|    unicode:: U+021D9 .. SOUTH WEST DOUBLE ARROW
-.. |swarr|    unicode:: U+02199 .. SOUTH WEST ARROW
-.. |swnwar|   unicode:: U+0292A .. SOUTH WEST ARROW AND NORTH WEST ARROW
-.. |Uarr|     unicode:: U+0219F .. UPWARDS TWO HEADED ARROW
-.. |uArr|     unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
-.. |uarr2|    unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
-.. |Uarrocir| unicode:: U+02949 .. UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
-.. |udarr|    unicode:: U+021C5 .. UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
-.. |udhar|    unicode:: U+0296E .. UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
-.. |ufisht|   unicode:: U+0297E .. UP FISH TAIL
-.. |uHar|     unicode:: U+02963 .. UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
-.. |uharl|    unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
-.. |uharr|    unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
-.. |uuarr|    unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
-.. |vArr|     unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
-.. |varr|     unicode:: U+02195 .. UP DOWN ARROW
-.. |xhArr|    unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
-.. |xharr|    unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
-.. |xlArr|    unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
-.. |xlarr|    unicode:: U+027F5 .. LONG LEFTWARDS ARROW
-.. |xmap|     unicode:: U+027FC .. LONG RIGHTWARDS ARROW FROM BAR
-.. |xrArr|    unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
-.. |xrarr|    unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
-.. |zigrarr|  unicode:: U+021DD .. RIGHTWARDS SQUIGGLE ARROW
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsb.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,126 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |ac|       unicode:: U+0223E .. INVERTED LAZY S
-.. |acE|      unicode:: U+0223E U+00333 .. INVERTED LAZY S with double underline
-.. |amalg|    unicode:: U+02A3F .. AMALGAMATION OR COPRODUCT
-.. |barvee|   unicode:: U+022BD .. NOR
-.. |Barwed|   unicode:: U+02306 .. PERSPECTIVE
-.. |barwed|   unicode:: U+02305 .. PROJECTIVE
-.. |bsolb|    unicode:: U+029C5 .. SQUARED FALLING DIAGONAL SLASH
-.. |Cap|      unicode:: U+022D2 .. DOUBLE INTERSECTION
-.. |capand|   unicode:: U+02A44 .. INTERSECTION WITH LOGICAL AND
-.. |capbrcup| unicode:: U+02A49 .. INTERSECTION ABOVE BAR ABOVE UNION
-.. |capcap|   unicode:: U+02A4B .. INTERSECTION BESIDE AND JOINED WITH INTERSECTION
-.. |capcup|   unicode:: U+02A47 .. INTERSECTION ABOVE UNION
-.. |capdot|   unicode:: U+02A40 .. INTERSECTION WITH DOT
-.. |caps|     unicode:: U+02229 U+0FE00 .. INTERSECTION with serifs
-.. |ccaps|    unicode:: U+02A4D .. CLOSED INTERSECTION WITH SERIFS
-.. |ccups|    unicode:: U+02A4C .. CLOSED UNION WITH SERIFS
-.. |ccupssm|  unicode:: U+02A50 .. CLOSED UNION WITH SERIFS AND SMASH PRODUCT
-.. |coprod|   unicode:: U+02210 .. N-ARY COPRODUCT
-.. |Cup|      unicode:: U+022D3 .. DOUBLE UNION
-.. |cupbrcap| unicode:: U+02A48 .. UNION ABOVE BAR ABOVE INTERSECTION
-.. |cupcap|   unicode:: U+02A46 .. UNION ABOVE INTERSECTION
-.. |cupcup|   unicode:: U+02A4A .. UNION BESIDE AND JOINED WITH UNION
-.. |cupdot|   unicode:: U+0228D .. MULTISET MULTIPLICATION
-.. |cupor|    unicode:: U+02A45 .. UNION WITH LOGICAL OR
-.. |cups|     unicode:: U+0222A U+0FE00 .. UNION with serifs
-.. |cuvee|    unicode:: U+022CE .. CURLY LOGICAL OR
-.. |cuwed|    unicode:: U+022CF .. CURLY LOGICAL AND
-.. |Dagger|   unicode:: U+02021 .. DOUBLE DAGGER
-.. |dagger|   unicode:: U+02020 .. DAGGER
-.. |diam|     unicode:: U+022C4 .. DIAMOND OPERATOR
-.. |divonx|   unicode:: U+022C7 .. DIVISION TIMES
-.. |eplus|    unicode:: U+02A71 .. EQUALS SIGN ABOVE PLUS SIGN
-.. |hercon|   unicode:: U+022B9 .. HERMITIAN CONJUGATE MATRIX
-.. |intcal|   unicode:: U+022BA .. INTERCALATE
-.. |iprod|    unicode:: U+02A3C .. INTERIOR PRODUCT
-.. |loplus|   unicode:: U+02A2D .. PLUS SIGN IN LEFT HALF CIRCLE
-.. |lotimes|  unicode:: U+02A34 .. MULTIPLICATION SIGN IN LEFT HALF CIRCLE
-.. |lthree|   unicode:: U+022CB .. LEFT SEMIDIRECT PRODUCT
-.. |ltimes|   unicode:: U+022C9 .. LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
-.. |midast|   unicode:: U+0002A .. ASTERISK
-.. |minusb|   unicode:: U+0229F .. SQUARED MINUS
-.. |minusd|   unicode:: U+02238 .. DOT MINUS
-.. |minusdu|  unicode:: U+02A2A .. MINUS SIGN WITH DOT BELOW
-.. |ncap|     unicode:: U+02A43 .. INTERSECTION WITH OVERBAR
-.. |ncup|     unicode:: U+02A42 .. UNION WITH OVERBAR
-.. |oast|     unicode:: U+0229B .. CIRCLED ASTERISK OPERATOR
-.. |ocir|     unicode:: U+0229A .. CIRCLED RING OPERATOR
-.. |odash|    unicode:: U+0229D .. CIRCLED DASH
-.. |odiv|     unicode:: U+02A38 .. CIRCLED DIVISION SIGN
-.. |odot|     unicode:: U+02299 .. CIRCLED DOT OPERATOR
-.. |odsold|   unicode:: U+029BC .. CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
-.. |ofcir|    unicode:: U+029BF .. CIRCLED BULLET
-.. |ogt|      unicode:: U+029C1 .. CIRCLED GREATER-THAN
-.. |ohbar|    unicode:: U+029B5 .. CIRCLE WITH HORIZONTAL BAR
-.. |olcir|    unicode:: U+029BE .. CIRCLED WHITE BULLET
-.. |olt|      unicode:: U+029C0 .. CIRCLED LESS-THAN
-.. |omid|     unicode:: U+029B6 .. CIRCLED VERTICAL BAR
-.. |ominus|   unicode:: U+02296 .. CIRCLED MINUS
-.. |opar|     unicode:: U+029B7 .. CIRCLED PARALLEL
-.. |operp|    unicode:: U+029B9 .. CIRCLED PERPENDICULAR
-.. |oplus|    unicode:: U+02295 .. CIRCLED PLUS
-.. |osol|     unicode:: U+02298 .. CIRCLED DIVISION SLASH
-.. |Otimes|   unicode:: U+02A37 .. MULTIPLICATION SIGN IN DOUBLE CIRCLE
-.. |otimes|   unicode:: U+02297 .. CIRCLED TIMES
-.. |otimesas| unicode:: U+02A36 .. CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
-.. |ovbar|    unicode:: U+0233D .. APL FUNCTIONAL SYMBOL CIRCLE STILE
-.. |plusacir| unicode:: U+02A23 .. PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
-.. |plusb|    unicode:: U+0229E .. SQUARED PLUS
-.. |pluscir|  unicode:: U+02A22 .. PLUS SIGN WITH SMALL CIRCLE ABOVE
-.. |plusdo|   unicode:: U+02214 .. DOT PLUS
-.. |plusdu|   unicode:: U+02A25 .. PLUS SIGN WITH DOT BELOW
-.. |pluse|    unicode:: U+02A72 .. PLUS SIGN ABOVE EQUALS SIGN
-.. |plussim|  unicode:: U+02A26 .. PLUS SIGN WITH TILDE BELOW
-.. |plustwo|  unicode:: U+02A27 .. PLUS SIGN WITH SUBSCRIPT TWO
-.. |prod|     unicode:: U+0220F .. N-ARY PRODUCT
-.. |race|     unicode:: U+029DA .. LEFT DOUBLE WIGGLY FENCE
-.. |roplus|   unicode:: U+02A2E .. PLUS SIGN IN RIGHT HALF CIRCLE
-.. |rotimes|  unicode:: U+02A35 .. MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
-.. |rthree|   unicode:: U+022CC .. RIGHT SEMIDIRECT PRODUCT
-.. |rtimes|   unicode:: U+022CA .. RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
-.. |sdot|     unicode:: U+022C5 .. DOT OPERATOR
-.. |sdotb|    unicode:: U+022A1 .. SQUARED DOT OPERATOR
-.. |setmn|    unicode:: U+02216 .. SET MINUS
-.. |simplus|  unicode:: U+02A24 .. PLUS SIGN WITH TILDE ABOVE
-.. |smashp|   unicode:: U+02A33 .. SMASH PRODUCT
-.. |solb|     unicode:: U+029C4 .. SQUARED RISING DIAGONAL SLASH
-.. |sqcap|    unicode:: U+02293 .. SQUARE CAP
-.. |sqcaps|   unicode:: U+02293 U+0FE00 .. SQUARE CAP with serifs
-.. |sqcup|    unicode:: U+02294 .. SQUARE CUP
-.. |sqcups|   unicode:: U+02294 U+0FE00 .. SQUARE CUP with serifs
-.. |ssetmn|   unicode:: U+02216 .. SET MINUS
-.. |sstarf|   unicode:: U+022C6 .. STAR OPERATOR
-.. |subdot|   unicode:: U+02ABD .. SUBSET WITH DOT
-.. |sum|      unicode:: U+02211 .. N-ARY SUMMATION
-.. |supdot|   unicode:: U+02ABE .. SUPERSET WITH DOT
-.. |timesb|   unicode:: U+022A0 .. SQUARED TIMES
-.. |timesbar| unicode:: U+02A31 .. MULTIPLICATION SIGN WITH UNDERBAR
-.. |timesd|   unicode:: U+02A30 .. MULTIPLICATION SIGN WITH DOT ABOVE
-.. |top|      unicode:: U+022A4 .. DOWN TACK
-.. |tridot|   unicode:: U+025EC .. WHITE UP-POINTING TRIANGLE WITH DOT
-.. |triminus| unicode:: U+02A3A .. MINUS SIGN IN TRIANGLE
-.. |triplus|  unicode:: U+02A39 .. PLUS SIGN IN TRIANGLE
-.. |trisb|    unicode:: U+029CD .. TRIANGLE WITH SERIFS AT BOTTOM
-.. |tritime|  unicode:: U+02A3B .. MULTIPLICATION SIGN IN TRIANGLE
-.. |uplus|    unicode:: U+0228E .. MULTISET UNION
-.. |veebar|   unicode:: U+022BB .. XOR
-.. |wedbar|   unicode:: U+02A5F .. LOGICAL AND WITH UNDERBAR
-.. |wreath|   unicode:: U+02240 .. WREATH PRODUCT
-.. |xcap|     unicode:: U+022C2 .. N-ARY INTERSECTION
-.. |xcirc|    unicode:: U+025EF .. LARGE CIRCLE
-.. |xcup|     unicode:: U+022C3 .. N-ARY UNION
-.. |xdtri|    unicode:: U+025BD .. WHITE DOWN-POINTING TRIANGLE
-.. |xodot|    unicode:: U+02A00 .. N-ARY CIRCLED DOT OPERATOR
-.. |xoplus|   unicode:: U+02A01 .. N-ARY CIRCLED PLUS OPERATOR
-.. |xotime|   unicode:: U+02A02 .. N-ARY CIRCLED TIMES OPERATOR
-.. |xsqcup|   unicode:: U+02A06 .. N-ARY SQUARE UNION OPERATOR
-.. |xuplus|   unicode:: U+02A04 .. N-ARY UNION OPERATOR WITH PLUS
-.. |xutri|    unicode:: U+025B3 .. WHITE UP-POINTING TRIANGLE
-.. |xvee|     unicode:: U+022C1 .. N-ARY LOGICAL OR
-.. |xwedge|   unicode:: U+022C0 .. N-ARY LOGICAL AND
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsc.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |dlcorn|  unicode:: U+0231E .. BOTTOM LEFT CORNER
-.. |drcorn|  unicode:: U+0231F .. BOTTOM RIGHT CORNER
-.. |gtlPar|  unicode:: U+02995 .. DOUBLE LEFT ARC GREATER-THAN BRACKET
-.. |langd|   unicode:: U+02991 .. LEFT ANGLE BRACKET WITH DOT
-.. |lbrke|   unicode:: U+0298B .. LEFT SQUARE BRACKET WITH UNDERBAR
-.. |lbrksld| unicode:: U+0298F .. LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
-.. |lbrkslu| unicode:: U+0298D .. LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
-.. |lceil|   unicode:: U+02308 .. LEFT CEILING
-.. |lfloor|  unicode:: U+0230A .. LEFT FLOOR
-.. |lmoust|  unicode:: U+023B0 .. UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
-.. |lpargt|  unicode:: U+029A0 .. SPHERICAL ANGLE OPENING LEFT
-.. |lparlt|  unicode:: U+02993 .. LEFT ARC LESS-THAN BRACKET
-.. |ltrPar|  unicode:: U+02996 .. DOUBLE RIGHT ARC LESS-THAN BRACKET
-.. |rangd|   unicode:: U+02992 .. RIGHT ANGLE BRACKET WITH DOT
-.. |rbrke|   unicode:: U+0298C .. RIGHT SQUARE BRACKET WITH UNDERBAR
-.. |rbrksld| unicode:: U+0298E .. RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
-.. |rbrkslu| unicode:: U+02990 .. RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
-.. |rceil|   unicode:: U+02309 .. RIGHT CEILING
-.. |rfloor|  unicode:: U+0230B .. RIGHT FLOOR
-.. |rmoust|  unicode:: U+023B1 .. UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
-.. |rpargt|  unicode:: U+02994 .. RIGHT ARC GREATER-THAN BRACKET
-.. |ulcorn|  unicode:: U+0231C .. TOP LEFT CORNER
-.. |urcorn|  unicode:: U+0231D .. TOP RIGHT CORNER
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsn.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |gnap|     unicode:: U+02A8A .. GREATER-THAN AND NOT APPROXIMATE
-.. |gnE|      unicode:: U+02269 .. GREATER-THAN BUT NOT EQUAL TO
-.. |gne|      unicode:: U+02A88 .. GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
-.. |gnsim|    unicode:: U+022E7 .. GREATER-THAN BUT NOT EQUIVALENT TO
-.. |gvnE|     unicode:: U+02269 U+0FE00 .. GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
-.. |lnap|     unicode:: U+02A89 .. LESS-THAN AND NOT APPROXIMATE
-.. |lnE|      unicode:: U+02268 .. LESS-THAN BUT NOT EQUAL TO
-.. |lne|      unicode:: U+02A87 .. LESS-THAN AND SINGLE-LINE NOT EQUAL TO
-.. |lnsim|    unicode:: U+022E6 .. LESS-THAN BUT NOT EQUIVALENT TO
-.. |lvnE|     unicode:: U+02268 U+0FE00 .. LESS-THAN BUT NOT EQUAL TO - with vertical stroke
-.. |nap|      unicode:: U+02249 .. NOT ALMOST EQUAL TO
-.. |napE|     unicode:: U+02A70 U+00338 .. APPROXIMATELY EQUAL OR EQUAL TO with slash
-.. |napid|    unicode:: U+0224B U+00338 .. TRIPLE TILDE with slash
-.. |ncong|    unicode:: U+02247 .. NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
-.. |ncongdot| unicode:: U+02A6D U+00338 .. CONGRUENT WITH DOT ABOVE with slash
-.. |nequiv|   unicode:: U+02262 .. NOT IDENTICAL TO
-.. |ngE|      unicode:: U+02267 U+00338 .. GREATER-THAN OVER EQUAL TO with slash
-.. |nge|      unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
-.. |nges|     unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
-.. |nGg|      unicode:: U+022D9 U+00338 .. VERY MUCH GREATER-THAN with slash
-.. |ngsim|    unicode:: U+02275 .. NEITHER GREATER-THAN NOR EQUIVALENT TO
-.. |nGt|      unicode:: U+0226B U+020D2 .. MUCH GREATER THAN with vertical line
-.. |ngt|      unicode:: U+0226F .. NOT GREATER-THAN
-.. |nGtv|     unicode:: U+0226B U+00338 .. MUCH GREATER THAN with slash
-.. |nlE|      unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
-.. |nle|      unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
-.. |nles|     unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
-.. |nLl|      unicode:: U+022D8 U+00338 .. VERY MUCH LESS-THAN with slash
-.. |nlsim|    unicode:: U+02274 .. NEITHER LESS-THAN NOR EQUIVALENT TO
-.. |nLt|      unicode:: U+0226A U+020D2 .. MUCH LESS THAN with vertical line
-.. |nlt|      unicode:: U+0226E .. NOT LESS-THAN
-.. |nltri|    unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
-.. |nltrie|   unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
-.. |nLtv|     unicode:: U+0226A U+00338 .. MUCH LESS THAN with slash
-.. |nmid|     unicode:: U+02224 .. DOES NOT DIVIDE
-.. |npar|     unicode:: U+02226 .. NOT PARALLEL TO
-.. |npr|      unicode:: U+02280 .. DOES NOT PRECEDE
-.. |nprcue|   unicode:: U+022E0 .. DOES NOT PRECEDE OR EQUAL
-.. |npre|     unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
-.. |nrtri|    unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
-.. |nrtrie|   unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
-.. |nsc|      unicode:: U+02281 .. DOES NOT SUCCEED
-.. |nsccue|   unicode:: U+022E1 .. DOES NOT SUCCEED OR EQUAL
-.. |nsce|     unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
-.. |nsim|     unicode:: U+02241 .. NOT TILDE
-.. |nsime|    unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
-.. |nsmid|    unicode:: U+02224 .. DOES NOT DIVIDE
-.. |nspar|    unicode:: U+02226 .. NOT PARALLEL TO
-.. |nsqsube|  unicode:: U+022E2 .. NOT SQUARE IMAGE OF OR EQUAL TO
-.. |nsqsupe|  unicode:: U+022E3 .. NOT SQUARE ORIGINAL OF OR EQUAL TO
-.. |nsub|     unicode:: U+02284 .. NOT A SUBSET OF
-.. |nsubE|    unicode:: U+02AC5 U+00338 .. SUBSET OF ABOVE EQUALS SIGN with slash
-.. |nsube|    unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
-.. |nsup|     unicode:: U+02285 .. NOT A SUPERSET OF
-.. |nsupE|    unicode:: U+02AC6 U+00338 .. SUPERSET OF ABOVE EQUALS SIGN with slash
-.. |nsupe|    unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
-.. |ntgl|     unicode:: U+02279 .. NEITHER GREATER-THAN NOR LESS-THAN
-.. |ntlg|     unicode:: U+02278 .. NEITHER LESS-THAN NOR GREATER-THAN
-.. |nvap|     unicode:: U+0224D U+020D2 .. EQUIVALENT TO with vertical line
-.. |nVDash|   unicode:: U+022AF .. NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
-.. |nVdash|   unicode:: U+022AE .. DOES NOT FORCE
-.. |nvDash|   unicode:: U+022AD .. NOT TRUE
-.. |nvdash|   unicode:: U+022AC .. DOES NOT PROVE
-.. |nvge|     unicode:: U+02265 U+020D2 .. GREATER-THAN OR EQUAL TO with vertical line
-.. |nvgt|     unicode:: U+0003E U+020D2 .. GREATER-THAN SIGN with vertical line
-.. |nvle|     unicode:: U+02264 U+020D2 .. LESS-THAN OR EQUAL TO with vertical line
-.. |nvlt|     unicode:: U+0003C U+020D2 .. LESS-THAN SIGN with vertical line
-.. |nvltrie|  unicode:: U+022B4 U+020D2 .. NORMAL SUBGROUP OF OR EQUAL TO with vertical line
-.. |nvrtrie|  unicode:: U+022B5 U+020D2 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO with vertical line
-.. |nvsim|    unicode:: U+0223C U+020D2 .. TILDE OPERATOR with vertical line
-.. |parsim|   unicode:: U+02AF3 .. PARALLEL WITH TILDE OPERATOR
-.. |prnap|    unicode:: U+02AB9 .. PRECEDES ABOVE NOT ALMOST EQUAL TO
-.. |prnE|     unicode:: U+02AB5 .. PRECEDES ABOVE NOT EQUAL TO
-.. |prnsim|   unicode:: U+022E8 .. PRECEDES BUT NOT EQUIVALENT TO
-.. |rnmid|    unicode:: U+02AEE .. DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
-.. |scnap|    unicode:: U+02ABA .. SUCCEEDS ABOVE NOT ALMOST EQUAL TO
-.. |scnE|     unicode:: U+02AB6 .. SUCCEEDS ABOVE NOT EQUAL TO
-.. |scnsim|   unicode:: U+022E9 .. SUCCEEDS BUT NOT EQUIVALENT TO
-.. |simne|    unicode:: U+02246 .. APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
-.. |solbar|   unicode:: U+0233F .. APL FUNCTIONAL SYMBOL SLASH BAR
-.. |subnE|    unicode:: U+02ACB .. SUBSET OF ABOVE NOT EQUAL TO
-.. |subne|    unicode:: U+0228A .. SUBSET OF WITH NOT EQUAL TO
-.. |supnE|    unicode:: U+02ACC .. SUPERSET OF ABOVE NOT EQUAL TO
-.. |supne|    unicode:: U+0228B .. SUPERSET OF WITH NOT EQUAL TO
-.. |vnsub|    unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
-.. |vnsup|    unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
-.. |vsubnE|   unicode:: U+02ACB U+0FE00 .. SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
-.. |vsubne|   unicode:: U+0228A U+0FE00 .. SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
-.. |vsupnE|   unicode:: U+02ACC U+0FE00 .. SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
-.. |vsupne|   unicode:: U+0228B U+0FE00 .. SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamso.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |ang|      unicode:: U+02220 .. ANGLE
-.. |ange|     unicode:: U+029A4 .. ANGLE WITH UNDERBAR
-.. |angmsd|   unicode:: U+02221 .. MEASURED ANGLE
-.. |angmsdaa| unicode:: U+029A8 .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
-.. |angmsdab| unicode:: U+029A9 .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
-.. |angmsdac| unicode:: U+029AA .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
-.. |angmsdad| unicode:: U+029AB .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
-.. |angmsdae| unicode:: U+029AC .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
-.. |angmsdaf| unicode:: U+029AD .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
-.. |angmsdag| unicode:: U+029AE .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
-.. |angmsdah| unicode:: U+029AF .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
-.. |angrtvb|  unicode:: U+022BE .. RIGHT ANGLE WITH ARC
-.. |angrtvbd| unicode:: U+0299D .. MEASURED RIGHT ANGLE WITH DOT
-.. |bbrk|     unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
-.. |bbrktbrk| unicode:: U+023B6 .. BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
-.. |bemptyv|  unicode:: U+029B0 .. REVERSED EMPTY SET
-.. |beth|     unicode:: U+02136 .. BET SYMBOL
-.. |boxbox|   unicode:: U+029C9 .. TWO JOINED SQUARES
-.. |bprime|   unicode:: U+02035 .. REVERSED PRIME
-.. |bsemi|    unicode:: U+0204F .. REVERSED SEMICOLON
-.. |cemptyv|  unicode:: U+029B2 .. EMPTY SET WITH SMALL CIRCLE ABOVE
-.. |cirE|     unicode:: U+029C3 .. CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
-.. |cirscir|  unicode:: U+029C2 .. CIRCLE WITH SMALL CIRCLE TO THE RIGHT
-.. |comp|     unicode:: U+02201 .. COMPLEMENT
-.. |daleth|   unicode:: U+02138 .. DALET SYMBOL
-.. |demptyv|  unicode:: U+029B1 .. EMPTY SET WITH OVERBAR
-.. |ell|      unicode:: U+02113 .. SCRIPT SMALL L
-.. |empty|    unicode:: U+02205 .. EMPTY SET
-.. |emptyv|   unicode:: U+02205 .. EMPTY SET
-.. |gimel|    unicode:: U+02137 .. GIMEL SYMBOL
-.. |iiota|    unicode:: U+02129 .. TURNED GREEK SMALL LETTER IOTA
-.. |image|    unicode:: U+02111 .. BLACK-LETTER CAPITAL I
-.. |imath|    unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
-.. |inodot|   unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
-.. |jmath|    unicode:: U+0006A .. LATIN SMALL LETTER J
-.. |jnodot|   unicode:: U+0006A .. LATIN SMALL LETTER J
-.. |laemptyv| unicode:: U+029B4 .. EMPTY SET WITH LEFT ARROW ABOVE
-.. |lltri|    unicode:: U+025FA .. LOWER LEFT TRIANGLE
-.. |lrtri|    unicode:: U+022BF .. RIGHT TRIANGLE
-.. |mho|      unicode:: U+02127 .. INVERTED OHM SIGN
-.. |nang|     unicode:: U+02220 U+020D2 .. ANGLE with vertical line
-.. |nexist|   unicode:: U+02204 .. THERE DOES NOT EXIST
-.. |oS|       unicode:: U+024C8 .. CIRCLED LATIN CAPITAL LETTER S
-.. |planck|   unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
-.. |plankv|   unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
-.. |raemptyv| unicode:: U+029B3 .. EMPTY SET WITH RIGHT ARROW ABOVE
-.. |range|    unicode:: U+029A5 .. REVERSED ANGLE WITH UNDERBAR
-.. |real|     unicode:: U+0211C .. BLACK-LETTER CAPITAL R
-.. |sbsol|    unicode:: U+0FE68 .. SMALL REVERSE SOLIDUS
-.. |tbrk|     unicode:: U+023B4 .. TOP SQUARE BRACKET
-.. |trpezium| unicode:: U+0FFFD .. REPLACEMENT CHARACTER
-.. |ultri|    unicode:: U+025F8 .. UPPER LEFT TRIANGLE
-.. |urtri|    unicode:: U+025F9 .. UPPER RIGHT TRIANGLE
-.. |vprime|   unicode:: U+02032 .. PRIME
-.. |vzigzag|  unicode:: U+0299A .. VERTICAL ZIGZAG LINE
-.. |weierp|   unicode:: U+02118 .. SCRIPT CAPITAL P
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsr.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,191 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |apE|      unicode:: U+02A70 .. APPROXIMATELY EQUAL OR EQUAL TO
-.. |ape|      unicode:: U+0224A .. ALMOST EQUAL OR EQUAL TO
-.. |apid|     unicode:: U+0224B .. TRIPLE TILDE
-.. |asymp|    unicode:: U+02248 .. ALMOST EQUAL TO
-.. |Barv|     unicode:: U+02AE7 .. SHORT DOWN TACK WITH OVERBAR
-.. |bcong|    unicode:: U+0224C .. ALL EQUAL TO
-.. |bepsi|    unicode:: U+003F6 .. GREEK REVERSED LUNATE EPSILON SYMBOL
-.. |bowtie|   unicode:: U+022C8 .. BOWTIE
-.. |bsim|     unicode:: U+0223D .. REVERSED TILDE
-.. |bsime|    unicode:: U+022CD .. REVERSED TILDE EQUALS
-.. |bsolhsub| unicode:: U+0005C U+02282 .. REVERSE SOLIDUS, SUBSET OF
-.. |bump|     unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
-.. |bumpE|    unicode:: U+02AAE .. EQUALS SIGN WITH BUMPY ABOVE
-.. |bumpe|    unicode:: U+0224F .. DIFFERENCE BETWEEN
-.. |cire|     unicode:: U+02257 .. RING EQUAL TO
-.. |Colon|    unicode:: U+02237 .. PROPORTION
-.. |Colone|   unicode:: U+02A74 .. DOUBLE COLON EQUAL
-.. |colone|   unicode:: U+02254 .. COLON EQUALS
-.. |congdot|  unicode:: U+02A6D .. CONGRUENT WITH DOT ABOVE
-.. |csub|     unicode:: U+02ACF .. CLOSED SUBSET
-.. |csube|    unicode:: U+02AD1 .. CLOSED SUBSET OR EQUAL TO
-.. |csup|     unicode:: U+02AD0 .. CLOSED SUPERSET
-.. |csupe|    unicode:: U+02AD2 .. CLOSED SUPERSET OR EQUAL TO
-.. |cuepr|    unicode:: U+022DE .. EQUAL TO OR PRECEDES
-.. |cuesc|    unicode:: U+022DF .. EQUAL TO OR SUCCEEDS
-.. |cupre|    unicode:: U+0227C .. PRECEDES OR EQUAL TO
-.. |Dashv|    unicode:: U+02AE4 .. VERTICAL BAR DOUBLE LEFT TURNSTILE
-.. |dashv|    unicode:: U+022A3 .. LEFT TACK
-.. |easter|   unicode:: U+02A6E .. EQUALS WITH ASTERISK
-.. |ecir|     unicode:: U+02256 .. RING IN EQUAL TO
-.. |ecolon|   unicode:: U+02255 .. EQUALS COLON
-.. |eDDot|    unicode:: U+02A77 .. EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
-.. |eDot|     unicode:: U+02251 .. GEOMETRICALLY EQUAL TO
-.. |efDot|    unicode:: U+02252 .. APPROXIMATELY EQUAL TO OR THE IMAGE OF
-.. |eg|       unicode:: U+02A9A .. DOUBLE-LINE EQUAL TO OR GREATER-THAN
-.. |egs|      unicode:: U+02A96 .. SLANTED EQUAL TO OR GREATER-THAN
-.. |egsdot|   unicode:: U+02A98 .. SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
-.. |el|       unicode:: U+02A99 .. DOUBLE-LINE EQUAL TO OR LESS-THAN
-.. |els|      unicode:: U+02A95 .. SLANTED EQUAL TO OR LESS-THAN
-.. |elsdot|   unicode:: U+02A97 .. SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
-.. |equest|   unicode:: U+0225F .. QUESTIONED EQUAL TO
-.. |equivDD|  unicode:: U+02A78 .. EQUIVALENT WITH FOUR DOTS ABOVE
-.. |erDot|    unicode:: U+02253 .. IMAGE OF OR APPROXIMATELY EQUAL TO
-.. |esdot|    unicode:: U+02250 .. APPROACHES THE LIMIT
-.. |Esim|     unicode:: U+02A73 .. EQUALS SIGN ABOVE TILDE OPERATOR
-.. |esim|     unicode:: U+02242 .. MINUS TILDE
-.. |fork|     unicode:: U+022D4 .. PITCHFORK
-.. |forkv|    unicode:: U+02AD9 .. ELEMENT OF OPENING DOWNWARDS
-.. |frown|    unicode:: U+02322 .. FROWN
-.. |gap|      unicode:: U+02A86 .. GREATER-THAN OR APPROXIMATE
-.. |gE|       unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
-.. |gEl|      unicode:: U+02A8C .. GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
-.. |gel|      unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
-.. |ges|      unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
-.. |gescc|    unicode:: U+02AA9 .. GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
-.. |gesdot|   unicode:: U+02A80 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
-.. |gesdoto|  unicode:: U+02A82 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
-.. |gesdotol| unicode:: U+02A84 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
-.. |gesl|     unicode:: U+022DB U+0FE00 .. GREATER-THAN slanted EQUAL TO OR LESS-THAN
-.. |gesles|   unicode:: U+02A94 .. GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
-.. |Gg|       unicode:: U+022D9 .. VERY MUCH GREATER-THAN
-.. |gl|       unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
-.. |gla|      unicode:: U+02AA5 .. GREATER-THAN BESIDE LESS-THAN
-.. |glE|      unicode:: U+02A92 .. GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
-.. |glj|      unicode:: U+02AA4 .. GREATER-THAN OVERLAPPING LESS-THAN
-.. |gsdot|    unicode:: U+022D7 .. GREATER-THAN WITH DOT
-.. |gsim|     unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
-.. |gsime|    unicode:: U+02A8E .. GREATER-THAN ABOVE SIMILAR OR EQUAL
-.. |gsiml|    unicode:: U+02A90 .. GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
-.. |Gt|       unicode:: U+0226B .. MUCH GREATER-THAN
-.. |gtcc|     unicode:: U+02AA7 .. GREATER-THAN CLOSED BY CURVE
-.. |gtcir|    unicode:: U+02A7A .. GREATER-THAN WITH CIRCLE INSIDE
-.. |gtdot|    unicode:: U+022D7 .. GREATER-THAN WITH DOT
-.. |gtquest|  unicode:: U+02A7C .. GREATER-THAN WITH QUESTION MARK ABOVE
-.. |gtrarr|   unicode:: U+02978 .. GREATER-THAN ABOVE RIGHTWARDS ARROW
-.. |homtht|   unicode:: U+0223B .. HOMOTHETIC
-.. |lap|      unicode:: U+02A85 .. LESS-THAN OR APPROXIMATE
-.. |lat|      unicode:: U+02AAB .. LARGER THAN
-.. |late|     unicode:: U+02AAD .. LARGER THAN OR EQUAL TO
-.. |lates|    unicode:: U+02AAD U+0FE00 .. LARGER THAN OR slanted EQUAL
-.. |ldot|     unicode:: U+022D6 .. LESS-THAN WITH DOT
-.. |lE|       unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
-.. |lEg|      unicode:: U+02A8B .. LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
-.. |leg|      unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
-.. |les|      unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
-.. |lescc|    unicode:: U+02AA8 .. LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
-.. |lesdot|   unicode:: U+02A7F .. LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
-.. |lesdoto|  unicode:: U+02A81 .. LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
-.. |lesdotor| unicode:: U+02A83 .. LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
-.. |lesg|     unicode:: U+022DA U+0FE00 .. LESS-THAN slanted EQUAL TO OR GREATER-THAN
-.. |lesges|   unicode:: U+02A93 .. LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
-.. |lg|       unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
-.. |lgE|      unicode:: U+02A91 .. LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
-.. |Ll|       unicode:: U+022D8 .. VERY MUCH LESS-THAN
-.. |lsim|     unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
-.. |lsime|    unicode:: U+02A8D .. LESS-THAN ABOVE SIMILAR OR EQUAL
-.. |lsimg|    unicode:: U+02A8F .. LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
-.. |Lt|       unicode:: U+0226A .. MUCH LESS-THAN
-.. |ltcc|     unicode:: U+02AA6 .. LESS-THAN CLOSED BY CURVE
-.. |ltcir|    unicode:: U+02A79 .. LESS-THAN WITH CIRCLE INSIDE
-.. |ltdot|    unicode:: U+022D6 .. LESS-THAN WITH DOT
-.. |ltlarr|   unicode:: U+02976 .. LESS-THAN ABOVE LEFTWARDS ARROW
-.. |ltquest|  unicode:: U+02A7B .. LESS-THAN WITH QUESTION MARK ABOVE
-.. |ltrie|    unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
-.. |mcomma|   unicode:: U+02A29 .. MINUS SIGN WITH COMMA ABOVE
-.. |mDDot|    unicode:: U+0223A .. GEOMETRIC PROPORTION
-.. |mid|      unicode:: U+02223 .. DIVIDES
-.. |mlcp|     unicode:: U+02ADB .. TRANSVERSAL INTERSECTION
-.. |models|   unicode:: U+022A7 .. MODELS
-.. |mstpos|   unicode:: U+0223E .. INVERTED LAZY S
-.. |Pr|       unicode:: U+02ABB .. DOUBLE PRECEDES
-.. |pr|       unicode:: U+0227A .. PRECEDES
-.. |prap|     unicode:: U+02AB7 .. PRECEDES ABOVE ALMOST EQUAL TO
-.. |prcue|    unicode:: U+0227C .. PRECEDES OR EQUAL TO
-.. |prE|      unicode:: U+02AB3 .. PRECEDES ABOVE EQUALS SIGN
-.. |pre|      unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
-.. |prsim|    unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
-.. |prurel|   unicode:: U+022B0 .. PRECEDES UNDER RELATION
-.. |ratio|    unicode:: U+02236 .. RATIO
-.. |rtrie|    unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
-.. |rtriltri| unicode:: U+029CE .. RIGHT TRIANGLE ABOVE LEFT TRIANGLE
-.. |samalg|   unicode:: U+02210 .. N-ARY COPRODUCT
-.. |Sc|       unicode:: U+02ABC .. DOUBLE SUCCEEDS
-.. |sc|       unicode:: U+0227B .. SUCCEEDS
-.. |scap|     unicode:: U+02AB8 .. SUCCEEDS ABOVE ALMOST EQUAL TO
-.. |sccue|    unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
-.. |scE|      unicode:: U+02AB4 .. SUCCEEDS ABOVE EQUALS SIGN
-.. |sce|      unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
-.. |scsim|    unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
-.. |sdote|    unicode:: U+02A66 .. EQUALS SIGN WITH DOT BELOW
-.. |sfrown|   unicode:: U+02322 .. FROWN
-.. |simg|     unicode:: U+02A9E .. SIMILAR OR GREATER-THAN
-.. |simgE|    unicode:: U+02AA0 .. SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
-.. |siml|     unicode:: U+02A9D .. SIMILAR OR LESS-THAN
-.. |simlE|    unicode:: U+02A9F .. SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
-.. |smid|     unicode:: U+02223 .. DIVIDES
-.. |smile|    unicode:: U+02323 .. SMILE
-.. |smt|      unicode:: U+02AAA .. SMALLER THAN
-.. |smte|     unicode:: U+02AAC .. SMALLER THAN OR EQUAL TO
-.. |smtes|    unicode:: U+02AAC U+0FE00 .. SMALLER THAN OR slanted EQUAL
-.. |spar|     unicode:: U+02225 .. PARALLEL TO
-.. |sqsub|    unicode:: U+0228F .. SQUARE IMAGE OF
-.. |sqsube|   unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
-.. |sqsup|    unicode:: U+02290 .. SQUARE ORIGINAL OF
-.. |sqsupe|   unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
-.. |ssmile|   unicode:: U+02323 .. SMILE
-.. |Sub|      unicode:: U+022D0 .. DOUBLE SUBSET
-.. |subE|     unicode:: U+02AC5 .. SUBSET OF ABOVE EQUALS SIGN
-.. |subedot|  unicode:: U+02AC3 .. SUBSET OF OR EQUAL TO WITH DOT ABOVE
-.. |submult|  unicode:: U+02AC1 .. SUBSET WITH MULTIPLICATION SIGN BELOW
-.. |subplus|  unicode:: U+02ABF .. SUBSET WITH PLUS SIGN BELOW
-.. |subrarr|  unicode:: U+02979 .. SUBSET ABOVE RIGHTWARDS ARROW
-.. |subsim|   unicode:: U+02AC7 .. SUBSET OF ABOVE TILDE OPERATOR
-.. |subsub|   unicode:: U+02AD5 .. SUBSET ABOVE SUBSET
-.. |subsup|   unicode:: U+02AD3 .. SUBSET ABOVE SUPERSET
-.. |Sup|      unicode:: U+022D1 .. DOUBLE SUPERSET
-.. |supdsub|  unicode:: U+02AD8 .. SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
-.. |supE|     unicode:: U+02AC6 .. SUPERSET OF ABOVE EQUALS SIGN
-.. |supedot|  unicode:: U+02AC4 .. SUPERSET OF OR EQUAL TO WITH DOT ABOVE
-.. |suphsol|  unicode:: U+02283 U+0002F .. SUPERSET OF, SOLIDUS
-.. |suphsub|  unicode:: U+02AD7 .. SUPERSET BESIDE SUBSET
-.. |suplarr|  unicode:: U+0297B .. SUPERSET ABOVE LEFTWARDS ARROW
-.. |supmult|  unicode:: U+02AC2 .. SUPERSET WITH MULTIPLICATION SIGN BELOW
-.. |supplus|  unicode:: U+02AC0 .. SUPERSET WITH PLUS SIGN BELOW
-.. |supsim|   unicode:: U+02AC8 .. SUPERSET OF ABOVE TILDE OPERATOR
-.. |supsub|   unicode:: U+02AD4 .. SUPERSET ABOVE SUBSET
-.. |supsup|   unicode:: U+02AD6 .. SUPERSET ABOVE SUPERSET
-.. |thkap|    unicode:: U+02248 .. ALMOST EQUAL TO
-.. |thksim|   unicode:: U+0223C .. TILDE OPERATOR
-.. |topfork|  unicode:: U+02ADA .. PITCHFORK WITH TEE TOP
-.. |trie|     unicode:: U+0225C .. DELTA EQUAL TO
-.. |twixt|    unicode:: U+0226C .. BETWEEN
-.. |Vbar|     unicode:: U+02AEB .. DOUBLE UP TACK
-.. |vBar|     unicode:: U+02AE8 .. SHORT UP TACK WITH UNDERBAR
-.. |vBarv|    unicode:: U+02AE9 .. SHORT UP TACK ABOVE SHORT DOWN TACK
-.. |VDash|    unicode:: U+022AB .. DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
-.. |Vdash|    unicode:: U+022A9 .. FORCES
-.. |vDash|    unicode:: U+022A8 .. TRUE
-.. |vdash|    unicode:: U+022A2 .. RIGHT TACK
-.. |Vdashl|   unicode:: U+02AE6 .. LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
-.. |veebar|   unicode:: U+022BB .. XOR
-.. |vltri|    unicode:: U+022B2 .. NORMAL SUBGROUP OF
-.. |vprop|    unicode:: U+0221D .. PROPORTIONAL TO
-.. |vrtri|    unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
-.. |Vvdash|   unicode:: U+022AA .. TRIPLE VERTICAL BAR RIGHT TURNSTILE
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isobox.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |boxDL| unicode:: U+02557 .. BOX DRAWINGS DOUBLE DOWN AND LEFT
-.. |boxDl| unicode:: U+02556 .. BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
-.. |boxdL| unicode:: U+02555 .. BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
-.. |boxdl| unicode:: U+02510 .. BOX DRAWINGS LIGHT DOWN AND LEFT
-.. |boxDR| unicode:: U+02554 .. BOX DRAWINGS DOUBLE DOWN AND RIGHT
-.. |boxDr| unicode:: U+02553 .. BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
-.. |boxdR| unicode:: U+02552 .. BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
-.. |boxdr| unicode:: U+0250C .. BOX DRAWINGS LIGHT DOWN AND RIGHT
-.. |boxH|  unicode:: U+02550 .. BOX DRAWINGS DOUBLE HORIZONTAL
-.. |boxh|  unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
-.. |boxHD| unicode:: U+02566 .. BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
-.. |boxHd| unicode:: U+02564 .. BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
-.. |boxhD| unicode:: U+02565 .. BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
-.. |boxhd| unicode:: U+0252C .. BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
-.. |boxHU| unicode:: U+02569 .. BOX DRAWINGS DOUBLE UP AND HORIZONTAL
-.. |boxHu| unicode:: U+02567 .. BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
-.. |boxhU| unicode:: U+02568 .. BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
-.. |boxhu| unicode:: U+02534 .. BOX DRAWINGS LIGHT UP AND HORIZONTAL
-.. |boxUL| unicode:: U+0255D .. BOX DRAWINGS DOUBLE UP AND LEFT
-.. |boxUl| unicode:: U+0255C .. BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
-.. |boxuL| unicode:: U+0255B .. BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
-.. |boxul| unicode:: U+02518 .. BOX DRAWINGS LIGHT UP AND LEFT
-.. |boxUR| unicode:: U+0255A .. BOX DRAWINGS DOUBLE UP AND RIGHT
-.. |boxUr| unicode:: U+02559 .. BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
-.. |boxuR| unicode:: U+02558 .. BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
-.. |boxur| unicode:: U+02514 .. BOX DRAWINGS LIGHT UP AND RIGHT
-.. |boxV|  unicode:: U+02551 .. BOX DRAWINGS DOUBLE VERTICAL
-.. |boxv|  unicode:: U+02502 .. BOX DRAWINGS LIGHT VERTICAL
-.. |boxVH| unicode:: U+0256C .. BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
-.. |boxVh| unicode:: U+0256B .. BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
-.. |boxvH| unicode:: U+0256A .. BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
-.. |boxvh| unicode:: U+0253C .. BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
-.. |boxVL| unicode:: U+02563 .. BOX DRAWINGS DOUBLE VERTICAL AND LEFT
-.. |boxVl| unicode:: U+02562 .. BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
-.. |boxvL| unicode:: U+02561 .. BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
-.. |boxvl| unicode:: U+02524 .. BOX DRAWINGS LIGHT VERTICAL AND LEFT
-.. |boxVR| unicode:: U+02560 .. BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
-.. |boxVr| unicode:: U+0255F .. BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
-.. |boxvR| unicode:: U+0255E .. BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
-.. |boxvr| unicode:: U+0251C .. BOX DRAWINGS LIGHT VERTICAL AND RIGHT
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isocyr1.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |Acy|    unicode:: U+00410 .. CYRILLIC CAPITAL LETTER A
-.. |acy|    unicode:: U+00430 .. CYRILLIC SMALL LETTER A
-.. |Bcy|    unicode:: U+00411 .. CYRILLIC CAPITAL LETTER BE
-.. |bcy|    unicode:: U+00431 .. CYRILLIC SMALL LETTER BE
-.. |CHcy|   unicode:: U+00427 .. CYRILLIC CAPITAL LETTER CHE
-.. |chcy|   unicode:: U+00447 .. CYRILLIC SMALL LETTER CHE
-.. |Dcy|    unicode:: U+00414 .. CYRILLIC CAPITAL LETTER DE
-.. |dcy|    unicode:: U+00434 .. CYRILLIC SMALL LETTER DE
-.. |Ecy|    unicode:: U+0042D .. CYRILLIC CAPITAL LETTER E
-.. |ecy|    unicode:: U+0044D .. CYRILLIC SMALL LETTER E
-.. |Fcy|    unicode:: U+00424 .. CYRILLIC CAPITAL LETTER EF
-.. |fcy|    unicode:: U+00444 .. CYRILLIC SMALL LETTER EF
-.. |Gcy|    unicode:: U+00413 .. CYRILLIC CAPITAL LETTER GHE
-.. |gcy|    unicode:: U+00433 .. CYRILLIC SMALL LETTER GHE
-.. |HARDcy| unicode:: U+0042A .. CYRILLIC CAPITAL LETTER HARD SIGN
-.. |hardcy| unicode:: U+0044A .. CYRILLIC SMALL LETTER HARD SIGN
-.. |Icy|    unicode:: U+00418 .. CYRILLIC CAPITAL LETTER I
-.. |icy|    unicode:: U+00438 .. CYRILLIC SMALL LETTER I
-.. |IEcy|   unicode:: U+00415 .. CYRILLIC CAPITAL LETTER IE
-.. |iecy|   unicode:: U+00435 .. CYRILLIC SMALL LETTER IE
-.. |IOcy|   unicode:: U+00401 .. CYRILLIC CAPITAL LETTER IO
-.. |iocy|   unicode:: U+00451 .. CYRILLIC SMALL LETTER IO
-.. |Jcy|    unicode:: U+00419 .. CYRILLIC CAPITAL LETTER SHORT I
-.. |jcy|    unicode:: U+00439 .. CYRILLIC SMALL LETTER SHORT I
-.. |Kcy|    unicode:: U+0041A .. CYRILLIC CAPITAL LETTER KA
-.. |kcy|    unicode:: U+0043A .. CYRILLIC SMALL LETTER KA
-.. |KHcy|   unicode:: U+00425 .. CYRILLIC CAPITAL LETTER HA
-.. |khcy|   unicode:: U+00445 .. CYRILLIC SMALL LETTER HA
-.. |Lcy|    unicode:: U+0041B .. CYRILLIC CAPITAL LETTER EL
-.. |lcy|    unicode:: U+0043B .. CYRILLIC SMALL LETTER EL
-.. |Mcy|    unicode:: U+0041C .. CYRILLIC CAPITAL LETTER EM
-.. |mcy|    unicode:: U+0043C .. CYRILLIC SMALL LETTER EM
-.. |Ncy|    unicode:: U+0041D .. CYRILLIC CAPITAL LETTER EN
-.. |ncy|    unicode:: U+0043D .. CYRILLIC SMALL LETTER EN
-.. |numero| unicode:: U+02116 .. NUMERO SIGN
-.. |Ocy|    unicode:: U+0041E .. CYRILLIC CAPITAL LETTER O
-.. |ocy|    unicode:: U+0043E .. CYRILLIC SMALL LETTER O
-.. |Pcy|    unicode:: U+0041F .. CYRILLIC CAPITAL LETTER PE
-.. |pcy|    unicode:: U+0043F .. CYRILLIC SMALL LETTER PE
-.. |Rcy|    unicode:: U+00420 .. CYRILLIC CAPITAL LETTER ER
-.. |rcy|    unicode:: U+00440 .. CYRILLIC SMALL LETTER ER
-.. |Scy|    unicode:: U+00421 .. CYRILLIC CAPITAL LETTER ES
-.. |scy|    unicode:: U+00441 .. CYRILLIC SMALL LETTER ES
-.. |SHCHcy| unicode:: U+00429 .. CYRILLIC CAPITAL LETTER SHCHA
-.. |shchcy| unicode:: U+00449 .. CYRILLIC SMALL LETTER SHCHA
-.. |SHcy|   unicode:: U+00428 .. CYRILLIC CAPITAL LETTER SHA
-.. |shcy|   unicode:: U+00448 .. CYRILLIC SMALL LETTER SHA
-.. |SOFTcy| unicode:: U+0042C .. CYRILLIC CAPITAL LETTER SOFT SIGN
-.. |softcy| unicode:: U+0044C .. CYRILLIC SMALL LETTER SOFT SIGN
-.. |Tcy|    unicode:: U+00422 .. CYRILLIC CAPITAL LETTER TE
-.. |tcy|    unicode:: U+00442 .. CYRILLIC SMALL LETTER TE
-.. |TScy|   unicode:: U+00426 .. CYRILLIC CAPITAL LETTER TSE
-.. |tscy|   unicode:: U+00446 .. CYRILLIC SMALL LETTER TSE
-.. |Ucy|    unicode:: U+00423 .. CYRILLIC CAPITAL LETTER U
-.. |ucy|    unicode:: U+00443 .. CYRILLIC SMALL LETTER U
-.. |Vcy|    unicode:: U+00412 .. CYRILLIC CAPITAL LETTER VE
-.. |vcy|    unicode:: U+00432 .. CYRILLIC SMALL LETTER VE
-.. |YAcy|   unicode:: U+0042F .. CYRILLIC CAPITAL LETTER YA
-.. |yacy|   unicode:: U+0044F .. CYRILLIC SMALL LETTER YA
-.. |Ycy|    unicode:: U+0042B .. CYRILLIC CAPITAL LETTER YERU
-.. |ycy|    unicode:: U+0044B .. CYRILLIC SMALL LETTER YERU
-.. |YUcy|   unicode:: U+0042E .. CYRILLIC CAPITAL LETTER YU
-.. |yucy|   unicode:: U+0044E .. CYRILLIC SMALL LETTER YU
-.. |Zcy|    unicode:: U+00417 .. CYRILLIC CAPITAL LETTER ZE
-.. |zcy|    unicode:: U+00437 .. CYRILLIC SMALL LETTER ZE
-.. |ZHcy|   unicode:: U+00416 .. CYRILLIC CAPITAL LETTER ZHE
-.. |zhcy|   unicode:: U+00436 .. CYRILLIC SMALL LETTER ZHE
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isocyr2.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |DJcy|   unicode:: U+00402 .. CYRILLIC CAPITAL LETTER DJE
-.. |djcy|   unicode:: U+00452 .. CYRILLIC SMALL LETTER DJE
-.. |DScy|   unicode:: U+00405 .. CYRILLIC CAPITAL LETTER DZE
-.. |dscy|   unicode:: U+00455 .. CYRILLIC SMALL LETTER DZE
-.. |DZcy|   unicode:: U+0040F .. CYRILLIC CAPITAL LETTER DZHE
-.. |dzcy|   unicode:: U+0045F .. CYRILLIC SMALL LETTER DZHE
-.. |GJcy|   unicode:: U+00403 .. CYRILLIC CAPITAL LETTER GJE
-.. |gjcy|   unicode:: U+00453 .. CYRILLIC SMALL LETTER GJE
-.. |Iukcy|  unicode:: U+00406 .. CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
-.. |iukcy|  unicode:: U+00456 .. CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
-.. |Jsercy| unicode:: U+00408 .. CYRILLIC CAPITAL LETTER JE
-.. |jsercy| unicode:: U+00458 .. CYRILLIC SMALL LETTER JE
-.. |Jukcy|  unicode:: U+00404 .. CYRILLIC CAPITAL LETTER UKRAINIAN IE
-.. |jukcy|  unicode:: U+00454 .. CYRILLIC SMALL LETTER UKRAINIAN IE
-.. |KJcy|   unicode:: U+0040C .. CYRILLIC CAPITAL LETTER KJE
-.. |kjcy|   unicode:: U+0045C .. CYRILLIC SMALL LETTER KJE
-.. |LJcy|   unicode:: U+00409 .. CYRILLIC CAPITAL LETTER LJE
-.. |ljcy|   unicode:: U+00459 .. CYRILLIC SMALL LETTER LJE
-.. |NJcy|   unicode:: U+0040A .. CYRILLIC CAPITAL LETTER NJE
-.. |njcy|   unicode:: U+0045A .. CYRILLIC SMALL LETTER NJE
-.. |TSHcy|  unicode:: U+0040B .. CYRILLIC CAPITAL LETTER TSHE
-.. |tshcy|  unicode:: U+0045B .. CYRILLIC SMALL LETTER TSHE
-.. |Ubrcy|  unicode:: U+0040E .. CYRILLIC CAPITAL LETTER SHORT U
-.. |ubrcy|  unicode:: U+0045E .. CYRILLIC SMALL LETTER SHORT U
-.. |YIcy|   unicode:: U+00407 .. CYRILLIC CAPITAL LETTER YI
-.. |yicy|   unicode:: U+00457 .. CYRILLIC SMALL LETTER YI
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isodia.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |acute| unicode:: U+000B4 .. ACUTE ACCENT
-.. |breve| unicode:: U+002D8 .. BREVE
-.. |caron| unicode:: U+002C7 .. CARON
-.. |cedil| unicode:: U+000B8 .. CEDILLA
-.. |circ|  unicode:: U+002C6 .. MODIFIER LETTER CIRCUMFLEX ACCENT
-.. |dblac| unicode:: U+002DD .. DOUBLE ACUTE ACCENT
-.. |die|   unicode:: U+000A8 .. DIAERESIS
-.. |dot|   unicode:: U+002D9 .. DOT ABOVE
-.. |grave| unicode:: U+00060 .. GRAVE ACCENT
-.. |macr|  unicode:: U+000AF .. MACRON
-.. |ogon|  unicode:: U+002DB .. OGONEK
-.. |ring|  unicode:: U+002DA .. RING ABOVE
-.. |tilde| unicode:: U+002DC .. SMALL TILDE
-.. |uml|   unicode:: U+000A8 .. DIAERESIS
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk1.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |Agr|  unicode:: U+00391 .. GREEK CAPITAL LETTER ALPHA
-.. |agr|  unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
-.. |Bgr|  unicode:: U+00392 .. GREEK CAPITAL LETTER BETA
-.. |bgr|  unicode:: U+003B2 .. GREEK SMALL LETTER BETA
-.. |Dgr|  unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
-.. |dgr|  unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
-.. |EEgr| unicode:: U+00397 .. GREEK CAPITAL LETTER ETA
-.. |eegr| unicode:: U+003B7 .. GREEK SMALL LETTER ETA
-.. |Egr|  unicode:: U+00395 .. GREEK CAPITAL LETTER EPSILON
-.. |egr|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
-.. |Ggr|  unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
-.. |ggr|  unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
-.. |Igr|  unicode:: U+00399 .. GREEK CAPITAL LETTER IOTA
-.. |igr|  unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
-.. |Kgr|  unicode:: U+0039A .. GREEK CAPITAL LETTER KAPPA
-.. |kgr|  unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
-.. |KHgr| unicode:: U+003A7 .. GREEK CAPITAL LETTER CHI
-.. |khgr| unicode:: U+003C7 .. GREEK SMALL LETTER CHI
-.. |Lgr|  unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
-.. |lgr|  unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
-.. |Mgr|  unicode:: U+0039C .. GREEK CAPITAL LETTER MU
-.. |mgr|  unicode:: U+003BC .. GREEK SMALL LETTER MU
-.. |Ngr|  unicode:: U+0039D .. GREEK CAPITAL LETTER NU
-.. |ngr|  unicode:: U+003BD .. GREEK SMALL LETTER NU
-.. |Ogr|  unicode:: U+0039F .. GREEK CAPITAL LETTER OMICRON
-.. |ogr|  unicode:: U+003BF .. GREEK SMALL LETTER OMICRON
-.. |OHgr| unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
-.. |ohgr| unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
-.. |Pgr|  unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
-.. |pgr|  unicode:: U+003C0 .. GREEK SMALL LETTER PI
-.. |PHgr| unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
-.. |phgr| unicode:: U+003C6 .. GREEK SMALL LETTER PHI
-.. |PSgr| unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
-.. |psgr| unicode:: U+003C8 .. GREEK SMALL LETTER PSI
-.. |Rgr|  unicode:: U+003A1 .. GREEK CAPITAL LETTER RHO
-.. |rgr|  unicode:: U+003C1 .. GREEK SMALL LETTER RHO
-.. |sfgr| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
-.. |Sgr|  unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
-.. |sgr|  unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
-.. |Tgr|  unicode:: U+003A4 .. GREEK CAPITAL LETTER TAU
-.. |tgr|  unicode:: U+003C4 .. GREEK SMALL LETTER TAU
-.. |THgr| unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
-.. |thgr| unicode:: U+003B8 .. GREEK SMALL LETTER THETA
-.. |Ugr|  unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
-.. |ugr|  unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
-.. |Xgr|  unicode:: U+0039E .. GREEK CAPITAL LETTER XI
-.. |xgr|  unicode:: U+003BE .. GREEK SMALL LETTER XI
-.. |Zgr|  unicode:: U+00396 .. GREEK CAPITAL LETTER ZETA
-.. |zgr|  unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk2.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |Aacgr|  unicode:: U+00386 .. GREEK CAPITAL LETTER ALPHA WITH TONOS
-.. |aacgr|  unicode:: U+003AC .. GREEK SMALL LETTER ALPHA WITH TONOS
-.. |Eacgr|  unicode:: U+00388 .. GREEK CAPITAL LETTER EPSILON WITH TONOS
-.. |eacgr|  unicode:: U+003AD .. GREEK SMALL LETTER EPSILON WITH TONOS
-.. |EEacgr| unicode:: U+00389 .. GREEK CAPITAL LETTER ETA WITH TONOS
-.. |eeacgr| unicode:: U+003AE .. GREEK SMALL LETTER ETA WITH TONOS
-.. |Iacgr|  unicode:: U+0038A .. GREEK CAPITAL LETTER IOTA WITH TONOS
-.. |iacgr|  unicode:: U+003AF .. GREEK SMALL LETTER IOTA WITH TONOS
-.. |idiagr| unicode:: U+00390 .. GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
-.. |Idigr|  unicode:: U+003AA .. GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
-.. |idigr|  unicode:: U+003CA .. GREEK SMALL LETTER IOTA WITH DIALYTIKA
-.. |Oacgr|  unicode:: U+0038C .. GREEK CAPITAL LETTER OMICRON WITH TONOS
-.. |oacgr|  unicode:: U+003CC .. GREEK SMALL LETTER OMICRON WITH TONOS
-.. |OHacgr| unicode:: U+0038F .. GREEK CAPITAL LETTER OMEGA WITH TONOS
-.. |ohacgr| unicode:: U+003CE .. GREEK SMALL LETTER OMEGA WITH TONOS
-.. |Uacgr|  unicode:: U+0038E .. GREEK CAPITAL LETTER UPSILON WITH TONOS
-.. |uacgr|  unicode:: U+003CD .. GREEK SMALL LETTER UPSILON WITH TONOS
-.. |udiagr| unicode:: U+003B0 .. GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
-.. |Udigr|  unicode:: U+003AB .. GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
-.. |udigr|  unicode:: U+003CB .. GREEK SMALL LETTER UPSILON WITH DIALYTIKA
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk3.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |alpha|  unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
-.. |beta|   unicode:: U+003B2 .. GREEK SMALL LETTER BETA
-.. |chi|    unicode:: U+003C7 .. GREEK SMALL LETTER CHI
-.. |Delta|  unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
-.. |delta|  unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
-.. |epsi|   unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
-.. |epsis|  unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
-.. |epsiv|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
-.. |eta|    unicode:: U+003B7 .. GREEK SMALL LETTER ETA
-.. |Gamma|  unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
-.. |gamma|  unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
-.. |Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
-.. |gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
-.. |iota|   unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
-.. |kappa|  unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
-.. |kappav| unicode:: U+003F0 .. GREEK KAPPA SYMBOL
-.. |Lambda| unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
-.. |lambda| unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
-.. |mu|     unicode:: U+003BC .. GREEK SMALL LETTER MU
-.. |nu|     unicode:: U+003BD .. GREEK SMALL LETTER NU
-.. |Omega|  unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
-.. |omega|  unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
-.. |Phi|    unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
-.. |phi|    unicode:: U+003D5 .. GREEK PHI SYMBOL
-.. |phis|   unicode:: U+003D5 .. GREEK PHI SYMBOL
-.. |phiv|   unicode:: U+003C6 .. GREEK SMALL LETTER PHI
-.. |Pi|     unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
-.. |pi|     unicode:: U+003C0 .. GREEK SMALL LETTER PI
-.. |piv|    unicode:: U+003D6 .. GREEK PI SYMBOL
-.. |Psi|    unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
-.. |psi|    unicode:: U+003C8 .. GREEK SMALL LETTER PSI
-.. |rho|    unicode:: U+003C1 .. GREEK SMALL LETTER RHO
-.. |rhov|   unicode:: U+003F1 .. GREEK RHO SYMBOL
-.. |Sigma|  unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
-.. |sigma|  unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
-.. |sigmav| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
-.. |tau|    unicode:: U+003C4 .. GREEK SMALL LETTER TAU
-.. |Theta|  unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
-.. |theta|  unicode:: U+003B8 .. GREEK SMALL LETTER THETA
-.. |thetas| unicode:: U+003B8 .. GREEK SMALL LETTER THETA
-.. |thetav| unicode:: U+003D1 .. GREEK THETA SYMBOL
-.. |Upsi|   unicode:: U+003D2 .. GREEK UPSILON WITH HOOK SYMBOL
-.. |upsi|   unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
-.. |Xi|     unicode:: U+0039E .. GREEK CAPITAL LETTER XI
-.. |xi|     unicode:: U+003BE .. GREEK SMALL LETTER XI
-.. |zeta|   unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk4-wide.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |b.alpha|  unicode:: U+1D6C2 .. MATHEMATICAL BOLD SMALL ALPHA
-.. |b.beta|   unicode:: U+1D6C3 .. MATHEMATICAL BOLD SMALL BETA
-.. |b.chi|    unicode:: U+1D6D8 .. MATHEMATICAL BOLD SMALL CHI
-.. |b.Delta|  unicode:: U+1D6AB .. MATHEMATICAL BOLD CAPITAL DELTA
-.. |b.delta|  unicode:: U+1D6C5 .. MATHEMATICAL BOLD SMALL DELTA
-.. |b.epsi|   unicode:: U+1D6C6 .. MATHEMATICAL BOLD SMALL EPSILON
-.. |b.epsiv|  unicode:: U+1D6DC .. MATHEMATICAL BOLD EPSILON SYMBOL
-.. |b.eta|    unicode:: U+1D6C8 .. MATHEMATICAL BOLD SMALL ETA
-.. |b.Gamma|  unicode:: U+1D6AA .. MATHEMATICAL BOLD CAPITAL GAMMA
-.. |b.gamma|  unicode:: U+1D6C4 .. MATHEMATICAL BOLD SMALL GAMMA
-.. |b.Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
-.. |b.gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
-.. |b.iota|   unicode:: U+1D6CA .. MATHEMATICAL BOLD SMALL IOTA
-.. |b.kappa|  unicode:: U+1D6CB .. MATHEMATICAL BOLD SMALL KAPPA
-.. |b.kappav| unicode:: U+1D6DE .. MATHEMATICAL BOLD KAPPA SYMBOL
-.. |b.Lambda| unicode:: U+1D6B2 .. MATHEMATICAL BOLD CAPITAL LAMDA
-.. |b.lambda| unicode:: U+1D6CC .. MATHEMATICAL BOLD SMALL LAMDA
-.. |b.mu|     unicode:: U+1D6CD .. MATHEMATICAL BOLD SMALL MU
-.. |b.nu|     unicode:: U+1D6CE .. MATHEMATICAL BOLD SMALL NU
-.. |b.Omega|  unicode:: U+1D6C0 .. MATHEMATICAL BOLD CAPITAL OMEGA
-.. |b.omega|  unicode:: U+1D6DA .. MATHEMATICAL BOLD SMALL OMEGA
-.. |b.Phi|    unicode:: U+1D6BD .. MATHEMATICAL BOLD CAPITAL PHI
-.. |b.phi|    unicode:: U+1D6D7 .. MATHEMATICAL BOLD SMALL PHI
-.. |b.phiv|   unicode:: U+1D6DF .. MATHEMATICAL BOLD PHI SYMBOL
-.. |b.Pi|     unicode:: U+1D6B7 .. MATHEMATICAL BOLD CAPITAL PI
-.. |b.pi|     unicode:: U+1D6D1 .. MATHEMATICAL BOLD SMALL PI
-.. |b.piv|    unicode:: U+1D6E1 .. MATHEMATICAL BOLD PI SYMBOL
-.. |b.Psi|    unicode:: U+1D6BF .. MATHEMATICAL BOLD CAPITAL PSI
-.. |b.psi|    unicode:: U+1D6D9 .. MATHEMATICAL BOLD SMALL PSI
-.. |b.rho|    unicode:: U+1D6D2 .. MATHEMATICAL BOLD SMALL RHO
-.. |b.rhov|   unicode:: U+1D6E0 .. MATHEMATICAL BOLD RHO SYMBOL
-.. |b.Sigma|  unicode:: U+1D6BA .. MATHEMATICAL BOLD CAPITAL SIGMA
-.. |b.sigma|  unicode:: U+1D6D4 .. MATHEMATICAL BOLD SMALL SIGMA
-.. |b.sigmav| unicode:: U+1D6D3 .. MATHEMATICAL BOLD SMALL FINAL SIGMA
-.. |b.tau|    unicode:: U+1D6D5 .. MATHEMATICAL BOLD SMALL TAU
-.. |b.Theta|  unicode:: U+1D6AF .. MATHEMATICAL BOLD CAPITAL THETA
-.. |b.thetas| unicode:: U+1D6C9 .. MATHEMATICAL BOLD SMALL THETA
-.. |b.thetav| unicode:: U+1D6DD .. MATHEMATICAL BOLD THETA SYMBOL
-.. |b.Upsi|   unicode:: U+1D6BC .. MATHEMATICAL BOLD CAPITAL UPSILON
-.. |b.upsi|   unicode:: U+1D6D6 .. MATHEMATICAL BOLD SMALL UPSILON
-.. |b.Xi|     unicode:: U+1D6B5 .. MATHEMATICAL BOLD CAPITAL XI
-.. |b.xi|     unicode:: U+1D6CF .. MATHEMATICAL BOLD SMALL XI
-.. |b.zeta|   unicode:: U+1D6C7 .. MATHEMATICAL BOLD SMALL ZETA
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk4.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |b.Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
-.. |b.gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isolat1.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |Aacute| unicode:: U+000C1 .. LATIN CAPITAL LETTER A WITH ACUTE
-.. |aacute| unicode:: U+000E1 .. LATIN SMALL LETTER A WITH ACUTE
-.. |Acirc|  unicode:: U+000C2 .. LATIN CAPITAL LETTER A WITH CIRCUMFLEX
-.. |acirc|  unicode:: U+000E2 .. LATIN SMALL LETTER A WITH CIRCUMFLEX
-.. |AElig|  unicode:: U+000C6 .. LATIN CAPITAL LETTER AE
-.. |aelig|  unicode:: U+000E6 .. LATIN SMALL LETTER AE
-.. |Agrave| unicode:: U+000C0 .. LATIN CAPITAL LETTER A WITH GRAVE
-.. |agrave| unicode:: U+000E0 .. LATIN SMALL LETTER A WITH GRAVE
-.. |Aring|  unicode:: U+000C5 .. LATIN CAPITAL LETTER A WITH RING ABOVE
-.. |aring|  unicode:: U+000E5 .. LATIN SMALL LETTER A WITH RING ABOVE
-.. |Atilde| unicode:: U+000C3 .. LATIN CAPITAL LETTER A WITH TILDE
-.. |atilde| unicode:: U+000E3 .. LATIN SMALL LETTER A WITH TILDE
-.. |Auml|   unicode:: U+000C4 .. LATIN CAPITAL LETTER A WITH DIAERESIS
-.. |auml|   unicode:: U+000E4 .. LATIN SMALL LETTER A WITH DIAERESIS
-.. |Ccedil| unicode:: U+000C7 .. LATIN CAPITAL LETTER C WITH CEDILLA
-.. |ccedil| unicode:: U+000E7 .. LATIN SMALL LETTER C WITH CEDILLA
-.. |Eacute| unicode:: U+000C9 .. LATIN CAPITAL LETTER E WITH ACUTE
-.. |eacute| unicode:: U+000E9 .. LATIN SMALL LETTER E WITH ACUTE
-.. |Ecirc|  unicode:: U+000CA .. LATIN CAPITAL LETTER E WITH CIRCUMFLEX
-.. |ecirc|  unicode:: U+000EA .. LATIN SMALL LETTER E WITH CIRCUMFLEX
-.. |Egrave| unicode:: U+000C8 .. LATIN CAPITAL LETTER E WITH GRAVE
-.. |egrave| unicode:: U+000E8 .. LATIN SMALL LETTER E WITH GRAVE
-.. |ETH|    unicode:: U+000D0 .. LATIN CAPITAL LETTER ETH
-.. |eth|    unicode:: U+000F0 .. LATIN SMALL LETTER ETH
-.. |Euml|   unicode:: U+000CB .. LATIN CAPITAL LETTER E WITH DIAERESIS
-.. |euml|   unicode:: U+000EB .. LATIN SMALL LETTER E WITH DIAERESIS
-.. |Iacute| unicode:: U+000CD .. LATIN CAPITAL LETTER I WITH ACUTE
-.. |iacute| unicode:: U+000ED .. LATIN SMALL LETTER I WITH ACUTE
-.. |Icirc|  unicode:: U+000CE .. LATIN CAPITAL LETTER I WITH CIRCUMFLEX
-.. |icirc|  unicode:: U+000EE .. LATIN SMALL LETTER I WITH CIRCUMFLEX
-.. |Igrave| unicode:: U+000CC .. LATIN CAPITAL LETTER I WITH GRAVE
-.. |igrave| unicode:: U+000EC .. LATIN SMALL LETTER I WITH GRAVE
-.. |Iuml|   unicode:: U+000CF .. LATIN CAPITAL LETTER I WITH DIAERESIS
-.. |iuml|   unicode:: U+000EF .. LATIN SMALL LETTER I WITH DIAERESIS
-.. |Ntilde| unicode:: U+000D1 .. LATIN CAPITAL LETTER N WITH TILDE
-.. |ntilde| unicode:: U+000F1 .. LATIN SMALL LETTER N WITH TILDE
-.. |Oacute| unicode:: U+000D3 .. LATIN CAPITAL LETTER O WITH ACUTE
-.. |oacute| unicode:: U+000F3 .. LATIN SMALL LETTER O WITH ACUTE
-.. |Ocirc|  unicode:: U+000D4 .. LATIN CAPITAL LETTER O WITH CIRCUMFLEX
-.. |ocirc|  unicode:: U+000F4 .. LATIN SMALL LETTER O WITH CIRCUMFLEX
-.. |Ograve| unicode:: U+000D2 .. LATIN CAPITAL LETTER O WITH GRAVE
-.. |ograve| unicode:: U+000F2 .. LATIN SMALL LETTER O WITH GRAVE
-.. |Oslash| unicode:: U+000D8 .. LATIN CAPITAL LETTER O WITH STROKE
-.. |oslash| unicode:: U+000F8 .. LATIN SMALL LETTER O WITH STROKE
-.. |Otilde| unicode:: U+000D5 .. LATIN CAPITAL LETTER O WITH TILDE
-.. |otilde| unicode:: U+000F5 .. LATIN SMALL LETTER O WITH TILDE
-.. |Ouml|   unicode:: U+000D6 .. LATIN CAPITAL LETTER O WITH DIAERESIS
-.. |ouml|   unicode:: U+000F6 .. LATIN SMALL LETTER O WITH DIAERESIS
-.. |szlig|  unicode:: U+000DF .. LATIN SMALL LETTER SHARP S
-.. |THORN|  unicode:: U+000DE .. LATIN CAPITAL LETTER THORN
-.. |thorn|  unicode:: U+000FE .. LATIN SMALL LETTER THORN
-.. |Uacute| unicode:: U+000DA .. LATIN CAPITAL LETTER U WITH ACUTE
-.. |uacute| unicode:: U+000FA .. LATIN SMALL LETTER U WITH ACUTE
-.. |Ucirc|  unicode:: U+000DB .. LATIN CAPITAL LETTER U WITH CIRCUMFLEX
-.. |ucirc|  unicode:: U+000FB .. LATIN SMALL LETTER U WITH CIRCUMFLEX
-.. |Ugrave| unicode:: U+000D9 .. LATIN CAPITAL LETTER U WITH GRAVE
-.. |ugrave| unicode:: U+000F9 .. LATIN SMALL LETTER U WITH GRAVE
-.. |Uuml|   unicode:: U+000DC .. LATIN CAPITAL LETTER U WITH DIAERESIS
-.. |uuml|   unicode:: U+000FC .. LATIN SMALL LETTER U WITH DIAERESIS
-.. |Yacute| unicode:: U+000DD .. LATIN CAPITAL LETTER Y WITH ACUTE
-.. |yacute| unicode:: U+000FD .. LATIN SMALL LETTER Y WITH ACUTE
-.. |yuml|   unicode:: U+000FF .. LATIN SMALL LETTER Y WITH DIAERESIS
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isolat2.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,128 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |Abreve| unicode:: U+00102 .. LATIN CAPITAL LETTER A WITH BREVE
-.. |abreve| unicode:: U+00103 .. LATIN SMALL LETTER A WITH BREVE
-.. |Amacr|  unicode:: U+00100 .. LATIN CAPITAL LETTER A WITH MACRON
-.. |amacr|  unicode:: U+00101 .. LATIN SMALL LETTER A WITH MACRON
-.. |Aogon|  unicode:: U+00104 .. LATIN CAPITAL LETTER A WITH OGONEK
-.. |aogon|  unicode:: U+00105 .. LATIN SMALL LETTER A WITH OGONEK
-.. |Cacute| unicode:: U+00106 .. LATIN CAPITAL LETTER C WITH ACUTE
-.. |cacute| unicode:: U+00107 .. LATIN SMALL LETTER C WITH ACUTE
-.. |Ccaron| unicode:: U+0010C .. LATIN CAPITAL LETTER C WITH CARON
-.. |ccaron| unicode:: U+0010D .. LATIN SMALL LETTER C WITH CARON
-.. |Ccirc|  unicode:: U+00108 .. LATIN CAPITAL LETTER C WITH CIRCUMFLEX
-.. |ccirc|  unicode:: U+00109 .. LATIN SMALL LETTER C WITH CIRCUMFLEX
-.. |Cdot|   unicode:: U+0010A .. LATIN CAPITAL LETTER C WITH DOT ABOVE
-.. |cdot|   unicode:: U+0010B .. LATIN SMALL LETTER C WITH DOT ABOVE
-.. |Dcaron| unicode:: U+0010E .. LATIN CAPITAL LETTER D WITH CARON
-.. |dcaron| unicode:: U+0010F .. LATIN SMALL LETTER D WITH CARON
-.. |Dstrok| unicode:: U+00110 .. LATIN CAPITAL LETTER D WITH STROKE
-.. |dstrok| unicode:: U+00111 .. LATIN SMALL LETTER D WITH STROKE
-.. |Ecaron| unicode:: U+0011A .. LATIN CAPITAL LETTER E WITH CARON
-.. |ecaron| unicode:: U+0011B .. LATIN SMALL LETTER E WITH CARON
-.. |Edot|   unicode:: U+00116 .. LATIN CAPITAL LETTER E WITH DOT ABOVE
-.. |edot|   unicode:: U+00117 .. LATIN SMALL LETTER E WITH DOT ABOVE
-.. |Emacr|  unicode:: U+00112 .. LATIN CAPITAL LETTER E WITH MACRON
-.. |emacr|  unicode:: U+00113 .. LATIN SMALL LETTER E WITH MACRON
-.. |ENG|    unicode:: U+0014A .. LATIN CAPITAL LETTER ENG
-.. |eng|    unicode:: U+0014B .. LATIN SMALL LETTER ENG
-.. |Eogon|  unicode:: U+00118 .. LATIN CAPITAL LETTER E WITH OGONEK
-.. |eogon|  unicode:: U+00119 .. LATIN SMALL LETTER E WITH OGONEK
-.. |gacute| unicode:: U+001F5 .. LATIN SMALL LETTER G WITH ACUTE
-.. |Gbreve| unicode:: U+0011E .. LATIN CAPITAL LETTER G WITH BREVE
-.. |gbreve| unicode:: U+0011F .. LATIN SMALL LETTER G WITH BREVE
-.. |Gcedil| unicode:: U+00122 .. LATIN CAPITAL LETTER G WITH CEDILLA
-.. |gcedil| unicode:: U+00123 .. LATIN SMALL LETTER G WITH CEDILLA
-.. |Gcirc|  unicode:: U+0011C .. LATIN CAPITAL LETTER G WITH CIRCUMFLEX
-.. |gcirc|  unicode:: U+0011D .. LATIN SMALL LETTER G WITH CIRCUMFLEX
-.. |Gdot|   unicode:: U+00120 .. LATIN CAPITAL LETTER G WITH DOT ABOVE
-.. |gdot|   unicode:: U+00121 .. LATIN SMALL LETTER G WITH DOT ABOVE
-.. |Hcirc|  unicode:: U+00124 .. LATIN CAPITAL LETTER H WITH CIRCUMFLEX
-.. |hcirc|  unicode:: U+00125 .. LATIN SMALL LETTER H WITH CIRCUMFLEX
-.. |Hstrok| unicode:: U+00126 .. LATIN CAPITAL LETTER H WITH STROKE
-.. |hstrok| unicode:: U+00127 .. LATIN SMALL LETTER H WITH STROKE
-.. |Idot|   unicode:: U+00130 .. LATIN CAPITAL LETTER I WITH DOT ABOVE
-.. |IJlig|  unicode:: U+00132 .. LATIN CAPITAL LIGATURE IJ
-.. |ijlig|  unicode:: U+00133 .. LATIN SMALL LIGATURE IJ
-.. |Imacr|  unicode:: U+0012A .. LATIN CAPITAL LETTER I WITH MACRON
-.. |imacr|  unicode:: U+0012B .. LATIN SMALL LETTER I WITH MACRON
-.. |inodot| unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
-.. |Iogon|  unicode:: U+0012E .. LATIN CAPITAL LETTER I WITH OGONEK
-.. |iogon|  unicode:: U+0012F .. LATIN SMALL LETTER I WITH OGONEK
-.. |Itilde| unicode:: U+00128 .. LATIN CAPITAL LETTER I WITH TILDE
-.. |itilde| unicode:: U+00129 .. LATIN SMALL LETTER I WITH TILDE
-.. |Jcirc|  unicode:: U+00134 .. LATIN CAPITAL LETTER J WITH CIRCUMFLEX
-.. |jcirc|  unicode:: U+00135 .. LATIN SMALL LETTER J WITH CIRCUMFLEX
-.. |Kcedil| unicode:: U+00136 .. LATIN CAPITAL LETTER K WITH CEDILLA
-.. |kcedil| unicode:: U+00137 .. LATIN SMALL LETTER K WITH CEDILLA
-.. |kgreen| unicode:: U+00138 .. LATIN SMALL LETTER KRA
-.. |Lacute| unicode:: U+00139 .. LATIN CAPITAL LETTER L WITH ACUTE
-.. |lacute| unicode:: U+0013A .. LATIN SMALL LETTER L WITH ACUTE
-.. |Lcaron| unicode:: U+0013D .. LATIN CAPITAL LETTER L WITH CARON
-.. |lcaron| unicode:: U+0013E .. LATIN SMALL LETTER L WITH CARON
-.. |Lcedil| unicode:: U+0013B .. LATIN CAPITAL LETTER L WITH CEDILLA
-.. |lcedil| unicode:: U+0013C .. LATIN SMALL LETTER L WITH CEDILLA
-.. |Lmidot| unicode:: U+0013F .. LATIN CAPITAL LETTER L WITH MIDDLE DOT
-.. |lmidot| unicode:: U+00140 .. LATIN SMALL LETTER L WITH MIDDLE DOT
-.. |Lstrok| unicode:: U+00141 .. LATIN CAPITAL LETTER L WITH STROKE
-.. |lstrok| unicode:: U+00142 .. LATIN SMALL LETTER L WITH STROKE
-.. |Nacute| unicode:: U+00143 .. LATIN CAPITAL LETTER N WITH ACUTE
-.. |nacute| unicode:: U+00144 .. LATIN SMALL LETTER N WITH ACUTE
-.. |napos|  unicode:: U+00149 .. LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
-.. |Ncaron| unicode:: U+00147 .. LATIN CAPITAL LETTER N WITH CARON
-.. |ncaron| unicode:: U+00148 .. LATIN SMALL LETTER N WITH CARON
-.. |Ncedil| unicode:: U+00145 .. LATIN CAPITAL LETTER N WITH CEDILLA
-.. |ncedil| unicode:: U+00146 .. LATIN SMALL LETTER N WITH CEDILLA
-.. |Odblac| unicode:: U+00150 .. LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
-.. |odblac| unicode:: U+00151 .. LATIN SMALL LETTER O WITH DOUBLE ACUTE
-.. |OElig|  unicode:: U+00152 .. LATIN CAPITAL LIGATURE OE
-.. |oelig|  unicode:: U+00153 .. LATIN SMALL LIGATURE OE
-.. |Omacr|  unicode:: U+0014C .. LATIN CAPITAL LETTER O WITH MACRON
-.. |omacr|  unicode:: U+0014D .. LATIN SMALL LETTER O WITH MACRON
-.. |Racute| unicode:: U+00154 .. LATIN CAPITAL LETTER R WITH ACUTE
-.. |racute| unicode:: U+00155 .. LATIN SMALL LETTER R WITH ACUTE
-.. |Rcaron| unicode:: U+00158 .. LATIN CAPITAL LETTER R WITH CARON
-.. |rcaron| unicode:: U+00159 .. LATIN SMALL LETTER R WITH CARON
-.. |Rcedil| unicode:: U+00156 .. LATIN CAPITAL LETTER R WITH CEDILLA
-.. |rcedil| unicode:: U+00157 .. LATIN SMALL LETTER R WITH CEDILLA
-.. |Sacute| unicode:: U+0015A .. LATIN CAPITAL LETTER S WITH ACUTE
-.. |sacute| unicode:: U+0015B .. LATIN SMALL LETTER S WITH ACUTE
-.. |Scaron| unicode:: U+00160 .. LATIN CAPITAL LETTER S WITH CARON
-.. |scaron| unicode:: U+00161 .. LATIN SMALL LETTER S WITH CARON
-.. |Scedil| unicode:: U+0015E .. LATIN CAPITAL LETTER S WITH CEDILLA
-.. |scedil| unicode:: U+0015F .. LATIN SMALL LETTER S WITH CEDILLA
-.. |Scirc|  unicode:: U+0015C .. LATIN CAPITAL LETTER S WITH CIRCUMFLEX
-.. |scirc|  unicode:: U+0015D .. LATIN SMALL LETTER S WITH CIRCUMFLEX
-.. |Tcaron| unicode:: U+00164 .. LATIN CAPITAL LETTER T WITH CARON
-.. |tcaron| unicode:: U+00165 .. LATIN SMALL LETTER T WITH CARON
-.. |Tcedil| unicode:: U+00162 .. LATIN CAPITAL LETTER T WITH CEDILLA
-.. |tcedil| unicode:: U+00163 .. LATIN SMALL LETTER T WITH CEDILLA
-.. |Tstrok| unicode:: U+00166 .. LATIN CAPITAL LETTER T WITH STROKE
-.. |tstrok| unicode:: U+00167 .. LATIN SMALL LETTER T WITH STROKE
-.. |Ubreve| unicode:: U+0016C .. LATIN CAPITAL LETTER U WITH BREVE
-.. |ubreve| unicode:: U+0016D .. LATIN SMALL LETTER U WITH BREVE
-.. |Udblac| unicode:: U+00170 .. LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
-.. |udblac| unicode:: U+00171 .. LATIN SMALL LETTER U WITH DOUBLE ACUTE
-.. |Umacr|  unicode:: U+0016A .. LATIN CAPITAL LETTER U WITH MACRON
-.. |umacr|  unicode:: U+0016B .. LATIN SMALL LETTER U WITH MACRON
-.. |Uogon|  unicode:: U+00172 .. LATIN CAPITAL LETTER U WITH OGONEK
-.. |uogon|  unicode:: U+00173 .. LATIN SMALL LETTER U WITH OGONEK
-.. |Uring|  unicode:: U+0016E .. LATIN CAPITAL LETTER U WITH RING ABOVE
-.. |uring|  unicode:: U+0016F .. LATIN SMALL LETTER U WITH RING ABOVE
-.. |Utilde| unicode:: U+00168 .. LATIN CAPITAL LETTER U WITH TILDE
-.. |utilde| unicode:: U+00169 .. LATIN SMALL LETTER U WITH TILDE
-.. |Wcirc|  unicode:: U+00174 .. LATIN CAPITAL LETTER W WITH CIRCUMFLEX
-.. |wcirc|  unicode:: U+00175 .. LATIN SMALL LETTER W WITH CIRCUMFLEX
-.. |Ycirc|  unicode:: U+00176 .. LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
-.. |ycirc|  unicode:: U+00177 .. LATIN SMALL LETTER Y WITH CIRCUMFLEX
-.. |Yuml|   unicode:: U+00178 .. LATIN CAPITAL LETTER Y WITH DIAERESIS
-.. |Zacute| unicode:: U+00179 .. LATIN CAPITAL LETTER Z WITH ACUTE
-.. |zacute| unicode:: U+0017A .. LATIN SMALL LETTER Z WITH ACUTE
-.. |Zcaron| unicode:: U+0017D .. LATIN CAPITAL LETTER Z WITH CARON
-.. |zcaron| unicode:: U+0017E .. LATIN SMALL LETTER Z WITH CARON
-.. |Zdot|   unicode:: U+0017B .. LATIN CAPITAL LETTER Z WITH DOT ABOVE
-.. |zdot|   unicode:: U+0017C .. LATIN SMALL LETTER Z WITH DOT ABOVE
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomfrk-wide.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |Afr| unicode:: U+1D504 .. MATHEMATICAL FRAKTUR CAPITAL A
-.. |afr| unicode:: U+1D51E .. MATHEMATICAL FRAKTUR SMALL A
-.. |Bfr| unicode:: U+1D505 .. MATHEMATICAL FRAKTUR CAPITAL B
-.. |bfr| unicode:: U+1D51F .. MATHEMATICAL FRAKTUR SMALL B
-.. |Cfr| unicode:: U+0212D .. BLACK-LETTER CAPITAL C
-.. |cfr| unicode:: U+1D520 .. MATHEMATICAL FRAKTUR SMALL C
-.. |Dfr| unicode:: U+1D507 .. MATHEMATICAL FRAKTUR CAPITAL D
-.. |dfr| unicode:: U+1D521 .. MATHEMATICAL FRAKTUR SMALL D
-.. |Efr| unicode:: U+1D508 .. MATHEMATICAL FRAKTUR CAPITAL E
-.. |efr| unicode:: U+1D522 .. MATHEMATICAL FRAKTUR SMALL E
-.. |Ffr| unicode:: U+1D509 .. MATHEMATICAL FRAKTUR CAPITAL F
-.. |ffr| unicode:: U+1D523 .. MATHEMATICAL FRAKTUR SMALL F
-.. |Gfr| unicode:: U+1D50A .. MATHEMATICAL FRAKTUR CAPITAL G
-.. |gfr| unicode:: U+1D524 .. MATHEMATICAL FRAKTUR SMALL G
-.. |Hfr| unicode:: U+0210C .. BLACK-LETTER CAPITAL H
-.. |hfr| unicode:: U+1D525 .. MATHEMATICAL FRAKTUR SMALL H
-.. |Ifr| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
-.. |ifr| unicode:: U+1D526 .. MATHEMATICAL FRAKTUR SMALL I
-.. |Jfr| unicode:: U+1D50D .. MATHEMATICAL FRAKTUR CAPITAL J
-.. |jfr| unicode:: U+1D527 .. MATHEMATICAL FRAKTUR SMALL J
-.. |Kfr| unicode:: U+1D50E .. MATHEMATICAL FRAKTUR CAPITAL K
-.. |kfr| unicode:: U+1D528 .. MATHEMATICAL FRAKTUR SMALL K
-.. |Lfr| unicode:: U+1D50F .. MATHEMATICAL FRAKTUR CAPITAL L
-.. |lfr| unicode:: U+1D529 .. MATHEMATICAL FRAKTUR SMALL L
-.. |Mfr| unicode:: U+1D510 .. MATHEMATICAL FRAKTUR CAPITAL M
-.. |mfr| unicode:: U+1D52A .. MATHEMATICAL FRAKTUR SMALL M
-.. |Nfr| unicode:: U+1D511 .. MATHEMATICAL FRAKTUR CAPITAL N
-.. |nfr| unicode:: U+1D52B .. MATHEMATICAL FRAKTUR SMALL N
-.. |Ofr| unicode:: U+1D512 .. MATHEMATICAL FRAKTUR CAPITAL O
-.. |ofr| unicode:: U+1D52C .. MATHEMATICAL FRAKTUR SMALL O
-.. |Pfr| unicode:: U+1D513 .. MATHEMATICAL FRAKTUR CAPITAL P
-.. |pfr| unicode:: U+1D52D .. MATHEMATICAL FRAKTUR SMALL P
-.. |Qfr| unicode:: U+1D514 .. MATHEMATICAL FRAKTUR CAPITAL Q
-.. |qfr| unicode:: U+1D52E .. MATHEMATICAL FRAKTUR SMALL Q
-.. |Rfr| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
-.. |rfr| unicode:: U+1D52F .. MATHEMATICAL FRAKTUR SMALL R
-.. |Sfr| unicode:: U+1D516 .. MATHEMATICAL FRAKTUR CAPITAL S
-.. |sfr| unicode:: U+1D530 .. MATHEMATICAL FRAKTUR SMALL S
-.. |Tfr| unicode:: U+1D517 .. MATHEMATICAL FRAKTUR CAPITAL T
-.. |tfr| unicode:: U+1D531 .. MATHEMATICAL FRAKTUR SMALL T
-.. |Ufr| unicode:: U+1D518 .. MATHEMATICAL FRAKTUR CAPITAL U
-.. |ufr| unicode:: U+1D532 .. MATHEMATICAL FRAKTUR SMALL U
-.. |Vfr| unicode:: U+1D519 .. MATHEMATICAL FRAKTUR CAPITAL V
-.. |vfr| unicode:: U+1D533 .. MATHEMATICAL FRAKTUR SMALL V
-.. |Wfr| unicode:: U+1D51A .. MATHEMATICAL FRAKTUR CAPITAL W
-.. |wfr| unicode:: U+1D534 .. MATHEMATICAL FRAKTUR SMALL W
-.. |Xfr| unicode:: U+1D51B .. MATHEMATICAL FRAKTUR CAPITAL X
-.. |xfr| unicode:: U+1D535 .. MATHEMATICAL FRAKTUR SMALL X
-.. |Yfr| unicode:: U+1D51C .. MATHEMATICAL FRAKTUR CAPITAL Y
-.. |yfr| unicode:: U+1D536 .. MATHEMATICAL FRAKTUR SMALL Y
-.. |Zfr| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
-.. |zfr| unicode:: U+1D537 .. MATHEMATICAL FRAKTUR SMALL Z
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomfrk.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |Cfr| unicode:: U+0212D .. BLACK-LETTER CAPITAL C
-.. |Hfr| unicode:: U+0210C .. BLACK-LETTER CAPITAL H
-.. |Ifr| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
-.. |Rfr| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
-.. |Zfr| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomopf-wide.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |Aopf| unicode:: U+1D538 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL A
-.. |Bopf| unicode:: U+1D539 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL B
-.. |Copf| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
-.. |Dopf| unicode:: U+1D53B .. MATHEMATICAL DOUBLE-STRUCK CAPITAL D
-.. |Eopf| unicode:: U+1D53C .. MATHEMATICAL DOUBLE-STRUCK CAPITAL E
-.. |Fopf| unicode:: U+1D53D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL F
-.. |Gopf| unicode:: U+1D53E .. MATHEMATICAL DOUBLE-STRUCK CAPITAL G
-.. |Hopf| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
-.. |Iopf| unicode:: U+1D540 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL I
-.. |Jopf| unicode:: U+1D541 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL J
-.. |Kopf| unicode:: U+1D542 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL K
-.. |Lopf| unicode:: U+1D543 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL L
-.. |Mopf| unicode:: U+1D544 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL M
-.. |Nopf| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
-.. |Oopf| unicode:: U+1D546 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL O
-.. |Popf| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
-.. |Qopf| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
-.. |Ropf| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
-.. |Sopf| unicode:: U+1D54A .. MATHEMATICAL DOUBLE-STRUCK CAPITAL S
-.. |Topf| unicode:: U+1D54B .. MATHEMATICAL DOUBLE-STRUCK CAPITAL T
-.. |Uopf| unicode:: U+1D54C .. MATHEMATICAL DOUBLE-STRUCK CAPITAL U
-.. |Vopf| unicode:: U+1D54D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL V
-.. |Wopf| unicode:: U+1D54E .. MATHEMATICAL DOUBLE-STRUCK CAPITAL W
-.. |Xopf| unicode:: U+1D54F .. MATHEMATICAL DOUBLE-STRUCK CAPITAL X
-.. |Yopf| unicode:: U+1D550 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
-.. |Zopf| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomopf.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |Copf| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
-.. |Hopf| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
-.. |Nopf| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
-.. |Popf| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
-.. |Qopf| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
-.. |Ropf| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
-.. |Zopf| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomscr-wide.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |Ascr| unicode:: U+1D49C .. MATHEMATICAL SCRIPT CAPITAL A
-.. |ascr| unicode:: U+1D4B6 .. MATHEMATICAL SCRIPT SMALL A
-.. |Bscr| unicode:: U+0212C .. SCRIPT CAPITAL B
-.. |bscr| unicode:: U+1D4B7 .. MATHEMATICAL SCRIPT SMALL B
-.. |Cscr| unicode:: U+1D49E .. MATHEMATICAL SCRIPT CAPITAL C
-.. |cscr| unicode:: U+1D4B8 .. MATHEMATICAL SCRIPT SMALL C
-.. |Dscr| unicode:: U+1D49F .. MATHEMATICAL SCRIPT CAPITAL D
-.. |dscr| unicode:: U+1D4B9 .. MATHEMATICAL SCRIPT SMALL D
-.. |Escr| unicode:: U+02130 .. SCRIPT CAPITAL E
-.. |escr| unicode:: U+0212F .. SCRIPT SMALL E
-.. |Fscr| unicode:: U+02131 .. SCRIPT CAPITAL F
-.. |fscr| unicode:: U+1D4BB .. MATHEMATICAL SCRIPT SMALL F
-.. |Gscr| unicode:: U+1D4A2 .. MATHEMATICAL SCRIPT CAPITAL G
-.. |gscr| unicode:: U+0210A .. SCRIPT SMALL G
-.. |Hscr| unicode:: U+0210B .. SCRIPT CAPITAL H
-.. |hscr| unicode:: U+1D4BD .. MATHEMATICAL SCRIPT SMALL H
-.. |Iscr| unicode:: U+02110 .. SCRIPT CAPITAL I
-.. |iscr| unicode:: U+1D4BE .. MATHEMATICAL SCRIPT SMALL I
-.. |Jscr| unicode:: U+1D4A5 .. MATHEMATICAL SCRIPT CAPITAL J
-.. |jscr| unicode:: U+1D4BF .. MATHEMATICAL SCRIPT SMALL J
-.. |Kscr| unicode:: U+1D4A6 .. MATHEMATICAL SCRIPT CAPITAL K
-.. |kscr| unicode:: U+1D4C0 .. MATHEMATICAL SCRIPT SMALL K
-.. |Lscr| unicode:: U+02112 .. SCRIPT CAPITAL L
-.. |lscr| unicode:: U+1D4C1 .. MATHEMATICAL SCRIPT SMALL L
-.. |Mscr| unicode:: U+02133 .. SCRIPT CAPITAL M
-.. |mscr| unicode:: U+1D4C2 .. MATHEMATICAL SCRIPT SMALL M
-.. |Nscr| unicode:: U+1D4A9 .. MATHEMATICAL SCRIPT CAPITAL N
-.. |nscr| unicode:: U+1D4C3 .. MATHEMATICAL SCRIPT SMALL N
-.. |Oscr| unicode:: U+1D4AA .. MATHEMATICAL SCRIPT CAPITAL O
-.. |oscr| unicode:: U+02134 .. SCRIPT SMALL O
-.. |Pscr| unicode:: U+1D4AB .. MATHEMATICAL SCRIPT CAPITAL P
-.. |pscr| unicode:: U+1D4C5 .. MATHEMATICAL SCRIPT SMALL P
-.. |Qscr| unicode:: U+1D4AC .. MATHEMATICAL SCRIPT CAPITAL Q
-.. |qscr| unicode:: U+1D4C6 .. MATHEMATICAL SCRIPT SMALL Q
-.. |Rscr| unicode:: U+0211B .. SCRIPT CAPITAL R
-.. |rscr| unicode:: U+1D4C7 .. MATHEMATICAL SCRIPT SMALL R
-.. |Sscr| unicode:: U+1D4AE .. MATHEMATICAL SCRIPT CAPITAL S
-.. |sscr| unicode:: U+1D4C8 .. MATHEMATICAL SCRIPT SMALL S
-.. |Tscr| unicode:: U+1D4AF .. MATHEMATICAL SCRIPT CAPITAL T
-.. |tscr| unicode:: U+1D4C9 .. MATHEMATICAL SCRIPT SMALL T
-.. |Uscr| unicode:: U+1D4B0 .. MATHEMATICAL SCRIPT CAPITAL U
-.. |uscr| unicode:: U+1D4CA .. MATHEMATICAL SCRIPT SMALL U
-.. |Vscr| unicode:: U+1D4B1 .. MATHEMATICAL SCRIPT CAPITAL V
-.. |vscr| unicode:: U+1D4CB .. MATHEMATICAL SCRIPT SMALL V
-.. |Wscr| unicode:: U+1D4B2 .. MATHEMATICAL SCRIPT CAPITAL W
-.. |wscr| unicode:: U+1D4CC .. MATHEMATICAL SCRIPT SMALL W
-.. |Xscr| unicode:: U+1D4B3 .. MATHEMATICAL SCRIPT CAPITAL X
-.. |xscr| unicode:: U+1D4CD .. MATHEMATICAL SCRIPT SMALL X
-.. |Yscr| unicode:: U+1D4B4 .. MATHEMATICAL SCRIPT CAPITAL Y
-.. |yscr| unicode:: U+1D4CE .. MATHEMATICAL SCRIPT SMALL Y
-.. |Zscr| unicode:: U+1D4B5 .. MATHEMATICAL SCRIPT CAPITAL Z
-.. |zscr| unicode:: U+1D4CF .. MATHEMATICAL SCRIPT SMALL Z
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomscr.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |Bscr| unicode:: U+0212C .. SCRIPT CAPITAL B
-.. |Escr| unicode:: U+02130 .. SCRIPT CAPITAL E
-.. |escr| unicode:: U+0212F .. SCRIPT SMALL E
-.. |Fscr| unicode:: U+02131 .. SCRIPT CAPITAL F
-.. |gscr| unicode:: U+0210A .. SCRIPT SMALL G
-.. |Hscr| unicode:: U+0210B .. SCRIPT CAPITAL H
-.. |Iscr| unicode:: U+02110 .. SCRIPT CAPITAL I
-.. |Lscr| unicode:: U+02112 .. SCRIPT CAPITAL L
-.. |Mscr| unicode:: U+02133 .. SCRIPT CAPITAL M
-.. |oscr| unicode:: U+02134 .. SCRIPT SMALL O
-.. |Rscr| unicode:: U+0211B .. SCRIPT CAPITAL R
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isonum.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |amp|    unicode:: U+00026 .. AMPERSAND
-.. |apos|   unicode:: U+00027 .. APOSTROPHE
-.. |ast|    unicode:: U+0002A .. ASTERISK
-.. |brvbar| unicode:: U+000A6 .. BROKEN BAR
-.. |bsol|   unicode:: U+0005C .. REVERSE SOLIDUS
-.. |cent|   unicode:: U+000A2 .. CENT SIGN
-.. |colon|  unicode:: U+0003A .. COLON
-.. |comma|  unicode:: U+0002C .. COMMA
-.. |commat| unicode:: U+00040 .. COMMERCIAL AT
-.. |copy|   unicode:: U+000A9 .. COPYRIGHT SIGN
-.. |curren| unicode:: U+000A4 .. CURRENCY SIGN
-.. |darr|   unicode:: U+02193 .. DOWNWARDS ARROW
-.. |deg|    unicode:: U+000B0 .. DEGREE SIGN
-.. |divide| unicode:: U+000F7 .. DIVISION SIGN
-.. |dollar| unicode:: U+00024 .. DOLLAR SIGN
-.. |equals| unicode:: U+0003D .. EQUALS SIGN
-.. |excl|   unicode:: U+00021 .. EXCLAMATION MARK
-.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF
-.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER
-.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTH
-.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS
-.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHS
-.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHS
-.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHS
-.. |gt|     unicode:: U+0003E .. GREATER-THAN SIGN
-.. |half|   unicode:: U+000BD .. VULGAR FRACTION ONE HALF
-.. |horbar| unicode:: U+02015 .. HORIZONTAL BAR
-.. |hyphen| unicode:: U+02010 .. HYPHEN
-.. |iexcl|  unicode:: U+000A1 .. INVERTED EXCLAMATION MARK
-.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK
-.. |laquo|  unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-.. |larr|   unicode:: U+02190 .. LEFTWARDS ARROW
-.. |lcub|   unicode:: U+0007B .. LEFT CURLY BRACKET
-.. |ldquo|  unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
-.. |lowbar| unicode:: U+0005F .. LOW LINE
-.. |lpar|   unicode:: U+00028 .. LEFT PARENTHESIS
-.. |lsqb|   unicode:: U+0005B .. LEFT SQUARE BRACKET
-.. |lsquo|  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
-.. |lt|     unicode:: U+0003C .. LESS-THAN SIGN
-.. |micro|  unicode:: U+000B5 .. MICRO SIGN
-.. |middot| unicode:: U+000B7 .. MIDDLE DOT
-.. |nbsp|   unicode:: U+000A0 .. NO-BREAK SPACE
-.. |not|    unicode:: U+000AC .. NOT SIGN
-.. |num|    unicode:: U+00023 .. NUMBER SIGN
-.. |ohm|    unicode:: U+02126 .. OHM SIGN
-.. |ordf|   unicode:: U+000AA .. FEMININE ORDINAL INDICATOR
-.. |ordm|   unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR
-.. |para|   unicode:: U+000B6 .. PILCROW SIGN
-.. |percnt| unicode:: U+00025 .. PERCENT SIGN
-.. |period| unicode:: U+0002E .. FULL STOP
-.. |plus|   unicode:: U+0002B .. PLUS SIGN
-.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN
-.. |pound|  unicode:: U+000A3 .. POUND SIGN
-.. |quest|  unicode:: U+0003F .. QUESTION MARK
-.. |quot|   unicode:: U+00022 .. QUOTATION MARK
-.. |raquo|  unicode:: U+000BB .. RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-.. |rarr|   unicode:: U+02192 .. RIGHTWARDS ARROW
-.. |rcub|   unicode:: U+0007D .. RIGHT CURLY BRACKET
-.. |rdquo|  unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
-.. |reg|    unicode:: U+000AE .. REGISTERED SIGN
-.. |rpar|   unicode:: U+00029 .. RIGHT PARENTHESIS
-.. |rsqb|   unicode:: U+0005D .. RIGHT SQUARE BRACKET
-.. |rsquo|  unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
-.. |sect|   unicode:: U+000A7 .. SECTION SIGN
-.. |semi|   unicode:: U+0003B .. SEMICOLON
-.. |shy|    unicode:: U+000AD .. SOFT HYPHEN
-.. |sol|    unicode:: U+0002F .. SOLIDUS
-.. |sung|   unicode:: U+0266A .. EIGHTH NOTE
-.. |sup1|   unicode:: U+000B9 .. SUPERSCRIPT ONE
-.. |sup2|   unicode:: U+000B2 .. SUPERSCRIPT TWO
-.. |sup3|   unicode:: U+000B3 .. SUPERSCRIPT THREE
-.. |times|  unicode:: U+000D7 .. MULTIPLICATION SIGN
-.. |trade|  unicode:: U+02122 .. TRADE MARK SIGN
-.. |uarr|   unicode:: U+02191 .. UPWARDS ARROW
-.. |verbar| unicode:: U+0007C .. VERTICAL LINE
-.. |yen|    unicode:: U+000A5 .. YEN SIGN
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isopub.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |blank|  unicode:: U+02423 .. OPEN BOX
-.. |blk12|  unicode:: U+02592 .. MEDIUM SHADE
-.. |blk14|  unicode:: U+02591 .. LIGHT SHADE
-.. |blk34|  unicode:: U+02593 .. DARK SHADE
-.. |block|  unicode:: U+02588 .. FULL BLOCK
-.. |bull|   unicode:: U+02022 .. BULLET
-.. |caret|  unicode:: U+02041 .. CARET INSERTION POINT
-.. |check|  unicode:: U+02713 .. CHECK MARK
-.. |cir|    unicode:: U+025CB .. WHITE CIRCLE
-.. |clubs|  unicode:: U+02663 .. BLACK CLUB SUIT
-.. |copysr| unicode:: U+02117 .. SOUND RECORDING COPYRIGHT
-.. |cross|  unicode:: U+02717 .. BALLOT X
-.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER
-.. |dagger| unicode:: U+02020 .. DAGGER
-.. |dash|   unicode:: U+02010 .. HYPHEN
-.. |diams|  unicode:: U+02666 .. BLACK DIAMOND SUIT
-.. |dlcrop| unicode:: U+0230D .. BOTTOM LEFT CROP
-.. |drcrop| unicode:: U+0230C .. BOTTOM RIGHT CROP
-.. |dtri|   unicode:: U+025BF .. WHITE DOWN-POINTING SMALL TRIANGLE
-.. |dtrif|  unicode:: U+025BE .. BLACK DOWN-POINTING SMALL TRIANGLE
-.. |emsp|   unicode:: U+02003 .. EM SPACE
-.. |emsp13| unicode:: U+02004 .. THREE-PER-EM SPACE
-.. |emsp14| unicode:: U+02005 .. FOUR-PER-EM SPACE
-.. |ensp|   unicode:: U+02002 .. EN SPACE
-.. |female| unicode:: U+02640 .. FEMALE SIGN
-.. |ffilig| unicode:: U+0FB03 .. LATIN SMALL LIGATURE FFI
-.. |fflig|  unicode:: U+0FB00 .. LATIN SMALL LIGATURE FF
-.. |ffllig| unicode:: U+0FB04 .. LATIN SMALL LIGATURE FFL
-.. |filig|  unicode:: U+0FB01 .. LATIN SMALL LIGATURE FI
-.. |flat|   unicode:: U+0266D .. MUSIC FLAT SIGN
-.. |fllig|  unicode:: U+0FB02 .. LATIN SMALL LIGATURE FL
-.. |frac13| unicode:: U+02153 .. VULGAR FRACTION ONE THIRD
-.. |frac15| unicode:: U+02155 .. VULGAR FRACTION ONE FIFTH
-.. |frac16| unicode:: U+02159 .. VULGAR FRACTION ONE SIXTH
-.. |frac23| unicode:: U+02154 .. VULGAR FRACTION TWO THIRDS
-.. |frac25| unicode:: U+02156 .. VULGAR FRACTION TWO FIFTHS
-.. |frac35| unicode:: U+02157 .. VULGAR FRACTION THREE FIFTHS
-.. |frac45| unicode:: U+02158 .. VULGAR FRACTION FOUR FIFTHS
-.. |frac56| unicode:: U+0215A .. VULGAR FRACTION FIVE SIXTHS
-.. |hairsp| unicode:: U+0200A .. HAIR SPACE
-.. |hearts| unicode:: U+02665 .. BLACK HEART SUIT
-.. |hellip| unicode:: U+02026 .. HORIZONTAL ELLIPSIS
-.. |hybull| unicode:: U+02043 .. HYPHEN BULLET
-.. |incare| unicode:: U+02105 .. CARE OF
-.. |ldquor| unicode:: U+0201E .. DOUBLE LOW-9 QUOTATION MARK
-.. |lhblk|  unicode:: U+02584 .. LOWER HALF BLOCK
-.. |loz|    unicode:: U+025CA .. LOZENGE
-.. |lozf|   unicode:: U+029EB .. BLACK LOZENGE
-.. |lsquor| unicode:: U+0201A .. SINGLE LOW-9 QUOTATION MARK
-.. |ltri|   unicode:: U+025C3 .. WHITE LEFT-POINTING SMALL TRIANGLE
-.. |ltrif|  unicode:: U+025C2 .. BLACK LEFT-POINTING SMALL TRIANGLE
-.. |male|   unicode:: U+02642 .. MALE SIGN
-.. |malt|   unicode:: U+02720 .. MALTESE CROSS
-.. |marker| unicode:: U+025AE .. BLACK VERTICAL RECTANGLE
-.. |mdash|  unicode:: U+02014 .. EM DASH
-.. |mldr|   unicode:: U+02026 .. HORIZONTAL ELLIPSIS
-.. |natur|  unicode:: U+0266E .. MUSIC NATURAL SIGN
-.. |ndash|  unicode:: U+02013 .. EN DASH
-.. |nldr|   unicode:: U+02025 .. TWO DOT LEADER
-.. |numsp|  unicode:: U+02007 .. FIGURE SPACE
-.. |phone|  unicode:: U+0260E .. BLACK TELEPHONE
-.. |puncsp| unicode:: U+02008 .. PUNCTUATION SPACE
-.. |rdquor| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
-.. |rect|   unicode:: U+025AD .. WHITE RECTANGLE
-.. |rsquor| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
-.. |rtri|   unicode:: U+025B9 .. WHITE RIGHT-POINTING SMALL TRIANGLE
-.. |rtrif|  unicode:: U+025B8 .. BLACK RIGHT-POINTING SMALL TRIANGLE
-.. |rx|     unicode:: U+0211E .. PRESCRIPTION TAKE
-.. |sext|   unicode:: U+02736 .. SIX POINTED BLACK STAR
-.. |sharp|  unicode:: U+0266F .. MUSIC SHARP SIGN
-.. |spades| unicode:: U+02660 .. BLACK SPADE SUIT
-.. |squ|    unicode:: U+025A1 .. WHITE SQUARE
-.. |squf|   unicode:: U+025AA .. BLACK SMALL SQUARE
-.. |star|   unicode:: U+02606 .. WHITE STAR
-.. |starf|  unicode:: U+02605 .. BLACK STAR
-.. |target| unicode:: U+02316 .. POSITION INDICATOR
-.. |telrec| unicode:: U+02315 .. TELEPHONE RECORDER
-.. |thinsp| unicode:: U+02009 .. THIN SPACE
-.. |uhblk|  unicode:: U+02580 .. UPPER HALF BLOCK
-.. |ulcrop| unicode:: U+0230F .. TOP LEFT CROP
-.. |urcrop| unicode:: U+0230E .. TOP RIGHT CROP
-.. |utri|   unicode:: U+025B5 .. WHITE UP-POINTING SMALL TRIANGLE
-.. |utrif|  unicode:: U+025B4 .. BLACK UP-POINTING SMALL TRIANGLE
-.. |vellip| unicode:: U+022EE .. VERTICAL ELLIPSIS
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isotech.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,168 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |acd|      unicode:: U+0223F .. SINE WAVE
-.. |aleph|    unicode:: U+02135 .. ALEF SYMBOL
-.. |And|      unicode:: U+02A53 .. DOUBLE LOGICAL AND
-.. |and|      unicode:: U+02227 .. LOGICAL AND
-.. |andand|   unicode:: U+02A55 .. TWO INTERSECTING LOGICAL AND
-.. |andd|     unicode:: U+02A5C .. LOGICAL AND WITH HORIZONTAL DASH
-.. |andslope| unicode:: U+02A58 .. SLOPING LARGE AND
-.. |andv|     unicode:: U+02A5A .. LOGICAL AND WITH MIDDLE STEM
-.. |ang90|    unicode:: U+0221F .. RIGHT ANGLE
-.. |angrt|    unicode:: U+0221F .. RIGHT ANGLE
-.. |angsph|   unicode:: U+02222 .. SPHERICAL ANGLE
-.. |angst|    unicode:: U+0212B .. ANGSTROM SIGN
-.. |ap|       unicode:: U+02248 .. ALMOST EQUAL TO
-.. |apacir|   unicode:: U+02A6F .. ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
-.. |awconint| unicode:: U+02233 .. ANTICLOCKWISE CONTOUR INTEGRAL
-.. |awint|    unicode:: U+02A11 .. ANTICLOCKWISE INTEGRATION
-.. |becaus|   unicode:: U+02235 .. BECAUSE
-.. |bernou|   unicode:: U+0212C .. SCRIPT CAPITAL B
-.. |bne|      unicode:: U+0003D U+020E5 .. EQUALS SIGN with reverse slash
-.. |bnequiv|  unicode:: U+02261 U+020E5 .. IDENTICAL TO with reverse slash
-.. |bNot|     unicode:: U+02AED .. REVERSED DOUBLE STROKE NOT SIGN
-.. |bnot|     unicode:: U+02310 .. REVERSED NOT SIGN
-.. |bottom|   unicode:: U+022A5 .. UP TACK
-.. |cap|      unicode:: U+02229 .. INTERSECTION
-.. |Cconint|  unicode:: U+02230 .. VOLUME INTEGRAL
-.. |cirfnint| unicode:: U+02A10 .. CIRCULATION FUNCTION
-.. |compfn|   unicode:: U+02218 .. RING OPERATOR
-.. |cong|     unicode:: U+02245 .. APPROXIMATELY EQUAL TO
-.. |Conint|   unicode:: U+0222F .. SURFACE INTEGRAL
-.. |conint|   unicode:: U+0222E .. CONTOUR INTEGRAL
-.. |ctdot|    unicode:: U+022EF .. MIDLINE HORIZONTAL ELLIPSIS
-.. |cup|      unicode:: U+0222A .. UNION
-.. |cwconint| unicode:: U+02232 .. CLOCKWISE CONTOUR INTEGRAL
-.. |cwint|    unicode:: U+02231 .. CLOCKWISE INTEGRAL
-.. |cylcty|   unicode:: U+0232D .. CYLINDRICITY
-.. |disin|    unicode:: U+022F2 .. ELEMENT OF WITH LONG HORIZONTAL STROKE
-.. |Dot|      unicode:: U+000A8 .. DIAERESIS
-.. |DotDot|   unicode:: U+020DC .. COMBINING FOUR DOTS ABOVE
-.. |dsol|     unicode:: U+029F6 .. SOLIDUS WITH OVERBAR
-.. |dtdot|    unicode:: U+022F1 .. DOWN RIGHT DIAGONAL ELLIPSIS
-.. |dwangle|  unicode:: U+029A6 .. OBLIQUE ANGLE OPENING UP
-.. |elinters| unicode:: U+0FFFD .. REPLACEMENT CHARACTER
-.. |epar|     unicode:: U+022D5 .. EQUAL AND PARALLEL TO
-.. |eparsl|   unicode:: U+029E3 .. EQUALS SIGN AND SLANTED PARALLEL
-.. |equiv|    unicode:: U+02261 .. IDENTICAL TO
-.. |eqvparsl| unicode:: U+029E5 .. IDENTICAL TO AND SLANTED PARALLEL
-.. |exist|    unicode:: U+02203 .. THERE EXISTS
-.. |fltns|    unicode:: U+025B1 .. WHITE PARALLELOGRAM
-.. |fnof|     unicode:: U+00192 .. LATIN SMALL LETTER F WITH HOOK
-.. |forall|   unicode:: U+02200 .. FOR ALL
-.. |fpartint| unicode:: U+02A0D .. FINITE PART INTEGRAL
-.. |ge|       unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
-.. |hamilt|   unicode:: U+0210B .. SCRIPT CAPITAL H
-.. |iff|      unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
-.. |iinfin|   unicode:: U+029DC .. INCOMPLETE INFINITY
-.. |imped|    unicode:: U+001B5 .. LATIN CAPITAL LETTER Z WITH STROKE
-.. |infin|    unicode:: U+0221E .. INFINITY
-.. |infintie| unicode:: U+029DD .. TIE OVER INFINITY
-.. |Int|      unicode:: U+0222C .. DOUBLE INTEGRAL
-.. |int|      unicode:: U+0222B .. INTEGRAL
-.. |intlarhk| unicode:: U+02A17 .. INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
-.. |isin|     unicode:: U+02208 .. ELEMENT OF
-.. |isindot|  unicode:: U+022F5 .. ELEMENT OF WITH DOT ABOVE
-.. |isinE|    unicode:: U+022F9 .. ELEMENT OF WITH TWO HORIZONTAL STROKES
-.. |isins|    unicode:: U+022F4 .. SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
-.. |isinsv|   unicode:: U+022F3 .. ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
-.. |isinv|    unicode:: U+02208 .. ELEMENT OF
-.. |lagran|   unicode:: U+02112 .. SCRIPT CAPITAL L
-.. |Lang|     unicode:: U+0300A .. LEFT DOUBLE ANGLE BRACKET
-.. |lang|     unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
-.. |lArr|     unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
-.. |lbbrk|    unicode:: U+03014 .. LEFT TORTOISE SHELL BRACKET
-.. |le|       unicode:: U+02264 .. LESS-THAN OR EQUAL TO
-.. |loang|    unicode:: U+03018 .. LEFT WHITE TORTOISE SHELL BRACKET
-.. |lobrk|    unicode:: U+0301A .. LEFT WHITE SQUARE BRACKET
-.. |lopar|    unicode:: U+02985 .. LEFT WHITE PARENTHESIS
-.. |lowast|   unicode:: U+02217 .. ASTERISK OPERATOR
-.. |minus|    unicode:: U+02212 .. MINUS SIGN
-.. |mnplus|   unicode:: U+02213 .. MINUS-OR-PLUS SIGN
-.. |nabla|    unicode:: U+02207 .. NABLA
-.. |ne|       unicode:: U+02260 .. NOT EQUAL TO
-.. |nedot|    unicode:: U+02250 U+00338 .. APPROACHES THE LIMIT with slash
-.. |nhpar|    unicode:: U+02AF2 .. PARALLEL WITH HORIZONTAL STROKE
-.. |ni|       unicode:: U+0220B .. CONTAINS AS MEMBER
-.. |nis|      unicode:: U+022FC .. SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
-.. |nisd|     unicode:: U+022FA .. CONTAINS WITH LONG HORIZONTAL STROKE
-.. |niv|      unicode:: U+0220B .. CONTAINS AS MEMBER
-.. |Not|      unicode:: U+02AEC .. DOUBLE STROKE NOT SIGN
-.. |notin|    unicode:: U+02209 .. NOT AN ELEMENT OF
-.. |notindot| unicode:: U+022F5 U+00338 .. ELEMENT OF WITH DOT ABOVE with slash
-.. |notinE|   unicode:: U+022F9 U+00338 .. ELEMENT OF WITH TWO HORIZONTAL STROKES with slash
-.. |notinva|  unicode:: U+02209 .. NOT AN ELEMENT OF
-.. |notinvb|  unicode:: U+022F7 .. SMALL ELEMENT OF WITH OVERBAR
-.. |notinvc|  unicode:: U+022F6 .. ELEMENT OF WITH OVERBAR
-.. |notni|    unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
-.. |notniva|  unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
-.. |notnivb|  unicode:: U+022FE .. SMALL CONTAINS WITH OVERBAR
-.. |notnivc|  unicode:: U+022FD .. CONTAINS WITH OVERBAR
-.. |nparsl|   unicode:: U+02AFD U+020E5 .. DOUBLE SOLIDUS OPERATOR with reverse slash
-.. |npart|    unicode:: U+02202 U+00338 .. PARTIAL DIFFERENTIAL with slash
-.. |npolint|  unicode:: U+02A14 .. LINE INTEGRATION NOT INCLUDING THE POLE
-.. |nvinfin|  unicode:: U+029DE .. INFINITY NEGATED WITH VERTICAL BAR
-.. |olcross|  unicode:: U+029BB .. CIRCLE WITH SUPERIMPOSED X
-.. |Or|       unicode:: U+02A54 .. DOUBLE LOGICAL OR
-.. |or|       unicode:: U+02228 .. LOGICAL OR
-.. |ord|      unicode:: U+02A5D .. LOGICAL OR WITH HORIZONTAL DASH
-.. |order|    unicode:: U+02134 .. SCRIPT SMALL O
-.. |oror|     unicode:: U+02A56 .. TWO INTERSECTING LOGICAL OR
-.. |orslope|  unicode:: U+02A57 .. SLOPING LARGE OR
-.. |orv|      unicode:: U+02A5B .. LOGICAL OR WITH MIDDLE STEM
-.. |par|      unicode:: U+02225 .. PARALLEL TO
-.. |parsl|    unicode:: U+02AFD .. DOUBLE SOLIDUS OPERATOR
-.. |part|     unicode:: U+02202 .. PARTIAL DIFFERENTIAL
-.. |permil|   unicode:: U+02030 .. PER MILLE SIGN
-.. |perp|     unicode:: U+022A5 .. UP TACK
-.. |pertenk|  unicode:: U+02031 .. PER TEN THOUSAND SIGN
-.. |phmmat|   unicode:: U+02133 .. SCRIPT CAPITAL M
-.. |pointint| unicode:: U+02A15 .. INTEGRAL AROUND A POINT OPERATOR
-.. |Prime|    unicode:: U+02033 .. DOUBLE PRIME
-.. |prime|    unicode:: U+02032 .. PRIME
-.. |profalar| unicode:: U+0232E .. ALL AROUND-PROFILE
-.. |profline| unicode:: U+02312 .. ARC
-.. |profsurf| unicode:: U+02313 .. SEGMENT
-.. |prop|     unicode:: U+0221D .. PROPORTIONAL TO
-.. |qint|     unicode:: U+02A0C .. QUADRUPLE INTEGRAL OPERATOR
-.. |qprime|   unicode:: U+02057 .. QUADRUPLE PRIME
-.. |quatint|  unicode:: U+02A16 .. QUATERNION INTEGRAL OPERATOR
-.. |radic|    unicode:: U+0221A .. SQUARE ROOT
-.. |Rang|     unicode:: U+0300B .. RIGHT DOUBLE ANGLE BRACKET
-.. |rang|     unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
-.. |rArr|     unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
-.. |rbbrk|    unicode:: U+03015 .. RIGHT TORTOISE SHELL BRACKET
-.. |roang|    unicode:: U+03019 .. RIGHT WHITE TORTOISE SHELL BRACKET
-.. |robrk|    unicode:: U+0301B .. RIGHT WHITE SQUARE BRACKET
-.. |ropar|    unicode:: U+02986 .. RIGHT WHITE PARENTHESIS
-.. |rppolint| unicode:: U+02A12 .. LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
-.. |scpolint| unicode:: U+02A13 .. LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
-.. |sim|      unicode:: U+0223C .. TILDE OPERATOR
-.. |simdot|   unicode:: U+02A6A .. TILDE OPERATOR WITH DOT ABOVE
-.. |sime|     unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
-.. |smeparsl| unicode:: U+029E4 .. EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
-.. |square|   unicode:: U+025A1 .. WHITE SQUARE
-.. |squarf|   unicode:: U+025AA .. BLACK SMALL SQUARE
-.. |strns|    unicode:: U+000AF .. MACRON
-.. |sub|      unicode:: U+02282 .. SUBSET OF
-.. |sube|     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
-.. |sup|      unicode:: U+02283 .. SUPERSET OF
-.. |supe|     unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
-.. |tdot|     unicode:: U+020DB .. COMBINING THREE DOTS ABOVE
-.. |there4|   unicode:: U+02234 .. THEREFORE
-.. |tint|     unicode:: U+0222D .. TRIPLE INTEGRAL
-.. |top|      unicode:: U+022A4 .. DOWN TACK
-.. |topbot|   unicode:: U+02336 .. APL FUNCTIONAL SYMBOL I-BEAM
-.. |topcir|   unicode:: U+02AF1 .. DOWN TACK WITH CIRCLE BELOW
-.. |tprime|   unicode:: U+02034 .. TRIPLE PRIME
-.. |utdot|    unicode:: U+022F0 .. UP RIGHT DIAGONAL ELLIPSIS
-.. |uwangle|  unicode:: U+029A7 .. OBLIQUE ANGLE OPENING DOWN
-.. |vangrt|   unicode:: U+0299C .. RIGHT ANGLE VARIANT WITH SQUARE
-.. |veeeq|    unicode:: U+0225A .. EQUIANGULAR TO
-.. |Verbar|   unicode:: U+02016 .. DOUBLE VERTICAL LINE
-.. |wedgeq|   unicode:: U+02259 .. ESTIMATES
-.. |xnis|     unicode:: U+022FB .. CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlalias.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,554 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |angle|                           unicode:: U+02220 .. ANGLE
-.. |ApplyFunction|                   unicode:: U+02061 .. FUNCTION APPLICATION
-.. |approx|                          unicode:: U+02248 .. ALMOST EQUAL TO
-.. |approxeq|                        unicode:: U+0224A .. ALMOST EQUAL OR EQUAL TO
-.. |Assign|                          unicode:: U+02254 .. COLON EQUALS
-.. |backcong|                        unicode:: U+0224C .. ALL EQUAL TO
-.. |backepsilon|                     unicode:: U+003F6 .. GREEK REVERSED LUNATE EPSILON SYMBOL
-.. |backprime|                       unicode:: U+02035 .. REVERSED PRIME
-.. |backsim|                         unicode:: U+0223D .. REVERSED TILDE
-.. |backsimeq|                       unicode:: U+022CD .. REVERSED TILDE EQUALS
-.. |Backslash|                       unicode:: U+02216 .. SET MINUS
-.. |barwedge|                        unicode:: U+02305 .. PROJECTIVE
-.. |Because|                         unicode:: U+02235 .. BECAUSE
-.. |because|                         unicode:: U+02235 .. BECAUSE
-.. |Bernoullis|                      unicode:: U+0212C .. SCRIPT CAPITAL B
-.. |between|                         unicode:: U+0226C .. BETWEEN
-.. |bigcap|                          unicode:: U+022C2 .. N-ARY INTERSECTION
-.. |bigcirc|                         unicode:: U+025EF .. LARGE CIRCLE
-.. |bigcup|                          unicode:: U+022C3 .. N-ARY UNION
-.. |bigodot|                         unicode:: U+02A00 .. N-ARY CIRCLED DOT OPERATOR
-.. |bigoplus|                        unicode:: U+02A01 .. N-ARY CIRCLED PLUS OPERATOR
-.. |bigotimes|                       unicode:: U+02A02 .. N-ARY CIRCLED TIMES OPERATOR
-.. |bigsqcup|                        unicode:: U+02A06 .. N-ARY SQUARE UNION OPERATOR
-.. |bigstar|                         unicode:: U+02605 .. BLACK STAR
-.. |bigtriangledown|                 unicode:: U+025BD .. WHITE DOWN-POINTING TRIANGLE
-.. |bigtriangleup|                   unicode:: U+025B3 .. WHITE UP-POINTING TRIANGLE
-.. |biguplus|                        unicode:: U+02A04 .. N-ARY UNION OPERATOR WITH PLUS
-.. |bigvee|                          unicode:: U+022C1 .. N-ARY LOGICAL OR
-.. |bigwedge|                        unicode:: U+022C0 .. N-ARY LOGICAL AND
-.. |bkarow|                          unicode:: U+0290D .. RIGHTWARDS DOUBLE DASH ARROW
-.. |blacklozenge|                    unicode:: U+029EB .. BLACK LOZENGE
-.. |blacksquare|                     unicode:: U+025AA .. BLACK SMALL SQUARE
-.. |blacktriangle|                   unicode:: U+025B4 .. BLACK UP-POINTING SMALL TRIANGLE
-.. |blacktriangledown|               unicode:: U+025BE .. BLACK DOWN-POINTING SMALL TRIANGLE
-.. |blacktriangleleft|               unicode:: U+025C2 .. BLACK LEFT-POINTING SMALL TRIANGLE
-.. |blacktriangleright|              unicode:: U+025B8 .. BLACK RIGHT-POINTING SMALL TRIANGLE
-.. |bot|                             unicode:: U+022A5 .. UP TACK
-.. |boxminus|                        unicode:: U+0229F .. SQUARED MINUS
-.. |boxplus|                         unicode:: U+0229E .. SQUARED PLUS
-.. |boxtimes|                        unicode:: U+022A0 .. SQUARED TIMES
-.. |Breve|                           unicode:: U+002D8 .. BREVE
-.. |bullet|                          unicode:: U+02022 .. BULLET
-.. |Bumpeq|                          unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
-.. |bumpeq|                          unicode:: U+0224F .. DIFFERENCE BETWEEN
-.. |CapitalDifferentialD|            unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
-.. |Cayleys|                         unicode:: U+0212D .. BLACK-LETTER CAPITAL C
-.. |Cedilla|                         unicode:: U+000B8 .. CEDILLA
-.. |CenterDot|                       unicode:: U+000B7 .. MIDDLE DOT
-.. |centerdot|                       unicode:: U+000B7 .. MIDDLE DOT
-.. |checkmark|                       unicode:: U+02713 .. CHECK MARK
-.. |circeq|                          unicode:: U+02257 .. RING EQUAL TO
-.. |circlearrowleft|                 unicode:: U+021BA .. ANTICLOCKWISE OPEN CIRCLE ARROW
-.. |circlearrowright|                unicode:: U+021BB .. CLOCKWISE OPEN CIRCLE ARROW
-.. |circledast|                      unicode:: U+0229B .. CIRCLED ASTERISK OPERATOR
-.. |circledcirc|                     unicode:: U+0229A .. CIRCLED RING OPERATOR
-.. |circleddash|                     unicode:: U+0229D .. CIRCLED DASH
-.. |CircleDot|                       unicode:: U+02299 .. CIRCLED DOT OPERATOR
-.. |circledR|                        unicode:: U+000AE .. REGISTERED SIGN
-.. |circledS|                        unicode:: U+024C8 .. CIRCLED LATIN CAPITAL LETTER S
-.. |CircleMinus|                     unicode:: U+02296 .. CIRCLED MINUS
-.. |CirclePlus|                      unicode:: U+02295 .. CIRCLED PLUS
-.. |CircleTimes|                     unicode:: U+02297 .. CIRCLED TIMES
-.. |ClockwiseContourIntegral|        unicode:: U+02232 .. CLOCKWISE CONTOUR INTEGRAL
-.. |CloseCurlyDoubleQuote|           unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
-.. |CloseCurlyQuote|                 unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
-.. |clubsuit|                        unicode:: U+02663 .. BLACK CLUB SUIT
-.. |coloneq|                         unicode:: U+02254 .. COLON EQUALS
-.. |complement|                      unicode:: U+02201 .. COMPLEMENT
-.. |complexes|                       unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
-.. |Congruent|                       unicode:: U+02261 .. IDENTICAL TO
-.. |ContourIntegral|                 unicode:: U+0222E .. CONTOUR INTEGRAL
-.. |Coproduct|                       unicode:: U+02210 .. N-ARY COPRODUCT
-.. |CounterClockwiseContourIntegral| unicode:: U+02233 .. ANTICLOCKWISE CONTOUR INTEGRAL
-.. |CupCap|                          unicode:: U+0224D .. EQUIVALENT TO
-.. |curlyeqprec|                     unicode:: U+022DE .. EQUAL TO OR PRECEDES
-.. |curlyeqsucc|                     unicode:: U+022DF .. EQUAL TO OR SUCCEEDS
-.. |curlyvee|                        unicode:: U+022CE .. CURLY LOGICAL OR
-.. |curlywedge|                      unicode:: U+022CF .. CURLY LOGICAL AND
-.. |curvearrowleft|                  unicode:: U+021B6 .. ANTICLOCKWISE TOP SEMICIRCLE ARROW
-.. |curvearrowright|                 unicode:: U+021B7 .. CLOCKWISE TOP SEMICIRCLE ARROW
-.. |dbkarow|                         unicode:: U+0290F .. RIGHTWARDS TRIPLE DASH ARROW
-.. |ddagger|                         unicode:: U+02021 .. DOUBLE DAGGER
-.. |ddotseq|                         unicode:: U+02A77 .. EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
-.. |Del|                             unicode:: U+02207 .. NABLA
-.. |DiacriticalAcute|                unicode:: U+000B4 .. ACUTE ACCENT
-.. |DiacriticalDot|                  unicode:: U+002D9 .. DOT ABOVE
-.. |DiacriticalDoubleAcute|          unicode:: U+002DD .. DOUBLE ACUTE ACCENT
-.. |DiacriticalGrave|                unicode:: U+00060 .. GRAVE ACCENT
-.. |DiacriticalTilde|                unicode:: U+002DC .. SMALL TILDE
-.. |Diamond|                         unicode:: U+022C4 .. DIAMOND OPERATOR
-.. |diamond|                         unicode:: U+022C4 .. DIAMOND OPERATOR
-.. |diamondsuit|                     unicode:: U+02666 .. BLACK DIAMOND SUIT
-.. |DifferentialD|                   unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
-.. |digamma|                         unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
-.. |div|                             unicode:: U+000F7 .. DIVISION SIGN
-.. |divideontimes|                   unicode:: U+022C7 .. DIVISION TIMES
-.. |doteq|                           unicode:: U+02250 .. APPROACHES THE LIMIT
-.. |doteqdot|                        unicode:: U+02251 .. GEOMETRICALLY EQUAL TO
-.. |DotEqual|                        unicode:: U+02250 .. APPROACHES THE LIMIT
-.. |dotminus|                        unicode:: U+02238 .. DOT MINUS
-.. |dotplus|                         unicode:: U+02214 .. DOT PLUS
-.. |dotsquare|                       unicode:: U+022A1 .. SQUARED DOT OPERATOR
-.. |doublebarwedge|                  unicode:: U+02306 .. PERSPECTIVE
-.. |DoubleContourIntegral|           unicode:: U+0222F .. SURFACE INTEGRAL
-.. |DoubleDot|                       unicode:: U+000A8 .. DIAERESIS
-.. |DoubleDownArrow|                 unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
-.. |DoubleLeftArrow|                 unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
-.. |DoubleLeftRightArrow|            unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
-.. |DoubleLeftTee|                   unicode:: U+02AE4 .. VERTICAL BAR DOUBLE LEFT TURNSTILE
-.. |DoubleLongLeftArrow|             unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
-.. |DoubleLongLeftRightArrow|        unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
-.. |DoubleLongRightArrow|            unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
-.. |DoubleRightArrow|                unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
-.. |DoubleRightTee|                  unicode:: U+022A8 .. TRUE
-.. |DoubleUpArrow|                   unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
-.. |DoubleUpDownArrow|               unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
-.. |DoubleVerticalBar|               unicode:: U+02225 .. PARALLEL TO
-.. |DownArrow|                       unicode:: U+02193 .. DOWNWARDS ARROW
-.. |Downarrow|                       unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
-.. |downarrow|                       unicode:: U+02193 .. DOWNWARDS ARROW
-.. |DownArrowUpArrow|                unicode:: U+021F5 .. DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
-.. |downdownarrows|                  unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
-.. |downharpoonleft|                 unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
-.. |downharpoonright|                unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
-.. |DownLeftVector|                  unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
-.. |DownRightVector|                 unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
-.. |DownTee|                         unicode:: U+022A4 .. DOWN TACK
-.. |DownTeeArrow|                    unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
-.. |drbkarow|                        unicode:: U+02910 .. RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
-.. |Element|                         unicode:: U+02208 .. ELEMENT OF
-.. |emptyset|                        unicode:: U+02205 .. EMPTY SET
-.. |eqcirc|                          unicode:: U+02256 .. RING IN EQUAL TO
-.. |eqcolon|                         unicode:: U+02255 .. EQUALS COLON
-.. |eqsim|                           unicode:: U+02242 .. MINUS TILDE
-.. |eqslantgtr|                      unicode:: U+02A96 .. SLANTED EQUAL TO OR GREATER-THAN
-.. |eqslantless|                     unicode:: U+02A95 .. SLANTED EQUAL TO OR LESS-THAN
-.. |EqualTilde|                      unicode:: U+02242 .. MINUS TILDE
-.. |Equilibrium|                     unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
-.. |Exists|                          unicode:: U+02203 .. THERE EXISTS
-.. |expectation|                     unicode:: U+02130 .. SCRIPT CAPITAL E
-.. |ExponentialE|                    unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
-.. |exponentiale|                    unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
-.. |fallingdotseq|                   unicode:: U+02252 .. APPROXIMATELY EQUAL TO OR THE IMAGE OF
-.. |ForAll|                          unicode:: U+02200 .. FOR ALL
-.. |Fouriertrf|                      unicode:: U+02131 .. SCRIPT CAPITAL F
-.. |geq|                             unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
-.. |geqq|                            unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
-.. |geqslant|                        unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
-.. |gg|                              unicode:: U+0226B .. MUCH GREATER-THAN
-.. |ggg|                             unicode:: U+022D9 .. VERY MUCH GREATER-THAN
-.. |gnapprox|                        unicode:: U+02A8A .. GREATER-THAN AND NOT APPROXIMATE
-.. |gneq|                            unicode:: U+02A88 .. GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
-.. |gneqq|                           unicode:: U+02269 .. GREATER-THAN BUT NOT EQUAL TO
-.. |GreaterEqual|                    unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
-.. |GreaterEqualLess|                unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
-.. |GreaterFullEqual|                unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
-.. |GreaterLess|                     unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
-.. |GreaterSlantEqual|               unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
-.. |GreaterTilde|                    unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
-.. |gtrapprox|                       unicode:: U+02A86 .. GREATER-THAN OR APPROXIMATE
-.. |gtrdot|                          unicode:: U+022D7 .. GREATER-THAN WITH DOT
-.. |gtreqless|                       unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
-.. |gtreqqless|                      unicode:: U+02A8C .. GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
-.. |gtrless|                         unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
-.. |gtrsim|                          unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
-.. |gvertneqq|                       unicode:: U+02269 U+0FE00 .. GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
-.. |Hacek|                           unicode:: U+002C7 .. CARON
-.. |hbar|                            unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
-.. |heartsuit|                       unicode:: U+02665 .. BLACK HEART SUIT
-.. |HilbertSpace|                    unicode:: U+0210B .. SCRIPT CAPITAL H
-.. |hksearow|                        unicode:: U+02925 .. SOUTH EAST ARROW WITH HOOK
-.. |hkswarow|                        unicode:: U+02926 .. SOUTH WEST ARROW WITH HOOK
-.. |hookleftarrow|                   unicode:: U+021A9 .. LEFTWARDS ARROW WITH HOOK
-.. |hookrightarrow|                  unicode:: U+021AA .. RIGHTWARDS ARROW WITH HOOK
-.. |hslash|                          unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
-.. |HumpDownHump|                    unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
-.. |HumpEqual|                       unicode:: U+0224F .. DIFFERENCE BETWEEN
-.. |iiiint|                          unicode:: U+02A0C .. QUADRUPLE INTEGRAL OPERATOR
-.. |iiint|                           unicode:: U+0222D .. TRIPLE INTEGRAL
-.. |Im|                              unicode:: U+02111 .. BLACK-LETTER CAPITAL I
-.. |ImaginaryI|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
-.. |imagline|                        unicode:: U+02110 .. SCRIPT CAPITAL I
-.. |imagpart|                        unicode:: U+02111 .. BLACK-LETTER CAPITAL I
-.. |Implies|                         unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
-.. |in|                              unicode:: U+02208 .. ELEMENT OF
-.. |integers|                        unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
-.. |Integral|                        unicode:: U+0222B .. INTEGRAL
-.. |intercal|                        unicode:: U+022BA .. INTERCALATE
-.. |Intersection|                    unicode:: U+022C2 .. N-ARY INTERSECTION
-.. |intprod|                         unicode:: U+02A3C .. INTERIOR PRODUCT
-.. |InvisibleComma|                  unicode:: U+02063 .. INVISIBLE SEPARATOR
-.. |InvisibleTimes|                  unicode:: U+02062 .. INVISIBLE TIMES
-.. |langle|                          unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
-.. |Laplacetrf|                      unicode:: U+02112 .. SCRIPT CAPITAL L
-.. |lbrace|                          unicode:: U+0007B .. LEFT CURLY BRACKET
-.. |lbrack|                          unicode:: U+0005B .. LEFT SQUARE BRACKET
-.. |LeftAngleBracket|                unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
-.. |LeftArrow|                       unicode:: U+02190 .. LEFTWARDS ARROW
-.. |Leftarrow|                       unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
-.. |leftarrow|                       unicode:: U+02190 .. LEFTWARDS ARROW
-.. |LeftArrowBar|                    unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
-.. |LeftArrowRightArrow|             unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
-.. |leftarrowtail|                   unicode:: U+021A2 .. LEFTWARDS ARROW WITH TAIL
-.. |LeftCeiling|                     unicode:: U+02308 .. LEFT CEILING
-.. |LeftDoubleBracket|               unicode:: U+0301A .. LEFT WHITE SQUARE BRACKET
-.. |LeftDownVector|                  unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
-.. |LeftFloor|                       unicode:: U+0230A .. LEFT FLOOR
-.. |leftharpoondown|                 unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
-.. |leftharpoonup|                   unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
-.. |leftleftarrows|                  unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
-.. |LeftRightArrow|                  unicode:: U+02194 .. LEFT RIGHT ARROW
-.. |Leftrightarrow|                  unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
-.. |leftrightarrow|                  unicode:: U+02194 .. LEFT RIGHT ARROW
-.. |leftrightarrows|                 unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
-.. |leftrightharpoons|               unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
-.. |leftrightsquigarrow|             unicode:: U+021AD .. LEFT RIGHT WAVE ARROW
-.. |LeftTee|                         unicode:: U+022A3 .. LEFT TACK
-.. |LeftTeeArrow|                    unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
-.. |leftthreetimes|                  unicode:: U+022CB .. LEFT SEMIDIRECT PRODUCT
-.. |LeftTriangle|                    unicode:: U+022B2 .. NORMAL SUBGROUP OF
-.. |LeftTriangleEqual|               unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
-.. |LeftUpVector|                    unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
-.. |LeftVector|                      unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
-.. |leq|                             unicode:: U+02264 .. LESS-THAN OR EQUAL TO
-.. |leqq|                            unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
-.. |leqslant|                        unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
-.. |lessapprox|                      unicode:: U+02A85 .. LESS-THAN OR APPROXIMATE
-.. |lessdot|                         unicode:: U+022D6 .. LESS-THAN WITH DOT
-.. |lesseqgtr|                       unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
-.. |lesseqqgtr|                      unicode:: U+02A8B .. LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
-.. |LessEqualGreater|                unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
-.. |LessFullEqual|                   unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
-.. |LessGreater|                     unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
-.. |lessgtr|                         unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
-.. |lesssim|                         unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
-.. |LessSlantEqual|                  unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
-.. |LessTilde|                       unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
-.. |ll|                              unicode:: U+0226A .. MUCH LESS-THAN
-.. |llcorner|                        unicode:: U+0231E .. BOTTOM LEFT CORNER
-.. |Lleftarrow|                      unicode:: U+021DA .. LEFTWARDS TRIPLE ARROW
-.. |lmoustache|                      unicode:: U+023B0 .. UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
-.. |lnapprox|                        unicode:: U+02A89 .. LESS-THAN AND NOT APPROXIMATE
-.. |lneq|                            unicode:: U+02A87 .. LESS-THAN AND SINGLE-LINE NOT EQUAL TO
-.. |lneqq|                           unicode:: U+02268 .. LESS-THAN BUT NOT EQUAL TO
-.. |LongLeftArrow|                   unicode:: U+027F5 .. LONG LEFTWARDS ARROW
-.. |Longleftarrow|                   unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
-.. |longleftarrow|                   unicode:: U+027F5 .. LONG LEFTWARDS ARROW
-.. |LongLeftRightArrow|              unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
-.. |Longleftrightarrow|              unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
-.. |longleftrightarrow|              unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
-.. |longmapsto|                      unicode:: U+027FC .. LONG RIGHTWARDS ARROW FROM BAR
-.. |LongRightArrow|                  unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
-.. |Longrightarrow|                  unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
-.. |longrightarrow|                  unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
-.. |looparrowleft|                   unicode:: U+021AB .. LEFTWARDS ARROW WITH LOOP
-.. |looparrowright|                  unicode:: U+021AC .. RIGHTWARDS ARROW WITH LOOP
-.. |LowerLeftArrow|                  unicode:: U+02199 .. SOUTH WEST ARROW
-.. |LowerRightArrow|                 unicode:: U+02198 .. SOUTH EAST ARROW
-.. |lozenge|                         unicode:: U+025CA .. LOZENGE
-.. |lrcorner|                        unicode:: U+0231F .. BOTTOM RIGHT CORNER
-.. |Lsh|                             unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
-.. |lvertneqq|                       unicode:: U+02268 U+0FE00 .. LESS-THAN BUT NOT EQUAL TO - with vertical stroke
-.. |maltese|                         unicode:: U+02720 .. MALTESE CROSS
-.. |mapsto|                          unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
-.. |measuredangle|                   unicode:: U+02221 .. MEASURED ANGLE
-.. |Mellintrf|                       unicode:: U+02133 .. SCRIPT CAPITAL M
-.. |MinusPlus|                       unicode:: U+02213 .. MINUS-OR-PLUS SIGN
-.. |mp|                              unicode:: U+02213 .. MINUS-OR-PLUS SIGN
-.. |multimap|                        unicode:: U+022B8 .. MULTIMAP
-.. |napprox|                         unicode:: U+02249 .. NOT ALMOST EQUAL TO
-.. |natural|                         unicode:: U+0266E .. MUSIC NATURAL SIGN
-.. |naturals|                        unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
-.. |nearrow|                         unicode:: U+02197 .. NORTH EAST ARROW
-.. |NegativeMediumSpace|             unicode:: U+0200B .. ZERO WIDTH SPACE
-.. |NegativeThickSpace|              unicode:: U+0200B .. ZERO WIDTH SPACE
-.. |NegativeThinSpace|               unicode:: U+0200B .. ZERO WIDTH SPACE
-.. |NegativeVeryThinSpace|           unicode:: U+0200B .. ZERO WIDTH SPACE
-.. |NestedGreaterGreater|            unicode:: U+0226B .. MUCH GREATER-THAN
-.. |NestedLessLess|                  unicode:: U+0226A .. MUCH LESS-THAN
-.. |nexists|                         unicode:: U+02204 .. THERE DOES NOT EXIST
-.. |ngeq|                            unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
-.. |ngeqq|                           unicode:: U+02267 U+00338 .. GREATER-THAN OVER EQUAL TO with slash
-.. |ngeqslant|                       unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
-.. |ngtr|                            unicode:: U+0226F .. NOT GREATER-THAN
-.. |nLeftarrow|                      unicode:: U+021CD .. LEFTWARDS DOUBLE ARROW WITH STROKE
-.. |nleftarrow|                      unicode:: U+0219A .. LEFTWARDS ARROW WITH STROKE
-.. |nLeftrightarrow|                 unicode:: U+021CE .. LEFT RIGHT DOUBLE ARROW WITH STROKE
-.. |nleftrightarrow|                 unicode:: U+021AE .. LEFT RIGHT ARROW WITH STROKE
-.. |nleq|                            unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
-.. |nleqq|                           unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
-.. |nleqslant|                       unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
-.. |nless|                           unicode:: U+0226E .. NOT LESS-THAN
-.. |NonBreakingSpace|                unicode:: U+000A0 .. NO-BREAK SPACE
-.. |NotCongruent|                    unicode:: U+02262 .. NOT IDENTICAL TO
-.. |NotDoubleVerticalBar|            unicode:: U+02226 .. NOT PARALLEL TO
-.. |NotElement|                      unicode:: U+02209 .. NOT AN ELEMENT OF
-.. |NotEqual|                        unicode:: U+02260 .. NOT EQUAL TO
-.. |NotEqualTilde|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
-.. |NotExists|                       unicode:: U+02204 .. THERE DOES NOT EXIST
-.. |NotGreater|                      unicode:: U+0226F .. NOT GREATER-THAN
-.. |NotGreaterEqual|                 unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
-.. |NotGreaterFullEqual|             unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
-.. |NotGreaterGreater|               unicode:: U+0226B U+00338 .. MUCH GREATER THAN with slash
-.. |NotGreaterLess|                  unicode:: U+02279 .. NEITHER GREATER-THAN NOR LESS-THAN
-.. |NotGreaterSlantEqual|            unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
-.. |NotGreaterTilde|                 unicode:: U+02275 .. NEITHER GREATER-THAN NOR EQUIVALENT TO
-.. |NotHumpDownHump|                 unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
-.. |NotLeftTriangle|                 unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
-.. |NotLeftTriangleEqual|            unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
-.. |NotLess|                         unicode:: U+0226E .. NOT LESS-THAN
-.. |NotLessEqual|                    unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
-.. |NotLessGreater|                  unicode:: U+02278 .. NEITHER LESS-THAN NOR GREATER-THAN
-.. |NotLessLess|                     unicode:: U+0226A U+00338 .. MUCH LESS THAN with slash
-.. |NotLessSlantEqual|               unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
-.. |NotLessTilde|                    unicode:: U+02274 .. NEITHER LESS-THAN NOR EQUIVALENT TO
-.. |NotPrecedes|                     unicode:: U+02280 .. DOES NOT PRECEDE
-.. |NotPrecedesEqual|                unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
-.. |NotPrecedesSlantEqual|           unicode:: U+022E0 .. DOES NOT PRECEDE OR EQUAL
-.. |NotReverseElement|               unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
-.. |NotRightTriangle|                unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
-.. |NotRightTriangleEqual|           unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
-.. |NotSquareSubsetEqual|            unicode:: U+022E2 .. NOT SQUARE IMAGE OF OR EQUAL TO
-.. |NotSquareSupersetEqual|          unicode:: U+022E3 .. NOT SQUARE ORIGINAL OF OR EQUAL TO
-.. |NotSubset|                       unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
-.. |NotSubsetEqual|                  unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
-.. |NotSucceeds|                     unicode:: U+02281 .. DOES NOT SUCCEED
-.. |NotSucceedsEqual|                unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
-.. |NotSucceedsSlantEqual|           unicode:: U+022E1 .. DOES NOT SUCCEED OR EQUAL
-.. |NotSuperset|                     unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
-.. |NotSupersetEqual|                unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
-.. |NotTilde|                        unicode:: U+02241 .. NOT TILDE
-.. |NotTildeEqual|                   unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
-.. |NotTildeFullEqual|               unicode:: U+02247 .. NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
-.. |NotTildeTilde|                   unicode:: U+02249 .. NOT ALMOST EQUAL TO
-.. |NotVerticalBar|                  unicode:: U+02224 .. DOES NOT DIVIDE
-.. |nparallel|                       unicode:: U+02226 .. NOT PARALLEL TO
-.. |nprec|                           unicode:: U+02280 .. DOES NOT PRECEDE
-.. |npreceq|                         unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
-.. |nRightarrow|                     unicode:: U+021CF .. RIGHTWARDS DOUBLE ARROW WITH STROKE
-.. |nrightarrow|                     unicode:: U+0219B .. RIGHTWARDS ARROW WITH STROKE
-.. |nshortmid|                       unicode:: U+02224 .. DOES NOT DIVIDE
-.. |nshortparallel|                  unicode:: U+02226 .. NOT PARALLEL TO
-.. |nsimeq|                          unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
-.. |nsubset|                         unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
-.. |nsubseteq|                       unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
-.. |nsubseteqq|                      unicode:: U+02AC5 U+00338 .. SUBSET OF ABOVE EQUALS SIGN with slash
-.. |nsucc|                           unicode:: U+02281 .. DOES NOT SUCCEED
-.. |nsucceq|                         unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
-.. |nsupset|                         unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
-.. |nsupseteq|                       unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
-.. |nsupseteqq|                      unicode:: U+02AC6 U+00338 .. SUPERSET OF ABOVE EQUALS SIGN with slash
-.. |ntriangleleft|                   unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
-.. |ntrianglelefteq|                 unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
-.. |ntriangleright|                  unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
-.. |ntrianglerighteq|                unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
-.. |nwarrow|                         unicode:: U+02196 .. NORTH WEST ARROW
-.. |oint|                            unicode:: U+0222E .. CONTOUR INTEGRAL
-.. |OpenCurlyDoubleQuote|            unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
-.. |OpenCurlyQuote|                  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
-.. |orderof|                         unicode:: U+02134 .. SCRIPT SMALL O
-.. |parallel|                        unicode:: U+02225 .. PARALLEL TO
-.. |PartialD|                        unicode:: U+02202 .. PARTIAL DIFFERENTIAL
-.. |pitchfork|                       unicode:: U+022D4 .. PITCHFORK
-.. |PlusMinus|                       unicode:: U+000B1 .. PLUS-MINUS SIGN
-.. |pm|                              unicode:: U+000B1 .. PLUS-MINUS SIGN
-.. |Poincareplane|                   unicode:: U+0210C .. BLACK-LETTER CAPITAL H
-.. |prec|                            unicode:: U+0227A .. PRECEDES
-.. |precapprox|                      unicode:: U+02AB7 .. PRECEDES ABOVE ALMOST EQUAL TO
-.. |preccurlyeq|                     unicode:: U+0227C .. PRECEDES OR EQUAL TO
-.. |Precedes|                        unicode:: U+0227A .. PRECEDES
-.. |PrecedesEqual|                   unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
-.. |PrecedesSlantEqual|              unicode:: U+0227C .. PRECEDES OR EQUAL TO
-.. |PrecedesTilde|                   unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
-.. |preceq|                          unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
-.. |precnapprox|                     unicode:: U+02AB9 .. PRECEDES ABOVE NOT ALMOST EQUAL TO
-.. |precneqq|                        unicode:: U+02AB5 .. PRECEDES ABOVE NOT EQUAL TO
-.. |precnsim|                        unicode:: U+022E8 .. PRECEDES BUT NOT EQUIVALENT TO
-.. |precsim|                         unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
-.. |primes|                          unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
-.. |Proportion|                      unicode:: U+02237 .. PROPORTION
-.. |Proportional|                    unicode:: U+0221D .. PROPORTIONAL TO
-.. |propto|                          unicode:: U+0221D .. PROPORTIONAL TO
-.. |quaternions|                     unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
-.. |questeq|                         unicode:: U+0225F .. QUESTIONED EQUAL TO
-.. |rangle|                          unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
-.. |rationals|                       unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
-.. |rbrace|                          unicode:: U+0007D .. RIGHT CURLY BRACKET
-.. |rbrack|                          unicode:: U+0005D .. RIGHT SQUARE BRACKET
-.. |Re|                              unicode:: U+0211C .. BLACK-LETTER CAPITAL R
-.. |realine|                         unicode:: U+0211B .. SCRIPT CAPITAL R
-.. |realpart|                        unicode:: U+0211C .. BLACK-LETTER CAPITAL R
-.. |reals|                           unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
-.. |ReverseElement|                  unicode:: U+0220B .. CONTAINS AS MEMBER
-.. |ReverseEquilibrium|              unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
-.. |ReverseUpEquilibrium|            unicode:: U+0296F .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
-.. |RightAngleBracket|               unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
-.. |RightArrow|                      unicode:: U+02192 .. RIGHTWARDS ARROW
-.. |Rightarrow|                      unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
-.. |rightarrow|                      unicode:: U+02192 .. RIGHTWARDS ARROW
-.. |RightArrowBar|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
-.. |RightArrowLeftArrow|             unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
-.. |rightarrowtail|                  unicode:: U+021A3 .. RIGHTWARDS ARROW WITH TAIL
-.. |RightCeiling|                    unicode:: U+02309 .. RIGHT CEILING
-.. |RightDoubleBracket|              unicode:: U+0301B .. RIGHT WHITE SQUARE BRACKET
-.. |RightDownVector|                 unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
-.. |RightFloor|                      unicode:: U+0230B .. RIGHT FLOOR
-.. |rightharpoondown|                unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
-.. |rightharpoonup|                  unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
-.. |rightleftarrows|                 unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
-.. |rightleftharpoons|               unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
-.. |rightrightarrows|                unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
-.. |rightsquigarrow|                 unicode:: U+0219D .. RIGHTWARDS WAVE ARROW
-.. |RightTee|                        unicode:: U+022A2 .. RIGHT TACK
-.. |RightTeeArrow|                   unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
-.. |rightthreetimes|                 unicode:: U+022CC .. RIGHT SEMIDIRECT PRODUCT
-.. |RightTriangle|                   unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
-.. |RightTriangleEqual|              unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
-.. |RightUpVector|                   unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
-.. |RightVector|                     unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
-.. |risingdotseq|                    unicode:: U+02253 .. IMAGE OF OR APPROXIMATELY EQUAL TO
-.. |rmoustache|                      unicode:: U+023B1 .. UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
-.. |Rrightarrow|                     unicode:: U+021DB .. RIGHTWARDS TRIPLE ARROW
-.. |Rsh|                             unicode:: U+021B1 .. UPWARDS ARROW WITH TIP RIGHTWARDS
-.. |searrow|                         unicode:: U+02198 .. SOUTH EAST ARROW
-.. |setminus|                        unicode:: U+02216 .. SET MINUS
-.. |ShortDownArrow|                  unicode:: U+02193 .. DOWNWARDS ARROW
-.. |ShortLeftArrow|                  unicode:: U+02190 .. LEFTWARDS ARROW
-.. |shortmid|                        unicode:: U+02223 .. DIVIDES
-.. |shortparallel|                   unicode:: U+02225 .. PARALLEL TO
-.. |ShortRightArrow|                 unicode:: U+02192 .. RIGHTWARDS ARROW
-.. |ShortUpArrow|                    unicode:: U+02191 .. UPWARDS ARROW
-.. |simeq|                           unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
-.. |SmallCircle|                     unicode:: U+02218 .. RING OPERATOR
-.. |smallsetminus|                   unicode:: U+02216 .. SET MINUS
-.. |spadesuit|                       unicode:: U+02660 .. BLACK SPADE SUIT
-.. |Sqrt|                            unicode:: U+0221A .. SQUARE ROOT
-.. |sqsubset|                        unicode:: U+0228F .. SQUARE IMAGE OF
-.. |sqsubseteq|                      unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
-.. |sqsupset|                        unicode:: U+02290 .. SQUARE ORIGINAL OF
-.. |sqsupseteq|                      unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
-.. |Square|                          unicode:: U+025A1 .. WHITE SQUARE
-.. |SquareIntersection|              unicode:: U+02293 .. SQUARE CAP
-.. |SquareSubset|                    unicode:: U+0228F .. SQUARE IMAGE OF
-.. |SquareSubsetEqual|               unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
-.. |SquareSuperset|                  unicode:: U+02290 .. SQUARE ORIGINAL OF
-.. |SquareSupersetEqual|             unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
-.. |SquareUnion|                     unicode:: U+02294 .. SQUARE CUP
-.. |Star|                            unicode:: U+022C6 .. STAR OPERATOR
-.. |straightepsilon|                 unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
-.. |straightphi|                     unicode:: U+003D5 .. GREEK PHI SYMBOL
-.. |Subset|                          unicode:: U+022D0 .. DOUBLE SUBSET
-.. |subset|                          unicode:: U+02282 .. SUBSET OF
-.. |subseteq|                        unicode:: U+02286 .. SUBSET OF OR EQUAL TO
-.. |subseteqq|                       unicode:: U+02AC5 .. SUBSET OF ABOVE EQUALS SIGN
-.. |SubsetEqual|                     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
-.. |subsetneq|                       unicode:: U+0228A .. SUBSET OF WITH NOT EQUAL TO
-.. |subsetneqq|                      unicode:: U+02ACB .. SUBSET OF ABOVE NOT EQUAL TO
-.. |succ|                            unicode:: U+0227B .. SUCCEEDS
-.. |succapprox|                      unicode:: U+02AB8 .. SUCCEEDS ABOVE ALMOST EQUAL TO
-.. |succcurlyeq|                     unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
-.. |Succeeds|                        unicode:: U+0227B .. SUCCEEDS
-.. |SucceedsEqual|                   unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
-.. |SucceedsSlantEqual|              unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
-.. |SucceedsTilde|                   unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
-.. |succeq|                          unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
-.. |succnapprox|                     unicode:: U+02ABA .. SUCCEEDS ABOVE NOT ALMOST EQUAL TO
-.. |succneqq|                        unicode:: U+02AB6 .. SUCCEEDS ABOVE NOT EQUAL TO
-.. |succnsim|                        unicode:: U+022E9 .. SUCCEEDS BUT NOT EQUIVALENT TO
-.. |succsim|                         unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
-.. |SuchThat|                        unicode:: U+0220B .. CONTAINS AS MEMBER
-.. |Sum|                             unicode:: U+02211 .. N-ARY SUMMATION
-.. |Superset|                        unicode:: U+02283 .. SUPERSET OF
-.. |SupersetEqual|                   unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
-.. |Supset|                          unicode:: U+022D1 .. DOUBLE SUPERSET
-.. |supset|                          unicode:: U+02283 .. SUPERSET OF
-.. |supseteq|                        unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
-.. |supseteqq|                       unicode:: U+02AC6 .. SUPERSET OF ABOVE EQUALS SIGN
-.. |supsetneq|                       unicode:: U+0228B .. SUPERSET OF WITH NOT EQUAL TO
-.. |supsetneqq|                      unicode:: U+02ACC .. SUPERSET OF ABOVE NOT EQUAL TO
-.. |swarrow|                         unicode:: U+02199 .. SOUTH WEST ARROW
-.. |Therefore|                       unicode:: U+02234 .. THEREFORE
-.. |therefore|                       unicode:: U+02234 .. THEREFORE
-.. |thickapprox|                     unicode:: U+02248 .. ALMOST EQUAL TO
-.. |thicksim|                        unicode:: U+0223C .. TILDE OPERATOR
-.. |ThinSpace|                       unicode:: U+02009 .. THIN SPACE
-.. |Tilde|                           unicode:: U+0223C .. TILDE OPERATOR
-.. |TildeEqual|                      unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
-.. |TildeFullEqual|                  unicode:: U+02245 .. APPROXIMATELY EQUAL TO
-.. |TildeTilde|                      unicode:: U+02248 .. ALMOST EQUAL TO
-.. |toea|                            unicode:: U+02928 .. NORTH EAST ARROW AND SOUTH EAST ARROW
-.. |tosa|                            unicode:: U+02929 .. SOUTH EAST ARROW AND SOUTH WEST ARROW
-.. |triangle|                        unicode:: U+025B5 .. WHITE UP-POINTING SMALL TRIANGLE
-.. |triangledown|                    unicode:: U+025BF .. WHITE DOWN-POINTING SMALL TRIANGLE
-.. |triangleleft|                    unicode:: U+025C3 .. WHITE LEFT-POINTING SMALL TRIANGLE
-.. |trianglelefteq|                  unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
-.. |triangleq|                       unicode:: U+0225C .. DELTA EQUAL TO
-.. |triangleright|                   unicode:: U+025B9 .. WHITE RIGHT-POINTING SMALL TRIANGLE
-.. |trianglerighteq|                 unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
-.. |TripleDot|                       unicode:: U+020DB .. COMBINING THREE DOTS ABOVE
-.. |twoheadleftarrow|                unicode:: U+0219E .. LEFTWARDS TWO HEADED ARROW
-.. |twoheadrightarrow|               unicode:: U+021A0 .. RIGHTWARDS TWO HEADED ARROW
-.. |ulcorner|                        unicode:: U+0231C .. TOP LEFT CORNER
-.. |Union|                           unicode:: U+022C3 .. N-ARY UNION
-.. |UnionPlus|                       unicode:: U+0228E .. MULTISET UNION
-.. |UpArrow|                         unicode:: U+02191 .. UPWARDS ARROW
-.. |Uparrow|                         unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
-.. |uparrow|                         unicode:: U+02191 .. UPWARDS ARROW
-.. |UpArrowDownArrow|                unicode:: U+021C5 .. UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
-.. |UpDownArrow|                     unicode:: U+02195 .. UP DOWN ARROW
-.. |Updownarrow|                     unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
-.. |updownarrow|                     unicode:: U+02195 .. UP DOWN ARROW
-.. |UpEquilibrium|                   unicode:: U+0296E .. UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
-.. |upharpoonleft|                   unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
-.. |upharpoonright|                  unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
-.. |UpperLeftArrow|                  unicode:: U+02196 .. NORTH WEST ARROW
-.. |UpperRightArrow|                 unicode:: U+02197 .. NORTH EAST ARROW
-.. |upsilon|                         unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
-.. |UpTee|                           unicode:: U+022A5 .. UP TACK
-.. |UpTeeArrow|                      unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
-.. |upuparrows|                      unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
-.. |urcorner|                        unicode:: U+0231D .. TOP RIGHT CORNER
-.. |varepsilon|                      unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
-.. |varkappa|                        unicode:: U+003F0 .. GREEK KAPPA SYMBOL
-.. |varnothing|                      unicode:: U+02205 .. EMPTY SET
-.. |varphi|                          unicode:: U+003C6 .. GREEK SMALL LETTER PHI
-.. |varpi|                           unicode:: U+003D6 .. GREEK PI SYMBOL
-.. |varpropto|                       unicode:: U+0221D .. PROPORTIONAL TO
-.. |varrho|                          unicode:: U+003F1 .. GREEK RHO SYMBOL
-.. |varsigma|                        unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
-.. |varsubsetneq|                    unicode:: U+0228A U+0FE00 .. SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
-.. |varsubsetneqq|                   unicode:: U+02ACB U+0FE00 .. SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
-.. |varsupsetneq|                    unicode:: U+0228B U+0FE00 .. SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
-.. |varsupsetneqq|                   unicode:: U+02ACC U+0FE00 .. SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
-.. |vartheta|                        unicode:: U+003D1 .. GREEK THETA SYMBOL
-.. |vartriangleleft|                 unicode:: U+022B2 .. NORMAL SUBGROUP OF
-.. |vartriangleright|                unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
-.. |Vee|                             unicode:: U+022C1 .. N-ARY LOGICAL OR
-.. |vee|                             unicode:: U+02228 .. LOGICAL OR
-.. |Vert|                            unicode:: U+02016 .. DOUBLE VERTICAL LINE
-.. |vert|                            unicode:: U+0007C .. VERTICAL LINE
-.. |VerticalBar|                     unicode:: U+02223 .. DIVIDES
-.. |VerticalTilde|                   unicode:: U+02240 .. WREATH PRODUCT
-.. |VeryThinSpace|                   unicode:: U+0200A .. HAIR SPACE
-.. |Wedge|                           unicode:: U+022C0 .. N-ARY LOGICAL AND
-.. |wedge|                           unicode:: U+02227 .. LOGICAL AND
-.. |wp|                              unicode:: U+02118 .. SCRIPT CAPITAL P
-.. |wr|                              unicode:: U+02240 .. WREATH PRODUCT
-.. |zeetrf|                          unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlextra-wide.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |af|                      unicode:: U+02061 .. FUNCTION APPLICATION
-.. |aopf|                    unicode:: U+1D552 .. MATHEMATICAL DOUBLE-STRUCK SMALL A
-.. |asympeq|                 unicode:: U+0224D .. EQUIVALENT TO
-.. |bopf|                    unicode:: U+1D553 .. MATHEMATICAL DOUBLE-STRUCK SMALL B
-.. |copf|                    unicode:: U+1D554 .. MATHEMATICAL DOUBLE-STRUCK SMALL C
-.. |Cross|                   unicode:: U+02A2F .. VECTOR OR CROSS PRODUCT
-.. |DD|                      unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
-.. |dd|                      unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
-.. |dopf|                    unicode:: U+1D555 .. MATHEMATICAL DOUBLE-STRUCK SMALL D
-.. |DownArrowBar|            unicode:: U+02913 .. DOWNWARDS ARROW TO BAR
-.. |DownBreve|               unicode:: U+00311 .. COMBINING INVERTED BREVE
-.. |DownLeftRightVector|     unicode:: U+02950 .. LEFT BARB DOWN RIGHT BARB DOWN HARPOON
-.. |DownLeftTeeVector|       unicode:: U+0295E .. LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
-.. |DownLeftVectorBar|       unicode:: U+02956 .. LEFTWARDS HARPOON WITH BARB DOWN TO BAR
-.. |DownRightTeeVector|      unicode:: U+0295F .. RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
-.. |DownRightVectorBar|      unicode:: U+02957 .. RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
-.. |ee|                      unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
-.. |EmptySmallSquare|        unicode:: U+025FB .. WHITE MEDIUM SQUARE
-.. |EmptyVerySmallSquare|    unicode:: U+025AB .. WHITE SMALL SQUARE
-.. |eopf|                    unicode:: U+1D556 .. MATHEMATICAL DOUBLE-STRUCK SMALL E
-.. |Equal|                   unicode:: U+02A75 .. TWO CONSECUTIVE EQUALS SIGNS
-.. |FilledSmallSquare|       unicode:: U+025FC .. BLACK MEDIUM SQUARE
-.. |FilledVerySmallSquare|   unicode:: U+025AA .. BLACK SMALL SQUARE
-.. |fopf|                    unicode:: U+1D557 .. MATHEMATICAL DOUBLE-STRUCK SMALL F
-.. |gopf|                    unicode:: U+1D558 .. MATHEMATICAL DOUBLE-STRUCK SMALL G
-.. |GreaterGreater|          unicode:: U+02AA2 .. DOUBLE NESTED GREATER-THAN
-.. |Hat|                     unicode:: U+0005E .. CIRCUMFLEX ACCENT
-.. |hopf|                    unicode:: U+1D559 .. MATHEMATICAL DOUBLE-STRUCK SMALL H
-.. |HorizontalLine|          unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
-.. |ic|                      unicode:: U+02063 .. INVISIBLE SEPARATOR
-.. |ii|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
-.. |iopf|                    unicode:: U+1D55A .. MATHEMATICAL DOUBLE-STRUCK SMALL I
-.. |it|                      unicode:: U+02062 .. INVISIBLE TIMES
-.. |jopf|                    unicode:: U+1D55B .. MATHEMATICAL DOUBLE-STRUCK SMALL J
-.. |kopf|                    unicode:: U+1D55C .. MATHEMATICAL DOUBLE-STRUCK SMALL K
-.. |larrb|                   unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
-.. |LeftDownTeeVector|       unicode:: U+02961 .. DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
-.. |LeftDownVectorBar|       unicode:: U+02959 .. DOWNWARDS HARPOON WITH BARB LEFT TO BAR
-.. |LeftRightVector|         unicode:: U+0294E .. LEFT BARB UP RIGHT BARB UP HARPOON
-.. |LeftTeeVector|           unicode:: U+0295A .. LEFTWARDS HARPOON WITH BARB UP FROM BAR
-.. |LeftTriangleBar|         unicode:: U+029CF .. LEFT TRIANGLE BESIDE VERTICAL BAR
-.. |LeftUpDownVector|        unicode:: U+02951 .. UP BARB LEFT DOWN BARB LEFT HARPOON
-.. |LeftUpTeeVector|         unicode:: U+02960 .. UPWARDS HARPOON WITH BARB LEFT FROM BAR
-.. |LeftUpVectorBar|         unicode:: U+02958 .. UPWARDS HARPOON WITH BARB LEFT TO BAR
-.. |LeftVectorBar|           unicode:: U+02952 .. LEFTWARDS HARPOON WITH BARB UP TO BAR
-.. |LessLess|                unicode:: U+02AA1 .. DOUBLE NESTED LESS-THAN
-.. |lopf|                    unicode:: U+1D55D .. MATHEMATICAL DOUBLE-STRUCK SMALL L
-.. |mapstodown|              unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
-.. |mapstoleft|              unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
-.. |mapstoup|                unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
-.. |MediumSpace|             unicode:: U+0205F .. MEDIUM MATHEMATICAL SPACE
-.. |mopf|                    unicode:: U+1D55E .. MATHEMATICAL DOUBLE-STRUCK SMALL M
-.. |nbump|                   unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
-.. |nbumpe|                  unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
-.. |nesim|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
-.. |NewLine|                 unicode:: U+0000A .. LINE FEED (LF)
-.. |NoBreak|                 unicode:: U+02060 .. WORD JOINER
-.. |nopf|                    unicode:: U+1D55F .. MATHEMATICAL DOUBLE-STRUCK SMALL N
-.. |NotCupCap|               unicode:: U+0226D .. NOT EQUIVALENT TO
-.. |NotHumpEqual|            unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
-.. |NotLeftTriangleBar|      unicode:: U+029CF U+00338 .. LEFT TRIANGLE BESIDE VERTICAL BAR with slash
-.. |NotNestedGreaterGreater| unicode:: U+02AA2 U+00338 .. DOUBLE NESTED GREATER-THAN with slash
-.. |NotNestedLessLess|       unicode:: U+02AA1 U+00338 .. DOUBLE NESTED LESS-THAN with slash
-.. |NotRightTriangleBar|     unicode:: U+029D0 U+00338 .. VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
-.. |NotSquareSubset|         unicode:: U+0228F U+00338 .. SQUARE IMAGE OF with slash
-.. |NotSquareSuperset|       unicode:: U+02290 U+00338 .. SQUARE ORIGINAL OF with slash
-.. |NotSucceedsTilde|        unicode:: U+0227F U+00338 .. SUCCEEDS OR EQUIVALENT TO with slash
-.. |oopf|                    unicode:: U+1D560 .. MATHEMATICAL DOUBLE-STRUCK SMALL O
-.. |OverBar|                 unicode:: U+000AF .. MACRON
-.. |OverBrace|               unicode:: U+0FE37 .. PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
-.. |OverBracket|             unicode:: U+023B4 .. TOP SQUARE BRACKET
-.. |OverParenthesis|         unicode:: U+0FE35 .. PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
-.. |planckh|                 unicode:: U+0210E .. PLANCK CONSTANT
-.. |popf|                    unicode:: U+1D561 .. MATHEMATICAL DOUBLE-STRUCK SMALL P
-.. |Product|                 unicode:: U+0220F .. N-ARY PRODUCT
-.. |qopf|                    unicode:: U+1D562 .. MATHEMATICAL DOUBLE-STRUCK SMALL Q
-.. |rarrb|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
-.. |RightDownTeeVector|      unicode:: U+0295D .. DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
-.. |RightDownVectorBar|      unicode:: U+02955 .. DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
-.. |RightTeeVector|          unicode:: U+0295B .. RIGHTWARDS HARPOON WITH BARB UP FROM BAR
-.. |RightTriangleBar|        unicode:: U+029D0 .. VERTICAL BAR BESIDE RIGHT TRIANGLE
-.. |RightUpDownVector|       unicode:: U+0294F .. UP BARB RIGHT DOWN BARB RIGHT HARPOON
-.. |RightUpTeeVector|        unicode:: U+0295C .. UPWARDS HARPOON WITH BARB RIGHT FROM BAR
-.. |RightUpVectorBar|        unicode:: U+02954 .. UPWARDS HARPOON WITH BARB RIGHT TO BAR
-.. |RightVectorBar|          unicode:: U+02953 .. RIGHTWARDS HARPOON WITH BARB UP TO BAR
-.. |ropf|                    unicode:: U+1D563 .. MATHEMATICAL DOUBLE-STRUCK SMALL R
-.. |RoundImplies|            unicode:: U+02970 .. RIGHT DOUBLE ARROW WITH ROUNDED HEAD
-.. |RuleDelayed|             unicode:: U+029F4 .. RULE-DELAYED
-.. |sopf|                    unicode:: U+1D564 .. MATHEMATICAL DOUBLE-STRUCK SMALL S
-.. |Tab|                     unicode:: U+00009 .. CHARACTER TABULATION
-.. |ThickSpace|              unicode:: U+02009 U+0200A U+0200A .. space of width 5/18 em
-.. |topf|                    unicode:: U+1D565 .. MATHEMATICAL DOUBLE-STRUCK SMALL T
-.. |UnderBar|                unicode:: U+00332 .. COMBINING LOW LINE
-.. |UnderBrace|              unicode:: U+0FE38 .. PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
-.. |UnderBracket|            unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
-.. |UnderParenthesis|        unicode:: U+0FE36 .. PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
-.. |uopf|                    unicode:: U+1D566 .. MATHEMATICAL DOUBLE-STRUCK SMALL U
-.. |UpArrowBar|              unicode:: U+02912 .. UPWARDS ARROW TO BAR
-.. |Upsilon|                 unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
-.. |VerticalLine|            unicode:: U+0007C .. VERTICAL LINE
-.. |VerticalSeparator|       unicode:: U+02758 .. LIGHT VERTICAL BAR
-.. |vopf|                    unicode:: U+1D567 .. MATHEMATICAL DOUBLE-STRUCK SMALL V
-.. |wopf|                    unicode:: U+1D568 .. MATHEMATICAL DOUBLE-STRUCK SMALL W
-.. |xopf|                    unicode:: U+1D569 .. MATHEMATICAL DOUBLE-STRUCK SMALL X
-.. |yopf|                    unicode:: U+1D56A .. MATHEMATICAL DOUBLE-STRUCK SMALL Y
-.. |ZeroWidthSpace|          unicode:: U+0200B .. ZERO WIDTH SPACE
-.. |zopf|                    unicode:: U+1D56B .. MATHEMATICAL DOUBLE-STRUCK SMALL Z
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlextra.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |af|                      unicode:: U+02061 .. FUNCTION APPLICATION
-.. |asympeq|                 unicode:: U+0224D .. EQUIVALENT TO
-.. |Cross|                   unicode:: U+02A2F .. VECTOR OR CROSS PRODUCT
-.. |DD|                      unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
-.. |dd|                      unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
-.. |DownArrowBar|            unicode:: U+02913 .. DOWNWARDS ARROW TO BAR
-.. |DownBreve|               unicode:: U+00311 .. COMBINING INVERTED BREVE
-.. |DownLeftRightVector|     unicode:: U+02950 .. LEFT BARB DOWN RIGHT BARB DOWN HARPOON
-.. |DownLeftTeeVector|       unicode:: U+0295E .. LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
-.. |DownLeftVectorBar|       unicode:: U+02956 .. LEFTWARDS HARPOON WITH BARB DOWN TO BAR
-.. |DownRightTeeVector|      unicode:: U+0295F .. RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
-.. |DownRightVectorBar|      unicode:: U+02957 .. RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
-.. |ee|                      unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
-.. |EmptySmallSquare|        unicode:: U+025FB .. WHITE MEDIUM SQUARE
-.. |EmptyVerySmallSquare|    unicode:: U+025AB .. WHITE SMALL SQUARE
-.. |Equal|                   unicode:: U+02A75 .. TWO CONSECUTIVE EQUALS SIGNS
-.. |FilledSmallSquare|       unicode:: U+025FC .. BLACK MEDIUM SQUARE
-.. |FilledVerySmallSquare|   unicode:: U+025AA .. BLACK SMALL SQUARE
-.. |GreaterGreater|          unicode:: U+02AA2 .. DOUBLE NESTED GREATER-THAN
-.. |Hat|                     unicode:: U+0005E .. CIRCUMFLEX ACCENT
-.. |HorizontalLine|          unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
-.. |ic|                      unicode:: U+02063 .. INVISIBLE SEPARATOR
-.. |ii|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
-.. |it|                      unicode:: U+02062 .. INVISIBLE TIMES
-.. |larrb|                   unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
-.. |LeftDownTeeVector|       unicode:: U+02961 .. DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
-.. |LeftDownVectorBar|       unicode:: U+02959 .. DOWNWARDS HARPOON WITH BARB LEFT TO BAR
-.. |LeftRightVector|         unicode:: U+0294E .. LEFT BARB UP RIGHT BARB UP HARPOON
-.. |LeftTeeVector|           unicode:: U+0295A .. LEFTWARDS HARPOON WITH BARB UP FROM BAR
-.. |LeftTriangleBar|         unicode:: U+029CF .. LEFT TRIANGLE BESIDE VERTICAL BAR
-.. |LeftUpDownVector|        unicode:: U+02951 .. UP BARB LEFT DOWN BARB LEFT HARPOON
-.. |LeftUpTeeVector|         unicode:: U+02960 .. UPWARDS HARPOON WITH BARB LEFT FROM BAR
-.. |LeftUpVectorBar|         unicode:: U+02958 .. UPWARDS HARPOON WITH BARB LEFT TO BAR
-.. |LeftVectorBar|           unicode:: U+02952 .. LEFTWARDS HARPOON WITH BARB UP TO BAR
-.. |LessLess|                unicode:: U+02AA1 .. DOUBLE NESTED LESS-THAN
-.. |mapstodown|              unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
-.. |mapstoleft|              unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
-.. |mapstoup|                unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
-.. |MediumSpace|             unicode:: U+0205F .. MEDIUM MATHEMATICAL SPACE
-.. |nbump|                   unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
-.. |nbumpe|                  unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
-.. |nesim|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
-.. |NewLine|                 unicode:: U+0000A .. LINE FEED (LF)
-.. |NoBreak|                 unicode:: U+02060 .. WORD JOINER
-.. |NotCupCap|               unicode:: U+0226D .. NOT EQUIVALENT TO
-.. |NotHumpEqual|            unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
-.. |NotLeftTriangleBar|      unicode:: U+029CF U+00338 .. LEFT TRIANGLE BESIDE VERTICAL BAR with slash
-.. |NotNestedGreaterGreater| unicode:: U+02AA2 U+00338 .. DOUBLE NESTED GREATER-THAN with slash
-.. |NotNestedLessLess|       unicode:: U+02AA1 U+00338 .. DOUBLE NESTED LESS-THAN with slash
-.. |NotRightTriangleBar|     unicode:: U+029D0 U+00338 .. VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
-.. |NotSquareSubset|         unicode:: U+0228F U+00338 .. SQUARE IMAGE OF with slash
-.. |NotSquareSuperset|       unicode:: U+02290 U+00338 .. SQUARE ORIGINAL OF with slash
-.. |NotSucceedsTilde|        unicode:: U+0227F U+00338 .. SUCCEEDS OR EQUIVALENT TO with slash
-.. |OverBar|                 unicode:: U+000AF .. MACRON
-.. |OverBrace|               unicode:: U+0FE37 .. PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
-.. |OverBracket|             unicode:: U+023B4 .. TOP SQUARE BRACKET
-.. |OverParenthesis|         unicode:: U+0FE35 .. PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
-.. |planckh|                 unicode:: U+0210E .. PLANCK CONSTANT
-.. |Product|                 unicode:: U+0220F .. N-ARY PRODUCT
-.. |rarrb|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
-.. |RightDownTeeVector|      unicode:: U+0295D .. DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
-.. |RightDownVectorBar|      unicode:: U+02955 .. DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
-.. |RightTeeVector|          unicode:: U+0295B .. RIGHTWARDS HARPOON WITH BARB UP FROM BAR
-.. |RightTriangleBar|        unicode:: U+029D0 .. VERTICAL BAR BESIDE RIGHT TRIANGLE
-.. |RightUpDownVector|       unicode:: U+0294F .. UP BARB RIGHT DOWN BARB RIGHT HARPOON
-.. |RightUpTeeVector|        unicode:: U+0295C .. UPWARDS HARPOON WITH BARB RIGHT FROM BAR
-.. |RightUpVectorBar|        unicode:: U+02954 .. UPWARDS HARPOON WITH BARB RIGHT TO BAR
-.. |RightVectorBar|          unicode:: U+02953 .. RIGHTWARDS HARPOON WITH BARB UP TO BAR
-.. |RoundImplies|            unicode:: U+02970 .. RIGHT DOUBLE ARROW WITH ROUNDED HEAD
-.. |RuleDelayed|             unicode:: U+029F4 .. RULE-DELAYED
-.. |Tab|                     unicode:: U+00009 .. CHARACTER TABULATION
-.. |ThickSpace|              unicode:: U+02009 U+0200A U+0200A .. space of width 5/18 em
-.. |UnderBar|                unicode:: U+00332 .. COMBINING LOW LINE
-.. |UnderBrace|              unicode:: U+0FE38 .. PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
-.. |UnderBracket|            unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
-.. |UnderParenthesis|        unicode:: U+0FE36 .. PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
-.. |UpArrowBar|              unicode:: U+02912 .. UPWARDS ARROW TO BAR
-.. |Upsilon|                 unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
-.. |VerticalLine|            unicode:: U+0007C .. VERTICAL LINE
-.. |VerticalSeparator|       unicode:: U+02758 .. LIGHT VERTICAL BAR
-.. |ZeroWidthSpace|          unicode:: U+0200B .. ZERO WIDTH SPACE
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/s5defs.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-.. Definitions of interpreted text roles (classes) for S5/HTML data.
-.. This data file has been placed in the public domain.
-
-.. Colours
-   =======
-
-.. role:: black
-.. role:: gray
-.. role:: silver
-.. role:: white
-
-.. role:: maroon
-.. role:: red
-.. role:: magenta
-.. role:: fuchsia
-.. role:: pink
-.. role:: orange
-.. role:: yellow
-.. role:: lime
-.. role:: green
-.. role:: olive
-.. role:: teal
-.. role:: cyan
-.. role:: aqua
-.. role:: blue
-.. role:: navy
-.. role:: purple
-
-
-.. Text Sizes
-   ==========
-
-.. role:: huge
-.. role:: big
-.. role:: small
-.. role:: tiny
-
-
-.. Display in Slides (Presentation Mode) Only
-   ==========================================
-
-.. role:: slide
-   :class: slide-display
-
-
-.. Display in Outline Mode Only
-   ============================
-
-.. role:: outline
-
-
-.. Display in Print Only
-   =====================
-
-.. role:: print
-
-
-.. Display in Handout Mode Only
-   ============================
-
-.. role:: handout
-
-
-.. Incremental Display
-   ===================
-
-.. role:: incremental
-.. default-role:: incremental
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-lat1.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |Aacute| unicode:: U+000C1 .. LATIN CAPITAL LETTER A WITH ACUTE
-.. |aacute| unicode:: U+000E1 .. LATIN SMALL LETTER A WITH ACUTE
-.. |Acirc|  unicode:: U+000C2 .. LATIN CAPITAL LETTER A WITH CIRCUMFLEX
-.. |acirc|  unicode:: U+000E2 .. LATIN SMALL LETTER A WITH CIRCUMFLEX
-.. |acute|  unicode:: U+000B4 .. ACUTE ACCENT
-.. |AElig|  unicode:: U+000C6 .. LATIN CAPITAL LETTER AE
-.. |aelig|  unicode:: U+000E6 .. LATIN SMALL LETTER AE
-.. |Agrave| unicode:: U+000C0 .. LATIN CAPITAL LETTER A WITH GRAVE
-.. |agrave| unicode:: U+000E0 .. LATIN SMALL LETTER A WITH GRAVE
-.. |Aring|  unicode:: U+000C5 .. LATIN CAPITAL LETTER A WITH RING ABOVE
-.. |aring|  unicode:: U+000E5 .. LATIN SMALL LETTER A WITH RING ABOVE
-.. |Atilde| unicode:: U+000C3 .. LATIN CAPITAL LETTER A WITH TILDE
-.. |atilde| unicode:: U+000E3 .. LATIN SMALL LETTER A WITH TILDE
-.. |Auml|   unicode:: U+000C4 .. LATIN CAPITAL LETTER A WITH DIAERESIS
-.. |auml|   unicode:: U+000E4 .. LATIN SMALL LETTER A WITH DIAERESIS
-.. |brvbar| unicode:: U+000A6 .. BROKEN BAR
-.. |Ccedil| unicode:: U+000C7 .. LATIN CAPITAL LETTER C WITH CEDILLA
-.. |ccedil| unicode:: U+000E7 .. LATIN SMALL LETTER C WITH CEDILLA
-.. |cedil|  unicode:: U+000B8 .. CEDILLA
-.. |cent|   unicode:: U+000A2 .. CENT SIGN
-.. |copy|   unicode:: U+000A9 .. COPYRIGHT SIGN
-.. |curren| unicode:: U+000A4 .. CURRENCY SIGN
-.. |deg|    unicode:: U+000B0 .. DEGREE SIGN
-.. |divide| unicode:: U+000F7 .. DIVISION SIGN
-.. |Eacute| unicode:: U+000C9 .. LATIN CAPITAL LETTER E WITH ACUTE
-.. |eacute| unicode:: U+000E9 .. LATIN SMALL LETTER E WITH ACUTE
-.. |Ecirc|  unicode:: U+000CA .. LATIN CAPITAL LETTER E WITH CIRCUMFLEX
-.. |ecirc|  unicode:: U+000EA .. LATIN SMALL LETTER E WITH CIRCUMFLEX
-.. |Egrave| unicode:: U+000C8 .. LATIN CAPITAL LETTER E WITH GRAVE
-.. |egrave| unicode:: U+000E8 .. LATIN SMALL LETTER E WITH GRAVE
-.. |ETH|    unicode:: U+000D0 .. LATIN CAPITAL LETTER ETH
-.. |eth|    unicode:: U+000F0 .. LATIN SMALL LETTER ETH
-.. |Euml|   unicode:: U+000CB .. LATIN CAPITAL LETTER E WITH DIAERESIS
-.. |euml|   unicode:: U+000EB .. LATIN SMALL LETTER E WITH DIAERESIS
-.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF
-.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER
-.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS
-.. |Iacute| unicode:: U+000CD .. LATIN CAPITAL LETTER I WITH ACUTE
-.. |iacute| unicode:: U+000ED .. LATIN SMALL LETTER I WITH ACUTE
-.. |Icirc|  unicode:: U+000CE .. LATIN CAPITAL LETTER I WITH CIRCUMFLEX
-.. |icirc|  unicode:: U+000EE .. LATIN SMALL LETTER I WITH CIRCUMFLEX
-.. |iexcl|  unicode:: U+000A1 .. INVERTED EXCLAMATION MARK
-.. |Igrave| unicode:: U+000CC .. LATIN CAPITAL LETTER I WITH GRAVE
-.. |igrave| unicode:: U+000EC .. LATIN SMALL LETTER I WITH GRAVE
-.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK
-.. |Iuml|   unicode:: U+000CF .. LATIN CAPITAL LETTER I WITH DIAERESIS
-.. |iuml|   unicode:: U+000EF .. LATIN SMALL LETTER I WITH DIAERESIS
-.. |laquo|  unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-.. |macr|   unicode:: U+000AF .. MACRON
-.. |micro|  unicode:: U+000B5 .. MICRO SIGN
-.. |middot| unicode:: U+000B7 .. MIDDLE DOT
-.. |nbsp|   unicode:: U+000A0 .. NO-BREAK SPACE
-.. |not|    unicode:: U+000AC .. NOT SIGN
-.. |Ntilde| unicode:: U+000D1 .. LATIN CAPITAL LETTER N WITH TILDE
-.. |ntilde| unicode:: U+000F1 .. LATIN SMALL LETTER N WITH TILDE
-.. |Oacute| unicode:: U+000D3 .. LATIN CAPITAL LETTER O WITH ACUTE
-.. |oacute| unicode:: U+000F3 .. LATIN SMALL LETTER O WITH ACUTE
-.. |Ocirc|  unicode:: U+000D4 .. LATIN CAPITAL LETTER O WITH CIRCUMFLEX
-.. |ocirc|  unicode:: U+000F4 .. LATIN SMALL LETTER O WITH CIRCUMFLEX
-.. |Ograve| unicode:: U+000D2 .. LATIN CAPITAL LETTER O WITH GRAVE
-.. |ograve| unicode:: U+000F2 .. LATIN SMALL LETTER O WITH GRAVE
-.. |ordf|   unicode:: U+000AA .. FEMININE ORDINAL INDICATOR
-.. |ordm|   unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR
-.. |Oslash| unicode:: U+000D8 .. LATIN CAPITAL LETTER O WITH STROKE
-.. |oslash| unicode:: U+000F8 .. LATIN SMALL LETTER O WITH STROKE
-.. |Otilde| unicode:: U+000D5 .. LATIN CAPITAL LETTER O WITH TILDE
-.. |otilde| unicode:: U+000F5 .. LATIN SMALL LETTER O WITH TILDE
-.. |Ouml|   unicode:: U+000D6 .. LATIN CAPITAL LETTER O WITH DIAERESIS
-.. |ouml|   unicode:: U+000F6 .. LATIN SMALL LETTER O WITH DIAERESIS
-.. |para|   unicode:: U+000B6 .. PILCROW SIGN
-.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN
-.. |pound|  unicode:: U+000A3 .. POUND SIGN
-.. |raquo|  unicode:: U+000BB .. RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-.. |reg|    unicode:: U+000AE .. REGISTERED SIGN
-.. |sect|   unicode:: U+000A7 .. SECTION SIGN
-.. |shy|    unicode:: U+000AD .. SOFT HYPHEN
-.. |sup1|   unicode:: U+000B9 .. SUPERSCRIPT ONE
-.. |sup2|   unicode:: U+000B2 .. SUPERSCRIPT TWO
-.. |sup3|   unicode:: U+000B3 .. SUPERSCRIPT THREE
-.. |szlig|  unicode:: U+000DF .. LATIN SMALL LETTER SHARP S
-.. |THORN|  unicode:: U+000DE .. LATIN CAPITAL LETTER THORN
-.. |thorn|  unicode:: U+000FE .. LATIN SMALL LETTER THORN
-.. |times|  unicode:: U+000D7 .. MULTIPLICATION SIGN
-.. |Uacute| unicode:: U+000DA .. LATIN CAPITAL LETTER U WITH ACUTE
-.. |uacute| unicode:: U+000FA .. LATIN SMALL LETTER U WITH ACUTE
-.. |Ucirc|  unicode:: U+000DB .. LATIN CAPITAL LETTER U WITH CIRCUMFLEX
-.. |ucirc|  unicode:: U+000FB .. LATIN SMALL LETTER U WITH CIRCUMFLEX
-.. |Ugrave| unicode:: U+000D9 .. LATIN CAPITAL LETTER U WITH GRAVE
-.. |ugrave| unicode:: U+000F9 .. LATIN SMALL LETTER U WITH GRAVE
-.. |uml|    unicode:: U+000A8 .. DIAERESIS
-.. |Uuml|   unicode:: U+000DC .. LATIN CAPITAL LETTER U WITH DIAERESIS
-.. |uuml|   unicode:: U+000FC .. LATIN SMALL LETTER U WITH DIAERESIS
-.. |Yacute| unicode:: U+000DD .. LATIN CAPITAL LETTER Y WITH ACUTE
-.. |yacute| unicode:: U+000FD .. LATIN SMALL LETTER Y WITH ACUTE
-.. |yen|    unicode:: U+000A5 .. YEN SIGN
-.. |yuml|   unicode:: U+000FF .. LATIN SMALL LETTER Y WITH DIAERESIS
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-special.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |bdquo|  unicode:: U+0201E .. DOUBLE LOW-9 QUOTATION MARK
-.. |circ|   unicode:: U+002C6 .. MODIFIER LETTER CIRCUMFLEX ACCENT
-.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER
-.. |dagger| unicode:: U+02020 .. DAGGER
-.. |emsp|   unicode:: U+02003 .. EM SPACE
-.. |ensp|   unicode:: U+02002 .. EN SPACE
-.. |euro|   unicode:: U+020AC .. EURO SIGN
-.. |gt|     unicode:: U+0003E .. GREATER-THAN SIGN
-.. |ldquo|  unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
-.. |lrm|    unicode:: U+0200E .. LEFT-TO-RIGHT MARK
-.. |lsaquo| unicode:: U+02039 .. SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-.. |lsquo|  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
-.. |lt|     unicode:: U+0003C .. LESS-THAN SIGN
-.. |mdash|  unicode:: U+02014 .. EM DASH
-.. |ndash|  unicode:: U+02013 .. EN DASH
-.. |OElig|  unicode:: U+00152 .. LATIN CAPITAL LIGATURE OE
-.. |oelig|  unicode:: U+00153 .. LATIN SMALL LIGATURE OE
-.. |permil| unicode:: U+02030 .. PER MILLE SIGN
-.. |quot|   unicode:: U+00022 .. QUOTATION MARK
-.. |rdquo|  unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
-.. |rlm|    unicode:: U+0200F .. RIGHT-TO-LEFT MARK
-.. |rsaquo| unicode:: U+0203A .. SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-.. |rsquo|  unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
-.. |sbquo|  unicode:: U+0201A .. SINGLE LOW-9 QUOTATION MARK
-.. |Scaron| unicode:: U+00160 .. LATIN CAPITAL LETTER S WITH CARON
-.. |scaron| unicode:: U+00161 .. LATIN SMALL LETTER S WITH CARON
-.. |thinsp| unicode:: U+02009 .. THIN SPACE
-.. |tilde|  unicode:: U+002DC .. SMALL TILDE
-.. |Yuml|   unicode:: U+00178 .. LATIN CAPITAL LETTER Y WITH DIAERESIS
-.. |zwj|    unicode:: U+0200D .. ZERO WIDTH JOINER
-.. |zwnj|   unicode:: U+0200C .. ZERO WIDTH NON-JOINER
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-symbol.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,130 +0,0 @@
-.. This data file has been placed in the public domain.
-.. Derived from the Unicode character mappings available from
-   <http://www.w3.org/2003/entities/xml/>.
-   Processed by unicode2rstsubs.py, part of Docutils:
-   <http://docutils.sourceforge.net>.
-
-.. |alefsym|  unicode:: U+02135 .. ALEF SYMBOL
-.. |Alpha|    unicode:: U+00391 .. GREEK CAPITAL LETTER ALPHA
-.. |alpha|    unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
-.. |and|      unicode:: U+02227 .. LOGICAL AND
-.. |ang|      unicode:: U+02220 .. ANGLE
-.. |asymp|    unicode:: U+02248 .. ALMOST EQUAL TO
-.. |Beta|     unicode:: U+00392 .. GREEK CAPITAL LETTER BETA
-.. |beta|     unicode:: U+003B2 .. GREEK SMALL LETTER BETA
-.. |bull|     unicode:: U+02022 .. BULLET
-.. |cap|      unicode:: U+02229 .. INTERSECTION
-.. |Chi|      unicode:: U+003A7 .. GREEK CAPITAL LETTER CHI
-.. |chi|      unicode:: U+003C7 .. GREEK SMALL LETTER CHI
-.. |clubs|    unicode:: U+02663 .. BLACK CLUB SUIT
-.. |cong|     unicode:: U+02245 .. APPROXIMATELY EQUAL TO
-.. |crarr|    unicode:: U+021B5 .. DOWNWARDS ARROW WITH CORNER LEFTWARDS
-.. |cup|      unicode:: U+0222A .. UNION
-.. |dArr|     unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
-.. |darr|     unicode:: U+02193 .. DOWNWARDS ARROW
-.. |Delta|    unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
-.. |delta|    unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
-.. |diams|    unicode:: U+02666 .. BLACK DIAMOND SUIT
-.. |empty|    unicode:: U+02205 .. EMPTY SET
-.. |Epsilon|  unicode:: U+00395 .. GREEK CAPITAL LETTER EPSILON
-.. |epsilon|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
-.. |equiv|    unicode:: U+02261 .. IDENTICAL TO
-.. |Eta|      unicode:: U+00397 .. GREEK CAPITAL LETTER ETA
-.. |eta|      unicode:: U+003B7 .. GREEK SMALL LETTER ETA
-.. |exist|    unicode:: U+02203 .. THERE EXISTS
-.. |fnof|     unicode:: U+00192 .. LATIN SMALL LETTER F WITH HOOK
-.. |forall|   unicode:: U+02200 .. FOR ALL
-.. |frasl|    unicode:: U+02044 .. FRACTION SLASH
-.. |Gamma|    unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
-.. |gamma|    unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
-.. |ge|       unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
-.. |hArr|     unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
-.. |harr|     unicode:: U+02194 .. LEFT RIGHT ARROW
-.. |hearts|   unicode:: U+02665 .. BLACK HEART SUIT
-.. |hellip|   unicode:: U+02026 .. HORIZONTAL ELLIPSIS
-.. |image|    unicode:: U+02111 .. BLACK-LETTER CAPITAL I
-.. |infin|    unicode:: U+0221E .. INFINITY
-.. |int|      unicode:: U+0222B .. INTEGRAL
-.. |Iota|     unicode:: U+00399 .. GREEK CAPITAL LETTER IOTA
-.. |iota|     unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
-.. |isin|     unicode:: U+02208 .. ELEMENT OF
-.. |Kappa|    unicode:: U+0039A .. GREEK CAPITAL LETTER KAPPA
-.. |kappa|    unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
-.. |Lambda|   unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
-.. |lambda|   unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
-.. |lang|     unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
-.. |lArr|     unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
-.. |larr|     unicode:: U+02190 .. LEFTWARDS ARROW
-.. |lceil|    unicode:: U+02308 .. LEFT CEILING
-.. |le|       unicode:: U+02264 .. LESS-THAN OR EQUAL TO
-.. |lfloor|   unicode:: U+0230A .. LEFT FLOOR
-.. |lowast|   unicode:: U+02217 .. ASTERISK OPERATOR
-.. |loz|      unicode:: U+025CA .. LOZENGE
-.. |minus|    unicode:: U+02212 .. MINUS SIGN
-.. |Mu|       unicode:: U+0039C .. GREEK CAPITAL LETTER MU
-.. |mu|       unicode:: U+003BC .. GREEK SMALL LETTER MU
-.. |nabla|    unicode:: U+02207 .. NABLA
-.. |ne|       unicode:: U+02260 .. NOT EQUAL TO
-.. |ni|       unicode:: U+0220B .. CONTAINS AS MEMBER
-.. |notin|    unicode:: U+02209 .. NOT AN ELEMENT OF
-.. |nsub|     unicode:: U+02284 .. NOT A SUBSET OF
-.. |Nu|       unicode:: U+0039D .. GREEK CAPITAL LETTER NU
-.. |nu|       unicode:: U+003BD .. GREEK SMALL LETTER NU
-.. |oline|    unicode:: U+0203E .. OVERLINE
-.. |Omega|    unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
-.. |omega|    unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
-.. |Omicron|  unicode:: U+0039F .. GREEK CAPITAL LETTER OMICRON
-.. |omicron|  unicode:: U+003BF .. GREEK SMALL LETTER OMICRON
-.. |oplus|    unicode:: U+02295 .. CIRCLED PLUS
-.. |or|       unicode:: U+02228 .. LOGICAL OR
-.. |otimes|   unicode:: U+02297 .. CIRCLED TIMES
-.. |part|     unicode:: U+02202 .. PARTIAL DIFFERENTIAL
-.. |perp|     unicode:: U+022A5 .. UP TACK
-.. |Phi|      unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
-.. |phi|      unicode:: U+003D5 .. GREEK PHI SYMBOL
-.. |Pi|       unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
-.. |pi|       unicode:: U+003C0 .. GREEK SMALL LETTER PI
-.. |piv|      unicode:: U+003D6 .. GREEK PI SYMBOL
-.. |Prime|    unicode:: U+02033 .. DOUBLE PRIME
-.. |prime|    unicode:: U+02032 .. PRIME
-.. |prod|     unicode:: U+0220F .. N-ARY PRODUCT
-.. |prop|     unicode:: U+0221D .. PROPORTIONAL TO
-.. |Psi|      unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
-.. |psi|      unicode:: U+003C8 .. GREEK SMALL LETTER PSI
-.. |radic|    unicode:: U+0221A .. SQUARE ROOT
-.. |rang|     unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
-.. |rArr|     unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
-.. |rarr|     unicode:: U+02192 .. RIGHTWARDS ARROW
-.. |rceil|    unicode:: U+02309 .. RIGHT CEILING
-.. |real|     unicode:: U+0211C .. BLACK-LETTER CAPITAL R
-.. |rfloor|   unicode:: U+0230B .. RIGHT FLOOR
-.. |Rho|      unicode:: U+003A1 .. GREEK CAPITAL LETTER RHO
-.. |rho|      unicode:: U+003C1 .. GREEK SMALL LETTER RHO
-.. |sdot|     unicode:: U+022C5 .. DOT OPERATOR
-.. |Sigma|    unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
-.. |sigma|    unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
-.. |sigmaf|   unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
-.. |sim|      unicode:: U+0223C .. TILDE OPERATOR
-.. |spades|   unicode:: U+02660 .. BLACK SPADE SUIT
-.. |sub|      unicode:: U+02282 .. SUBSET OF
-.. |sube|     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
-.. |sum|      unicode:: U+02211 .. N-ARY SUMMATION
-.. |sup|      unicode:: U+02283 .. SUPERSET OF
-.. |supe|     unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
-.. |Tau|      unicode:: U+003A4 .. GREEK CAPITAL LETTER TAU
-.. |tau|      unicode:: U+003C4 .. GREEK SMALL LETTER TAU
-.. |there4|   unicode:: U+02234 .. THEREFORE
-.. |Theta|    unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
-.. |theta|    unicode:: U+003B8 .. GREEK SMALL LETTER THETA
-.. |thetasym| unicode:: U+003D1 .. GREEK THETA SYMBOL
-.. |trade|    unicode:: U+02122 .. TRADE MARK SIGN
-.. |uArr|     unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
-.. |uarr|     unicode:: U+02191 .. UPWARDS ARROW
-.. |upsih|    unicode:: U+003D2 .. GREEK UPSILON WITH HOOK SYMBOL
-.. |Upsilon|  unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
-.. |upsilon|  unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
-.. |weierp|   unicode:: U+02118 .. SCRIPT CAPITAL P
-.. |Xi|       unicode:: U+0039E .. GREEK CAPITAL LETTER XI
-.. |xi|       unicode:: U+003BE .. GREEK SMALL LETTER XI
-.. |Zeta|     unicode:: U+00396 .. GREEK CAPITAL LETTER ZETA
-.. |zeta|     unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-# Internationalization details are documented in
-# <http://docutils.sf.net/docs/howto/i18n.html>.
-
-"""
-This package contains modules for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-_languages = {}
-
-def get_language(language_code):
-    if _languages.has_key(language_code):
-        return _languages[language_code]
-    try:
-        module = __import__(language_code, globals(), locals())
-    except ImportError:
-        return None
-    _languages[language_code] = module
-    return module
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/af.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-# $Id: af.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Jannie Hofmeyr <jhsh@sun.ac.za>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Afrikaans-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      'aandag': 'attention',
-      'versigtig': 'caution',
-      'gevaar': 'danger',
-      'fout': 'error',
-      'wenk': 'hint',
-      'belangrik': 'important',
-      'nota': 'note',
-      'tip': 'tip', # hint and tip both have the same translation: wenk
-      'waarskuwing': 'warning',
-      'vermaning': 'admonition',
-      'kantstreep': 'sidebar',
-      'onderwerp': 'topic',
-      'lynblok': 'line-block',
-      'parsed-literal (translation required)': 'parsed-literal',
-      'rubriek': 'rubric',
-      'epigraaf': 'epigraph',
-      'hoogtepunte': 'highlights',
-      'pull-quote (translation required)': 'pull-quote',
-      u'compound (translation required)': 'compound',
-      u'container (translation required)': 'container',
-      #'vrae': 'questions',
-      #'qa': 'questions',
-      #'faq': 'questions',
-      'table (translation required)': 'table',
-      'csv-table (translation required)': 'csv-table',
-      'list-table (translation required)': 'list-table',
-      'meta': 'meta',
-      #'beeldkaart': 'imagemap',
-      'beeld': 'image',
-      'figuur': 'figure',
-      'insluiting': 'include',
-      'rou': 'raw',
-      'vervang': 'replace',
-      'unicode': 'unicode', # should this be translated? unikode
-      'datum': 'date',
-      'klas': 'class',
-      'role (translation required)': 'role',
-      'default-role (translation required)': 'default-role',
-      'title (translation required)': 'title',
-      'inhoud': 'contents',
-      'sectnum': 'sectnum',
-      'section-numbering': 'sectnum',
-      u'header (translation required)': 'header',
-      u'footer (translation required)': 'footer',
-      #'voetnote': 'footnotes',
-      #'aanhalings': 'citations',
-      'teikennotas': 'target-notes',
-      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""Afrikaans name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
-    'afkorting': 'abbreviation',
-    'ab': 'abbreviation',
-    'akroniem': 'acronym',
-    'ac': 'acronym',
-    'indeks': 'index',
-    'i': 'index',
-    'voetskrif': 'subscript',
-    'sub': 'subscript',
-    'boskrif': 'superscript',
-    'sup': 'superscript',
-    'titelverwysing': 'title-reference',
-    'titel': 'title-reference',
-    't': 'title-reference',
-    'pep-verwysing': 'pep-reference',
-    'pep': 'pep-reference',
-    'rfc-verwysing': 'rfc-reference',
-    'rfc': 'rfc-reference',
-    'nadruk': 'emphasis',
-    'sterk': 'strong',
-    'literal (translation required)': 'literal',
-    'benoemde verwysing': 'named-reference',
-    'anonieme verwysing': 'anonymous-reference',
-    'voetnootverwysing': 'footnote-reference',
-    'aanhalingverwysing': 'citation-reference',
-    'vervangingsverwysing': 'substitution-reference',
-    'teiken': 'target',
-    'uri-verwysing': 'uri-reference',
-    'uri': 'uri-reference',
-    'url': 'uri-reference',
-    'rou': 'raw',}
-"""Mapping of Afrikaans role names to canonical role names for interpreted text.
-"""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ca.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,121 +0,0 @@
-# $Id: ca.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Ivan Vilata i Balaguer <ivan@selidor.net>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Catalan-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      # language-dependent: fixed
-      u'atenci\u00F3': 'attention',
-      u'compte': 'caution',
-      u'perill': 'danger',
-      u'error': 'error',
-      u'suggeriment': 'hint',
-      u'important': 'important',
-      u'nota': 'note',
-      u'consell': 'tip',
-      u'av\u00EDs': 'warning',
-      u'advertiment': 'admonition',
-      u'nota-al-marge': 'sidebar',
-      u'nota-marge': 'sidebar',
-      u'tema': 'topic',
-      u'bloc-de-l\u00EDnies': 'line-block',
-      u'bloc-l\u00EDnies': 'line-block',
-      u'literal-analitzat': 'parsed-literal',
-      u'r\u00FAbrica': 'rubric',
-      u'ep\u00EDgraf': 'epigraph',
-      u'sumari': 'highlights',
-      u'cita-destacada': 'pull-quote',
-      u'compost': 'compound',
-      u'container (translation required)': 'container',
-      #'questions': 'questions',
-      u'taula': 'table',
-      u'taula-csv': 'csv-table',
-      u'taula-llista': 'list-table',
-      #'qa': 'questions',
-      #'faq': 'questions',
-      u'meta': 'meta',
-      #'imagemap': 'imagemap',
-      u'imatge': 'image',
-      u'figura': 'figure',
-      u'inclou': 'include',
-      u'incloure': 'include',
-      u'cru': 'raw',
-      u'reempla\u00E7a': 'replace',
-      u'reempla\u00E7ar': 'replace',
-      u'unicode': 'unicode',
-      u'data': 'date',
-      u'classe': 'class',
-      u'rol': 'role',
-      u'default-role (translation required)': 'default-role',
-      u'title (translation required)': 'title',
-      u'contingut': 'contents',
-      u'numsec': 'sectnum',
-      u'numeraci\u00F3-de-seccions': 'sectnum',
-      u'numeraci\u00F3-seccions': 'sectnum',
-      u'cap\u00E7alera': 'header',
-      u'peu-de-p\u00E0gina': 'footer',
-      u'peu-p\u00E0gina': 'footer',
-      #'footnotes': 'footnotes',
-      #'citations': 'citations',
-      u'notes-amb-destinacions': 'target-notes',
-      u'notes-destinacions': 'target-notes',
-      u'directiva-de-prova-de-restructuredtext': 'restructuredtext-test-directive'}
-"""Catalan name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
-    # language-dependent: fixed
-    u'abreviatura': 'abbreviation',
-    u'abreviaci\u00F3': 'abbreviation',
-    u'abrev': 'abbreviation',
-    u'ab': 'abbreviation',
-    u'acr\u00F2nim': 'acronym',
-    u'ac': 'acronym',
-    u'\u00EDndex': 'index',
-    u'i': 'index',
-    u'sub\u00EDndex': 'subscript',
-    u'sub': 'subscript',
-    u'super\u00EDndex': 'superscript',
-    u'sup': 'superscript',
-    u'refer\u00E8ncia-a-t\u00EDtol': 'title-reference',
-    u'refer\u00E8ncia-t\u00EDtol': 'title-reference',
-    u't\u00EDtol': 'title-reference',
-    u't': 'title-reference',
-    u'refer\u00E8ncia-a-pep': 'pep-reference',
-    u'refer\u00E8ncia-pep': 'pep-reference',
-    u'pep': 'pep-reference',
-    u'refer\u00E8ncia-a-rfc': 'rfc-reference',
-    u'refer\u00E8ncia-rfc': 'rfc-reference',
-    u'rfc': 'rfc-reference',
-    u'\u00E8mfasi': 'emphasis',
-    u'destacat': 'strong',
-    u'literal': 'literal',
-    u'refer\u00E8ncia-amb-nom': 'named-reference',
-    u'refer\u00E8ncia-nom': 'named-reference',
-    u'refer\u00E8ncia-an\u00F2nima': 'anonymous-reference',
-    u'refer\u00E8ncia-a-nota-al-peu': 'footnote-reference',
-    u'refer\u00E8ncia-nota-al-peu': 'footnote-reference',
-    u'refer\u00E8ncia-a-cita': 'citation-reference',
-    u'refer\u00E8ncia-cita': 'citation-reference',
-    u'refer\u00E8ncia-a-substituci\u00F3': 'substitution-reference',
-    u'refer\u00E8ncia-substituci\u00F3': 'substitution-reference',
-    u'destinaci\u00F3': 'target',
-    u'refer\u00E8ncia-a-uri': 'uri-reference',
-    u'refer\u00E8ncia-uri': 'uri-reference',
-    u'uri': 'uri-reference',
-    u'url': 'uri-reference',
-    u'cru': 'raw',}
-"""Mapping of Catalan role names to canonical role names for interpreted text.
-"""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/cs.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-# $Id: cs.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Marek Blaha <mb@dat.cz>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Czech-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      # language-dependent: fixed
-      u'pozor': 'attention',
-      u'caution (translation required)': 'caution', # jak rozlisit caution a warning?
-      u'nebezpe\u010D\u00ED': 'danger',
-      u'chyba': 'error',
-      u'rada': 'hint',
-      u'd\u016Fle\u017Eit\u00E9': 'important',
-      u'pozn\u00E1mka': 'note',
-      u'tip (translation required)': 'tip',
-      u'varov\u00E1n\u00ED': 'warning',
-      u'admonition (translation required)': 'admonition',
-      u'sidebar (translation required)': 'sidebar',
-      u't\u00E9ma': 'topic',
-      u'line-block (translation required)': 'line-block',
-      u'parsed-literal (translation required)': 'parsed-literal',
-      u'odd\u00EDl': 'rubric',
-      u'moto': 'epigraph',
-      u'highlights (translation required)': 'highlights',
-      u'pull-quote (translation required)': 'pull-quote',
-      u'compound (translation required)': 'compound',
-      u'container (translation required)': 'container',
-      #'questions': 'questions',
-      #'qa': 'questions',
-      #'faq': 'questions',
-      u'table (translation required)': 'table',
-      u'csv-table (translation required)': 'csv-table',
-      u'list-table (translation required)': 'list-table',
-      u'meta (translation required)': 'meta',
-      #'imagemap': 'imagemap',
-      u'image (translation required)': 'image',   # obrazek
-      u'figure (translation required)': 'figure', # a tady?
-      u'include (translation required)': 'include',
-      u'raw (translation required)': 'raw',
-      u'replace (translation required)': 'replace',
-      u'unicode (translation required)': 'unicode',
-      u'datum': 'date',
-      u't\u0159\u00EDda': 'class',
-      u'role (translation required)': 'role',
-      u'default-role (translation required)': 'default-role',
-      u'title (translation required)': 'title',
-      u'obsah': 'contents',
-      u'sectnum (translation required)': 'sectnum',
-      u'section-numbering (translation required)': 'sectnum',
-      u'header (translation required)': 'header',
-      u'footer (translation required)': 'footer',
-      #'footnotes': 'footnotes',
-      #'citations': 'citations',
-      u'target-notes (translation required)': 'target-notes',
-      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""Czech name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
-    # language-dependent: fixed
-    u'abbreviation (translation required)': 'abbreviation',
-    u'ab (translation required)': 'abbreviation',
-    u'acronym (translation required)': 'acronym',
-    u'ac (translation required)': 'acronym',
-    u'index (translation required)': 'index',
-    u'i (translation required)': 'index',
-    u'subscript (translation required)': 'subscript',
-    u'sub (translation required)': 'subscript',
-    u'superscript (translation required)': 'superscript',
-    u'sup (translation required)': 'superscript',
-    u'title-reference (translation required)': 'title-reference',
-    u'title (translation required)': 'title-reference',
-    u't (translation required)': 'title-reference',
-    u'pep-reference (translation required)': 'pep-reference',
-    u'pep (translation required)': 'pep-reference',
-    u'rfc-reference (translation required)': 'rfc-reference',
-    u'rfc (translation required)': 'rfc-reference',
-    u'emphasis (translation required)': 'emphasis',
-    u'strong (translation required)': 'strong',
-    u'literal (translation required)': 'literal',
-    u'named-reference (translation required)': 'named-reference',
-    u'anonymous-reference (translation required)': 'anonymous-reference',
-    u'footnote-reference (translation required)': 'footnote-reference',
-    u'citation-reference (translation required)': 'citation-reference',
-    u'substitution-reference (translation required)': 'substitution-reference',
-    u'target (translation required)': 'target',
-    u'uri-reference (translation required)': 'uri-reference',
-    u'uri (translation required)': 'uri-reference',
-    u'url (translation required)': 'uri-reference',
-    u'raw (translation required)': 'raw',}
-"""Mapping of Czech role names to canonical role names for interpreted text.
-"""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/de.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-# $Id: de.py 5174 2007-05-31 00:01:52Z wiemann $
-# Authors: Engelbert Gruber <grubert@users.sourceforge.net>;
-#          Lea Wiemann <LeWiemann@gmail.com>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-German-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      'achtung': 'attention',
-      'vorsicht': 'caution',
-      'gefahr': 'danger',
-      'fehler': 'error',
-      'hinweis': 'hint',
-      'wichtig': 'important',
-      'notiz': 'note',
-      'tipp': 'tip',
-      'warnung': 'warning',
-      'ermahnung': 'admonition',
-      'kasten': 'sidebar',
-      'seitenkasten': 'sidebar',
-      'thema': 'topic',
-      'zeilen-block': 'line-block',
-      'parsed-literal (translation required)': 'parsed-literal',
-      'rubrik': 'rubric',
-      'epigraph': 'epigraph',
-      'highlights (translation required)': 'highlights',
-      'pull-quote (translation required)': 'pull-quote', # kasten too ?
-      'zusammengesetzt': 'compound',
-      'verbund': 'compound',
-      u'container (translation required)': 'container',
-      #'fragen': 'questions',
-      'tabelle': 'table',
-      'csv-tabelle': 'csv-table',
-      'list-table (translation required)': 'list-table',
-      'meta': 'meta',
-      #'imagemap': 'imagemap',
-      'bild': 'image',
-      'abbildung': 'figure',
-      u'unver\xe4ndert': 'raw',
-      u'roh': 'raw',
-      u'einf\xfcgen': 'include',
-      'ersetzung': 'replace',
-      'ersetzen': 'replace',
-      'ersetze': 'replace',
-      'unicode': 'unicode',
-      'datum': 'date',
-      'klasse': 'class',
-      'rolle': 'role',
-      u'default-role (translation required)': 'default-role',
-      u'title (translation required)': 'title',
-      'inhalt': 'contents',
-      'kapitel-nummerierung': 'sectnum',
-      'abschnitts-nummerierung': 'sectnum',
-      u'linkziel-fu\xdfnoten': 'target-notes',
-      u'header (translation required)': 'header',
-      u'footer (translation required)': 'footer',
-      #u'fu\xdfnoten': 'footnotes',
-      #'zitate': 'citations',
-      }
-"""German name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
-      u'abk\xfcrzung': 'abbreviation',
-      'akronym': 'acronym',
-      'index': 'index',
-      'tiefgestellt': 'subscript',
-      'hochgestellt': 'superscript',
-      'titel-referenz': 'title-reference',
-      'pep-referenz': 'pep-reference',
-      'rfc-referenz': 'rfc-reference',
-      'betonung': 'emphasis',
-      'fett': 'strong',
-      u'w\xf6rtlich': 'literal',
-      'benannte-referenz': 'named-reference',
-      'unbenannte-referenz': 'anonymous-reference',
-      u'fu\xdfnoten-referenz': 'footnote-reference',
-      'zitat-referenz': 'citation-reference',
-      'ersetzungs-referenz': 'substitution-reference',
-      'ziel': 'target',
-      'uri-referenz': 'uri-reference',
-      u'unver\xe4ndert': 'raw',
-      u'roh': 'raw',}
-"""Mapping of German role names to canonical role names for interpreted text.
-"""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/en.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-# $Id: en.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-English-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      # language-dependent: fixed
-      'attention': 'attention',
-      'caution': 'caution',
-      'danger': 'danger',
-      'error': 'error',
-      'hint': 'hint',
-      'important': 'important',
-      'note': 'note',
-      'tip': 'tip',
-      'warning': 'warning',
-      'admonition': 'admonition',
-      'sidebar': 'sidebar',
-      'topic': 'topic',
-      'line-block': 'line-block',
-      'parsed-literal': 'parsed-literal',
-      'rubric': 'rubric',
-      'epigraph': 'epigraph',
-      'highlights': 'highlights',
-      'pull-quote': 'pull-quote',
-      'compound': 'compound',
-      'container': 'container',
-      #'questions': 'questions',
-      'table': 'table',
-      'csv-table': 'csv-table',
-      'list-table': 'list-table',
-      #'qa': 'questions',
-      #'faq': 'questions',
-      'meta': 'meta',
-      #'imagemap': 'imagemap',
-      'image': 'image',
-      'figure': 'figure',
-      'include': 'include',
-      'raw': 'raw',
-      'replace': 'replace',
-      'unicode': 'unicode',
-      'date': 'date',
-      'class': 'class',
-      'role': 'role',
-      'default-role': 'default-role',
-      'title': 'title',
-      'contents': 'contents',
-      'sectnum': 'sectnum',
-      'section-numbering': 'sectnum',
-      'header': 'header',
-      'footer': 'footer',
-      #'footnotes': 'footnotes',
-      #'citations': 'citations',
-      'target-notes': 'target-notes',
-      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""English name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
-    # language-dependent: fixed
-    'abbreviation': 'abbreviation',
-    'ab': 'abbreviation',
-    'acronym': 'acronym',
-    'ac': 'acronym',
-    'index': 'index',
-    'i': 'index',
-    'subscript': 'subscript',
-    'sub': 'subscript',
-    'superscript': 'superscript',
-    'sup': 'superscript',
-    'title-reference': 'title-reference',
-    'title': 'title-reference',
-    't': 'title-reference',
-    'pep-reference': 'pep-reference',
-    'pep': 'pep-reference',
-    'rfc-reference': 'rfc-reference',
-    'rfc': 'rfc-reference',
-    'emphasis': 'emphasis',
-    'strong': 'strong',
-    'literal': 'literal',
-    'named-reference': 'named-reference',
-    'anonymous-reference': 'anonymous-reference',
-    'footnote-reference': 'footnote-reference',
-    'citation-reference': 'citation-reference',
-    'substitution-reference': 'substitution-reference',
-    'target': 'target',
-    'uri-reference': 'uri-reference',
-    'uri': 'uri-reference',
-    'url': 'uri-reference',
-    'raw': 'raw',}
-"""Mapping of English role names to canonical role names for interpreted text.
-"""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/eo.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-# $Id: eo.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Marcelo Huerta San Martin <richieadler@users.sourceforge.net>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Esperanto-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      # language-dependent: fixed
-      u'atentu': 'attention',
-      u'zorgu': 'caution',
-      u'dangxero': 'danger',
-      u'dan\u011dero': 'danger',
-      u'eraro': 'error',
-      u'spuro': 'hint',
-      u'grava': 'important',
-      u'noto': 'note',
-      u'helpeto': 'tip',
-      u'averto': 'warning',
-      u'admono': 'admonition',
-      u'flankteksto': 'sidebar',
-      u'temo': 'topic',
-      u'linea-bloko': 'line-block',
-      u'analizota-literalo': 'parsed-literal',
-      u'rubriko': 'rubric',
-      u'epigrafo': 'epigraph',
-      u'elstarajxoj': 'highlights',
-      u'elstara\u0135oj': 'highlights',
-      u'ekstera-citajxo': 'pull-quote',
-      u'ekstera-cita\u0135o': 'pull-quote',
-      u'kombinajxo': 'compound',
-      u'kombina\u0135o': 'compound',
-      u'tekstingo': 'container',
-      u'enhavilo': 'container',
-      #'questions': 'questions',
-      #'qa': 'questions',
-      #'faq': 'questions',
-      u'tabelo': 'table',
-      u'tabelo-vdk': 'csv-table', # "valoroj disigitaj per komoj"
-      u'tabelo-csv': 'csv-table',
-      u'tabelo-lista': 'list-table',
-      u'meta': 'meta',
-      #'imagemap': 'imagemap',
-      u'bildo': 'image',
-      u'figuro': 'figure',
-      u'inkludi': 'include',
-      u'senanaliza': 'raw',
-      u'anstatauxi': 'replace',
-      u'anstata\u016di': 'replace',
-      u'unicode': 'unicode',
-      u'dato': 'date',
-      u'klaso': 'class',
-      u'rolo': 'role',
-      u'preterlasita-rolo': 'default-role',
-      u'titolo': 'title',
-      u'enhavo': 'contents',
-      u'seknum': 'sectnum',
-      u'sekcia-numerado': 'sectnum',
-      u'kapsekcio': 'header',
-      u'piedsekcio': 'footer',
-      #'footnotes': 'footnotes',
-      #'citations': 'citations',
-      u'celaj-notoj': 'target-notes',
-      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""Esperanto name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
-    # language-dependent: fixed
-    u'mallongigo': 'abbreviation',
-    u'mall': 'abbreviation',
-    u'komenclitero': 'acronym',
-    u'kl': 'acronym',
-    u'indekso': 'index',
-    u'i': 'index',
-    u'subskribo': 'subscript',
-    u'sub': 'subscript',
-    u'supraskribo': 'superscript',
-    u'sup': 'superscript',
-    u'titola-referenco': 'title-reference',
-    u'titolo': 'title-reference',
-    u't': 'title-reference',
-    u'pep-referenco': 'pep-reference',
-    u'pep': 'pep-reference',
-    u'rfc-referenco': 'rfc-reference',
-    u'rfc': 'rfc-reference',
-    u'emfazo': 'emphasis',
-    u'forta': 'strong',
-    u'litera': 'literal',
-    u'nomita-referenco': 'named-reference',
-    u'nenomita-referenco': 'anonymous-reference',
-    u'piednota-referenco': 'footnote-reference',
-    u'citajxo-referenco': 'citation-reference',
-    u'cita\u0135o-referenco': 'citation-reference',
-    u'anstatauxa-referenco': 'substitution-reference',
-    u'anstata\u016da-referenco': 'substitution-reference',
-    u'celo': 'target',
-    u'uri-referenco': 'uri-reference',
-    u'uri': 'uri-reference',
-    u'url': 'uri-reference',
-    u'senanaliza': 'raw',
-}
-"""Mapping of Esperanto role names to canonical role names for interpreted text.
-"""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/es.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,121 +0,0 @@
-# -*- coding: utf-8 -*-
-# $Id: es.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Marcelo Huerta San Martín <richieadler@users.sourceforge.net>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Spanish-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      u'atenci\u00f3n': 'attention',
-      u'atencion': 'attention',
-      u'precauci\u00f3n': 'caution',
-      u'precaucion': 'caution',
-      u'peligro': 'danger',
-      u'error': 'error',
-      u'sugerencia': 'hint',
-      u'importante': 'important',
-      u'nota': 'note',
-      u'consejo': 'tip',
-      u'advertencia': 'warning',
-      u'exhortacion': 'admonition',
-      u'exhortaci\u00f3n': 'admonition',
-      u'nota-al-margen': 'sidebar',
-      u'tema': 'topic',
-      u'bloque-de-lineas': 'line-block',
-      u'bloque-de-l\u00edneas': 'line-block',
-      u'literal-evaluado': 'parsed-literal',
-      u'firma': 'rubric',
-      u'ep\u00edgrafe': 'epigraph',
-      u'epigrafe': 'epigraph',
-      u'destacado': 'highlights',
-      u'cita-destacada': 'pull-quote',
-      u'combinacion': 'compound',
-      u'combinaci\u00f3n': 'compound',
-      u'contenedor': 'container',
-      #'questions': 'questions',
-      #'qa': 'questions',
-      #'faq': 'questions',
-      u'tabla': 'table',
-      u'tabla-vsc': 'csv-table',
-      u'tabla-csv': 'csv-table',
-      u'tabla-lista': 'list-table',
-      u'meta': 'meta',
-      #'imagemap': 'imagemap',
-      u'imagen': 'image',
-      u'figura': 'figure',
-      u'incluir': 'include',
-      u'sin-analisis': 'raw',
-      u'sin-an\u00e1lisis': 'raw',
-      u'reemplazar': 'replace',
-      u'unicode': 'unicode',
-      u'fecha': 'date',
-      u'clase': 'class',
-      u'rol': 'role',
-      u'rol-por-omision': 'default-role',
-      u'rol-por-omisi\u00f3n': 'default-role',
-      u'titulo': 'title',
-      u't\u00edtulo': 'title',
-      u'contenido': 'contents',
-      u'numseccion': 'sectnum',
-      u'numsecci\u00f3n': 'sectnum',
-      u'numeracion-seccion': 'sectnum',
-      u'numeraci\u00f3n-secci\u00f3n': 'sectnum',
-      u'notas-destino': 'target-notes',
-      u'cabecera': 'header',
-      u'pie': 'footer',
-      #'footnotes': 'footnotes',
-      #'citations': 'citations',
-      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""Spanish name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
-    u'abreviatura': 'abbreviation',
-    u'ab': 'abbreviation',
-    u'acronimo': 'acronym',
-    u'acronimo': 'acronym',
-    u'ac': 'acronym',
-    u'indice': 'index',
-    u'i': 'index',
-    u'subindice': 'subscript',
-    u'sub\u00edndice': 'subscript',
-    u'superindice': 'superscript',
-    u'super\u00edndice': 'superscript',
-    u'referencia-titulo': 'title-reference',
-    u'titulo': 'title-reference',
-    u't': 'title-reference',
-    u'referencia-pep': 'pep-reference',
-    u'pep': 'pep-reference',
-    u'referencia-rfc': 'rfc-reference',
-    u'rfc': 'rfc-reference',
-    u'enfasis': 'emphasis',
-    u'\u00e9nfasis': 'emphasis',
-    u'destacado': 'strong',
-    u'literal': 'literal',              # "literal" is also a word in Spanish :-)
-    u'referencia-con-nombre': 'named-reference',
-    u'referencia-anonima': 'anonymous-reference',
-    u'referencia-an\u00f3nima': 'anonymous-reference',
-    u'referencia-nota-al-pie': 'footnote-reference',
-    u'referencia-cita': 'citation-reference',
-    u'referencia-sustitucion': 'substitution-reference',
-    u'referencia-sustituci\u00f3n': 'substitution-reference',
-    u'destino': 'target',
-    u'referencia-uri': 'uri-reference',
-    u'uri': 'uri-reference',
-    u'url': 'uri-reference',
-    u'sin-analisis': 'raw',
-    u'sin-an\u00e1lisis': 'raw',
-}
-"""Mapping of Spanish role names to canonical role names for interpreted text.
-"""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/fi.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-# $Id: fi.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Asko Soukka <asko.soukka@iki.fi>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Finnish-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      # language-dependent: fixed
-      u'huomio': u'attention',
-      u'varo': u'caution',
-      u'vaara': u'danger',
-      u'virhe': u'error',
-      u'vihje': u'hint',
-      u't\u00e4rke\u00e4\u00e4': u'important',
-      u'huomautus': u'note',
-      u'neuvo': u'tip',
-      u'varoitus': u'warning',
-      u'kehotus': u'admonition',
-      u'sivupalkki': u'sidebar',
-      u'aihe': u'topic',
-      u'rivi': u'line-block',
-      u'tasalevyinen': u'parsed-literal',
-      u'ohje': u'rubric',
-      u'epigraafi': u'epigraph',
-      u'kohokohdat': u'highlights',
-      u'lainaus': u'pull-quote',
-      u'taulukko': u'table',
-      u'csv-taulukko': u'csv-table',
-      u'list-table (translation required)': 'list-table',
-      u'compound (translation required)': 'compound',
-      u'container (translation required)': 'container',
-      #u'kysymykset': u'questions',
-      u'meta': u'meta',
-      #u'kuvakartta': u'imagemap',
-      u'kuva': u'image',
-      u'kaavio': u'figure',
-      u'sis\u00e4llyt\u00e4': u'include',
-      u'raaka': u'raw',
-      u'korvaa': u'replace',
-      u'unicode': u'unicode',
-      u'p\u00e4iv\u00e4ys': u'date',
-      u'luokka': u'class',
-      u'rooli': u'role',
-      u'default-role (translation required)': 'default-role',
-      u'title (translation required)': 'title',
-      u'sis\u00e4llys': u'contents',
-      u'kappale': u'sectnum',
-      u'header (translation required)': 'header',
-      u'footer (translation required)': 'footer',
-      #u'alaviitteet': u'footnotes',
-      #u'viitaukset': u'citations',
-      u'target-notes (translation required)': u'target-notes'}
-"""Finnish name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
-    # language-dependent: fixed
-    u'lyhennys': u'abbreviation',
-    u'akronyymi': u'acronym',
-    u'kirjainsana': u'acronym',
-    u'hakemisto': u'index',
-    u'luettelo': u'index',
-    u'alaindeksi': u'subscript',
-    u'indeksi': u'subscript',
-    u'yl\u00e4indeksi': u'superscript',
-    u'title-reference (translation required)': u'title-reference',
-    u'title (translation required)': u'title-reference',
-    u'pep-reference (translation required)': u'pep-reference',
-    u'rfc-reference (translation required)': u'rfc-reference',
-    u'korostus': u'emphasis',
-    u'vahvistus': u'strong',
-    u'tasalevyinen': u'literal',
-    u'named-reference (translation required)': u'named-reference',
-    u'anonymous-reference (translation required)': u'anonymous-reference',
-    u'footnote-reference (translation required)': u'footnote-reference',
-    u'citation-reference (translation required)': u'citation-reference',
-    u'substitution-reference (translation required)': u'substitution-reference',
-    u'kohde': u'target',
-    u'uri-reference (translation required)': u'uri-reference',
-    u'raw (translation required)': 'raw',}
-"""Mapping of Finnish role names to canonical role names for interpreted text.
-"""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/fr.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-# $Id: fr.py 4564 2006-05-21 20:44:42Z wiemann $
-# Authors: David Goodger <goodger@python.org>; William Dode
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-French-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      u'attention': 'attention',
-      u'pr\u00E9caution': 'caution',
-      u'danger': 'danger',
-      u'erreur': 'error',
-      u'conseil': 'hint',
-      u'important': 'important',
-      u'note': 'note',
-      u'astuce': 'tip',
-      u'avertissement': 'warning',
-      u'admonition': 'admonition',
-      u'encadr\u00E9': 'sidebar',
-      u'sujet': 'topic',
-      u'bloc-textuel': 'line-block',
-      u'bloc-interpr\u00E9t\u00E9': 'parsed-literal',
-      u'code-interpr\u00E9t\u00E9': 'parsed-literal',
-      u'intertitre': 'rubric',
-      u'exergue': 'epigraph',
-      u'\u00E9pigraphe': 'epigraph',
-      u'chapeau': 'highlights',
-      u'accroche': 'pull-quote',
-      u'compound (translation required)': 'compound',
-      u'container (translation required)': 'container',
-      #u'questions': 'questions',
-      #u'qr': 'questions',
-      #u'faq': 'questions',
-      u'tableau': 'table',
-      u'csv-table (translation required)': 'csv-table',
-      u'list-table (translation required)': 'list-table',
-      u'm\u00E9ta': 'meta',
-      #u'imagemap (translation required)': 'imagemap',
-      u'image': 'image',
-      u'figure': 'figure',
-      u'inclure': 'include',
-      u'brut': 'raw',
-      u'remplacer': 'replace',
-      u'remplace': 'replace',
-      u'unicode': 'unicode',
-      u'date': 'date',
-      u'classe': 'class',
-      u'role (translation required)': 'role',
-      u'default-role (translation required)': 'default-role',
-      u'titre (translation required)': 'title',
-      u'sommaire': 'contents',
-      u'table-des-mati\u00E8res': 'contents',
-      u'sectnum': 'sectnum',
-      u'section-num\u00E9rot\u00E9e': 'sectnum',
-      u'liens': 'target-notes',
-      u'header (translation required)': 'header',
-      u'footer (translation required)': 'footer',
-      #u'footnotes (translation required)': 'footnotes',
-      #u'citations (translation required)': 'citations',
-      }
-"""French name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
-      u'abr\u00E9viation': 'abbreviation',
-      u'acronyme': 'acronym',
-      u'sigle': 'acronym',
-      u'index': 'index',
-      u'indice': 'subscript',
-      u'ind': 'subscript',
-      u'exposant': 'superscript',
-      u'exp': 'superscript',
-      u'titre-r\u00E9f\u00E9rence': 'title-reference',
-      u'titre': 'title-reference',
-      u'pep-r\u00E9f\u00E9rence': 'pep-reference',
-      u'rfc-r\u00E9f\u00E9rence': 'rfc-reference',
-      u'emphase': 'emphasis',
-      u'fort': 'strong',
-      u'litt\u00E9ral': 'literal',
-      u'nomm\u00E9e-r\u00E9f\u00E9rence': 'named-reference',
-      u'anonyme-r\u00E9f\u00E9rence': 'anonymous-reference',
-      u'note-r\u00E9f\u00E9rence': 'footnote-reference',
-      u'citation-r\u00E9f\u00E9rence': 'citation-reference',
-      u'substitution-r\u00E9f\u00E9rence': 'substitution-reference',
-      u'lien': 'target',
-      u'uri-r\u00E9f\u00E9rence': 'uri-reference',
-      u'brut': 'raw',}
-"""Mapping of French role names to canonical role names for interpreted text.
-"""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/he.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-# Author: Meir Kriheli
-# Id: $Id: he.py 4837 2006-12-26 09:59:41Z sfcben $
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-English-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      # language-dependent: fixed
-      u'\u05ea\u05e9\u05d5\u05de\u05ea \u05dc\u05d1': 'attention',
-      u'\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea': 'caution',
-      u'\u05e1\u05db\u05e0\u05d4': 'danger',
-      u'\u05e9\u05d2\u05d9\u05d0\u05d4' : 'error',
-      u'\u05e8\u05de\u05d6': 'hint',
-      u'\u05d7\u05e9\u05d5\u05d1': 'important',
-      u'\u05d4\u05e2\u05e8\u05d4': 'note',
-      u'\u05d8\u05d9\u05e4': 'tip',
-      u'\u05d0\u05d6\u05d4\u05e8\u05d4': 'warning',
-      'admonition': 'admonition',
-      'sidebar': 'sidebar',
-      'topic': 'topic',
-      'line-block': 'line-block',
-      'parsed-literal': 'parsed-literal',
-      'rubric': 'rubric',
-      'epigraph': 'epigraph',
-      'highlights': 'highlights',
-      'pull-quote': 'pull-quote',
-      'compound': 'compound',
-      'container': 'container',
-      #'questions': 'questions',
-      'table': 'table',
-      'csv-table': 'csv-table',
-      'list-table': 'list-table',
-      #'qa': 'questions',
-      #'faq': 'questions',
-      'meta': 'meta',
-      #'imagemap': 'imagemap',
-      u'\u05ea\u05de\u05d5\u05e0\u05d4': 'image',
-      'figure': 'figure',
-      'include': 'include',
-      'raw': 'raw',
-      'replace': 'replace',
-      'unicode': 'unicode',
-      'date': 'date',
-       u'\u05e1\u05d2\u05e0\u05d5\u05df': 'class',
-      'role': 'role',
-      'default-role': 'default-role',
-      'title': 'title',
-      u'\u05ea\u05d5\u05db\u05df': 'contents',
-      'sectnum': 'sectnum',
-      'section-numbering': 'sectnum',
-      'header': 'header',
-      'footer': 'footer',
-      #'footnotes': 'footnotes',
-      #'citations': 'citations',
-      'target-notes': 'target-notes',
-      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""English name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
-    # language-dependent: fixed
-    'abbreviation': 'abbreviation',
-    'ab': 'abbreviation',
-    'acronym': 'acronym',
-    'ac': 'acronym',
-    'index': 'index',
-    'i': 'index',
-    u'\u05ea\u05d7\u05ea\u05d9': 'subscript',
-    'sub': 'subscript',
-    u'\u05e2\u05d9\u05dc\u05d9': 'superscript',
-    'sup': 'superscript',
-    'title-reference': 'title-reference',
-    'title': 'title-reference',
-    't': 'title-reference',
-    'pep-reference': 'pep-reference',
-    'pep': 'pep-reference',
-    'rfc-reference': 'rfc-reference',
-    'rfc': 'rfc-reference',
-    'emphasis': 'emphasis',
-    'strong': 'strong',
-    'literal': 'literal',
-    'named-reference': 'named-reference',
-    'anonymous-reference': 'anonymous-reference',
-    'footnote-reference': 'footnote-reference',
-    'citation-reference': 'citation-reference',
-    'substitution-reference': 'substitution-reference',
-    'target': 'target',
-    'uri-reference': 'uri-reference',
-    'uri': 'uri-reference',
-    'url': 'uri-reference',
-    'raw': 'raw',}
-"""Mapping of English role names to canonical role names for interpreted text.
-"""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/it.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-# $Id: it.py 4564 2006-05-21 20:44:42Z wiemann $
-# Authors: Nicola Larosa <docutils@tekNico.net>;
-#          Lele Gaifax <lele@seldati.it>
-# Copyright: This module has been placed in the public domain.
-
-# Beware: the italian translation of the reStructuredText documentation
-# at http://docit.bice.dyndns.org/static/ReST, in particular
-# http://docit.bice.dyndns.org/static/ReST/ref/rst/directives.html, needs
-# to be synced with the content of this file.
-
-"""
-Italian-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      'attenzione': 'attention',
-      'cautela': 'caution',
-      'pericolo': 'danger',
-      'errore': 'error',
-      'suggerimento': 'hint',
-      'importante': 'important',
-      'nota': 'note',
-      'consiglio': 'tip',
-      'avvertenza': 'warning',
-      'ammonizione': 'admonition',
-      'riquadro': 'sidebar',
-      'argomento': 'topic',
-      'blocco-di-righe': 'line-block',
-      'blocco-interpretato': 'parsed-literal',
-      'rubrica': 'rubric',
-      'epigrafe': 'epigraph',
-      'punti-salienti': 'highlights',
-      'estratto-evidenziato': 'pull-quote',
-      'composito': 'compound',
-      u'container (translation required)': 'container',
-      #'questions': 'questions',
-      #'qa': 'questions',
-      #'faq': 'questions',
-      'tabella': 'table',
-      'tabella-csv': 'csv-table',
-      'tabella-elenco': 'list-table',
-      'meta': 'meta',
-      #'imagemap': 'imagemap',
-      'immagine': 'image',
-      'figura': 'figure',
-      'includi': 'include',
-      'grezzo': 'raw',
-      'sostituisci': 'replace',
-      'unicode': 'unicode',
-      'data': 'date',
-      'classe': 'class',
-      'ruolo': 'role',
-      'ruolo-predefinito': 'default-role',
-      'titolo': 'title',
-      'indice': 'contents',
-      'contenuti': 'contents',
-      'seznum': 'sectnum',
-      'sezioni-autonumerate': 'sectnum',
-      'annota-riferimenti-esterni': 'target-notes',
-      'intestazione': 'header',
-      'piede-pagina': 'footer',
-      #'footnotes': 'footnotes',
-      #'citations': 'citations',
-      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""Italian name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
-      'abbreviazione': 'abbreviation',
-      'acronimo': 'acronym',
-      'indice': 'index',
-      'deponente': 'subscript',
-      'esponente': 'superscript',
-      'riferimento-titolo': 'title-reference',
-      'riferimento-pep': 'pep-reference',
-      'riferimento-rfc': 'rfc-reference',
-      'enfasi': 'emphasis',
-      'forte': 'strong',
-      'letterale': 'literal',
-      'riferimento-con-nome': 'named-reference',
-      'riferimento-anonimo': 'anonymous-reference',
-      'riferimento-nota': 'footnote-reference',
-      'riferimento-citazione': 'citation-reference',
-      'riferimento-sostituzione': 'substitution-reference',
-      'destinazione': 'target',
-      'riferimento-uri': 'uri-reference',
-      'grezzo': 'raw',}
-"""Mapping of Italian role names to canonical role names for interpreted text.
-"""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ja.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,115 +0,0 @@
-# -*- coding: utf-8 -*-
-# $Id: ja.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Japanese-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-# Corrections to these translations are welcome!
-# é–“é•ã„ãŒã‚ã‚Œã°ã€ã©ã†ãžæ­£ã—ã„翻訳を教ãˆã¦ä¸‹ã•ã„。
-
-directives = {
-    # language-dependent: fixed
-    u'注目': 'attention',
-    u'注æ„': 'caution',
-    u'å±é™º': 'danger',
-    u'エラー': 'error',
-    u'ヒント': 'hint',
-    u'é‡è¦': 'important',
-    u'備考': 'note',
-    u'通報': 'tip',
-    u'警告': 'warning',
-    u'戒告': 'admonition',
-    u'サイドãƒãƒ¼': 'sidebar',
-    u'トピック': 'topic',
-    u'ラインブロック': 'line-block',
-    u'パーズドリテラル': 'parsed-literal',
-    u'ルブリック': 'rubric',
-    u'エピグラフ': 'epigraph',
-    u'題言': 'epigraph',
-    u'ãƒã‚¤ãƒ©ã‚¤ãƒˆ': 'highlights',
-    u'見所': 'highlights',
-    u'プルクオート': 'pull-quote',
-    u'åˆæˆ': 'compound',
-    u'コンテナー': 'container',
-    u'容器': 'container',
-    u'表': 'table',
-    u'csv表': 'csv-table',
-    u'リスト表': 'list-table',
-    #u'質å•': 'questions',
-    #u'å•ç­”': 'questions',
-    #u'faq': 'questions',
-    u'メタ': 'meta',
-    #u'イメージマプ': 'imagemap',
-    u'イメージ': 'image',
-    u'ç”»åƒ': 'image',
-    u'フィグア': 'figure',
-    u'図版': 'figure',
-    u'インクルード': 'include',
-    u'å«ã‚€': 'include',
-    u'組ã¿è¾¼ã¿': 'include',
-    u'生': 'raw',
-    u'原': 'raw',
-    u'æ›ãˆã‚‹': 'replace',
-    u'å–ã‚Šæ›ãˆã‚‹': 'replace',
-    u'掛ã‘替ãˆã‚‹': 'replace',
-    u'ユニコード': 'unicode',
-    u'日付': 'date',
-    u'クラス': 'class',
-    u'ロール': 'role',
-    u'å½¹': 'role',
-    u'ディフォルトロール': 'default-role',
-    u'既定役': 'default-role',
-    u'タイトル': 'title',
-    u'é¡Œ': 'title',                    # é¡Œå 件å
-    u'目次': 'contents',
-    u'節数': 'sectnum',
-    u'ヘッダ': 'header',
-    u'フッタ': 'footer',
-    #u'脚注': 'footnotes',             # 脚註?
-    #u'サイテーション': 'citations',   # 出典 引証 引用
-    u'ターゲットノート': 'target-notes', # 的注 的脚注
-    }
-"""Japanese name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
-    # language-dependent: fixed
-    u'ç•¥': 'abbreviation',
-    u'頭字語': 'acronym',
-    u'インデックス': 'index',
-    u'索引': 'index',
-    u'添字': 'subscript',
-    u'下付': 'subscript',
-    u'下': 'subscript',
-    u'上付': 'superscript',
-    u'上': 'superscript',
-    u'é¡Œå‚ç…§': 'title-reference',
-    u'pepå‚ç…§': 'pep-reference',
-    u'rfcå‚ç…§': 'rfc-reference',
-    u'強調': 'emphasis',
-    u'å¼·ã„': 'strong',
-    u'リテラル': 'literal',
-    u'整形済ã¿': 'literal',
-    u'å付å‚ç…§': 'named-reference',
-    u'ç„¡åå‚ç…§': 'anonymous-reference',
-    u'脚注å‚ç…§': 'footnote-reference',
-    u'出典å‚ç…§': 'citation-reference',
-    u'代入å‚ç…§': 'substitution-reference',
-    u'çš„': 'target',
-    u'uriå‚ç…§': 'uri-reference',
-    u'uri': 'uri-reference',
-    u'url': 'uri-reference',
-    u'生': 'raw',}
-"""Mapping of Japanese role names to canonical role names for interpreted
-text."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/nl.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,108 +0,0 @@
-# $Id: nl.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Martijn Pieters <mjpieters@users.sourceforge.net>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Dutch-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      # language-dependent: fixed
-      'attentie': 'attention',
-      'let-op': 'caution',
-      'gevaar': 'danger',
-      'fout': 'error',
-      'hint': 'hint',
-      'belangrijk': 'important',
-      'opmerking': 'note',
-      'tip': 'tip',
-      'waarschuwing': 'warning',
-      'aanmaning': 'admonition',
-      'katern': 'sidebar',
-      'onderwerp': 'topic',
-      'lijn-blok': 'line-block',
-      'letterlijk-ontleed': 'parsed-literal',
-      'rubriek': 'rubric',
-      'opschrift': 'epigraph',
-      'hoogtepunten': 'highlights',
-      'pull-quote': 'pull-quote', # Dutch printers use the english term
-      'samenstelling': 'compound',
-      'verbinding': 'compound',
-      u'container (translation required)': 'container',
-      #'vragen': 'questions',
-      'tabel': 'table',
-      'csv-tabel': 'csv-table',
-      'lijst-tabel': 'list-table',
-      #'veelgestelde-vragen': 'questions',
-      'meta': 'meta',
-      #'imagemap': 'imagemap',
-      'beeld': 'image',
-      'figuur': 'figure',
-      'opnemen': 'include',
-      'onbewerkt': 'raw',
-      'vervang': 'replace',
-      'vervanging': 'replace',
-      'unicode': 'unicode',
-      'datum': 'date',
-      'klasse': 'class',
-      'rol': 'role',
-      u'default-role (translation required)': 'default-role',
-      'title (translation required)': 'title',
-      'inhoud': 'contents',
-      'sectnum': 'sectnum',
-      'sectie-nummering': 'sectnum',
-      'hoofdstuk-nummering': 'sectnum',
-      u'header (translation required)': 'header',
-      u'footer (translation required)': 'footer',
-      #'voetnoten': 'footnotes',
-      #'citaten': 'citations',
-      'verwijzing-voetnoten': 'target-notes',
-      'restructuredtext-test-instructie': 'restructuredtext-test-directive'}
-"""Dutch name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
-    # language-dependent: fixed
-    'afkorting': 'abbreviation',
-    # 'ab': 'abbreviation',
-    'acroniem': 'acronym',
-    'ac': 'acronym',
-    'index': 'index',
-    'i': 'index',
-    'inferieur': 'subscript',
-    'inf': 'subscript',
-    'superieur': 'superscript',
-    'sup': 'superscript',
-    'titel-referentie': 'title-reference',
-    'titel': 'title-reference',
-    't': 'title-reference',
-    'pep-referentie': 'pep-reference',
-    'pep': 'pep-reference',
-    'rfc-referentie': 'rfc-reference',
-    'rfc': 'rfc-reference',
-    'nadruk': 'emphasis',
-    'extra': 'strong',
-    'extra-nadruk': 'strong',
-    'vet': 'strong',
-    'letterlijk': 'literal',
-    'benoemde-referentie': 'named-reference',
-    'anonieme-referentie': 'anonymous-reference',
-    'voetnoot-referentie': 'footnote-reference',
-    'citaat-referentie': 'citation-reference',
-    'substitie-reference': 'substitution-reference',
-    'verwijzing': 'target',
-    'uri-referentie': 'uri-reference',
-    'uri': 'uri-reference',
-    'url': 'uri-reference',
-    'onbewerkt': 'raw',}
-"""Mapping of Dutch role names to canonical role names for interpreted text.
-"""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/pt_br.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-# $Id: pt_br.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Brazilian Portuguese-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      # language-dependent: fixed
-      u'aten\u00E7\u00E3o': 'attention',
-      'cuidado': 'caution',
-      'perigo': 'danger',
-      'erro': 'error',
-      u'sugest\u00E3o': 'hint',
-      'importante': 'important',
-      'nota': 'note',
-      'dica': 'tip',
-      'aviso': 'warning',
-      u'exorta\u00E7\u00E3o': 'admonition',
-      'barra-lateral': 'sidebar',
-      u't\u00F3pico': 'topic',
-      'bloco-de-linhas': 'line-block',
-      'literal-interpretado': 'parsed-literal',
-      'rubrica': 'rubric',
-      u'ep\u00EDgrafo': 'epigraph',
-      'destaques': 'highlights',
-      u'cita\u00E7\u00E3o-destacada': 'pull-quote',
-      u'compound (translation required)': 'compound',
-      u'container (translation required)': 'container',
-      #'perguntas': 'questions',
-      #'qa': 'questions',
-      #'faq': 'questions',
-      u'table (translation required)': 'table',
-      u'csv-table (translation required)': 'csv-table',
-      u'list-table (translation required)': 'list-table',
-      'meta': 'meta',
-      #'imagemap': 'imagemap',
-      'imagem': 'image',
-      'figura': 'figure',
-      u'inclus\u00E3o': 'include',
-      'cru': 'raw',
-      u'substitui\u00E7\u00E3o': 'replace',
-      'unicode': 'unicode',
-      'data': 'date',
-      'classe': 'class',
-      'role (translation required)': 'role',
-      u'default-role (translation required)': 'default-role',
-      u'title (translation required)': 'title',
-      u'\u00EDndice': 'contents',
-      'numsec': 'sectnum',
-      u'numera\u00E7\u00E3o-de-se\u00E7\u00F5es': 'sectnum',
-      u'header (translation required)': 'header',
-      u'footer (translation required)': 'footer',
-      #u'notas-de-rorap\u00E9': 'footnotes',
-      #u'cita\u00E7\u00F5es': 'citations',
-      u'links-no-rodap\u00E9': 'target-notes',
-      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""Brazilian Portuguese name to registered (in directives/__init__.py)
-directive name mapping."""
-
-roles = {
-    # language-dependent: fixed
-    u'abbrevia\u00E7\u00E3o': 'abbreviation',
-    'ab': 'abbreviation',
-    u'acr\u00F4nimo': 'acronym',
-    'ac': 'acronym',
-    u'\u00EDndice-remissivo': 'index',
-    'i': 'index',
-    'subscrito': 'subscript',
-    'sub': 'subscript',
-    'sobrescrito': 'superscript',
-    'sob': 'superscript',
-    u'refer\u00EAncia-a-t\u00EDtulo': 'title-reference',
-    u't\u00EDtulo': 'title-reference',
-    't': 'title-reference',
-    u'refer\u00EAncia-a-pep': 'pep-reference',
-    'pep': 'pep-reference',
-    u'refer\u00EAncia-a-rfc': 'rfc-reference',
-    'rfc': 'rfc-reference',
-    u'\u00EAnfase': 'emphasis',
-    'forte': 'strong',
-    'literal': 'literal',               # translation required?
-    u'refer\u00EAncia-por-nome': 'named-reference',
-    u'refer\u00EAncia-an\u00F4nima': 'anonymous-reference',
-    u'refer\u00EAncia-a-nota-de-rodap\u00E9': 'footnote-reference',
-    u'refer\u00EAncia-a-cita\u00E7\u00E3o': 'citation-reference',
-    u'refer\u00EAncia-a-substitui\u00E7\u00E3o': 'substitution-reference',
-    'alvo': 'target',
-    u'refer\u00EAncia-a-uri': 'uri-reference',
-    'uri': 'uri-reference',
-    'url': 'uri-reference',
-    'cru': 'raw',}
-"""Mapping of Brazilian Portuguese role names to canonical role names
-for interpreted text."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ru.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,103 +0,0 @@
-# $Id: ru.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Roman Suzi <rnd@onego.ru>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Russian-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-directives = {
- u'\u0431\u043b\u043e\u043a-\u0441\u0442\u0440\u043e\u043a': u'line-block',
- u'meta': u'meta',
- u'\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439-\u043b\u0438\u0442\u0435\u0440\u0430\u043b':
- u'parsed-literal',
- u'\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f-\u0446\u0438\u0442\u0430\u0442\u0430':
- u'pull-quote',
- u'compound (translation required)': 'compound',
- u'container (translation required)': 'container',
- u'table (translation required)': 'table',
- u'csv-table (translation required)': 'csv-table',
- u'list-table (translation required)': 'list-table',
- u'\u0441\u044b\u0440\u043e\u0439': u'raw',
- u'\u0437\u0430\u043c\u0435\u043d\u0430': u'replace',
- u'\u0442\u0435\u0441\u0442\u043e\u0432\u0430\u044f-\u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430-restructuredtext':
- u'restructuredtext-test-directive',
- u'\u0446\u0435\u043b\u0435\u0432\u044b\u0435-\u0441\u043d\u043e\u0441\u043a\u0438': 
- u'target-notes',
- u'unicode': u'unicode',
- u'\u0434\u0430\u0442\u0430': u'date',
- u'\u0431\u043e\u043a\u043e\u0432\u0430\u044f-\u043f\u043e\u043b\u043e\u0441\u0430':
- u'sidebar',
- u'\u0432\u0430\u0436\u043d\u043e': u'important',
- u'\u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c': u'include',
- u'\u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435': u'attention',
- u'\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435': u'highlights',
- u'\u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435': u'admonition',
- u'\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435':
- u'image',
- u'\u043a\u043b\u0430\u0441\u0441': u'class',
- u'role (translation required)': 'role',
- u'default-role (translation required)': 'default-role',
- u'title (translation required)': 'title',
- u'\u043d\u043e\u043c\u0435\u0440-\u0440\u0430\u0437\u0434\u0435\u043b\u0430':
- u'sectnum',
- u'\u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f-\u0440\u0430\u0437'
- u'\u0434\u0435\u043b\u043e\u0432': u'sectnum',
- u'\u043e\u043f\u0430\u0441\u043d\u043e': u'danger',
- u'\u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e': u'caution',
- u'\u043e\u0448\u0438\u0431\u043a\u0430': u'error',
- u'\u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430': u'tip',
- u'\u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d'
- u'\u0438\u0435': u'warning',
- u'\u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435': u'note',
- u'\u0440\u0438\u0441\u0443\u043d\u043e\u043a': u'figure',
- u'\u0440\u0443\u0431\u0440\u0438\u043a\u0430': u'rubric',
- u'\u0441\u043e\u0432\u0435\u0442': u'hint',
- u'\u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435': u'contents',
- u'\u0442\u0435\u043c\u0430': u'topic',
- u'\u044d\u043f\u0438\u0433\u0440\u0430\u0444': u'epigraph',
- u'header (translation required)': 'header',
- u'footer (translation required)': 'footer',}
-"""Russian name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
- u'\u0430\u043a\u0440\u043e\u043d\u0438\u043c': 'acronym',
- u'\u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0430\u044f-\u0441\u0441\u044b\u043b\u043a\u0430':
-  'anonymous-reference',
- u'\u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e': 'literal',
- u'\u0432\u0435\u0440\u0445\u043d\u0438\u0439-\u0438\u043d\u0434\u0435\u043a\u0441':
-  'superscript',
- u'\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435': 'emphasis',
- u'\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u0430\u044f-\u0441\u0441\u044b\u043b\u043a\u0430':
-  'named-reference',
- u'\u0438\u043d\u0434\u0435\u043a\u0441': 'index',
- u'\u043d\u0438\u0436\u043d\u0438\u0439-\u0438\u043d\u0434\u0435\u043a\u0441':
-  'subscript',
- u'\u0441\u0438\u043b\u044c\u043d\u043e\u0435-\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435':
-  'strong',
- u'\u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435':
-  'abbreviation',
- u'\u0441\u0441\u044b\u043b\u043a\u0430-\u0437\u0430\u043c\u0435\u043d\u0430':
-  'substitution-reference',
- u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-pep': 'pep-reference',
- u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-rfc': 'rfc-reference',
- u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-uri': 'uri-reference',
- u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-\u0437\u0430\u0433\u043b\u0430\u0432\u0438\u0435':
-  'title-reference',
- u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-\u0441\u043d\u043e\u0441\u043a\u0443':
-  'footnote-reference',
- u'\u0446\u0438\u0442\u0430\u0442\u043d\u0430\u044f-\u0441\u0441\u044b\u043b\u043a\u0430':
-  'citation-reference',
- u'\u0446\u0435\u043b\u044c': 'target',
- u'raw (translation required)': 'raw',}
-"""Mapping of Russian role names to canonical role names for interpreted text.
-"""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/sk.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-# $Id: sk.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Miroslav Vasko <zemiak@zoznam.sk>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Slovak-language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      u'pozor': 'attention',
-      u'opatrne': 'caution',
-      u'nebezpe\xe8enstvo': 'danger',
-      u'chyba': 'error',
-      u'rada': 'hint',
-      u'd\xf4le\x9eit\xe9': 'important',
-      u'pozn\xe1mka': 'note',
-      u'tip (translation required)': 'tip',
-      u'varovanie': 'warning',
-      u'admonition (translation required)': 'admonition',
-      u'sidebar (translation required)': 'sidebar',
-      u't\xe9ma': 'topic',
-      u'blok-riadkov': 'line-block',
-      u'parsed-literal': 'parsed-literal',
-      u'rubric (translation required)': 'rubric',
-      u'epigraph (translation required)': 'epigraph',
-      u'highlights (translation required)': 'highlights',
-      u'pull-quote (translation required)': 'pull-quote',
-      u'compound (translation required)': 'compound',
-      u'container (translation required)': 'container',
-      #u'questions': 'questions',
-      #u'qa': 'questions',
-      #u'faq': 'questions',
-      u'table (translation required)': 'table',
-      u'csv-table (translation required)': 'csv-table',
-      u'list-table (translation required)': 'list-table',
-      u'meta': 'meta',
-      #u'imagemap': 'imagemap',
-      u'obr\xe1zok': 'image',
-      u'tvar': 'figure',
-      u'vlo\x9ei\x9d': 'include',
-      u'raw (translation required)': 'raw',
-      u'nahradi\x9d': 'replace',
-      u'unicode': 'unicode',
-      u'd\u00E1tum': 'date',
-      u'class (translation required)': 'class',
-      u'role (translation required)': 'role',
-      u'default-role (translation required)': 'default-role',
-      u'title (translation required)': 'title',
-      u'obsah': 'contents',
-      u'\xe8as\x9d': 'sectnum',
-      u'\xe8as\x9d-\xe8\xedslovanie': 'sectnum',
-      u'cie\xbeov\xe9-pozn\xe1mky': 'target-notes',
-      u'header (translation required)': 'header',
-      u'footer (translation required)': 'footer',
-      #u'footnotes': 'footnotes',
-      #u'citations': 'citations',
-      }
-"""Slovak name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
-      u'abbreviation (translation required)': 'abbreviation',
-      u'acronym (translation required)': 'acronym',
-      u'index (translation required)': 'index',
-      u'subscript (translation required)': 'subscript',
-      u'superscript (translation required)': 'superscript',
-      u'title-reference (translation required)': 'title-reference',
-      u'pep-reference (translation required)': 'pep-reference',
-      u'rfc-reference (translation required)': 'rfc-reference',
-      u'emphasis (translation required)': 'emphasis',
-      u'strong (translation required)': 'strong',
-      u'literal (translation required)': 'literal',
-      u'named-reference (translation required)': 'named-reference',
-      u'anonymous-reference (translation required)': 'anonymous-reference',
-      u'footnote-reference (translation required)': 'footnote-reference',
-      u'citation-reference (translation required)': 'citation-reference',
-      u'substitution-reference (translation required)': 'substitution-reference',
-      u'target (translation required)': 'target',
-      u'uri-reference (translation required)': 'uri-reference',
-      u'raw (translation required)': 'raw',}
-"""Mapping of Slovak role names to canonical role names for interpreted text.
-"""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/sv.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-# $Id: sv.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Adam Chodorowski <chodorowski@users.sourceforge.net>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Swedish language mappings for language-dependent features of reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      u'observera': 'attention',
-      u'caution (translation required)': 'caution',
-      u'fara': 'danger',
-      u'fel': 'error',
-      u'v\u00e4gledning': 'hint',
-      u'viktigt': 'important',
-      u'notera': 'note',
-      u'tips': 'tip',
-      u'varning': 'warning',
-      u'admonition (translation required)': 'admonition',
-      u'sidebar (translation required)': 'sidebar',
-      u'\u00e4mne': 'topic',
-      u'line-block (translation required)': 'line-block',
-      u'parsed-literal (translation required)': 'parsed-literal',
-      u'mellanrubrik': 'rubric',
-      u'epigraph (translation required)': 'epigraph',
-      u'highlights (translation required)': 'highlights',
-      u'pull-quote (translation required)': 'pull-quote',
-      u'compound (translation required)': 'compound',
-      u'container (translation required)': 'container',
-      # u'fr\u00e5gor': 'questions',
-      # NOTE: A bit long, but recommended by http://www.nada.kth.se/dataterm/:
-      # u'fr\u00e5gor-och-svar': 'questions',
-      # u'vanliga-fr\u00e5gor': 'questions',  
-      u'table (translation required)': 'table',
-      u'csv-table (translation required)': 'csv-table',
-      u'list-table (translation required)': 'list-table',
-      u'meta': 'meta',
-      # u'bildkarta': 'imagemap',   # FIXME: Translation might be too literal.
-      u'bild': 'image',
-      u'figur': 'figure',
-      u'inkludera': 'include',   
-      u'r\u00e5': 'raw',            # FIXME: Translation might be too literal.
-      u'ers\u00e4tt': 'replace', 
-      u'unicode': 'unicode',
-      u'datum': 'date',
-      u'class (translation required)': 'class',
-      u'role (translation required)': 'role',
-      u'default-role (translation required)': 'default-role',
-      u'title (translation required)': 'title',
-      u'inneh\u00e5ll': 'contents',
-      u'sektionsnumrering': 'sectnum',
-      u'target-notes (translation required)': 'target-notes',
-      u'header (translation required)': 'header',
-      u'footer (translation required)': 'footer',
-      # u'fotnoter': 'footnotes',
-      # u'citeringar': 'citations',
-      }
-"""Swedish name to registered (in directives/__init__.py) directive name
-mapping."""
-
-roles = {
-      u'abbreviation (translation required)': 'abbreviation',
-      u'acronym (translation required)': 'acronym',
-      u'index (translation required)': 'index',
-      u'subscript (translation required)': 'subscript',
-      u'superscript (translation required)': 'superscript',
-      u'title-reference (translation required)': 'title-reference',
-      u'pep-reference (translation required)': 'pep-reference',
-      u'rfc-reference (translation required)': 'rfc-reference',
-      u'emphasis (translation required)': 'emphasis',
-      u'strong (translation required)': 'strong',
-      u'literal (translation required)': 'literal',
-      u'named-reference (translation required)': 'named-reference',
-      u'anonymous-reference (translation required)': 'anonymous-reference',
-      u'footnote-reference (translation required)': 'footnote-reference',
-      u'citation-reference (translation required)': 'citation-reference',
-      u'substitution-reference (translation required)': 'substitution-reference',
-      u'target (translation required)': 'target',
-      u'uri-reference (translation required)': 'uri-reference',
-      u'r\u00e5': 'raw',}
-"""Mapping of Swedish role names to canonical role names for interpreted text.
-"""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/zh_cn.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-# -*- coding: utf-8 -*-
-# $Id: zh_cn.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Panjunyong <panjy@zopechina.com>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Simplified Chinese language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      # language-dependent: fixed
-      u'注æ„': 'attention',
-      u'å°å¿ƒ': 'caution',
-      u'å±é™©': 'danger',
-      u'错误': 'error',
-      u'æ示': 'hint',
-      u'é‡è¦': 'important',
-      u'注解': 'note',
-      u'技巧': 'tip',
-      u'警告': 'warning',
-      u'å¿ å‘Š': 'admonition',
-      u'侧框': 'sidebar',
-      u'主题': 'topic',
-      u'line-block (translation required)': 'line-block',
-      u'parsed-literal (translation required)': 'parsed-literal',
-      u'醒目': 'rubric',
-      u'é“­æ–‡': 'epigraph',
-      u'è¦ç‚¹': 'highlights',
-      u'pull-quote (translation required)': 'pull-quote',
-      u'å¤åˆ': 'compound',
-      u'容器': 'container',
-      #u'questions (translation required)': 'questions',
-      u'表格': 'table',
-      u'csv表格': 'csv-table',
-      u'列表表格': 'list-table',
-      #u'qa (translation required)': 'questions',
-      #u'faq (translation required)': 'questions',
-      u'元数æ®': 'meta',
-      #u'imagemap (translation required)': 'imagemap',
-      u'图片': 'image',
-      u'图例': 'figure',
-      u'包å«': 'include',
-      u'原文': 'raw',
-      u'代替': 'replace',
-      u'统一ç ': 'unicode',
-      u'日期': 'date',
-      u'类型': 'class',
-      u'角色': 'role',
-      u'默认角色': 'default-role',
-      u'标题': 'title',
-      u'目录': 'contents',
-      u'章节åºå·': 'sectnum',
-      u'题头': 'header',
-      u'页脚': 'footer',
-      #u'footnotes (translation required)': 'footnotes',
-      #u'citations (translation required)': 'citations',
-      u'target-notes (translation required)': 'target-notes',
-      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""Simplified Chinese name to registered (in directives/__init__.py)
-directive name mapping."""
-
-roles = {
-    # language-dependent: fixed
-    u'缩写': 'abbreviation',
-    u'简称': 'acronym',
-    u'index (translation required)': 'index',
-    u'i (translation required)': 'index',
-    u'下标': 'subscript',
-    u'上标': 'superscript',
-    u'title-reference (translation required)': 'title-reference',
-    u'title (translation required)': 'title-reference',
-    u't (translation required)': 'title-reference',
-    u'pep-reference (translation required)': 'pep-reference',
-    u'pep (translation required)': 'pep-reference',
-    u'rfc-reference (translation required)': 'rfc-reference',
-    u'rfc (translation required)': 'rfc-reference',
-    u'强调': 'emphasis',
-    u'加粗': 'strong',
-    u'å­—é¢': 'literal',
-    u'named-reference (translation required)': 'named-reference',
-    u'anonymous-reference (translation required)': 'anonymous-reference',
-    u'footnote-reference (translation required)': 'footnote-reference',
-    u'citation-reference (translation required)': 'citation-reference',
-    u'substitution-reference (translation required)': 'substitution-reference',
-    u'target (translation required)': 'target',
-    u'uri-reference (translation required)': 'uri-reference',
-    u'uri (translation required)': 'uri-reference',
-    u'url (translation required)': 'uri-reference',
-    u'raw (translation required)': 'raw',}
-"""Mapping of Simplified Chinese role names to canonical role names
-for interpreted text."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/zh_tw.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-# -*- coding: utf-8 -*-
-# $Id: zh_tw.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-# New language mappings are welcome.  Before doing a new translation, please
-# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
-# translated for each language: one in docutils/languages, the other in
-# docutils/parsers/rst/languages.
-
-"""
-Traditional Chinese language mappings for language-dependent features of
-reStructuredText.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-directives = {
-      # language-dependent: fixed
-      'attention (translation required)': 'attention',
-      'caution (translation required)': 'caution',
-      'danger (translation required)': 'danger',
-      'error (translation required)': 'error',
-      'hint (translation required)': 'hint',
-      'important (translation required)': 'important',
-      'note (translation required)': 'note',
-      'tip (translation required)': 'tip',
-      'warning (translation required)': 'warning',
-      'admonition (translation required)': 'admonition',
-      'sidebar (translation required)': 'sidebar',
-      'topic (translation required)': 'topic',
-      'line-block (translation required)': 'line-block',
-      'parsed-literal (translation required)': 'parsed-literal',
-      'rubric (translation required)': 'rubric',
-      'epigraph (translation required)': 'epigraph',
-      'highlights (translation required)': 'highlights',
-      'pull-quote (translation required)': 'pull-quote',
-      'compound (translation required)': 'compound',
-      u'container (translation required)': 'container',
-      #'questions (translation required)': 'questions',
-      'table (translation required)': 'table',
-      'csv-table (translation required)': 'csv-table',
-      'list-table (translation required)': 'list-table',
-      #'qa (translation required)': 'questions',
-      #'faq (translation required)': 'questions',
-      'meta (translation required)': 'meta',
-      #'imagemap (translation required)': 'imagemap',
-      'image (translation required)': 'image',
-      'figure (translation required)': 'figure',
-      'include (translation required)': 'include',
-      'raw (translation required)': 'raw',
-      'replace (translation required)': 'replace',
-      'unicode (translation required)': 'unicode',
-      u'日期': 'date',
-      'class (translation required)': 'class',
-      'role (translation required)': 'role',
-      u'default-role (translation required)': 'default-role',
-      u'title (translation required)': 'title',
-      'contents (translation required)': 'contents',
-      'sectnum (translation required)': 'sectnum',
-      'section-numbering (translation required)': 'sectnum',
-      u'header (translation required)': 'header',
-      u'footer (translation required)': 'footer',
-      #'footnotes (translation required)': 'footnotes',
-      #'citations (translation required)': 'citations',
-      'target-notes (translation required)': 'target-notes',
-      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
-"""Traditional Chinese name to registered (in directives/__init__.py)
-directive name mapping."""
-
-roles = {
-    # language-dependent: fixed
-    'abbreviation (translation required)': 'abbreviation',
-    'ab (translation required)': 'abbreviation',
-    'acronym (translation required)': 'acronym',
-    'ac (translation required)': 'acronym',
-    'index (translation required)': 'index',
-    'i (translation required)': 'index',
-    'subscript (translation required)': 'subscript',
-    'sub (translation required)': 'subscript',
-    'superscript (translation required)': 'superscript',
-    'sup (translation required)': 'superscript',
-    'title-reference (translation required)': 'title-reference',
-    'title (translation required)': 'title-reference',
-    't (translation required)': 'title-reference',
-    'pep-reference (translation required)': 'pep-reference',
-    'pep (translation required)': 'pep-reference',
-    'rfc-reference (translation required)': 'rfc-reference',
-    'rfc (translation required)': 'rfc-reference',
-    'emphasis (translation required)': 'emphasis',
-    'strong (translation required)': 'strong',
-    'literal (translation required)': 'literal',
-    'named-reference (translation required)': 'named-reference',
-    'anonymous-reference (translation required)': 'anonymous-reference',
-    'footnote-reference (translation required)': 'footnote-reference',
-    'citation-reference (translation required)': 'citation-reference',
-    'substitution-reference (translation required)': 'substitution-reference',
-    'target (translation required)': 'target',
-    'uri-reference (translation required)': 'uri-reference',
-    'uri (translation required)': 'uri-reference',
-    'url (translation required)': 'uri-reference',
-    'raw (translation required)': 'raw',}
-"""Mapping of Traditional Chinese role names to canonical role names for
-interpreted text."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/roles.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,346 +0,0 @@
-# $Id: roles.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Edward Loper <edloper@gradient.cis.upenn.edu>
-# Copyright: This module has been placed in the public domain.
-
-"""
-This module defines standard interpreted text role functions, a registry for
-interpreted text roles, and an API for adding to and retrieving from the
-registry.
-
-The interface for interpreted role functions is as follows::
-
-    def role_fn(name, rawtext, text, lineno, inliner,
-                options={}, content=[]):
-        code...
-
-    # Set function attributes for customization:
-    role_fn.options = ...
-    role_fn.content = ...
-
-Parameters:
-
-- ``name`` is the local name of the interpreted text role, the role name
-  actually used in the document.
-
-- ``rawtext`` is a string containing the entire interpreted text construct.
-  Return it as a ``problematic`` node linked to a system message if there is a
-  problem.
-
-- ``text`` is the interpreted text content, with backslash escapes converted
-  to nulls (``\x00``).
-
-- ``lineno`` is the line number where the interpreted text beings.
-
-- ``inliner`` is the Inliner object that called the role function.
-  It defines the following useful attributes: ``reporter``,
-  ``problematic``, ``memo``, ``parent``, ``document``.
-
-- ``options``: A dictionary of directive options for customization, to be
-  interpreted by the role function.  Used for additional attributes for the
-  generated elements and other functionality.
-
-- ``content``: A list of strings, the directive content for customization
-  ("role" directive).  To be interpreted by the role function.
-
-Function attributes for customization, interpreted by the "role" directive:
-
-- ``options``: A dictionary, mapping known option names to conversion
-  functions such as `int` or `float`.  ``None`` or an empty dict implies no
-  options to parse.  Several directive option conversion functions are defined
-  in the `directives` module.
-
-  All role functions implicitly support the "class" option, unless disabled
-  with an explicit ``{'class': None}``.
-
-- ``content``: A boolean; true if content is allowed.  Client code must handle
-  the case where content is required but not supplied (an empty content list
-  will be supplied).
-
-Note that unlike directives, the "arguments" function attribute is not
-supported for role customization.  Directive arguments are handled by the
-"role" directive itself.
-
-Interpreted role functions return a tuple of two values:
-
-- A list of nodes which will be inserted into the document tree at the
-  point where the interpreted role was encountered (can be an empty
-  list).
-
-- A list of system messages, which will be inserted into the document tree
-  immediately after the end of the current inline block (can also be empty).
-"""
-
-__docformat__ = 'reStructuredText'
-
-from docutils import nodes, utils
-from docutils.parsers.rst import directives
-from docutils.parsers.rst.languages import en as _fallback_language_module
-
-DEFAULT_INTERPRETED_ROLE = 'title-reference'
-"""
-The canonical name of the default interpreted role.  This role is used
-when no role is specified for a piece of interpreted text.
-"""
-
-_role_registry = {}
-"""Mapping of canonical role names to role functions.  Language-dependent role
-names are defined in the ``language`` subpackage."""
-
-_roles = {}
-"""Mapping of local or language-dependent interpreted text role names to role
-functions."""
-
-def role(role_name, language_module, lineno, reporter):
-    """
-    Locate and return a role function from its language-dependent name, along
-    with a list of system messages.  If the role is not found in the current
-    language, check English.  Return a 2-tuple: role function (``None`` if the
-    named role cannot be found) and a list of system messages.
-    """
-    normname = role_name.lower()
-    messages = []
-    msg_text = []
-
-    if _roles.has_key(normname):
-        return _roles[normname], messages
-
-    if role_name:
-        canonicalname = None
-        try:
-            canonicalname = language_module.roles[normname]
-        except AttributeError, error:
-            msg_text.append('Problem retrieving role entry from language '
-                            'module %r: %s.' % (language_module, error))
-        except KeyError:
-            msg_text.append('No role entry for "%s" in module "%s".'
-                            % (role_name, language_module.__name__))
-    else:
-        canonicalname = DEFAULT_INTERPRETED_ROLE
-
-    # If we didn't find it, try English as a fallback.
-    if not canonicalname:
-        try:
-            canonicalname = _fallback_language_module.roles[normname]
-            msg_text.append('Using English fallback for role "%s".'
-                            % role_name)
-        except KeyError:
-            msg_text.append('Trying "%s" as canonical role name.'
-                            % role_name)
-            # The canonical name should be an English name, but just in case:
-            canonicalname = normname
-
-    # Collect any messages that we generated.
-    if msg_text:
-        message = reporter.info('\n'.join(msg_text), line=lineno)
-        messages.append(message)
-
-    # Look the role up in the registry, and return it.
-    if _role_registry.has_key(canonicalname):
-        role_fn = _role_registry[canonicalname]
-        register_local_role(normname, role_fn)
-        return role_fn, messages
-    else:
-        return None, messages # Error message will be generated by caller.
-
-def register_canonical_role(name, role_fn):
-    """
-    Register an interpreted text role by its canonical name.
-
-    :Parameters:
-      - `name`: The canonical name of the interpreted role.
-      - `role_fn`: The role function.  See the module docstring.
-    """
-    set_implicit_options(role_fn)
-    _role_registry[name] = role_fn
-
-def register_local_role(name, role_fn):
-    """
-    Register an interpreted text role by its local or language-dependent name.
-
-    :Parameters:
-      - `name`: The local or language-dependent name of the interpreted role.
-      - `role_fn`: The role function.  See the module docstring.
-    """
-    set_implicit_options(role_fn)
-    _roles[name] = role_fn
-
-def set_implicit_options(role_fn):
-    """
-    Add customization options to role functions, unless explicitly set or
-    disabled.
-    """
-    if not hasattr(role_fn, 'options') or role_fn.options is None:
-        role_fn.options = {'class': directives.class_option}
-    elif not role_fn.options.has_key('class'):
-        role_fn.options['class'] = directives.class_option
-
-def register_generic_role(canonical_name, node_class):
-    """For roles which simply wrap a given `node_class` around the text."""
-    role = GenericRole(canonical_name, node_class)
-    register_canonical_role(canonical_name, role)
-
-
-class GenericRole:
-
-    """
-    Generic interpreted text role, where the interpreted text is simply
-    wrapped with the provided node class.
-    """
-
-    def __init__(self, role_name, node_class):
-        self.name = role_name
-        self.node_class = node_class
-
-    def __call__(self, role, rawtext, text, lineno, inliner,
-                 options={}, content=[]):
-        set_classes(options)
-        return [self.node_class(rawtext, utils.unescape(text), **options)], []
-
-
-class CustomRole:
-
-    """
-    Wrapper for custom interpreted text roles.
-    """
-
-    def __init__(self, role_name, base_role, options={}, content=[]):
-        self.name = role_name
-        self.base_role = base_role
-        self.options = None
-        if hasattr(base_role, 'options'):
-            self.options = base_role.options
-        self.content = None
-        if hasattr(base_role, 'content'):
-            self.content = base_role.content
-        self.supplied_options = options
-        self.supplied_content = content
-
-    def __call__(self, role, rawtext, text, lineno, inliner,
-                 options={}, content=[]):
-        opts = self.supplied_options.copy()
-        opts.update(options)
-        cont = list(self.supplied_content)
-        if cont and content:
-            cont += '\n'
-        cont.extend(content)
-        return self.base_role(role, rawtext, text, lineno, inliner,
-                              options=opts, content=cont)
-
-
-def generic_custom_role(role, rawtext, text, lineno, inliner,
-                        options={}, content=[]):
-    """"""
-    # Once nested inline markup is implemented, this and other methods should
-    # recursively call inliner.nested_parse().
-    set_classes(options)
-    return [nodes.inline(rawtext, utils.unescape(text), **options)], []
-
-generic_custom_role.options = {'class': directives.class_option}
-
-
-######################################################################
-# Define and register the standard roles:
-######################################################################
-
-register_generic_role('abbreviation', nodes.abbreviation)
-register_generic_role('acronym', nodes.acronym)
-register_generic_role('emphasis', nodes.emphasis)
-register_generic_role('literal', nodes.literal)
-register_generic_role('strong', nodes.strong)
-register_generic_role('subscript', nodes.subscript)
-register_generic_role('superscript', nodes.superscript)
-register_generic_role('title-reference', nodes.title_reference)
-
-def pep_reference_role(role, rawtext, text, lineno, inliner,
-                       options={}, content=[]):
-    try:
-        pepnum = int(text)
-        if pepnum < 0 or pepnum > 9999:
-            raise ValueError
-    except ValueError:
-        msg = inliner.reporter.error(
-            'PEP number must be a number from 0 to 9999; "%s" is invalid.'
-            % text, line=lineno)
-        prb = inliner.problematic(rawtext, rawtext, msg)
-        return [prb], [msg]
-    # Base URL mainly used by inliner.pep_reference; so this is correct:
-    ref = (inliner.document.settings.pep_base_url
-           + inliner.document.settings.pep_file_url_template % pepnum)
-    set_classes(options)
-    return [nodes.reference(rawtext, 'PEP ' + utils.unescape(text), refuri=ref,
-                            **options)], []
-
-register_canonical_role('pep-reference', pep_reference_role)
-
-def rfc_reference_role(role, rawtext, text, lineno, inliner,
-                       options={}, content=[]):
-    try:
-        rfcnum = int(text)
-        if rfcnum <= 0:
-            raise ValueError
-    except ValueError:
-        msg = inliner.reporter.error(
-            'RFC number must be a number greater than or equal to 1; '
-            '"%s" is invalid.' % text, line=lineno)
-        prb = inliner.problematic(rawtext, rawtext, msg)
-        return [prb], [msg]
-    # Base URL mainly used by inliner.rfc_reference, so this is correct:
-    ref = inliner.document.settings.rfc_base_url + inliner.rfc_url % rfcnum
-    set_classes(options)
-    node = nodes.reference(rawtext, 'RFC ' + utils.unescape(text), refuri=ref,
-                           **options)
-    return [node], []
-
-register_canonical_role('rfc-reference', rfc_reference_role)
-
-def raw_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
-    if not options.has_key('format'):
-        msg = inliner.reporter.error(
-            'No format (Writer name) is associated with this role: "%s".\n'
-            'The "raw" role cannot be used directly.\n'
-            'Instead, use the "role" directive to create a new role with '
-            'an associated format.' % role, line=lineno)
-        prb = inliner.problematic(rawtext, rawtext, msg)
-        return [prb], [msg]
-    set_classes(options)
-    node = nodes.raw(rawtext, utils.unescape(text, 1), **options)
-    return [node], []
-
-raw_role.options = {'format': directives.unchanged}
-
-register_canonical_role('raw', raw_role)
-
-
-######################################################################
-# Register roles that are currently unimplemented.
-######################################################################
-
-def unimplemented_role(role, rawtext, text, lineno, inliner, attributes={}):
-    msg = inliner.reporter.error(
-        'Interpreted text role "%s" not implemented.' % role, line=lineno)
-    prb = inliner.problematic(rawtext, rawtext, msg)
-    return [prb], [msg]
-
-register_canonical_role('index', unimplemented_role)
-register_canonical_role('named-reference', unimplemented_role)
-register_canonical_role('anonymous-reference', unimplemented_role)
-register_canonical_role('uri-reference', unimplemented_role)
-register_canonical_role('footnote-reference', unimplemented_role)
-register_canonical_role('citation-reference', unimplemented_role)
-register_canonical_role('substitution-reference', unimplemented_role)
-register_canonical_role('target', unimplemented_role)
-
-# This should remain unimplemented, for testing purposes:
-register_canonical_role('restructuredtext-unimplemented-role',
-                        unimplemented_role)
-
-
-def set_classes(options):
-    """
-    Auxiliary function to set options['classes'] and delete
-    options['class'].
-    """
-    if options.has_key('class'):
-        assert not options.has_key('classes')
-        options['classes'] = options['class']
-        del options['class']
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/states.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2988 +0,0 @@
-# $Id: states.py 4824 2006-12-09 00:59:23Z goodger $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-This is the ``docutils.parsers.restructuredtext.states`` module, the core of
-the reStructuredText parser.  It defines the following:
-
-:Classes:
-    - `RSTStateMachine`: reStructuredText parser's entry point.
-    - `NestedStateMachine`: recursive StateMachine.
-    - `RSTState`: reStructuredText State superclass.
-    - `Inliner`: For parsing inline markup.
-    - `Body`: Generic classifier of the first line of a block.
-    - `SpecializedBody`: Superclass for compound element members.
-    - `BulletList`: Second and subsequent bullet_list list_items
-    - `DefinitionList`: Second+ definition_list_items.
-    - `EnumeratedList`: Second+ enumerated_list list_items.
-    - `FieldList`: Second+ fields.
-    - `OptionList`: Second+ option_list_items.
-    - `RFC2822List`: Second+ RFC2822-style fields.
-    - `ExtensionOptions`: Parses directive option fields.
-    - `Explicit`: Second+ explicit markup constructs.
-    - `SubstitutionDef`: For embedded directives in substitution definitions.
-    - `Text`: Classifier of second line of a text block.
-    - `SpecializedText`: Superclass for continuation lines of Text-variants.
-    - `Definition`: Second line of potential definition_list_item.
-    - `Line`: Second line of overlined section title or transition marker.
-    - `Struct`: An auxiliary collection class.
-
-:Exception classes:
-    - `MarkupError`
-    - `ParserError`
-    - `MarkupMismatch`
-
-:Functions:
-    - `escape2null()`: Return a string, escape-backslashes converted to nulls.
-    - `unescape()`: Return a string, nulls removed or restored to backslashes.
-
-:Attributes:
-    - `state_classes`: set of State classes used with `RSTStateMachine`.
-
-Parser Overview
-===============
-
-The reStructuredText parser is implemented as a recursive state machine,
-examining its input one line at a time.  To understand how the parser works,
-please first become familiar with the `docutils.statemachine` module.  In the
-description below, references are made to classes defined in this module;
-please see the individual classes for details.
-
-Parsing proceeds as follows:
-
-1. The state machine examines each line of input, checking each of the
-   transition patterns of the state `Body`, in order, looking for a match.
-   The implicit transitions (blank lines and indentation) are checked before
-   any others.  The 'text' transition is a catch-all (matches anything).
-
-2. The method associated with the matched transition pattern is called.
-
-   A. Some transition methods are self-contained, appending elements to the
-      document tree (`Body.doctest` parses a doctest block).  The parser's
-      current line index is advanced to the end of the element, and parsing
-      continues with step 1.
-
-   B. Other transition methods trigger the creation of a nested state machine,
-      whose job is to parse a compound construct ('indent' does a block quote,
-      'bullet' does a bullet list, 'overline' does a section [first checking
-      for a valid section header], etc.).
-
-      - In the case of lists and explicit markup, a one-off state machine is
-        created and run to parse contents of the first item.
-
-      - A new state machine is created and its initial state is set to the
-        appropriate specialized state (`BulletList` in the case of the
-        'bullet' transition; see `SpecializedBody` for more detail).  This
-        state machine is run to parse the compound element (or series of
-        explicit markup elements), and returns as soon as a non-member element
-        is encountered.  For example, the `BulletList` state machine ends as
-        soon as it encounters an element which is not a list item of that
-        bullet list.  The optional omission of inter-element blank lines is
-        enabled by this nested state machine.
-
-      - The current line index is advanced to the end of the elements parsed,
-        and parsing continues with step 1.
-
-   C. The result of the 'text' transition depends on the next line of text.
-      The current state is changed to `Text`, under which the second line is
-      examined.  If the second line is:
-
-      - Indented: The element is a definition list item, and parsing proceeds
-        similarly to step 2.B, using the `DefinitionList` state.
-
-      - A line of uniform punctuation characters: The element is a section
-        header; again, parsing proceeds as in step 2.B, and `Body` is still
-        used.
-
-      - Anything else: The element is a paragraph, which is examined for
-        inline markup and appended to the parent element.  Processing
-        continues with step 1.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import sys
-import re
-import roman
-from types import TupleType, FunctionType, MethodType
-from docutils import nodes, statemachine, utils, urischemes
-from docutils import ApplicationError, DataError
-from docutils.statemachine import StateMachineWS, StateWS
-from docutils.nodes import fully_normalize_name as normalize_name
-from docutils.nodes import whitespace_normalize_name
-from docutils.utils import escape2null, unescape, column_width
-import docutils.parsers.rst
-from docutils.parsers.rst import directives, languages, tableparser, roles
-from docutils.parsers.rst.languages import en as _fallback_language_module
-
-
-class MarkupError(DataError): pass
-class UnknownInterpretedRoleError(DataError): pass
-class InterpretedRoleNotImplementedError(DataError): pass
-class ParserError(ApplicationError): pass
-class MarkupMismatch(Exception): pass
-
-
-class Struct:
-
-    """Stores data attributes for dotted-attribute access."""
-
-    def __init__(self, **keywordargs):
-        self.__dict__.update(keywordargs)
-
-
-class RSTStateMachine(StateMachineWS):
-
-    """
-    reStructuredText's master StateMachine.
-
-    The entry point to reStructuredText parsing is the `run()` method.
-    """
-
-    def run(self, input_lines, document, input_offset=0, match_titles=1,
-            inliner=None):
-        """
-        Parse `input_lines` and modify the `document` node in place.
-
-        Extend `StateMachineWS.run()`: set up parse-global data and
-        run the StateMachine.
-        """
-        self.language = languages.get_language(
-            document.settings.language_code)
-        self.match_titles = match_titles
-        if inliner is None:
-            inliner = Inliner()
-        inliner.init_customizations(document.settings)
-        self.memo = Struct(document=document,
-                           reporter=document.reporter,
-                           language=self.language,
-                           title_styles=[],
-                           section_level=0,
-                           section_bubble_up_kludge=0,
-                           inliner=inliner)
-        self.document = document
-        self.attach_observer(document.note_source)
-        self.reporter = self.memo.reporter
-        self.node = document
-        results = StateMachineWS.run(self, input_lines, input_offset,
-                                     input_source=document['source'])
-        assert results == [], 'RSTStateMachine.run() results should be empty!'
-        self.node = self.memo = None    # remove unneeded references
-
-
-class NestedStateMachine(StateMachineWS):
-
-    """
-    StateMachine run from within other StateMachine runs, to parse nested
-    document structures.
-    """
-
-    def run(self, input_lines, input_offset, memo, node, match_titles=1):
-        """
-        Parse `input_lines` and populate a `docutils.nodes.document` instance.
-
-        Extend `StateMachineWS.run()`: set up document-wide data.
-        """
-        self.match_titles = match_titles
-        self.memo = memo
-        self.document = memo.document
-        self.attach_observer(self.document.note_source)
-        self.reporter = memo.reporter
-        self.language = memo.language
-        self.node = node
-        results = StateMachineWS.run(self, input_lines, input_offset)
-        assert results == [], ('NestedStateMachine.run() results should be '
-                               'empty!')
-        return results
-
-
-class RSTState(StateWS):
-
-    """
-    reStructuredText State superclass.
-
-    Contains methods used by all State subclasses.
-    """
-
-    nested_sm = NestedStateMachine
-
-    def __init__(self, state_machine, debug=0):
-        self.nested_sm_kwargs = {'state_classes': state_classes,
-                                 'initial_state': 'Body'}
-        StateWS.__init__(self, state_machine, debug)
-
-    def runtime_init(self):
-        StateWS.runtime_init(self)
-        memo = self.state_machine.memo
-        self.memo = memo
-        self.reporter = memo.reporter
-        self.inliner = memo.inliner
-        self.document = memo.document
-        self.parent = self.state_machine.node
-
-    def goto_line(self, abs_line_offset):
-        """
-        Jump to input line `abs_line_offset`, ignoring jumps past the end.
-        """
-        try:
-            self.state_machine.goto_line(abs_line_offset)
-        except EOFError:
-            pass
-
-    def no_match(self, context, transitions):
-        """
-        Override `StateWS.no_match` to generate a system message.
-
-        This code should never be run.
-        """
-        self.reporter.severe(
-            'Internal error: no transition pattern match.  State: "%s"; '
-            'transitions: %s; context: %s; current line: %r.'
-            % (self.__class__.__name__, transitions, context,
-               self.state_machine.line),
-            line=self.state_machine.abs_line_number())
-        return context, None, []
-
-    def bof(self, context):
-        """Called at beginning of file."""
-        return [], []
-
-    def nested_parse(self, block, input_offset, node, match_titles=0,
-                     state_machine_class=None, state_machine_kwargs=None):
-        """
-        Create a new StateMachine rooted at `node` and run it over the input
-        `block`.
-        """
-        if state_machine_class is None:
-            state_machine_class = self.nested_sm
-        if state_machine_kwargs is None:
-            state_machine_kwargs = self.nested_sm_kwargs
-        block_length = len(block)
-        state_machine = state_machine_class(debug=self.debug,
-                                            **state_machine_kwargs)
-        state_machine.run(block, input_offset, memo=self.memo,
-                          node=node, match_titles=match_titles)
-        state_machine.unlink()
-        new_offset = state_machine.abs_line_offset()
-        # No `block.parent` implies disconnected -- lines aren't in sync:
-        if block.parent and (len(block) - block_length) != 0:
-            # Adjustment for block if modified in nested parse:
-            self.state_machine.next_line(len(block) - block_length)
-        return new_offset
-
-    def nested_list_parse(self, block, input_offset, node, initial_state,
-                          blank_finish,
-                          blank_finish_state=None,
-                          extra_settings={},
-                          match_titles=0,
-                          state_machine_class=None,
-                          state_machine_kwargs=None):
-        """
-        Create a new StateMachine rooted at `node` and run it over the input
-        `block`. Also keep track of optional intermediate blank lines and the
-        required final one.
-        """
-        if state_machine_class is None:
-            state_machine_class = self.nested_sm
-        if state_machine_kwargs is None:
-            state_machine_kwargs = self.nested_sm_kwargs.copy()
-        state_machine_kwargs['initial_state'] = initial_state
-        state_machine = state_machine_class(debug=self.debug,
-                                            **state_machine_kwargs)
-        if blank_finish_state is None:
-            blank_finish_state = initial_state
-        state_machine.states[blank_finish_state].blank_finish = blank_finish
-        for key, value in extra_settings.items():
-            setattr(state_machine.states[initial_state], key, value)
-        state_machine.run(block, input_offset, memo=self.memo,
-                          node=node, match_titles=match_titles)
-        blank_finish = state_machine.states[blank_finish_state].blank_finish
-        state_machine.unlink()
-        return state_machine.abs_line_offset(), blank_finish
-
-    def section(self, title, source, style, lineno, messages):
-        """Check for a valid subsection and create one if it checks out."""
-        if self.check_subsection(source, style, lineno):
-            self.new_subsection(title, lineno, messages)
-
-    def check_subsection(self, source, style, lineno):
-        """
-        Check for a valid subsection header.  Return 1 (true) or None (false).
-
-        When a new section is reached that isn't a subsection of the current
-        section, back up the line count (use ``previous_line(-x)``), then
-        ``raise EOFError``.  The current StateMachine will finish, then the
-        calling StateMachine can re-examine the title.  This will work its way
-        back up the calling chain until the correct section level isreached.
-
-        @@@ Alternative: Evaluate the title, store the title info & level, and
-        back up the chain until that level is reached.  Store in memo? Or
-        return in results?
-
-        :Exception: `EOFError` when a sibling or supersection encountered.
-        """
-        memo = self.memo
-        title_styles = memo.title_styles
-        mylevel = memo.section_level
-        try:                            # check for existing title style
-            level = title_styles.index(style) + 1
-        except ValueError:              # new title style
-            if len(title_styles) == memo.section_level: # new subsection
-                title_styles.append(style)
-                return 1
-            else:                       # not at lowest level
-                self.parent += self.title_inconsistent(source, lineno)
-                return None
-        if level <= mylevel:            # sibling or supersection
-            memo.section_level = level   # bubble up to parent section
-            if len(style) == 2:
-                memo.section_bubble_up_kludge = 1
-            # back up 2 lines for underline title, 3 for overline title
-            self.state_machine.previous_line(len(style) + 1)
-            raise EOFError              # let parent section re-evaluate
-        if level == mylevel + 1:        # immediate subsection
-            return 1
-        else:                           # invalid subsection
-            self.parent += self.title_inconsistent(source, lineno)
-            return None
-
-    def title_inconsistent(self, sourcetext, lineno):
-        error = self.reporter.severe(
-            'Title level inconsistent:', nodes.literal_block('', sourcetext),
-            line=lineno)
-        return error
-
-    def new_subsection(self, title, lineno, messages):
-        """Append new subsection to document tree. On return, check level."""
-        memo = self.memo
-        mylevel = memo.section_level
-        memo.section_level += 1
-        section_node = nodes.section()
-        self.parent += section_node
-        textnodes, title_messages = self.inline_text(title, lineno)
-        titlenode = nodes.title(title, '', *textnodes)
-        name = normalize_name(titlenode.astext())
-        section_node['names'].append(name)
-        section_node += titlenode
-        section_node += messages
-        section_node += title_messages
-        self.document.note_implicit_target(section_node, section_node)
-        offset = self.state_machine.line_offset + 1
-        absoffset = self.state_machine.abs_line_offset() + 1
-        newabsoffset = self.nested_parse(
-              self.state_machine.input_lines[offset:], input_offset=absoffset,
-              node=section_node, match_titles=1)
-        self.goto_line(newabsoffset)
-        if memo.section_level <= mylevel: # can't handle next section?
-            raise EOFError              # bubble up to supersection
-        # reset section_level; next pass will detect it properly
-        memo.section_level = mylevel
-
-    def paragraph(self, lines, lineno):
-        """
-        Return a list (paragraph & messages) & a boolean: literal_block next?
-        """
-        data = '\n'.join(lines).rstrip()
-        if re.search(r'(?<!\\)(\\\\)*::$', data):
-            if len(data) == 2:
-                return [], 1
-            elif data[-3] in ' \n':
-                text = data[:-3].rstrip()
-            else:
-                text = data[:-1]
-            literalnext = 1
-        else:
-            text = data
-            literalnext = 0
-        textnodes, messages = self.inline_text(text, lineno)
-        p = nodes.paragraph(data, '', *textnodes)
-        p.line = lineno
-        return [p] + messages, literalnext
-
-    def inline_text(self, text, lineno):
-        """
-        Return 2 lists: nodes (text and inline elements), and system_messages.
-        """
-        return self.inliner.parse(text, lineno, self.memo, self.parent)
-
-    def unindent_warning(self, node_name):
-        return self.reporter.warning(
-            '%s ends without a blank line; unexpected unindent.' % node_name,
-            line=(self.state_machine.abs_line_number() + 1))
-
-
-def build_regexp(definition, compile=1):
-    """
-    Build, compile and return a regular expression based on `definition`.
-
-    :Parameter: `definition`: a 4-tuple (group name, prefix, suffix, parts),
-        where "parts" is a list of regular expressions and/or regular
-        expression definitions to be joined into an or-group.
-    """
-    name, prefix, suffix, parts = definition
-    part_strings = []
-    for part in parts:
-        if type(part) is TupleType:
-            part_strings.append(build_regexp(part, None))
-        else:
-            part_strings.append(part)
-    or_group = '|'.join(part_strings)
-    regexp = '%(prefix)s(?P<%(name)s>%(or_group)s)%(suffix)s' % locals()
-    if compile:
-        return re.compile(regexp, re.UNICODE)
-    else:
-        return regexp
-
-
-class Inliner:
-
-    """
-    Parse inline markup; call the `parse()` method.
-    """
-
-    def __init__(self):
-        self.implicit_dispatch = [(self.patterns.uri, self.standalone_uri),]
-        """List of (pattern, bound method) tuples, used by
-        `self.implicit_inline`."""
-
-    def init_customizations(self, settings):
-        """Setting-based customizations; run when parsing begins."""
-        if settings.pep_references:
-            self.implicit_dispatch.append((self.patterns.pep,
-                                           self.pep_reference))
-        if settings.rfc_references:
-            self.implicit_dispatch.append((self.patterns.rfc,
-                                           self.rfc_reference))
-
-    def parse(self, text, lineno, memo, parent):
-        # Needs to be refactored for nested inline markup.
-        # Add nested_parse() method?
-        """
-        Return 2 lists: nodes (text and inline elements), and system_messages.
-
-        Using `self.patterns.initial`, a pattern which matches start-strings
-        (emphasis, strong, interpreted, phrase reference, literal,
-        substitution reference, and inline target) and complete constructs
-        (simple reference, footnote reference), search for a candidate.  When
-        one is found, check for validity (e.g., not a quoted '*' character).
-        If valid, search for the corresponding end string if applicable, and
-        check it for validity.  If not found or invalid, generate a warning
-        and ignore the start-string.  Implicit inline markup (e.g. standalone
-        URIs) is found last.
-        """
-        self.reporter = memo.reporter
-        self.document = memo.document
-        self.language = memo.language
-        self.parent = parent
-        pattern_search = self.patterns.initial.search
-        dispatch = self.dispatch
-        remaining = escape2null(text)
-        processed = []
-        unprocessed = []
-        messages = []
-        while remaining:
-            match = pattern_search(remaining)
-            if match:
-                groups = match.groupdict()
-                method = dispatch[groups['start'] or groups['backquote']
-                                  or groups['refend'] or groups['fnend']]
-                before, inlines, remaining, sysmessages = method(self, match,
-                                                                 lineno)
-                unprocessed.append(before)
-                messages += sysmessages
-                if inlines:
-                    processed += self.implicit_inline(''.join(unprocessed),
-                                                      lineno)
-                    processed += inlines
-                    unprocessed = []
-            else:
-                break
-        remaining = ''.join(unprocessed) + remaining
-        if remaining:
-            processed += self.implicit_inline(remaining, lineno)
-        return processed, messages
-
-    openers = '\'"([{<'
-    closers = '\'")]}>'
-    start_string_prefix = (r'((?<=^)|(?<=[-/: \n%s]))' % re.escape(openers))
-    end_string_suffix = (r'((?=$)|(?=[-/:.,;!? \n\x00%s]))'
-                         % re.escape(closers))
-    non_whitespace_before = r'(?<![ \n])'
-    non_whitespace_escape_before = r'(?<![ \n\x00])'
-    non_whitespace_after = r'(?![ \n])'
-    # Alphanumerics with isolated internal [-._] chars (i.e. not 2 together):
-    simplename = r'(?:(?!_)\w)+(?:[-._](?:(?!_)\w)+)*'
-    # Valid URI characters (see RFC 2396 & RFC 2732);
-    # final \x00 allows backslash escapes in URIs:
-    uric = r"""[-_.!~*'()[\];/:@&=+$,%a-zA-Z0-9\x00]"""
-    # Delimiter indicating the end of a URI (not part of the URI):
-    uri_end_delim = r"""[>]"""
-    # Last URI character; same as uric but no punctuation:
-    urilast = r"""[_~*/=+a-zA-Z0-9]"""
-    # End of a URI (either 'urilast' or 'uric followed by a
-    # uri_end_delim'):
-    uri_end = r"""(?:%(urilast)s|%(uric)s(?=%(uri_end_delim)s))""" % locals()
-    emailc = r"""[-_!~*'{|}/#?^`&=+$%a-zA-Z0-9\x00]"""
-    email_pattern = r"""
-          %(emailc)s+(?:\.%(emailc)s+)*   # name
-          (?<!\x00)@                      # at
-          %(emailc)s+(?:\.%(emailc)s*)*   # host
-          %(uri_end)s                     # final URI char
-          """
-    parts = ('initial_inline', start_string_prefix, '',
-             [('start', '', non_whitespace_after,  # simple start-strings
-               [r'\*\*',                # strong
-                r'\*(?!\*)',            # emphasis but not strong
-                r'``',                  # literal
-                r'_`',                  # inline internal target
-                r'\|(?!\|)']            # substitution reference
-               ),
-              ('whole', '', end_string_suffix, # whole constructs
-               [# reference name & end-string
-                r'(?P<refname>%s)(?P<refend>__?)' % simplename,
-                ('footnotelabel', r'\[', r'(?P<fnend>\]_)',
-                 [r'[0-9]+',               # manually numbered
-                  r'\#(%s)?' % simplename, # auto-numbered (w/ label?)
-                  r'\*',                   # auto-symbol
-                  r'(?P<citationlabel>%s)' % simplename] # citation reference
-                 )
-                ]
-               ),
-              ('backquote',             # interpreted text or phrase reference
-               '(?P<role>(:%s:)?)' % simplename, # optional role
-               non_whitespace_after,
-               ['`(?!`)']               # but not literal
-               )
-              ]
-             )
-    patterns = Struct(
-          initial=build_regexp(parts),
-          emphasis=re.compile(non_whitespace_escape_before
-                              + r'(\*)' + end_string_suffix),
-          strong=re.compile(non_whitespace_escape_before
-                            + r'(\*\*)' + end_string_suffix),
-          interpreted_or_phrase_ref=re.compile(
-              r"""
-              %(non_whitespace_escape_before)s
-              (
-                `
-                (?P<suffix>
-                  (?P<role>:%(simplename)s:)?
-                  (?P<refend>__?)?
-                )
-              )
-              %(end_string_suffix)s
-              """ % locals(), re.VERBOSE | re.UNICODE),
-          embedded_uri=re.compile(
-              r"""
-              (
-                (?:[ \n]+|^)            # spaces or beginning of line/string
-                <                       # open bracket
-                %(non_whitespace_after)s
-                ([^<>\x00]+)            # anything but angle brackets & nulls
-                %(non_whitespace_before)s
-                >                       # close bracket w/o whitespace before
-              )
-              $                         # end of string
-              """ % locals(), re.VERBOSE),
-          literal=re.compile(non_whitespace_before + '(``)'
-                             + end_string_suffix),
-          target=re.compile(non_whitespace_escape_before
-                            + r'(`)' + end_string_suffix),
-          substitution_ref=re.compile(non_whitespace_escape_before
-                                      + r'(\|_{0,2})'
-                                      + end_string_suffix),
-          email=re.compile(email_pattern % locals() + '$', re.VERBOSE),
-          uri=re.compile(
-                (r"""
-                %(start_string_prefix)s
-                (?P<whole>
-                  (?P<absolute>           # absolute URI
-                    (?P<scheme>             # scheme (http, ftp, mailto)
-                      [a-zA-Z][a-zA-Z0-9.+-]*
-                    )
-                    :
-                    (
-                      (                       # either:
-                        (//?)?                  # hierarchical URI
-                        %(uric)s*               # URI characters
-                        %(uri_end)s             # final URI char
-                      )
-                      (                       # optional query
-                        \?%(uric)s*
-                        %(uri_end)s
-                      )?
-                      (                       # optional fragment
-                        \#%(uric)s*
-                        %(uri_end)s
-                      )?
-                    )
-                  )
-                |                       # *OR*
-                  (?P<email>              # email address
-                    """ + email_pattern + r"""
-                  )
-                )
-                %(end_string_suffix)s
-                """) % locals(), re.VERBOSE),
-          pep=re.compile(
-                r"""
-                %(start_string_prefix)s
-                (
-                  (pep-(?P<pepnum1>\d+)(.txt)?) # reference to source file
-                |
-                  (PEP\s+(?P<pepnum2>\d+))      # reference by name
-                )
-                %(end_string_suffix)s""" % locals(), re.VERBOSE),
-          rfc=re.compile(
-                r"""
-                %(start_string_prefix)s
-                (RFC(-|\s+)?(?P<rfcnum>\d+))
-                %(end_string_suffix)s""" % locals(), re.VERBOSE))
-
-    def quoted_start(self, match):
-        """Return 1 if inline markup start-string is 'quoted', 0 if not."""
-        string = match.string
-        start = match.start()
-        end = match.end()
-        if start == 0:                  # start-string at beginning of text
-            return 0
-        prestart = string[start - 1]
-        try:
-            poststart = string[end]
-            if self.openers.index(prestart) \
-                  == self.closers.index(poststart):   # quoted
-                return 1
-        except IndexError:              # start-string at end of text
-            return 1
-        except ValueError:              # not quoted
-            pass
-        return 0
-
-    def inline_obj(self, match, lineno, end_pattern, nodeclass,
-                   restore_backslashes=0):
-        string = match.string
-        matchstart = match.start('start')
-        matchend = match.end('start')
-        if self.quoted_start(match):
-            return (string[:matchend], [], string[matchend:], [], '')
-        endmatch = end_pattern.search(string[matchend:])
-        if endmatch and endmatch.start(1):  # 1 or more chars
-            text = unescape(endmatch.string[:endmatch.start(1)],
-                            restore_backslashes)
-            textend = matchend + endmatch.end(1)
-            rawsource = unescape(string[matchstart:textend], 1)
-            return (string[:matchstart], [nodeclass(rawsource, text)],
-                    string[textend:], [], endmatch.group(1))
-        msg = self.reporter.warning(
-              'Inline %s start-string without end-string.'
-              % nodeclass.__name__, line=lineno)
-        text = unescape(string[matchstart:matchend], 1)
-        rawsource = unescape(string[matchstart:matchend], 1)
-        prb = self.problematic(text, rawsource, msg)
-        return string[:matchstart], [prb], string[matchend:], [msg], ''
-
-    def problematic(self, text, rawsource, message):
-        msgid = self.document.set_id(message, self.parent)
-        problematic = nodes.problematic(rawsource, text, refid=msgid)
-        prbid = self.document.set_id(problematic)
-        message.add_backref(prbid)
-        return problematic
-
-    def emphasis(self, match, lineno):
-        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
-              match, lineno, self.patterns.emphasis, nodes.emphasis)
-        return before, inlines, remaining, sysmessages
-
-    def strong(self, match, lineno):
-        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
-              match, lineno, self.patterns.strong, nodes.strong)
-        return before, inlines, remaining, sysmessages
-
-    def interpreted_or_phrase_ref(self, match, lineno):
-        end_pattern = self.patterns.interpreted_or_phrase_ref
-        string = match.string
-        matchstart = match.start('backquote')
-        matchend = match.end('backquote')
-        rolestart = match.start('role')
-        role = match.group('role')
-        position = ''
-        if role:
-            role = role[1:-1]
-            position = 'prefix'
-        elif self.quoted_start(match):
-            return (string[:matchend], [], string[matchend:], [])
-        endmatch = end_pattern.search(string[matchend:])
-        if endmatch and endmatch.start(1):  # 1 or more chars
-            textend = matchend + endmatch.end()
-            if endmatch.group('role'):
-                if role:
-                    msg = self.reporter.warning(
-                        'Multiple roles in interpreted text (both '
-                        'prefix and suffix present; only one allowed).',
-                        line=lineno)
-                    text = unescape(string[rolestart:textend], 1)
-                    prb = self.problematic(text, text, msg)
-                    return string[:rolestart], [prb], string[textend:], [msg]
-                role = endmatch.group('suffix')[1:-1]
-                position = 'suffix'
-            escaped = endmatch.string[:endmatch.start(1)]
-            rawsource = unescape(string[matchstart:textend], 1)
-            if rawsource[-1:] == '_':
-                if role:
-                    msg = self.reporter.warning(
-                          'Mismatch: both interpreted text role %s and '
-                          'reference suffix.' % position, line=lineno)
-                    text = unescape(string[rolestart:textend], 1)
-                    prb = self.problematic(text, text, msg)
-                    return string[:rolestart], [prb], string[textend:], [msg]
-                return self.phrase_ref(string[:matchstart], string[textend:],
-                                       rawsource, escaped, unescape(escaped))
-            else:
-                rawsource = unescape(string[rolestart:textend], 1)
-                nodelist, messages = self.interpreted(rawsource, escaped, role,
-                                                      lineno)
-                return (string[:rolestart], nodelist,
-                        string[textend:], messages)
-        msg = self.reporter.warning(
-              'Inline interpreted text or phrase reference start-string '
-              'without end-string.', line=lineno)
-        text = unescape(string[matchstart:matchend], 1)
-        prb = self.problematic(text, text, msg)
-        return string[:matchstart], [prb], string[matchend:], [msg]
-
-    def phrase_ref(self, before, after, rawsource, escaped, text):
-        match = self.patterns.embedded_uri.search(escaped)
-        if match:
-            text = unescape(escaped[:match.start(0)])
-            uri_text = match.group(2)
-            uri = ''.join(uri_text.split())
-            uri = self.adjust_uri(uri)
-            if uri:
-                target = nodes.target(match.group(1), refuri=uri)
-            else:
-                raise ApplicationError('problem with URI: %r' % uri_text)
-            if not text:
-                text = uri
-        else:
-            target = None
-        refname = normalize_name(text)
-        reference = nodes.reference(rawsource, text,
-                                    name=whitespace_normalize_name(text))
-        node_list = [reference]
-        if rawsource[-2:] == '__':
-            if target:
-                reference['refuri'] = uri
-            else:
-                reference['anonymous'] = 1
-        else:
-            if target:
-                reference['refuri'] = uri
-                target['names'].append(refname)
-                self.document.note_explicit_target(target, self.parent)
-                node_list.append(target)
-            else:
-                reference['refname'] = refname
-                self.document.note_refname(reference)
-        return before, node_list, after, []
-
-    def adjust_uri(self, uri):
-        match = self.patterns.email.match(uri)
-        if match:
-            return 'mailto:' + uri
-        else:
-            return uri
-
-    def interpreted(self, rawsource, text, role, lineno):
-        role_fn, messages = roles.role(role, self.language, lineno,
-                                       self.reporter)
-        if role_fn:
-            nodes, messages2 = role_fn(role, rawsource, text, lineno, self)
-            return nodes, messages + messages2
-        else:
-            msg = self.reporter.error(
-                'Unknown interpreted text role "%s".' % role,
-                line=lineno)
-            return ([self.problematic(rawsource, rawsource, msg)],
-                    messages + [msg])
-
-    def literal(self, match, lineno):
-        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
-              match, lineno, self.patterns.literal, nodes.literal,
-              restore_backslashes=1)
-        return before, inlines, remaining, sysmessages
-
-    def inline_internal_target(self, match, lineno):
-        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
-              match, lineno, self.patterns.target, nodes.target)
-        if inlines and isinstance(inlines[0], nodes.target):
-            assert len(inlines) == 1
-            target = inlines[0]
-            name = normalize_name(target.astext())
-            target['names'].append(name)
-            self.document.note_explicit_target(target, self.parent)
-        return before, inlines, remaining, sysmessages
-
-    def substitution_reference(self, match, lineno):
-        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
-              match, lineno, self.patterns.substitution_ref,
-              nodes.substitution_reference)
-        if len(inlines) == 1:
-            subref_node = inlines[0]
-            if isinstance(subref_node, nodes.substitution_reference):
-                subref_text = subref_node.astext()
-                self.document.note_substitution_ref(subref_node, subref_text)
-                if endstring[-1:] == '_':
-                    reference_node = nodes.reference(
-                        '|%s%s' % (subref_text, endstring), '')
-                    if endstring[-2:] == '__':
-                        reference_node['anonymous'] = 1
-                    else:
-                        reference_node['refname'] = normalize_name(subref_text)
-                        self.document.note_refname(reference_node)
-                    reference_node += subref_node
-                    inlines = [reference_node]
-        return before, inlines, remaining, sysmessages
-
-    def footnote_reference(self, match, lineno):
-        """
-        Handles `nodes.footnote_reference` and `nodes.citation_reference`
-        elements.
-        """
-        label = match.group('footnotelabel')
-        refname = normalize_name(label)
-        string = match.string
-        before = string[:match.start('whole')]
-        remaining = string[match.end('whole'):]
-        if match.group('citationlabel'):
-            refnode = nodes.citation_reference('[%s]_' % label,
-                                               refname=refname)
-            refnode += nodes.Text(label)
-            self.document.note_citation_ref(refnode)
-        else:
-            refnode = nodes.footnote_reference('[%s]_' % label)
-            if refname[0] == '#':
-                refname = refname[1:]
-                refnode['auto'] = 1
-                self.document.note_autofootnote_ref(refnode)
-            elif refname == '*':
-                refname = ''
-                refnode['auto'] = '*'
-                self.document.note_symbol_footnote_ref(
-                      refnode)
-            else:
-                refnode += nodes.Text(label)
-            if refname:
-                refnode['refname'] = refname
-                self.document.note_footnote_ref(refnode)
-            if utils.get_trim_footnote_ref_space(self.document.settings):
-                before = before.rstrip()
-        return (before, [refnode], remaining, [])
-
-    def reference(self, match, lineno, anonymous=None):
-        referencename = match.group('refname')
-        refname = normalize_name(referencename)
-        referencenode = nodes.reference(
-            referencename + match.group('refend'), referencename,
-            name=whitespace_normalize_name(referencename))
-        if anonymous:
-            referencenode['anonymous'] = 1
-        else:
-            referencenode['refname'] = refname
-            self.document.note_refname(referencenode)
-        string = match.string
-        matchstart = match.start('whole')
-        matchend = match.end('whole')
-        return (string[:matchstart], [referencenode], string[matchend:], [])
-
-    def anonymous_reference(self, match, lineno):
-        return self.reference(match, lineno, anonymous=1)
-
-    def standalone_uri(self, match, lineno):
-        if not match.group('scheme') or urischemes.schemes.has_key(
-              match.group('scheme').lower()):
-            if match.group('email'):
-                addscheme = 'mailto:'
-            else:
-                addscheme = ''
-            text = match.group('whole')
-            unescaped = unescape(text, 0)
-            return [nodes.reference(unescape(text, 1), unescaped,
-                                    refuri=addscheme + unescaped)]
-        else:                   # not a valid scheme
-            raise MarkupMismatch
-
-    def pep_reference(self, match, lineno):
-        text = match.group(0)
-        if text.startswith('pep-'):
-            pepnum = int(match.group('pepnum1'))
-        elif text.startswith('PEP'):
-            pepnum = int(match.group('pepnum2'))
-        else:
-            raise MarkupMismatch
-        ref = (self.document.settings.pep_base_url
-               + self.document.settings.pep_file_url_template % pepnum)
-        unescaped = unescape(text, 0)
-        return [nodes.reference(unescape(text, 1), unescaped, refuri=ref)]
-
-    rfc_url = 'rfc%d.html'
-
-    def rfc_reference(self, match, lineno):
-        text = match.group(0)
-        if text.startswith('RFC'):
-            rfcnum = int(match.group('rfcnum'))
-            ref = self.document.settings.rfc_base_url + self.rfc_url % rfcnum
-        else:
-            raise MarkupMismatch
-        unescaped = unescape(text, 0)
-        return [nodes.reference(unescape(text, 1), unescaped, refuri=ref)]
-
-    def implicit_inline(self, text, lineno):
-        """
-        Check each of the patterns in `self.implicit_dispatch` for a match,
-        and dispatch to the stored method for the pattern.  Recursively check
-        the text before and after the match.  Return a list of `nodes.Text`
-        and inline element nodes.
-        """
-        if not text:
-            return []
-        for pattern, method in self.implicit_dispatch:
-            match = pattern.search(text)
-            if match:
-                try:
-                    # Must recurse on strings before *and* after the match;
-                    # there may be multiple patterns.
-                    return (self.implicit_inline(text[:match.start()], lineno)
-                            + method(match, lineno) +
-                            self.implicit_inline(text[match.end():], lineno))
-                except MarkupMismatch:
-                    pass
-        return [nodes.Text(unescape(text), rawsource=unescape(text, 1))]
-
-    dispatch = {'*': emphasis,
-                '**': strong,
-                '`': interpreted_or_phrase_ref,
-                '``': literal,
-                '_`': inline_internal_target,
-                ']_': footnote_reference,
-                '|': substitution_reference,
-                '_': reference,
-                '__': anonymous_reference}
-
-
-def _loweralpha_to_int(s, _zero=(ord('a')-1)):
-    return ord(s) - _zero
-
-def _upperalpha_to_int(s, _zero=(ord('A')-1)):
-    return ord(s) - _zero
-
-def _lowerroman_to_int(s):
-    return roman.fromRoman(s.upper())
-
-
-class Body(RSTState):
-
-    """
-    Generic classifier of the first line of a block.
-    """
-
-    double_width_pad_char = tableparser.TableParser.double_width_pad_char
-    """Padding character for East Asian double-width text."""
-
-    enum = Struct()
-    """Enumerated list parsing information."""
-
-    enum.formatinfo = {
-          'parens': Struct(prefix='(', suffix=')', start=1, end=-1),
-          'rparen': Struct(prefix='', suffix=')', start=0, end=-1),
-          'period': Struct(prefix='', suffix='.', start=0, end=-1)}
-    enum.formats = enum.formatinfo.keys()
-    enum.sequences = ['arabic', 'loweralpha', 'upperalpha',
-                      'lowerroman', 'upperroman'] # ORDERED!
-    enum.sequencepats = {'arabic': '[0-9]+',
-                         'loweralpha': '[a-z]',
-                         'upperalpha': '[A-Z]',
-                         'lowerroman': '[ivxlcdm]+',
-                         'upperroman': '[IVXLCDM]+',}
-    enum.converters = {'arabic': int,
-                       'loweralpha': _loweralpha_to_int,
-                       'upperalpha': _upperalpha_to_int,
-                       'lowerroman': _lowerroman_to_int,
-                       'upperroman': roman.fromRoman}
-
-    enum.sequenceregexps = {}
-    for sequence in enum.sequences:
-        enum.sequenceregexps[sequence] = re.compile(
-              enum.sequencepats[sequence] + '$')
-
-    grid_table_top_pat = re.compile(r'\+-[-+]+-\+ *$')
-    """Matches the top (& bottom) of a full table)."""
-
-    simple_table_top_pat = re.compile('=+( +=+)+ *$')
-    """Matches the top of a simple table."""
-
-    simple_table_border_pat = re.compile('=+[ =]*$')
-    """Matches the bottom & header bottom of a simple table."""
-
-    pats = {}
-    """Fragments of patterns used by transitions."""
-
-    pats['nonalphanum7bit'] = '[!-/:-@[-`{-~]'
-    pats['alpha'] = '[a-zA-Z]'
-    pats['alphanum'] = '[a-zA-Z0-9]'
-    pats['alphanumplus'] = '[a-zA-Z0-9_-]'
-    pats['enum'] = ('(%(arabic)s|%(loweralpha)s|%(upperalpha)s|%(lowerroman)s'
-                    '|%(upperroman)s|#)' % enum.sequencepats)
-    pats['optname'] = '%(alphanum)s%(alphanumplus)s*' % pats
-    # @@@ Loosen up the pattern?  Allow Unicode?
-    pats['optarg'] = '(%(alpha)s%(alphanumplus)s*|<[^<>]+>)' % pats
-    pats['shortopt'] = r'(-|\+)%(alphanum)s( ?%(optarg)s)?' % pats
-    pats['longopt'] = r'(--|/)%(optname)s([ =]%(optarg)s)?' % pats
-    pats['option'] = r'(%(shortopt)s|%(longopt)s)' % pats
-
-    for format in enum.formats:
-        pats[format] = '(?P<%s>%s%s%s)' % (
-              format, re.escape(enum.formatinfo[format].prefix),
-              pats['enum'], re.escape(enum.formatinfo[format].suffix))
-
-    patterns = {
-          'bullet': ur'[-+*\u2022\u2023\u2043]( +|$)',
-          'enumerator': r'(%(parens)s|%(rparen)s|%(period)s)( +|$)' % pats,
-          'field_marker': r':(?![: ])([^:\\]|\\.)*(?<! ):( +|$)',
-          'option_marker': r'%(option)s(, %(option)s)*(  +| ?$)' % pats,
-          'doctest': r'>>>( +|$)',
-          'line_block': r'\|( +|$)',
-          'grid_table_top': grid_table_top_pat,
-          'simple_table_top': simple_table_top_pat,
-          'explicit_markup': r'\.\.( +|$)',
-          'anonymous': r'__( +|$)',
-          'line': r'(%(nonalphanum7bit)s)\1* *$' % pats,
-          'text': r''}
-    initial_transitions = (
-          'bullet',
-          'enumerator',
-          'field_marker',
-          'option_marker',
-          'doctest',
-          'line_block',
-          'grid_table_top',
-          'simple_table_top',
-          'explicit_markup',
-          'anonymous',
-          'line',
-          'text')
-
-    def indent(self, match, context, next_state):
-        """Block quote."""
-        indented, indent, line_offset, blank_finish = \
-              self.state_machine.get_indented()
-        elements = self.block_quote(indented, line_offset)
-        self.parent += elements
-        if not blank_finish:
-            self.parent += self.unindent_warning('Block quote')
-        return context, next_state, []
-
-    def block_quote(self, indented, line_offset):
-        elements = []
-        while indented:
-            (blockquote_lines,
-             attribution_lines,
-             attribution_offset,
-             indented,
-             new_line_offset) = self.split_attribution(indented, line_offset)
-            blockquote = nodes.block_quote()
-            self.nested_parse(blockquote_lines, line_offset, blockquote)
-            elements.append(blockquote)
-            if attribution_lines:
-                attribution, messages = self.parse_attribution(
-                    attribution_lines, attribution_offset)
-                blockquote += attribution
-                elements += messages
-            line_offset = new_line_offset
-            while indented and not indented[0]:
-                indented = indented[1:]
-                line_offset += 1
-        return elements
-
-    # U+2014 is an em-dash:
-    attribution_pattern = re.compile(ur'(---?(?!-)|\u2014) *(?=[^ \n])')
-
-    def split_attribution(self, indented, line_offset):
-        """
-        Check for a block quote attribution and split it off:
-
-        * First line after a blank line must begin with a dash ("--", "---",
-          em-dash; matches `self.attribution_pattern`).
-        * Every line after that must have consistent indentation.
-        * Attributions must be preceded by block quote content.
-
-        Return a tuple of: (block quote content lines, content offset,
-        attribution lines, attribution offset, remaining indented lines).
-        """
-        blank = None
-        nonblank_seen = False
-        for i in range(len(indented)):
-            line = indented[i].rstrip()
-            if line:
-                if nonblank_seen and blank == i - 1: # last line blank
-                    match = self.attribution_pattern.match(line)
-                    if match:
-                        attribution_end, indent = self.check_attribution(
-                            indented, i)
-                        if attribution_end:
-                            a_lines = indented[i:attribution_end]
-                            a_lines.trim_left(match.end(), end=1)
-                            a_lines.trim_left(indent, start=1)
-                            return (indented[:i], a_lines,
-                                    i, indented[attribution_end:],
-                                    line_offset + attribution_end)
-                nonblank_seen = True
-            else:
-                blank = i
-        else:
-            return (indented, None, None, None, None)
-
-    def check_attribution(self, indented, attribution_start):
-        """
-        Check attribution shape.
-        Return the index past the end of the attribution, and the indent.
-        """
-        indent = None
-        i = attribution_start + 1
-        for i in range(attribution_start + 1, len(indented)):
-            line = indented[i].rstrip()
-            if not line:
-                break
-            if indent is None:
-                indent = len(line) - len(line.lstrip())
-            elif len(line) - len(line.lstrip()) != indent:
-                return None, None       # bad shape; not an attribution
-        else:
-            # return index of line after last attribution line:
-            i += 1
-        return i, (indent or 0)
-
-    def parse_attribution(self, indented, line_offset):
-        text = '\n'.join(indented).rstrip()
-        lineno = self.state_machine.abs_line_number() + line_offset
-        textnodes, messages = self.inline_text(text, lineno)
-        node = nodes.attribution(text, '', *textnodes)
-        node.line = lineno
-        return node, messages
-
-    def bullet(self, match, context, next_state):
-        """Bullet list item."""
-        bulletlist = nodes.bullet_list()
-        self.parent += bulletlist
-        bulletlist['bullet'] = match.string[0]
-        i, blank_finish = self.list_item(match.end())
-        bulletlist += i
-        offset = self.state_machine.line_offset + 1   # next line
-        new_line_offset, blank_finish = self.nested_list_parse(
-              self.state_machine.input_lines[offset:],
-              input_offset=self.state_machine.abs_line_offset() + 1,
-              node=bulletlist, initial_state='BulletList',
-              blank_finish=blank_finish)
-        self.goto_line(new_line_offset)
-        if not blank_finish:
-            self.parent += self.unindent_warning('Bullet list')
-        return [], next_state, []
-
-    def list_item(self, indent):
-        if self.state_machine.line[indent:]:
-            indented, line_offset, blank_finish = (
-                self.state_machine.get_known_indented(indent))
-        else:
-            indented, indent, line_offset, blank_finish = (
-                self.state_machine.get_first_known_indented(indent))
-        listitem = nodes.list_item('\n'.join(indented))
-        if indented:
-            self.nested_parse(indented, input_offset=line_offset,
-                              node=listitem)
-        return listitem, blank_finish
-
-    def enumerator(self, match, context, next_state):
-        """Enumerated List Item"""
-        format, sequence, text, ordinal = self.parse_enumerator(match)
-        if not self.is_enumerated_list_item(ordinal, sequence, format):
-            raise statemachine.TransitionCorrection('text')
-        enumlist = nodes.enumerated_list()
-        self.parent += enumlist
-        if sequence == '#':
-            enumlist['enumtype'] = 'arabic'
-        else:
-            enumlist['enumtype'] = sequence
-        enumlist['prefix'] = self.enum.formatinfo[format].prefix
-        enumlist['suffix'] = self.enum.formatinfo[format].suffix
-        if ordinal != 1:
-            enumlist['start'] = ordinal
-            msg = self.reporter.info(
-                'Enumerated list start value not ordinal-1: "%s" (ordinal %s)'
-                % (text, ordinal), line=self.state_machine.abs_line_number())
-            self.parent += msg
-        listitem, blank_finish = self.list_item(match.end())
-        enumlist += listitem
-        offset = self.state_machine.line_offset + 1   # next line
-        newline_offset, blank_finish = self.nested_list_parse(
-              self.state_machine.input_lines[offset:],
-              input_offset=self.state_machine.abs_line_offset() + 1,
-              node=enumlist, initial_state='EnumeratedList',
-              blank_finish=blank_finish,
-              extra_settings={'lastordinal': ordinal,
-                              'format': format,
-                              'auto': sequence == '#'})
-        self.goto_line(newline_offset)
-        if not blank_finish:
-            self.parent += self.unindent_warning('Enumerated list')
-        return [], next_state, []
-
-    def parse_enumerator(self, match, expected_sequence=None):
-        """
-        Analyze an enumerator and return the results.
-
-        :Return:
-            - the enumerator format ('period', 'parens', or 'rparen'),
-            - the sequence used ('arabic', 'loweralpha', 'upperroman', etc.),
-            - the text of the enumerator, stripped of formatting, and
-            - the ordinal value of the enumerator ('a' -> 1, 'ii' -> 2, etc.;
-              ``None`` is returned for invalid enumerator text).
-
-        The enumerator format has already been determined by the regular
-        expression match. If `expected_sequence` is given, that sequence is
-        tried first. If not, we check for Roman numeral 1. This way,
-        single-character Roman numerals (which are also alphabetical) can be
-        matched. If no sequence has been matched, all sequences are checked in
-        order.
-        """
-        groupdict = match.groupdict()
-        sequence = ''
-        for format in self.enum.formats:
-            if groupdict[format]:       # was this the format matched?
-                break                   # yes; keep `format`
-        else:                           # shouldn't happen
-            raise ParserError('enumerator format not matched')
-        text = groupdict[format][self.enum.formatinfo[format].start
-                                 :self.enum.formatinfo[format].end]
-        if text == '#':
-            sequence = '#'
-        elif expected_sequence:
-            try:
-                if self.enum.sequenceregexps[expected_sequence].match(text):
-                    sequence = expected_sequence
-            except KeyError:            # shouldn't happen
-                raise ParserError('unknown enumerator sequence: %s'
-                                  % sequence)
-        elif text == 'i':
-            sequence = 'lowerroman'
-        elif text == 'I':
-            sequence = 'upperroman'
-        if not sequence:
-            for sequence in self.enum.sequences:
-                if self.enum.sequenceregexps[sequence].match(text):
-                    break
-            else:                       # shouldn't happen
-                raise ParserError('enumerator sequence not matched')
-        if sequence == '#':
-            ordinal = 1
-        else:
-            try:
-                ordinal = self.enum.converters[sequence](text)
-            except roman.InvalidRomanNumeralError:
-                ordinal = None
-        return format, sequence, text, ordinal
-
-    def is_enumerated_list_item(self, ordinal, sequence, format):
-        """
-        Check validity based on the ordinal value and the second line.
-
-        Return true iff the ordinal is valid and the second line is blank,
-        indented, or starts with the next enumerator or an auto-enumerator.
-        """
-        if ordinal is None:
-            return None
-        try:
-            next_line = self.state_machine.next_line()
-        except EOFError:              # end of input lines
-            self.state_machine.previous_line()
-            return 1
-        else:
-            self.state_machine.previous_line()
-        if not next_line[:1].strip():   # blank or indented
-            return 1
-        result = self.make_enumerator(ordinal + 1, sequence, format)
-        if result:
-            next_enumerator, auto_enumerator = result
-            try:
-                if ( next_line.startswith(next_enumerator) or
-                     next_line.startswith(auto_enumerator) ):
-                    return 1
-            except TypeError:
-                pass
-        return None
-
-    def make_enumerator(self, ordinal, sequence, format):
-        """
-        Construct and return the next enumerated list item marker, and an
-        auto-enumerator ("#" instead of the regular enumerator).
-
-        Return ``None`` for invalid (out of range) ordinals.
-        """ #"
-        if sequence == '#':
-            enumerator = '#'
-        elif sequence == 'arabic':
-            enumerator = str(ordinal)
-        else:
-            if sequence.endswith('alpha'):
-                if ordinal > 26:
-                    return None
-                enumerator = chr(ordinal + ord('a') - 1)
-            elif sequence.endswith('roman'):
-                try:
-                    enumerator = roman.toRoman(ordinal)
-                except roman.RomanError:
-                    return None
-            else:                       # shouldn't happen
-                raise ParserError('unknown enumerator sequence: "%s"'
-                                  % sequence)
-            if sequence.startswith('lower'):
-                enumerator = enumerator.lower()
-            elif sequence.startswith('upper'):
-                enumerator = enumerator.upper()
-            else:                       # shouldn't happen
-                raise ParserError('unknown enumerator sequence: "%s"'
-                                  % sequence)
-        formatinfo = self.enum.formatinfo[format]
-        next_enumerator = (formatinfo.prefix + enumerator + formatinfo.suffix
-                           + ' ')
-        auto_enumerator = formatinfo.prefix + '#' + formatinfo.suffix + ' '
-        return next_enumerator, auto_enumerator
-
-    def field_marker(self, match, context, next_state):
-        """Field list item."""
-        field_list = nodes.field_list()
-        self.parent += field_list
-        field, blank_finish = self.field(match)
-        field_list += field
-        offset = self.state_machine.line_offset + 1   # next line
-        newline_offset, blank_finish = self.nested_list_parse(
-              self.state_machine.input_lines[offset:],
-              input_offset=self.state_machine.abs_line_offset() + 1,
-              node=field_list, initial_state='FieldList',
-              blank_finish=blank_finish)
-        self.goto_line(newline_offset)
-        if not blank_finish:
-            self.parent += self.unindent_warning('Field list')
-        return [], next_state, []
-
-    def field(self, match):
-        name = self.parse_field_marker(match)
-        lineno = self.state_machine.abs_line_number()
-        indented, indent, line_offset, blank_finish = \
-              self.state_machine.get_first_known_indented(match.end())
-        field_node = nodes.field()
-        field_node.line = lineno
-        name_nodes, name_messages = self.inline_text(name, lineno)
-        field_node += nodes.field_name(name, '', *name_nodes)
-        field_body = nodes.field_body('\n'.join(indented), *name_messages)
-        field_node += field_body
-        if indented:
-            self.parse_field_body(indented, line_offset, field_body)
-        return field_node, blank_finish
-
-    def parse_field_marker(self, match):
-        """Extract & return field name from a field marker match."""
-        field = match.group()[1:]        # strip off leading ':'
-        field = field[:field.rfind(':')] # strip off trailing ':' etc.
-        return field
-
-    def parse_field_body(self, indented, offset, node):
-        self.nested_parse(indented, input_offset=offset, node=node)
-
-    def option_marker(self, match, context, next_state):
-        """Option list item."""
-        optionlist = nodes.option_list()
-        try:
-            listitem, blank_finish = self.option_list_item(match)
-        except MarkupError, (message, lineno):
-            # This shouldn't happen; pattern won't match.
-            msg = self.reporter.error(
-                'Invalid option list marker: %s' % message, line=lineno)
-            self.parent += msg
-            indented, indent, line_offset, blank_finish = \
-                  self.state_machine.get_first_known_indented(match.end())
-            elements = self.block_quote(indented, line_offset)
-            self.parent += elements
-            if not blank_finish:
-                self.parent += self.unindent_warning('Option list')
-            return [], next_state, []
-        self.parent += optionlist
-        optionlist += listitem
-        offset = self.state_machine.line_offset + 1   # next line
-        newline_offset, blank_finish = self.nested_list_parse(
-              self.state_machine.input_lines[offset:],
-              input_offset=self.state_machine.abs_line_offset() + 1,
-              node=optionlist, initial_state='OptionList',
-              blank_finish=blank_finish)
-        self.goto_line(newline_offset)
-        if not blank_finish:
-            self.parent += self.unindent_warning('Option list')
-        return [], next_state, []
-
-    def option_list_item(self, match):
-        offset = self.state_machine.abs_line_offset()
-        options = self.parse_option_marker(match)
-        indented, indent, line_offset, blank_finish = \
-              self.state_machine.get_first_known_indented(match.end())
-        if not indented:                # not an option list item
-            self.goto_line(offset)
-            raise statemachine.TransitionCorrection('text')
-        option_group = nodes.option_group('', *options)
-        description = nodes.description('\n'.join(indented))
-        option_list_item = nodes.option_list_item('', option_group,
-                                                  description)
-        if indented:
-            self.nested_parse(indented, input_offset=line_offset,
-                              node=description)
-        return option_list_item, blank_finish
-
-    def parse_option_marker(self, match):
-        """
-        Return a list of `node.option` and `node.option_argument` objects,
-        parsed from an option marker match.
-
-        :Exception: `MarkupError` for invalid option markers.
-        """
-        optlist = []
-        optionstrings = match.group().rstrip().split(', ')
-        for optionstring in optionstrings:
-            tokens = optionstring.split()
-            delimiter = ' '
-            firstopt = tokens[0].split('=')
-            if len(firstopt) > 1:
-                # "--opt=value" form
-                tokens[:1] = firstopt
-                delimiter = '='
-            elif (len(tokens[0]) > 2
-                  and ((tokens[0].startswith('-')
-                        and not tokens[0].startswith('--'))
-                       or tokens[0].startswith('+'))):
-                # "-ovalue" form
-                tokens[:1] = [tokens[0][:2], tokens[0][2:]]
-                delimiter = ''
-            if len(tokens) > 1 and (tokens[1].startswith('<')
-                                    and tokens[-1].endswith('>')):
-                # "-o <value1 value2>" form; join all values into one token
-                tokens[1:] = [' '.join(tokens[1:])]
-            if 0 < len(tokens) <= 2:
-                option = nodes.option(optionstring)
-                option += nodes.option_string(tokens[0], tokens[0])
-                if len(tokens) > 1:
-                    option += nodes.option_argument(tokens[1], tokens[1],
-                                                    delimiter=delimiter)
-                optlist.append(option)
-            else:
-                raise MarkupError(
-                    'wrong number of option tokens (=%s), should be 1 or 2: '
-                    '"%s"' % (len(tokens), optionstring),
-                    self.state_machine.abs_line_number() + 1)
-        return optlist
-
-    def doctest(self, match, context, next_state):
-        data = '\n'.join(self.state_machine.get_text_block())
-        self.parent += nodes.doctest_block(data, data)
-        return [], next_state, []
-
-    def line_block(self, match, context, next_state):
-        """First line of a line block."""
-        block = nodes.line_block()
-        self.parent += block
-        lineno = self.state_machine.abs_line_number()
-        line, messages, blank_finish = self.line_block_line(match, lineno)
-        block += line
-        self.parent += messages
-        if not blank_finish:
-            offset = self.state_machine.line_offset + 1   # next line
-            new_line_offset, blank_finish = self.nested_list_parse(
-                  self.state_machine.input_lines[offset:],
-                  input_offset=self.state_machine.abs_line_offset() + 1,
-                  node=block, initial_state='LineBlock',
-                  blank_finish=0)
-            self.goto_line(new_line_offset)
-        if not blank_finish:
-            self.parent += self.reporter.warning(
-                'Line block ends without a blank line.',
-                line=(self.state_machine.abs_line_number() + 1))
-        if len(block):
-            if block[0].indent is None:
-                block[0].indent = 0
-            self.nest_line_block_lines(block)
-        return [], next_state, []
-
-    def line_block_line(self, match, lineno):
-        """Return one line element of a line_block."""
-        indented, indent, line_offset, blank_finish = \
-              self.state_machine.get_first_known_indented(match.end(),
-                                                          until_blank=1)
-        text = u'\n'.join(indented)
-        text_nodes, messages = self.inline_text(text, lineno)
-        line = nodes.line(text, '', *text_nodes)
-        if match.string.rstrip() != '|': # not empty
-            line.indent = len(match.group(1)) - 1
-        return line, messages, blank_finish
-
-    def nest_line_block_lines(self, block):
-        for index in range(1, len(block)):
-            if block[index].indent is None:
-                block[index].indent = block[index - 1].indent
-        self.nest_line_block_segment(block)
-
-    def nest_line_block_segment(self, block):
-        indents = [item.indent for item in block]
-        least = min(indents)
-        new_items = []
-        new_block = nodes.line_block()
-        for item in block:
-            if item.indent > least:
-                new_block.append(item)
-            else:
-                if len(new_block):
-                    self.nest_line_block_segment(new_block)
-                    new_items.append(new_block)
-                    new_block = nodes.line_block()
-                new_items.append(item)
-        if len(new_block):
-            self.nest_line_block_segment(new_block)
-            new_items.append(new_block)
-        block[:] = new_items
-
-    def grid_table_top(self, match, context, next_state):
-        """Top border of a full table."""
-        return self.table_top(match, context, next_state,
-                              self.isolate_grid_table,
-                              tableparser.GridTableParser)
-
-    def simple_table_top(self, match, context, next_state):
-        """Top border of a simple table."""
-        return self.table_top(match, context, next_state,
-                              self.isolate_simple_table,
-                              tableparser.SimpleTableParser)
-
-    def table_top(self, match, context, next_state,
-                  isolate_function, parser_class):
-        """Top border of a generic table."""
-        nodelist, blank_finish = self.table(isolate_function, parser_class)
-        self.parent += nodelist
-        if not blank_finish:
-            msg = self.reporter.warning(
-                'Blank line required after table.',
-                line=self.state_machine.abs_line_number() + 1)
-            self.parent += msg
-        return [], next_state, []
-
-    def table(self, isolate_function, parser_class):
-        """Parse a table."""
-        block, messages, blank_finish = isolate_function()
-        if block:
-            try:
-                parser = parser_class()
-                tabledata = parser.parse(block)
-                tableline = (self.state_machine.abs_line_number() - len(block)
-                             + 1)
-                table = self.build_table(tabledata, tableline)
-                nodelist = [table] + messages
-            except tableparser.TableMarkupError, detail:
-                nodelist = self.malformed_table(
-                    block, ' '.join(detail.args)) + messages
-        else:
-            nodelist = messages
-        return nodelist, blank_finish
-
-    def isolate_grid_table(self):
-        messages = []
-        blank_finish = 1
-        try:
-            block = self.state_machine.get_text_block(flush_left=1)
-        except statemachine.UnexpectedIndentationError, instance:
-            block, source, lineno = instance.args
-            messages.append(self.reporter.error('Unexpected indentation.',
-                                                source=source, line=lineno))
-            blank_finish = 0
-        block.disconnect()
-        # for East Asian chars:
-        block.pad_double_width(self.double_width_pad_char)
-        width = len(block[0].strip())
-        for i in range(len(block)):
-            block[i] = block[i].strip()
-            if block[i][0] not in '+|': # check left edge
-                blank_finish = 0
-                self.state_machine.previous_line(len(block) - i)
-                del block[i:]
-                break
-        if not self.grid_table_top_pat.match(block[-1]): # find bottom
-            blank_finish = 0
-            # from second-last to third line of table:
-            for i in range(len(block) - 2, 1, -1):
-                if self.grid_table_top_pat.match(block[i]):
-                    self.state_machine.previous_line(len(block) - i + 1)
-                    del block[i+1:]
-                    break
-            else:
-                messages.extend(self.malformed_table(block))
-                return [], messages, blank_finish
-        for i in range(len(block)):     # check right edge
-            if len(block[i]) != width or block[i][-1] not in '+|':
-                messages.extend(self.malformed_table(block))
-                return [], messages, blank_finish
-        return block, messages, blank_finish
-
-    def isolate_simple_table(self):
-        start = self.state_machine.line_offset
-        lines = self.state_machine.input_lines
-        limit = len(lines) - 1
-        toplen = len(lines[start].strip())
-        pattern_match = self.simple_table_border_pat.match
-        found = 0
-        found_at = None
-        i = start + 1
-        while i <= limit:
-            line = lines[i]
-            match = pattern_match(line)
-            if match:
-                if len(line.strip()) != toplen:
-                    self.state_machine.next_line(i - start)
-                    messages = self.malformed_table(
-                        lines[start:i+1], 'Bottom/header table border does '
-                        'not match top border.')
-                    return [], messages, i == limit or not lines[i+1].strip()
-                found += 1
-                found_at = i
-                if found == 2 or i == limit or not lines[i+1].strip():
-                    end = i
-                    break
-            i += 1
-        else:                           # reached end of input_lines
-            if found:
-                extra = ' or no blank line after table bottom'
-                self.state_machine.next_line(found_at - start)
-                block = lines[start:found_at+1]
-            else:
-                extra = ''
-                self.state_machine.next_line(i - start - 1)
-                block = lines[start:]
-            messages = self.malformed_table(
-                block, 'No bottom table border found%s.' % extra)
-            return [], messages, not extra
-        self.state_machine.next_line(end - start)
-        block = lines[start:end+1]
-        # for East Asian chars:
-        block.pad_double_width(self.double_width_pad_char)
-        return block, [], end == limit or not lines[end+1].strip()
-
-    def malformed_table(self, block, detail=''):
-        block.replace(self.double_width_pad_char, '')
-        data = '\n'.join(block)
-        message = 'Malformed table.'
-        lineno = self.state_machine.abs_line_number() - len(block) + 1
-        if detail:
-            message += '\n' + detail
-        error = self.reporter.error(message, nodes.literal_block(data, data),
-                                    line=lineno)
-        return [error]
-
-    def build_table(self, tabledata, tableline, stub_columns=0):
-        colwidths, headrows, bodyrows = tabledata
-        table = nodes.table()
-        tgroup = nodes.tgroup(cols=len(colwidths))
-        table += tgroup
-        for colwidth in colwidths:
-            colspec = nodes.colspec(colwidth=colwidth)
-            if stub_columns:
-                colspec.attributes['stub'] = 1
-                stub_columns -= 1
-            tgroup += colspec
-        if headrows:
-            thead = nodes.thead()
-            tgroup += thead
-            for row in headrows:
-                thead += self.build_table_row(row, tableline)
-        tbody = nodes.tbody()
-        tgroup += tbody
-        for row in bodyrows:
-            tbody += self.build_table_row(row, tableline)
-        return table
-
-    def build_table_row(self, rowdata, tableline):
-        row = nodes.row()
-        for cell in rowdata:
-            if cell is None:
-                continue
-            morerows, morecols, offset, cellblock = cell
-            attributes = {}
-            if morerows:
-                attributes['morerows'] = morerows
-            if morecols:
-                attributes['morecols'] = morecols
-            entry = nodes.entry(**attributes)
-            row += entry
-            if ''.join(cellblock):
-                self.nested_parse(cellblock, input_offset=tableline+offset,
-                                  node=entry)
-        return row
-
-
-    explicit = Struct()
-    """Patterns and constants used for explicit markup recognition."""
-
-    explicit.patterns = Struct(
-          target=re.compile(r"""
-                            (
-                              _               # anonymous target
-                            |               # *OR*
-                              (?!_)           # no underscore at the beginning
-                              (?P<quote>`?)   # optional open quote
-                              (?![ `])        # first char. not space or
-                                              # backquote
-                              (?P<name>       # reference name
-                                .+?
-                              )
-                              %(non_whitespace_escape_before)s
-                              (?P=quote)      # close quote if open quote used
-                            )
-                            (?<!(?<!\x00):) # no unescaped colon at end
-                            %(non_whitespace_escape_before)s
-                            [ ]?            # optional space
-                            :               # end of reference name
-                            ([ ]+|$)        # followed by whitespace
-                            """ % vars(Inliner), re.VERBOSE),
-          reference=re.compile(r"""
-                               (
-                                 (?P<simple>%(simplename)s)_
-                               |                  # *OR*
-                                 `                  # open backquote
-                                 (?![ ])            # not space
-                                 (?P<phrase>.+?)    # hyperlink phrase
-                                 %(non_whitespace_escape_before)s
-                                 `_                 # close backquote,
-                                                    # reference mark
-                               )
-                               $                  # end of string
-                               """ % vars(Inliner), re.VERBOSE | re.UNICODE),
-          substitution=re.compile(r"""
-                                  (
-                                    (?![ ])          # first char. not space
-                                    (?P<name>.+?)    # substitution text
-                                    %(non_whitespace_escape_before)s
-                                    \|               # close delimiter
-                                  )
-                                  ([ ]+|$)           # followed by whitespace
-                                  """ % vars(Inliner), re.VERBOSE),)
-
-    def footnote(self, match):
-        lineno = self.state_machine.abs_line_number()
-        indented, indent, offset, blank_finish = \
-              self.state_machine.get_first_known_indented(match.end())
-        label = match.group(1)
-        name = normalize_name(label)
-        footnote = nodes.footnote('\n'.join(indented))
-        footnote.line = lineno
-        if name[0] == '#':              # auto-numbered
-            name = name[1:]             # autonumber label
-            footnote['auto'] = 1
-            if name:
-                footnote['names'].append(name)
-            self.document.note_autofootnote(footnote)
-        elif name == '*':               # auto-symbol
-            name = ''
-            footnote['auto'] = '*'
-            self.document.note_symbol_footnote(footnote)
-        else:                           # manually numbered
-            footnote += nodes.label('', label)
-            footnote['names'].append(name)
-            self.document.note_footnote(footnote)
-        if name:
-            self.document.note_explicit_target(footnote, footnote)
-        else:
-            self.document.set_id(footnote, footnote)
-        if indented:
-            self.nested_parse(indented, input_offset=offset, node=footnote)
-        return [footnote], blank_finish
-
-    def citation(self, match):
-        lineno = self.state_machine.abs_line_number()
-        indented, indent, offset, blank_finish = \
-              self.state_machine.get_first_known_indented(match.end())
-        label = match.group(1)
-        name = normalize_name(label)
-        citation = nodes.citation('\n'.join(indented))
-        citation.line = lineno
-        citation += nodes.label('', label)
-        citation['names'].append(name)
-        self.document.note_citation(citation)
-        self.document.note_explicit_target(citation, citation)
-        if indented:
-            self.nested_parse(indented, input_offset=offset, node=citation)
-        return [citation], blank_finish
-
-    def hyperlink_target(self, match):
-        pattern = self.explicit.patterns.target
-        lineno = self.state_machine.abs_line_number()
-        block, indent, offset, blank_finish = \
-              self.state_machine.get_first_known_indented(
-              match.end(), until_blank=1, strip_indent=0)
-        blocktext = match.string[:match.end()] + '\n'.join(block)
-        block = [escape2null(line) for line in block]
-        escaped = block[0]
-        blockindex = 0
-        while 1:
-            targetmatch = pattern.match(escaped)
-            if targetmatch:
-                break
-            blockindex += 1
-            try:
-                escaped += block[blockindex]
-            except IndexError:
-                raise MarkupError('malformed hyperlink target.', lineno)
-        del block[:blockindex]
-        block[0] = (block[0] + ' ')[targetmatch.end()-len(escaped)-1:].strip()
-        target = self.make_target(block, blocktext, lineno,
-                                  targetmatch.group('name'))
-        return [target], blank_finish
-
-    def make_target(self, block, block_text, lineno, target_name):
-        target_type, data = self.parse_target(block, block_text, lineno)
-        if target_type == 'refname':
-            target = nodes.target(block_text, '', refname=normalize_name(data))
-            target.indirect_reference_name = data
-            self.add_target(target_name, '', target, lineno)
-            self.document.note_indirect_target(target)
-            return target
-        elif target_type == 'refuri':
-            target = nodes.target(block_text, '')
-            self.add_target(target_name, data, target, lineno)
-            return target
-        else:
-            return data
-
-    def parse_target(self, block, block_text, lineno):
-        """
-        Determine the type of reference of a target.
-
-        :Return: A 2-tuple, one of:
-
-            - 'refname' and the indirect reference name
-            - 'refuri' and the URI
-            - 'malformed' and a system_message node
-        """
-        if block and block[-1].strip()[-1:] == '_': # possible indirect target
-            reference = ' '.join([line.strip() for line in block])
-            refname = self.is_reference(reference)
-            if refname:
-                return 'refname', refname
-        reference = ''.join([''.join(line.split()) for line in block])
-        return 'refuri', unescape(reference)
-
-    def is_reference(self, reference):
-        match = self.explicit.patterns.reference.match(
-            whitespace_normalize_name(reference))
-        if not match:
-            return None
-        return unescape(match.group('simple') or match.group('phrase'))
-
-    def add_target(self, targetname, refuri, target, lineno):
-        target.line = lineno
-        if targetname:
-            name = normalize_name(unescape(targetname))
-            target['names'].append(name)
-            if refuri:
-                uri = self.inliner.adjust_uri(refuri)
-                if uri:
-                    target['refuri'] = uri
-                else:
-                    raise ApplicationError('problem with URI: %r' % refuri)
-            self.document.note_explicit_target(target, self.parent)
-        else:                       # anonymous target
-            if refuri:
-                target['refuri'] = refuri
-            target['anonymous'] = 1
-            self.document.note_anonymous_target(target)
-
-    def substitution_def(self, match):
-        pattern = self.explicit.patterns.substitution
-        lineno = self.state_machine.abs_line_number()
-        block, indent, offset, blank_finish = \
-              self.state_machine.get_first_known_indented(match.end(),
-                                                          strip_indent=0)
-        blocktext = (match.string[:match.end()] + '\n'.join(block))
-        block.disconnect()
-        escaped = escape2null(block[0].rstrip())
-        blockindex = 0
-        while 1:
-            subdefmatch = pattern.match(escaped)
-            if subdefmatch:
-                break
-            blockindex += 1
-            try:
-                escaped = escaped + ' ' + escape2null(block[blockindex].strip())
-            except IndexError:
-                raise MarkupError('malformed substitution definition.',
-                                  lineno)
-        del block[:blockindex]          # strip out the substitution marker
-        block[0] = (block[0].strip() + ' ')[subdefmatch.end()-len(escaped)-1:-1]
-        if not block[0]:
-            del block[0]
-            offset += 1
-        while block and not block[-1].strip():
-            block.pop()
-        subname = subdefmatch.group('name')
-        substitution_node = nodes.substitution_definition(blocktext)
-        substitution_node.line = lineno
-        if not block:
-            msg = self.reporter.warning(
-                'Substitution definition "%s" missing contents.' % subname,
-                nodes.literal_block(blocktext, blocktext), line=lineno)
-            return [msg], blank_finish
-        block[0] = block[0].strip()
-        substitution_node['names'].append(
-            nodes.whitespace_normalize_name(subname))
-        new_abs_offset, blank_finish = self.nested_list_parse(
-              block, input_offset=offset, node=substitution_node,
-              initial_state='SubstitutionDef', blank_finish=blank_finish)
-        i = 0
-        for node in substitution_node[:]:
-            if not (isinstance(node, nodes.Inline) or
-                    isinstance(node, nodes.Text)):
-                self.parent += substitution_node[i]
-                del substitution_node[i]
-            else:
-                i += 1
-        for node in substitution_node.traverse(nodes.Element):
-            if self.disallowed_inside_substitution_definitions(node):
-                pformat = nodes.literal_block('', node.pformat().rstrip())
-                msg = self.reporter.error(
-                    'Substitution definition contains illegal element:',
-                    pformat, nodes.literal_block(blocktext, blocktext),
-                    line=lineno)
-                return [msg], blank_finish
-        if len(substitution_node) == 0:
-            msg = self.reporter.warning(
-                  'Substitution definition "%s" empty or invalid.'
-                  % subname,
-                  nodes.literal_block(blocktext, blocktext), line=lineno)
-            return [msg], blank_finish
-        self.document.note_substitution_def(
-            substitution_node, subname, self.parent)
-        return [substitution_node], blank_finish
-
-    def disallowed_inside_substitution_definitions(self, node):
-        if (node['ids'] or
-            isinstance(node, nodes.reference) and node.get('anonymous') or
-            isinstance(node, nodes.footnote_reference) and node.get('auto')):
-            return 1
-        else:
-            return 0
-
-    def directive(self, match, **option_presets):
-        """Returns a 2-tuple: list of nodes, and a "blank finish" boolean."""
-        type_name = match.group(1)
-        directive_class, messages = directives.directive(
-            type_name, self.memo.language, self.document)
-        self.parent += messages
-        if directive_class:
-            return self.run_directive(
-                directive_class, match, type_name, option_presets)
-        else:
-            return self.unknown_directive(type_name)
-
-    def run_directive(self, directive, match, type_name, option_presets):
-        """
-        Parse a directive then run its directive function.
-
-        Parameters:
-
-        - `directive`: The class implementing the directive.  Must be
-          a subclass of `rst.Directive`.
-
-        - `match`: A regular expression match object which matched the first
-          line of the directive.
-
-        - `type_name`: The directive name, as used in the source text.
-
-        - `option_presets`: A dictionary of preset options, defaults for the
-          directive options.  Currently, only an "alt" option is passed by
-          substitution definitions (value: the substitution name), which may
-          be used by an embedded image directive.
-
-        Returns a 2-tuple: list of nodes, and a "blank finish" boolean.
-        """
-        if isinstance(directive, (FunctionType, MethodType)):
-            from docutils.parsers.rst import convert_directive_function
-            directive = convert_directive_function(directive)
-        lineno = self.state_machine.abs_line_number()
-        initial_line_offset = self.state_machine.line_offset
-        indented, indent, line_offset, blank_finish \
-                  = self.state_machine.get_first_known_indented(match.end(),
-                                                                strip_top=0)
-        block_text = '\n'.join(self.state_machine.input_lines[
-            initial_line_offset : self.state_machine.line_offset + 1])
-        try:
-            arguments, options, content, content_offset = (
-                self.parse_directive_block(indented, line_offset,
-                                           directive, option_presets))
-        except MarkupError, detail:
-            error = self.reporter.error(
-                'Error in "%s" directive:\n%s.' % (type_name,
-                                                   ' '.join(detail.args)),
-                nodes.literal_block(block_text, block_text), line=lineno)
-            return [error], blank_finish
-        directive_instance = directive(
-            type_name, arguments, options, content, lineno,
-            content_offset, block_text, self, self.state_machine)
-        try:
-            result = directive_instance.run()
-        except docutils.parsers.rst.DirectiveError, directive_error:
-            msg_node = self.reporter.system_message(directive_error.level,
-                                                    directive_error.message)
-            msg_node += nodes.literal_block(block_text, block_text)
-            msg_node['line'] = lineno
-            result = [msg_node]
-        assert isinstance(result, list), \
-               'Directive "%s" must return a list of nodes.' % type_name
-        for i in range(len(result)):
-            assert isinstance(result[i], nodes.Node), \
-                   ('Directive "%s" returned non-Node object (index %s): %r'
-                    % (type_name, i, result[i]))
-        return (result,
-                blank_finish or self.state_machine.is_next_line_blank())
-
-    def parse_directive_block(self, indented, line_offset, directive,
-                              option_presets):
-        option_spec = directive.option_spec
-        has_content = directive.has_content
-        if indented and not indented[0].strip():
-            indented.trim_start()
-            line_offset += 1
-        while indented and not indented[-1].strip():
-            indented.trim_end()
-        if indented and (directive.required_arguments
-                         or directive.optional_arguments
-                         or option_spec):
-            for i in range(len(indented)):
-                if not indented[i].strip():
-                    break
-            else:
-                i += 1
-            arg_block = indented[:i]
-            content = indented[i+1:]
-            content_offset = line_offset + i + 1
-        else:
-            content = indented
-            content_offset = line_offset
-            arg_block = []
-        while content and not content[0].strip():
-            content.trim_start()
-            content_offset += 1
-        if option_spec:
-            options, arg_block = self.parse_directive_options(
-                option_presets, option_spec, arg_block)
-            if arg_block and not (directive.required_arguments
-                                  or directive.optional_arguments):
-                raise MarkupError('no arguments permitted; blank line '
-                                  'required before content block')
-        else:
-            options = {}
-        if directive.required_arguments or directive.optional_arguments:
-            arguments = self.parse_directive_arguments(
-                directive, arg_block)
-        else:
-            arguments = []
-        if content and not has_content:
-            raise MarkupError('no content permitted')
-        return (arguments, options, content, content_offset)
-
-    def parse_directive_options(self, option_presets, option_spec, arg_block):
-        options = option_presets.copy()
-        for i in range(len(arg_block)):
-            if arg_block[i][:1] == ':':
-                opt_block = arg_block[i:]
-                arg_block = arg_block[:i]
-                break
-        else:
-            opt_block = []
-        if opt_block:
-            success, data = self.parse_extension_options(option_spec,
-                                                         opt_block)
-            if success:                 # data is a dict of options
-                options.update(data)
-            else:                       # data is an error string
-                raise MarkupError(data)
-        return options, arg_block
-
-    def parse_directive_arguments(self, directive, arg_block):
-        required = directive.required_arguments
-        optional = directive.optional_arguments
-        arg_text = '\n'.join(arg_block)
-        arguments = arg_text.split()
-        if len(arguments) < required:
-            raise MarkupError('%s argument(s) required, %s supplied'
-                              % (required, len(arguments)))
-        elif len(arguments) > required + optional:
-            if directive.final_argument_whitespace:
-                arguments = arg_text.split(None, required + optional - 1)
-            else:
-                raise MarkupError(
-                    'maximum %s argument(s) allowed, %s supplied'
-                    % (required + optional, len(arguments)))
-        return arguments
-
-    def parse_extension_options(self, option_spec, datalines):
-        """
-        Parse `datalines` for a field list containing extension options
-        matching `option_spec`.
-
-        :Parameters:
-            - `option_spec`: a mapping of option name to conversion
-              function, which should raise an exception on bad input.
-            - `datalines`: a list of input strings.
-
-        :Return:
-            - Success value, 1 or 0.
-            - An option dictionary on success, an error string on failure.
-        """
-        node = nodes.field_list()
-        newline_offset, blank_finish = self.nested_list_parse(
-              datalines, 0, node, initial_state='ExtensionOptions',
-              blank_finish=1)
-        if newline_offset != len(datalines): # incomplete parse of block
-            return 0, 'invalid option block'
-        try:
-            options = utils.extract_extension_options(node, option_spec)
-        except KeyError, detail:
-            return 0, ('unknown option: "%s"' % detail.args[0])
-        except (ValueError, TypeError), detail:
-            return 0, ('invalid option value: %s' % ' '.join(detail.args))
-        except utils.ExtensionOptionError, detail:
-            return 0, ('invalid option data: %s' % ' '.join(detail.args))
-        if blank_finish:
-            return 1, options
-        else:
-            return 0, 'option data incompletely parsed'
-
-    def unknown_directive(self, type_name):
-        lineno = self.state_machine.abs_line_number()
-        indented, indent, offset, blank_finish = \
-              self.state_machine.get_first_known_indented(0, strip_indent=0)
-        text = '\n'.join(indented)
-        error = self.reporter.error(
-              'Unknown directive type "%s".' % type_name,
-              nodes.literal_block(text, text), line=lineno)
-        return [error], blank_finish
-
-    def comment(self, match):
-        if not match.string[match.end():].strip() \
-              and self.state_machine.is_next_line_blank(): # an empty comment?
-            return [nodes.comment()], 1 # "A tiny but practical wart."
-        indented, indent, offset, blank_finish = \
-              self.state_machine.get_first_known_indented(match.end())
-        while indented and not indented[-1].strip():
-            indented.trim_end()
-        text = '\n'.join(indented)
-        return [nodes.comment(text, text)], blank_finish
-
-    explicit.constructs = [
-          (footnote,
-           re.compile(r"""
-                      \.\.[ ]+          # explicit markup start
-                      \[
-                      (                 # footnote label:
-                          [0-9]+          # manually numbered footnote
-                        |               # *OR*
-                          \#              # anonymous auto-numbered footnote
-                        |               # *OR*
-                          \#%s            # auto-number ed?) footnote label
-                        |               # *OR*
-                          \*              # auto-symbol footnote
-                      )
-                      \]
-                      ([ ]+|$)          # whitespace or end of line
-                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE)),
-          (citation,
-           re.compile(r"""
-                      \.\.[ ]+          # explicit markup start
-                      \[(%s)\]          # citation label
-                      ([ ]+|$)          # whitespace or end of line
-                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE)),
-          (hyperlink_target,
-           re.compile(r"""
-                      \.\.[ ]+          # explicit markup start
-                      _                 # target indicator
-                      (?![ ]|$)         # first char. not space or EOL
-                      """, re.VERBOSE)),
-          (substitution_def,
-           re.compile(r"""
-                      \.\.[ ]+          # explicit markup start
-                      \|                # substitution indicator
-                      (?![ ]|$)         # first char. not space or EOL
-                      """, re.VERBOSE)),
-          (directive,
-           re.compile(r"""
-                      \.\.[ ]+          # explicit markup start
-                      (%s)              # directive name
-                      [ ]?              # optional space
-                      ::                # directive delimiter
-                      ([ ]+|$)          # whitespace or end of line
-                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE))]
-
-    def explicit_markup(self, match, context, next_state):
-        """Footnotes, hyperlink targets, directives, comments."""
-        nodelist, blank_finish = self.explicit_construct(match)
-        self.parent += nodelist
-        self.explicit_list(blank_finish)
-        return [], next_state, []
-
-    def explicit_construct(self, match):
-        """Determine which explicit construct this is, parse & return it."""
-        errors = []
-        for method, pattern in self.explicit.constructs:
-            expmatch = pattern.match(match.string)
-            if expmatch:
-                try:
-                    return method(self, expmatch)
-                except MarkupError, (message, lineno): # never reached?
-                    errors.append(self.reporter.warning(message, line=lineno))
-                    break
-        nodelist, blank_finish = self.comment(match)
-        return nodelist + errors, blank_finish
-
-    def explicit_list(self, blank_finish):
-        """
-        Create a nested state machine for a series of explicit markup
-        constructs (including anonymous hyperlink targets).
-        """
-        offset = self.state_machine.line_offset + 1   # next line
-        newline_offset, blank_finish = self.nested_list_parse(
-              self.state_machine.input_lines[offset:],
-              input_offset=self.state_machine.abs_line_offset() + 1,
-              node=self.parent, initial_state='Explicit',
-              blank_finish=blank_finish,
-              match_titles=self.state_machine.match_titles)
-        self.goto_line(newline_offset)
-        if not blank_finish:
-            self.parent += self.unindent_warning('Explicit markup')
-
-    def anonymous(self, match, context, next_state):
-        """Anonymous hyperlink targets."""
-        nodelist, blank_finish = self.anonymous_target(match)
-        self.parent += nodelist
-        self.explicit_list(blank_finish)
-        return [], next_state, []
-
-    def anonymous_target(self, match):
-        lineno = self.state_machine.abs_line_number()
-        block, indent, offset, blank_finish \
-              = self.state_machine.get_first_known_indented(match.end(),
-                                                            until_blank=1)
-        blocktext = match.string[:match.end()] + '\n'.join(block)
-        block = [escape2null(line) for line in block]
-        target = self.make_target(block, blocktext, lineno, '')
-        return [target], blank_finish
-
-    def line(self, match, context, next_state):
-        """Section title overline or transition marker."""
-        if self.state_machine.match_titles:
-            return [match.string], 'Line', []
-        elif match.string.strip() == '::':
-            raise statemachine.TransitionCorrection('text')
-        elif len(match.string.strip()) < 4:
-            msg = self.reporter.info(
-                'Unexpected possible title overline or transition.\n'
-                "Treating it as ordinary text because it's so short.",
-                line=self.state_machine.abs_line_number())
-            self.parent += msg
-            raise statemachine.TransitionCorrection('text')
-        else:
-            blocktext = self.state_machine.line
-            msg = self.reporter.severe(
-                  'Unexpected section title or transition.',
-                  nodes.literal_block(blocktext, blocktext),
-                  line=self.state_machine.abs_line_number())
-            self.parent += msg
-            return [], next_state, []
-
-    def text(self, match, context, next_state):
-        """Titles, definition lists, paragraphs."""
-        return [match.string], 'Text', []
-
-
-class RFC2822Body(Body):
-
-    """
-    RFC2822 headers are only valid as the first constructs in documents.  As
-    soon as anything else appears, the `Body` state should take over.
-    """
-
-    patterns = Body.patterns.copy()     # can't modify the original
-    patterns['rfc2822'] = r'[!-9;-~]+:( +|$)'
-    initial_transitions = [(name, 'Body')
-                           for name in Body.initial_transitions]
-    initial_transitions.insert(-1, ('rfc2822', 'Body')) # just before 'text'
-
-    def rfc2822(self, match, context, next_state):
-        """RFC2822-style field list item."""
-        fieldlist = nodes.field_list(classes=['rfc2822'])
-        self.parent += fieldlist
-        field, blank_finish = self.rfc2822_field(match)
-        fieldlist += field
-        offset = self.state_machine.line_offset + 1   # next line
-        newline_offset, blank_finish = self.nested_list_parse(
-              self.state_machine.input_lines[offset:],
-              input_offset=self.state_machine.abs_line_offset() + 1,
-              node=fieldlist, initial_state='RFC2822List',
-              blank_finish=blank_finish)
-        self.goto_line(newline_offset)
-        if not blank_finish:
-            self.parent += self.unindent_warning(
-                  'RFC2822-style field list')
-        return [], next_state, []
-
-    def rfc2822_field(self, match):
-        name = match.string[:match.string.find(':')]
-        indented, indent, line_offset, blank_finish = \
-              self.state_machine.get_first_known_indented(match.end(),
-                                                          until_blank=1)
-        fieldnode = nodes.field()
-        fieldnode += nodes.field_name(name, name)
-        fieldbody = nodes.field_body('\n'.join(indented))
-        fieldnode += fieldbody
-        if indented:
-            self.nested_parse(indented, input_offset=line_offset,
-                              node=fieldbody)
-        return fieldnode, blank_finish
-
-
-class SpecializedBody(Body):
-
-    """
-    Superclass for second and subsequent compound element members.  Compound
-    elements are lists and list-like constructs.
-
-    All transition methods are disabled (redefined as `invalid_input`).
-    Override individual methods in subclasses to re-enable.
-
-    For example, once an initial bullet list item, say, is recognized, the
-    `BulletList` subclass takes over, with a "bullet_list" node as its
-    container.  Upon encountering the initial bullet list item, `Body.bullet`
-    calls its ``self.nested_list_parse`` (`RSTState.nested_list_parse`), which
-    starts up a nested parsing session with `BulletList` as the initial state.
-    Only the ``bullet`` transition method is enabled in `BulletList`; as long
-    as only bullet list items are encountered, they are parsed and inserted
-    into the container.  The first construct which is *not* a bullet list item
-    triggers the `invalid_input` method, which ends the nested parse and
-    closes the container.  `BulletList` needs to recognize input that is
-    invalid in the context of a bullet list, which means everything *other
-    than* bullet list items, so it inherits the transition list created in
-    `Body`.
-    """
-
-    def invalid_input(self, match=None, context=None, next_state=None):
-        """Not a compound element member. Abort this state machine."""
-        self.state_machine.previous_line() # back up so parent SM can reassess
-        raise EOFError
-
-    indent = invalid_input
-    bullet = invalid_input
-    enumerator = invalid_input
-    field_marker = invalid_input
-    option_marker = invalid_input
-    doctest = invalid_input
-    line_block = invalid_input
-    grid_table_top = invalid_input
-    simple_table_top = invalid_input
-    explicit_markup = invalid_input
-    anonymous = invalid_input
-    line = invalid_input
-    text = invalid_input
-
-
-class BulletList(SpecializedBody):
-
-    """Second and subsequent bullet_list list_items."""
-
-    def bullet(self, match, context, next_state):
-        """Bullet list item."""
-        if match.string[0] != self.parent['bullet']:
-            # different bullet: new list
-            self.invalid_input()
-        listitem, blank_finish = self.list_item(match.end())
-        self.parent += listitem
-        self.blank_finish = blank_finish
-        return [], next_state, []
-
-
-class DefinitionList(SpecializedBody):
-
-    """Second and subsequent definition_list_items."""
-
-    def text(self, match, context, next_state):
-        """Definition lists."""
-        return [match.string], 'Definition', []
-
-
-class EnumeratedList(SpecializedBody):
-
-    """Second and subsequent enumerated_list list_items."""
-
-    def enumerator(self, match, context, next_state):
-        """Enumerated list item."""
-        format, sequence, text, ordinal = self.parse_enumerator(
-              match, self.parent['enumtype'])
-        if ( format != self.format
-             or (sequence != '#' and (sequence != self.parent['enumtype']
-                                      or self.auto
-                                      or ordinal != (self.lastordinal + 1)))
-             or not self.is_enumerated_list_item(ordinal, sequence, format)):
-            # different enumeration: new list
-            self.invalid_input()
-        if sequence == '#':
-            self.auto = 1
-        listitem, blank_finish = self.list_item(match.end())
-        self.parent += listitem
-        self.blank_finish = blank_finish
-        self.lastordinal = ordinal
-        return [], next_state, []
-
-
-class FieldList(SpecializedBody):
-
-    """Second and subsequent field_list fields."""
-
-    def field_marker(self, match, context, next_state):
-        """Field list field."""
-        field, blank_finish = self.field(match)
-        self.parent += field
-        self.blank_finish = blank_finish
-        return [], next_state, []
-
-
-class OptionList(SpecializedBody):
-
-    """Second and subsequent option_list option_list_items."""
-
-    def option_marker(self, match, context, next_state):
-        """Option list item."""
-        try:
-            option_list_item, blank_finish = self.option_list_item(match)
-        except MarkupError, (message, lineno):
-            self.invalid_input()
-        self.parent += option_list_item
-        self.blank_finish = blank_finish
-        return [], next_state, []
-
-
-class RFC2822List(SpecializedBody, RFC2822Body):
-
-    """Second and subsequent RFC2822-style field_list fields."""
-
-    patterns = RFC2822Body.patterns
-    initial_transitions = RFC2822Body.initial_transitions
-
-    def rfc2822(self, match, context, next_state):
-        """RFC2822-style field list item."""
-        field, blank_finish = self.rfc2822_field(match)
-        self.parent += field
-        self.blank_finish = blank_finish
-        return [], 'RFC2822List', []
-
-    blank = SpecializedBody.invalid_input
-
-
-class ExtensionOptions(FieldList):
-
-    """
-    Parse field_list fields for extension options.
-
-    No nested parsing is done (including inline markup parsing).
-    """
-
-    def parse_field_body(self, indented, offset, node):
-        """Override `Body.parse_field_body` for simpler parsing."""
-        lines = []
-        for line in list(indented) + ['']:
-            if line.strip():
-                lines.append(line)
-            elif lines:
-                text = '\n'.join(lines)
-                node += nodes.paragraph(text, text)
-                lines = []
-
-
-class LineBlock(SpecializedBody):
-
-    """Second and subsequent lines of a line_block."""
-
-    blank = SpecializedBody.invalid_input
-
-    def line_block(self, match, context, next_state):
-        """New line of line block."""
-        lineno = self.state_machine.abs_line_number()
-        line, messages, blank_finish = self.line_block_line(match, lineno)
-        self.parent += line
-        self.parent.parent += messages
-        self.blank_finish = blank_finish
-        return [], next_state, []
-
-
-class Explicit(SpecializedBody):
-
-    """Second and subsequent explicit markup construct."""
-
-    def explicit_markup(self, match, context, next_state):
-        """Footnotes, hyperlink targets, directives, comments."""
-        nodelist, blank_finish = self.explicit_construct(match)
-        self.parent += nodelist
-        self.blank_finish = blank_finish
-        return [], next_state, []
-
-    def anonymous(self, match, context, next_state):
-        """Anonymous hyperlink targets."""
-        nodelist, blank_finish = self.anonymous_target(match)
-        self.parent += nodelist
-        self.blank_finish = blank_finish
-        return [], next_state, []
-
-    blank = SpecializedBody.invalid_input
-
-
-class SubstitutionDef(Body):
-
-    """
-    Parser for the contents of a substitution_definition element.
-    """
-
-    patterns = {
-          'embedded_directive': re.compile(r'(%s)::( +|$)'
-                                           % Inliner.simplename, re.UNICODE),
-          'text': r''}
-    initial_transitions = ['embedded_directive', 'text']
-
-    def embedded_directive(self, match, context, next_state):
-        nodelist, blank_finish = self.directive(match,
-                                                alt=self.parent['names'][0])
-        self.parent += nodelist
-        if not self.state_machine.at_eof():
-            self.blank_finish = blank_finish
-        raise EOFError
-
-    def text(self, match, context, next_state):
-        if not self.state_machine.at_eof():
-            self.blank_finish = self.state_machine.is_next_line_blank()
-        raise EOFError
-
-
-class Text(RSTState):
-
-    """
-    Classifier of second line of a text block.
-
-    Could be a paragraph, a definition list item, or a title.
-    """
-
-    patterns = {'underline': Body.patterns['line'],
-                'text': r''}
-    initial_transitions = [('underline', 'Body'), ('text', 'Body')]
-
-    def blank(self, match, context, next_state):
-        """End of paragraph."""
-        paragraph, literalnext = self.paragraph(
-              context, self.state_machine.abs_line_number() - 1)
-        self.parent += paragraph
-        if literalnext:
-            self.parent += self.literal_block()
-        return [], 'Body', []
-
-    def eof(self, context):
-        if context:
-            self.blank(None, context, None)
-        return []
-
-    def indent(self, match, context, next_state):
-        """Definition list item."""
-        definitionlist = nodes.definition_list()
-        definitionlistitem, blank_finish = self.definition_list_item(context)
-        definitionlist += definitionlistitem
-        self.parent += definitionlist
-        offset = self.state_machine.line_offset + 1   # next line
-        newline_offset, blank_finish = self.nested_list_parse(
-              self.state_machine.input_lines[offset:],
-              input_offset=self.state_machine.abs_line_offset() + 1,
-              node=definitionlist, initial_state='DefinitionList',
-              blank_finish=blank_finish, blank_finish_state='Definition')
-        self.goto_line(newline_offset)
-        if not blank_finish:
-            self.parent += self.unindent_warning('Definition list')
-        return [], 'Body', []
-
-    def underline(self, match, context, next_state):
-        """Section title."""
-        lineno = self.state_machine.abs_line_number()
-        title = context[0].rstrip()
-        underline = match.string.rstrip()
-        source = title + '\n' + underline
-        messages = []
-        if column_width(title) > len(underline):
-            if len(underline) < 4:
-                if self.state_machine.match_titles:
-                    msg = self.reporter.info(
-                        'Possible title underline, too short for the title.\n'
-                        "Treating it as ordinary text because it's so short.",
-                        line=lineno)
-                    self.parent += msg
-                raise statemachine.TransitionCorrection('text')
-            else:
-                blocktext = context[0] + '\n' + self.state_machine.line
-                msg = self.reporter.warning(
-                    'Title underline too short.',
-                    nodes.literal_block(blocktext, blocktext), line=lineno)
-                messages.append(msg)
-        if not self.state_machine.match_titles:
-            blocktext = context[0] + '\n' + self.state_machine.line
-            msg = self.reporter.severe(
-                'Unexpected section title.',
-                nodes.literal_block(blocktext, blocktext), line=lineno)
-            self.parent += messages
-            self.parent += msg
-            return [], next_state, []
-        style = underline[0]
-        context[:] = []
-        self.section(title, source, style, lineno - 1, messages)
-        return [], next_state, []
-
-    def text(self, match, context, next_state):
-        """Paragraph."""
-        startline = self.state_machine.abs_line_number() - 1
-        msg = None
-        try:
-            block = self.state_machine.get_text_block(flush_left=1)
-        except statemachine.UnexpectedIndentationError, instance:
-            block, source, lineno = instance.args
-            msg = self.reporter.error('Unexpected indentation.',
-                                      source=source, line=lineno)
-        lines = context + list(block)
-        paragraph, literalnext = self.paragraph(lines, startline)
-        self.parent += paragraph
-        self.parent += msg
-        if literalnext:
-            try:
-                self.state_machine.next_line()
-            except EOFError:
-                pass
-            self.parent += self.literal_block()
-        return [], next_state, []
-
-    def literal_block(self):
-        """Return a list of nodes."""
-        indented, indent, offset, blank_finish = \
-              self.state_machine.get_indented()
-        while indented and not indented[-1].strip():
-            indented.trim_end()
-        if not indented:
-            return self.quoted_literal_block()
-        data = '\n'.join(indented)
-        literal_block = nodes.literal_block(data, data)
-        literal_block.line = offset + 1
-        nodelist = [literal_block]
-        if not blank_finish:
-            nodelist.append(self.unindent_warning('Literal block'))
-        return nodelist
-
-    def quoted_literal_block(self):
-        abs_line_offset = self.state_machine.abs_line_offset()
-        offset = self.state_machine.line_offset
-        parent_node = nodes.Element()
-        new_abs_offset = self.nested_parse(
-            self.state_machine.input_lines[offset:],
-            input_offset=abs_line_offset, node=parent_node, match_titles=0,
-            state_machine_kwargs={'state_classes': (QuotedLiteralBlock,),
-                                  'initial_state': 'QuotedLiteralBlock'})
-        self.goto_line(new_abs_offset)
-        return parent_node.children
-
-    def definition_list_item(self, termline):
-        indented, indent, line_offset, blank_finish = \
-              self.state_machine.get_indented()
-        definitionlistitem = nodes.definition_list_item(
-            '\n'.join(termline + list(indented)))
-        lineno = self.state_machine.abs_line_number() - 1
-        definitionlistitem.line = lineno
-        termlist, messages = self.term(termline, lineno)
-        definitionlistitem += termlist
-        definition = nodes.definition('', *messages)
-        definitionlistitem += definition
-        if termline[0][-2:] == '::':
-            definition += self.reporter.info(
-                  'Blank line missing before literal block (after the "::")? '
-                  'Interpreted as a definition list item.', line=line_offset+1)
-        self.nested_parse(indented, input_offset=line_offset, node=definition)
-        return definitionlistitem, blank_finish
-
-    classifier_delimiter = re.compile(' +: +')
-
-    def term(self, lines, lineno):
-        """Return a definition_list's term and optional classifiers."""
-        assert len(lines) == 1
-        text_nodes, messages = self.inline_text(lines[0], lineno)
-        term_node = nodes.term()
-        node_list = [term_node]
-        for i in range(len(text_nodes)):
-            node = text_nodes[i]
-            if isinstance(node, nodes.Text):
-                parts = self.classifier_delimiter.split(node.rawsource)
-                if len(parts) == 1:
-                    node_list[-1] += node
-                else:
-                    
-                    node_list[-1] += nodes.Text(parts[0].rstrip())
-                    for part in parts[1:]:
-                        classifier_node = nodes.classifier('', part)
-                        node_list.append(classifier_node)
-            else:
-                node_list[-1] += node
-        return node_list, messages
-
-
-class SpecializedText(Text):
-
-    """
-    Superclass for second and subsequent lines of Text-variants.
-
-    All transition methods are disabled. Override individual methods in
-    subclasses to re-enable.
-    """
-
-    def eof(self, context):
-        """Incomplete construct."""
-        return []
-
-    def invalid_input(self, match=None, context=None, next_state=None):
-        """Not a compound element member. Abort this state machine."""
-        raise EOFError
-
-    blank = invalid_input
-    indent = invalid_input
-    underline = invalid_input
-    text = invalid_input
-
-
-class Definition(SpecializedText):
-
-    """Second line of potential definition_list_item."""
-
-    def eof(self, context):
-        """Not a definition."""
-        self.state_machine.previous_line(2) # so parent SM can reassess
-        return []
-
-    def indent(self, match, context, next_state):
-        """Definition list item."""
-        definitionlistitem, blank_finish = self.definition_list_item(context)
-        self.parent += definitionlistitem
-        self.blank_finish = blank_finish
-        return [], 'DefinitionList', []
-
-
-class Line(SpecializedText):
-
-    """
-    Second line of over- & underlined section title or transition marker.
-    """
-
-    eofcheck = 1                        # @@@ ???
-    """Set to 0 while parsing sections, so that we don't catch the EOF."""
-
-    def eof(self, context):
-        """Transition marker at end of section or document."""
-        marker = context[0].strip()
-        if self.memo.section_bubble_up_kludge:
-            self.memo.section_bubble_up_kludge = 0
-        elif len(marker) < 4:
-            self.state_correction(context)
-        if self.eofcheck:               # ignore EOFError with sections
-            lineno = self.state_machine.abs_line_number() - 1
-            transition = nodes.transition(rawsource=context[0])
-            transition.line = lineno
-            self.parent += transition
-        self.eofcheck = 1
-        return []
-
-    def blank(self, match, context, next_state):
-        """Transition marker."""
-        lineno = self.state_machine.abs_line_number() - 1
-        marker = context[0].strip()
-        if len(marker) < 4:
-            self.state_correction(context)
-        transition = nodes.transition(rawsource=marker)
-        transition.line = lineno
-        self.parent += transition
-        return [], 'Body', []
-
-    def text(self, match, context, next_state):
-        """Potential over- & underlined title."""
-        lineno = self.state_machine.abs_line_number() - 1
-        overline = context[0]
-        title = match.string
-        underline = ''
-        try:
-            underline = self.state_machine.next_line()
-        except EOFError:
-            blocktext = overline + '\n' + title
-            if len(overline.rstrip()) < 4:
-                self.short_overline(context, blocktext, lineno, 2)
-            else:
-                msg = self.reporter.severe(
-                    'Incomplete section title.',
-                    nodes.literal_block(blocktext, blocktext), line=lineno)
-                self.parent += msg
-                return [], 'Body', []
-        source = '%s\n%s\n%s' % (overline, title, underline)
-        overline = overline.rstrip()
-        underline = underline.rstrip()
-        if not self.transitions['underline'][0].match(underline):
-            blocktext = overline + '\n' + title + '\n' + underline
-            if len(overline.rstrip()) < 4:
-                self.short_overline(context, blocktext, lineno, 2)
-            else:
-                msg = self.reporter.severe(
-                    'Missing matching underline for section title overline.',
-                    nodes.literal_block(source, source), line=lineno)
-                self.parent += msg
-                return [], 'Body', []
-        elif overline != underline:
-            blocktext = overline + '\n' + title + '\n' + underline
-            if len(overline.rstrip()) < 4:
-                self.short_overline(context, blocktext, lineno, 2)
-            else:
-                msg = self.reporter.severe(
-                      'Title overline & underline mismatch.',
-                      nodes.literal_block(source, source), line=lineno)
-                self.parent += msg
-                return [], 'Body', []
-        title = title.rstrip()
-        messages = []
-        if column_width(title) > len(overline):
-            blocktext = overline + '\n' + title + '\n' + underline
-            if len(overline.rstrip()) < 4:
-                self.short_overline(context, blocktext, lineno, 2)
-            else:
-                msg = self.reporter.warning(
-                      'Title overline too short.',
-                      nodes.literal_block(source, source), line=lineno)
-                messages.append(msg)
-        style = (overline[0], underline[0])
-        self.eofcheck = 0               # @@@ not sure this is correct
-        self.section(title.lstrip(), source, style, lineno + 1, messages)
-        self.eofcheck = 1
-        return [], 'Body', []
-
-    indent = text                       # indented title
-
-    def underline(self, match, context, next_state):
-        overline = context[0]
-        blocktext = overline + '\n' + self.state_machine.line
-        lineno = self.state_machine.abs_line_number() - 1
-        if len(overline.rstrip()) < 4:
-            self.short_overline(context, blocktext, lineno, 1)
-        msg = self.reporter.error(
-              'Invalid section title or transition marker.',
-              nodes.literal_block(blocktext, blocktext), line=lineno)
-        self.parent += msg
-        return [], 'Body', []
-
-    def short_overline(self, context, blocktext, lineno, lines=1):
-        msg = self.reporter.info(
-            'Possible incomplete section title.\nTreating the overline as '
-            "ordinary text because it's so short.", line=lineno)
-        self.parent += msg
-        self.state_correction(context, lines)
-
-    def state_correction(self, context, lines=1):
-        self.state_machine.previous_line(lines)
-        context[:] = []
-        raise statemachine.StateCorrection('Body', 'text')
-
-
-class QuotedLiteralBlock(RSTState):
-
-    """
-    Nested parse handler for quoted (unindented) literal blocks.
-
-    Special-purpose.  Not for inclusion in `state_classes`.
-    """
-
-    patterns = {'initial_quoted': r'(%(nonalphanum7bit)s)' % Body.pats,
-                'text': r''}
-    initial_transitions = ('initial_quoted', 'text')
-
-    def __init__(self, state_machine, debug=0):
-        RSTState.__init__(self, state_machine, debug)
-        self.messages = []
-        self.initial_lineno = None
-
-    def blank(self, match, context, next_state):
-        if context:
-            raise EOFError
-        else:
-            return context, next_state, []
-
-    def eof(self, context):
-        if context:
-            text = '\n'.join(context)
-            literal_block = nodes.literal_block(text, text)
-            literal_block.line = self.initial_lineno
-            self.parent += literal_block
-        else:
-            self.parent += self.reporter.warning(
-                'Literal block expected; none found.',
-                line=self.state_machine.abs_line_number())
-            self.state_machine.previous_line()
-        self.parent += self.messages
-        return []
-
-    def indent(self, match, context, next_state):
-        assert context, ('QuotedLiteralBlock.indent: context should not '
-                         'be empty!')
-        self.messages.append(
-            self.reporter.error('Unexpected indentation.',
-                                line=self.state_machine.abs_line_number()))
-        self.state_machine.previous_line()
-        raise EOFError
-
-    def initial_quoted(self, match, context, next_state):
-        """Match arbitrary quote character on the first line only."""
-        self.remove_transition('initial_quoted')
-        quote = match.string[0]
-        pattern = re.compile(re.escape(quote))
-        # New transition matches consistent quotes only:
-        self.add_transition('quoted',
-                            (pattern, self.quoted, self.__class__.__name__))
-        self.initial_lineno = self.state_machine.abs_line_number()
-        return [match.string], next_state, []
-
-    def quoted(self, match, context, next_state):
-        """Match consistent quotes on subsequent lines."""
-        context.append(match.string)
-        return context, next_state, []
-
-    def text(self, match, context, next_state):
-        if context:
-            self.messages.append(
-                self.reporter.error('Inconsistent literal block quoting.',
-                                    line=self.state_machine.abs_line_number()))
-            self.state_machine.previous_line()
-        raise EOFError
-
-
-state_classes = (Body, BulletList, DefinitionList, EnumeratedList, FieldList,
-                 OptionList, LineBlock, ExtensionOptions, Explicit, Text,
-                 Definition, Line, SubstitutionDef, RFC2822Body, RFC2822List)
-"""Standard set of State classes used to start `RSTStateMachine`."""
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/parsers/rst/tableparser.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,525 +0,0 @@
-# $Id: tableparser.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-This module defines table parser classes,which parse plaintext-graphic tables
-and produce a well-formed data structure suitable for building a CALS table.
-
-:Classes:
-    - `GridTableParser`: Parse fully-formed tables represented with a grid.
-    - `SimpleTableParser`: Parse simple tables, delimited by top & bottom
-      borders.
-
-:Exception class: `TableMarkupError`
-
-:Function:
-    `update_dict_of_lists()`: Merge two dictionaries containing list values.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import re
-import sys
-from docutils import DataError
-
-
-class TableMarkupError(DataError): pass
-
-
-class TableParser:
-
-    """
-    Abstract superclass for the common parts of the syntax-specific parsers.
-    """
-
-    head_body_separator_pat = None
-    """Matches the row separator between head rows and body rows."""
-
-    double_width_pad_char = '\x00'
-    """Padding character for East Asian double-width text."""
-
-    def parse(self, block):
-        """
-        Analyze the text `block` and return a table data structure.
-
-        Given a plaintext-graphic table in `block` (list of lines of text; no
-        whitespace padding), parse the table, construct and return the data
-        necessary to construct a CALS table or equivalent.
-
-        Raise `TableMarkupError` if there is any problem with the markup.
-        """
-        self.setup(block)
-        self.find_head_body_sep()
-        self.parse_table()
-        structure = self.structure_from_cells()
-        return structure
-
-    def find_head_body_sep(self):
-        """Look for a head/body row separator line; store the line index."""
-        for i in range(len(self.block)):
-            line = self.block[i]
-            if self.head_body_separator_pat.match(line):
-                if self.head_body_sep:
-                    raise TableMarkupError(
-                        'Multiple head/body row separators in table (at line '
-                        'offset %s and %s); only one allowed.'
-                        % (self.head_body_sep, i))
-                else:
-                    self.head_body_sep = i
-                    self.block[i] = line.replace('=', '-')
-        if self.head_body_sep == 0 or self.head_body_sep == (len(self.block)
-                                                             - 1):
-            raise TableMarkupError('The head/body row separator may not be '
-                                   'the first or last line of the table.')
-
-
-class GridTableParser(TableParser):
-
-    """
-    Parse a grid table using `parse()`.
-
-    Here's an example of a grid table::
-
-        +------------------------+------------+----------+----------+
-        | Header row, column 1   | Header 2   | Header 3 | Header 4 |
-        +========================+============+==========+==========+
-        | body row 1, column 1   | column 2   | column 3 | column 4 |
-        +------------------------+------------+----------+----------+
-        | body row 2             | Cells may span columns.          |
-        +------------------------+------------+---------------------+
-        | body row 3             | Cells may  | - Table cells       |
-        +------------------------+ span rows. | - contain           |
-        | body row 4             |            | - body elements.    |
-        +------------------------+------------+---------------------+
-
-    Intersections use '+', row separators use '-' (except for one optional
-    head/body row separator, which uses '='), and column separators use '|'.
-
-    Passing the above table to the `parse()` method will result in the
-    following data structure::
-
-        ([24, 12, 10, 10],
-         [[(0, 0, 1, ['Header row, column 1']),
-           (0, 0, 1, ['Header 2']),
-           (0, 0, 1, ['Header 3']),
-           (0, 0, 1, ['Header 4'])]],
-         [[(0, 0, 3, ['body row 1, column 1']),
-           (0, 0, 3, ['column 2']),
-           (0, 0, 3, ['column 3']),
-           (0, 0, 3, ['column 4'])],
-          [(0, 0, 5, ['body row 2']),
-           (0, 2, 5, ['Cells may span columns.']),
-           None,
-           None],
-          [(0, 0, 7, ['body row 3']),
-           (1, 0, 7, ['Cells may', 'span rows.', '']),
-           (1, 1, 7, ['- Table cells', '- contain', '- body elements.']),
-           None],
-          [(0, 0, 9, ['body row 4']), None, None, None]])
-
-    The first item is a list containing column widths (colspecs). The second
-    item is a list of head rows, and the third is a list of body rows. Each
-    row contains a list of cells. Each cell is either None (for a cell unused
-    because of another cell's span), or a tuple. A cell tuple contains four
-    items: the number of extra rows used by the cell in a vertical span
-    (morerows); the number of extra columns used by the cell in a horizontal
-    span (morecols); the line offset of the first line of the cell contents;
-    and the cell contents, a list of lines of text.
-    """
-
-    head_body_separator_pat = re.compile(r'\+=[=+]+=\+ *$')
-
-    def setup(self, block):
-        self.block = block[:]           # make a copy; it may be modified
-        self.block.disconnect()         # don't propagate changes to parent
-        self.bottom = len(block) - 1
-        self.right = len(block[0]) - 1
-        self.head_body_sep = None
-        self.done = [-1] * len(block[0])
-        self.cells = []
-        self.rowseps = {0: [0]}
-        self.colseps = {0: [0]}
-
-    def parse_table(self):
-        """
-        Start with a queue of upper-left corners, containing the upper-left
-        corner of the table itself. Trace out one rectangular cell, remember
-        it, and add its upper-right and lower-left corners to the queue of
-        potential upper-left corners of further cells. Process the queue in
-        top-to-bottom order, keeping track of how much of each text column has
-        been seen.
-
-        We'll end up knowing all the row and column boundaries, cell positions
-        and their dimensions.
-        """
-        corners = [(0, 0)]
-        while corners:
-            top, left = corners.pop(0)
-            if top == self.bottom or left == self.right \
-                  or top <= self.done[left]:
-                continue
-            result = self.scan_cell(top, left)
-            if not result:
-                continue
-            bottom, right, rowseps, colseps = result
-            update_dict_of_lists(self.rowseps, rowseps)
-            update_dict_of_lists(self.colseps, colseps)
-            self.mark_done(top, left, bottom, right)
-            cellblock = self.block.get_2D_block(top + 1, left + 1,
-                                                bottom, right)
-            cellblock.disconnect()      # lines in cell can't sync with parent
-            cellblock.replace(self.double_width_pad_char, '')
-            self.cells.append((top, left, bottom, right, cellblock))
-            corners.extend([(top, right), (bottom, left)])
-            corners.sort()
-        if not self.check_parse_complete():
-            raise TableMarkupError('Malformed table; parse incomplete.')
-
-    def mark_done(self, top, left, bottom, right):
-        """For keeping track of how much of each text column has been seen."""
-        before = top - 1
-        after = bottom - 1
-        for col in range(left, right):
-            assert self.done[col] == before
-            self.done[col] = after
-
-    def check_parse_complete(self):
-        """Each text column should have been completely seen."""
-        last = self.bottom - 1
-        for col in range(self.right):
-            if self.done[col] != last:
-                return None
-        return 1
-
-    def scan_cell(self, top, left):
-        """Starting at the top-left corner, start tracing out a cell."""
-        assert self.block[top][left] == '+'
-        result = self.scan_right(top, left)
-        return result
-
-    def scan_right(self, top, left):
-        """
-        Look for the top-right corner of the cell, and make note of all column
-        boundaries ('+').
-        """
-        colseps = {}
-        line = self.block[top]
-        for i in range(left + 1, self.right + 1):
-            if line[i] == '+':
-                colseps[i] = [top]
-                result = self.scan_down(top, left, i)
-                if result:
-                    bottom, rowseps, newcolseps = result
-                    update_dict_of_lists(colseps, newcolseps)
-                    return bottom, i, rowseps, colseps
-            elif line[i] != '-':
-                return None
-        return None
-
-    def scan_down(self, top, left, right):
-        """
-        Look for the bottom-right corner of the cell, making note of all row
-        boundaries.
-        """
-        rowseps = {}
-        for i in range(top + 1, self.bottom + 1):
-            if self.block[i][right] == '+':
-                rowseps[i] = [right]
-                result = self.scan_left(top, left, i, right)
-                if result:
-                    newrowseps, colseps = result
-                    update_dict_of_lists(rowseps, newrowseps)
-                    return i, rowseps, colseps
-            elif self.block[i][right] != '|':
-                return None
-        return None
-
-    def scan_left(self, top, left, bottom, right):
-        """
-        Noting column boundaries, look for the bottom-left corner of the cell.
-        It must line up with the starting point.
-        """
-        colseps = {}
-        line = self.block[bottom]
-        for i in range(right - 1, left, -1):
-            if line[i] == '+':
-                colseps[i] = [bottom]
-            elif line[i] != '-':
-                return None
-        if line[left] != '+':
-            return None
-        result = self.scan_up(top, left, bottom, right)
-        if result is not None:
-            rowseps = result
-            return rowseps, colseps
-        return None
-
-    def scan_up(self, top, left, bottom, right):
-        """
-        Noting row boundaries, see if we can return to the starting point.
-        """
-        rowseps = {}
-        for i in range(bottom - 1, top, -1):
-            if self.block[i][left] == '+':
-                rowseps[i] = [left]
-            elif self.block[i][left] != '|':
-                return None
-        return rowseps
-
-    def structure_from_cells(self):
-        """
-        From the data collected by `scan_cell()`, convert to the final data
-        structure.
-        """
-        rowseps = self.rowseps.keys()   # list of row boundaries
-        rowseps.sort()
-        rowindex = {}
-        for i in range(len(rowseps)):
-            rowindex[rowseps[i]] = i    # row boundary -> row number mapping
-        colseps = self.colseps.keys()   # list of column boundaries
-        colseps.sort()
-        colindex = {}
-        for i in range(len(colseps)):
-            colindex[colseps[i]] = i    # column boundary -> col number map
-        colspecs = [(colseps[i] - colseps[i - 1] - 1)
-                    for i in range(1, len(colseps))] # list of column widths
-        # prepare an empty table with the correct number of rows & columns
-        onerow = [None for i in range(len(colseps) - 1)]
-        rows = [onerow[:] for i in range(len(rowseps) - 1)]
-        # keep track of # of cells remaining; should reduce to zero
-        remaining = (len(rowseps) - 1) * (len(colseps) - 1)
-        for top, left, bottom, right, block in self.cells:
-            rownum = rowindex[top]
-            colnum = colindex[left]
-            assert rows[rownum][colnum] is None, (
-                  'Cell (row %s, column %s) already used.'
-                  % (rownum + 1, colnum + 1))
-            morerows = rowindex[bottom] - rownum - 1
-            morecols = colindex[right] - colnum - 1
-            remaining -= (morerows + 1) * (morecols + 1)
-            # write the cell into the table
-            rows[rownum][colnum] = (morerows, morecols, top + 1, block)
-        assert remaining == 0, 'Unused cells remaining.'
-        if self.head_body_sep:          # separate head rows from body rows
-            numheadrows = rowindex[self.head_body_sep]
-            headrows = rows[:numheadrows]
-            bodyrows = rows[numheadrows:]
-        else:
-            headrows = []
-            bodyrows = rows
-        return (colspecs, headrows, bodyrows)
-
-
-class SimpleTableParser(TableParser):
-
-    """
-    Parse a simple table using `parse()`.
-
-    Here's an example of a simple table::
-
-        =====  =====
-        col 1  col 2
-        =====  =====
-        1      Second column of row 1.
-        2      Second column of row 2.
-               Second line of paragraph.
-        3      - Second column of row 3.
-
-               - Second item in bullet
-                 list (row 3, column 2).
-        4 is a span
-        ------------
-        5
-        =====  =====
-
-    Top and bottom borders use '=', column span underlines use '-', column
-    separation is indicated with spaces.
-
-    Passing the above table to the `parse()` method will result in the
-    following data structure, whose interpretation is the same as for
-    `GridTableParser`::
-
-        ([5, 25],
-         [[(0, 0, 1, ['col 1']),
-           (0, 0, 1, ['col 2'])]],
-         [[(0, 0, 3, ['1']),
-           (0, 0, 3, ['Second column of row 1.'])],
-          [(0, 0, 4, ['2']),
-           (0, 0, 4, ['Second column of row 2.',
-                      'Second line of paragraph.'])],
-          [(0, 0, 6, ['3']),
-           (0, 0, 6, ['- Second column of row 3.',
-                      '',
-                      '- Second item in bullet',
-                      '  list (row 3, column 2).'])],
-          [(0, 1, 10, ['4 is a span'])],
-          [(0, 0, 12, ['5']),
-           (0, 0, 12, [''])]])
-    """
-
-    head_body_separator_pat = re.compile('=[ =]*$')
-    span_pat = re.compile('-[ -]*$')
-
-    def setup(self, block):
-        self.block = block[:]           # make a copy; it will be modified
-        self.block.disconnect()         # don't propagate changes to parent
-        # Convert top & bottom borders to column span underlines:
-        self.block[0] = self.block[0].replace('=', '-')
-        self.block[-1] = self.block[-1].replace('=', '-')
-        self.head_body_sep = None
-        self.columns = []
-        self.border_end = None
-        self.table = []
-        self.done = [-1] * len(block[0])
-        self.rowseps = {0: [0]}
-        self.colseps = {0: [0]}
-
-    def parse_table(self):
-        """
-        First determine the column boundaries from the top border, then
-        process rows.  Each row may consist of multiple lines; accumulate
-        lines until a row is complete.  Call `self.parse_row` to finish the
-        job.
-        """
-        # Top border must fully describe all table columns.
-        self.columns = self.parse_columns(self.block[0], 0)
-        self.border_end = self.columns[-1][1]
-        firststart, firstend = self.columns[0]
-        offset = 1                      # skip top border
-        start = 1
-        text_found = None
-        while offset < len(self.block):
-            line = self.block[offset]
-            if self.span_pat.match(line):
-                # Column span underline or border; row is complete.
-                self.parse_row(self.block[start:offset], start,
-                               (line.rstrip(), offset))
-                start = offset + 1
-                text_found = None
-            elif line[firststart:firstend].strip():
-                # First column not blank, therefore it's a new row.
-                if text_found and offset != start:
-                    self.parse_row(self.block[start:offset], start)
-                start = offset
-                text_found = 1
-            elif not text_found:
-                start = offset + 1
-            offset += 1
-
-    def parse_columns(self, line, offset):
-        """
-        Given a column span underline, return a list of (begin, end) pairs.
-        """
-        cols = []
-        end = 0
-        while 1:
-            begin = line.find('-', end)
-            end = line.find(' ', begin)
-            if begin < 0:
-                break
-            if end < 0:
-                end = len(line)
-            cols.append((begin, end))
-        if self.columns:
-            if cols[-1][1] != self.border_end:
-                raise TableMarkupError('Column span incomplete at line '
-                                       'offset %s.' % offset)
-            # Allow for an unbounded rightmost column:
-            cols[-1] = (cols[-1][0], self.columns[-1][1])
-        return cols
-
-    def init_row(self, colspec, offset):
-        i = 0
-        cells = []
-        for start, end in colspec:
-            morecols = 0
-            try:
-                assert start == self.columns[i][0]
-                while end != self.columns[i][1]:
-                    i += 1
-                    morecols += 1
-            except (AssertionError, IndexError):
-                raise TableMarkupError('Column span alignment problem at '
-                                       'line offset %s.' % (offset + 1))
-            cells.append([0, morecols, offset, []])
-            i += 1
-        return cells
-
-    def parse_row(self, lines, start, spanline=None):
-        """
-        Given the text `lines` of a row, parse it and append to `self.table`.
-
-        The row is parsed according to the current column spec (either
-        `spanline` if provided or `self.columns`).  For each column, extract
-        text from each line, and check for text in column margins.  Finally,
-        adjust for insigificant whitespace.
-        """
-        if not (lines or spanline):
-            # No new row, just blank lines.
-            return
-        if spanline:
-            columns = self.parse_columns(*spanline)
-            span_offset = spanline[1]
-        else:
-            columns = self.columns[:]
-            span_offset = start
-        self.check_columns(lines, start, columns)
-        row = self.init_row(columns, start)
-        for i in range(len(columns)):
-            start, end = columns[i]
-            cellblock = lines.get_2D_block(0, start, len(lines), end)
-            cellblock.disconnect()      # lines in cell can't sync with parent
-            cellblock.replace(self.double_width_pad_char, '')
-            row[i][3] = cellblock
-        self.table.append(row)
-
-    def check_columns(self, lines, first_line, columns):
-        """
-        Check for text in column margins and text overflow in the last column.
-        Raise TableMarkupError if anything but whitespace is in column margins.
-        Adjust the end value for the last column if there is text overflow.
-        """
-        # "Infinite" value for a dummy last column's beginning, used to
-        # check for text overflow:
-        columns.append((sys.maxint, None))
-        lastcol = len(columns) - 2
-        for i in range(len(columns) - 1):
-            start, end = columns[i]
-            nextstart = columns[i+1][0]
-            offset = 0
-            for line in lines:
-                if i == lastcol and line[end:].strip():
-                    text = line[start:].rstrip()
-                    new_end = start + len(text)
-                    columns[i] = (start, new_end)
-                    main_start, main_end = self.columns[-1]
-                    if new_end > main_end:
-                        self.columns[-1] = (main_start, new_end)
-                elif line[end:nextstart].strip():
-                    raise TableMarkupError('Text in column margin at line '
-                                           'offset %s.' % (first_line + offset))
-                offset += 1
-        columns.pop()
-
-    def structure_from_cells(self):
-        colspecs = [end - start for start, end in self.columns]
-        first_body_row = 0
-        if self.head_body_sep:
-            for i in range(len(self.table)):
-                if self.table[i][0][2] > self.head_body_sep:
-                    first_body_row = i
-                    break
-        return (colspecs, self.table[:first_body_row],
-                self.table[first_body_row:])
-
-
-def update_dict_of_lists(master, newdata):
-    """
-    Extend the list values of `master` with those from `newdata`.
-
-    Both parameters must be dictionaries containing list values.
-    """
-    for key, values in newdata.items():
-        master.setdefault(key, []).extend(values)
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-# $Id: __init__.py 4974 2007-03-01 18:06:52Z wiemann $
-# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer
-# Copyright: This module has been placed in the public domain.
-
-"""
-This package contains Docutils Reader modules.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-from docutils import utils, parsers, Component
-from docutils.transforms import universal
-
-
-class Reader(Component):
-
-    """
-    Abstract base class for docutils Readers.
-
-    Each reader module or package must export a subclass also called 'Reader'.
-
-    The two steps of a Reader's responsibility are `scan()` and
-    `parse()`.  Call `read()` to process a document.
-    """
-
-    component_type = 'reader'
-    config_section = 'readers'
-
-    def get_transforms(self):
-        return Component.get_transforms(self) + [
-            universal.Decorations,
-            universal.ExposeInternals,
-            universal.StripComments,]
-
-    def __init__(self, parser=None, parser_name=None):
-        """
-        Initialize the Reader instance.
-
-        Several instance attributes are defined with dummy initial values.
-        Subclasses may use these attributes as they wish.
-        """
-
-        self.parser = parser
-        """A `parsers.Parser` instance shared by all doctrees.  May be left
-        unspecified if the document source determines the parser."""
-
-        if parser is None and parser_name:
-            self.set_parser(parser_name)
-
-        self.source = None
-        """`docutils.io` IO object, source of input data."""
-
-        self.input = None
-        """Raw text input; either a single string or, for more complex cases,
-        a collection of strings."""
-
-    def set_parser(self, parser_name):
-        """Set `self.parser` by name."""
-        parser_class = parsers.get_parser_class(parser_name)
-        self.parser = parser_class()
-
-    def read(self, source, parser, settings):
-        self.source = source
-        if not self.parser:
-            self.parser = parser
-        self.settings = settings
-        self.input = self.source.read()
-        self.parse()
-        return self.document
-
-    def parse(self):
-        """Parse `self.input` into a document tree."""
-        self.document = document = self.new_document()
-        self.parser.parse(self.input, document)
-        document.current_source = document.current_line = None
-
-    def new_document(self):
-        """Create and return a new empty document tree (root node)."""
-        document = utils.new_document(self.source.source_path, self.settings)
-        return document
-
-
-class ReReader(Reader):
-
-    """
-    A reader which rereads an existing document tree (e.g. a
-    deserializer).
-
-    Often used in conjunction with `writers.UnfilteredWriter`.
-    """
-
-    def get_transforms(self):
-        # Do not add any transforms.  They have already been applied
-        # by the reader which originally created the document.
-        return Component.get_transforms(self)
-
-
-_reader_aliases = {}
-
-def get_reader_class(reader_name):
-    """Return the Reader class from the `reader_name` module."""
-    reader_name = reader_name.lower()
-    if _reader_aliases.has_key(reader_name):
-        reader_name = _reader_aliases[reader_name]
-    module = __import__(reader_name, globals(), locals())
-    return module.Reader
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/doctree.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-# $Id: doctree.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: Martin Blais <blais@furius.ca>
-# Copyright: This module has been placed in the public domain.
-
-"""Reader for existing document trees."""
-
-from docutils import readers, utils, transforms
-
-
-class Reader(readers.ReReader):
-
-    """
-    Adapt the Reader API for an existing document tree.
-
-    The existing document tree must be passed as the ``source`` parameter to
-    the `docutils.core.Publisher` initializer, wrapped in a
-    `docutils.io.DocTreeInput` object::
-
-        pub = docutils.core.Publisher(
-            ..., source=docutils.io.DocTreeInput(document), ...)
-
-    The original document settings are overridden; if you want to use the
-    settings of the original document, pass ``settings=document.settings`` to
-    the Publisher call above.
-    """
-
-    supported = ('doctree',)
-
-    config_section = 'doctree reader'
-    config_section_dependencies = ('readers',)
-
-    def parse(self):
-        """
-        No parsing to do; refurbish the document tree instead.
-        Overrides the inherited method.
-        """
-        self.document = self.input
-        # Create fresh Transformer object, to be populated from Writer
-        # component.
-        self.document.transformer = transforms.Transformer(self.document)
-        # Replace existing settings object with new one.
-        self.document.settings = self.settings
-        # Create fresh Reporter object because it is dependent on
-        # (new) settings.
-        self.document.reporter = utils.new_reporter(
-            self.document.get('source', ''), self.document.settings)
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/pep.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-# $Id: pep.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Python Enhancement Proposal (PEP) Reader.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-from docutils.readers import standalone
-from docutils.transforms import peps, references, misc, frontmatter
-from docutils.parsers import rst
-
-
-class Reader(standalone.Reader):
-
-    supported = ('pep',)
-    """Contexts this reader supports."""
-
-    settings_spec = (
-        'PEP Reader Option Defaults',
-        'The --pep-references and --rfc-references options (for the '
-        'reStructuredText parser) are on by default.',
-        ())
-
-    config_section = 'pep reader'
-    config_section_dependencies = ('readers', 'standalone reader')
-
-    def get_transforms(self):
-        transforms = standalone.Reader.get_transforms(self)
-        # We have PEP-specific frontmatter handling.
-        transforms.remove(frontmatter.DocTitle)
-        transforms.remove(frontmatter.SectionSubTitle)
-        transforms.remove(frontmatter.DocInfo)
-        transforms.extend([peps.Headers, peps.Contents, peps.TargetNotes])
-        return transforms
-
-    settings_default_overrides = {'pep_references': 1, 'rfc_references': 1}
-
-    inliner_class = rst.states.Inliner
-
-    def __init__(self, parser=None, parser_name=None):
-        """`parser` should be ``None``."""
-        if parser is None:
-            parser = rst.Parser(rfc2822=1, inliner=self.inliner_class())
-        standalone.Reader.__init__(self, parser, '')
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/python/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,127 +0,0 @@
-# $Id: __init__.py 4813 2006-11-13 03:41:08Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-This package contains the Python Source Reader modules.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import sys
-import docutils.readers
-from docutils.readers.python import moduleparser
-from docutils import parsers
-from docutils import nodes
-from docutils.readers.python import pynodes
-from docutils import readers
-
-class Reader(docutils.readers.Reader):
-
-    config_section = 'python reader'
-    config_section_dependencies = ('readers',)
-
-    default_parser = 'restructuredtext'
-
-    def parse(self):
-        """Parse `self.input` into a document tree."""
-        self.document = document = self.new_document()
-        module_section = moduleparser.parse_module(self.input,
-                                                   self.source.source_path)
-        module_section.walk(DocformatVisitor(self.document))
-        visitor = DocstringFormattingVisitor(
-            document=document,
-            default_parser=self.default_parser)
-        module_section.walk(visitor)
-        self.document.append(module_section)
-
-
-class DocformatVisitor(nodes.SparseNodeVisitor):
-
-    """
-    This sets docformat attributes in a module.  Wherever an assignment
-    to __docformat__ is found, we look for the enclosing scope -- a class,
-    a module, or a function -- and set the docformat attribute there.
-
-    We can't do this during the DocstringFormattingVisitor walking,
-    because __docformat__ may appear below a docstring in that format
-    (typically below the module docstring).
-    """
-
-    def visit_attribute(self, node):
-        assert isinstance(node[0], pynodes.object_name)
-        name = node[0][0].data
-        if name != '__docformat__':
-            return
-        value = None
-        for child in children:
-            if isinstance(child, pynodes.expression_value):
-                value = child[0].data
-                break
-        assert value.startswith("'") or value.startswith('"'), "__docformat__ must be assigned a string literal (not %s); line: %s" % (value, node['lineno'])
-        name = name[1:-1]
-        looking_in = node.parent
-        while not isinstance(looking_in, (pynodes.module_section,
-                                          pynodes.function_section,
-                                          pynodes.class_section)):
-            looking_in = looking_in.parent
-        looking_in['docformat'] = name
-
-
-class DocstringFormattingVisitor(nodes.SparseNodeVisitor):
-
-    def __init__(self, document, default_parser):
-        self.document = document
-        self.default_parser = default_parser
-        self.parsers = {}
-
-    def visit_docstring(self, node):
-        text = node[0].data
-        docformat = self.find_docformat(node)
-        del node[0]
-        node['docformat'] = docformat
-        parser = self.get_parser(docformat)
-        parser.parse(text, self.document)
-        for child in self.document.children:
-            node.append(child)
-        self.document.current_source = self.document.current_line = None
-        del self.document[:]
-
-    def get_parser(self, parser_name):
-        """
-        Get a parser based on its name.  We reuse parsers during this
-        visitation, so parser instances are cached.
-        """
-        parser_name = parsers._parser_aliases.get(parser_name, parser_name)
-        if not self.parsers.has_key(parser_name):
-            cls = parsers.get_parser_class(parser_name)
-            self.parsers[parser_name] = cls()
-        return self.parsers[parser_name]
-
-    def find_docformat(self, node):
-        """
-        Find the __docformat__ closest to this node (i.e., look in the
-        class or module)
-        """
-        while node:
-            if node.get('docformat'):
-                return node['docformat']
-            node = node.parent
-        return self.default_parser
-
-
-if __name__ == '__main__':
-    try:
-        import locale
-        locale.setlocale(locale.LC_ALL, '')
-    except:
-        pass
-
-    from docutils.core import publish_cmdline, default_description
-
-    description = ('Generates pseudo-XML from Python modules '
-                   '(for testing purposes).  ' + default_description)
-
-    publish_cmdline(description=description,
-                    reader=Reader())
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/python/moduleparser.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,758 +0,0 @@
-# $Id: moduleparser.py 4813 2006-11-13 03:41:08Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Parser for Python modules.
-
-The `parse_module()` function takes a module's text and file name,
-runs it through the module parser (using compiler.py and tokenize.py)
-and produces a parse tree of the source code, using the nodes as found
-in pynodes.py.  For example, given this module (x.py)::
-
-    # comment
-
-    '''Docstring'''
-
-    '''Additional docstring'''
-
-    __docformat__ = 'reStructuredText'
-
-    a = 1
-    '''Attribute docstring'''
-
-    class C(Super):
-
-        '''C's docstring'''
-
-        class_attribute = 1
-        '''class_attribute's docstring'''
-
-        def __init__(self, text=None):
-            '''__init__'s docstring'''
-
-            self.instance_attribute = (text * 7
-                                       + ' whaddyaknow')
-            '''instance_attribute's docstring'''
-
-
-    def f(x,                            # parameter x
-          y=a*5,                        # parameter y
-          *args):                       # parameter args
-        '''f's docstring'''
-        return [x + item for item in args]
-
-    f.function_attribute = 1
-    '''f.function_attribute's docstring'''
-
-The module parser will produce this module documentation tree::
-
-    <module_section filename="test data">
-        <docstring>
-            Docstring
-        <docstring lineno="5">
-            Additional docstring
-        <attribute lineno="7">
-	    <object_name>
-	        __docformat__
-            <expression_value lineno="7">
-                'reStructuredText'
-        <attribute lineno="9">
-	    <object_name>
-	        a
-            <expression_value lineno="9">
-                1
-            <docstring lineno="10">
-                Attribute docstring
-        <class_section lineno="12">
-	    <object_name>
-	        C
-            <class_base>
-	        Super
-            <docstring lineno="12">
-                C's docstring
-            <attribute lineno="16">
-	        <object_name>
-		    class_attribute
-                <expression_value lineno="16">
-                    1
-                <docstring lineno="17">
-                    class_attribute's docstring
-            <method_section lineno="19">
-	        <object_name>
-		    __init__
-                <docstring lineno="19">
-                    __init__'s docstring
-                <parameter_list lineno="19">
-                    <parameter lineno="19">
-		        <object_name>
-			    self
-                    <parameter lineno="19">
-		        <object_name>
-			    text
-                        <parameter_default lineno="19">
-                            None
-                <attribute lineno="22">
-		    <object_name>
-		        self.instance_attribute
-                    <expression_value lineno="22">
-                        (text * 7 + ' whaddyaknow')
-                    <docstring lineno="24">
-                        instance_attribute's docstring
-        <function_section lineno="27">
-	    <object_name>
-	        f
-            <docstring lineno="27">
-                f's docstring
-            <parameter_list lineno="27">
-                <parameter lineno="27">
-		    <object_name>
-		        x
-                    <comment>
-                        # parameter x
-                <parameter lineno="27">
-		    <object_name>
-		        y
-                    <parameter_default lineno="27">
-                        a * 5
-                    <comment>
-                        # parameter y
-                <parameter excess_positional="1" lineno="27">
-		    <object_name>
-		        args
-                    <comment>
-                        # parameter args
-        <attribute lineno="33">
-	    <object_name>
-	        f.function_attribute
-            <expression_value lineno="33">
-                1
-            <docstring lineno="34">
-                f.function_attribute's docstring
-
-(Comments are not implemented yet.)
-
-compiler.parse() provides most of what's needed for this doctree, and
-"tokenize" can be used to get the rest.  We can determine the line
-number from the compiler.parse() AST, and the TokenParser.rhs(lineno)
-method provides the rest.
-
-The Docutils Python reader component will transform this module doctree into a
-Python-specific Docutils doctree, and then a "stylist transform" will
-further transform it into a generic doctree.  Namespaces will have to be
-compiled for each of the scopes, but I'm not certain at what stage of
-processing.
-
-It's very important to keep all docstring processing out of this, so that it's
-a completely generic and not tool-specific.
-
-::
-
-> Why perform all of those transformations?  Why not go from the AST to a
-> generic doctree?  Or, even from the AST to the final output?
-
-I want the docutils.readers.python.moduleparser.parse_module() function to
-produce a standard documentation-oriented tree that can be used by any tool.
-We can develop it together without having to compromise on the rest of our
-design (i.e., HappyDoc doesn't have to be made to work like Docutils, and
-vice-versa).  It would be a higher-level version of what compiler.py provides.
-
-The Python reader component transforms this generic AST into a Python-specific
-doctree (it knows about modules, classes, functions, etc.), but this is
-specific to Docutils and cannot be used by HappyDoc or others.  The stylist
-transform does the final layout, converting Python-specific structures
-("class" sections, etc.) into a generic doctree using primitives (tables,
-sections, lists, etc.).  This generic doctree does *not* know about Python
-structures any more.  The advantage is that this doctree can be handed off to
-any of the output writers to create any output format we like.
-
-The latter two transforms are separate because I want to be able to have
-multiple independent layout styles (multiple runtime-selectable "stylist
-transforms").  Each of the existing tools (HappyDoc, pydoc, epydoc, Crystal,
-etc.) has its own fixed format.  I personally don't like the tables-based
-format produced by these tools, and I'd like to be able to customize the
-format easily.  That's the goal of stylist transforms, which are independent
-from the Reader component itself.  One stylist transform could produce
-HappyDoc-like output, another could produce output similar to module docs in
-the Python library reference manual, and so on.
-
-It's for exactly this reason::
-
->> It's very important to keep all docstring processing out of this, so that
->> it's a completely generic and not tool-specific.
-
-... but it goes past docstring processing.  It's also important to keep style
-decisions and tool-specific data transforms out of this module parser.
-
-
-Issues
-======
-
-* At what point should namespaces be computed?  Should they be part of the
-  basic AST produced by the ASTVisitor walk, or generated by another tree
-  traversal?
-
-* At what point should a distinction be made between local variables &
-  instance attributes in __init__ methods?
-
-* Docstrings are getting their lineno from their parents.  Should the
-  TokenParser find the real line no's?
-
-* Comments: include them?  How and when?  Only full-line comments, or
-  parameter comments too?  (See function "f" above for an example.)
-
-* Module could use more docstrings & refactoring in places.
-
-"""
-
-__docformat__ = 'reStructuredText'
-
-import sys
-import compiler
-import compiler.ast
-import tokenize
-import token
-from compiler.consts import OP_ASSIGN
-from compiler.visitor import ASTVisitor
-from types import StringType, UnicodeType, TupleType
-from docutils.readers.python import pynodes
-from docutils.nodes import Text
-
-
-def parse_module(module_text, filename):
-    """Return a module documentation tree from `module_text`."""
-    ast = compiler.parse(module_text)
-    token_parser = TokenParser(module_text)
-    visitor = ModuleVisitor(filename, token_parser)
-    compiler.walk(ast, visitor, walker=visitor)
-    return visitor.module
-
-class BaseVisitor(ASTVisitor):
-
-    def __init__(self, token_parser):
-        ASTVisitor.__init__(self)
-        self.token_parser = token_parser
-        self.context = []
-        self.documentable = None
-
-    def default(self, node, *args):
-        self.documentable = None
-        #print 'in default (%s)' % node.__class__.__name__
-        #ASTVisitor.default(self, node, *args)
-
-    def default_visit(self, node, *args):
-        #print 'in default_visit (%s)' % node.__class__.__name__
-        ASTVisitor.default(self, node, *args)
-
-
-class DocstringVisitor(BaseVisitor):
-
-    def visitDiscard(self, node):
-        if self.documentable:
-            self.visit(node.expr)
-
-    def visitConst(self, node):
-        if self.documentable:
-            if type(node.value) in (StringType, UnicodeType):
-                self.documentable.append(make_docstring(node.value, node.lineno))
-            else:
-                self.documentable = None
-
-    def visitStmt(self, node):
-        self.default_visit(node)
-
-
-class AssignmentVisitor(DocstringVisitor):
-
-    def visitAssign(self, node):
-        visitor = AttributeVisitor(self.token_parser)
-        compiler.walk(node, visitor, walker=visitor)
-        if visitor.attributes:
-            self.context[-1].extend(visitor.attributes)
-        if len(visitor.attributes) == 1:
-            self.documentable = visitor.attributes[0]
-        else:
-            self.documentable = None
-
-
-class ModuleVisitor(AssignmentVisitor):
-
-    def __init__(self, filename, token_parser):
-        AssignmentVisitor.__init__(self, token_parser)
-        self.filename = filename
-        self.module = None
-
-    def visitModule(self, node):
-        self.module = module = pynodes.module_section()
-        module['filename'] = self.filename
-        append_docstring(module, node.doc, node.lineno)
-        self.context.append(module)
-        self.documentable = module
-        self.visit(node.node)
-        self.context.pop()
-
-    def visitImport(self, node):
-        self.context[-1] += make_import_group(names=node.names,
-                                              lineno=node.lineno)
-        self.documentable = None
-
-    def visitFrom(self, node):
-        self.context[-1].append(
-            make_import_group(names=node.names, from_name=node.modname,
-                              lineno=node.lineno))
-        self.documentable = None
-
-    def visitFunction(self, node):
-        visitor = FunctionVisitor(self.token_parser,
-                                  function_class=pynodes.function_section)
-        compiler.walk(node, visitor, walker=visitor)
-        self.context[-1].append(visitor.function)
-
-    def visitClass(self, node):
-        visitor = ClassVisitor(self.token_parser)
-        compiler.walk(node, visitor, walker=visitor)
-        self.context[-1].append(visitor.klass)
-
-
-class AttributeVisitor(BaseVisitor):
-
-    def __init__(self, token_parser):
-        BaseVisitor.__init__(self, token_parser)
-        self.attributes = pynodes.class_attribute_section()
-
-    def visitAssign(self, node):
-        # Don't visit the expression itself, just the attribute nodes:
-        for child in node.nodes:
-            self.dispatch(child)
-        expression_text = self.token_parser.rhs(node.lineno)
-        expression = pynodes.expression_value()
-        expression.append(Text(expression_text))
-        for attribute in self.attributes:
-            attribute.append(expression)
-
-    def visitAssName(self, node):
-        self.attributes.append(make_attribute(node.name,
-                                              lineno=node.lineno))
-
-    def visitAssTuple(self, node):
-        attributes = self.attributes
-        self.attributes = []
-        self.default_visit(node)
-        n = pynodes.attribute_tuple()
-        n.extend(self.attributes)
-        n['lineno'] = self.attributes[0]['lineno']
-        attributes.append(n)
-        self.attributes = attributes
-        #self.attributes.append(att_tuple)
-
-    def visitAssAttr(self, node):
-        self.default_visit(node, node.attrname)
-
-    def visitGetattr(self, node, suffix):
-        self.default_visit(node, node.attrname + '.' + suffix)
-
-    def visitName(self, node, suffix):
-        self.attributes.append(make_attribute(node.name + '.' + suffix,
-                                              lineno=node.lineno))
-
-
-class FunctionVisitor(DocstringVisitor):
-
-    in_function = 0
-
-    def __init__(self, token_parser, function_class):
-        DocstringVisitor.__init__(self, token_parser)
-        self.function_class = function_class
-
-    def visitFunction(self, node):
-        if self.in_function:
-            self.documentable = None
-            # Don't bother with nested function definitions.
-            return
-        self.in_function = 1
-        self.function = function = make_function_like_section(
-            name=node.name,
-            lineno=node.lineno,
-            doc=node.doc,
-            function_class=self.function_class)
-        self.context.append(function)
-        self.documentable = function
-        self.parse_parameter_list(node)
-        self.visit(node.code)
-        self.context.pop()
-
-    def parse_parameter_list(self, node):
-        parameters = []
-        special = []
-        argnames = list(node.argnames)
-        if node.kwargs:
-            special.append(make_parameter(argnames[-1], excess_keyword=1))
-            argnames.pop()
-        if node.varargs:
-            special.append(make_parameter(argnames[-1],
-                                          excess_positional=1))
-            argnames.pop()
-        defaults = list(node.defaults)
-        defaults = [None] * (len(argnames) - len(defaults)) + defaults
-        function_parameters = self.token_parser.function_parameters(
-            node.lineno)
-        #print >>sys.stderr, function_parameters
-        for argname, default in zip(argnames, defaults):
-            if type(argname) is TupleType:
-                parameter = pynodes.parameter_tuple()
-                for tuplearg in argname:
-                    parameter.append(make_parameter(tuplearg))
-                argname = normalize_parameter_name(argname)
-            else:
-                parameter = make_parameter(argname)
-            if default:
-                n_default = pynodes.parameter_default()
-                n_default.append(Text(function_parameters[argname]))
-                parameter.append(n_default)
-            parameters.append(parameter)
-        if parameters or special:
-            special.reverse()
-            parameters.extend(special)
-            parameter_list = pynodes.parameter_list()
-            parameter_list.extend(parameters)
-            self.function.append(parameter_list)
-
-
-class ClassVisitor(AssignmentVisitor):
-
-    in_class = 0
-
-    def __init__(self, token_parser):
-        AssignmentVisitor.__init__(self, token_parser)
-        self.bases = []
-
-    def visitClass(self, node):
-        if self.in_class:
-            self.documentable = None
-            # Don't bother with nested class definitions.
-            return
-        self.in_class = 1
-        #import mypdb as pdb
-        #pdb.set_trace()
-        for base in node.bases:
-            self.visit(base)
-        self.klass = klass = make_class_section(node.name, self.bases,
-                                                doc=node.doc,
-                                                lineno=node.lineno)
-        self.context.append(klass)
-        self.documentable = klass
-        self.visit(node.code)
-        self.context.pop()
-
-    def visitGetattr(self, node, suffix=None):
-        if suffix:
-            name = node.attrname + '.' + suffix
-        else:
-            name = node.attrname
-        self.default_visit(node, name)
-
-    def visitName(self, node, suffix=None):
-        if suffix:
-            name = node.name + '.' + suffix
-        else:
-            name = node.name
-        self.bases.append(name)
-
-    def visitFunction(self, node):
-        if node.name == '__init__':
-            visitor = InitMethodVisitor(self.token_parser,
-                                        function_class=pynodes.method_section)
-            compiler.walk(node, visitor, walker=visitor)
-        else:
-            visitor = FunctionVisitor(self.token_parser,
-                                      function_class=pynodes.method_section)
-            compiler.walk(node, visitor, walker=visitor)
-        self.context[-1].append(visitor.function)
-
-
-class InitMethodVisitor(FunctionVisitor, AssignmentVisitor): pass
-
-
-class TokenParser:
-
-    def __init__(self, text):
-        self.text = text + '\n\n'
-        self.lines = self.text.splitlines(1)
-        self.generator = tokenize.generate_tokens(iter(self.lines).next)
-        self.next()
-
-    def __iter__(self):
-        return self
-
-    def next(self):
-        self.token = self.generator.next()
-        self.type, self.string, self.start, self.end, self.line = self.token
-        return self.token
-
-    def goto_line(self, lineno):
-        while self.start[0] < lineno:
-            self.next()
-        return token
-
-    def rhs(self, lineno):
-        """
-        Return a whitespace-normalized expression string from the right-hand
-        side of an assignment at line `lineno`.
-        """
-        self.goto_line(lineno)
-        while self.string != '=':
-            self.next()
-        self.stack = None
-        while self.type != token.NEWLINE and self.string != ';':
-            if self.string == '=' and not self.stack:
-                self.tokens = []
-                self.stack = []
-                self._type = None
-                self._string = None
-                self._backquote = 0
-            else:
-                self.note_token()
-            self.next()
-        self.next()
-        text = ''.join(self.tokens)
-        return text.strip()
-
-    closers = {')': '(', ']': '[', '}': '{'}
-    openers = {'(': 1, '[': 1, '{': 1}
-    del_ws_prefix = {'.': 1, '=': 1, ')': 1, ']': 1, '}': 1, ':': 1, ',': 1}
-    no_ws_suffix = {'.': 1, '=': 1, '(': 1, '[': 1, '{': 1}
-
-    def note_token(self):
-        if self.type == tokenize.NL:
-            return
-        del_ws = self.del_ws_prefix.has_key(self.string)
-        append_ws = not self.no_ws_suffix.has_key(self.string)
-        if self.openers.has_key(self.string):
-            self.stack.append(self.string)
-            if (self._type == token.NAME
-                or self.closers.has_key(self._string)):
-                del_ws = 1
-        elif self.closers.has_key(self.string):
-            assert self.stack[-1] == self.closers[self.string]
-            self.stack.pop()
-        elif self.string == '`':
-            if self._backquote:
-                del_ws = 1
-                assert self.stack[-1] == '`'
-                self.stack.pop()
-            else:
-                append_ws = 0
-                self.stack.append('`')
-            self._backquote = not self._backquote
-        if del_ws and self.tokens and self.tokens[-1] == ' ':
-            del self.tokens[-1]
-        self.tokens.append(self.string)
-        self._type = self.type
-        self._string = self.string
-        if append_ws:
-            self.tokens.append(' ')
-
-    def function_parameters(self, lineno):
-        """
-        Return a dictionary mapping parameters to defaults
-        (whitespace-normalized strings).
-        """
-        self.goto_line(lineno)
-        while self.string != 'def':
-            self.next()
-        while self.string != '(':
-            self.next()
-        name = None
-        default = None
-        parameter_tuple = None
-        self.tokens = []
-        parameters = {}
-        self.stack = [self.string]
-        self.next()
-        while 1:
-            if len(self.stack) == 1:
-                if parameter_tuple:
-                    # Just encountered ")".
-                    #print >>sys.stderr, 'parameter_tuple: %r' % self.tokens
-                    name = ''.join(self.tokens).strip()
-                    self.tokens = []
-                    parameter_tuple = None
-                if self.string in (')', ','):
-                    if name:
-                        if self.tokens:
-                            default_text = ''.join(self.tokens).strip()
-                        else:
-                            default_text = None
-                        parameters[name] = default_text
-                        self.tokens = []
-                        name = None
-                        default = None
-                    if self.string == ')':
-                        break
-                elif self.type == token.NAME:
-                    if name and default:
-                        self.note_token()
-                    else:
-                        assert name is None, (
-                            'token=%r name=%r parameters=%r stack=%r'
-                            % (self.token, name, parameters, self.stack))
-                        name = self.string
-                        #print >>sys.stderr, 'name=%r' % name
-                elif self.string == '=':
-                    assert name is not None, 'token=%r' % (self.token,)
-                    assert default is None, 'token=%r' % (self.token,)
-                    assert self.tokens == [], 'token=%r' % (self.token,)
-                    default = 1
-                    self._type = None
-                    self._string = None
-                    self._backquote = 0
-                elif name:
-                    self.note_token()
-                elif self.string == '(':
-                    parameter_tuple = 1
-                    self._type = None
-                    self._string = None
-                    self._backquote = 0
-                    self.note_token()
-                else:                   # ignore these tokens:
-                    assert (self.string in ('*', '**', '\n') 
-                            or self.type == tokenize.COMMENT), (
-                        'token=%r' % (self.token,))
-            else:
-                self.note_token()
-            self.next()
-        return parameters
-
-
-def make_docstring(doc, lineno):
-    n = pynodes.docstring()
-    if lineno:
-        # Really, only module docstrings don't have a line
-        # (@@: but maybe they should)
-        n['lineno'] = lineno
-    n.append(Text(doc))
-    return n
-
-def append_docstring(node, doc, lineno):
-    if doc:
-        node.append(make_docstring(doc, lineno))
-
-def make_class_section(name, bases, lineno, doc):
-    n = pynodes.class_section()
-    n['lineno'] = lineno
-    n.append(make_object_name(name))
-    for base in bases:
-        b = pynodes.class_base()
-        b.append(make_object_name(base))
-        n.append(b)
-    append_docstring(n, doc, lineno)
-    return n
-
-def make_object_name(name):
-    n = pynodes.object_name()
-    n.append(Text(name))
-    return n
-
-def make_function_like_section(name, lineno, doc, function_class):
-    n = function_class()
-    n['lineno'] = lineno
-    n.append(make_object_name(name))
-    append_docstring(n, doc, lineno)
-    return n
-
-def make_import_group(names, lineno, from_name=None):
-    n = pynodes.import_group()
-    n['lineno'] = lineno
-    if from_name:
-        n_from = pynodes.import_from()
-        n_from.append(Text(from_name))
-        n.append(n_from)
-    for name, alias in names:
-        n_name = pynodes.import_name()
-        n_name.append(Text(name))
-        if alias:
-            n_alias = pynodes.import_alias()
-            n_alias.append(Text(alias))
-            n_name.append(n_alias)
-        n.append(n_name)
-    return n
-
-def make_class_attribute(name, lineno):
-    n = pynodes.class_attribute()
-    n['lineno'] = lineno
-    n.append(Text(name))
-    return n
-
-def make_attribute(name, lineno):
-    n = pynodes.attribute()
-    n['lineno'] = lineno
-    n.append(make_object_name(name))
-    return n
-
-def make_parameter(name, excess_keyword=0, excess_positional=0):
-    """
-    excess_keyword and excess_positional must be either 1 or 0, and
-    not both of them can be 1.
-    """
-    n = pynodes.parameter()
-    n.append(make_object_name(name))
-    assert not excess_keyword or not excess_positional
-    if excess_keyword:
-        n['excess_keyword'] = 1
-    if excess_positional:
-        n['excess_positional'] = 1
-    return n
-
-def trim_docstring(text):
-    """
-    Trim indentation and blank lines from docstring text & return it.
-
-    See PEP 257.
-    """
-    if not text:
-        return text
-    # Convert tabs to spaces (following the normal Python rules)
-    # and split into a list of lines:
-    lines = text.expandtabs().splitlines()
-    # Determine minimum indentation (first line doesn't count):
-    indent = sys.maxint
-    for line in lines[1:]:
-        stripped = line.lstrip()
-        if stripped:
-            indent = min(indent, len(line) - len(stripped))
-    # Remove indentation (first line is special):
-    trimmed = [lines[0].strip()]
-    if indent < sys.maxint:
-        for line in lines[1:]:
-            trimmed.append(line[indent:].rstrip())
-    # Strip off trailing and leading blank lines:
-    while trimmed and not trimmed[-1]:
-        trimmed.pop()
-    while trimmed and not trimmed[0]:
-        trimmed.pop(0)
-    # Return a single string:
-    return '\n'.join(trimmed)
-
-def normalize_parameter_name(name):
-    """
-    Converts a tuple like ``('a', ('b', 'c'), 'd')`` into ``'(a, (b, c), d)'``
-    """
-    if type(name) is TupleType:
-        return '(%s)' % ', '.join([normalize_parameter_name(n) for n in name])
-    else:
-        return name
-
-if __name__ == '__main__':
-    import sys
-    args = sys.argv[1:]
-    if args[0] == '-v':
-        filename = args[1]
-        module_text = open(filename).read()
-        ast = compiler.parse(module_text)
-        visitor = compiler.visitor.ExampleASTVisitor()
-        compiler.walk(ast, visitor, walker=visitor, verbose=1)
-    else:
-        filename = args[0]
-        content = open(filename).read()
-        print parse_module(content, filename).pformat()
-
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/python/pynodes.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-#! /usr/bin/env python
-# $Id: pynodes.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-from docutils import nodes
-from docutils.nodes import Element, TextElement, Structural, Inline, Part, \
-     Text
-import types
-
-# This is the parent class of all the other pynode classes:
-class PythonStructural(Structural): pass
-
-# =====================
-#  Structural Elements
-# =====================
-
-class module_section(PythonStructural, Element): pass    
-class class_section(PythonStructural, Element): pass
-class class_base(PythonStructural, Element): pass
-class method_section(PythonStructural, Element): pass
-class attribute(PythonStructural, Element): pass
-class function_section(PythonStructural, Element): pass
-class class_attribute_section(PythonStructural, Element): pass
-class class_attribute(PythonStructural, Element): pass
-class expression_value(PythonStructural, Element): pass
-class attribute(PythonStructural, Element): pass
-
-# Structural Support Elements
-# ---------------------------
-
-class parameter_list(PythonStructural, Element): pass
-class parameter_tuple(PythonStructural, Element): pass
-class parameter_default(PythonStructural, TextElement): pass
-class import_group(PythonStructural, TextElement): pass
-class import_from(PythonStructural, TextElement): pass
-class import_name(PythonStructural, TextElement): pass
-class import_alias(PythonStructural, TextElement): pass
-class docstring(PythonStructural, Element): pass
-
-# =================
-#  Inline Elements
-# =================
-
-# These elements cannot become references until the second
-# pass.  Initially, we'll use "reference" or "name".
-
-class object_name(PythonStructural, TextElement): pass
-class parameter_list(PythonStructural, TextElement): pass
-class parameter(PythonStructural, TextElement): pass
-class parameter_default(PythonStructural, TextElement): pass
-class class_attribute(PythonStructural, TextElement): pass
-class attribute_tuple(PythonStructural, TextElement): pass
-
-# =================
-#  Unused Elements
-# =================
-
-# These were part of the model, and maybe should be in the future, but
-# aren't now.
-#class package_section(PythonStructural, Element): pass
-#class module_attribute_section(PythonStructural, Element): pass
-#class instance_attribute_section(PythonStructural, Element): pass
-#class module_attribute(PythonStructural, TextElement): pass
-#class instance_attribute(PythonStructural, TextElement): pass
-#class exception_class(PythonStructural, TextElement): pass
-#class warning_class(PythonStructural, TextElement): pass
-
-
-# Collect all the classes we've written above
-def install_node_class_names():
-    node_class_names = []
-    for name, var in globals().items():
-        if (type(var) is types.ClassType
-            and issubclass(var, PythonStructural) \
-            and name.lower() == name):
-            node_class_names.append(var.tagname or name)
-    # Register the new node names with GenericNodeVisitor and
-    # SpecificNodeVisitor:
-    nodes._add_node_class_names(node_class_names)
-install_node_class_names()
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/readers/standalone.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-# $Id: standalone.py 4802 2006-11-12 18:02:17Z goodger $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Standalone file Reader for the reStructuredText markup syntax.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import sys
-from docutils import frontend, readers
-from docutils.transforms import frontmatter, references, misc
-
-
-class Reader(readers.Reader):
-
-    supported = ('standalone',)
-    """Contexts this reader supports."""
-
-    document = None
-    """A single document tree."""
-
-    settings_spec = (
-        'Standalone Reader',
-        None,
-        (('Disable the promotion of a lone top-level section title to '
-          'document title (and subsequent section title to document '
-          'subtitle promotion; enabled by default).',
-          ['--no-doc-title'],
-          {'dest': 'doctitle_xform', 'action': 'store_false', 'default': 1,
-           'validator': frontend.validate_boolean}),
-         ('Disable the bibliographic field list transform (enabled by '
-          'default).',
-          ['--no-doc-info'],
-          {'dest': 'docinfo_xform', 'action': 'store_false', 'default': 1,
-           'validator': frontend.validate_boolean}),
-         ('Activate the promotion of lone subsection titles to '
-          'section subtitles (disabled by default).',
-          ['--section-subtitles'],
-          {'dest': 'sectsubtitle_xform', 'action': 'store_true', 'default': 0,
-           'validator': frontend.validate_boolean}),
-         ('Deactivate the promotion of lone subsection titles.',
-          ['--no-section-subtitles'],
-          {'dest': 'sectsubtitle_xform', 'action': 'store_false'}),
-         ))
-
-    config_section = 'standalone reader'
-    config_section_dependencies = ('readers',)
-
-    def get_transforms(self):
-        return readers.Reader.get_transforms(self) + [
-            references.Substitutions,
-            references.PropagateTargets,
-            frontmatter.DocTitle,
-            frontmatter.SectionSubTitle,
-            frontmatter.DocInfo,
-            references.AnonymousHyperlinks,
-            references.IndirectHyperlinks,
-            references.Footnotes,
-            references.ExternalTargets,
-            references.InternalTargets,
-            references.DanglingReferences,
-            misc.Transitions,
-            ]
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/statemachine.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1490 +0,0 @@
-# $Id: statemachine.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-A finite state machine specialized for regular-expression-based text filters,
-this module defines the following classes:
-
-- `StateMachine`, a state machine
-- `State`, a state superclass
-- `StateMachineWS`, a whitespace-sensitive version of `StateMachine`
-- `StateWS`, a state superclass for use with `StateMachineWS`
-- `SearchStateMachine`, uses `re.search()` instead of `re.match()`
-- `SearchStateMachineWS`, uses `re.search()` instead of `re.match()`
-- `ViewList`, extends standard Python lists.
-- `StringList`, string-specific ViewList.
-
-Exception classes:
-
-- `StateMachineError`
-- `UnknownStateError`
-- `DuplicateStateError`
-- `UnknownTransitionError`
-- `DuplicateTransitionError`
-- `TransitionPatternNotFound`
-- `TransitionMethodNotFound`
-- `UnexpectedIndentationError`
-- `TransitionCorrection`: Raised to switch to another transition.
-- `StateCorrection`: Raised to switch to another state & transition.
-
-Functions:
-
-- `string2lines()`: split a multi-line string into a list of one-line strings
-
-
-How To Use This Module
-======================
-(See the individual classes, methods, and attributes for details.)
-
-1. Import it: ``import statemachine`` or ``from statemachine import ...``.
-   You will also need to ``import re``.
-
-2. Derive a subclass of `State` (or `StateWS`) for each state in your state
-   machine::
-
-       class MyState(statemachine.State):
-
-   Within the state's class definition:
-
-   a) Include a pattern for each transition, in `State.patterns`::
-
-          patterns = {'atransition': r'pattern', ...}
-
-   b) Include a list of initial transitions to be set up automatically, in
-      `State.initial_transitions`::
-
-          initial_transitions = ['atransition', ...]
-
-   c) Define a method for each transition, with the same name as the
-      transition pattern::
-
-          def atransition(self, match, context, next_state):
-              # do something
-              result = [...]  # a list
-              return context, next_state, result
-              # context, next_state may be altered
-
-      Transition methods may raise an `EOFError` to cut processing short.
-
-   d) You may wish to override the `State.bof()` and/or `State.eof()` implicit
-      transition methods, which handle the beginning- and end-of-file.
-
-   e) In order to handle nested processing, you may wish to override the
-      attributes `State.nested_sm` and/or `State.nested_sm_kwargs`.
-
-      If you are using `StateWS` as a base class, in order to handle nested
-      indented blocks, you may wish to:
-
-      - override the attributes `StateWS.indent_sm`,
-        `StateWS.indent_sm_kwargs`, `StateWS.known_indent_sm`, and/or
-        `StateWS.known_indent_sm_kwargs`;
-      - override the `StateWS.blank()` method; and/or
-      - override or extend the `StateWS.indent()`, `StateWS.known_indent()`,
-        and/or `StateWS.firstknown_indent()` methods.
-
-3. Create a state machine object::
-
-       sm = StateMachine(state_classes=[MyState, ...],
-                         initial_state='MyState')
-
-4. Obtain the input text, which needs to be converted into a tab-free list of
-   one-line strings. For example, to read text from a file called
-   'inputfile'::
-
-       input_string = open('inputfile').read()
-       input_lines = statemachine.string2lines(input_string)
-
-5. Run the state machine on the input text and collect the results, a list::
-
-       results = sm.run(input_lines)
-
-6. Remove any lingering circular references::
-
-       sm.unlink()
-"""
-
-__docformat__ = 'restructuredtext'
-
-import sys
-import re
-import types
-import unicodedata
-
-
-class StateMachine:
-
-    """
-    A finite state machine for text filters using regular expressions.
-
-    The input is provided in the form of a list of one-line strings (no
-    newlines). States are subclasses of the `State` class. Transitions consist
-    of regular expression patterns and transition methods, and are defined in
-    each state.
-
-    The state machine is started with the `run()` method, which returns the
-    results of processing in a list.
-    """
-
-    def __init__(self, state_classes, initial_state, debug=0):
-        """
-        Initialize a `StateMachine` object; add state objects.
-
-        Parameters:
-
-        - `state_classes`: a list of `State` (sub)classes.
-        - `initial_state`: a string, the class name of the initial state.
-        - `debug`: a boolean; produce verbose output if true (nonzero).
-        """
-
-        self.input_lines = None
-        """`StringList` of input lines (without newlines).
-        Filled by `self.run()`."""
-
-        self.input_offset = 0
-        """Offset of `self.input_lines` from the beginning of the file."""
-
-        self.line = None
-        """Current input line."""
-
-        self.line_offset = -1
-        """Current input line offset from beginning of `self.input_lines`."""
-
-        self.debug = debug
-        """Debugging mode on/off."""
-
-        self.initial_state = initial_state
-        """The name of the initial state (key to `self.states`)."""
-
-        self.current_state = initial_state
-        """The name of the current state (key to `self.states`)."""
-
-        self.states = {}
-        """Mapping of {state_name: State_object}."""
-
-        self.add_states(state_classes)
-
-        self.observers = []
-        """List of bound methods or functions to call whenever the current
-        line changes.  Observers are called with one argument, ``self``.
-        Cleared at the end of `run()`."""
-
-    def unlink(self):
-        """Remove circular references to objects no longer required."""
-        for state in self.states.values():
-            state.unlink()
-        self.states = None
-
-    def run(self, input_lines, input_offset=0, context=None,
-            input_source=None):
-        """
-        Run the state machine on `input_lines`. Return results (a list).
-
-        Reset `self.line_offset` and `self.current_state`. Run the
-        beginning-of-file transition. Input one line at a time and check for a
-        matching transition. If a match is found, call the transition method
-        and possibly change the state. Store the context returned by the
-        transition method to be passed on to the next transition matched.
-        Accumulate the results returned by the transition methods in a list.
-        Run the end-of-file transition. Finally, return the accumulated
-        results.
-
-        Parameters:
-
-        - `input_lines`: a list of strings without newlines, or `StringList`.
-        - `input_offset`: the line offset of `input_lines` from the beginning
-          of the file.
-        - `context`: application-specific storage.
-        - `input_source`: name or path of source of `input_lines`.
-        """
-        self.runtime_init()
-        if isinstance(input_lines, StringList):
-            self.input_lines = input_lines
-        else:
-            self.input_lines = StringList(input_lines, source=input_source)
-        self.input_offset = input_offset
-        self.line_offset = -1
-        self.current_state = self.initial_state
-        if self.debug:
-            print >>sys.stderr, (
-                '\nStateMachine.run: input_lines (line_offset=%s):\n| %s'
-                % (self.line_offset, '\n| '.join(self.input_lines)))
-        transitions = None
-        results = []
-        state = self.get_state()
-        try:
-            if self.debug:
-                print >>sys.stderr, ('\nStateMachine.run: bof transition')
-            context, result = state.bof(context)
-            results.extend(result)
-            while 1:
-                try:
-                    try:
-                        self.next_line()
-                        if self.debug:
-                            source, offset = self.input_lines.info(
-                                self.line_offset)
-                            print >>sys.stderr, (
-                                '\nStateMachine.run: line (source=%r, '
-                                'offset=%r):\n| %s'
-                                % (source, offset, self.line))
-                        context, next_state, result = self.check_line(
-                            context, state, transitions)
-                    except EOFError:
-                        if self.debug:
-                            print >>sys.stderr, (
-                                '\nStateMachine.run: %s.eof transition'
-                                % state.__class__.__name__)
-                        result = state.eof(context)
-                        results.extend(result)
-                        break
-                    else:
-                        results.extend(result)
-                except TransitionCorrection, exception:
-                    self.previous_line() # back up for another try
-                    transitions = (exception.args[0],)
-                    if self.debug:
-                        print >>sys.stderr, (
-                              '\nStateMachine.run: TransitionCorrection to '
-                              'state "%s", transition %s.'
-                              % (state.__class__.__name__, transitions[0]))
-                    continue
-                except StateCorrection, exception:
-                    self.previous_line() # back up for another try
-                    next_state = exception.args[0]
-                    if len(exception.args) == 1:
-                        transitions = None
-                    else:
-                        transitions = (exception.args[1],)
-                    if self.debug:
-                        print >>sys.stderr, (
-                              '\nStateMachine.run: StateCorrection to state '
-                              '"%s", transition %s.'
-                              % (next_state, transitions[0]))
-                else:
-                    transitions = None
-                state = self.get_state(next_state)
-        except:
-            if self.debug:
-                self.error()
-            raise
-        self.observers = []
-        return results
-
-    def get_state(self, next_state=None):
-        """
-        Return current state object; set it first if `next_state` given.
-
-        Parameter `next_state`: a string, the name of the next state.
-
-        Exception: `UnknownStateError` raised if `next_state` unknown.
-        """
-        if next_state:
-            if self.debug and next_state != self.current_state:
-                print >>sys.stderr, \
-                      ('\nStateMachine.get_state: Changing state from '
-                       '"%s" to "%s" (input line %s).'
-                       % (self.current_state, next_state,
-                          self.abs_line_number()))
-            self.current_state = next_state
-        try:
-            return self.states[self.current_state]
-        except KeyError:
-            raise UnknownStateError(self.current_state)
-
-    def next_line(self, n=1):
-        """Load `self.line` with the `n`'th next line and return it."""
-        try:
-            try:
-                self.line_offset += n
-                self.line = self.input_lines[self.line_offset]
-            except IndexError:
-                self.line = None
-                raise EOFError
-            return self.line
-        finally:
-            self.notify_observers()
-
-    def is_next_line_blank(self):
-        """Return 1 if the next line is blank or non-existant."""
-        try:
-            return not self.input_lines[self.line_offset + 1].strip()
-        except IndexError:
-            return 1
-
-    def at_eof(self):
-        """Return 1 if the input is at or past end-of-file."""
-        return self.line_offset >= len(self.input_lines) - 1
-
-    def at_bof(self):
-        """Return 1 if the input is at or before beginning-of-file."""
-        return self.line_offset <= 0
-
-    def previous_line(self, n=1):
-        """Load `self.line` with the `n`'th previous line and return it."""
-        self.line_offset -= n
-        if self.line_offset < 0:
-            self.line = None
-        else:
-            self.line = self.input_lines[self.line_offset]
-        self.notify_observers()
-        return self.line
-
-    def goto_line(self, line_offset):
-        """Jump to absolute line offset `line_offset`, load and return it."""
-        try:
-            try:
-                self.line_offset = line_offset - self.input_offset
-                self.line = self.input_lines[self.line_offset]
-            except IndexError:
-                self.line = None
-                raise EOFError
-            return self.line
-        finally:
-            self.notify_observers()
-
-    def get_source(self, line_offset):
-        """Return source of line at absolute line offset `line_offset`."""
-        return self.input_lines.source(line_offset - self.input_offset)
-
-    def abs_line_offset(self):
-        """Return line offset of current line, from beginning of file."""
-        return self.line_offset + self.input_offset
-
-    def abs_line_number(self):
-        """Return line number of current line (counting from 1)."""
-        return self.line_offset + self.input_offset + 1
-
-    def insert_input(self, input_lines, source):
-        self.input_lines.insert(self.line_offset + 1, '',
-                                source='internal padding')
-        self.input_lines.insert(self.line_offset + 1, '',
-                                source='internal padding')
-        self.input_lines.insert(self.line_offset + 2,
-                                StringList(input_lines, source))
-
-    def get_text_block(self, flush_left=0):
-        """
-        Return a contiguous block of text.
-
-        If `flush_left` is true, raise `UnexpectedIndentationError` if an
-        indented line is encountered before the text block ends (with a blank
-        line).
-        """
-        try:
-            block = self.input_lines.get_text_block(self.line_offset,
-                                                    flush_left)
-            self.next_line(len(block) - 1)
-            return block
-        except UnexpectedIndentationError, error:
-            block, source, lineno = error
-            self.next_line(len(block) - 1) # advance to last line of block
-            raise
-
-    def check_line(self, context, state, transitions=None):
-        """
-        Examine one line of input for a transition match & execute its method.
-
-        Parameters:
-
-        - `context`: application-dependent storage.
-        - `state`: a `State` object, the current state.
-        - `transitions`: an optional ordered list of transition names to try,
-          instead of ``state.transition_order``.
-
-        Return the values returned by the transition method:
-
-        - context: possibly modified from the parameter `context`;
-        - next state name (`State` subclass name);
-        - the result output of the transition, a list.
-
-        When there is no match, ``state.no_match()`` is called and its return
-        value is returned.
-        """
-        if transitions is None:
-            transitions =  state.transition_order
-        state_correction = None
-        if self.debug:
-            print >>sys.stderr, (
-                  '\nStateMachine.check_line: state="%s", transitions=%r.'
-                  % (state.__class__.__name__, transitions))
-        for name in transitions:
-            pattern, method, next_state = state.transitions[name]
-            match = self.match(pattern)
-            if match:
-                if self.debug:
-                    print >>sys.stderr, (
-                          '\nStateMachine.check_line: Matched transition '
-                          '"%s" in state "%s".'
-                          % (name, state.__class__.__name__))
-                return method(match, context, next_state)
-        else:
-            if self.debug:
-                print >>sys.stderr, (
-                      '\nStateMachine.check_line: No match in state "%s".'
-                      % state.__class__.__name__)
-            return state.no_match(context, transitions)
-
-    def match(self, pattern):
-        """
-        Return the result of a regular expression match.
-
-        Parameter `pattern`: an `re` compiled regular expression.
-        """
-        return pattern.match(self.line)
-
-    def add_state(self, state_class):
-        """
-        Initialize & add a `state_class` (`State` subclass) object.
-
-        Exception: `DuplicateStateError` raised if `state_class` was already
-        added.
-        """
-        statename = state_class.__name__
-        if self.states.has_key(statename):
-            raise DuplicateStateError(statename)
-        self.states[statename] = state_class(self, self.debug)
-
-    def add_states(self, state_classes):
-        """
-        Add `state_classes` (a list of `State` subclasses).
-        """
-        for state_class in state_classes:
-            self.add_state(state_class)
-
-    def runtime_init(self):
-        """
-        Initialize `self.states`.
-        """
-        for state in self.states.values():
-            state.runtime_init()
-
-    def error(self):
-        """Report error details."""
-        type, value, module, line, function = _exception_data()
-        print >>sys.stderr, '%s: %s' % (type, value)
-        print >>sys.stderr, 'input line %s' % (self.abs_line_number())
-        print >>sys.stderr, ('module %s, line %s, function %s'
-                             % (module, line, function))
-
-    def attach_observer(self, observer):
-        """
-        The `observer` parameter is a function or bound method which takes two
-        arguments, the source and offset of the current line.
-        """
-        self.observers.append(observer)
-
-    def detach_observer(self, observer):
-        self.observers.remove(observer)
-
-    def notify_observers(self):
-        for observer in self.observers:
-            try:
-                info = self.input_lines.info(self.line_offset)
-            except IndexError:
-                info = (None, None)
-            observer(*info)
-
-
-class State:
-
-    """
-    State superclass. Contains a list of transitions, and transition methods.
-
-    Transition methods all have the same signature. They take 3 parameters:
-
-    - An `re` match object. ``match.string`` contains the matched input line,
-      ``match.start()`` gives the start index of the match, and
-      ``match.end()`` gives the end index.
-    - A context object, whose meaning is application-defined (initial value
-      ``None``). It can be used to store any information required by the state
-      machine, and the retured context is passed on to the next transition
-      method unchanged.
-    - The name of the next state, a string, taken from the transitions list;
-      normally it is returned unchanged, but it may be altered by the
-      transition method if necessary.
-
-    Transition methods all return a 3-tuple:
-
-    - A context object, as (potentially) modified by the transition method.
-    - The next state name (a return value of ``None`` means no state change).
-    - The processing result, a list, which is accumulated by the state
-      machine.
-
-    Transition methods may raise an `EOFError` to cut processing short.
-
-    There are two implicit transitions, and corresponding transition methods
-    are defined: `bof()` handles the beginning-of-file, and `eof()` handles
-    the end-of-file. These methods have non-standard signatures and return
-    values. `bof()` returns the initial context and results, and may be used
-    to return a header string, or do any other processing needed. `eof()`
-    should handle any remaining context and wrap things up; it returns the
-    final processing result.
-
-    Typical applications need only subclass `State` (or a subclass), set the
-    `patterns` and `initial_transitions` class attributes, and provide
-    corresponding transition methods. The default object initialization will
-    take care of constructing the list of transitions.
-    """
-
-    patterns = None
-    """
-    {Name: pattern} mapping, used by `make_transition()`. Each pattern may
-    be a string or a compiled `re` pattern. Override in subclasses.
-    """
-
-    initial_transitions = None
-    """
-    A list of transitions to initialize when a `State` is instantiated.
-    Each entry is either a transition name string, or a (transition name, next
-    state name) pair. See `make_transitions()`. Override in subclasses.
-    """
-
-    nested_sm = None
-    """
-    The `StateMachine` class for handling nested processing.
-
-    If left as ``None``, `nested_sm` defaults to the class of the state's
-    controlling state machine. Override it in subclasses to avoid the default.
-    """
-
-    nested_sm_kwargs = None
-    """
-    Keyword arguments dictionary, passed to the `nested_sm` constructor.
-
-    Two keys must have entries in the dictionary:
-
-    - Key 'state_classes' must be set to a list of `State` classes.
-    - Key 'initial_state' must be set to the name of the initial state class.
-
-    If `nested_sm_kwargs` is left as ``None``, 'state_classes' defaults to the
-    class of the current state, and 'initial_state' defaults to the name of
-    the class of the current state. Override in subclasses to avoid the
-    defaults.
-    """
-
-    def __init__(self, state_machine, debug=0):
-        """
-        Initialize a `State` object; make & add initial transitions.
-
-        Parameters:
-
-        - `statemachine`: the controlling `StateMachine` object.
-        - `debug`: a boolean; produce verbose output if true (nonzero).
-        """
-
-        self.transition_order = []
-        """A list of transition names in search order."""
-
-        self.transitions = {}
-        """
-        A mapping of transition names to 3-tuples containing
-        (compiled_pattern, transition_method, next_state_name). Initialized as
-        an instance attribute dynamically (instead of as a class attribute)
-        because it may make forward references to patterns and methods in this
-        or other classes.
-        """
-
-        self.add_initial_transitions()
-
-        self.state_machine = state_machine
-        """A reference to the controlling `StateMachine` object."""
-
-        self.debug = debug
-        """Debugging mode on/off."""
-
-        if self.nested_sm is None:
-            self.nested_sm = self.state_machine.__class__
-        if self.nested_sm_kwargs is None:
-            self.nested_sm_kwargs = {'state_classes': [self.__class__],
-                                     'initial_state': self.__class__.__name__}
-
-    def runtime_init(self):
-        """
-        Initialize this `State` before running the state machine; called from
-        `self.state_machine.run()`.
-        """
-        pass
-
-    def unlink(self):
-        """Remove circular references to objects no longer required."""
-        self.state_machine = None
-
-    def add_initial_transitions(self):
-        """Make and add transitions listed in `self.initial_transitions`."""
-        if self.initial_transitions:
-            names, transitions = self.make_transitions(
-                  self.initial_transitions)
-            self.add_transitions(names, transitions)
-
-    def add_transitions(self, names, transitions):
-        """
-        Add a list of transitions to the start of the transition list.
-
-        Parameters:
-
-        - `names`: a list of transition names.
-        - `transitions`: a mapping of names to transition tuples.
-
-        Exceptions: `DuplicateTransitionError`, `UnknownTransitionError`.
-        """
-        for name in names:
-            if self.transitions.has_key(name):
-                raise DuplicateTransitionError(name)
-            if not transitions.has_key(name):
-                raise UnknownTransitionError(name)
-        self.transition_order[:0] = names
-        self.transitions.update(transitions)
-
-    def add_transition(self, name, transition):
-        """
-        Add a transition to the start of the transition list.
-
-        Parameter `transition`: a ready-made transition 3-tuple.
-
-        Exception: `DuplicateTransitionError`.
-        """
-        if self.transitions.has_key(name):
-            raise DuplicateTransitionError(name)
-        self.transition_order[:0] = [name]
-        self.transitions[name] = transition
-
-    def remove_transition(self, name):
-        """
-        Remove a transition by `name`.
-
-        Exception: `UnknownTransitionError`.
-        """
-        try:
-            del self.transitions[name]
-            self.transition_order.remove(name)
-        except:
-            raise UnknownTransitionError(name)
-
-    def make_transition(self, name, next_state=None):
-        """
-        Make & return a transition tuple based on `name`.
-
-        This is a convenience function to simplify transition creation.
-
-        Parameters:
-
-        - `name`: a string, the name of the transition pattern & method. This
-          `State` object must have a method called '`name`', and a dictionary
-          `self.patterns` containing a key '`name`'.
-        - `next_state`: a string, the name of the next `State` object for this
-          transition. A value of ``None`` (or absent) implies no state change
-          (i.e., continue with the same state).
-
-        Exceptions: `TransitionPatternNotFound`, `TransitionMethodNotFound`.
-        """
-        if next_state is None:
-            next_state = self.__class__.__name__
-        try:
-            pattern = self.patterns[name]
-            if not hasattr(pattern, 'match'):
-                pattern = re.compile(pattern)
-        except KeyError:
-            raise TransitionPatternNotFound(
-                  '%s.patterns[%r]' % (self.__class__.__name__, name))
-        try:
-            method = getattr(self, name)
-        except AttributeError:
-            raise TransitionMethodNotFound(
-                  '%s.%s' % (self.__class__.__name__, name))
-        return (pattern, method, next_state)
-
-    def make_transitions(self, name_list):
-        """
-        Return a list of transition names and a transition mapping.
-
-        Parameter `name_list`: a list, where each entry is either a transition
-        name string, or a 1- or 2-tuple (transition name, optional next state
-        name).
-        """
-        stringtype = type('')
-        names = []
-        transitions = {}
-        for namestate in name_list:
-            if type(namestate) is stringtype:
-                transitions[namestate] = self.make_transition(namestate)
-                names.append(namestate)
-            else:
-                transitions[namestate[0]] = self.make_transition(*namestate)
-                names.append(namestate[0])
-        return names, transitions
-
-    def no_match(self, context, transitions):
-        """
-        Called when there is no match from `StateMachine.check_line()`.
-
-        Return the same values returned by transition methods:
-
-        - context: unchanged;
-        - next state name: ``None``;
-        - empty result list.
-
-        Override in subclasses to catch this event.
-        """
-        return context, None, []
-
-    def bof(self, context):
-        """
-        Handle beginning-of-file. Return unchanged `context`, empty result.
-
-        Override in subclasses.
-
-        Parameter `context`: application-defined storage.
-        """
-        return context, []
-
-    def eof(self, context):
-        """
-        Handle end-of-file. Return empty result.
-
-        Override in subclasses.
-
-        Parameter `context`: application-defined storage.
-        """
-        return []
-
-    def nop(self, match, context, next_state):
-        """
-        A "do nothing" transition method.
-
-        Return unchanged `context` & `next_state`, empty result. Useful for
-        simple state changes (actionless transitions).
-        """
-        return context, next_state, []
-
-
-class StateMachineWS(StateMachine):
-
-    """
-    `StateMachine` subclass specialized for whitespace recognition.
-
-    There are three methods provided for extracting indented text blocks:
-    
-    - `get_indented()`: use when the indent is unknown.
-    - `get_known_indented()`: use when the indent is known for all lines.
-    - `get_first_known_indented()`: use when only the first line's indent is
-      known.
-    """
-
-    def get_indented(self, until_blank=0, strip_indent=1):
-        """
-        Return a block of indented lines of text, and info.
-
-        Extract an indented block where the indent is unknown for all lines.
-
-        :Parameters:
-            - `until_blank`: Stop collecting at the first blank line if true
-              (1).
-            - `strip_indent`: Strip common leading indent if true (1,
-              default).
-
-        :Return:
-            - the indented block (a list of lines of text),
-            - its indent,
-            - its first line offset from BOF, and
-            - whether or not it finished with a blank line.
-        """
-        offset = self.abs_line_offset()
-        indented, indent, blank_finish = self.input_lines.get_indented(
-              self.line_offset, until_blank, strip_indent)
-        if indented:
-            self.next_line(len(indented) - 1) # advance to last indented line
-        while indented and not indented[0].strip():
-            indented.trim_start()
-            offset += 1
-        return indented, indent, offset, blank_finish
-
-    def get_known_indented(self, indent, until_blank=0, strip_indent=1):
-        """
-        Return an indented block and info.
-
-        Extract an indented block where the indent is known for all lines.
-        Starting with the current line, extract the entire text block with at
-        least `indent` indentation (which must be whitespace, except for the
-        first line).
-
-        :Parameters:
-            - `indent`: The number of indent columns/characters.
-            - `until_blank`: Stop collecting at the first blank line if true
-              (1).
-            - `strip_indent`: Strip `indent` characters of indentation if true
-              (1, default).
-
-        :Return:
-            - the indented block,
-            - its first line offset from BOF, and
-            - whether or not it finished with a blank line.
-        """
-        offset = self.abs_line_offset()
-        indented, indent, blank_finish = self.input_lines.get_indented(
-              self.line_offset, until_blank, strip_indent,
-              block_indent=indent)
-        self.next_line(len(indented) - 1) # advance to last indented line
-        while indented and not indented[0].strip():
-            indented.trim_start()
-            offset += 1
-        return indented, offset, blank_finish
-
-    def get_first_known_indented(self, indent, until_blank=0, strip_indent=1,
-                                 strip_top=1):
-        """
-        Return an indented block and info.
-
-        Extract an indented block where the indent is known for the first line
-        and unknown for all other lines.
-
-        :Parameters:
-            - `indent`: The first line's indent (# of columns/characters).
-            - `until_blank`: Stop collecting at the first blank line if true
-              (1).
-            - `strip_indent`: Strip `indent` characters of indentation if true
-              (1, default).
-            - `strip_top`: Strip blank lines from the beginning of the block.
-
-        :Return:
-            - the indented block,
-            - its indent,
-            - its first line offset from BOF, and
-            - whether or not it finished with a blank line.
-        """
-        offset = self.abs_line_offset()
-        indented, indent, blank_finish = self.input_lines.get_indented(
-              self.line_offset, until_blank, strip_indent,
-              first_indent=indent)
-        self.next_line(len(indented) - 1) # advance to last indented line
-        if strip_top:
-            while indented and not indented[0].strip():
-                indented.trim_start()
-                offset += 1
-        return indented, indent, offset, blank_finish
-
-
-class StateWS(State):
-
-    """
-    State superclass specialized for whitespace (blank lines & indents).
-
-    Use this class with `StateMachineWS`.  The transitions 'blank' (for blank
-    lines) and 'indent' (for indented text blocks) are added automatically,
-    before any other transitions.  The transition method `blank()` handles
-    blank lines and `indent()` handles nested indented blocks.  Indented
-    blocks trigger a new state machine to be created by `indent()` and run.
-    The class of the state machine to be created is in `indent_sm`, and the
-    constructor keyword arguments are in the dictionary `indent_sm_kwargs`.
-
-    The methods `known_indent()` and `firstknown_indent()` are provided for
-    indented blocks where the indent (all lines' and first line's only,
-    respectively) is known to the transition method, along with the attributes
-    `known_indent_sm` and `known_indent_sm_kwargs`.  Neither transition method
-    is triggered automatically.
-    """
-
-    indent_sm = None
-    """
-    The `StateMachine` class handling indented text blocks.
-
-    If left as ``None``, `indent_sm` defaults to the value of
-    `State.nested_sm`.  Override it in subclasses to avoid the default.
-    """
-
-    indent_sm_kwargs = None
-    """
-    Keyword arguments dictionary, passed to the `indent_sm` constructor.
-
-    If left as ``None``, `indent_sm_kwargs` defaults to the value of
-    `State.nested_sm_kwargs`. Override it in subclasses to avoid the default.
-    """
-
-    known_indent_sm = None
-    """
-    The `StateMachine` class handling known-indented text blocks.
-
-    If left as ``None``, `known_indent_sm` defaults to the value of
-    `indent_sm`.  Override it in subclasses to avoid the default.
-    """
-
-    known_indent_sm_kwargs = None
-    """
-    Keyword arguments dictionary, passed to the `known_indent_sm` constructor.
-
-    If left as ``None``, `known_indent_sm_kwargs` defaults to the value of
-    `indent_sm_kwargs`. Override it in subclasses to avoid the default.
-    """
-
-    ws_patterns = {'blank': ' *$',
-                   'indent': ' +'}
-    """Patterns for default whitespace transitions.  May be overridden in
-    subclasses."""
-
-    ws_initial_transitions = ('blank', 'indent')
-    """Default initial whitespace transitions, added before those listed in
-    `State.initial_transitions`.  May be overridden in subclasses."""
-
-    def __init__(self, state_machine, debug=0):
-        """
-        Initialize a `StateSM` object; extends `State.__init__()`.
-
-        Check for indent state machine attributes, set defaults if not set.
-        """
-        State.__init__(self, state_machine, debug)
-        if self.indent_sm is None:
-            self.indent_sm = self.nested_sm
-        if self.indent_sm_kwargs is None:
-            self.indent_sm_kwargs = self.nested_sm_kwargs
-        if self.known_indent_sm is None:
-            self.known_indent_sm = self.indent_sm
-        if self.known_indent_sm_kwargs is None:
-            self.known_indent_sm_kwargs = self.indent_sm_kwargs
-
-    def add_initial_transitions(self):
-        """
-        Add whitespace-specific transitions before those defined in subclass.
-
-        Extends `State.add_initial_transitions()`.
-        """
-        State.add_initial_transitions(self)
-        if self.patterns is None:
-            self.patterns = {}
-        self.patterns.update(self.ws_patterns)
-        names, transitions = self.make_transitions(
-            self.ws_initial_transitions)
-        self.add_transitions(names, transitions)
-
-    def blank(self, match, context, next_state):
-        """Handle blank lines. Does nothing. Override in subclasses."""
-        return self.nop(match, context, next_state)
-
-    def indent(self, match, context, next_state):
-        """
-        Handle an indented text block. Extend or override in subclasses.
-
-        Recursively run the registered state machine for indented blocks
-        (`self.indent_sm`).
-        """
-        indented, indent, line_offset, blank_finish = \
-              self.state_machine.get_indented()
-        sm = self.indent_sm(debug=self.debug, **self.indent_sm_kwargs)
-        results = sm.run(indented, input_offset=line_offset)
-        return context, next_state, results
-
-    def known_indent(self, match, context, next_state):
-        """
-        Handle a known-indent text block. Extend or override in subclasses.
-
-        Recursively run the registered state machine for known-indent indented
-        blocks (`self.known_indent_sm`). The indent is the length of the
-        match, ``match.end()``.
-        """
-        indented, line_offset, blank_finish = \
-              self.state_machine.get_known_indented(match.end())
-        sm = self.known_indent_sm(debug=self.debug,
-                                 **self.known_indent_sm_kwargs)
-        results = sm.run(indented, input_offset=line_offset)
-        return context, next_state, results
-
-    def first_known_indent(self, match, context, next_state):
-        """
-        Handle an indented text block (first line's indent known).
-
-        Extend or override in subclasses.
-
-        Recursively run the registered state machine for known-indent indented
-        blocks (`self.known_indent_sm`). The indent is the length of the
-        match, ``match.end()``.
-        """
-        indented, line_offset, blank_finish = \
-              self.state_machine.get_first_known_indented(match.end())
-        sm = self.known_indent_sm(debug=self.debug,
-                                 **self.known_indent_sm_kwargs)
-        results = sm.run(indented, input_offset=line_offset)
-        return context, next_state, results
-
-
-class _SearchOverride:
-
-    """
-    Mix-in class to override `StateMachine` regular expression behavior.
-
-    Changes regular expression matching, from the default `re.match()`
-    (succeeds only if the pattern matches at the start of `self.line`) to
-    `re.search()` (succeeds if the pattern matches anywhere in `self.line`).
-    When subclassing a `StateMachine`, list this class **first** in the
-    inheritance list of the class definition.
-    """
-
-    def match(self, pattern):
-        """
-        Return the result of a regular expression search.
-
-        Overrides `StateMachine.match()`.
-
-        Parameter `pattern`: `re` compiled regular expression.
-        """
-        return pattern.search(self.line)
-
-
-class SearchStateMachine(_SearchOverride, StateMachine):
-    """`StateMachine` which uses `re.search()` instead of `re.match()`."""
-    pass
-
-
-class SearchStateMachineWS(_SearchOverride, StateMachineWS):
-    """`StateMachineWS` which uses `re.search()` instead of `re.match()`."""
-    pass
-
-
-class ViewList:
-
-    """
-    List with extended functionality: slices of ViewList objects are child
-    lists, linked to their parents. Changes made to a child list also affect
-    the parent list.  A child list is effectively a "view" (in the SQL sense)
-    of the parent list.  Changes to parent lists, however, do *not* affect
-    active child lists.  If a parent list is changed, any active child lists
-    should be recreated.
-
-    The start and end of the slice can be trimmed using the `trim_start()` and
-    `trim_end()` methods, without affecting the parent list.  The link between
-    child and parent lists can be broken by calling `disconnect()` on the
-    child list.
-
-    Also, ViewList objects keep track of the source & offset of each item. 
-    This information is accessible via the `source()`, `offset()`, and
-    `info()` methods.
-    """
-
-    def __init__(self, initlist=None, source=None, items=None,
-                 parent=None, parent_offset=None):
-        self.data = []
-        """The actual list of data, flattened from various sources."""
-
-        self.items = []
-        """A list of (source, offset) pairs, same length as `self.data`: the
-        source of each line and the offset of each line from the beginning of
-        its source."""
-
-        self.parent = parent
-        """The parent list."""
-
-        self.parent_offset = parent_offset
-        """Offset of this list from the beginning of the parent list."""
-
-        if isinstance(initlist, ViewList):
-            self.data = initlist.data[:]
-            self.items = initlist.items[:]
-        elif initlist is not None:
-            self.data = list(initlist)
-            if items:
-                self.items = items
-            else:
-                self.items = [(source, i) for i in range(len(initlist))]
-        assert len(self.data) == len(self.items), 'data mismatch'
-
-    def __str__(self):
-        return str(self.data)
-
-    def __repr__(self):
-        return '%s(%s, items=%s)' % (self.__class__.__name__,
-                                     self.data, self.items)
-
-    def __lt__(self, other): return self.data <  self.__cast(other)
-    def __le__(self, other): return self.data <= self.__cast(other)
-    def __eq__(self, other): return self.data == self.__cast(other)
-    def __ne__(self, other): return self.data != self.__cast(other)
-    def __gt__(self, other): return self.data >  self.__cast(other)
-    def __ge__(self, other): return self.data >= self.__cast(other)
-    def __cmp__(self, other): return cmp(self.data, self.__cast(other))
-
-    def __cast(self, other):
-        if isinstance(other, ViewList):
-            return other.data
-        else:
-            return other
-
-    def __contains__(self, item): return item in self.data
-    def __len__(self): return len(self.data)
-
-    # The __getitem__()/__setitem__() methods check whether the index
-    # is a slice first, since native list objects start supporting
-    # them directly in Python 2.3 (no exception is raised when
-    # indexing a list with a slice object; they just work).
-
-    def __getitem__(self, i):
-        if isinstance(i, types.SliceType):
-            assert i.step in (None, 1),  'cannot handle slice with stride'
-            return self.__class__(self.data[i.start:i.stop],
-                                  items=self.items[i.start:i.stop],
-                                  parent=self, parent_offset=i.start)
-        else:
-            return self.data[i]
-
-    def __setitem__(self, i, item):
-        if isinstance(i, types.SliceType):
-            assert i.step in (None, 1), 'cannot handle slice with stride'
-            if not isinstance(item, ViewList):
-                raise TypeError('assigning non-ViewList to ViewList slice')
-            self.data[i.start:i.stop] = item.data
-            self.items[i.start:i.stop] = item.items
-            assert len(self.data) == len(self.items), 'data mismatch'
-            if self.parent:
-                self.parent[i.start + self.parent_offset
-                            : i.stop + self.parent_offset] = item
-        else:
-            self.data[i] = item
-            if self.parent:
-                self.parent[i + self.parent_offset] = item
-
-    def __delitem__(self, i):
-        try:
-            del self.data[i]
-            del self.items[i]
-            if self.parent:
-                del self.parent[i + self.parent_offset]
-        except TypeError:
-            assert i.step is None, 'cannot handle slice with stride'
-            del self.data[i.start:i.stop]
-            del self.items[i.start:i.stop]
-            if self.parent:
-                del self.parent[i.start + self.parent_offset
-                                : i.stop + self.parent_offset]
-
-    def __add__(self, other):
-        if isinstance(other, ViewList):
-            return self.__class__(self.data + other.data,
-                                  items=(self.items + other.items))
-        else:
-            raise TypeError('adding non-ViewList to a ViewList')
-
-    def __radd__(self, other):
-        if isinstance(other, ViewList):
-            return self.__class__(other.data + self.data,
-                                  items=(other.items + self.items))
-        else:
-            raise TypeError('adding ViewList to a non-ViewList')
-
-    def __iadd__(self, other):
-        if isinstance(other, ViewList):
-            self.data += other.data
-        else:
-            raise TypeError('argument to += must be a ViewList')
-        return self
-
-    def __mul__(self, n):
-        return self.__class__(self.data * n, items=(self.items * n))
-
-    __rmul__ = __mul__
-
-    def __imul__(self, n):
-        self.data *= n
-        self.items *= n
-        return self
-
-    def extend(self, other):
-        if not isinstance(other, ViewList):
-            raise TypeError('extending a ViewList with a non-ViewList')
-        if self.parent:
-            self.parent.insert(len(self.data) + self.parent_offset, other)
-        self.data.extend(other.data)
-        self.items.extend(other.items)
-
-    def append(self, item, source=None, offset=0):
-        if source is None:
-            self.extend(item)
-        else:
-            if self.parent:
-                self.parent.insert(len(self.data) + self.parent_offset, item,
-                                   source, offset)
-            self.data.append(item)
-            self.items.append((source, offset))
-
-    def insert(self, i, item, source=None, offset=0):
-        if source is None:
-            if not isinstance(item, ViewList):
-                raise TypeError('inserting non-ViewList with no source given')
-            self.data[i:i] = item.data
-            self.items[i:i] = item.items
-            if self.parent:
-                index = (len(self.data) + i) % len(self.data)
-                self.parent.insert(index + self.parent_offset, item)
-        else:
-            self.data.insert(i, item)
-            self.items.insert(i, (source, offset))
-            if self.parent:
-                index = (len(self.data) + i) % len(self.data)
-                self.parent.insert(index + self.parent_offset, item,
-                                   source, offset)
-
-    def pop(self, i=-1):
-        if self.parent:
-            index = (len(self.data) + i) % len(self.data)
-            self.parent.pop(index + self.parent_offset)
-        self.items.pop(i)
-        return self.data.pop(i)
-
-    def trim_start(self, n=1):
-        """
-        Remove items from the start of the list, without touching the parent.
-        """
-        if n > len(self.data):
-            raise IndexError("Size of trim too large; can't trim %s items "
-                             "from a list of size %s." % (n, len(self.data)))
-        elif n < 0:
-            raise IndexError('Trim size must be >= 0.')
-        del self.data[:n]
-        del self.items[:n]
-        if self.parent:
-            self.parent_offset += n
-
-    def trim_end(self, n=1):
-        """
-        Remove items from the end of the list, without touching the parent.
-        """
-        if n > len(self.data):
-            raise IndexError("Size of trim too large; can't trim %s items "
-                             "from a list of size %s." % (n, len(self.data)))
-        elif n < 0:
-            raise IndexError('Trim size must be >= 0.')
-        del self.data[-n:]
-        del self.items[-n:]
-
-    def remove(self, item):
-        index = self.index(item)
-        del self[index]
-
-    def count(self, item): return self.data.count(item)
-    def index(self, item): return self.data.index(item)
-
-    def reverse(self):
-        self.data.reverse()
-        self.items.reverse()
-        self.parent = None
-
-    def sort(self, *args):
-        tmp = zip(self.data, self.items)
-        tmp.sort(*args)
-        self.data = [entry[0] for entry in tmp]
-        self.items = [entry[1] for entry in tmp]
-        self.parent = None
-
-    def info(self, i):
-        """Return source & offset for index `i`."""
-        try:
-            return self.items[i]
-        except IndexError:
-            if i == len(self.data):     # Just past the end
-                return self.items[i - 1][0], None
-            else:
-                raise
-
-    def source(self, i):
-        """Return source for index `i`."""
-        return self.info(i)[0]
-
-    def offset(self, i):
-        """Return offset for index `i`."""
-        return self.info(i)[1]
-
-    def disconnect(self):
-        """Break link between this list and parent list."""
-        self.parent = None
-
-
-class StringList(ViewList):
-
-    """A `ViewList` with string-specific methods."""
-
-    def trim_left(self, length, start=0, end=sys.maxint):
-        """
-        Trim `length` characters off the beginning of each item, in-place,
-        from index `start` to `end`.  No whitespace-checking is done on the
-        trimmed text.  Does not affect slice parent.
-        """
-        self.data[start:end] = [line[length:]
-                                for line in self.data[start:end]]
-
-    def get_text_block(self, start, flush_left=0):
-        """
-        Return a contiguous block of text.
-
-        If `flush_left` is true, raise `UnexpectedIndentationError` if an
-        indented line is encountered before the text block ends (with a blank
-        line).
-        """
-        end = start
-        last = len(self.data)
-        while end < last:
-            line = self.data[end]
-            if not line.strip():
-                break
-            if flush_left and (line[0] == ' '):
-                source, offset = self.info(end)
-                raise UnexpectedIndentationError(self[start:end], source,
-                                                 offset + 1)
-            end += 1
-        return self[start:end]
-
-    def get_indented(self, start=0, until_blank=0, strip_indent=1,
-                     block_indent=None, first_indent=None):
-        """
-        Extract and return a StringList of indented lines of text.
-
-        Collect all lines with indentation, determine the minimum indentation,
-        remove the minimum indentation from all indented lines (unless
-        `strip_indent` is false), and return them. All lines up to but not
-        including the first unindented line will be returned.
-
-        :Parameters:
-          - `start`: The index of the first line to examine.
-          - `until_blank`: Stop collecting at the first blank line if true.
-          - `strip_indent`: Strip common leading indent if true (default).
-          - `block_indent`: The indent of the entire block, if known.
-          - `first_indent`: The indent of the first line, if known.
-
-        :Return:
-          - a StringList of indented lines with mininum indent removed;
-          - the amount of the indent;
-          - a boolean: did the indented block finish with a blank line or EOF?
-        """
-        indent = block_indent           # start with None if unknown
-        end = start
-        if block_indent is not None and first_indent is None:
-            first_indent = block_indent
-        if first_indent is not None:
-            end += 1
-        last = len(self.data)
-        while end < last:
-            line = self.data[end]
-            if line and (line[0] != ' '
-                         or (block_indent is not None
-                             and line[:block_indent].strip())):
-                # Line not indented or insufficiently indented.
-                # Block finished properly iff the last indented line blank:
-                blank_finish = ((end > start)
-                                and not self.data[end - 1].strip())
-                break
-            stripped = line.lstrip()
-            if not stripped:            # blank line
-                if until_blank:
-                    blank_finish = 1
-                    break
-            elif block_indent is None:
-                line_indent = len(line) - len(stripped)
-                if indent is None:
-                    indent = line_indent
-                else:
-                    indent = min(indent, line_indent)
-            end += 1
-        else:
-            blank_finish = 1            # block ends at end of lines
-        block = self[start:end]
-        if first_indent is not None and block:
-            block.data[0] = block.data[0][first_indent:]
-        if indent and strip_indent:
-            block.trim_left(indent, start=(first_indent is not None))
-        return block, indent or 0, blank_finish
-
-    def get_2D_block(self, top, left, bottom, right, strip_indent=1):
-        block = self[top:bottom]
-        indent = right
-        for i in range(len(block.data)):
-            block.data[i] = line = block.data[i][left:right].rstrip()
-            if line:
-                indent = min(indent, len(line) - len(line.lstrip()))
-        if strip_indent and 0 < indent < right:
-            block.data = [line[indent:] for line in block.data]
-        return block
-
-    def pad_double_width(self, pad_char):
-        """
-        Pad all double-width characters in self by appending `pad_char` to each.
-        For East Asian language support.
-        """
-        if hasattr(unicodedata, 'east_asian_width'):
-            east_asian_width = unicodedata.east_asian_width
-        else:
-            return                      # new in Python 2.4
-        for i in range(len(self.data)):
-            line = self.data[i]
-            if isinstance(line, types.UnicodeType):
-                new = []
-                for char in line:
-                    new.append(char)
-                    if east_asian_width(char) in 'WF': # 'W'ide & 'F'ull-width
-                        new.append(pad_char)
-                self.data[i] = ''.join(new)
-
-    def replace(self, old, new):
-        """Replace all occurrences of substring `old` with `new`."""
-        for i in range(len(self.data)):
-            self.data[i] = self.data[i].replace(old, new)
-
-
-class StateMachineError(Exception): pass
-class UnknownStateError(StateMachineError): pass
-class DuplicateStateError(StateMachineError): pass
-class UnknownTransitionError(StateMachineError): pass
-class DuplicateTransitionError(StateMachineError): pass
-class TransitionPatternNotFound(StateMachineError): pass
-class TransitionMethodNotFound(StateMachineError): pass
-class UnexpectedIndentationError(StateMachineError): pass
-
-
-class TransitionCorrection(Exception):
-
-    """
-    Raise from within a transition method to switch to another transition.
-
-    Raise with one argument, the new transition name.
-    """
-
-
-class StateCorrection(Exception):
-
-    """
-    Raise from within a transition method to switch to another state.
-
-    Raise with one or two arguments: new state name, and an optional new
-    transition name.
-    """
-
-
-def string2lines(astring, tab_width=8, convert_whitespace=0,
-                 whitespace=re.compile('[\v\f]')):
-    """
-    Return a list of one-line strings with tabs expanded, no newlines, and
-    trailing whitespace stripped.
-
-    Each tab is expanded with between 1 and `tab_width` spaces, so that the
-    next character's index becomes a multiple of `tab_width` (8 by default).
-
-    Parameters:
-
-    - `astring`: a multi-line string.
-    - `tab_width`: the number of columns between tab stops.
-    - `convert_whitespace`: convert form feeds and vertical tabs to spaces?
-    """
-    if convert_whitespace:
-        astring = whitespace.sub(' ', astring)
-    return [s.expandtabs(tab_width).rstrip() for s in astring.splitlines()]
-
-def _exception_data():
-    """
-    Return exception information:
-
-    - the exception's class name;
-    - the exception object;
-    - the name of the file containing the offending code;
-    - the line number of the offending code;
-    - the function name of the offending code.
-    """
-    type, value, traceback = sys.exc_info()
-    while traceback.tb_next:
-        traceback = traceback.tb_next
-    code = traceback.tb_frame.f_code
-    return (type.__name__, value, code.co_filename, traceback.tb_lineno,
-            code.co_name)
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,172 +0,0 @@
-# $Id: __init__.py 4975 2007-03-01 18:08:32Z wiemann $
-# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer
-# Copyright: This module has been placed in the public domain.
-
-"""
-This package contains modules for standard tree transforms available
-to Docutils components. Tree transforms serve a variety of purposes:
-
-- To tie up certain syntax-specific "loose ends" that remain after the
-  initial parsing of the input plaintext. These transforms are used to
-  supplement a limited syntax.
-
-- To automate the internal linking of the document tree (hyperlink
-  references, footnote references, etc.).
-
-- To extract useful information from the document tree. These
-  transforms may be used to construct (for example) indexes and tables
-  of contents.
-
-Each transform is an optional step that a Docutils component may
-choose to perform on the parsed document.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-from docutils import languages, ApplicationError, TransformSpec
-
-
-class TransformError(ApplicationError): pass
-
-
-class Transform:
-
-    """
-    Docutils transform component abstract base class.
-    """
-
-    default_priority = None
-    """Numerical priority of this transform, 0 through 999 (override)."""
-
-    def __init__(self, document, startnode=None):
-        """
-        Initial setup for in-place document transforms.
-        """
-
-        self.document = document
-        """The document tree to transform."""
-
-        self.startnode = startnode
-        """Node from which to begin the transform.  For many transforms which
-        apply to the document as a whole, `startnode` is not set (i.e. its
-        value is `None`)."""
-
-        self.language = languages.get_language(
-            document.settings.language_code)
-        """Language module local to this document."""
-
-    def apply(self, **kwargs):
-        """Override to apply the transform to the document tree."""
-        raise NotImplementedError('subclass must override this method')
-
-
-class Transformer(TransformSpec):
-
-    """
-    Stores transforms (`Transform` classes) and applies them to document
-    trees.  Also keeps track of components by component type name.
-    """
-
-    def __init__(self, document):
-        self.transforms = []
-        """List of transforms to apply.  Each item is a 3-tuple:
-        ``(priority string, transform class, pending node or None)``."""
-
-        self.unknown_reference_resolvers = []
-        """List of hook functions which assist in resolving references"""
-
-        self.document = document
-        """The `nodes.document` object this Transformer is attached to."""
-
-        self.applied = []
-        """Transforms already applied, in order."""
-
-        self.sorted = 0
-        """Boolean: is `self.tranforms` sorted?"""
-
-        self.components = {}
-        """Mapping of component type name to component object.  Set by
-        `self.populate_from_components()`."""
-
-        self.serialno = 0
-        """Internal serial number to keep track of the add order of
-        transforms."""
-
-    def add_transform(self, transform_class, priority=None, **kwargs):
-        """
-        Store a single transform.  Use `priority` to override the default.
-        `kwargs` is a dictionary whose contents are passed as keyword
-        arguments to the `apply` method of the transform.  This can be used to
-        pass application-specific data to the transform instance.
-        """
-        if priority is None:
-            priority = transform_class.default_priority
-        priority_string = self.get_priority_string(priority)
-        self.transforms.append(
-            (priority_string, transform_class, None, kwargs))
-        self.sorted = 0
-
-    def add_transforms(self, transform_list):
-        """Store multiple transforms, with default priorities."""
-        for transform_class in transform_list:
-            priority_string = self.get_priority_string(
-                transform_class.default_priority)
-            self.transforms.append(
-                (priority_string, transform_class, None, {}))
-        self.sorted = 0
-
-    def add_pending(self, pending, priority=None):
-        """Store a transform with an associated `pending` node."""
-        transform_class = pending.transform
-        if priority is None:
-            priority = transform_class.default_priority
-        priority_string = self.get_priority_string(priority)
-        self.transforms.append(
-            (priority_string, transform_class, pending, {}))
-        self.sorted = 0
-
-    def get_priority_string(self, priority):
-        """
-        Return a string, `priority` combined with `self.serialno`.
-
-        This ensures FIFO order on transforms with identical priority.
-        """
-        self.serialno += 1
-        return '%03d-%03d' % (priority, self.serialno)
-
-    def populate_from_components(self, components):
-        """
-        Store each component's default transforms, with default priorities.
-        Also, store components by type name in a mapping for later lookup.
-        """
-        for component in components:
-            if component is None:
-                continue
-            self.add_transforms(component.get_transforms())
-            self.components[component.component_type] = component
-        self.sorted = 0
-        # Set up all of the reference resolvers for this transformer. Each
-        # component of this transformer is able to register its own helper
-        # functions to help resolve references.
-        unknown_reference_resolvers = []
-        for i in components:
-            unknown_reference_resolvers.extend(i.unknown_reference_resolvers)
-        decorated_list = [(f.priority, f) for f in unknown_reference_resolvers]
-        decorated_list.sort()
-        self.unknown_reference_resolvers.extend([f[1] for f in decorated_list])
-
-    def apply_transforms(self):
-        """Apply all of the stored transforms, in priority order."""
-        self.document.reporter.attach_observer(
-            self.document.note_transform_message)
-        while self.transforms:
-            if not self.sorted:
-                # Unsorted initially, and whenever a transform is added.
-                self.transforms.sort()
-                self.transforms.reverse()
-                self.sorted = 1
-            priority, transform_class, pending, kwargs = self.transforms.pop()
-            transform = transform_class(self.document, startnode=pending)
-            transform.apply(**kwargs)
-            self.applied.append((priority, transform_class, pending, kwargs))
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/components.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-# $Id: components.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Docutils component-related transforms.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import sys
-import os
-import re
-import time
-from docutils import nodes, utils
-from docutils import ApplicationError, DataError
-from docutils.transforms import Transform, TransformError
-
-
-class Filter(Transform):
-
-    """
-    Include or exclude elements which depend on a specific Docutils component.
-
-    For use with `nodes.pending` elements.  A "pending" element's dictionary
-    attribute ``details`` must contain the keys "component" and "format".  The
-    value of ``details['component']`` must match the type name of the
-    component the elements depend on (e.g. "writer").  The value of
-    ``details['format']`` is the name of a specific format or context of that
-    component (e.g. "html").  If the matching Docutils component supports that
-    format or context, the "pending" element is replaced by the contents of
-    ``details['nodes']`` (a list of nodes); otherwise, the "pending" element
-    is removed.
-
-    For example, the reStructuredText "meta" directive creates a "pending"
-    element containing a "meta" element (in ``pending.details['nodes']``).
-    Only writers (``pending.details['component'] == 'writer'``) supporting the
-    "html" format (``pending.details['format'] == 'html'``) will include the
-    "meta" element; it will be deleted from the output of all other writers.
-    """
-
-    default_priority = 780
-
-    def apply(self):
-        pending = self.startnode
-        component_type = pending.details['component'] # 'reader' or 'writer'
-        format = pending.details['format']
-        component = self.document.transformer.components[component_type]
-        if component.supports(format):
-            pending.replace_self(pending.details['nodes'])
-        else:
-            pending.parent.remove(pending)
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/frontmatter.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,512 +0,0 @@
-# $Id: frontmatter.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger, Ueli Schlaepfer <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Transforms related to the front matter of a document or a section
-(information found before the main text):
-
-- `DocTitle`: Used to transform a lone top level section's title to
-  the document title, promote a remaining lone top-level section's
-  title to the document subtitle, and determine the document's title
-  metadata (document['title']) based on the document title and/or the
-  "title" setting.
-
-- `SectionSubTitle`: Used to transform a lone subsection into a
-  subtitle.
-
-- `DocInfo`: Used to transform a bibliographic field list into docinfo
-  elements.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import re
-from docutils import nodes, utils
-from docutils.transforms import TransformError, Transform
-
-
-class TitlePromoter(Transform):
-
-    """
-    Abstract base class for DocTitle and SectionSubTitle transforms.
-    """
-
-    def promote_title(self, node):
-        """
-        Transform the following tree::
-
-            <node>
-                <section>
-                    <title>
-                    ...
-
-        into ::
-
-            <node>
-                <title>
-                ...
-
-        `node` is normally a document.
-        """
-        # `node` must not have a title yet.
-        assert not (len(node) and isinstance(node[0], nodes.title))
-        section, index = self.candidate_index(node)
-        if index is None:
-            return None
-        # Transfer the section's attributes to the node:
-        node.attributes.update(section.attributes)
-        # setup_child is called automatically for all nodes.
-        node[:] = (section[:1]        # section title
-                   + node[:index]     # everything that was in the
-                                      # node before the section
-                   + section[1:])     # everything that was in the section
-        assert isinstance(node[0], nodes.title)
-        return 1
-
-    def promote_subtitle(self, node):
-        """
-        Transform the following node tree::
-
-            <node>
-                <title>
-                <section>
-                    <title>
-                    ...
-
-        into ::
-
-            <node>
-                <title>
-                <subtitle>
-                ...
-        """
-        subsection, index = self.candidate_index(node)
-        if index is None:
-            return None
-        subtitle = nodes.subtitle()
-        # Transfer the subsection's attributes to the new subtitle:
-        # This causes trouble with list attributes!  To do: Write a
-        # test case which catches direct access to the `attributes`
-        # dictionary and/or write a test case which shows problems in
-        # this particular case.
-        subtitle.attributes.update(subsection.attributes)
-        # We're losing the subtitle's attributes here!  To do: Write a
-        # test case which shows this behavior.
-        # Transfer the contents of the subsection's title to the
-        # subtitle:
-        subtitle[:] = subsection[0][:]
-        node[:] = (node[:1]       # title
-                   + [subtitle]
-                   # everything that was before the section:
-                   + node[1:index]
-                   # everything that was in the subsection:
-                   + subsection[1:])
-        return 1
-
-    def candidate_index(self, node):
-        """
-        Find and return the promotion candidate and its index.
-
-        Return (None, None) if no valid candidate was found.
-        """
-        index = node.first_child_not_matching_class(
-            nodes.PreBibliographic)
-        if index is None or len(node) > (index + 1) or \
-               not isinstance(node[index], nodes.section):
-            return None, None
-        else:
-            return node[index], index
-
-
-class DocTitle(TitlePromoter):
-
-    """
-    In reStructuredText_, there is no way to specify a document title
-    and subtitle explicitly. Instead, we can supply the document title
-    (and possibly the subtitle as well) implicitly, and use this
-    two-step transform to "raise" or "promote" the title(s) (and their
-    corresponding section contents) to the document level.
-
-    1. If the document contains a single top-level section as its
-       first non-comment element, the top-level section's title
-       becomes the document's title, and the top-level section's
-       contents become the document's immediate contents. The lone
-       top-level section header must be the first non-comment element
-       in the document.
-
-       For example, take this input text::
-
-           =================
-            Top-Level Title
-           =================
-
-           A paragraph.
-
-       Once parsed, it looks like this::
-
-           <document>
-               <section names="top-level title">
-                   <title>
-                       Top-Level Title
-                   <paragraph>
-                       A paragraph.
-
-       After running the DocTitle transform, we have::
-
-           <document names="top-level title">
-               <title>
-                   Top-Level Title
-               <paragraph>
-                   A paragraph.
-
-    2. If step 1 successfully determines the document title, we
-       continue by checking for a subtitle.
-
-       If the lone top-level section itself contains a single
-       second-level section as its first non-comment element, that
-       section's title is promoted to the document's subtitle, and
-       that section's contents become the document's immediate
-       contents. Given this input text::
-
-           =================
-            Top-Level Title
-           =================
-
-           Second-Level Title
-           ~~~~~~~~~~~~~~~~~~
-
-           A paragraph.
-
-       After parsing and running the Section Promotion transform, the
-       result is::
-
-           <document names="top-level title">
-               <title>
-                   Top-Level Title
-               <subtitle names="second-level title">
-                   Second-Level Title
-               <paragraph>
-                   A paragraph.
-
-       (Note that the implicit hyperlink target generated by the
-       "Second-Level Title" is preserved on the "subtitle" element
-       itself.)
-
-    Any comment elements occurring before the document title or
-    subtitle are accumulated and inserted as the first body elements
-    after the title(s).
-
-    This transform also sets the document's metadata title
-    (document['title']).
-
-    .. _reStructuredText: http://docutils.sf.net/rst.html
-    """
-
-    default_priority = 320
-
-    def set_metadata(self):
-        """
-        Set document['title'] metadata title from the following
-        sources, listed in order of priority:
-
-        * Existing document['title'] attribute.
-        * "title" setting.
-        * Document title node (as promoted by promote_title).
-        """
-        if not self.document.hasattr('title'):
-            if self.document.settings.title is not None:
-                self.document['title'] = self.document.settings.title
-            elif len(self.document) and isinstance(self.document[0], nodes.title):
-                self.document['title'] = self.document[0].astext()
-
-    def apply(self):
-        if getattr(self.document.settings, 'doctitle_xform', 1):
-            # promote_(sub)title defined in TitlePromoter base class.
-            if self.promote_title(self.document):
-                # If a title has been promoted, also try to promote a
-                # subtitle.
-                self.promote_subtitle(self.document)
-        # Set document['title'].
-        self.set_metadata()
-
-
-class SectionSubTitle(TitlePromoter):
-
-    """
-    This works like document subtitles, but for sections.  For example, ::
-
-        <section>
-            <title>
-                Title
-            <section>
-                <title>
-                    Subtitle
-                ...
-
-    is transformed into ::
-
-        <section>
-            <title>
-                Title
-            <subtitle>
-                Subtitle
-            ...
-
-    For details refer to the docstring of DocTitle.
-    """
-
-    default_priority = 350
-
-    def apply(self):
-        if not getattr(self.document.settings, 'sectsubtitle_xform', 1):
-            return
-        for section in self.document.traverse(nodes.section):
-            # On our way through the node tree, we are deleting
-            # sections, but we call self.promote_subtitle for those
-            # sections nonetheless.  To do: Write a test case which
-            # shows the problem and discuss on Docutils-develop.
-            self.promote_subtitle(section)
-
-
-class DocInfo(Transform):
-
-    """
-    This transform is specific to the reStructuredText_ markup syntax;
-    see "Bibliographic Fields" in the `reStructuredText Markup
-    Specification`_ for a high-level description. This transform
-    should be run *after* the `DocTitle` transform.
-
-    Given a field list as the first non-comment element after the
-    document title and subtitle (if present), registered bibliographic
-    field names are transformed to the corresponding DTD elements,
-    becoming child elements of the "docinfo" element (except for a
-    dedication and/or an abstract, which become "topic" elements after
-    "docinfo").
-
-    For example, given this document fragment after parsing::
-
-        <document>
-            <title>
-                Document Title
-            <field_list>
-                <field>
-                    <field_name>
-                        Author
-                    <field_body>
-                        <paragraph>
-                            A. Name
-                <field>
-                    <field_name>
-                        Status
-                    <field_body>
-                        <paragraph>
-                            $RCSfile$
-            ...
-
-    After running the bibliographic field list transform, the
-    resulting document tree would look like this::
-
-        <document>
-            <title>
-                Document Title
-            <docinfo>
-                <author>
-                    A. Name
-                <status>
-                    frontmatter.py
-            ...
-
-    The "Status" field contained an expanded RCS keyword, which is
-    normally (but optionally) cleaned up by the transform. The sole
-    contents of the field body must be a paragraph containing an
-    expanded RCS keyword of the form "$keyword: expansion text $". Any
-    RCS keyword can be processed in any bibliographic field. The
-    dollar signs and leading RCS keyword name are removed. Extra
-    processing is done for the following RCS keywords:
-
-    - "RCSfile" expands to the name of the file in the RCS or CVS
-      repository, which is the name of the source file with a ",v"
-      suffix appended. The transform will remove the ",v" suffix.
-
-    - "Date" expands to the format "YYYY/MM/DD hh:mm:ss" (in the UTC
-      time zone). The RCS Keywords transform will extract just the
-      date itself and transform it to an ISO 8601 format date, as in
-      "2000-12-31".
-
-      (Since the source file for this text is itself stored under CVS,
-      we can't show an example of the "Date" RCS keyword because we
-      can't prevent any RCS keywords used in this explanation from
-      being expanded. Only the "RCSfile" keyword is stable; its
-      expansion text changes only if the file name changes.)
-
-    .. _reStructuredText: http://docutils.sf.net/rst.html
-    .. _reStructuredText Markup Specification:
-       http://docutils.sf.net/docs/ref/rst/restructuredtext.html
-    """
-
-    default_priority = 340
-
-    biblio_nodes = {
-          'author': nodes.author,
-          'authors': nodes.authors,
-          'organization': nodes.organization,
-          'address': nodes.address,
-          'contact': nodes.contact,
-          'version': nodes.version,
-          'revision': nodes.revision,
-          'status': nodes.status,
-          'date': nodes.date,
-          'copyright': nodes.copyright,
-          'dedication': nodes.topic,
-          'abstract': nodes.topic}
-    """Canonical field name (lowcased) to node class name mapping for
-    bibliographic fields (field_list)."""
-
-    def apply(self):
-        if not getattr(self.document.settings, 'docinfo_xform', 1):
-            return
-        document = self.document
-        index = document.first_child_not_matching_class(
-              nodes.PreBibliographic)
-        if index is None:
-            return
-        candidate = document[index]
-        if isinstance(candidate, nodes.field_list):
-            biblioindex = document.first_child_not_matching_class(
-                  (nodes.Titular, nodes.Decorative))
-            nodelist = self.extract_bibliographic(candidate)
-            del document[index]         # untransformed field list (candidate)
-            document[biblioindex:biblioindex] = nodelist
-
-    def extract_bibliographic(self, field_list):
-        docinfo = nodes.docinfo()
-        bibliofields = self.language.bibliographic_fields
-        labels = self.language.labels
-        topics = {'dedication': None, 'abstract': None}
-        for field in field_list:
-            try:
-                name = field[0][0].astext()
-                normedname = nodes.fully_normalize_name(name)
-                if not (len(field) == 2 and bibliofields.has_key(normedname)
-                        and self.check_empty_biblio_field(field, name)):
-                    raise TransformError
-                canonical = bibliofields[normedname]
-                biblioclass = self.biblio_nodes[canonical]
-                if issubclass(biblioclass, nodes.TextElement):
-                    if not self.check_compound_biblio_field(field, name):
-                        raise TransformError
-                    utils.clean_rcs_keywords(
-                          field[1][0], self.rcs_keyword_substitutions)
-                    docinfo.append(biblioclass('', '', *field[1][0]))
-                elif issubclass(biblioclass, nodes.authors):
-                    self.extract_authors(field, name, docinfo)
-                elif issubclass(biblioclass, nodes.topic):
-                    if topics[canonical]:
-                        field[-1] += self.document.reporter.warning(
-                            'There can only be one "%s" field.' % name,
-                            base_node=field)
-                        raise TransformError
-                    title = nodes.title(name, labels[canonical])
-                    topics[canonical] = biblioclass(
-                        '', title, classes=[canonical], *field[1].children)
-                else:
-                    docinfo.append(biblioclass('', *field[1].children))
-            except TransformError:
-                if len(field[-1]) == 1 \
-                       and isinstance(field[-1][0], nodes.paragraph):
-                    utils.clean_rcs_keywords(
-                        field[-1][0], self.rcs_keyword_substitutions)
-                docinfo.append(field)
-        nodelist = []
-        if len(docinfo) != 0:
-            nodelist.append(docinfo)
-        for name in ('dedication', 'abstract'):
-            if topics[name]:
-                nodelist.append(topics[name])
-        return nodelist
-
-    def check_empty_biblio_field(self, field, name):
-        if len(field[-1]) < 1:
-            field[-1] += self.document.reporter.warning(
-                  'Cannot extract empty bibliographic field "%s".' % name,
-                  base_node=field)
-            return None
-        return 1
-
-    def check_compound_biblio_field(self, field, name):
-        if len(field[-1]) > 1:
-            field[-1] += self.document.reporter.warning(
-                  'Cannot extract compound bibliographic field "%s".' % name,
-                  base_node=field)
-            return None
-        if not isinstance(field[-1][0], nodes.paragraph):
-            field[-1] += self.document.reporter.warning(
-                  'Cannot extract bibliographic field "%s" containing '
-                  'anything other than a single paragraph.' % name,
-                  base_node=field)
-            return None
-        return 1
-
-    rcs_keyword_substitutions = [
-          (re.compile(r'\$' r'Date: (\d\d\d\d)[-/](\d\d)[-/](\d\d)[ T][\d:]+'
-                      r'[^$]* \$', re.IGNORECASE), r'\1-\2-\3'),
-          (re.compile(r'\$' r'RCSfile: (.+),v \$', re.IGNORECASE), r'\1'),
-          (re.compile(r'\$[a-zA-Z]+: (.+) \$'), r'\1'),]
-
-    def extract_authors(self, field, name, docinfo):
-        try:
-            if len(field[1]) == 1:
-                if isinstance(field[1][0], nodes.paragraph):
-                    authors = self.authors_from_one_paragraph(field)
-                elif isinstance(field[1][0], nodes.bullet_list):
-                    authors = self.authors_from_bullet_list(field)
-                else:
-                    raise TransformError
-            else:
-                authors = self.authors_from_paragraphs(field)
-            authornodes = [nodes.author('', '', *author)
-                           for author in authors if author]
-            if len(authornodes) >= 1:
-                docinfo.append(nodes.authors('', *authornodes))
-            else:
-                raise TransformError
-        except TransformError:
-            field[-1] += self.document.reporter.warning(
-                  'Bibliographic field "%s" incompatible with extraction: '
-                  'it must contain either a single paragraph (with authors '
-                  'separated by one of "%s"), multiple paragraphs (one per '
-                  'author), or a bullet list with one paragraph (one author) '
-                  'per item.'
-                  % (name, ''.join(self.language.author_separators)),
-                  base_node=field)
-            raise
-
-    def authors_from_one_paragraph(self, field):
-        text = field[1][0].astext().strip()
-        if not text:
-            raise TransformError
-        for authorsep in self.language.author_separators:
-            authornames = text.split(authorsep)
-            if len(authornames) > 1:
-                break
-        authornames = [author.strip() for author in authornames]
-        authors = [[nodes.Text(author)] for author in authornames if author]
-        return authors
-
-    def authors_from_bullet_list(self, field):
-        authors = []
-        for item in field[1][0]:
-            if len(item) != 1 or not isinstance(item[0], nodes.paragraph):
-                raise TransformError
-            authors.append(item[0].children)
-        if not authors:
-            raise TransformError
-        return authors
-
-    def authors_from_paragraphs(self, field):
-        for item in field[1]:
-            if not isinstance(item, nodes.paragraph):
-                raise TransformError
-        authors = [item.children for item in field[1]]
-        return authors
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/misc.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,143 +0,0 @@
-# $Id: misc.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Miscellaneous transforms.
-"""
-
-__docformat__ = 'reStructuredText'
-
-from docutils import nodes
-from docutils.transforms import Transform, TransformError
-
-
-class CallBack(Transform):
-
-    """
-    Inserts a callback into a document.  The callback is called when the
-    transform is applied, which is determined by its priority.
-
-    For use with `nodes.pending` elements.  Requires a ``details['callback']``
-    entry, a bound method or function which takes one parameter: the pending
-    node.  Other data can be stored in the ``details`` attribute or in the
-    object hosting the callback method.
-    """
-
-    default_priority = 990
-
-    def apply(self):
-        pending = self.startnode
-        pending.details['callback'](pending)
-        pending.parent.remove(pending)
-
-
-class ClassAttribute(Transform):
-
-    """
-    Move the "class" attribute specified in the "pending" node into the
-    immediately following non-comment element.
-    """
-
-    default_priority = 210
-
-    def apply(self):
-        pending = self.startnode
-        parent = pending.parent
-        child = pending
-        while parent:
-            # Check for appropriate following siblings:
-            for index in range(parent.index(child) + 1, len(parent)):
-                element = parent[index]
-                if (isinstance(element, nodes.Invisible) or
-                    isinstance(element, nodes.system_message)):
-                    continue
-                element['classes'] += pending.details['class']
-                pending.parent.remove(pending)
-                return
-            else:
-                # At end of section or container; apply to sibling
-                child = parent
-                parent = parent.parent
-        error = self.document.reporter.error(
-            'No suitable element following "%s" directive'
-            % pending.details['directive'],
-            nodes.literal_block(pending.rawsource, pending.rawsource),
-            line=pending.line)
-        pending.replace_self(error)
-
-
-class Transitions(Transform):
-
-    """
-    Move transitions at the end of sections up the tree.  Complain
-    on transitions after a title, at the beginning or end of the
-    document, and after another transition.
-
-    For example, transform this::
-
-        <section>
-            ...
-            <transition>
-        <section>
-            ...
-
-    into this::
-
-        <section>
-            ...
-        <transition>
-        <section>
-            ...
-    """
-
-    default_priority = 830
-
-    def apply(self):
-        for node in self.document.traverse(nodes.transition):
-            self.visit_transition(node)
-
-    def visit_transition(self, node):
-        index = node.parent.index(node)
-        error = None
-        if (index == 0 or
-            isinstance(node.parent[0], nodes.title) and
-            (index == 1 or
-             isinstance(node.parent[1], nodes.subtitle) and
-             index == 2)):
-            assert (isinstance(node.parent, nodes.document) or
-                    isinstance(node.parent, nodes.section))
-            error = self.document.reporter.error(
-                'Document or section may not begin with a transition.',
-                line=node.line)
-        elif isinstance(node.parent[index - 1], nodes.transition):
-            error = self.document.reporter.error(
-                'At least one body element must separate transitions; '
-                'adjacent transitions are not allowed.', line=node.line)
-        if error:
-            # Insert before node and update index.
-            node.parent.insert(index, error)
-            index += 1
-        assert index < len(node.parent)
-        if index != len(node.parent) - 1:
-            # No need to move the node.
-            return
-        # Node behind which the transition is to be moved.
-        sibling = node
-        # While sibling is the last node of its parent.
-        while index == len(sibling.parent) - 1:
-            sibling = sibling.parent
-            # If sibling is the whole document (i.e. it has no parent).
-            if sibling.parent is None:
-                # Transition at the end of document.  Do not move the
-                # transition up, and place an error behind.
-                error = self.document.reporter.error(
-                    'Document may not end with a transition.',
-                    line=node.line)
-                node.parent.insert(node.parent.index(node) + 1, error)
-                return
-            index = sibling.parent.index(sibling)
-        # Remove the original transition node.
-        node.parent.remove(node)
-        # Insert the transition after the sibling.
-        sibling.parent.insert(index + 1, node)
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/parts.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,164 +0,0 @@
-# $Id: parts.py 4891 2007-01-22 08:35:57Z wiemann $
-# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer; Dmitry Jemerov
-# Copyright: This module has been placed in the public domain.
-
-"""
-Transforms related to document parts.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import re
-import sys
-from docutils import nodes, utils
-from docutils.transforms import TransformError, Transform
-
-
-class SectNum(Transform):
-
-    """
-    Automatically assigns numbers to the titles of document sections.
-
-    It is possible to limit the maximum section level for which the numbers
-    are added.  For those sections that are auto-numbered, the "autonum"
-    attribute is set, informing the contents table generator that a different
-    form of the TOC should be used.
-    """
-
-    default_priority = 710
-    """Should be applied before `Contents`."""
-
-    def apply(self):
-        self.maxdepth = self.startnode.details.get('depth', sys.maxint)
-        self.startvalue = self.startnode.details.get('start', 1)
-        self.prefix = self.startnode.details.get('prefix', '')
-        self.suffix = self.startnode.details.get('suffix', '')
-        self.startnode.parent.remove(self.startnode)
-        if self.document.settings.sectnum_xform:
-            self.update_section_numbers(self.document)
-
-    def update_section_numbers(self, node, prefix=(), depth=0):
-        depth += 1
-        if prefix:
-            sectnum = 1
-        else:
-            sectnum = self.startvalue
-        for child in node:
-            if isinstance(child, nodes.section):
-                numbers = prefix + (str(sectnum),)
-                title = child[0]
-                # Use &nbsp; for spacing:
-                generated = nodes.generated(
-                    '', (self.prefix + '.'.join(numbers) + self.suffix
-                         +  u'\u00a0' * 3),
-                    classes=['sectnum'])
-                title.insert(0, generated)
-                title['auto'] = 1
-                if depth < self.maxdepth:
-                    self.update_section_numbers(child, numbers, depth)
-                sectnum += 1
-
-
-class Contents(Transform):
-
-    """
-    This transform generates a table of contents from the entire document tree
-    or from a single branch.  It locates "section" elements and builds them
-    into a nested bullet list, which is placed within a "topic" created by the
-    contents directive.  A title is either explicitly specified, taken from
-    the appropriate language module, or omitted (local table of contents).
-    The depth may be specified.  Two-way references between the table of
-    contents and section titles are generated (requires Writer support).
-
-    This transform requires a startnode, which which contains generation
-    options and provides the location for the generated table of contents (the
-    startnode is replaced by the table of contents "topic").
-    """
-
-    default_priority = 720
-
-    def apply(self):
-        details = self.startnode.details
-        if details.has_key('local'):
-            startnode = self.startnode.parent.parent
-            while not (isinstance(startnode, nodes.section)
-                       or isinstance(startnode, nodes.document)):
-                # find the ToC root: a direct ancestor of startnode
-                startnode = startnode.parent
-        else:
-            startnode = self.document
-        self.toc_id = self.startnode.parent['ids'][0]
-        if details.has_key('backlinks'):
-            self.backlinks = details['backlinks']
-        else:
-            self.backlinks = self.document.settings.toc_backlinks
-        contents = self.build_contents(startnode)
-        if len(contents):
-            self.startnode.replace_self(contents)
-        else:
-            self.startnode.parent.parent.remove(self.startnode.parent)
-
-    def build_contents(self, node, level=0):
-        level += 1
-        sections = [sect for sect in node if isinstance(sect, nodes.section)]
-        entries = []
-        autonum = 0
-        depth = self.startnode.details.get('depth', sys.maxint)
-        for section in sections:
-            title = section[0]
-            auto = title.get('auto')    # May be set by SectNum.
-            entrytext = self.copy_and_filter(title)
-            reference = nodes.reference('', '', refid=section['ids'][0],
-                                        *entrytext)
-            ref_id = self.document.set_id(reference)
-            entry = nodes.paragraph('', '', reference)
-            item = nodes.list_item('', entry)
-            if ( self.backlinks in ('entry', 'top')
-                 and title.next_node(nodes.reference) is None):
-                if self.backlinks == 'entry':
-                    title['refid'] = ref_id
-                elif self.backlinks == 'top':
-                    title['refid'] = self.toc_id
-            if level < depth:
-                subsects = self.build_contents(section, level)
-                item += subsects
-            entries.append(item)
-        if entries:
-            contents = nodes.bullet_list('', *entries)
-            if auto:
-                contents['classes'].append('auto-toc')
-            return contents
-        else:
-            return []
-
-    def copy_and_filter(self, node):
-        """Return a copy of a title, with references, images, etc. removed."""
-        visitor = ContentsFilter(self.document)
-        node.walkabout(visitor)
-        return visitor.get_entry_text()
-
-
-class ContentsFilter(nodes.TreeCopyVisitor):
-
-    def get_entry_text(self):
-        return self.get_tree_copy().children
-
-    def visit_citation_reference(self, node):
-        raise nodes.SkipNode
-
-    def visit_footnote_reference(self, node):
-        raise nodes.SkipNode
-
-    def visit_image(self, node):
-        if node.hasattr('alt'):
-            self.parent.append(nodes.Text(node['alt']))
-        raise nodes.SkipNode
-
-    def ignore_node_but_process_children(self, node):
-        raise nodes.SkipDeparture
-
-    visit_interpreted = ignore_node_but_process_children
-    visit_problematic = ignore_node_but_process_children
-    visit_reference = ignore_node_but_process_children
-    visit_target = ignore_node_but_process_children
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/peps.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,304 +0,0 @@
-# $Id: peps.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Transforms for PEP processing.
-
-- `Headers`: Used to transform a PEP's initial RFC-2822 header.  It remains a
-  field list, but some entries get processed.
-- `Contents`: Auto-inserts a table of contents.
-- `PEPZero`: Special processing for PEP 0.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import sys
-import os
-import re
-import time
-from docutils import nodes, utils, languages
-from docutils import ApplicationError, DataError
-from docutils.transforms import Transform, TransformError
-from docutils.transforms import parts, references, misc
-
-
-class Headers(Transform):
-
-    """
-    Process fields in a PEP's initial RFC-2822 header.
-    """
-
-    default_priority = 360
-
-    pep_url = 'pep-%04d'
-    pep_cvs_url = ('http://svn.python.org/view/*checkout*'
-                   '/peps/trunk/pep-%04d.txt')
-    rcs_keyword_substitutions = (
-          (re.compile(r'\$' r'RCSfile: (.+),v \$$', re.IGNORECASE), r'\1'),
-          (re.compile(r'\$[a-zA-Z]+: (.+) \$$'), r'\1'),)
-
-    def apply(self):
-        if not len(self.document):
-            # @@@ replace these DataErrors with proper system messages
-            raise DataError('Document tree is empty.')
-        header = self.document[0]
-        if not isinstance(header, nodes.field_list) or \
-              'rfc2822' not in header['classes']:
-            raise DataError('Document does not begin with an RFC-2822 '
-                            'header; it is not a PEP.')
-        pep = None
-        for field in header:
-            if field[0].astext().lower() == 'pep': # should be the first field
-                value = field[1].astext()
-                try:
-                    pep = int(value)
-                    cvs_url = self.pep_cvs_url % pep
-                except ValueError:
-                    pep = value
-                    cvs_url = None
-                    msg = self.document.reporter.warning(
-                        '"PEP" header must contain an integer; "%s" is an '
-                        'invalid value.' % pep, base_node=field)
-                    msgid = self.document.set_id(msg)
-                    prb = nodes.problematic(value, value or '(none)',
-                                            refid=msgid)
-                    prbid = self.document.set_id(prb)
-                    msg.add_backref(prbid)
-                    if len(field[1]):
-                        field[1][0][:] = [prb]
-                    else:
-                        field[1] += nodes.paragraph('', '', prb)
-                break
-        if pep is None:
-            raise DataError('Document does not contain an RFC-2822 "PEP" '
-                            'header.')
-        if pep == 0:
-            # Special processing for PEP 0.
-            pending = nodes.pending(PEPZero)
-            self.document.insert(1, pending)
-            self.document.note_pending(pending)
-        if len(header) < 2 or header[1][0].astext().lower() != 'title':
-            raise DataError('No title!')
-        for field in header:
-            name = field[0].astext().lower()
-            body = field[1]
-            if len(body) > 1:
-                raise DataError('PEP header field body contains multiple '
-                                'elements:\n%s' % field.pformat(level=1))
-            elif len(body) == 1:
-                if not isinstance(body[0], nodes.paragraph):
-                    raise DataError('PEP header field body may only contain '
-                                    'a single paragraph:\n%s'
-                                    % field.pformat(level=1))
-            elif name == 'last-modified':
-                date = time.strftime(
-                      '%d-%b-%Y',
-                      time.localtime(os.stat(self.document['source'])[8]))
-                if cvs_url:
-                    body += nodes.paragraph(
-                        '', '', nodes.reference('', date, refuri=cvs_url))
-            else:
-                # empty
-                continue
-            para = body[0]
-            if name == 'author':
-                for node in para:
-                    if isinstance(node, nodes.reference):
-                        node.replace_self(mask_email(node))
-            elif name == 'discussions-to':
-                for node in para:
-                    if isinstance(node, nodes.reference):
-                        node.replace_self(mask_email(node, pep))
-            elif name in ('replaces', 'replaced-by', 'requires'):
-                newbody = []
-                space = nodes.Text(' ')
-                for refpep in re.split(',?\s+', body.astext()):
-                    pepno = int(refpep)
-                    newbody.append(nodes.reference(
-                        refpep, refpep,
-                        refuri=(self.document.settings.pep_base_url
-                                + self.pep_url % pepno)))
-                    newbody.append(space)
-                para[:] = newbody[:-1] # drop trailing space
-            elif name == 'last-modified':
-                utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions)
-                if cvs_url:
-                    date = para.astext()
-                    para[:] = [nodes.reference('', date, refuri=cvs_url)]
-            elif name == 'content-type':
-                pep_type = para.astext()
-                uri = self.document.settings.pep_base_url + self.pep_url % 12
-                para[:] = [nodes.reference('', pep_type, refuri=uri)]
-            elif name == 'version' and len(body):
-                utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions)
-
-
-class Contents(Transform):
-
-    """
-    Insert an empty table of contents topic and a transform placeholder into
-    the document after the RFC 2822 header.
-    """
-
-    default_priority = 380
-
-    def apply(self):
-        language = languages.get_language(self.document.settings.language_code)
-        name = language.labels['contents']
-        title = nodes.title('', name)
-        topic = nodes.topic('', title, classes=['contents'])
-        name = nodes.fully_normalize_name(name)
-        if not self.document.has_name(name):
-            topic['names'].append(name)
-        self.document.note_implicit_target(topic)
-        pending = nodes.pending(parts.Contents)
-        topic += pending
-        self.document.insert(1, topic)
-        self.document.note_pending(pending)
-
-
-class TargetNotes(Transform):
-
-    """
-    Locate the "References" section, insert a placeholder for an external
-    target footnote insertion transform at the end, and schedule the
-    transform to run immediately.
-    """
-
-    default_priority = 520
-
-    def apply(self):
-        doc = self.document
-        i = len(doc) - 1
-        refsect = copyright = None
-        while i >= 0 and isinstance(doc[i], nodes.section):
-            title_words = doc[i][0].astext().lower().split()
-            if 'references' in title_words:
-                refsect = doc[i]
-                break
-            elif 'copyright' in title_words:
-                copyright = i
-            i -= 1
-        if not refsect:
-            refsect = nodes.section()
-            refsect += nodes.title('', 'References')
-            doc.set_id(refsect)
-            if copyright:
-                # Put the new "References" section before "Copyright":
-                doc.insert(copyright, refsect)
-            else:
-                # Put the new "References" section at end of doc:
-                doc.append(refsect)
-        pending = nodes.pending(references.TargetNotes)
-        refsect.append(pending)
-        self.document.note_pending(pending, 0)
-        pending = nodes.pending(misc.CallBack,
-                                details={'callback': self.cleanup_callback})
-        refsect.append(pending)
-        self.document.note_pending(pending, 1)
-
-    def cleanup_callback(self, pending):
-        """
-        Remove an empty "References" section.
-
-        Called after the `references.TargetNotes` transform is complete.
-        """
-        if len(pending.parent) == 2:    # <title> and <pending>
-            pending.parent.parent.remove(pending.parent)
-
-
-class PEPZero(Transform):
-
-    """
-    Special processing for PEP 0.
-    """
-
-    default_priority =760
-
-    def apply(self):
-        visitor = PEPZeroSpecial(self.document)
-        self.document.walk(visitor)
-        self.startnode.parent.remove(self.startnode)
-
-
-class PEPZeroSpecial(nodes.SparseNodeVisitor):
-
-    """
-    Perform the special processing needed by PEP 0:
-
-    - Mask email addresses.
-
-    - Link PEP numbers in the second column of 4-column tables to the PEPs
-      themselves.
-    """
-
-    pep_url = Headers.pep_url
-
-    def unknown_visit(self, node):
-        pass
-
-    def visit_reference(self, node):
-        node.replace_self(mask_email(node))
-
-    def visit_field_list(self, node):
-        if 'rfc2822' in node['classes']:
-            raise nodes.SkipNode
-
-    def visit_tgroup(self, node):
-        self.pep_table = node['cols'] == 4
-        self.entry = 0
-
-    def visit_colspec(self, node):
-        self.entry += 1
-        if self.pep_table and self.entry == 2:
-            node['classes'].append('num')
-
-    def visit_row(self, node):
-        self.entry = 0
-
-    def visit_entry(self, node):
-        self.entry += 1
-        if self.pep_table and self.entry == 2 and len(node) == 1:
-            node['classes'].append('num')
-            p = node[0]
-            if isinstance(p, nodes.paragraph) and len(p) == 1:
-                text = p.astext()
-                try:
-                    pep = int(text)
-                    ref = (self.document.settings.pep_base_url
-                           + self.pep_url % pep)
-                    p[0] = nodes.reference(text, text, refuri=ref)
-                except ValueError:
-                    pass
-
-
-non_masked_addresses = ('peps@python.org',
-                        'python-list@python.org',
-                        'python-dev@python.org')
-
-def mask_email(ref, pepno=None):
-    """
-    Mask the email address in `ref` and return a replacement node.
-
-    `ref` is returned unchanged if it contains no email address.
-
-    For email addresses such as "user@host", mask the address as "user at
-    host" (text) to thwart simple email address harvesters (except for those
-    listed in `non_masked_addresses`).  If a PEP number (`pepno`) is given,
-    return a reference including a default email subject.
-    """
-    if ref.hasattr('refuri') and ref['refuri'].startswith('mailto:'):
-        if ref['refuri'][8:] in non_masked_addresses:
-            replacement = ref[0]
-        else:
-            replacement_text = ref.astext().replace('@', '&#32;&#97;t&#32;')
-            replacement = nodes.raw('', replacement_text, format='html')
-        if pepno is None:
-            return replacement
-        else:
-            ref['refuri'] += '?subject=PEP%%20%s' % pepno
-            ref[:] = [replacement]
-            return ref
-    else:
-        return ref
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/references.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,896 +0,0 @@
-# $Id: references.py 5018 2007-03-12 21:39:31Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Transforms for resolving references.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import sys
-import re
-from docutils import nodes, utils
-from docutils.transforms import TransformError, Transform
-
-
-class PropagateTargets(Transform):
-
-    """
-    Propagate empty internal targets to the next element.
-
-    Given the following nodes::
-
-        <target ids="internal1" names="internal1">
-        <target anonymous="1" ids="id1">
-        <target ids="internal2" names="internal2">
-        <paragraph>
-            This is a test.
-
-    PropagateTargets propagates the ids and names of the internal
-    targets preceding the paragraph to the paragraph itself::
-
-        <target refid="internal1">
-        <target anonymous="1" refid="id1">
-        <target refid="internal2">
-        <paragraph ids="internal2 id1 internal1" names="internal2 internal1">
-            This is a test.
-    """
-
-    default_priority = 260
-
-    def apply(self):
-        for target in self.document.traverse(nodes.target):
-            # Only block-level targets without reference (like ".. target:"):
-            if (isinstance(target.parent, nodes.TextElement) or
-                (target.hasattr('refid') or target.hasattr('refuri') or
-                 target.hasattr('refname'))):
-                continue
-            assert len(target) == 0, 'error: block-level target has children'
-            next_node = target.next_node(ascend=1)
-            # Do not move names and ids into Invisibles (we'd lose the
-            # attributes) or different Targetables (e.g. footnotes).
-            if (next_node is not None and
-                ((not isinstance(next_node, nodes.Invisible) and
-                  not isinstance(next_node, nodes.Targetable)) or
-                 isinstance(next_node, nodes.target))):
-                next_node['ids'].extend(target['ids'])
-                next_node['names'].extend(target['names'])
-                # Set defaults for next_node.expect_referenced_by_name/id.
-                if not hasattr(next_node, 'expect_referenced_by_name'):
-                    next_node.expect_referenced_by_name = {}
-                if not hasattr(next_node, 'expect_referenced_by_id'):
-                    next_node.expect_referenced_by_id = {}
-                for id in target['ids']:
-                    # Update IDs to node mapping.
-                    self.document.ids[id] = next_node
-                    # If next_node is referenced by id ``id``, this
-                    # target shall be marked as referenced.
-                    next_node.expect_referenced_by_id[id] = target
-                for name in target['names']:
-                    next_node.expect_referenced_by_name[name] = target
-                # If there are any expect_referenced_by_... attributes
-                # in target set, copy them to next_node.
-                next_node.expect_referenced_by_name.update(
-                    getattr(target, 'expect_referenced_by_name', {}))
-                next_node.expect_referenced_by_id.update(
-                    getattr(target, 'expect_referenced_by_id', {}))
-                # Set refid to point to the first former ID of target
-                # which is now an ID of next_node.
-                target['refid'] = target['ids'][0]
-                # Clear ids and names; they have been moved to
-                # next_node.
-                target['ids'] = []
-                target['names'] = []
-                self.document.note_refid(target)
-
-
-class AnonymousHyperlinks(Transform):
-
-    """
-    Link anonymous references to targets.  Given::
-
-        <paragraph>
-            <reference anonymous="1">
-                internal
-            <reference anonymous="1">
-                external
-        <target anonymous="1" ids="id1">
-        <target anonymous="1" ids="id2" refuri="http://external">
-
-    Corresponding references are linked via "refid" or resolved via "refuri"::
-
-        <paragraph>
-            <reference anonymous="1" refid="id1">
-                text
-            <reference anonymous="1" refuri="http://external">
-                external
-        <target anonymous="1" ids="id1">
-        <target anonymous="1" ids="id2" refuri="http://external">
-    """
-
-    default_priority = 440
-
-    def apply(self):
-        anonymous_refs = []
-        anonymous_targets = []
-        for node in self.document.traverse(nodes.reference):
-            if node.get('anonymous'):
-                anonymous_refs.append(node)
-        for node in self.document.traverse(nodes.target):
-            if node.get('anonymous'):
-                anonymous_targets.append(node)
-        if len(anonymous_refs) \
-              != len(anonymous_targets):
-            msg = self.document.reporter.error(
-                  'Anonymous hyperlink mismatch: %s references but %s '
-                  'targets.\nSee "backrefs" attribute for IDs.'
-                  % (len(anonymous_refs), len(anonymous_targets)))
-            msgid = self.document.set_id(msg)
-            for ref in anonymous_refs:
-                prb = nodes.problematic(
-                      ref.rawsource, ref.rawsource, refid=msgid)
-                prbid = self.document.set_id(prb)
-                msg.add_backref(prbid)
-                ref.replace_self(prb)
-            return
-        for ref, target in zip(anonymous_refs, anonymous_targets):
-            target.referenced = 1
-            while 1:
-                if target.hasattr('refuri'):
-                    ref['refuri'] = target['refuri']
-                    ref.resolved = 1
-                    break
-                else:
-                    if not target['ids']:
-                        # Propagated target.
-                        target = self.document.ids[target['refid']]
-                        continue
-                    ref['refid'] = target['ids'][0]
-                    self.document.note_refid(ref)
-                    break
-
-
-class IndirectHyperlinks(Transform):
-
-    """
-    a) Indirect external references::
-
-           <paragraph>
-               <reference refname="indirect external">
-                   indirect external
-           <target id="id1" name="direct external"
-               refuri="http://indirect">
-           <target id="id2" name="indirect external"
-               refname="direct external">
-
-       The "refuri" attribute is migrated back to all indirect targets
-       from the final direct target (i.e. a target not referring to
-       another indirect target)::
-
-           <paragraph>
-               <reference refname="indirect external">
-                   indirect external
-           <target id="id1" name="direct external"
-               refuri="http://indirect">
-           <target id="id2" name="indirect external"
-               refuri="http://indirect">
-
-       Once the attribute is migrated, the preexisting "refname" attribute
-       is dropped.
-
-    b) Indirect internal references::
-
-           <target id="id1" name="final target">
-           <paragraph>
-               <reference refname="indirect internal">
-                   indirect internal
-           <target id="id2" name="indirect internal 2"
-               refname="final target">
-           <target id="id3" name="indirect internal"
-               refname="indirect internal 2">
-
-       Targets which indirectly refer to an internal target become one-hop
-       indirect (their "refid" attributes are directly set to the internal
-       target's "id"). References which indirectly refer to an internal
-       target become direct internal references::
-
-           <target id="id1" name="final target">
-           <paragraph>
-               <reference refid="id1">
-                   indirect internal
-           <target id="id2" name="indirect internal 2" refid="id1">
-           <target id="id3" name="indirect internal" refid="id1">
-    """
-
-    default_priority = 460
-
-    def apply(self):
-        for target in self.document.indirect_targets:
-            if not target.resolved:
-                self.resolve_indirect_target(target)
-            self.resolve_indirect_references(target)
-
-    def resolve_indirect_target(self, target):
-        refname = target.get('refname')
-        if refname is None:
-            reftarget_id = target['refid']
-        else:
-            reftarget_id = self.document.nameids.get(refname)
-            if not reftarget_id:
-                # Check the unknown_reference_resolvers
-                for resolver_function in \
-                        self.document.transformer.unknown_reference_resolvers:
-                    if resolver_function(target):
-                        break
-                else:
-                    self.nonexistent_indirect_target(target)
-                return
-        reftarget = self.document.ids[reftarget_id]
-        reftarget.note_referenced_by(id=reftarget_id)
-        if isinstance(reftarget, nodes.target) \
-               and not reftarget.resolved and reftarget.hasattr('refname'):
-            if hasattr(target, 'multiply_indirect'):
-                #and target.multiply_indirect):
-                #del target.multiply_indirect
-                self.circular_indirect_reference(target)
-                return
-            target.multiply_indirect = 1
-            self.resolve_indirect_target(reftarget) # multiply indirect
-            del target.multiply_indirect
-        if reftarget.hasattr('refuri'):
-            target['refuri'] = reftarget['refuri']
-            if target.has_key('refid'):
-                del target['refid']
-        elif reftarget.hasattr('refid'):
-            target['refid'] = reftarget['refid']
-            self.document.note_refid(target)
-        else:
-            if reftarget['ids']:
-                target['refid'] = reftarget_id
-                self.document.note_refid(target)
-            else:
-                self.nonexistent_indirect_target(target)
-                return
-        if refname is not None:
-            del target['refname']
-        target.resolved = 1
-
-    def nonexistent_indirect_target(self, target):
-        if self.document.nameids.has_key(target['refname']):
-            self.indirect_target_error(target, 'which is a duplicate, and '
-                                       'cannot be used as a unique reference')
-        else:
-            self.indirect_target_error(target, 'which does not exist')
-
-    def circular_indirect_reference(self, target):
-        self.indirect_target_error(target, 'forming a circular reference')
-
-    def indirect_target_error(self, target, explanation):
-        naming = ''
-        reflist = []
-        if target['names']:
-            naming = '"%s" ' % target['names'][0]
-        for name in target['names']:
-            reflist.extend(self.document.refnames.get(name, []))
-        for id in target['ids']:
-            reflist.extend(self.document.refids.get(id, []))
-        naming += '(id="%s")' % target['ids'][0]
-        msg = self.document.reporter.error(
-              'Indirect hyperlink target %s refers to target "%s", %s.'
-              % (naming, target['refname'], explanation), base_node=target)
-        msgid = self.document.set_id(msg)
-        for ref in utils.uniq(reflist):
-            prb = nodes.problematic(
-                  ref.rawsource, ref.rawsource, refid=msgid)
-            prbid = self.document.set_id(prb)
-            msg.add_backref(prbid)
-            ref.replace_self(prb)
-        target.resolved = 1
-
-    def resolve_indirect_references(self, target):
-        if target.hasattr('refid'):
-            attname = 'refid'
-            call_method = self.document.note_refid
-        elif target.hasattr('refuri'):
-            attname = 'refuri'
-            call_method = None
-        else:
-            return
-        attval = target[attname]
-        for name in target['names']:
-            reflist = self.document.refnames.get(name, [])
-            if reflist:
-                target.note_referenced_by(name=name)
-            for ref in reflist:
-                if ref.resolved:
-                    continue
-                del ref['refname']
-                ref[attname] = attval
-                if call_method:
-                    call_method(ref)
-                ref.resolved = 1
-                if isinstance(ref, nodes.target):
-                    self.resolve_indirect_references(ref)
-        for id in target['ids']:
-            reflist = self.document.refids.get(id, [])
-            if reflist:
-                target.note_referenced_by(id=id)
-            for ref in reflist:
-                if ref.resolved:
-                    continue
-                del ref['refid']
-                ref[attname] = attval
-                if call_method:
-                    call_method(ref)
-                ref.resolved = 1
-                if isinstance(ref, nodes.target):
-                    self.resolve_indirect_references(ref)
-
-
-class ExternalTargets(Transform):
-
-    """
-    Given::
-
-        <paragraph>
-            <reference refname="direct external">
-                direct external
-        <target id="id1" name="direct external" refuri="http://direct">
-
-    The "refname" attribute is replaced by the direct "refuri" attribute::
-
-        <paragraph>
-            <reference refuri="http://direct">
-                direct external
-        <target id="id1" name="direct external" refuri="http://direct">
-    """
-
-    default_priority = 640
-
-    def apply(self):
-        for target in self.document.traverse(nodes.target):
-            if target.hasattr('refuri'):
-                refuri = target['refuri']
-                for name in target['names']:
-                    reflist = self.document.refnames.get(name, [])
-                    if reflist:
-                        target.note_referenced_by(name=name)
-                    for ref in reflist:
-                        if ref.resolved:
-                            continue
-                        del ref['refname']
-                        ref['refuri'] = refuri
-                        ref.resolved = 1
-
-
-class InternalTargets(Transform):
-
-    default_priority = 660
-
-    def apply(self):
-        for target in self.document.traverse(nodes.target):
-            if not target.hasattr('refuri') and not target.hasattr('refid'):
-                self.resolve_reference_ids(target)
-
-    def resolve_reference_ids(self, target):
-        """
-        Given::
-
-            <paragraph>
-                <reference refname="direct internal">
-                    direct internal
-            <target id="id1" name="direct internal">
-
-        The "refname" attribute is replaced by "refid" linking to the target's
-        "id"::
-
-            <paragraph>
-                <reference refid="id1">
-                    direct internal
-            <target id="id1" name="direct internal">
-        """
-        for name in target['names']:
-            refid = self.document.nameids[name]
-            reflist = self.document.refnames.get(name, [])
-            if reflist:
-                target.note_referenced_by(name=name)
-            for ref in reflist:
-                if ref.resolved:
-                    continue
-                del ref['refname']
-                ref['refid'] = refid
-                ref.resolved = 1
-
-
-class Footnotes(Transform):
-
-    """
-    Assign numbers to autonumbered footnotes, and resolve links to footnotes,
-    citations, and their references.
-
-    Given the following ``document`` as input::
-
-        <document>
-            <paragraph>
-                A labeled autonumbered footnote referece:
-                <footnote_reference auto="1" id="id1" refname="footnote">
-            <paragraph>
-                An unlabeled autonumbered footnote referece:
-                <footnote_reference auto="1" id="id2">
-            <footnote auto="1" id="id3">
-                <paragraph>
-                    Unlabeled autonumbered footnote.
-            <footnote auto="1" id="footnote" name="footnote">
-                <paragraph>
-                    Labeled autonumbered footnote.
-
-    Auto-numbered footnotes have attribute ``auto="1"`` and no label.
-    Auto-numbered footnote_references have no reference text (they're
-    empty elements). When resolving the numbering, a ``label`` element
-    is added to the beginning of the ``footnote``, and reference text
-    to the ``footnote_reference``.
-
-    The transformed result will be::
-
-        <document>
-            <paragraph>
-                A labeled autonumbered footnote referece:
-                <footnote_reference auto="1" id="id1" refid="footnote">
-                    2
-            <paragraph>
-                An unlabeled autonumbered footnote referece:
-                <footnote_reference auto="1" id="id2" refid="id3">
-                    1
-            <footnote auto="1" id="id3" backrefs="id2">
-                <label>
-                    1
-                <paragraph>
-                    Unlabeled autonumbered footnote.
-            <footnote auto="1" id="footnote" name="footnote" backrefs="id1">
-                <label>
-                    2
-                <paragraph>
-                    Labeled autonumbered footnote.
-
-    Note that the footnotes are not in the same order as the references.
-
-    The labels and reference text are added to the auto-numbered ``footnote``
-    and ``footnote_reference`` elements.  Footnote elements are backlinked to
-    their references via "refids" attributes.  References are assigned "id"
-    and "refid" attributes.
-
-    After adding labels and reference text, the "auto" attributes can be
-    ignored.
-    """
-
-    default_priority = 620
-
-    autofootnote_labels = None
-    """Keep track of unlabeled autonumbered footnotes."""
-
-    symbols = [
-          # Entries 1-4 and 6 below are from section 12.51 of
-          # The Chicago Manual of Style, 14th edition.
-          '*',                          # asterisk/star
-          u'\u2020',                    # dagger &dagger;
-          u'\u2021',                    # double dagger &Dagger;
-          u'\u00A7',                    # section mark &sect;
-          u'\u00B6',                    # paragraph mark (pilcrow) &para;
-                                        # (parallels ['||'] in CMoS)
-          '#',                          # number sign
-          # The entries below were chosen arbitrarily.
-          u'\u2660',                    # spade suit &spades;
-          u'\u2665',                    # heart suit &hearts;
-          u'\u2666',                    # diamond suit &diams;
-          u'\u2663',                    # club suit &clubs;
-          ]
-
-    def apply(self):
-        self.autofootnote_labels = []
-        startnum = self.document.autofootnote_start
-        self.document.autofootnote_start = self.number_footnotes(startnum)
-        self.number_footnote_references(startnum)
-        self.symbolize_footnotes()
-        self.resolve_footnotes_and_citations()
-
-    def number_footnotes(self, startnum):
-        """
-        Assign numbers to autonumbered footnotes.
-
-        For labeled autonumbered footnotes, copy the number over to
-        corresponding footnote references.
-        """
-        for footnote in self.document.autofootnotes:
-            while 1:
-                label = str(startnum)
-                startnum += 1
-                if not self.document.nameids.has_key(label):
-                    break
-            footnote.insert(0, nodes.label('', label))
-            for name in footnote['names']:
-                for ref in self.document.footnote_refs.get(name, []):
-                    ref += nodes.Text(label)
-                    ref.delattr('refname')
-                    assert len(footnote['ids']) == len(ref['ids']) == 1
-                    ref['refid'] = footnote['ids'][0]
-                    footnote.add_backref(ref['ids'][0])
-                    self.document.note_refid(ref)
-                    ref.resolved = 1
-            if not footnote['names'] and not footnote['dupnames']:
-                footnote['names'].append(label)
-                self.document.note_explicit_target(footnote, footnote)
-                self.autofootnote_labels.append(label)
-        return startnum
-
-    def number_footnote_references(self, startnum):
-        """Assign numbers to autonumbered footnote references."""
-        i = 0
-        for ref in self.document.autofootnote_refs:
-            if ref.resolved or ref.hasattr('refid'):
-                continue
-            try:
-                label = self.autofootnote_labels[i]
-            except IndexError:
-                msg = self.document.reporter.error(
-                      'Too many autonumbered footnote references: only %s '
-                      'corresponding footnotes available.'
-                      % len(self.autofootnote_labels), base_node=ref)
-                msgid = self.document.set_id(msg)
-                for ref in self.document.autofootnote_refs[i:]:
-                    if ref.resolved or ref.hasattr('refname'):
-                        continue
-                    prb = nodes.problematic(
-                          ref.rawsource, ref.rawsource, refid=msgid)
-                    prbid = self.document.set_id(prb)
-                    msg.add_backref(prbid)
-                    ref.replace_self(prb)
-                break
-            ref += nodes.Text(label)
-            id = self.document.nameids[label]
-            footnote = self.document.ids[id]
-            ref['refid'] = id
-            self.document.note_refid(ref)
-            assert len(ref['ids']) == 1
-            footnote.add_backref(ref['ids'][0])
-            ref.resolved = 1
-            i += 1
-
-    def symbolize_footnotes(self):
-        """Add symbols indexes to "[*]"-style footnotes and references."""
-        labels = []
-        for footnote in self.document.symbol_footnotes:
-            reps, index = divmod(self.document.symbol_footnote_start,
-                                 len(self.symbols))
-            labeltext = self.symbols[index] * (reps + 1)
-            labels.append(labeltext)
-            footnote.insert(0, nodes.label('', labeltext))
-            self.document.symbol_footnote_start += 1
-            self.document.set_id(footnote)
-        i = 0
-        for ref in self.document.symbol_footnote_refs:
-            try:
-                ref += nodes.Text(labels[i])
-            except IndexError:
-                msg = self.document.reporter.error(
-                      'Too many symbol footnote references: only %s '
-                      'corresponding footnotes available.' % len(labels),
-                      base_node=ref)
-                msgid = self.document.set_id(msg)
-                for ref in self.document.symbol_footnote_refs[i:]:
-                    if ref.resolved or ref.hasattr('refid'):
-                        continue
-                    prb = nodes.problematic(
-                          ref.rawsource, ref.rawsource, refid=msgid)
-                    prbid = self.document.set_id(prb)
-                    msg.add_backref(prbid)
-                    ref.replace_self(prb)
-                break
-            footnote = self.document.symbol_footnotes[i]
-            assert len(footnote['ids']) == 1
-            ref['refid'] = footnote['ids'][0]
-            self.document.note_refid(ref)
-            footnote.add_backref(ref['ids'][0])
-            i += 1
-
-    def resolve_footnotes_and_citations(self):
-        """
-        Link manually-labeled footnotes and citations to/from their
-        references.
-        """
-        for footnote in self.document.footnotes:
-            for label in footnote['names']:
-                if self.document.footnote_refs.has_key(label):
-                    reflist = self.document.footnote_refs[label]
-                    self.resolve_references(footnote, reflist)
-        for citation in self.document.citations:
-            for label in citation['names']:
-                if self.document.citation_refs.has_key(label):
-                    reflist = self.document.citation_refs[label]
-                    self.resolve_references(citation, reflist)
-
-    def resolve_references(self, note, reflist):
-        assert len(note['ids']) == 1
-        id = note['ids'][0]
-        for ref in reflist:
-            if ref.resolved:
-                continue
-            ref.delattr('refname')
-            ref['refid'] = id
-            assert len(ref['ids']) == 1
-            note.add_backref(ref['ids'][0])
-            ref.resolved = 1
-        note.resolved = 1
-
-
-class CircularSubstitutionDefinitionError(Exception): pass
-
-
-class Substitutions(Transform):
-
-    """
-    Given the following ``document`` as input::
-
-        <document>
-            <paragraph>
-                The
-                <substitution_reference refname="biohazard">
-                    biohazard
-                 symbol is deservedly scary-looking.
-            <substitution_definition name="biohazard">
-                <image alt="biohazard" uri="biohazard.png">
-
-    The ``substitution_reference`` will simply be replaced by the
-    contents of the corresponding ``substitution_definition``.
-
-    The transformed result will be::
-
-        <document>
-            <paragraph>
-                The
-                <image alt="biohazard" uri="biohazard.png">
-                 symbol is deservedly scary-looking.
-            <substitution_definition name="biohazard">
-                <image alt="biohazard" uri="biohazard.png">
-    """
-
-    default_priority = 220
-    """The Substitutions transform has to be applied very early, before
-    `docutils.tranforms.frontmatter.DocTitle` and others."""
-
-    def apply(self):
-        defs = self.document.substitution_defs
-        normed = self.document.substitution_names
-        subreflist = self.document.traverse(nodes.substitution_reference)
-        nested = {}
-        for ref in subreflist:
-            refname = ref['refname']
-            key = None
-            if defs.has_key(refname):
-                key = refname
-            else:
-                normed_name = refname.lower()
-                if normed.has_key(normed_name):
-                    key = normed[normed_name]
-            if key is None:
-                msg = self.document.reporter.error(
-                      'Undefined substitution referenced: "%s".'
-                      % refname, base_node=ref)
-                msgid = self.document.set_id(msg)
-                prb = nodes.problematic(
-                      ref.rawsource, ref.rawsource, refid=msgid)
-                prbid = self.document.set_id(prb)
-                msg.add_backref(prbid)
-                ref.replace_self(prb)
-            else:
-                subdef = defs[key]
-                parent = ref.parent
-                index = parent.index(ref)
-                if  (subdef.attributes.has_key('ltrim')
-                     or subdef.attributes.has_key('trim')):
-                    if index > 0 and isinstance(parent[index - 1],
-                                                nodes.Text):
-                        parent.replace(parent[index - 1],
-                                       parent[index - 1].rstrip())
-                if  (subdef.attributes.has_key('rtrim')
-                     or subdef.attributes.has_key('trim')):
-                    if  (len(parent) > index + 1
-                         and isinstance(parent[index + 1], nodes.Text)):
-                        parent.replace(parent[index + 1],
-                                       parent[index + 1].lstrip())
-                subdef_copy = subdef.deepcopy()
-                try:
-                    # Take care of nested substitution references:
-                    for nested_ref in subdef_copy.traverse(
-                          nodes.substitution_reference):
-                        nested_name = normed[nested_ref['refname'].lower()]
-                        if nested_name in nested.setdefault(nested_name, []):
-                            raise CircularSubstitutionDefinitionError
-                        else:
-                            nested[nested_name].append(key)
-                            subreflist.append(nested_ref)
-                except CircularSubstitutionDefinitionError:
-                    parent = ref.parent
-                    if isinstance(parent, nodes.substitution_definition):
-                        msg = self.document.reporter.error(
-                            'Circular substitution definition detected:',
-                            nodes.literal_block(parent.rawsource,
-                                                parent.rawsource),
-                            line=parent.line, base_node=parent)
-                        parent.replace_self(msg)
-                    else:
-                        msg = self.document.reporter.error(
-                            'Circular substitution definition referenced: "%s".'
-                            % refname, base_node=ref)
-                        msgid = self.document.set_id(msg)
-                        prb = nodes.problematic(
-                            ref.rawsource, ref.rawsource, refid=msgid)
-                        prbid = self.document.set_id(prb)
-                        msg.add_backref(prbid)
-                        ref.replace_self(prb)
-                else:
-                    ref.replace_self(subdef_copy.children)
-
-
-class TargetNotes(Transform):
-
-    """
-    Creates a footnote for each external target in the text, and corresponding
-    footnote references after each reference.
-    """
-
-    default_priority = 540
-    """The TargetNotes transform has to be applied after `IndirectHyperlinks`
-    but before `Footnotes`."""
-
-
-    def __init__(self, document, startnode):
-        Transform.__init__(self, document, startnode=startnode)
-
-        self.classes = startnode.details.get('class', [])
-
-    def apply(self):
-        notes = {}
-        nodelist = []
-        for target in self.document.traverse(nodes.target):
-            # Only external targets.
-            if not target.hasattr('refuri'):
-                continue
-            names = target['names']
-            refs = []
-            for name in names:
-                refs.extend(self.document.refnames.get(name, []))
-            if not refs:
-                continue
-            footnote = self.make_target_footnote(target['refuri'], refs,
-                                                 notes)
-            if not notes.has_key(target['refuri']):
-                notes[target['refuri']] = footnote
-                nodelist.append(footnote)
-        # Take care of anonymous references.
-        for ref in self.document.traverse(nodes.reference):
-            if not ref.get('anonymous'):
-                continue
-            if ref.hasattr('refuri'):
-                footnote = self.make_target_footnote(ref['refuri'], [ref],
-                                                     notes)
-                if not notes.has_key(ref['refuri']):
-                    notes[ref['refuri']] = footnote
-                    nodelist.append(footnote)
-        self.startnode.replace_self(nodelist)
-
-    def make_target_footnote(self, refuri, refs, notes):
-        if notes.has_key(refuri):  # duplicate?
-            footnote = notes[refuri]
-            assert len(footnote['names']) == 1
-            footnote_name = footnote['names'][0]
-        else:                           # original
-            footnote = nodes.footnote()
-            footnote_id = self.document.set_id(footnote)
-            # Use uppercase letters and a colon; they can't be
-            # produced inside names by the parser.
-            footnote_name = 'TARGET_NOTE: ' + footnote_id
-            footnote['auto'] = 1
-            footnote['names'] = [footnote_name]
-            footnote_paragraph = nodes.paragraph()
-            footnote_paragraph += nodes.reference('', refuri, refuri=refuri)
-            footnote += footnote_paragraph
-            self.document.note_autofootnote(footnote)
-            self.document.note_explicit_target(footnote, footnote)
-        for ref in refs:
-            if isinstance(ref, nodes.target):
-                continue
-            refnode = nodes.footnote_reference(
-                refname=footnote_name, auto=1)
-            refnode['classes'] += self.classes
-            self.document.note_autofootnote_ref(refnode)
-            self.document.note_footnote_ref(refnode)
-            index = ref.parent.index(ref) + 1
-            reflist = [refnode]
-            if not utils.get_trim_footnote_ref_space(self.document.settings):
-                if self.classes:
-                    reflist.insert(0, nodes.inline(text=' ', Classes=self.classes))
-                else:
-                    reflist.insert(0, nodes.Text(' '))
-            ref.parent.insert(index, reflist)
-        return footnote
-
-
-class DanglingReferences(Transform):
-
-    """
-    Check for dangling references (incl. footnote & citation) and for
-    unreferenced targets.
-    """
-
-    default_priority = 850
-
-    def apply(self):
-        visitor = DanglingReferencesVisitor(
-            self.document,
-            self.document.transformer.unknown_reference_resolvers)
-        self.document.walk(visitor)
-        # *After* resolving all references, check for unreferenced
-        # targets:
-        for target in self.document.traverse(nodes.target):
-            if not target.referenced:
-                if target.get('anonymous'):
-                    # If we have unreferenced anonymous targets, there
-                    # is already an error message about anonymous
-                    # hyperlink mismatch; no need to generate another
-                    # message.
-                    continue
-                if target['names']:
-                    naming = target['names'][0]
-                elif target['ids']:
-                    naming = target['ids'][0]
-                else:
-                    # Hack: Propagated targets always have their refid
-                    # attribute set.
-                    naming = target['refid']
-                self.document.reporter.info(
-                    'Hyperlink target "%s" is not referenced.'
-                    % naming, base_node=target)
-
-
-class DanglingReferencesVisitor(nodes.SparseNodeVisitor):
-    
-    def __init__(self, document, unknown_reference_resolvers):
-        nodes.SparseNodeVisitor.__init__(self, document)
-        self.document = document
-        self.unknown_reference_resolvers = unknown_reference_resolvers
-
-    def unknown_visit(self, node):
-        pass
-
-    def visit_reference(self, node):
-        if node.resolved or not node.hasattr('refname'):
-            return
-        refname = node['refname']
-        id = self.document.nameids.get(refname)
-        if id is None:
-            for resolver_function in self.unknown_reference_resolvers:
-                if resolver_function(node):
-                    break
-            else:
-                if self.document.nameids.has_key(refname):
-                    msg = self.document.reporter.error(
-                        'Duplicate target name, cannot be used as a unique '
-                        'reference: "%s".' % (node['refname']), base_node=node)
-                else:
-                    msg = self.document.reporter.error(
-                        'Unknown target name: "%s".' % (node['refname']),
-                        base_node=node)
-                msgid = self.document.set_id(msg)
-                prb = nodes.problematic(
-                      node.rawsource, node.rawsource, refid=msgid)
-                prbid = self.document.set_id(prb)
-                msg.add_backref(prbid)
-                node.replace_self(prb)
-        else:
-            del node['refname']
-            node['refid'] = id
-            self.document.ids[id].note_referenced_by(id=id)
-            node.resolved = 1
-
-    visit_footnote_reference = visit_citation_reference = visit_reference
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/universal.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,203 +0,0 @@
-# $Id: universal.py 4913 2007-02-12 04:05:20Z goodger $
-# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer
-# Copyright: This module has been placed in the public domain.
-
-"""
-Transforms needed by most or all documents:
-
-- `Decorations`: Generate a document's header & footer.
-- `Messages`: Placement of system messages stored in
-  `nodes.document.transform_messages`.
-- `TestMessages`: Like `Messages`, used on test runs.
-- `FinalReferences`: Resolve remaining references.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import re
-import sys
-import time
-from docutils import nodes, utils
-from docutils.transforms import TransformError, Transform
-
-
-class Decorations(Transform):
-
-    """
-    Populate a document's decoration element (header, footer).
-    """
-
-    default_priority = 820
-
-    def apply(self):
-        header_nodes = self.generate_header()
-        if header_nodes:
-            decoration = self.document.get_decoration()
-            header = decoration.get_header()
-            header.extend(header_nodes)
-        footer_nodes = self.generate_footer()
-        if footer_nodes:
-            decoration = self.document.get_decoration()
-            footer = decoration.get_footer()
-            footer.extend(footer_nodes)
-
-    def generate_header(self):
-        return None
-
-    def generate_footer(self):
-        # @@@ Text is hard-coded for now.
-        # Should be made dynamic (language-dependent).
-        settings = self.document.settings
-        if settings.generator or settings.datestamp or settings.source_link \
-               or settings.source_url:
-            text = []
-            if settings.source_link and settings._source \
-                   or settings.source_url:
-                if settings.source_url:
-                    source = settings.source_url
-                else:
-                    source = utils.relative_path(settings._destination,
-                                                 settings._source)
-                text.extend([
-                    nodes.reference('', 'View document source',
-                                    refuri=source),
-                    nodes.Text('.\n')])
-            if settings.datestamp:
-                datestamp = time.strftime(settings.datestamp, time.gmtime())
-                text.append(nodes.Text('Generated on: ' + datestamp + '.\n'))
-            if settings.generator:
-                text.extend([
-                    nodes.Text('Generated by '),
-                    nodes.reference('', 'Docutils', refuri=
-                                    'http://docutils.sourceforge.net/'),
-                    nodes.Text(' from '),
-                    nodes.reference('', 'reStructuredText', refuri='http://'
-                                    'docutils.sourceforge.net/rst.html'),
-                    nodes.Text(' source.\n')])
-            return [nodes.paragraph('', '', *text)]
-        else:
-            return None
-
-
-class ExposeInternals(Transform):
-
-    """
-    Expose internal attributes if ``expose_internals`` setting is set.
-    """
-
-    default_priority = 840
-
-    def not_Text(self, node):
-        return not isinstance(node, nodes.Text)
-
-    def apply(self):
-        if self.document.settings.expose_internals:
-            for node in self.document.traverse(self.not_Text):
-                for att in self.document.settings.expose_internals:
-                    value = getattr(node, att, None)
-                    if value is not None:
-                        node['internal:' + att] = value
-
-
-class Messages(Transform):
-
-    """
-    Place any system messages generated after parsing into a dedicated section
-    of the document.
-    """
-
-    default_priority = 860
-
-    def apply(self):
-        unfiltered = self.document.transform_messages
-        threshold = self.document.reporter.report_level
-        messages = []
-        for msg in unfiltered:
-            if msg['level'] >= threshold and not msg.parent:
-                messages.append(msg)
-        if messages:
-            section = nodes.section(classes=['system-messages'])
-            # @@@ get this from the language module?
-            section += nodes.title('', 'Docutils System Messages')
-            section += messages
-            self.document.transform_messages[:] = []
-            self.document += section
-
-
-class FilterMessages(Transform):
-
-    """
-    Remove system messages below verbosity threshold.
-    """
-
-    default_priority = 870
-
-    def apply(self):
-        for node in self.document.traverse(nodes.system_message):
-            if node['level'] < self.document.reporter.report_level:
-                node.parent.remove(node)
-
-
-class TestMessages(Transform):
-
-    """
-    Append all post-parse system messages to the end of the document.
-
-    Used for testing purposes.
-    """
-
-    default_priority = 880
-
-    def apply(self):
-        for msg in self.document.transform_messages:
-            if not msg.parent:
-                self.document += msg
-
-
-class StripComments(Transform):
-
-    """
-    Remove comment elements from the document tree (only if the
-    ``strip_comments`` setting is enabled).
-    """
-
-    default_priority = 740
-
-    def apply(self):
-        if self.document.settings.strip_comments:
-            for node in self.document.traverse(nodes.comment):
-                node.parent.remove(node)
-
-
-class StripClassesAndElements(Transform):
-
-    """
-    Remove from the document tree all elements with classes in
-    `self.document.settings.strip_elements_with_classes` and all "classes"
-    attribute values in `self.document.settings.strip_classes`.
-    """
-
-    default_priority = 750
-
-    def apply(self):
-        if not (self.document.settings.strip_elements_with_classes
-                or self.document.settings.strip_classes):
-            return
-        # prepare dicts for lookup (not sets, for Python 2.2 compatibility):
-        self.strip_elements = dict(
-            [(key, None)
-             for key in (self.document.settings.strip_elements_with_classes
-                         or [])])
-        self.strip_classes = dict(
-            [(key, None) for key in (self.document.settings.strip_classes
-                                     or [])])
-        for node in self.document.traverse(self.check_classes):
-            node.parent.remove(node)
-
-    def check_classes(self, node):
-        if isinstance(node, nodes.Element):
-            for class_value in node['classes'][:]:
-                if class_value in self.strip_classes:
-                    node['classes'].remove(class_value)
-                if class_value in self.strip_elements:
-                    return 1
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/transforms/writer_aux.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-# $Id: writer_aux.py 5174 2007-05-31 00:01:52Z wiemann $
-# Author: Lea Wiemann <LeWiemann@gmail.com>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Auxiliary transforms mainly to be used by Writer components.
-
-This module is called "writer_aux" because otherwise there would be
-conflicting imports like this one::
-
-    from docutils import writers
-    from docutils.transforms import writers
-"""
-
-__docformat__ = 'reStructuredText'
-
-from docutils import nodes, utils, languages
-from docutils.transforms import Transform
-
-
-class Compound(Transform):
-
-    """
-    Flatten all compound paragraphs.  For example, transform ::
-
-        <compound>
-            <paragraph>
-            <literal_block>
-            <paragraph>
-
-    into ::
-
-        <paragraph>
-        <literal_block classes="continued">
-        <paragraph classes="continued">
-    """
-
-    default_priority = 910
-
-    def apply(self):
-        for compound in self.document.traverse(nodes.compound):
-            first_child = 1
-            for child in compound:
-                if first_child:
-                    if not isinstance(child, nodes.Invisible):
-                        first_child = 0
-                else:
-                    child['classes'].append('continued')
-            # Substitute children for compound.
-            compound.replace_self(compound[:])
-
-
-class Admonitions(Transform):
-
-    """
-    Transform specific admonitions, like this:
-
-        <note>
-            <paragraph>
-                 Note contents ...
-
-    into generic admonitions, like this::
-
-        <admonition classes="note">
-            <title>
-                Note
-            <paragraph>
-                Note contents ...
-
-    The admonition title is localized.
-    """
-
-    default_priority = 920
-
-    def apply(self):
-        lcode = self.document.settings.language_code
-        language = languages.get_language(lcode)
-        for node in self.document.traverse(nodes.Admonition):
-            node_name = node.__class__.__name__
-            # Set class, so that we know what node this admonition came from.
-            node['classes'].append(node_name)
-            if not isinstance(node, nodes.admonition):
-                # Specific admonition.  Transform into a generic admonition.
-                admonition = nodes.admonition(node.rawsource, *node.children,
-                                              **node.attributes)
-                title = nodes.title('', language.labels[node_name])
-                admonition.insert(0, title)
-                node.replace_self(admonition)
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/urischemes.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,136 +0,0 @@
-# $Id: urischemes.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-`schemes` is a dictionary with lowercase URI addressing schemes as
-keys and descriptions as values. It was compiled from the index at
-http://www.iana.org/assignments/uri-schemes (revised 2005-11-28)
-and an older list at http://www.w3.org/Addressing/schemes.html.
-"""
-
-# Many values are blank and should be filled in with useful descriptions.
-
-schemes = {
-      'about': 'provides information on Navigator',
-      'acap': 'Application Configuration Access Protocol; RFC 2244',
-      'addbook': "To add vCard entries to Communicator's Address Book",
-      'afp': 'Apple Filing Protocol',
-      'afs': 'Andrew File System global file names',
-      'aim': 'AOL Instant Messenger',
-      'callto': 'for NetMeeting links',
-      'castanet': 'Castanet Tuner URLs for Netcaster',
-      'chttp': 'cached HTTP supported by RealPlayer',
-      'cid': 'content identifier; RFC 2392',
-      'crid': 'TV-Anytime Content Reference Identifier; RFC 4078',
-      'data': ('allows inclusion of small data items as "immediate" data; '
-               'RFC 2397'),
-      'dav': 'Distributed Authoring and Versioning Protocol; RFC 2518',
-      'dict': 'dictionary service protocol; RFC 2229',
-      'dns': 'Domain Name System resources',
-      'eid': ('External ID; non-URL data; general escape mechanism to allow '
-              'access to information for applications that are too '
-              'specialized to justify their own schemes'),
-      'fax': ('a connection to a terminal that can handle telefaxes '
-              '(facsimiles); RFC 2806'),
-      'feed' : 'NetNewsWire feed',
-      'file': 'Host-specific file names; RFC 1738',
-      'finger': '',
-      'freenet': '',
-      'ftp': 'File Transfer Protocol; RFC 1738',
-      'go': 'go; RFC 3368',
-      'gopher': 'The Gopher Protocol',
-      'gsm-sms': ('Global System for Mobile Communications Short Message '
-                  'Service'),
-      'h323': ('video (audiovisual) communication on local area networks; '
-               'RFC 3508'),
-      'h324': ('video and audio communications over low bitrate connections '
-               'such as POTS modem connections'),
-      'hdl': 'CNRI handle system',
-      'hnews': 'an HTTP-tunneling variant of the NNTP news protocol',
-      'http': 'Hypertext Transfer Protocol; RFC 2616',
-      'https': 'HTTP over SSL; RFC 2818',
-      'hydra': 'SubEthaEdit URI.  See http://www.codingmonkeys.de/subethaedit.',
-      'iioploc': 'Internet Inter-ORB Protocol Location?',
-      'ilu': 'Inter-Language Unification',
-      'im': 'Instant Messaging; RFC 3860',
-      'imap': 'Internet Message Access Protocol; RFC 2192',
-      'info': 'Information Assets with Identifiers in Public Namespaces',
-      'ior': 'CORBA interoperable object reference',
-      'ipp': 'Internet Printing Protocol; RFC 3510',
-      'irc': 'Internet Relay Chat',
-      'iris.beep': 'iris.beep; RFC 3983',
-      'iseek' : 'See www.ambrosiasw.com;  a little util for OS X.',
-      'jar': 'Java archive',
-      'javascript': ('JavaScript code; evaluates the expression after the '
-                     'colon'),
-      'jdbc': 'JDBC connection URI.',
-      'ldap': 'Lightweight Directory Access Protocol',
-      'lifn': '',
-      'livescript': '',
-      'lrq': '',
-      'mailbox': 'Mail folder access',
-      'mailserver': 'Access to data available from mail servers',
-      'mailto': 'Electronic mail address; RFC 2368',
-      'md5': '',
-      'mid': 'message identifier; RFC 2392',
-      'mocha': '',
-      'modem': ('a connection to a terminal that can handle incoming data '
-                'calls; RFC 2806'),
-      'mtqp': 'Message Tracking Query Protocol; RFC 3887',
-      'mupdate': 'Mailbox Update (MUPDATE) Protocol; RFC 3656',
-      'news': 'USENET news; RFC 1738',
-      'nfs': 'Network File System protocol; RFC 2224',
-      'nntp': 'USENET news using NNTP access; RFC 1738',
-      'opaquelocktoken': 'RFC 2518',
-      'phone': '',
-      'pop': 'Post Office Protocol; RFC 2384',
-      'pop3': 'Post Office Protocol v3',
-      'pres': 'Presence; RFC 3859',
-      'printer': '',
-      'prospero': 'Prospero Directory Service; RFC 4157',
-      'rdar' : ('URLs found in Darwin source '
-                '(http://www.opensource.apple.com/darwinsource/).'),
-      'res': '',
-      'rtsp': 'real time streaming protocol; RFC 2326',
-      'rvp': '',
-      'rwhois': '',
-      'rx': 'Remote Execution',
-      'sdp': '',
-      'service': 'service location; RFC 2609',
-      'shttp': 'secure hypertext transfer protocol',
-      'sip': 'Session Initiation Protocol; RFC 3261',
-      'sips': 'secure session intitiaion protocol; RFC 3261',
-      'smb': 'SAMBA filesystems.',
-      'snews': 'For NNTP postings via SSL',
-      'snmp': 'Simple Network Management Protocol; RFC 4088',
-      'soap.beep': 'RFC 3288',
-      'soap.beeps': 'RFC 3288',
-      'ssh': 'Reference to interactive sessions via ssh.',
-      't120': 'real time data conferencing (audiographics)',
-      'tag': 'RFC 4151',
-      'tcp': '',
-      'tel': ('a connection to a terminal that handles normal voice '
-              'telephone calls, a voice mailbox or another voice messaging '
-              'system or a service that can be operated using DTMF tones; '
-              'RFC 2806.'),
-      'telephone': 'telephone',
-      'telnet': 'Reference to interactive sessions; RFC 4248',
-      'tftp': 'Trivial File Transfer Protocol; RFC 3617',
-      'tip': 'Transaction Internet Protocol; RFC 2371',
-      'tn3270': 'Interactive 3270 emulation sessions',
-      'tv': '',
-      'urn': 'Uniform Resource Name; RFC 2141',
-      'uuid': '',
-      'vemmi': 'versatile multimedia interface; RFC 2122',
-      'videotex': '',
-      'view-source': 'displays HTML code that was generated with JavaScript',
-      'wais': 'Wide Area Information Servers; RFC 4156',
-      'whodp': '',
-      'whois++': 'Distributed directory service.',
-      'x-man-page': ('Opens man page in Terminal.app on OS X '
-                     '(see macosxhints.com)'),
-      'xmlrpc.beep': 'RFC 3529',
-      'xmlrpc.beeps': 'RFC 3529',
-      'z39.50r': 'Z39.50 Retrieval; RFC 2056',
-      'z39.50s': 'Z39.50 Session; RFC 2056',}
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/utils.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,593 +0,0 @@
-# $Id: utils.py 5040 2007-04-03 17:41:59Z goodger $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Miscellaneous utilities for the documentation utilities.
-"""
-
-__docformat__ = 'reStructuredText'
-
-import sys
-import os
-import os.path
-import types
-import warnings
-import unicodedata
-from types import StringType, UnicodeType
-from docutils import ApplicationError, DataError
-from docutils import nodes
-
-
-class SystemMessage(ApplicationError):
-
-    def __init__(self, system_message, level):
-        Exception.__init__(self, system_message.astext())
-        self.level = level
-
-
-class SystemMessagePropagation(ApplicationError): pass
-
-
-class Reporter:
-
-    """
-    Info/warning/error reporter and ``system_message`` element generator.
-
-    Five levels of system messages are defined, along with corresponding
-    methods: `debug()`, `info()`, `warning()`, `error()`, and `severe()`.
-
-    There is typically one Reporter object per process.  A Reporter object is
-    instantiated with thresholds for reporting (generating warnings) and
-    halting processing (raising exceptions), a switch to turn debug output on
-    or off, and an I/O stream for warnings.  These are stored as instance
-    attributes.
-
-    When a system message is generated, its level is compared to the stored
-    thresholds, and a warning or error is generated as appropriate.  Debug
-    messages are produced iff the stored debug switch is on, independently of
-    other thresholds.  Message output is sent to the stored warning stream if
-    not set to ''.
-
-    The Reporter class also employs a modified form of the "Observer" pattern
-    [GoF95]_ to track system messages generated.  The `attach_observer` method
-    should be called before parsing, with a bound method or function which
-    accepts system messages.  The observer can be removed with
-    `detach_observer`, and another added in its place.
-
-    .. [GoF95] Gamma, Helm, Johnson, Vlissides. *Design Patterns: Elements of
-       Reusable Object-Oriented Software*. Addison-Wesley, Reading, MA, USA,
-       1995.
-    """
-
-    levels = 'DEBUG INFO WARNING ERROR SEVERE'.split()
-    """List of names for system message levels, indexed by level."""
-
-    # system message level constants:
-    (DEBUG_LEVEL,
-     INFO_LEVEL,
-     WARNING_LEVEL,
-     ERROR_LEVEL,
-     SEVERE_LEVEL) = range(5)
-
-    def __init__(self, source, report_level, halt_level, stream=None,
-                 debug=0, encoding='ascii', error_handler='replace'):
-        """
-        :Parameters:
-            - `source`: The path to or description of the source data.
-            - `report_level`: The level at or above which warning output will
-              be sent to `stream`.
-            - `halt_level`: The level at or above which `SystemMessage`
-              exceptions will be raised, halting execution.
-            - `debug`: Show debug (level=0) system messages?
-            - `stream`: Where warning output is sent.  Can be file-like (has a
-              ``.write`` method), a string (file name, opened for writing),
-              '' (empty string, for discarding all stream messages) or
-              `None` (implies `sys.stderr`; default).
-            - `encoding`: The encoding for stderr output.
-            - `error_handler`: The error handler for stderr output encoding.
-        """
-
-        self.source = source
-        """The path to or description of the source data."""
-
-        self.encoding = encoding
-        """The character encoding for the stderr output."""
-
-        self.error_handler = error_handler
-        """The character encoding error handler."""
-
-        self.debug_flag = debug
-        """Show debug (level=0) system messages?"""
-
-        self.report_level = report_level
-        """The level at or above which warning output will be sent
-        to `self.stream`."""
-
-        self.halt_level = halt_level
-        """The level at or above which `SystemMessage` exceptions
-        will be raised, halting execution."""
-
-        if stream is None:
-            stream = sys.stderr
-        elif type(stream) in (StringType, UnicodeType):
-            # Leave stream untouched if it's ''.
-            if stream != '':
-                if type(stream) == StringType:
-                    stream = open(stream, 'w')
-                elif type(stream) == UnicodeType:
-                    stream = open(stream.encode(), 'w')
-
-        self.stream = stream
-        """Where warning output is sent."""
-
-        self.observers = []
-        """List of bound methods or functions to call with each system_message
-        created."""
-
-        self.max_level = -1
-        """The highest level system message generated so far."""
-
-    def set_conditions(self, category, report_level, halt_level,
-                       stream=None, debug=0):
-        warnings.warn('docutils.utils.Reporter.set_conditions deprecated; '
-                      'set attributes via configuration settings or directly',
-                      DeprecationWarning, stacklevel=2)
-        self.report_level = report_level
-        self.halt_level = halt_level
-        if stream is None:
-            stream = sys.stderr
-        self.stream = stream
-        self.debug_flag = debug
-
-    def attach_observer(self, observer):
-        """
-        The `observer` parameter is a function or bound method which takes one
-        argument, a `nodes.system_message` instance.
-        """
-        self.observers.append(observer)
-
-    def detach_observer(self, observer):
-        self.observers.remove(observer)
-
-    def notify_observers(self, message):
-        for observer in self.observers:
-            observer(message)
-
-    def system_message(self, level, message, *children, **kwargs):
-        """
-        Return a system_message object.
-
-        Raise an exception or generate a warning if appropriate.
-        """
-        attributes = kwargs.copy()
-        if kwargs.has_key('base_node'):
-            source, line = get_source_line(kwargs['base_node'])
-            del attributes['base_node']
-            if source is not None:
-                attributes.setdefault('source', source)
-            if line is not None:
-                attributes.setdefault('line', line)
-        attributes.setdefault('source', self.source)
-        msg = nodes.system_message(message, level=level,
-                                   type=self.levels[level],
-                                   *children, **attributes)
-        if self.stream and (level >= self.report_level
-                            or self.debug_flag and level == self.DEBUG_LEVEL):
-            msgtext = msg.astext().encode(self.encoding, self.error_handler)
-            print >>self.stream, msgtext
-        if level >= self.halt_level:
-            raise SystemMessage(msg, level)
-        if level > self.DEBUG_LEVEL or self.debug_flag:
-            self.notify_observers(msg)
-        self.max_level = max(level, self.max_level)
-        return msg
-
-    def debug(self, *args, **kwargs):
-        """
-        Level-0, "DEBUG": an internal reporting issue. Typically, there is no
-        effect on the processing. Level-0 system messages are handled
-        separately from the others.
-        """
-        if self.debug_flag:
-            return self.system_message(self.DEBUG_LEVEL, *args, **kwargs)
-
-    def info(self, *args, **kwargs):
-        """
-        Level-1, "INFO": a minor issue that can be ignored. Typically there is
-        no effect on processing, and level-1 system messages are not reported.
-        """
-        return self.system_message(self.INFO_LEVEL, *args, **kwargs)
-
-    def warning(self, *args, **kwargs):
-        """
-        Level-2, "WARNING": an issue that should be addressed. If ignored,
-        there may be unpredictable problems with the output.
-        """
-        return self.system_message(self.WARNING_LEVEL, *args, **kwargs)
-
-    def error(self, *args, **kwargs):
-        """
-        Level-3, "ERROR": an error that should be addressed. If ignored, the
-        output will contain errors.
-        """
-        return self.system_message(self.ERROR_LEVEL, *args, **kwargs)
-
-    def severe(self, *args, **kwargs):
-        """
-        Level-4, "SEVERE": a severe error that must be addressed. If ignored,
-        the output will contain severe errors. Typically level-4 system
-        messages are turned into exceptions which halt processing.
-        """
-        return self.system_message(self.SEVERE_LEVEL, *args, **kwargs)
-
-
-class ExtensionOptionError(DataError): pass
-class BadOptionError(ExtensionOptionError): pass
-class BadOptionDataError(ExtensionOptionError): pass
-class DuplicateOptionError(ExtensionOptionError): pass
-
-
-def extract_extension_options(field_list, options_spec):
-    """
-    Return a dictionary mapping extension option names to converted values.
-
-    :Parameters:
-        - `field_list`: A flat field list without field arguments, where each
-          field body consists of a single paragraph only.
-        - `options_spec`: Dictionary mapping known option names to a
-          conversion function such as `int` or `float`.
-
-    :Exceptions:
-        - `KeyError` for unknown option names.
-        - `ValueError` for invalid option values (raised by the conversion
-           function).
-        - `TypeError` for invalid option value types (raised by conversion
-           function).
-        - `DuplicateOptionError` for duplicate options.
-        - `BadOptionError` for invalid fields.
-        - `BadOptionDataError` for invalid option data (missing name,
-          missing data, bad quotes, etc.).
-    """
-    option_list = extract_options(field_list)
-    option_dict = assemble_option_dict(option_list, options_spec)
-    return option_dict
-
-def extract_options(field_list):
-    """
-    Return a list of option (name, value) pairs from field names & bodies.
-
-    :Parameter:
-        `field_list`: A flat field list, where each field name is a single
-        word and each field body consists of a single paragraph only.
-
-    :Exceptions:
-        - `BadOptionError` for invalid fields.
-        - `BadOptionDataError` for invalid option data (missing name,
-          missing data, bad quotes, etc.).
-    """
-    option_list = []
-    for field in field_list:
-        if len(field[0].astext().split()) != 1:
-            raise BadOptionError(
-                'extension option field name may not contain multiple words')
-        name = str(field[0].astext().lower())
-        body = field[1]
-        if len(body) == 0:
-            data = None
-        elif len(body) > 1 or not isinstance(body[0], nodes.paragraph) \
-              or len(body[0]) != 1 or not isinstance(body[0][0], nodes.Text):
-            raise BadOptionDataError(
-                  'extension option field body may contain\n'
-                  'a single paragraph only (option "%s")' % name)
-        else:
-            data = body[0][0].astext()
-        option_list.append((name, data))
-    return option_list
-
-def assemble_option_dict(option_list, options_spec):
-    """
-    Return a mapping of option names to values.
-
-    :Parameters:
-        - `option_list`: A list of (name, value) pairs (the output of
-          `extract_options()`).
-        - `options_spec`: Dictionary mapping known option names to a
-          conversion function such as `int` or `float`.
-
-    :Exceptions:
-        - `KeyError` for unknown option names.
-        - `DuplicateOptionError` for duplicate options.
-        - `ValueError` for invalid option values (raised by conversion
-           function).
-        - `TypeError` for invalid option value types (raised by conversion
-           function).
-    """
-    options = {}
-    for name, value in option_list:
-        convertor = options_spec[name]  # raises KeyError if unknown
-        if convertor is None:
-            raise KeyError(name)        # or if explicitly disabled
-        if options.has_key(name):
-            raise DuplicateOptionError('duplicate option "%s"' % name)
-        try:
-            options[name] = convertor(value)
-        except (ValueError, TypeError), detail:
-            raise detail.__class__('(option: "%s"; value: %r)\n%s'
-                                   % (name, value, ' '.join(detail.args)))
-    return options
-
-
-class NameValueError(DataError): pass
-
-
-def extract_name_value(line):
-    """
-    Return a list of (name, value) from a line of the form "name=value ...".
-
-    :Exception:
-        `NameValueError` for invalid input (missing name, missing data, bad
-        quotes, etc.).
-    """
-    attlist = []
-    while line:
-        equals = line.find('=')
-        if equals == -1:
-            raise NameValueError('missing "="')
-        attname = line[:equals].strip()
-        if equals == 0 or not attname:
-            raise NameValueError(
-                  'missing attribute name before "="')
-        line = line[equals+1:].lstrip()
-        if not line:
-            raise NameValueError(
-                  'missing value after "%s="' % attname)
-        if line[0] in '\'"':
-            endquote = line.find(line[0], 1)
-            if endquote == -1:
-                raise NameValueError(
-                      'attribute "%s" missing end quote (%s)'
-                      % (attname, line[0]))
-            if len(line) > endquote + 1 and line[endquote + 1].strip():
-                raise NameValueError(
-                      'attribute "%s" end quote (%s) not followed by '
-                      'whitespace' % (attname, line[0]))
-            data = line[1:endquote]
-            line = line[endquote+1:].lstrip()
-        else:
-            space = line.find(' ')
-            if space == -1:
-                data = line
-                line = ''
-            else:
-                data = line[:space]
-                line = line[space+1:].lstrip()
-        attlist.append((attname.lower(), data))
-    return attlist
-
-def new_reporter(source_path, settings):
-    """
-    Return a new Reporter object.
-
-    :Parameters:
-        `source` : string
-            The path to or description of the source text of the document.
-        `settings` : optparse.Values object
-            Runtime settings.
-    """
-    reporter = Reporter(
-        source_path, settings.report_level, settings.halt_level,
-        stream=settings.warning_stream, debug=settings.debug,
-        encoding=settings.error_encoding,
-        error_handler=settings.error_encoding_error_handler)
-    return reporter
-
-def new_document(source_path, settings=None):
-    """
-    Return a new empty document object.
-
-    :Parameters:
-        `source_path` : string
-            The path to or description of the source text of the document.
-        `settings` : optparse.Values object
-            Runtime settings.  If none provided, a default set will be used.
-    """
-    from docutils import frontend
-    if settings is None:
-        settings = frontend.OptionParser().get_default_values()
-    reporter = new_reporter(source_path, settings)
-    document = nodes.document(settings, reporter, source=source_path)
-    document.note_source(source_path, -1)
-    return document
-
-def clean_rcs_keywords(paragraph, keyword_substitutions):
-    if len(paragraph) == 1 and isinstance(paragraph[0], nodes.Text):
-        textnode = paragraph[0]
-        for pattern, substitution in keyword_substitutions:
-            match = pattern.search(textnode.data)
-            if match:
-                textnode.data = pattern.sub(substitution, textnode.data)
-                return
-
-def relative_path(source, target):
-    """
-    Build and return a path to `target`, relative to `source` (both files).
-
-    If there is no common prefix, return the absolute path to `target`.
-    """
-    source_parts = os.path.abspath(source or 'dummy_file').split(os.sep)
-    target_parts = os.path.abspath(target).split(os.sep)
-    # Check first 2 parts because '/dir'.split('/') == ['', 'dir']:
-    if source_parts[:2] != target_parts[:2]:
-        # Nothing in common between paths.
-        # Return absolute path, using '/' for URLs:
-        return '/'.join(target_parts)
-    source_parts.reverse()
-    target_parts.reverse()
-    while (source_parts and target_parts
-           and source_parts[-1] == target_parts[-1]):
-        # Remove path components in common:
-        source_parts.pop()
-        target_parts.pop()
-    target_parts.reverse()
-    parts = ['..'] * (len(source_parts) - 1) + target_parts
-    return '/'.join(parts)
-
-def get_stylesheet_reference(settings, relative_to=None):
-    """
-    Retrieve a stylesheet reference from the settings object.
-    """
-    if settings.stylesheet_path:
-        assert not settings.stylesheet, \
-               'stylesheet and stylesheet_path are mutually exclusive.'
-        if relative_to == None:
-            relative_to = settings._destination
-        return relative_path(relative_to, settings.stylesheet_path)
-    else:
-        return settings.stylesheet
-
-def get_trim_footnote_ref_space(settings):
-    """
-    Return whether or not to trim footnote space.
-
-    If trim_footnote_reference_space is not None, return it.
-
-    If trim_footnote_reference_space is None, return False unless the
-    footnote reference style is 'superscript'.
-    """
-    if settings.trim_footnote_reference_space is None:
-        return hasattr(settings, 'footnote_references') and \
-               settings.footnote_references == 'superscript'
-    else:
-        return settings.trim_footnote_reference_space
-
-def get_source_line(node):
-    """
-    Return the "source" and "line" attributes from the `node` given or from
-    its closest ancestor.
-    """
-    while node:
-        if node.source or node.line:
-            return node.source, node.line
-        node = node.parent
-    return None, None
-
-def escape2null(text):
-    """Return a string with escape-backslashes converted to nulls."""
-    parts = []
-    start = 0
-    while 1:
-        found = text.find('\\', start)
-        if found == -1:
-            parts.append(text[start:])
-            return ''.join(parts)
-        parts.append(text[start:found])
-        parts.append('\x00' + text[found+1:found+2])
-        start = found + 2               # skip character after escape
-
-def unescape(text, restore_backslashes=0):
-    """
-    Return a string with nulls removed or restored to backslashes.
-    Backslash-escaped spaces are also removed.
-    """
-    if restore_backslashes:
-        return text.replace('\x00', '\\')
-    else:
-        for sep in ['\x00 ', '\x00\n', '\x00']:
-            text = ''.join(text.split(sep))
-        return text
-
-east_asian_widths = {'W': 2,   # Wide
-                     'F': 2,   # Full-width (wide)
-                     'Na': 1,  # Narrow
-                     'H': 1,   # Half-width (narrow)
-                     'N': 1,   # Neutral (not East Asian, treated as narrow)
-                     'A': 1}   # Ambiguous (s/b wide in East Asian context,
-                               # narrow otherwise, but that doesn't work)
-"""Mapping of result codes from `unicodedata.east_asian_width()` to character
-column widths."""
-
-def east_asian_column_width(text):
-    if isinstance(text, types.UnicodeType):
-        total = 0
-        for c in text:
-            total += east_asian_widths[unicodedata.east_asian_width(c)]
-        return total
-    else:
-        return len(text)
-
-if hasattr(unicodedata, 'east_asian_width'):
-    column_width = east_asian_column_width
-else:
-    column_width = len
-
-def uniq(L):
-     r = []
-     for item in L:
-         if not item in r:
-             r.append(item)
-     return r
-
-
-class DependencyList:
-
-    """
-    List of dependencies, with file recording support.
-
-    Note that the output file is not automatically closed.  You have
-    to explicitly call the close() method.
-    """
-
-    def __init__(self, output_file=None, dependencies=[]):
-        """
-        Initialize the dependency list, automatically setting the
-        output file to `output_file` (see `set_output()`) and adding
-        all supplied dependencies.
-        """
-        self.set_output(output_file)
-        for i in dependencies:
-            self.add(i)
-
-    def set_output(self, output_file):
-        """
-        Set the output file and clear the list of already added
-        dependencies.
-
-        `output_file` must be a string.  The specified file is
-        immediately overwritten.
-
-        If output_file is '-', the output will be written to stdout.
-        If it is None, no file output is done when calling add().
-        """
-        self.list = []
-        if output_file == '-':
-            self.file = sys.stdout
-        elif output_file:
-            self.file = open(output_file, 'w')
-        else:
-            self.file = None
-
-    def add(self, filename):
-        """
-        If the dependency `filename` has not already been added,
-        append it to self.list and print it to self.file if self.file
-        is not None.
-        """
-        if not filename in self.list:
-            self.list.append(filename)
-            if self.file is not None:
-                print >>self.file, filename
-
-    def close(self):
-        """
-        Close the output file.
-        """
-        self.file.close()
-        self.file = None
-
-    def __repr__(self):
-        if self.file:
-            output_file = self.file.name
-        else:
-            output_file = None
-        return '%s(%r, %s)' % (self.__class__.__name__, output_file, self.list)
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,133 +0,0 @@
-# $Id: __init__.py 4913 2007-02-12 04:05:20Z goodger $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-This package contains Docutils Writer modules.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import os.path
-import docutils
-from docutils import languages, Component
-from docutils.transforms import universal
-
-
-class Writer(Component):
-
-    """
-    Abstract base class for docutils Writers.
-
-    Each writer module or package must export a subclass also called 'Writer'.
-    Each writer must support all standard node types listed in
-    `docutils.nodes.node_class_names`.
-
-    The `write()` method is the main entry point.
-    """
-
-    component_type = 'writer'
-    config_section = 'writers'
-
-    def get_transforms(self):
-        return Component.get_transforms(self) + [
-            universal.Messages,
-            universal.FilterMessages,
-            universal.StripClassesAndElements,]
-
-    document = None
-    """The document to write (Docutils doctree); set by `write`."""
-
-    output = None
-    """Final translated form of `document` (Unicode string for text, binary
-    string for other forms); set by `translate`."""
-
-    language = None
-    """Language module for the document; set by `write`."""
-
-    destination = None
-    """`docutils.io` Output object; where to write the document.
-    Set by `write`."""
-
-    def __init__(self):
-
-        # Currently only used by HTML writer for output fragments:
-        self.parts = {}
-        """Mapping of document part names to fragments of `self.output`.
-        Values are Unicode strings; encoding is up to the client.  The 'whole'
-        key should contain the entire document output.
-        """
-
-    def write(self, document, destination):
-        """
-        Process a document into its final form.
-
-        Translate `document` (a Docutils document tree) into the Writer's
-        native format, and write it out to its `destination` (a
-        `docutils.io.Output` subclass object).
-
-        Normally not overridden or extended in subclasses.
-        """
-        self.document = document
-        self.language = languages.get_language(
-            document.settings.language_code)
-        self.destination = destination
-        self.translate()
-        output = self.destination.write(self.output)
-        return output
-
-    def translate(self):
-        """
-        Do final translation of `self.document` into `self.output`.  Called
-        from `write`.  Override in subclasses.
-
-        Usually done with a `docutils.nodes.NodeVisitor` subclass, in
-        combination with a call to `docutils.nodes.Node.walk()` or
-        `docutils.nodes.Node.walkabout()`.  The ``NodeVisitor`` subclass must
-        support all standard elements (listed in
-        `docutils.nodes.node_class_names`) and possibly non-standard elements
-        used by the current Reader as well.
-        """
-        raise NotImplementedError('subclass must override this method')
-
-    def assemble_parts(self):
-        """Assemble the `self.parts` dictionary.  Extend in subclasses."""
-        self.parts['whole'] = self.output
-        self.parts['encoding'] = self.document.settings.output_encoding
-        self.parts['version'] = docutils.__version__
-
-
-class UnfilteredWriter(Writer):
-
-    """
-    A writer that passes the document tree on unchanged (e.g. a
-    serializer.)
-
-    Documents written by UnfilteredWriters are typically reused at a
-    later date using a subclass of `readers.ReReader`.
-    """
-
-    def get_transforms(self):
-        # Do not add any transforms.  When the document is reused
-        # later, the then-used writer will add the appropriate
-        # transforms.
-        return Component.get_transforms(self)
-
-
-_writer_aliases = {
-      'html': 'html4css1',
-      'latex': 'latex2e',
-      'pprint': 'pseudoxml',
-      'pformat': 'pseudoxml',
-      'pdf': 'rlpdf',
-      'xml': 'docutils_xml',
-      's5': 's5_html'}
-
-def get_writer_class(writer_name):
-    """Return the Writer class from the `writer_name` module."""
-    writer_name = writer_name.lower()
-    if _writer_aliases.has_key(writer_name):
-        writer_name = _writer_aliases[writer_name]
-    module = __import__(writer_name, globals(), locals())
-    return module.Writer
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/docutils_xml.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-# $Id: docutils_xml.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Simple internal document tree Writer, writes Docutils XML.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import docutils
-from docutils import frontend, writers
-
-
-class Writer(writers.Writer):
-
-    supported = ('xml',)
-    """Formats this writer supports."""
-
-    settings_spec = (
-        '"Docutils XML" Writer Options',
-        'Warning: the --newlines and --indents options may adversely affect '
-        'whitespace; use them only for reading convenience.',
-        (('Generate XML with newlines before and after tags.',
-          ['--newlines'],
-          {'action': 'store_true', 'validator': frontend.validate_boolean}),
-         ('Generate XML with indents and newlines.',
-          ['--indents'],
-          {'action': 'store_true', 'validator': frontend.validate_boolean}),
-         ('Omit the XML declaration.  Use with caution.',
-          ['--no-xml-declaration'],
-          {'dest': 'xml_declaration', 'default': 1, 'action': 'store_false',
-           'validator': frontend.validate_boolean}),
-         ('Omit the DOCTYPE declaration.',
-          ['--no-doctype'],
-          {'dest': 'doctype_declaration', 'default': 1,
-           'action': 'store_false', 'validator': frontend.validate_boolean}),))
-
-    settings_defaults = {'output_encoding_error_handler': 'xmlcharrefreplace'}
-
-    config_section = 'docutils_xml writer'
-    config_section_dependencies = ('writers',)
-
-    output = None
-    """Final translated form of `document`."""
-
-    xml_declaration = '<?xml version="1.0" encoding="%s"?>\n'
-    #xml_stylesheet = '<?xml-stylesheet type="text/xsl" href="%s"?>\n'
-    doctype = (
-        '<!DOCTYPE document PUBLIC'
-        ' "+//IDN docutils.sourceforge.net//DTD Docutils Generic//EN//XML"'
-        ' "http://docutils.sourceforge.net/docs/ref/docutils.dtd">\n')
-    generator = '<!-- Generated by Docutils %s -->\n'
-
-    def translate(self):
-        settings = self.document.settings
-        indent = newline = ''
-        if settings.newlines:
-            newline = '\n'
-        if settings.indents:
-            newline = '\n'
-            indent = '    '
-        output_prefix = []
-        if settings.xml_declaration:
-            output_prefix.append(
-                self.xml_declaration % settings.output_encoding)
-        if settings.doctype_declaration:
-            output_prefix.append(self.doctype)
-        output_prefix.append(self.generator % docutils.__version__)
-        docnode = self.document.asdom().childNodes[0]
-        self.output = (''.join(output_prefix)
-                       + docnode.toprettyxml(indent, newline))
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/html4css1/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1538 +0,0 @@
-# $Id: __init__.py 5314 2007-07-05 12:45:43Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Simple HyperText Markup Language document tree Writer.
-
-The output conforms to the XHTML version 1.0 Transitional DTD
-(*almost* strict).  The output contains a minimum of formatting
-information.  The cascading style sheet "html4css1.css" is required
-for proper viewing with a modern graphical browser.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import sys
-import os
-import os.path
-import time
-import re
-from types import ListType
-try:
-    import Image                        # check for the Python Imaging Library
-except ImportError:
-    Image = None
-import docutils
-from docutils import frontend, nodes, utils, writers, languages
-from docutils.transforms import writer_aux
-
-
-class Writer(writers.Writer):
-
-    supported = ('html', 'html4css1', 'xhtml')
-    """Formats this writer supports."""
-
-    default_stylesheet = 'html4css1.css'
-
-    default_stylesheet_path = utils.relative_path(
-        os.path.join(os.getcwd(), 'dummy'),
-        os.path.join(os.path.dirname(__file__), default_stylesheet))
-
-    default_template = 'template.txt'
-
-    default_template_path = utils.relative_path(
-        os.path.join(os.getcwd(), 'dummy'),
-        os.path.join(os.path.dirname(__file__), default_template))
-
-    settings_spec = (
-        'HTML-Specific Options',
-        None,
-        (('Specify the template file (UTF-8 encoded).  Default is "%s".'
-          % default_template_path,
-          ['--template'],
-          {'default': default_template_path, 'metavar': '<file>'}),
-        ('Specify a stylesheet URL, used verbatim.  Overrides '
-          '--stylesheet-path.',
-          ['--stylesheet'],
-          {'metavar': '<URL>', 'overrides': 'stylesheet_path'}),
-         ('Specify a stylesheet file, relative to the current working '
-          'directory.  The path is adjusted relative to the output HTML '
-          'file.  Overrides --stylesheet.  Default: "%s"'
-          % default_stylesheet_path,
-          ['--stylesheet-path'],
-          {'metavar': '<file>', 'overrides': 'stylesheet',
-           'default': default_stylesheet_path}),
-         ('Embed the stylesheet in the output HTML file.  The stylesheet '
-          'file must be accessible during processing (--stylesheet-path is '
-          'recommended).  This is the default.',
-          ['--embed-stylesheet'],
-          {'default': 1, 'action': 'store_true',
-           'validator': frontend.validate_boolean}),
-         ('Link to the stylesheet in the output HTML file.  Default: '
-          'embed the stylesheet, do not link to it.',
-          ['--link-stylesheet'],
-          {'dest': 'embed_stylesheet', 'action': 'store_false'}),
-         ('Specify the initial header level.  Default is 1 for "<h1>".  '
-          'Does not affect document title & subtitle (see --no-doc-title).',
-          ['--initial-header-level'],
-          {'choices': '1 2 3 4 5 6'.split(), 'default': '1',
-           'metavar': '<level>'}),
-         ('Specify the maximum width (in characters) for one-column field '
-          'names.  Longer field names will span an entire row of the table '
-          'used to render the field list.  Default is 14 characters.  '
-          'Use 0 for "no limit".',
-          ['--field-name-limit'],
-          {'default': 14, 'metavar': '<level>',
-           'validator': frontend.validate_nonnegative_int}),
-         ('Specify the maximum width (in characters) for options in option '
-          'lists.  Longer options will span an entire row of the table used '
-          'to render the option list.  Default is 14 characters.  '
-          'Use 0 for "no limit".',
-          ['--option-limit'],
-          {'default': 14, 'metavar': '<level>',
-           'validator': frontend.validate_nonnegative_int}),
-         ('Format for footnote references: one of "superscript" or '
-          '"brackets".  Default is "brackets".',
-          ['--footnote-references'],
-          {'choices': ['superscript', 'brackets'], 'default': 'brackets',
-           'metavar': '<format>',
-           'overrides': 'trim_footnote_reference_space'}),
-         ('Format for block quote attributions: one of "dash" (em-dash '
-          'prefix), "parentheses"/"parens", or "none".  Default is "dash".',
-          ['--attribution'],
-          {'choices': ['dash', 'parentheses', 'parens', 'none'],
-           'default': 'dash', 'metavar': '<format>'}),
-         ('Remove extra vertical whitespace between items of "simple" bullet '
-          'lists and enumerated lists.  Default: enabled.',
-          ['--compact-lists'],
-          {'default': 1, 'action': 'store_true',
-           'validator': frontend.validate_boolean}),
-         ('Disable compact simple bullet and enumerated lists.',
-          ['--no-compact-lists'],
-          {'dest': 'compact_lists', 'action': 'store_false'}),
-         ('Remove extra vertical whitespace between items of simple field '
-          'lists.  Default: enabled.',
-          ['--compact-field-lists'],
-          {'default': 1, 'action': 'store_true',
-           'validator': frontend.validate_boolean}),
-         ('Disable compact simple field lists.',
-          ['--no-compact-field-lists'],
-          {'dest': 'compact_field_lists', 'action': 'store_false'}),
-         ('Omit the XML declaration.  Use with caution.',
-          ['--no-xml-declaration'],
-          {'dest': 'xml_declaration', 'default': 1, 'action': 'store_false',
-           'validator': frontend.validate_boolean}),
-         ('Obfuscate email addresses to confuse harvesters while still '
-          'keeping email links usable with standards-compliant browsers.',
-          ['--cloak-email-addresses'],
-          {'action': 'store_true', 'validator': frontend.validate_boolean}),))
-
-    settings_defaults = {'output_encoding_error_handler': 'xmlcharrefreplace'}
-
-    relative_path_settings = ('stylesheet_path',)
-
-    config_section = 'html4css1 writer'
-    config_section_dependencies = ('writers',)
-
-    visitor_attributes = (
-        'head_prefix', 'head', 'stylesheet', 'body_prefix',
-        'body_pre_docinfo', 'docinfo', 'body', 'body_suffix',
-        'title', 'subtitle', 'header', 'footer', 'meta', 'fragment',
-        'html_prolog', 'html_head', 'html_title', 'html_subtitle',
-        'html_body')
-
-    def get_transforms(self):
-        return writers.Writer.get_transforms(self) + [writer_aux.Admonitions]
-
-    def __init__(self):
-        writers.Writer.__init__(self)
-        self.translator_class = HTMLTranslator
-
-    def translate(self):
-        self.visitor = visitor = self.translator_class(self.document)
-        self.document.walkabout(visitor)
-        for attr in self.visitor_attributes:
-            setattr(self, attr, getattr(visitor, attr))
-        self.output = self.apply_template()
-
-    def apply_template(self):
-        template_file = open(self.document.settings.template)
-        template = unicode(template_file.read(), 'utf-8')
-        template_file.close()
-        subs = self.interpolation_dict()
-        return template % subs
-
-    def interpolation_dict(self):
-        subs = {}
-        settings = self.document.settings
-        for attr in self.visitor_attributes:
-            subs[attr] = ''.join(getattr(self, attr)).rstrip('\n')
-        subs['encoding'] = settings.output_encoding
-        subs['version'] = docutils.__version__
-        return subs
-
-    def assemble_parts(self):
-        writers.Writer.assemble_parts(self)
-        for part in self.visitor_attributes:
-            self.parts[part] = ''.join(getattr(self, part))
-
-
-class HTMLTranslator(nodes.NodeVisitor):
-
-    """
-    This HTML writer has been optimized to produce visually compact
-    lists (less vertical whitespace).  HTML's mixed content models
-    allow list items to contain "<li><p>body elements</p></li>" or
-    "<li>just text</li>" or even "<li>text<p>and body
-    elements</p>combined</li>", each with different effects.  It would
-    be best to stick with strict body elements in list items, but they
-    affect vertical spacing in browsers (although they really
-    shouldn't).
-
-    Here is an outline of the optimization:
-
-    - Check for and omit <p> tags in "simple" lists: list items
-      contain either a single paragraph, a nested simple list, or a
-      paragraph followed by a nested simple list.  This means that
-      this list can be compact:
-
-          - Item 1.
-          - Item 2.
-
-      But this list cannot be compact:
-
-          - Item 1.
-
-            This second paragraph forces space between list items.
-
-          - Item 2.
-
-    - In non-list contexts, omit <p> tags on a paragraph if that
-      paragraph is the only child of its parent (footnotes & citations
-      are allowed a label first).
-
-    - Regardless of the above, in definitions, table cells, field bodies,
-      option descriptions, and list items, mark the first child with
-      'class="first"' and the last child with 'class="last"'.  The stylesheet
-      sets the margins (top & bottom respectively) to 0 for these elements.
-
-    The ``no_compact_lists`` setting (``--no-compact-lists`` command-line
-    option) disables list whitespace optimization.
-    """
-
-    xml_declaration = '<?xml version="1.0" encoding="%s" ?>\n'
-    doctype = (
-        '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"'
-        ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n')
-    head_prefix_template = ('<html xmlns="http://www.w3.org/1999/xhtml"'
-                            ' xml:lang="%s" lang="%s">\n<head>\n')
-    content_type = ('<meta http-equiv="Content-Type"'
-                    ' content="text/html; charset=%s" />\n')
-    generator = ('<meta name="generator" content="Docutils %s: '
-                 'http://docutils.sourceforge.net/" />\n')
-    stylesheet_link = '<link rel="stylesheet" href="%s" type="text/css" />\n'
-    embedded_stylesheet = '<style type="text/css">\n\n%s\n</style>\n'
-    words_and_spaces = re.compile(r'\S+| +|\n')
-
-    def __init__(self, document):
-        nodes.NodeVisitor.__init__(self, document)
-        self.settings = settings = document.settings
-        lcode = settings.language_code
-        self.language = languages.get_language(lcode)
-        self.meta = [self.content_type % settings.output_encoding,
-                     self.generator % docutils.__version__]
-        self.head_prefix = []
-        self.html_prolog = []
-        if settings.xml_declaration:
-            self.head_prefix.append(self.xml_declaration
-                                    % settings.output_encoding)
-            # encoding not interpolated:
-            self.html_prolog.append(self.xml_declaration)
-        self.head_prefix.extend([self.doctype,
-                                 self.head_prefix_template % (lcode, lcode)])
-        self.html_prolog.append(self.doctype)
-        self.head = self.meta[:]
-        stylesheet = utils.get_stylesheet_reference(settings)
-        self.stylesheet = []
-        if stylesheet:
-            if settings.embed_stylesheet:
-                stylesheet = utils.get_stylesheet_reference(
-                    settings, os.path.join(os.getcwd(), 'dummy'))
-                settings.record_dependencies.add(stylesheet)
-                stylesheet_text = open(stylesheet).read()
-                self.stylesheet = [self.embedded_stylesheet % stylesheet_text]
-            else:
-                self.stylesheet = [self.stylesheet_link
-                                   % self.encode(stylesheet)]
-        self.body_prefix = ['</head>\n<body>\n']
-        # document title, subtitle display
-        self.body_pre_docinfo = []
-        # author, date, etc.
-        self.docinfo = []
-        self.body = []
-        self.fragment = []
-        self.body_suffix = ['</body>\n</html>\n']
-        self.section_level = 0
-        self.initial_header_level = int(settings.initial_header_level)
-        # A heterogenous stack used in conjunction with the tree traversal.
-        # Make sure that the pops correspond to the pushes:
-        self.context = []
-        self.topic_classes = []
-        self.colspecs = []
-        self.compact_p = 1
-        self.compact_simple = None
-        self.compact_field_list = None
-        self.in_docinfo = None
-        self.in_sidebar = None
-        self.title = []
-        self.subtitle = []
-        self.header = []
-        self.footer = []
-        self.html_head = [self.content_type] # charset not interpolated
-        self.html_title = []
-        self.html_subtitle = []
-        self.html_body = []
-        self.in_document_title = 0
-        self.in_mailto = 0
-        self.author_in_authors = None
-
-    def astext(self):
-        return ''.join(self.head_prefix + self.head
-                       + self.stylesheet + self.body_prefix
-                       + self.body_pre_docinfo + self.docinfo
-                       + self.body + self.body_suffix)
-
-    def encode(self, text):
-        """Encode special characters in `text` & return."""
-        # @@@ A codec to do these and all other HTML entities would be nice.
-        text = text.replace("&", "&amp;")
-        text = text.replace("<", "&lt;")
-        text = text.replace('"', "&quot;")
-        text = text.replace(">", "&gt;")
-        text = text.replace("@", "&#64;") # may thwart some address harvesters
-        # Replace the non-breaking space character with the HTML entity:
-        text = text.replace(u'\u00a0', "&nbsp;")
-        return text
-
-    def cloak_mailto(self, uri):
-        """Try to hide a mailto: URL from harvesters."""
-        # Encode "@" using a URL octet reference (see RFC 1738).
-        # Further cloaking with HTML entities will be done in the
-        # `attval` function.
-        return uri.replace('@', '%40')
-
-    def cloak_email(self, addr):
-        """Try to hide the link text of a email link from harversters."""
-        # Surround at-signs and periods with <span> tags.  ("@" has
-        # already been encoded to "&#64;" by the `encode` method.)
-        addr = addr.replace('&#64;', '<span>&#64;</span>')
-        addr = addr.replace('.', '<span>&#46;</span>')
-        return addr
-
-    def attval(self, text,
-               whitespace=re.compile('[\n\r\t\v\f]')):
-        """Cleanse, HTML encode, and return attribute value text."""
-        encoded = self.encode(whitespace.sub(' ', text))
-        if self.in_mailto and self.settings.cloak_email_addresses:
-            # Cloak at-signs ("%40") and periods with HTML entities.
-            encoded = encoded.replace('%40', '&#37;&#52;&#48;')
-            encoded = encoded.replace('.', '&#46;')
-        return encoded
-
-    def starttag(self, node, tagname, suffix='\n', empty=0, **attributes):
-        """
-        Construct and return a start tag given a node (id & class attributes
-        are extracted), tag name, and optional attributes.
-        """
-        tagname = tagname.lower()
-        prefix = []
-        atts = {}
-        ids = []
-        for (name, value) in attributes.items():
-            atts[name.lower()] = value
-        classes = node.get('classes', [])
-        if atts.has_key('class'):
-            classes.append(atts['class'])
-        if classes:
-            atts['class'] = ' '.join(classes)
-        assert not atts.has_key('id')
-        ids.extend(node.get('ids', []))
-        if atts.has_key('ids'):
-            ids.extend(atts['ids'])
-            del atts['ids']
-        if ids:
-            atts['id'] = ids[0]
-            for id in ids[1:]:
-                # Add empty "span" elements for additional IDs.  Note
-                # that we cannot use empty "a" elements because there
-                # may be targets inside of references, but nested "a"
-                # elements aren't allowed in XHTML (even if they do
-                # not all have a "href" attribute).
-                if empty:
-                    # Empty tag.  Insert target right in front of element.
-                    prefix.append('<span id="%s"></span>' % id)
-                else:
-                    # Non-empty tag.  Place the auxiliary <span> tag
-                    # *inside* the element, as the first child.
-                    suffix += '<span id="%s"></span>' % id
-        attlist = atts.items()
-        attlist.sort()
-        parts = [tagname]
-        for name, value in attlist:
-            # value=None was used for boolean attributes without
-            # value, but this isn't supported by XHTML.
-            assert value is not None
-            if isinstance(value, ListType):
-                values = [unicode(v) for v in value]
-                parts.append('%s="%s"' % (name.lower(),
-                                          self.attval(' '.join(values))))
-            else:
-                parts.append('%s="%s"' % (name.lower(),
-                                          self.attval(unicode(value))))
-        if empty:
-            infix = ' /'
-        else:
-            infix = ''
-        return ''.join(prefix) + '<%s%s>' % (' '.join(parts), infix) + suffix
-
-    def emptytag(self, node, tagname, suffix='\n', **attributes):
-        """Construct and return an XML-compatible empty tag."""
-        return self.starttag(node, tagname, suffix, empty=1, **attributes)
-
-    def set_class_on_child(self, node, class_, index=0):
-        """
-        Set class `class_` on the visible child no. index of `node`.
-        Do nothing if node has fewer children than `index`.
-        """
-        children = [n for n in node if not isinstance(n, nodes.Invisible)]
-        try:
-            child = children[index]
-        except IndexError:
-            return
-        child['classes'].append(class_)
-
-    def set_first_last(self, node):
-        self.set_class_on_child(node, 'first', 0)
-        self.set_class_on_child(node, 'last', -1)
-
-    def visit_Text(self, node):
-        text = node.astext()
-        encoded = self.encode(text)
-        if self.in_mailto and self.settings.cloak_email_addresses:
-            encoded = self.cloak_email(encoded)
-        self.body.append(encoded)
-
-    def depart_Text(self, node):
-        pass
-
-    def visit_abbreviation(self, node):
-        # @@@ implementation incomplete ("title" attribute)
-        self.body.append(self.starttag(node, 'abbr', ''))
-
-    def depart_abbreviation(self, node):
-        self.body.append('</abbr>')
-
-    def visit_acronym(self, node):
-        # @@@ implementation incomplete ("title" attribute)
-        self.body.append(self.starttag(node, 'acronym', ''))
-
-    def depart_acronym(self, node):
-        self.body.append('</acronym>')
-
-    def visit_address(self, node):
-        self.visit_docinfo_item(node, 'address', meta=None)
-        self.body.append(self.starttag(node, 'pre', CLASS='address'))
-
-    def depart_address(self, node):
-        self.body.append('\n</pre>\n')
-        self.depart_docinfo_item()
-
-    def visit_admonition(self, node):
-        self.body.append(self.starttag(node, 'div'))
-        self.set_first_last(node)
-
-    def depart_admonition(self, node=None):
-        self.body.append('</div>\n')
-
-    attribution_formats = {'dash': ('&mdash;', ''),
-                           'parentheses': ('(', ')'),
-                           'parens': ('(', ')'),
-                           'none': ('', '')}
-
-    def visit_attribution(self, node):
-        prefix, suffix = self.attribution_formats[self.settings.attribution]
-        self.context.append(suffix)
-        self.body.append(
-            self.starttag(node, 'p', prefix, CLASS='attribution'))
-
-    def depart_attribution(self, node):
-        self.body.append(self.context.pop() + '</p>\n')
-
-    def visit_author(self, node):
-        if isinstance(node.parent, nodes.authors):
-            if self.author_in_authors:
-                self.body.append('\n<br />')
-        else:
-            self.visit_docinfo_item(node, 'author')
-
-    def depart_author(self, node):
-        if isinstance(node.parent, nodes.authors):
-            self.author_in_authors += 1
-        else:
-            self.depart_docinfo_item()
-
-    def visit_authors(self, node):
-        self.visit_docinfo_item(node, 'authors')
-        self.author_in_authors = 0      # initialize counter
-
-    def depart_authors(self, node):
-        self.depart_docinfo_item()
-        self.author_in_authors = None
-
-    def visit_block_quote(self, node):
-        self.body.append(self.starttag(node, 'blockquote'))
-
-    def depart_block_quote(self, node):
-        self.body.append('</blockquote>\n')
-
-    def check_simple_list(self, node):
-        """Check for a simple list that can be rendered compactly."""
-        visitor = SimpleListChecker(self.document)
-        try:
-            node.walk(visitor)
-        except nodes.NodeFound:
-            return None
-        else:
-            return 1
-
-    def is_compactable(self, node):
-        return ('compact' in node['classes']
-                or (self.settings.compact_lists
-                    and 'open' not in node['classes']
-                    and (self.compact_simple
-                         or self.topic_classes == ['contents']
-                         or self.check_simple_list(node))))
-
-    def visit_bullet_list(self, node):
-        atts = {}
-        old_compact_simple = self.compact_simple
-        self.context.append((self.compact_simple, self.compact_p))
-        self.compact_p = None
-        self.compact_simple = self.is_compactable(node)
-        if self.compact_simple and not old_compact_simple:
-            atts['class'] = 'simple'
-        self.body.append(self.starttag(node, 'ul', **atts))
-
-    def depart_bullet_list(self, node):
-        self.compact_simple, self.compact_p = self.context.pop()
-        self.body.append('</ul>\n')
-
-    def visit_caption(self, node):
-        self.body.append(self.starttag(node, 'p', '', CLASS='caption'))
-
-    def depart_caption(self, node):
-        self.body.append('</p>\n')
-
-    def visit_citation(self, node):
-        self.body.append(self.starttag(node, 'table',
-                                       CLASS='docutils citation',
-                                       frame="void", rules="none"))
-        self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
-                         '<tbody valign="top">\n'
-                         '<tr>')
-        self.footnote_backrefs(node)
-
-    def depart_citation(self, node):
-        self.body.append('</td></tr>\n'
-                         '</tbody>\n</table>\n')
-
-    def visit_citation_reference(self, node):
-        href = '#' + node['refid']
-        self.body.append(self.starttag(
-            node, 'a', '[', CLASS='citation-reference', href=href))
-
-    def depart_citation_reference(self, node):
-        self.body.append(']</a>')
-
-    def visit_classifier(self, node):
-        self.body.append(' <span class="classifier-delimiter">:</span> ')
-        self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
-
-    def depart_classifier(self, node):
-        self.body.append('</span>')
-
-    def visit_colspec(self, node):
-        self.colspecs.append(node)
-        # "stubs" list is an attribute of the tgroup element:
-        node.parent.stubs.append(node.attributes.get('stub'))
-
-    def depart_colspec(self, node):
-        pass
-
-    def write_colspecs(self):
-        width = 0
-        for node in self.colspecs:
-            width += node['colwidth']
-        for node in self.colspecs:
-            colwidth = int(node['colwidth'] * 100.0 / width + 0.5)
-            self.body.append(self.emptytag(node, 'col',
-                                           width='%i%%' % colwidth))
-        self.colspecs = []
-
-    def visit_comment(self, node,
-                      sub=re.compile('-(?=-)').sub):
-        """Escape double-dashes in comment text."""
-        self.body.append('<!-- %s -->\n' % sub('- ', node.astext()))
-        # Content already processed:
-        raise nodes.SkipNode
-
-    def visit_compound(self, node):
-        self.body.append(self.starttag(node, 'div', CLASS='compound'))
-        if len(node) > 1:
-            node[0]['classes'].append('compound-first')
-            node[-1]['classes'].append('compound-last')
-            for child in node[1:-1]:
-                child['classes'].append('compound-middle')
-
-    def depart_compound(self, node):
-        self.body.append('</div>\n')
-
-    def visit_container(self, node):
-        self.body.append(self.starttag(node, 'div', CLASS='container'))
-
-    def depart_container(self, node):
-        self.body.append('</div>\n')
-
-    def visit_contact(self, node):
-        self.visit_docinfo_item(node, 'contact', meta=None)
-
-    def depart_contact(self, node):
-        self.depart_docinfo_item()
-
-    def visit_copyright(self, node):
-        self.visit_docinfo_item(node, 'copyright')
-
-    def depart_copyright(self, node):
-        self.depart_docinfo_item()
-
-    def visit_date(self, node):
-        self.visit_docinfo_item(node, 'date')
-
-    def depart_date(self, node):
-        self.depart_docinfo_item()
-
-    def visit_decoration(self, node):
-        pass
-
-    def depart_decoration(self, node):
-        pass
-
-    def visit_definition(self, node):
-        self.body.append('</dt>\n')
-        self.body.append(self.starttag(node, 'dd', ''))
-        self.set_first_last(node)
-
-    def depart_definition(self, node):
-        self.body.append('</dd>\n')
-
-    def visit_definition_list(self, node):
-        self.body.append(self.starttag(node, 'dl', CLASS='docutils'))
-
-    def depart_definition_list(self, node):
-        self.body.append('</dl>\n')
-
-    def visit_definition_list_item(self, node):
-        pass
-
-    def depart_definition_list_item(self, node):
-        pass
-
-    def visit_description(self, node):
-        self.body.append(self.starttag(node, 'td', ''))
-        self.set_first_last(node)
-
-    def depart_description(self, node):
-        self.body.append('</td>')
-
-    def visit_docinfo(self, node):
-        self.context.append(len(self.body))
-        self.body.append(self.starttag(node, 'table',
-                                       CLASS='docinfo',
-                                       frame="void", rules="none"))
-        self.body.append('<col class="docinfo-name" />\n'
-                         '<col class="docinfo-content" />\n'
-                         '<tbody valign="top">\n')
-        self.in_docinfo = 1
-
-    def depart_docinfo(self, node):
-        self.body.append('</tbody>\n</table>\n')
-        self.in_docinfo = None
-        start = self.context.pop()
-        self.docinfo = self.body[start:]
-        self.body = []
-
-    def visit_docinfo_item(self, node, name, meta=1):
-        if meta:
-            meta_tag = '<meta name="%s" content="%s" />\n' \
-                       % (name, self.attval(node.astext()))
-            self.add_meta(meta_tag)
-        self.body.append(self.starttag(node, 'tr', ''))
-        self.body.append('<th class="docinfo-name">%s:</th>\n<td>'
-                         % self.language.labels[name])
-        if len(node):
-            if isinstance(node[0], nodes.Element):
-                node[0]['classes'].append('first')
-            if isinstance(node[-1], nodes.Element):
-                node[-1]['classes'].append('last')
-
-    def depart_docinfo_item(self):
-        self.body.append('</td></tr>\n')
-
-    def visit_doctest_block(self, node):
-        self.body.append(self.starttag(node, 'pre', CLASS='doctest-block'))
-
-    def depart_doctest_block(self, node):
-        self.body.append('\n</pre>\n')
-
-    def visit_document(self, node):
-        self.head.append('<title>%s</title>\n'
-                         % self.encode(node.get('title', '')))
-
-    def depart_document(self, node):
-        self.fragment.extend(self.body)
-        self.body_prefix.append(self.starttag(node, 'div', CLASS='document'))
-        self.body_suffix.insert(0, '</div>\n')
-        # skip content-type meta tag with interpolated charset value:
-        self.html_head.extend(self.head[1:])
-        self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo
-                              + self.docinfo + self.body
-                              + self.body_suffix[:-1])
-        assert not self.context, 'len(context) = %s' % len(self.context)
-
-    def visit_emphasis(self, node):
-        self.body.append('<em>')
-
-    def depart_emphasis(self, node):
-        self.body.append('</em>')
-
-    def visit_entry(self, node):
-        atts = {'class': []}
-        if isinstance(node.parent.parent, nodes.thead):
-            atts['class'].append('head')
-        if node.parent.parent.parent.stubs[node.parent.column]:
-            # "stubs" list is an attribute of the tgroup element
-            atts['class'].append('stub')
-        if atts['class']:
-            tagname = 'th'
-            atts['class'] = ' '.join(atts['class'])
-        else:
-            tagname = 'td'
-            del atts['class']
-        node.parent.column += 1
-        if node.has_key('morerows'):
-            atts['rowspan'] = node['morerows'] + 1
-        if node.has_key('morecols'):
-            atts['colspan'] = node['morecols'] + 1
-            node.parent.column += node['morecols']
-        self.body.append(self.starttag(node, tagname, '', **atts))
-        self.context.append('</%s>\n' % tagname.lower())
-        if len(node) == 0:              # empty cell
-            self.body.append('&nbsp;')
-        self.set_first_last(node)
-
-    def depart_entry(self, node):
-        self.body.append(self.context.pop())
-
-    def visit_enumerated_list(self, node):
-        """
-        The 'start' attribute does not conform to HTML 4.01's strict.dtd, but
-        CSS1 doesn't help. CSS2 isn't widely enough supported yet to be
-        usable.
-        """
-        atts = {}
-        if node.has_key('start'):
-            atts['start'] = node['start']
-        if node.has_key('enumtype'):
-            atts['class'] = node['enumtype']
-        # @@@ To do: prefix, suffix. How? Change prefix/suffix to a
-        # single "format" attribute? Use CSS2?
-        old_compact_simple = self.compact_simple
-        self.context.append((self.compact_simple, self.compact_p))
-        self.compact_p = None
-        self.compact_simple = self.is_compactable(node)
-        if self.compact_simple and not old_compact_simple:
-            atts['class'] = (atts.get('class', '') + ' simple').strip()
-        self.body.append(self.starttag(node, 'ol', **atts))
-
-    def depart_enumerated_list(self, node):
-        self.compact_simple, self.compact_p = self.context.pop()
-        self.body.append('</ol>\n')
-
-    def visit_field(self, node):
-        self.body.append(self.starttag(node, 'tr', '', CLASS='field'))
-
-    def depart_field(self, node):
-        self.body.append('</tr>\n')
-
-    def visit_field_body(self, node):
-        self.body.append(self.starttag(node, 'td', '', CLASS='field-body'))
-        self.set_class_on_child(node, 'first', 0)
-        field = node.parent
-        if (self.compact_field_list or
-            isinstance(field.parent, nodes.docinfo) or
-            field.parent.index(field) == len(field.parent) - 1):
-            # If we are in a compact list, the docinfo, or if this is
-            # the last field of the field list, do not add vertical
-            # space after last element.
-            self.set_class_on_child(node, 'last', -1)
-
-    def depart_field_body(self, node):
-        self.body.append('</td>\n')
-
-    def visit_field_list(self, node):
-        self.context.append((self.compact_field_list, self.compact_p))
-        self.compact_p = None
-        if 'compact' in node['classes']:
-            self.compact_field_list = 1
-        elif (self.settings.compact_field_lists
-              and 'open' not in node['classes']):
-            self.compact_field_list = 1
-        if self.compact_field_list:
-            for field in node:
-                field_body = field[-1]
-                assert isinstance(field_body, nodes.field_body)
-                children = [n for n in field_body
-                            if not isinstance(n, nodes.Invisible)]
-                if not (len(children) == 0 or
-                        len(children) == 1 and
-                        isinstance(children[0], nodes.paragraph)):
-                    self.compact_field_list = 0
-                    break
-        self.body.append(self.starttag(node, 'table', frame='void',
-                                       rules='none',
-                                       CLASS='docutils field-list'))
-        self.body.append('<col class="field-name" />\n'
-                         '<col class="field-body" />\n'
-                         '<tbody valign="top">\n')
-
-    def depart_field_list(self, node):
-        self.body.append('</tbody>\n</table>\n')
-        self.compact_field_list, self.compact_p = self.context.pop()
-
-    def visit_field_name(self, node):
-        atts = {}
-        if self.in_docinfo:
-            atts['class'] = 'docinfo-name'
-        else:
-            atts['class'] = 'field-name'
-        if ( self.settings.field_name_limit
-             and len(node.astext()) > self.settings.field_name_limit):
-            atts['colspan'] = 2
-            self.context.append('</tr>\n<tr><td>&nbsp;</td>')
-        else:
-            self.context.append('')
-        self.body.append(self.starttag(node, 'th', '', **atts))
-
-    def depart_field_name(self, node):
-        self.body.append(':</th>')
-        self.body.append(self.context.pop())
-
-    def visit_figure(self, node):
-        atts = {'class': 'figure'}
-        if node.get('width'):
-            atts['style'] = 'width: %spx' % node['width']
-        if node.get('align'):
-            atts['align'] = node['align']
-        self.body.append(self.starttag(node, 'div', **atts))
-
-    def depart_figure(self, node):
-        self.body.append('</div>\n')
-
-    def visit_footer(self, node):
-        self.context.append(len(self.body))
-
-    def depart_footer(self, node):
-        start = self.context.pop()
-        footer = [self.starttag(node, 'div', CLASS='footer'),
-                  '<hr class="footer" />\n']
-        footer.extend(self.body[start:])
-        footer.append('\n</div>\n')
-        self.footer.extend(footer)
-        self.body_suffix[:0] = footer
-        del self.body[start:]
-
-    def visit_footnote(self, node):
-        self.body.append(self.starttag(node, 'table',
-                                       CLASS='docutils footnote',
-                                       frame="void", rules="none"))
-        self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
-                         '<tbody valign="top">\n'
-                         '<tr>')
-        self.footnote_backrefs(node)
-
-    def footnote_backrefs(self, node):
-        backlinks = []
-        backrefs = node['backrefs']
-        if self.settings.footnote_backlinks and backrefs:
-            if len(backrefs) == 1:
-                self.context.append('')
-                self.context.append('</a>')
-                self.context.append('<a class="fn-backref" href="#%s">'
-                                    % backrefs[0])
-            else:
-                i = 1
-                for backref in backrefs:
-                    backlinks.append('<a class="fn-backref" href="#%s">%s</a>'
-                                     % (backref, i))
-                    i += 1
-                self.context.append('<em>(%s)</em> ' % ', '.join(backlinks))
-                self.context += ['', '']
-        else:
-            self.context.append('')
-            self.context += ['', '']
-        # If the node does not only consist of a label.
-        if len(node) > 1:
-            # If there are preceding backlinks, we do not set class
-            # 'first', because we need to retain the top-margin.
-            if not backlinks:
-                node[1]['classes'].append('first')
-            node[-1]['classes'].append('last')
-
-    def depart_footnote(self, node):
-        self.body.append('</td></tr>\n'
-                         '</tbody>\n</table>\n')
-
-    def visit_footnote_reference(self, node):
-        href = '#' + node['refid']
-        format = self.settings.footnote_references
-        if format == 'brackets':
-            suffix = '['
-            self.context.append(']')
-        else:
-            assert format == 'superscript'
-            suffix = '<sup>'
-            self.context.append('</sup>')
-        self.body.append(self.starttag(node, 'a', suffix,
-                                       CLASS='footnote-reference', href=href))
-
-    def depart_footnote_reference(self, node):
-        self.body.append(self.context.pop() + '</a>')
-
-    def visit_generated(self, node):
-        pass
-
-    def depart_generated(self, node):
-        pass
-
-    def visit_header(self, node):
-        self.context.append(len(self.body))
-
-    def depart_header(self, node):
-        start = self.context.pop()
-        header = [self.starttag(node, 'div', CLASS='header')]
-        header.extend(self.body[start:])
-        header.append('\n<hr class="header"/>\n</div>\n')
-        self.body_prefix.extend(header)
-        self.header.extend(header)
-        del self.body[start:]
-
-    def visit_image(self, node):
-        atts = {}
-        atts['src'] = node['uri']
-        if node.has_key('width'):
-            atts['width'] = node['width']
-        if node.has_key('height'):
-            atts['height'] = node['height']
-        if node.has_key('scale'):
-            if Image and not (node.has_key('width')
-                              and node.has_key('height')):
-                try:
-                    im = Image.open(str(atts['src']))
-                except (IOError, # Source image can't be found or opened
-                        UnicodeError):  # PIL doesn't like Unicode paths.
-                    pass
-                else:
-                    if not atts.has_key('width'):
-                        atts['width'] = str(im.size[0])
-                    if not atts.has_key('height'):
-                        atts['height'] = str(im.size[1])
-                    del im
-            for att_name in 'width', 'height':
-                if atts.has_key(att_name):
-                    match = re.match(r'([0-9.]+)(\S*)$', atts[att_name])
-                    assert match
-                    atts[att_name] = '%s%s' % (
-                        float(match.group(1)) * (float(node['scale']) / 100),
-                        match.group(2))
-        style = []
-        for att_name in 'width', 'height':
-            if atts.has_key(att_name):
-                if re.match(r'^[0-9.]+$', atts[att_name]):
-                    # Interpret unitless values as pixels.
-                    atts[att_name] += 'px'
-                style.append('%s: %s;' % (att_name, atts[att_name]))
-                del atts[att_name]
-        if style:
-            atts['style'] = ' '.join(style)
-        atts['alt'] = node.get('alt', atts['src'])
-        if (isinstance(node.parent, nodes.TextElement) or
-            (isinstance(node.parent, nodes.reference) and
-             not isinstance(node.parent.parent, nodes.TextElement))):
-            # Inline context or surrounded by <a>...</a>.
-            suffix = ''
-        else:
-            suffix = '\n'
-        if node.has_key('align'):
-            if node['align'] == 'center':
-                # "align" attribute is set in surrounding "div" element.
-                self.body.append('<div align="center" class="align-center">')
-                self.context.append('</div>\n')
-                suffix = ''
-            else:
-                # "align" attribute is set in "img" element.
-                atts['align'] = node['align']
-                self.context.append('')
-            atts['class'] = 'align-%s' % node['align']
-        else:
-            self.context.append('')
-        self.body.append(self.emptytag(node, 'img', suffix, **atts))
-
-    def depart_image(self, node):
-        self.body.append(self.context.pop())
-
-    def visit_inline(self, node):
-        self.body.append(self.starttag(node, 'span', ''))
-
-    def depart_inline(self, node):
-        self.body.append('</span>')
-
-    def visit_label(self, node):
-        # Context added in footnote_backrefs.
-        self.body.append(self.starttag(node, 'td', '%s[' % self.context.pop(),
-                                       CLASS='label'))
-
-    def depart_label(self, node):
-        # Context added in footnote_backrefs.
-        self.body.append(']%s</td><td>%s' % (self.context.pop(), self.context.pop()))
-
-    def visit_legend(self, node):
-        self.body.append(self.starttag(node, 'div', CLASS='legend'))
-
-    def depart_legend(self, node):
-        self.body.append('</div>\n')
-
-    def visit_line(self, node):
-        self.body.append(self.starttag(node, 'div', suffix='', CLASS='line'))
-        if not len(node):
-            self.body.append('<br />')
-
-    def depart_line(self, node):
-        self.body.append('</div>\n')
-
-    def visit_line_block(self, node):
-        self.body.append(self.starttag(node, 'div', CLASS='line-block'))
-
-    def depart_line_block(self, node):
-        self.body.append('</div>\n')
-
-    def visit_list_item(self, node):
-        self.body.append(self.starttag(node, 'li', ''))
-        if len(node):
-            node[0]['classes'].append('first')
-
-    def depart_list_item(self, node):
-        self.body.append('</li>\n')
-
-    def visit_literal(self, node):
-        """Process text to prevent tokens from wrapping."""
-        self.body.append(
-            self.starttag(node, 'tt', '', CLASS='docutils literal'))
-        text = node.astext()
-        for token in self.words_and_spaces.findall(text):
-            if token.strip():
-                # Protect text like "--an-option" from bad line wrapping:
-                self.body.append('<span class="pre">%s</span>'
-                                 % self.encode(token))
-            elif token in ('\n', ' '):
-                # Allow breaks at whitespace:
-                self.body.append(token)
-            else:
-                # Protect runs of multiple spaces; the last space can wrap:
-                self.body.append('&nbsp;' * (len(token) - 1) + ' ')
-        self.body.append('</tt>')
-        # Content already processed:
-        raise nodes.SkipNode
-
-    def visit_literal_block(self, node):
-        self.body.append(self.starttag(node, 'pre', CLASS='literal-block'))
-
-    def depart_literal_block(self, node):
-        self.body.append('\n</pre>\n')
-
-    def visit_meta(self, node):
-        meta = self.emptytag(node, 'meta', **node.non_default_attributes())
-        self.add_meta(meta)
-
-    def depart_meta(self, node):
-        pass
-
-    def add_meta(self, tag):
-        self.meta.append(tag)
-        self.head.append(tag)
-
-    def visit_option(self, node):
-        if self.context[-1]:
-            self.body.append(', ')
-        self.body.append(self.starttag(node, 'span', '', CLASS='option'))
-
-    def depart_option(self, node):
-        self.body.append('</span>')
-        self.context[-1] += 1
-
-    def visit_option_argument(self, node):
-        self.body.append(node.get('delimiter', ' '))
-        self.body.append(self.starttag(node, 'var', ''))
-
-    def depart_option_argument(self, node):
-        self.body.append('</var>')
-
-    def visit_option_group(self, node):
-        atts = {}
-        if ( self.settings.option_limit
-             and len(node.astext()) > self.settings.option_limit):
-            atts['colspan'] = 2
-            self.context.append('</tr>\n<tr><td>&nbsp;</td>')
-        else:
-            self.context.append('')
-        self.body.append(
-            self.starttag(node, 'td', CLASS='option-group', **atts))
-        self.body.append('<kbd>')
-        self.context.append(0)          # count number of options
-
-    def depart_option_group(self, node):
-        self.context.pop()
-        self.body.append('</kbd></td>\n')
-        self.body.append(self.context.pop())
-
-    def visit_option_list(self, node):
-        self.body.append(
-              self.starttag(node, 'table', CLASS='docutils option-list',
-                            frame="void", rules="none"))
-        self.body.append('<col class="option" />\n'
-                         '<col class="description" />\n'
-                         '<tbody valign="top">\n')
-
-    def depart_option_list(self, node):
-        self.body.append('</tbody>\n</table>\n')
-
-    def visit_option_list_item(self, node):
-        self.body.append(self.starttag(node, 'tr', ''))
-
-    def depart_option_list_item(self, node):
-        self.body.append('</tr>\n')
-
-    def visit_option_string(self, node):
-        pass
-
-    def depart_option_string(self, node):
-        pass
-
-    def visit_organization(self, node):
-        self.visit_docinfo_item(node, 'organization')
-
-    def depart_organization(self, node):
-        self.depart_docinfo_item()
-
-    def should_be_compact_paragraph(self, node):
-        """
-        Determine if the <p> tags around paragraph ``node`` can be omitted.
-        """
-        if (isinstance(node.parent, nodes.document) or
-            isinstance(node.parent, nodes.compound)):
-            # Never compact paragraphs in document or compound.
-            return 0
-        for key, value in node.attlist():
-            if (node.is_not_default(key) and
-                not (key == 'classes' and value in
-                     ([], ['first'], ['last'], ['first', 'last']))):
-                # Attribute which needs to survive.
-                return 0
-        first = isinstance(node.parent[0], nodes.label) # skip label
-        for child in node.parent.children[first:]:
-            # only first paragraph can be compact
-            if isinstance(child, nodes.Invisible):
-                continue
-            if child is node:
-                break
-            return 0
-        parent_length = len([n for n in node.parent if not isinstance(
-            n, (nodes.Invisible, nodes.label))])
-        if ( self.compact_simple
-             or self.compact_field_list
-             or self.compact_p and parent_length == 1):
-            return 1
-        return 0
-
-    def visit_paragraph(self, node):
-        if self.should_be_compact_paragraph(node):
-            self.context.append('')
-        else:
-            self.body.append(self.starttag(node, 'p', ''))
-            self.context.append('</p>\n')
-
-    def depart_paragraph(self, node):
-        self.body.append(self.context.pop())
-
-    def visit_problematic(self, node):
-        if node.hasattr('refid'):
-            self.body.append('<a href="#%s">' % node['refid'])
-            self.context.append('</a>')
-        else:
-            self.context.append('')
-        self.body.append(self.starttag(node, 'span', '', CLASS='problematic'))
-
-    def depart_problematic(self, node):
-        self.body.append('</span>')
-        self.body.append(self.context.pop())
-
-    def visit_raw(self, node):
-        if 'html' in node.get('format', '').split():
-            t = isinstance(node.parent, nodes.TextElement) and 'span' or 'div'
-            if node['classes']:
-                self.body.append(self.starttag(node, t, suffix=''))
-            self.body.append(node.astext())
-            if node['classes']:
-                self.body.append('</%s>' % t)
-        # Keep non-HTML raw text out of output:
-        raise nodes.SkipNode
-
-    def visit_reference(self, node):
-        atts = {'class': 'reference'}
-        if node.has_key('refuri'):
-            atts['href'] = node['refuri']
-            if ( self.settings.cloak_email_addresses
-                 and atts['href'].startswith('mailto:')):
-                atts['href'] = self.cloak_mailto(atts['href'])
-                self.in_mailto = 1
-            atts['class'] += ' external'
-        else:
-            assert node.has_key('refid'), \
-                   'References must have "refuri" or "refid" attribute.'
-            atts['href'] = '#' + node['refid']
-            atts['class'] += ' internal'
-        if not isinstance(node.parent, nodes.TextElement):
-            assert len(node) == 1 and isinstance(node[0], nodes.image)
-            atts['class'] += ' image-reference'
-        self.body.append(self.starttag(node, 'a', '', **atts))
-
-    def depart_reference(self, node):
-        self.body.append('</a>')
-        if not isinstance(node.parent, nodes.TextElement):
-            self.body.append('\n')
-        self.in_mailto = 0
-
-    def visit_revision(self, node):
-        self.visit_docinfo_item(node, 'revision', meta=None)
-
-    def depart_revision(self, node):
-        self.depart_docinfo_item()
-
-    def visit_row(self, node):
-        self.body.append(self.starttag(node, 'tr', ''))
-        node.column = 0
-
-    def depart_row(self, node):
-        self.body.append('</tr>\n')
-
-    def visit_rubric(self, node):
-        self.body.append(self.starttag(node, 'p', '', CLASS='rubric'))
-
-    def depart_rubric(self, node):
-        self.body.append('</p>\n')
-
-    def visit_section(self, node):
-        self.section_level += 1
-        self.body.append(
-            self.starttag(node, 'div', CLASS='section'))
-
-    def depart_section(self, node):
-        self.section_level -= 1
-        self.body.append('</div>\n')
-
-    def visit_sidebar(self, node):
-        self.body.append(
-            self.starttag(node, 'div', CLASS='sidebar'))
-        self.set_first_last(node)
-        self.in_sidebar = 1
-
-    def depart_sidebar(self, node):
-        self.body.append('</div>\n')
-        self.in_sidebar = None
-
-    def visit_status(self, node):
-        self.visit_docinfo_item(node, 'status', meta=None)
-
-    def depart_status(self, node):
-        self.depart_docinfo_item()
-
-    def visit_strong(self, node):
-        self.body.append('<strong>')
-
-    def depart_strong(self, node):
-        self.body.append('</strong>')
-
-    def visit_subscript(self, node):
-        self.body.append(self.starttag(node, 'sub', ''))
-
-    def depart_subscript(self, node):
-        self.body.append('</sub>')
-
-    def visit_substitution_definition(self, node):
-        """Internal only."""
-        raise nodes.SkipNode
-
-    def visit_substitution_reference(self, node):
-        self.unimplemented_visit(node)
-
-    def visit_subtitle(self, node):
-        if isinstance(node.parent, nodes.sidebar):
-            self.body.append(self.starttag(node, 'p', '',
-                                           CLASS='sidebar-subtitle'))
-            self.context.append('</p>\n')
-        elif isinstance(node.parent, nodes.document):
-            self.body.append(self.starttag(node, 'h2', '', CLASS='subtitle'))
-            self.context.append('</h2>\n')
-            self.in_document_title = len(self.body)
-        elif isinstance(node.parent, nodes.section):
-            tag = 'h%s' % (self.section_level + self.initial_header_level - 1)
-            self.body.append(
-                self.starttag(node, tag, '', CLASS='section-subtitle') +
-                self.starttag({}, 'span', '', CLASS='section-subtitle'))
-            self.context.append('</span></%s>\n' % tag)
-
-    def depart_subtitle(self, node):
-        self.body.append(self.context.pop())
-        if self.in_document_title:
-            self.subtitle = self.body[self.in_document_title:-1]
-            self.in_document_title = 0
-            self.body_pre_docinfo.extend(self.body)
-            self.html_subtitle.extend(self.body)
-            del self.body[:]
-
-    def visit_superscript(self, node):
-        self.body.append(self.starttag(node, 'sup', ''))
-
-    def depart_superscript(self, node):
-        self.body.append('</sup>')
-
-    def visit_system_message(self, node):
-        self.body.append(self.starttag(node, 'div', CLASS='system-message'))
-        self.body.append('<p class="system-message-title">')
-        backref_text = ''
-        if len(node['backrefs']):
-            backrefs = node['backrefs']
-            if len(backrefs) == 1:
-                backref_text = ('; <em><a href="#%s">backlink</a></em>'
-                                % backrefs[0])
-            else:
-                i = 1
-                backlinks = []
-                for backref in backrefs:
-                    backlinks.append('<a href="#%s">%s</a>' % (backref, i))
-                    i += 1
-                backref_text = ('; <em>backlinks: %s</em>'
-                                % ', '.join(backlinks))
-        if node.hasattr('line'):
-            line = ', line %s' % node['line']
-        else:
-            line = ''
-        self.body.append('System Message: %s/%s '
-                         '(<tt class="docutils">%s</tt>%s)%s</p>\n'
-                         % (node['type'], node['level'],
-                            self.encode(node['source']), line, backref_text))
-
-    def depart_system_message(self, node):
-        self.body.append('</div>\n')
-
-    def visit_table(self, node):
-        self.body.append(
-            self.starttag(node, 'table', CLASS='docutils', border="1"))
-
-    def depart_table(self, node):
-        self.body.append('</table>\n')
-
-    def visit_target(self, node):
-        if not (node.has_key('refuri') or node.has_key('refid')
-                or node.has_key('refname')):
-            self.body.append(self.starttag(node, 'span', '', CLASS='target'))
-            self.context.append('</span>')
-        else:
-            self.context.append('')
-
-    def depart_target(self, node):
-        self.body.append(self.context.pop())
-
-    def visit_tbody(self, node):
-        self.write_colspecs()
-        self.body.append(self.context.pop()) # '</colgroup>\n' or ''
-        self.body.append(self.starttag(node, 'tbody', valign='top'))
-
-    def depart_tbody(self, node):
-        self.body.append('</tbody>\n')
-
-    def visit_term(self, node):
-        self.body.append(self.starttag(node, 'dt', ''))
-
-    def depart_term(self, node):
-        """
-        Leave the end tag to `self.visit_definition()`, in case there's a
-        classifier.
-        """
-        pass
-
-    def visit_tgroup(self, node):
-        # Mozilla needs <colgroup>:
-        self.body.append(self.starttag(node, 'colgroup'))
-        # Appended by thead or tbody:
-        self.context.append('</colgroup>\n')
-        node.stubs = []
-
-    def depart_tgroup(self, node):
-        pass
-
-    def visit_thead(self, node):
-        self.write_colspecs()
-        self.body.append(self.context.pop()) # '</colgroup>\n'
-        # There may or may not be a <thead>; this is for <tbody> to use:
-        self.context.append('')
-        self.body.append(self.starttag(node, 'thead', valign='bottom'))
-
-    def depart_thead(self, node):
-        self.body.append('</thead>\n')
-
-    def visit_title(self, node):
-        """Only 6 section levels are supported by HTML."""
-        check_id = 0
-        close_tag = '</p>\n'
-        if isinstance(node.parent, nodes.topic):
-            self.body.append(
-                  self.starttag(node, 'p', '', CLASS='topic-title first'))
-        elif isinstance(node.parent, nodes.sidebar):
-            self.body.append(
-                  self.starttag(node, 'p', '', CLASS='sidebar-title'))
-        elif isinstance(node.parent, nodes.Admonition):
-            self.body.append(
-                  self.starttag(node, 'p', '', CLASS='admonition-title'))
-        elif isinstance(node.parent, nodes.table):
-            self.body.append(
-                  self.starttag(node, 'caption', ''))
-            close_tag = '</caption>\n'
-        elif isinstance(node.parent, nodes.document):
-            self.body.append(self.starttag(node, 'h1', '', CLASS='title'))
-            close_tag = '</h1>\n'
-            self.in_document_title = len(self.body)
-        else:
-            assert isinstance(node.parent, nodes.section)
-            h_level = self.section_level + self.initial_header_level - 1
-            atts = {}
-            if (len(node.parent) >= 2 and
-                isinstance(node.parent[1], nodes.subtitle)):
-                atts['CLASS'] = 'with-subtitle'
-            self.body.append(
-                  self.starttag(node, 'h%s' % h_level, '', **atts))
-            atts = {}
-            if node.hasattr('refid'):
-                atts['class'] = 'toc-backref'
-                atts['href'] = '#' + node['refid']
-            if atts:
-                self.body.append(self.starttag({}, 'a', '', **atts))
-                close_tag = '</a></h%s>\n' % (h_level)
-            else:
-                close_tag = '</h%s>\n' % (h_level)
-        self.context.append(close_tag)
-
-    def depart_title(self, node):
-        self.body.append(self.context.pop())
-        if self.in_document_title:
-            self.title = self.body[self.in_document_title:-1]
-            self.in_document_title = 0
-            self.body_pre_docinfo.extend(self.body)
-            self.html_title.extend(self.body)
-            del self.body[:]
-
-    def visit_title_reference(self, node):
-        self.body.append(self.starttag(node, 'cite', ''))
-
-    def depart_title_reference(self, node):
-        self.body.append('</cite>')
-
-    def visit_topic(self, node):
-        self.body.append(self.starttag(node, 'div', CLASS='topic'))
-        self.topic_classes = node['classes']
-
-    def depart_topic(self, node):
-        self.body.append('</div>\n')
-        self.topic_classes = []
-
-    def visit_transition(self, node):
-        self.body.append(self.emptytag(node, 'hr', CLASS='docutils'))
-
-    def depart_transition(self, node):
-        pass
-
-    def visit_version(self, node):
-        self.visit_docinfo_item(node, 'version', meta=None)
-
-    def depart_version(self, node):
-        self.depart_docinfo_item()
-
-    def unimplemented_visit(self, node):
-        raise NotImplementedError('visiting unimplemented node type: %s'
-                                  % node.__class__.__name__)
-
-
-class SimpleListChecker(nodes.GenericNodeVisitor):
-
-    """
-    Raise `nodes.NodeFound` if non-simple list item is encountered.
-
-    Here "simple" means a list item containing nothing other than a single
-    paragraph, a simple list, or a paragraph followed by a simple list.
-    """
-
-    def default_visit(self, node):
-        raise nodes.NodeFound
-
-    def visit_bullet_list(self, node):
-        pass
-
-    def visit_enumerated_list(self, node):
-        pass
-
-    def visit_list_item(self, node):
-        children = []
-        for child in node.children:
-            if not isinstance(child, nodes.Invisible):
-                children.append(child)
-        if (children and isinstance(children[0], nodes.paragraph)
-            and (isinstance(children[-1], nodes.bullet_list)
-                 or isinstance(children[-1], nodes.enumerated_list))):
-            children.pop()
-        if len(children) <= 1:
-            return
-        else:
-            raise nodes.NodeFound
-
-    def visit_paragraph(self, node):
-        raise nodes.SkipNode
-
-    def invisible_visit(self, node):
-        """Invisible nodes should be ignored."""
-        raise nodes.SkipNode
-
-    visit_comment = invisible_visit
-    visit_substitution_definition = invisible_visit
-    visit_target = invisible_visit
-    visit_pending = invisible_visit
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/html4css1/html4css1.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,273 +0,0 @@
-/*
-:Author: David Goodger (goodger@python.org)
-:Id: $Id: html4css1.css 5196 2007-06-03 20:25:28Z wiemann $
-:Copyright: This stylesheet has been placed in the public domain.
-
-Default cascading style sheet for the HTML output of Docutils.
-
-See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
-customize this style sheet.
-*/
-
-/* used to remove borders from tables and images */
-.borderless, table.borderless td, table.borderless th {
-  border: 0 }
-
-table.borderless td, table.borderless th {
-  /* Override padding for "table.docutils td" with "! important".
-     The right padding separates the table cells. */
-  padding: 0 0.5em 0 0 ! important }
-
-.first {
-  /* Override more specific margin styles with "! important". */
-  margin-top: 0 ! important }
-
-.last, .with-subtitle {
-  margin-bottom: 0 ! important }
-
-.hidden {
-  display: none }
-
-a.toc-backref {
-  text-decoration: none ;
-  color: black }
-
-blockquote.epigraph {
-  margin: 2em 5em ; }
-
-dl.docutils dd {
-  margin-bottom: 0.5em }
-
-/* Uncomment (and remove this text!) to get bold-faced definition list terms
-dl.docutils dt {
-  font-weight: bold }
-*/
-
-div.abstract {
-  margin: 2em 5em }
-
-div.abstract p.topic-title {
-  font-weight: bold ;
-  text-align: center }
-
-div.admonition, div.attention, div.caution, div.danger, div.error,
-div.hint, div.important, div.note, div.tip, div.warning {
-  margin: 2em ;
-  border: medium outset ;
-  padding: 1em }
-
-div.admonition p.admonition-title, div.hint p.admonition-title,
-div.important p.admonition-title, div.note p.admonition-title,
-div.tip p.admonition-title {
-  font-weight: bold ;
-  font-family: sans-serif }
-
-div.attention p.admonition-title, div.caution p.admonition-title,
-div.danger p.admonition-title, div.error p.admonition-title,
-div.warning p.admonition-title {
-  color: red ;
-  font-weight: bold ;
-  font-family: sans-serif }
-
-/* Uncomment (and remove this text!) to get reduced vertical space in
-   compound paragraphs.
-div.compound .compound-first, div.compound .compound-middle {
-  margin-bottom: 0.5em }
-
-div.compound .compound-last, div.compound .compound-middle {
-  margin-top: 0.5em }
-*/
-
-div.dedication {
-  margin: 2em 5em ;
-  text-align: center ;
-  font-style: italic }
-
-div.dedication p.topic-title {
-  font-weight: bold ;
-  font-style: normal }
-
-div.figure {
-  margin-left: 2em ;
-  margin-right: 2em }
-
-div.footer, div.header {
-  clear: both;
-  font-size: smaller }
-
-div.line-block {
-  display: block ;
-  margin-top: 1em ;
-  margin-bottom: 1em }
-
-div.line-block div.line-block {
-  margin-top: 0 ;
-  margin-bottom: 0 ;
-  margin-left: 1.5em }
-
-div.sidebar {
-  margin: 0 0 0.5em 1em ;
-  border: medium outset ;
-  padding: 1em ;
-  background-color: #ffffee ;
-  width: 40% ;
-  float: right ;
-  clear: right }
-
-div.sidebar p.rubric {
-  font-family: sans-serif ;
-  font-size: medium }
-
-div.system-messages {
-  margin: 5em }
-
-div.system-messages h1 {
-  color: red }
-
-div.system-message {
-  border: medium outset ;
-  padding: 1em }
-
-div.system-message p.system-message-title {
-  color: red ;
-  font-weight: bold }
-
-div.topic {
-  margin: 2em }
-
-h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
-h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
-  margin-top: 0.4em }
-
-h1.title {
-  text-align: center }
-
-h2.subtitle {
-  text-align: center }
-
-hr.docutils {
-  width: 75% }
-
-img.align-left {
-  clear: left }
-
-img.align-right {
-  clear: right }
-
-ol.simple, ul.simple {
-  margin-bottom: 1em }
-
-ol.arabic {
-  list-style: decimal }
-
-ol.loweralpha {
-  list-style: lower-alpha }
-
-ol.upperalpha {
-  list-style: upper-alpha }
-
-ol.lowerroman {
-  list-style: lower-roman }
-
-ol.upperroman {
-  list-style: upper-roman }
-
-p.attribution {
-  text-align: right ;
-  margin-left: 50% }
-
-p.caption {
-  font-style: italic }
-
-p.credits {
-  font-style: italic ;
-  font-size: smaller }
-
-p.label {
-  white-space: nowrap }
-
-p.rubric {
-  font-weight: bold ;
-  font-size: larger ;
-  color: maroon ;
-  text-align: center }
-
-p.sidebar-title {
-  font-family: sans-serif ;
-  font-weight: bold ;
-  font-size: larger }
-
-p.sidebar-subtitle {
-  font-family: sans-serif ;
-  font-weight: bold }
-
-p.topic-title {
-  font-weight: bold }
-
-pre.address {
-  margin-bottom: 0 ;
-  margin-top: 0 ;
-  font-family: serif ;
-  font-size: 100% }
-
-pre.literal-block, pre.doctest-block {
-  margin-left: 2em ;
-  margin-right: 2em }
-
-span.classifier {
-  font-family: sans-serif ;
-  font-style: oblique }
-
-span.classifier-delimiter {
-  font-family: sans-serif ;
-  font-weight: bold }
-
-span.interpreted {
-  font-family: sans-serif }
-
-span.option {
-  white-space: nowrap }
-
-span.pre {
-  white-space: pre }
-
-span.problematic {
-  color: red }
-
-span.section-subtitle {
-  /* font-size relative to parent (h1..h6 element) */
-  font-size: 80% }
-
-table.citation {
-  border-left: solid 1px gray;
-  margin-left: 1px }
-
-table.docinfo {
-  margin: 2em 4em }
-
-table.docutils {
-  margin-top: 0.5em ;
-  margin-bottom: 0.5em }
-
-table.footnote {
-  border-left: solid 1px black;
-  margin-left: 1px }
-
-table.docutils td, table.docutils th,
-table.docinfo td, table.docinfo th {
-  padding-left: 0.5em ;
-  padding-right: 0.5em ;
-  vertical-align: top }
-
-table.docutils th.field-name, table.docinfo th.docinfo-name {
-  font-weight: bold ;
-  text-align: left ;
-  white-space: nowrap ;
-  padding-left: 0 }
-
-h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
-h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
-  font-size: 100% }
-
-ul.auto-toc {
-  list-style-type: none }
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/html4css1/template.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-%(head_prefix)s
-%(head)s
-%(stylesheet)s
-%(body_prefix)s
-%(body_pre_docinfo)s
-%(docinfo)s
-%(body)s
-%(body_suffix)s
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/latex2e/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2177 +0,0 @@
-# $Id: __init__.py 5333 2007-07-10 17:31:28Z grubert $
-# Author: Engelbert Gruber <grubert@users.sourceforge.net>
-# Copyright: This module has been placed in the public domain.
-
-"""
-LaTeX2e document tree Writer.
-"""
-
-__docformat__ = 'reStructuredText'
-
-# code contributions from several people included, thanks to all.
-# some named: David Abrahams, Julien Letessier, Lele Gaifax, and others.
-#
-# convention deactivate code by two # e.g. ##.
-
-import sys
-import time
-import re
-import string
-from types import ListType
-from docutils import frontend, nodes, languages, writers, utils
-from docutils.writers.newlatex2e import unicode_map
-
-from docutils.transforms.references import DanglingReferencesVisitor
-
-class Writer(writers.Writer):
-
-    supported = ('latex','latex2e')
-    """Formats this writer supports."""
-
-    settings_spec = (
-        'LaTeX-Specific Options',
-        'The LaTeX "--output-encoding" default is "latin-1:strict".',
-        (('Specify documentclass.  Default is "article".',
-          ['--documentclass'],
-          {'default': 'article', }),
-         ('Specify document options.  Multiple options can be given, '
-          'separated by commas.  Default is "10pt,a4paper".',
-          ['--documentoptions'],
-          {'default': '10pt,a4paper', }),
-         ('Use LaTeX footnotes. LaTeX supports only numbered footnotes (does it?). '
-          'Default: no, uses figures.',
-          ['--use-latex-footnotes'],
-          {'default': 0, 'action': 'store_true',
-           'validator': frontend.validate_boolean}),
-         ('Format for footnote references: one of "superscript" or '
-          '"brackets".  Default is "superscript".',
-          ['--footnote-references'],
-          {'choices': ['superscript', 'brackets'], 'default': 'superscript',
-           'metavar': '<format>',
-           'overrides': 'trim_footnote_reference_space'}),
-         ('Use LaTeX citations. '
-          'Default: no, uses figures which might get mixed with images.',
-          ['--use-latex-citations'],
-          {'default': 0, 'action': 'store_true',
-           'validator': frontend.validate_boolean}),
-         ('Format for block quote attributions: one of "dash" (em-dash '
-          'prefix), "parentheses"/"parens", or "none".  Default is "dash".',
-          ['--attribution'],
-          {'choices': ['dash', 'parentheses', 'parens', 'none'],
-           'default': 'dash', 'metavar': '<format>'}),
-         ('Specify a stylesheet file. The file will be "input" by latex in '
-          'the document header.  Default is no stylesheet ("").  '
-          'Overrides --stylesheet-path.',
-          ['--stylesheet'],
-          {'default': '', 'metavar': '<file>',
-           'overrides': 'stylesheet_path'}),
-         ('Specify a stylesheet file, relative to the current working '
-          'directory.  Overrides --stylesheet.',
-          ['--stylesheet-path'],
-          {'metavar': '<file>', 'overrides': 'stylesheet'}),
-         ('Table of contents by docutils (default) or LaTeX. LaTeX (writer) '
-          'supports only one ToC per document, but docutils does not know of '
-          'pagenumbers. LaTeX table of contents also means LaTeX generates '
-          'sectionnumbers.',
-          ['--use-latex-toc'],
-          {'default': 0, 'action': 'store_true',
-           'validator': frontend.validate_boolean}),
-         ('Add parts on top of the section hierarchy.',
-          ['--use-part-section'],
-          {'default': 0, 'action': 'store_true',
-           'validator': frontend.validate_boolean}),
-         ('Let LaTeX print author and date, do not show it in docutils '
-          'document info.',
-          ['--use-latex-docinfo'],
-          {'default': 0, 'action': 'store_true',
-           'validator': frontend.validate_boolean}),
-         ('Use LaTeX abstract environment for the documents abstract.'
-          'Per default the abstract is an unnumbered section.',
-          ['--use-latex-abstract'],
-          {'default': 0, 'action': 'store_true',
-           'validator': frontend.validate_boolean}),
-         ('Color of any hyperlinks embedded in text '
-          '(default: "blue", "0" to disable).',
-          ['--hyperlink-color'], {'default': 'blue'}),
-         ('Enable compound enumerators for nested enumerated lists '
-          '(e.g. "1.2.a.ii").  Default: disabled.',
-          ['--compound-enumerators'],
-          {'default': None, 'action': 'store_true',
-           'validator': frontend.validate_boolean}),
-         ('Disable compound enumerators for nested enumerated lists.  This is '
-          'the default.',
-          ['--no-compound-enumerators'],
-          {'action': 'store_false', 'dest': 'compound_enumerators'}),
-         ('Enable section ("." subsection ...) prefixes for compound '
-          'enumerators.  This has no effect without --compound-enumerators.  '
-          'Default: disabled.',
-          ['--section-prefix-for-enumerators'],
-          {'default': None, 'action': 'store_true',
-           'validator': frontend.validate_boolean}),
-         ('Disable section prefixes for compound enumerators.  '
-          'This is the default.',
-          ['--no-section-prefix-for-enumerators'],
-          {'action': 'store_false', 'dest': 'section_prefix_for_enumerators'}),
-         ('Set the separator between section number and enumerator '
-          'for compound enumerated lists.  Default is "-".',
-          ['--section-enumerator-separator'],
-          {'default': '-', 'metavar': '<char>'}),
-         ('When possibile, use verbatim for literal-blocks. '
-          'Default is to always use the mbox environment.',
-          ['--use-verbatim-when-possible'],
-          {'default': 0, 'action': 'store_true',
-           'validator': frontend.validate_boolean}),
-         ('Table style. "standard" with horizontal and vertical lines, '
-          '"booktabs" (LaTeX booktabs style) only horizontal lines '
-          'above and below the table and below the header or "nolines".  '
-          'Default: "standard"',
-          ['--table-style'],
-          {'choices': ['standard', 'booktabs','nolines'], 'default': 'standard',
-           'metavar': '<format>'}),
-         ('LaTeX graphicx package option. '
-          'Possible values are "dvips", "pdftex". "auto" includes LaTeX code '
-          'to use "pdftex" if processing with pdf(la)tex and dvips otherwise. '
-          'Default is no option.',
-          ['--graphicx-option'],
-          {'default': ''}),
-         ('LaTeX font encoding. '
-          'Possible values are "T1", "OT1", "" or some other fontenc option. '
-          'The font encoding influences available symbols, e.g. "<<" as one '
-          'character. Default is "" which leads to package "ae" (a T1 '
-          'emulation using CM fonts).',
-          ['--font-encoding'],
-          {'default': ''}),
-         ('Per default the latex-writer puts the reference title into '
-          'hyperreferences. Specify "ref*" or "pageref*" to get the section '
-          'number or the page number.',
-          ['--reference-label'],
-          {'default': None, }),
-         ('Specify style and database for bibtex, for example '
-          '"--use-bibtex=mystyle,mydb1,mydb2".',
-          ['--use-bibtex'],
-          {'default': None, }),
-          ),)
-
-    settings_defaults = {'output_encoding': 'latin-1'}
-
-    relative_path_settings = ('stylesheet_path',)
-
-    config_section = 'latex2e writer'
-    config_section_dependencies = ('writers',)
-
-    visitor_attributes = ("head_prefix", "head", 
-            "body_prefix", "body", "body_suffix")
-
-    output = None
-    """Final translated form of `document`."""
-
-    def __init__(self):
-        writers.Writer.__init__(self)
-        self.translator_class = LaTeXTranslator
-
-    def translate(self):
-        visitor = self.translator_class(self.document)
-        self.document.walkabout(visitor)
-        self.output = visitor.astext()
-        # copy parts 
-        for attr in self.visitor_attributes:
-            setattr(self, attr, getattr(visitor, attr))
-
-    def assemble_parts(self):
-        writers.Writer.assemble_parts(self)
-        for part in self.visitor_attributes:
-            self.parts[part] = ''.join(getattr(self, part))
-
-
-"""
-Notes on LaTeX
---------------
-
-* LaTeX does not support multiple tocs in one document.
-  (might be no limitation except for docutils documentation)
-
-  The "minitoc" latex package can produce per-chapter tocs in
-  book and report document classes.
-
-* width
-
-  * linewidth - width of a line in the local environment
-  * textwidth - the width of text on the page
-
-  Maybe always use linewidth ?
-
-  *Bug* inside a minipage a (e.g. Sidebar) the linewidth is
-        not changed, needs fix in docutils so that tables
-        are not too wide.
-
-        So we add locallinewidth set it initially and
-        on entering sidebar and reset on exit.
-"""
-
-class Babel:
-    """Language specifics for LaTeX."""
-    # country code by a.schlock.
-    # partly manually converted from iso and babel stuff, dialects and some
-    _ISO639_TO_BABEL = {
-        'no': 'norsk',     #XXX added by hand ( forget about nynorsk?)
-        'gd': 'scottish',  #XXX added by hand
-        'hu': 'magyar',    #XXX added by hand
-        'pt': 'portuguese',#XXX added by hand
-        'sl': 'slovenian',
-        'af': 'afrikaans',
-        'bg': 'bulgarian',
-        'br': 'breton',
-        'ca': 'catalan',
-        'cs': 'czech',
-        'cy': 'welsh',
-        'da': 'danish',
-        'fr': 'french',
-        # french, francais, canadien, acadian
-        'de': 'ngerman',  #XXX rather than german
-        # ngerman, naustrian, german, germanb, austrian
-        'el': 'greek',
-        'en': 'english',
-        # english, USenglish, american, UKenglish, british, canadian
-        'eo': 'esperanto',
-        'es': 'spanish',
-        'et': 'estonian',
-        'eu': 'basque',
-        'fi': 'finnish',
-        'ga': 'irish',
-        'gl': 'galician',
-        'he': 'hebrew',
-        'hr': 'croatian',
-        'hu': 'hungarian',
-        'is': 'icelandic',
-        'it': 'italian',
-        'la': 'latin',
-        'nl': 'dutch',
-        'pl': 'polish',
-        'pt': 'portuguese',
-        'ro': 'romanian',
-        'ru': 'russian',
-        'sk': 'slovak',
-        'sr': 'serbian',
-        'sv': 'swedish',
-        'tr': 'turkish',
-        'uk': 'ukrainian'
-    }
-
-    def __init__(self,lang):
-        self.language = lang
-        # pdflatex does not produce double quotes for ngerman in tt.
-        self.double_quote_replacment = None
-        if re.search('^de',self.language):
-            #self.quotes = ("\"`", "\"'")
-            self.quotes = ('{\\glqq}', '{\\grqq}')
-            self.double_quote_replacment = "{\\dq}"
-        elif re.search('^it',self.language):
-            self.quotes = ("``", "''")
-            self.double_quote_replacment = r'{\char`\"}'
-        else:
-            self.quotes = ("``", "''")
-        self.quote_index = 0
-
-    def next_quote(self):
-        q = self.quotes[self.quote_index]
-        self.quote_index = (self.quote_index+1)%2
-        return q
-
-    def quote_quotes(self,text):
-        t = None
-        for part in text.split('"'):
-            if t == None:
-                t = part
-            else:
-                t += self.next_quote() + part
-        return t
-
-    def double_quotes_in_tt (self,text):
-        if not self.double_quote_replacment:
-            return text
-        return text.replace('"', self.double_quote_replacment)
-
-    def get_language(self):
-        if self._ISO639_TO_BABEL.has_key(self.language):
-            return self._ISO639_TO_BABEL[self.language]
-        else:
-            # support dialects.
-            l = self.language.split("_")[0]
-            if self._ISO639_TO_BABEL.has_key(l):
-                return self._ISO639_TO_BABEL[l]
-        return None
-
-
-latex_headings = {
-        'optionlist_environment' : [
-              '\\newcommand{\\optionlistlabel}[1]{\\bf #1 \\hfill}\n'
-              '\\newenvironment{optionlist}[1]\n'
-              '{\\begin{list}{}\n'
-              '  {\\setlength{\\labelwidth}{#1}\n'
-              '   \\setlength{\\rightmargin}{1cm}\n'
-              '   \\setlength{\\leftmargin}{\\rightmargin}\n'
-              '   \\addtolength{\\leftmargin}{\\labelwidth}\n'
-              '   \\addtolength{\\leftmargin}{\\labelsep}\n'
-              '   \\renewcommand{\\makelabel}{\\optionlistlabel}}\n'
-              '}{\\end{list}}\n',
-              ],
-        'lineblock_environment' : [
-            '\\newlength{\\lineblockindentation}\n'
-            '\\setlength{\\lineblockindentation}{2.5em}\n'
-            '\\newenvironment{lineblock}[1]\n'
-            '{\\begin{list}{}\n'
-            '  {\\setlength{\\partopsep}{\\parskip}\n'
-            '   \\addtolength{\\partopsep}{\\baselineskip}\n'
-            '   \\topsep0pt\\itemsep0.15\\baselineskip\\parsep0pt\n'
-            '   \\leftmargin#1}\n'
-            ' \\raggedright}\n'
-            '{\\end{list}}\n'
-            ],
-        'footnote_floats' : [
-            '% begin: floats for footnotes tweaking.\n',
-            '\\setlength{\\floatsep}{0.5em}\n',
-            '\\setlength{\\textfloatsep}{\\fill}\n',
-            '\\addtolength{\\textfloatsep}{3em}\n',
-            '\\renewcommand{\\textfraction}{0.5}\n',
-            '\\renewcommand{\\topfraction}{0.5}\n',
-            '\\renewcommand{\\bottomfraction}{0.5}\n',
-            '\\setcounter{totalnumber}{50}\n',
-            '\\setcounter{topnumber}{50}\n',
-            '\\setcounter{bottomnumber}{50}\n',
-            '% end floats for footnotes\n',
-            ],
-        'some_commands' : [
-            '% some commands, that could be overwritten in the style file.\n'
-            '\\newcommand{\\rubric}[1]'
-            '{\\subsection*{~\\hfill {\\it #1} \\hfill ~}}\n'
-            '\\newcommand{\\titlereference}[1]{\\textsl{#1}}\n'
-            '% end of "some commands"\n',
-            ]
-        }
-
-class DocumentClass:
-    """Details of a LaTeX document class."""
-
-    def __init__(self, document_class, with_part=False):
-        self.document_class = document_class
-        self._with_part = with_part
-
-    def section(self, level):
-        """ Return the section name at the given level for the specific
-            document class.
-
-            Level is 1,2,3..., as level 0 is the title."""
-
-        sections = [ 'section', 'subsection', 'subsubsection', 
-                     'paragraph', 'subparagraph' ]
-        if self.document_class in ('book', 'report', 'scrreprt', 'scrbook'):
-            sections.insert(0, 'chapter')
-        if self._with_part:
-            sections.insert(0, 'part')
-        if level <= len(sections):
-            return sections[level-1]
-        else:
-            return sections[-1]
-
-class Table:
-    """ Manage a table while traversing.
-        Maybe change to a mixin defining the visit/departs, but then
-        class Table internal variables are in the Translator.
-
-        Table style might be 
-        
-        * standard: horizontal and vertical lines
-        * booktabs (requires booktabs latex package): only horizontal lines
-        * nolines, borderless : no lines
-    """
-    def __init__(self,latex_type,table_style):
-        self._latex_type = latex_type
-        self._table_style = table_style
-        self._open = 0
-        # miscellaneous attributes
-        self._attrs = {}
-        self._col_width = []
-        self._rowspan = []
-        self.stubs = []
-
-    def open(self):
-        self._open = 1
-        self._col_specs = []
-        self.caption = None
-        self._attrs = {}
-        self._in_head = 0 # maybe context with search
-    def close(self):
-        self._open = 0
-        self._col_specs = None
-        self.caption = None
-        self._attrs = {}
-        self.stubs = []
-    def is_open(self):
-        return self._open
-
-    def set_table_style(self, table_style):
-        if not table_style in ('standard','booktabs','borderless','nolines'):
-            return
-        self._table_style = table_style
-
-    def used_packages(self):
-        if self._table_style == 'booktabs':
-            return '\\usepackage{booktabs}\n'
-        return ''
-    def get_latex_type(self):
-        return self._latex_type
-
-    def set(self,attr,value):
-        self._attrs[attr] = value
-    def get(self,attr):
-        if self._attrs.has_key(attr):
-            return self._attrs[attr]
-        return None
-    def get_vertical_bar(self):
-        if self._table_style == 'standard':
-            return '|'
-        return ''
-    # horizontal lines are drawn below a row, because we.
-    def get_opening(self):
-        if self._latex_type == 'longtable':
-            # otherwise longtable might move before paragraph and subparagraph
-            prefix = '\\leavevmode\n'
-        else:
-            prefix = ''
-        return '%s\\begin{%s}[c]' % (prefix, self._latex_type)
-    def get_closing(self):
-        line = ""
-        if self._table_style == 'booktabs':
-            line = '\\bottomrule\n'
-        elif self._table_style == 'standard':
-            lines = '\\hline\n'
-        return '%s\\end{%s}' % (line,self._latex_type)
-
-    def visit_colspec(self, node):
-        self._col_specs.append(node)
-        # "stubs" list is an attribute of the tgroup element:
-        self.stubs.append(node.attributes.get('stub'))
-
-    def get_colspecs(self):
-        """
-        Return column specification for longtable.
-
-        Assumes reST line length being 80 characters.
-        Table width is hairy.
-
-        === ===
-        ABC DEF
-        === ===
-
-        usually gets to narrow, therefore we add 1 (fiddlefactor).
-        """
-        width = 80
-
-        total_width = 0.0
-        # first see if we get too wide.
-        for node in self._col_specs:
-            colwidth = float(node['colwidth']+1) / width
-            total_width += colwidth
-        self._col_width = []
-        self._rowspan = []
-        # donot make it full linewidth
-        factor = 0.93
-        if total_width > 1.0:
-            factor /= total_width
-        bar = self.get_vertical_bar()
-        latex_table_spec = ""
-        for node in self._col_specs:
-            colwidth = factor * float(node['colwidth']+1) / width
-            self._col_width.append(colwidth+0.005)
-            self._rowspan.append(0)
-            latex_table_spec += "%sp{%.3f\\locallinewidth}" % (bar,colwidth+0.005)
-        return latex_table_spec+bar
-
-    def get_column_width(self):
-        """ return columnwidth for current cell (not multicell)
-        """
-        return "%.2f\\locallinewidth" % self._col_width[self._cell_in_row-1]
-
-    def visit_thead(self):
-        self._in_thead = 1
-        if self._table_style == 'standard':
-            return ['\\hline\n']
-        elif self._table_style == 'booktabs':
-            return ['\\toprule\n']
-        return []
-    def depart_thead(self):
-        a = []
-        #if self._table_style == 'standard':
-        #    a.append('\\hline\n')
-        if self._table_style == 'booktabs':
-            a.append('\\midrule\n')
-        if self._latex_type == 'longtable':
-            a.append('\\endhead\n')
-        # for longtable one could add firsthead, foot and lastfoot
-        self._in_thead = 0
-        return a
-    def visit_row(self):
-        self._cell_in_row = 0
-    def depart_row(self):
-        res = [' \\\\\n']
-        self._cell_in_row = None  # remove cell counter
-        for i in range(len(self._rowspan)):
-            if (self._rowspan[i]>0):
-                self._rowspan[i] -= 1
-
-        if self._table_style == 'standard':
-            rowspans = []
-            for i in range(len(self._rowspan)):
-                if (self._rowspan[i]<=0):
-                    rowspans.append(i+1)
-            if len(rowspans)==len(self._rowspan):
-                res.append('\\hline\n')
-            else:
-                cline = ''
-                rowspans.reverse()
-                # TODO merge clines
-                while 1:
-                    try:
-                        c_start = rowspans.pop()
-                    except:
-                        break
-                    cline += '\\cline{%d-%d}\n' % (c_start,c_start)
-                res.append(cline)
-        return res
-
-    def set_rowspan(self,cell,value):
-        try:
-            self._rowspan[cell] = value
-        except:
-            pass
-    def get_rowspan(self,cell):
-        try:
-            return self._rowspan[cell]
-        except:
-            return 0
-    def get_entry_number(self):
-        return self._cell_in_row
-    def visit_entry(self):
-        self._cell_in_row += 1
-    def is_stub_column(self):
-        if len(self.stubs) >= self._cell_in_row:
-            return self.stubs[self._cell_in_row-1]
-        return False
-
-
-class LaTeXTranslator(nodes.NodeVisitor):
-
-    # When options are given to the documentclass, latex will pass them
-    # to other packages, as done with babel.
-    # Dummy settings might be taken from document settings
-    
-    # Templates
-    # ---------
-    
-    latex_head = '\\documentclass[%s]{%s}\n'
-    linking = '\\usepackage[colorlinks=%s,linkcolor=%s,urlcolor=%s]{hyperref}\n'
-    stylesheet = '\\input{%s}\n'
-    # add a generated on day , machine by user using docutils version.
-    generator = '% generated by Docutils <http://docutils.sourceforge.net/>\n'
-    # Config setting defaults
-    # -----------------------
-
-    # use latex tableofcontents or let docutils do it.
-    use_latex_toc = 0
-
-    # TODO: use mixins for different implementations.
-    # list environment for docinfo. else tabularx
-    use_optionlist_for_docinfo = 0 # NOT YET IN USE
-
-    # Use compound enumerations (1.A.1.)
-    compound_enumerators = 0
-
-    # If using compound enumerations, include section information.
-    section_prefix_for_enumerators = 0
-
-    # This is the character that separates the section ("." subsection ...)
-    # prefix from the regular list enumerator.
-    section_enumerator_separator = '-'
-
-    # default link color
-    hyperlink_color = "blue"
-
-    def __init__(self, document):
-        nodes.NodeVisitor.__init__(self, document)
-        self.settings = settings = document.settings
-        self.latex_encoding = self.to_latex_encoding(settings.output_encoding)
-        self.use_latex_toc = settings.use_latex_toc
-        self.use_latex_docinfo = settings.use_latex_docinfo
-        self.use_latex_footnotes = settings.use_latex_footnotes
-        self._use_latex_citations = settings.use_latex_citations
-        self._reference_label = settings.reference_label
-        self.hyperlink_color = settings.hyperlink_color
-        self.compound_enumerators = settings.compound_enumerators
-        self.font_encoding = settings.font_encoding
-        self.section_prefix_for_enumerators = (
-            settings.section_prefix_for_enumerators)
-        self.section_enumerator_separator = (
-            settings.section_enumerator_separator.replace('_', '\\_'))
-        if self.hyperlink_color == '0':
-            self.hyperlink_color = 'black'
-            self.colorlinks = 'false'
-        else:
-            self.colorlinks = 'true'
-
-        if self.settings.use_bibtex:
-            self.bibtex = self.settings.use_bibtex.split(",",1)
-            # TODO avoid errors on not declared citations.
-        else:
-            self.bibtex = None
-        # language: labels, bibliographic_fields, and author_separators.
-        # to allow writing labes for specific languages.
-        self.language = languages.get_language(settings.language_code)
-        self.babel = Babel(settings.language_code)
-        self.author_separator = self.language.author_separators[0]
-        self.d_options = self.settings.documentoptions
-        if self.babel.get_language():
-            self.d_options += ',%s' % self.babel.get_language()
-
-        self.d_class = DocumentClass(settings.documentclass, 
-                                     settings.use_part_section)
-        # object for a table while proccessing.
-        self.table_stack = []
-        self.active_table = Table('longtable',settings.table_style)
-
-        # HACK.  Should have more sophisticated typearea handling.
-        if settings.documentclass.find('scr') == -1:
-            self.typearea = '\\usepackage[DIV12]{typearea}\n'
-        else:
-            if self.d_options.find('DIV') == -1 and self.d_options.find('BCOR') == -1:
-                self.typearea = '\\typearea{12}\n'
-            else:
-                self.typearea = ''
-
-        if self.font_encoding == 'OT1':
-            fontenc_header = ''
-        elif self.font_encoding == '':
-            fontenc_header = '\\usepackage{ae}\n\\usepackage{aeguill}\n'
-        else:
-            fontenc_header = '\\usepackage[%s]{fontenc}\n' % (self.font_encoding,)
-        if self.latex_encoding.startswith('utf8'):
-            input_encoding = '\\usepackage{ucs}\n\\usepackage[utf8x]{inputenc}\n'
-        else:
-            input_encoding = '\\usepackage[%s]{inputenc}\n' % self.latex_encoding
-        if self.settings.graphicx_option == '':
-            self.graphicx_package = '\\usepackage{graphicx}\n'
-        elif self.settings.graphicx_option.lower() == 'auto':
-            self.graphicx_package = '\n'.join(
-                ('%Check if we are compiling under latex or pdflatex',
-                 '\\ifx\\pdftexversion\\undefined',
-                 '  \\usepackage{graphicx}',
-                 '\\else',
-                 '  \\usepackage[pdftex]{graphicx}',
-                 '\\fi\n'))
-        else:
-            self.graphicx_package = (
-                '\\usepackage[%s]{graphicx}\n' % self.settings.graphicx_option)
-
-        self.head_prefix = [
-              self.latex_head % (self.d_options,self.settings.documentclass),
-              '\\usepackage{babel}\n',     # language is in documents settings.
-              fontenc_header,
-              '\\usepackage{shortvrb}\n',  # allows verb in footnotes.
-              input_encoding,
-              # * tabularx: for docinfo, automatic width of columns, always on one page.
-              '\\usepackage{tabularx}\n',
-              '\\usepackage{longtable}\n',
-              self.active_table.used_packages(),
-              # possible other packages.
-              # * fancyhdr
-              # * ltxtable is a combination of tabularx and longtable (pagebreaks).
-              #   but ??
-              #
-              # extra space between text in tables and the line above them
-              '\\setlength{\\extrarowheight}{2pt}\n',
-              '\\usepackage{amsmath}\n',   # what fore amsmath.
-              self.graphicx_package,
-              '\\usepackage{color}\n',
-              '\\usepackage{multirow}\n',
-              '\\usepackage{ifthen}\n',   # before hyperref!
-              self.linking % (self.colorlinks, self.hyperlink_color, self.hyperlink_color),
-              self.typearea,
-              self.generator,
-              # latex lengths
-              '\\newlength{\\admonitionwidth}\n',
-              '\\setlength{\\admonitionwidth}{0.9\\textwidth}\n'
-              # width for docinfo tablewidth
-              '\\newlength{\\docinfowidth}\n',
-              '\\setlength{\\docinfowidth}{0.9\\textwidth}\n'
-              # linewidth of current environment, so tables are not wider
-              # than the sidebar: using locallinewidth seems to defer evaluation
-              # of linewidth, this is fixing it.
-              '\\newlength{\\locallinewidth}\n',
-              # will be set later.
-              ]
-        self.head_prefix.extend( latex_headings['optionlist_environment'] )
-        self.head_prefix.extend( latex_headings['lineblock_environment'] )
-        self.head_prefix.extend( latex_headings['footnote_floats'] )
-        self.head_prefix.extend( latex_headings['some_commands'] )
-        ## stylesheet is last: so it might be possible to overwrite defaults.
-        stylesheet = utils.get_stylesheet_reference(settings)
-        if stylesheet:
-            settings.record_dependencies.add(stylesheet)
-            self.head_prefix.append(self.stylesheet % (stylesheet))
-
-        if self.linking: # and maybe check for pdf
-            self.pdfinfo = [ ]
-            self.pdfauthor = None
-            # pdftitle, pdfsubject, pdfauthor, pdfkeywords, 
-            # pdfcreator, pdfproducer
-        else:
-            self.pdfinfo = None
-        # NOTE: Latex wants a date and an author, rst puts this into
-        #   docinfo, so normally we do not want latex author/date handling.
-        # latex article has its own handling of date and author, deactivate.
-        # self.astext() adds \title{...} \author{...} \date{...}, even if the
-        # "..." are empty strings.
-        self.head = [ ]
-        # separate title, so we can appen subtitle.
-        self.title = ''
-        # if use_latex_docinfo: collects lists of author/organization/contact/address lines
-        self.author_stack = []
-        self.date = ''
-
-        self.body_prefix = ['\\raggedbottom\n']
-        self.body = []
-        self.body_suffix = ['\n']
-        self.section_level = 0
-        self.context = []
-        self.topic_classes = []
-        # column specification for tables
-        self.table_caption = None
-        
-        # Flags to encode
-        # ---------------
-        # verbatim: to tell encode not to encode.
-        self.verbatim = 0
-        # insert_newline: to tell encode to replace blanks by "~".
-        self.insert_none_breaking_blanks = 0
-        # insert_newline: to tell encode to add latex newline.
-        self.insert_newline = 0
-        # mbox_newline: to tell encode to add mbox and newline.
-        self.mbox_newline = 0
-        # inside citation reference labels underscores dont need to be escaped.
-        self.inside_citation_reference_label = 0
-
-        # Stack of section counters so that we don't have to use_latex_toc.
-        # This will grow and shrink as processing occurs.
-        # Initialized for potential first-level sections.
-        self._section_number = [0]
-
-        # The current stack of enumerations so that we can expand
-        # them into a compound enumeration.  
-        self._enumeration_counters = []
-
-        # The maximum number of enumeration counters we've used.
-        # If we go beyond this number, we need to create a new
-        # counter; otherwise, just reuse an old one.
-        self._max_enumeration_counters = 0
-
-        self._bibitems = []
-
-        # docinfo.
-        self.docinfo = None
-        # inside literal block: no quote mangling.
-        self.literal_block = 0
-        self.literal_block_stack = []
-        self.literal = 0
-        # true when encoding in math mode
-        self.mathmode = 0
-
-    def to_latex_encoding(self,docutils_encoding):
-        """
-        Translate docutils encoding name into latex's.
-
-        Default fallback method is remove "-" and "_" chars from docutils_encoding.
-
-        """
-        tr = {  "iso-8859-1": "latin1",     # west european
-                "iso-8859-2": "latin2",     # east european
-                "iso-8859-3": "latin3",     # esperanto, maltese
-                "iso-8859-4": "latin4",     # north european,scandinavian, baltic
-                "iso-8859-5": "iso88595",   # cyrillic (ISO)
-                "iso-8859-9": "latin5",     # turkish
-                "iso-8859-15": "latin9",    # latin9, update to latin1.
-                "mac_cyrillic": "maccyr",   # cyrillic (on Mac)
-                "windows-1251": "cp1251",   # cyrillic (on Windows)
-                "koi8-r": "koi8-r",         # cyrillic (Russian)
-                "koi8-u": "koi8-u",         # cyrillic (Ukrainian)
-                "windows-1250": "cp1250",   #
-                "windows-1252": "cp1252",   #
-                "us-ascii": "ascii",        # ASCII (US)
-                # unmatched encodings
-                #"": "applemac",
-                #"": "ansinew",  # windows 3.1 ansi
-                #"": "ascii",    # ASCII encoding for the range 32--127.
-                #"": "cp437",    # dos latine us
-                #"": "cp850",    # dos latin 1
-                #"": "cp852",    # dos latin 2
-                #"": "decmulti",
-                #"": "latin10",
-                #"iso-8859-6": ""   # arabic
-                #"iso-8859-7": ""   # greek
-                #"iso-8859-8": ""   # hebrew
-                #"iso-8859-10": ""   # latin6, more complete iso-8859-4
-             }
-        if tr.has_key(docutils_encoding.lower()):
-            return tr[docutils_encoding.lower()]
-        # convert: latin-1 and utf-8 and similar things
-        return docutils_encoding.replace("_", "").replace("-", "").lower()
-
-    def language_label(self, docutil_label):
-        return self.language.labels[docutil_label]
-
-    latex_equivalents = {
-        u'\u00A0' : '~',
-        u'\u2013' : '{--}',
-        u'\u2014' : '{---}',
-        u'\u2018' : '`',
-        u'\u2019' : '\'',
-        u'\u201A' : ',',
-        u'\u201C' : '``',
-        u'\u201D' : '\'\'',
-        u'\u201E' : ',,',
-        u'\u2020' : '{\\dag}',
-        u'\u2021' : '{\\ddag}',
-        u'\u2026' : '{\\dots}',
-        u'\u2122' : '{\\texttrademark}',
-        u'\u21d4' : '{$\\Leftrightarrow$}',
-        # greek alphabet ?
-    }
-
-    def unicode_to_latex(self,text):
-        # see LaTeX codec
-        # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252124
-        # Only some special chracters are translated, for documents with many
-        # utf-8 chars one should use the LaTeX unicode package.
-        for uchar in self.latex_equivalents.keys():
-            text = text.replace(uchar,self.latex_equivalents[uchar])
-        return text
-
-    def ensure_math(self, text):
-        if not self.__dict__.has_key('ensure_math_re'):
-            chars = {
-                # lnot,pm,twosuperior,threesuperior,mu,onesuperior,times,div
-                'latin1' : '\xac\xb1\xb2\xb3\xb5\xb9\xd7\xf7' ,
-                # also latin5 and latin9
-                }
-            self.ensure_math_re = re.compile('([%s])' % chars['latin1'])
-        text = self.ensure_math_re.sub(r'\\ensuremath{\1}', text)
-        return text
-
-    def encode(self, text):
-        """
-        Encode special characters (``# $ % & ~ _ ^ \ { }``) in `text` & return
-        """
-        # Escaping with a backslash does not help with backslashes, ~ and ^.
-
-        #     < > are only available in math-mode or tt font. (really ?)
-        #     $ starts math- mode.
-        # AND quotes
-        if self.verbatim:
-            return text
-        # compile the regexps once. do it here so one can see them.
-        #
-        # first the braces.
-        if not self.__dict__.has_key('encode_re_braces'):
-            self.encode_re_braces = re.compile(r'([{}])')
-        text = self.encode_re_braces.sub(r'{\\\1}',text)
-        if not self.__dict__.has_key('encode_re_bslash'):
-            # find backslash: except in the form '{\{}' or '{\}}'.
-            self.encode_re_bslash = re.compile(r'(?<!{)(\\)(?![{}]})')
-        # then the backslash: except in the form from line above:
-        # either '{\{}' or '{\}}'.
-        text = self.encode_re_bslash.sub(r'{\\textbackslash}', text)
-
-        # then dollar
-        text = text.replace("$", '{\\$}')
-        if not ( self.literal_block or self.literal or self.mathmode ):
-            # the vertical bar: in mathmode |,\vert or \mid
-            #   in textmode \textbar
-            text = text.replace("|", '{\\textbar}')
-            text = text.replace("<", '{\\textless}')
-            text = text.replace(">", '{\\textgreater}')
-        # then
-        text = text.replace("&", '{\\&}')
-        # the ^:
-        # * verb|^| does not work in mbox.
-        # * mathmode has wedge. hat{~} would also work.
-        # text = text.replace("^", '{\\ensuremath{^\\wedge}}')
-        text = text.replace("^", '{\\textasciicircum}')
-        text = text.replace("%", '{\\%}')
-        text = text.replace("#", '{\\#}')
-        text = text.replace("~", '{\\textasciitilde}')
-        # Separate compound characters, e.g. "--" to "-{}-".  (The
-        # actual separation is done later; see below.)
-        separate_chars = '-'
-        if self.literal_block or self.literal:
-            # In monospace-font, we also separate ",,", "``" and "''"
-            # and some other characters which can't occur in
-            # non-literal text.
-            separate_chars += ',`\'"<>'
-            # pdflatex does not produce doublequotes for ngerman.
-            text = self.babel.double_quotes_in_tt(text)
-            if self.font_encoding == 'OT1':
-                # We're using OT1 font-encoding and have to replace
-                # underscore by underlined blank, because this has
-                # correct width.
-                text = text.replace('_', '{\\underline{ }}')
-                # And the tt-backslash doesn't work in OT1, so we use
-                # a mirrored slash.
-                text = text.replace('\\textbackslash', '\\reflectbox{/}')
-            else:
-                text = text.replace('_', '{\\_}')
-        else:
-            text = self.babel.quote_quotes(text)
-            if not self.inside_citation_reference_label:
-                text = text.replace("_", '{\\_}')
-        for char in separate_chars * 2:
-            # Do it twice ("* 2") becaues otherwise we would replace
-            # "---" by "-{}--".
-            text = text.replace(char + char, char + '{}' + char)
-        if self.insert_newline or self.literal_block:
-            # Insert a blank before the newline, to avoid
-            # ! LaTeX Error: There's no line here to end.
-            text = text.replace("\n", '~\\\\\n')
-        elif self.mbox_newline:
-            if self.literal_block:
-                closings = "}" * len(self.literal_block_stack)
-                openings = "".join(self.literal_block_stack)
-            else:
-                closings = ""
-                openings = ""
-            text = text.replace("\n", "%s}\\\\\n\\mbox{%s" % (closings,openings))
-        text = text.replace('[', '{[}').replace(']', '{]}')
-        if self.insert_none_breaking_blanks:
-            text = text.replace(' ', '~')
-        if self.latex_encoding != 'utf8':
-            text = self.unicode_to_latex(text)
-            text = self.ensure_math(text)
-        return text
-
-    def attval(self, text,
-               whitespace=re.compile('[\n\r\t\v\f]')):
-        """Cleanse, encode, and return attribute value text."""
-        return self.encode(whitespace.sub(' ', text))
-
-    def astext(self):
-        if self.pdfinfo is not None and self.pdfauthor:
-            self.pdfinfo.append('pdfauthor={%s}' % self.pdfauthor)
-        if self.pdfinfo:
-            pdfinfo = '\\hypersetup{\n' + ',\n'.join(self.pdfinfo) + '\n}\n'
-        else:
-            pdfinfo = ''
-        head = '\\title{%s}\n\\author{%s}\n\\date{%s}\n' % \
-               (self.title,
-                ' \\and\n'.join(['~\\\\\n'.join(author_lines)
-                                 for author_lines in self.author_stack]),
-                self.date)
-        return ''.join(self.head_prefix + [head] + self.head + [pdfinfo]
-                        + self.body_prefix  + self.body + self.body_suffix)
-
-    def visit_Text(self, node):
-        self.body.append(self.encode(node.astext()))
-
-    def depart_Text(self, node):
-        pass
-
-    def visit_address(self, node):
-        self.visit_docinfo_item(node, 'address')
-
-    def depart_address(self, node):
-        self.depart_docinfo_item(node)
-
-    def visit_admonition(self, node, name=''):
-        self.body.append('\\begin{center}\\begin{sffamily}\n')
-        self.body.append('\\fbox{\\parbox{\\admonitionwidth}{\n')
-        if name:
-            self.body.append('\\textbf{\\large '+ self.language.labels[name] + '}\n');
-        self.body.append('\\vspace{2mm}\n')
-
-
-    def depart_admonition(self, node=None):
-        self.body.append('}}\n') # end parbox fbox
-        self.body.append('\\end{sffamily}\n\\end{center}\n');
-
-    def visit_attention(self, node):
-        self.visit_admonition(node, 'attention')
-
-    def depart_attention(self, node):
-        self.depart_admonition()
-
-    def visit_author(self, node):
-        self.visit_docinfo_item(node, 'author')
-
-    def depart_author(self, node):
-        self.depart_docinfo_item(node)
-
-    def visit_authors(self, node):
-        # not used: visit_author is called anyway for each author.
-        pass
-
-    def depart_authors(self, node):
-        pass
-
-    def visit_block_quote(self, node):
-        self.body.append( '\\begin{quote}\n')
-
-    def depart_block_quote(self, node):
-        self.body.append( '\\end{quote}\n')
-
-    def visit_bullet_list(self, node):
-        if 'contents' in self.topic_classes:
-            if self.use_latex_toc:
-                raise nodes.SkipNode
-            self.body.append( '\\begin{list}{}{}\n' )
-        else:
-            self.body.append( '\\begin{itemize}\n' )
-
-    def depart_bullet_list(self, node):
-        if 'contents' in self.topic_classes:
-            self.body.append( '\\end{list}\n' )
-        else:
-            self.body.append( '\\end{itemize}\n' )
-
-    # Imperfect superscript/subscript handling: mathmode italicizes
-    # all letters by default.
-    def visit_superscript(self, node):
-        self.body.append('$^{')
-        self.mathmode = 1
-
-    def depart_superscript(self, node):
-        self.body.append('}$')
-        self.mathmode = 0
-
-    def visit_subscript(self, node):
-        self.body.append('$_{')
-        self.mathmode = 1
-
-    def depart_subscript(self, node):
-        self.body.append('}$')
-        self.mathmode = 0
-
-    def visit_caption(self, node):
-        self.body.append( '\\caption{' )
-
-    def depart_caption(self, node):
-        self.body.append('}')
-
-    def visit_caution(self, node):
-        self.visit_admonition(node, 'caution')
-
-    def depart_caution(self, node):
-        self.depart_admonition()
-
-    def visit_title_reference(self, node):
-        self.body.append( '\\titlereference{' )
-
-    def depart_title_reference(self, node):
-        self.body.append( '}' )
-
-    def visit_citation(self, node):
-        # TODO maybe use cite bibitems
-        if self._use_latex_citations:
-            self.context.append(len(self.body))
-        else:
-            self.body.append('\\begin{figure}[b]')
-            for id in node['ids']:
-                self.body.append('\\hypertarget{%s}' % id)
-
-    def depart_citation(self, node):
-        if self._use_latex_citations:
-            size = self.context.pop()
-            label = self.body[size]
-            text = ''.join(self.body[size+1:])
-            del self.body[size:]
-            self._bibitems.append([label, text])
-        else:
-            self.body.append('\\end{figure}\n')
-
-    def visit_citation_reference(self, node):
-        if self._use_latex_citations:
-            self.body.append('\\cite{')
-            self.inside_citation_reference_label = 1
-        else:
-            href = ''
-            if node.has_key('refid'):
-                href = node['refid']
-            elif node.has_key('refname'):
-                href = self.document.nameids[node['refname']]
-            self.body.append('[\\hyperlink{%s}{' % href)
-
-    def depart_citation_reference(self, node):
-        if self._use_latex_citations:
-            self.body.append('}')
-            self.inside_citation_reference_label = 0
-        else:
-            self.body.append('}]')
-
-    def visit_classifier(self, node):
-        self.body.append( '(\\textbf{' )
-
-    def depart_classifier(self, node):
-        self.body.append( '})\n' )
-
-    def visit_colspec(self, node):
-        self.active_table.visit_colspec(node)
-
-    def depart_colspec(self, node):
-        pass
-
-    def visit_comment(self, node):
-        # Escape end of line by a new comment start in comment text.
-        self.body.append('%% %s \n' % node.astext().replace('\n', '\n% '))
-        raise nodes.SkipNode
-
-    def visit_compound(self, node):
-        pass
-
-    def depart_compound(self, node):
-        pass
-
-    def visit_contact(self, node):
-        self.visit_docinfo_item(node, 'contact')
-
-    def depart_contact(self, node):
-        self.depart_docinfo_item(node)
-
-    def visit_container(self, node):
-        pass
-
-    def depart_container(self, node):
-        pass
-
-    def visit_copyright(self, node):
-        self.visit_docinfo_item(node, 'copyright')
-
-    def depart_copyright(self, node):
-        self.depart_docinfo_item(node)
-
-    def visit_danger(self, node):
-        self.visit_admonition(node, 'danger')
-
-    def depart_danger(self, node):
-        self.depart_admonition()
-
-    def visit_date(self, node):
-        self.visit_docinfo_item(node, 'date')
-
-    def depart_date(self, node):
-        self.depart_docinfo_item(node)
-
-    def visit_decoration(self, node):
-        pass
-
-    def depart_decoration(self, node):
-        pass
-
-    def visit_definition(self, node):
-        pass
-
-    def depart_definition(self, node):
-        self.body.append('\n')
-
-    def visit_definition_list(self, node):
-        self.body.append( '\\begin{description}\n' )
-
-    def depart_definition_list(self, node):
-        self.body.append( '\\end{description}\n' )
-
-    def visit_definition_list_item(self, node):
-        pass
-
-    def depart_definition_list_item(self, node):
-        pass
-
-    def visit_description(self, node):
-        self.body.append( ' ' )
-
-    def depart_description(self, node):
-        pass
-
-    def visit_docinfo(self, node):
-        self.docinfo = []
-        self.docinfo.append('%' + '_'*75 + '\n')
-        self.docinfo.append('\\begin{center}\n')
-        self.docinfo.append('\\begin{tabularx}{\\docinfowidth}{lX}\n')
-
-    def depart_docinfo(self, node):
-        self.docinfo.append('\\end{tabularx}\n')
-        self.docinfo.append('\\end{center}\n')
-        self.body = self.docinfo + self.body
-        # clear docinfo, so field names are no longer appended.
-        self.docinfo = None
-
-    def visit_docinfo_item(self, node, name):
-        if name == 'author':
-            if not self.pdfinfo == None:
-                if not self.pdfauthor:
-                    self.pdfauthor = self.attval(node.astext())
-                else:
-                    self.pdfauthor += self.author_separator + self.attval(node.astext())
-        if self.use_latex_docinfo:
-            if name in ('author', 'organization', 'contact', 'address'):
-                # We attach these to the last author.  If any of them precedes
-                # the first author, put them in a separate "author" group (for
-                # no better semantics).
-                if name == 'author' or not self.author_stack:
-                    self.author_stack.append([])
-                if name == 'address':   # newlines are meaningful
-                    self.insert_newline = 1
-                    text = self.encode(node.astext())
-                    self.insert_newline = 0
-                else:
-                    text = self.attval(node.astext())
-                self.author_stack[-1].append(text)
-                raise nodes.SkipNode
-            elif name == 'date':
-                self.date = self.attval(node.astext())
-                raise nodes.SkipNode
-        self.docinfo.append('\\textbf{%s}: &\n\t' % self.language_label(name))
-        if name == 'address':
-            self.insert_newline = 1
-            self.docinfo.append('{\\raggedright\n')
-            self.context.append(' } \\\\\n')
-        else:
-            self.context.append(' \\\\\n')
-        self.context.append(self.docinfo)
-        self.context.append(len(self.body))
-
-    def depart_docinfo_item(self, node):
-        size = self.context.pop()
-        dest = self.context.pop()
-        tail = self.context.pop()
-        tail = self.body[size:] + [tail]
-        del self.body[size:]
-        dest.extend(tail)
-        # for address we did set insert_newline
-        self.insert_newline = 0
-
-    def visit_doctest_block(self, node):
-        self.body.append( '\\begin{verbatim}' )
-        self.verbatim = 1
-
-    def depart_doctest_block(self, node):
-        self.body.append( '\\end{verbatim}\n' )
-        self.verbatim = 0
-
-    def visit_document(self, node):
-        self.body_prefix.append('\\begin{document}\n')
-        # titled document?
-        if self.use_latex_docinfo or len(node) and isinstance(node[0], nodes.title):
-            self.body_prefix.append('\\maketitle\n')
-            # alternative use titlepage environment.
-            # \begin{titlepage}
-            # ...
-        self.body.append('\n\\setlength{\\locallinewidth}{\\linewidth}\n')
-
-    def depart_document(self, node):
-        # TODO insertion point of bibliography should none automatic.
-        if self._use_latex_citations and len(self._bibitems)>0:
-            if not self.bibtex:
-                widest_label = ""
-                for bi in self._bibitems:
-                    if len(widest_label)<len(bi[0]):
-                        widest_label = bi[0]
-                self.body.append('\n\\begin{thebibliography}{%s}\n'%widest_label)
-                for bi in self._bibitems:
-                    # cite_key: underscores must not be escaped
-                    cite_key = bi[0].replace(r"{\_}","_")
-                    self.body.append('\\bibitem[%s]{%s}{%s}\n' % (bi[0], cite_key, bi[1]))
-                self.body.append('\\end{thebibliography}\n')
-            else:
-                self.body.append('\n\\bibliographystyle{%s}\n' % self.bibtex[0])
-                self.body.append('\\bibliography{%s}\n' % self.bibtex[1])
-
-        self.body_suffix.append('\\end{document}\n')
-
-    def visit_emphasis(self, node):
-        self.body.append('\\emph{')
-        self.literal_block_stack.append('\\emph{')
-
-    def depart_emphasis(self, node):
-        self.body.append('}')
-        self.literal_block_stack.pop()
-
-    def visit_entry(self, node):
-        self.active_table.visit_entry()
-        # cell separation
-        if self.active_table.get_entry_number() == 1:
-            # if the firstrow is a multirow, this actually is the second row.
-            # this gets hairy if rowspans follow each other.
-            if self.active_table.get_rowspan(0):
-                count = 0
-                while self.active_table.get_rowspan(count):
-                    count += 1
-                    self.body.append(' & ')
-                self.active_table.visit_entry() # increment cell count
-        else:
-            self.body.append(' & ')
-
-        # multi{row,column}
-        # IN WORK BUG TODO HACK continues here
-        # multirow in LaTeX simply will enlarge the cell over several rows
-        # (the following n if n is positive, the former if negative).
-        if node.has_key('morerows') and node.has_key('morecols'):
-            raise NotImplementedError('Cells that '
-            'span multiple rows *and* columns are not supported, sorry.')
-        if node.has_key('morerows'):
-            count = node['morerows'] + 1
-            self.active_table.set_rowspan(self.active_table.get_entry_number()-1,count)
-            self.body.append('\\multirow{%d}{%s}{' % \
-                    (count,self.active_table.get_column_width()))
-            self.context.append('}')
-            # BUG following rows must have empty cells.
-        elif node.has_key('morecols'):
-            # the vertical bar before column is missing if it is the first column.
-            # the one after always.
-            if self.active_table.get_entry_number() == 1:
-                bar1 = self.active_table.get_vertical_bar()
-            else:
-                bar1 = ''
-            count = node['morecols'] + 1
-            self.body.append('\\multicolumn{%d}{%sl%s}{' % \
-                    (count, bar1, self.active_table.get_vertical_bar()))
-            self.context.append('}')
-        else:
-            self.context.append('')
-
-        # header / not header
-        if isinstance(node.parent.parent, nodes.thead):
-            self.body.append('\\textbf{')
-            self.context.append('}')
-        elif self.active_table.is_stub_column():
-            self.body.append('\\textbf{')
-            self.context.append('}')
-        else:
-            self.context.append('')
-
-    def depart_entry(self, node):
-        self.body.append(self.context.pop()) # header / not header
-        self.body.append(self.context.pop()) # multirow/column
-        # if following row is spanned from above.
-        if self.active_table.get_rowspan(self.active_table.get_entry_number()):
-           self.body.append(' & ')
-           self.active_table.visit_entry() # increment cell count
-
-    def visit_row(self, node):
-        self.active_table.visit_row()
-
-    def depart_row(self, node):
-        self.body.extend(self.active_table.depart_row())
-
-    def visit_enumerated_list(self, node):
-        # We create our own enumeration list environment.
-        # This allows to set the style and starting value
-        # and unlimited nesting.
-        enum_style = {'arabic':'arabic',
-                'loweralpha':'alph',
-                'upperalpha':'Alph',
-                'lowerroman':'roman',
-                'upperroman':'Roman' }
-        enum_suffix = ""
-        if node.has_key('suffix'):
-            enum_suffix = node['suffix']
-        enum_prefix = ""
-        if node.has_key('prefix'):
-            enum_prefix = node['prefix']
-        if self.compound_enumerators:
-            pref = ""
-            if self.section_prefix_for_enumerators and self.section_level:
-                for i in range(self.section_level):
-                    pref += '%d.' % self._section_number[i]
-                pref = pref[:-1] + self.section_enumerator_separator
-                enum_prefix += pref
-            for ctype, cname in self._enumeration_counters:
-                enum_prefix += '\\%s{%s}.' % (ctype, cname)
-        enum_type = "arabic"
-        if node.has_key('enumtype'):
-            enum_type = node['enumtype']
-        if enum_style.has_key(enum_type):
-            enum_type = enum_style[enum_type]
-
-        counter_name = "listcnt%d" % len(self._enumeration_counters)
-        self._enumeration_counters.append((enum_type, counter_name))
-        # If we haven't used this counter name before, then create a
-        # new counter; otherwise, reset & reuse the old counter.
-        if len(self._enumeration_counters) > self._max_enumeration_counters:
-            self._max_enumeration_counters = len(self._enumeration_counters)
-            self.body.append('\\newcounter{%s}\n' % counter_name)
-        else:
-            self.body.append('\\setcounter{%s}{0}\n' % counter_name)
-            
-        self.body.append('\\begin{list}{%s\\%s{%s}%s}\n' % \
-            (enum_prefix,enum_type,counter_name,enum_suffix))
-        self.body.append('{\n')
-        self.body.append('\\usecounter{%s}\n' % counter_name)
-        # set start after usecounter, because it initializes to zero.
-        if node.has_key('start'):
-            self.body.append('\\addtocounter{%s}{%d}\n' \
-                    % (counter_name,node['start']-1))
-        ## set rightmargin equal to leftmargin
-        self.body.append('\\setlength{\\rightmargin}{\\leftmargin}\n')
-        self.body.append('}\n')
-
-    def depart_enumerated_list(self, node):
-        self.body.append('\\end{list}\n')
-        self._enumeration_counters.pop()
-
-    def visit_error(self, node):
-        self.visit_admonition(node, 'error')
-
-    def depart_error(self, node):
-        self.depart_admonition()
-
-    def visit_field(self, node):
-        # real output is done in siblings: _argument, _body, _name
-        pass
-
-    def depart_field(self, node):
-        self.body.append('\n')
-        ##self.body.append('%[depart_field]\n')
-
-    def visit_field_argument(self, node):
-        self.body.append('%[visit_field_argument]\n')
-
-    def depart_field_argument(self, node):
-        self.body.append('%[depart_field_argument]\n')
-
-    def visit_field_body(self, node):
-        # BUG by attach as text we loose references.
-        if self.docinfo:
-            self.docinfo.append('%s \\\\\n' % self.encode(node.astext()))
-            raise nodes.SkipNode
-        # BUG: what happens if not docinfo
-
-    def depart_field_body(self, node):
-        self.body.append( '\n' )
-
-    def visit_field_list(self, node):
-        if not self.docinfo:
-            self.body.append('\\begin{quote}\n')
-            self.body.append('\\begin{description}\n')
-
-    def depart_field_list(self, node):
-        if not self.docinfo:
-            self.body.append('\\end{description}\n')
-            self.body.append('\\end{quote}\n')
-
-    def visit_field_name(self, node):
-        # BUG this duplicates docinfo_item
-        if self.docinfo:
-            self.docinfo.append('\\textbf{%s}: &\n\t' % self.encode(node.astext()))
-            raise nodes.SkipNode
-        else:
-            self.body.append('\\item [')
-
-    def depart_field_name(self, node):
-        if not self.docinfo:
-            self.body.append(':]')
-
-    def visit_figure(self, node):
-        if (not node.attributes.has_key('align') or
-            node.attributes['align'] == 'center'):
-            # centering does not add vertical space like center.
-            align = '\n\\centering'
-            align_end = ''
-        else:
-            # TODO non vertical space for other alignments.
-            align = '\\begin{flush%s}' % node.attributes['align']
-            align_end = '\\end{flush%s}' % node.attributes['align']
-        self.body.append( '\\begin{figure}[htbp]%s\n' % align )
-        self.context.append( '%s\\end{figure}\n' % align_end )
-
-    def depart_figure(self, node):
-        self.body.append( self.context.pop() )
-
-    def visit_footer(self, node):
-        self.context.append(len(self.body))
-
-    def depart_footer(self, node):
-        start = self.context.pop()
-        footer = (['\n\\begin{center}\small\n']
-                  + self.body[start:] + ['\n\\end{center}\n'])
-        self.body_suffix[:0] = footer
-        del self.body[start:]
-
-    def visit_footnote(self, node):
-        if self.use_latex_footnotes:
-            num,text = node.astext().split(None,1)
-            num = self.encode(num.strip())
-            self.body.append('\\footnotetext['+num+']')
-            self.body.append('{')
-        else:
-            self.body.append('\\begin{figure}[b]')
-            for id in node['ids']:
-                self.body.append('\\hypertarget{%s}' % id)
-
-    def depart_footnote(self, node):
-        if self.use_latex_footnotes:
-            self.body.append('}\n')
-        else:
-            self.body.append('\\end{figure}\n')
-
-    def visit_footnote_reference(self, node):
-        if self.use_latex_footnotes:
-            self.body.append("\\footnotemark["+self.encode(node.astext())+"]")
-            raise nodes.SkipNode
-        href = ''
-        if node.has_key('refid'):
-            href = node['refid']
-        elif node.has_key('refname'):
-            href = self.document.nameids[node['refname']]
-        format = self.settings.footnote_references
-        if format == 'brackets':
-            suffix = '['
-            self.context.append(']')
-        elif format == 'superscript':
-            suffix = '\\raisebox{.5em}[0em]{\\scriptsize'
-            self.context.append('}')
-        else:                           # shouldn't happen
-            raise AssertionError('Illegal footnote reference format.')
-        self.body.append('%s\\hyperlink{%s}{' % (suffix,href))
-
-    def depart_footnote_reference(self, node):
-        if self.use_latex_footnotes:
-            return
-        self.body.append('}%s' % self.context.pop())
-
-    # footnote/citation label
-    def label_delim(self, node, bracket, superscript):
-        if isinstance(node.parent, nodes.footnote):
-            if self.use_latex_footnotes:
-                raise nodes.SkipNode
-            if self.settings.footnote_references == 'brackets':
-                self.body.append(bracket)
-            else:
-                self.body.append(superscript)
-        else:
-            assert isinstance(node.parent, nodes.citation)
-            if not self._use_latex_citations:
-                self.body.append(bracket)
-
-    def visit_label(self, node):
-        self.label_delim(node, '[', '$^{')
-
-    def depart_label(self, node):
-        self.label_delim(node, ']', '}$')
-
-    # elements generated by the framework e.g. section numbers.
-    def visit_generated(self, node):
-        pass
-
-    def depart_generated(self, node):
-        pass
-
-    def visit_header(self, node):
-        self.context.append(len(self.body))
-
-    def depart_header(self, node):
-        start = self.context.pop()
-        self.body_prefix.append('\n\\verb|begin_header|\n')
-        self.body_prefix.extend(self.body[start:])
-        self.body_prefix.append('\n\\verb|end_header|\n')
-        del self.body[start:]
-
-    def visit_hint(self, node):
-        self.visit_admonition(node, 'hint')
-
-    def depart_hint(self, node):
-        self.depart_admonition()
-
-    def latex_image_length(self, width_str):
-        match = re.match('(\d*\.?\d*)\s*(\S*)', width_str)
-        if not match:
-            # fallback
-            return width_str
-        res = width_str
-        amount, unit = match.groups()[:2]
-        if unit == "px":
-            # LaTeX does not know pixels but points
-            res = "%spt" % amount
-        elif unit == "%":
-            res = "%.3f\\linewidth" % (float(amount)/100.0)
-        return res
-
-    def visit_image(self, node):
-        attrs = node.attributes
-        # Add image URI to dependency list, assuming that it's
-        # referring to a local file.
-        self.settings.record_dependencies.add(attrs['uri'])
-        pre = []                        # in reverse order
-        post = []
-        include_graphics_options = []
-        inline = isinstance(node.parent, nodes.TextElement)
-        if attrs.has_key('scale'):
-            # Could also be done with ``scale`` option to
-            # ``\includegraphics``; doing it this way for consistency.
-            pre.append('\\scalebox{%f}{' % (attrs['scale'] / 100.0,))
-            post.append('}')
-        if attrs.has_key('width'):
-            include_graphics_options.append('width=%s' % (
-                            self.latex_image_length(attrs['width']), ))
-        if attrs.has_key('height'):
-            include_graphics_options.append('height=%s' % (
-                            self.latex_image_length(attrs['height']), ))
-        if attrs.has_key('align'):
-            align_prepost = {
-                # By default latex aligns the top of an image.
-                (1, 'top'): ('', ''),
-                (1, 'middle'): ('\\raisebox{-0.5\\height}{', '}'),
-                (1, 'bottom'): ('\\raisebox{-\\height}{', '}'),
-                (0, 'center'): ('{\\hfill', '\\hfill}'),
-                # These 2 don't exactly do the right thing.  The image should
-                # be floated alongside the paragraph.  See
-                # http://www.w3.org/TR/html4/struct/objects.html#adef-align-IMG
-                (0, 'left'): ('{', '\\hfill}'),
-                (0, 'right'): ('{\\hfill', '}'),}
-            try:
-                pre.append(align_prepost[inline, attrs['align']][0])
-                post.append(align_prepost[inline, attrs['align']][1])
-            except KeyError:
-                pass                    # XXX complain here?
-        if not inline:
-            pre.append('\n')
-            post.append('\n')
-        pre.reverse()
-        self.body.extend( pre )
-        options = ''
-        if len(include_graphics_options)>0:
-            options = '[%s]' % (','.join(include_graphics_options))
-        self.body.append( '\\includegraphics%s{%s}' % (
-                            options, attrs['uri'] ) )
-        self.body.extend( post )
-
-    def depart_image(self, node):
-        pass
-
-    def visit_important(self, node):
-        self.visit_admonition(node, 'important')
-
-    def depart_important(self, node):
-        self.depart_admonition()
-
-    def visit_interpreted(self, node):
-        # @@@ Incomplete, pending a proper implementation on the
-        # Parser/Reader end.
-        self.visit_literal(node)
-
-    def depart_interpreted(self, node):
-        self.depart_literal(node)
-
-    def visit_legend(self, node):
-        self.body.append('{\\small ')
-
-    def depart_legend(self, node):
-        self.body.append('}')
-
-    def visit_line(self, node):
-        self.body.append('\item[] ')
-
-    def depart_line(self, node):
-        self.body.append('\n')
-
-    def visit_line_block(self, node):
-        if isinstance(node.parent, nodes.line_block):
-            self.body.append('\\item[] \n'
-                             '\\begin{lineblock}{\\lineblockindentation}\n')
-        else:
-            self.body.append('\n\\begin{lineblock}{0em}\n')
-
-    def depart_line_block(self, node):
-        self.body.append('\\end{lineblock}\n')
-
-    def visit_list_item(self, node):
-        # Append "{}" in case the next character is "[", which would break
-        # LaTeX's list environment (no numbering and the "[" is not printed).
-        self.body.append('\\item {} ')
-
-    def depart_list_item(self, node):
-        self.body.append('\n')
-
-    def visit_literal(self, node):
-        self.literal = 1
-        self.body.append('\\texttt{')
-
-    def depart_literal(self, node):
-        self.body.append('}')
-        self.literal = 0
-
-    def visit_literal_block(self, node):
-        """
-        Render a literal-block.
-
-        Literal blocks are used for "::"-prefixed literal-indented
-        blocks of text, where the inline markup is not recognized,
-        but are also the product of the parsed-literal directive,
-        where the markup is respected.
-        """
-        # In both cases, we want to use a typewriter/monospaced typeface.
-        # For "real" literal-blocks, we can use \verbatim, while for all
-        # the others we must use \mbox.
-        #
-        # We can distinguish between the two kinds by the number of
-        # siblings that compose this node: if it is composed by a
-        # single element, it's surely either a real one or a
-        # parsed-literal that does not contain any markup.
-        #
-        if not self.active_table.is_open():
-            # no quote inside tables, to avoid vertical space between
-            # table border and literal block.
-            # BUG: fails if normal text preceeds the literal block.
-            self.body.append('\\begin{quote}')
-            self.context.append('\\end{quote}\n')
-        else:
-            self.body.append('\n')
-            self.context.append('\n')
-        if (self.settings.use_verbatim_when_possible and (len(node) == 1)
-              # in case of a parsed-literal containing just a "**bold**" word:
-              and isinstance(node[0], nodes.Text)):
-            self.verbatim = 1
-            self.body.append('\\begin{verbatim}\n')
-        else:
-            self.literal_block = 1
-            self.insert_none_breaking_blanks = 1
-            self.body.append('{\\ttfamily \\raggedright \\noindent\n')
-            # * obey..: is from julien and never worked for me (grubert).
-            #   self.body.append('{\\obeylines\\obeyspaces\\ttfamily\n')
-
-    def depart_literal_block(self, node):
-        if self.verbatim:
-            self.body.append('\n\\end{verbatim}\n')
-            self.verbatim = 0
-        else:
-            self.body.append('\n}')
-            self.insert_none_breaking_blanks = 0
-            self.literal_block = 0
-            # obey end: self.body.append('}\n')
-        self.body.append(self.context.pop())
-
-    def visit_meta(self, node):
-        self.body.append('[visit_meta]\n')
-        # BUG maybe set keywords for pdf
-        ##self.head.append(self.starttag(node, 'meta', **node.attributes))
-
-    def depart_meta(self, node):
-        self.body.append('[depart_meta]\n')
-
-    def visit_note(self, node):
-        self.visit_admonition(node, 'note')
-
-    def depart_note(self, node):
-        self.depart_admonition()
-
-    def visit_option(self, node):
-        if self.context[-1]:
-            # this is not the first option
-            self.body.append(', ')
-
-    def depart_option(self, node):
-        # flag tha the first option is done.
-        self.context[-1] += 1
-
-    def visit_option_argument(self, node):
-        """The delimiter betweeen an option and its argument."""
-        self.body.append(node.get('delimiter', ' '))
-
-    def depart_option_argument(self, node):
-        pass
-
-    def visit_option_group(self, node):
-        self.body.append('\\item [')
-        # flag for first option
-        self.context.append(0)
-
-    def depart_option_group(self, node):
-        self.context.pop() # the flag
-        self.body.append('] ')
-
-    def visit_option_list(self, node):
-        self.body.append('\\begin{optionlist}{3cm}\n')
-
-    def depart_option_list(self, node):
-        self.body.append('\\end{optionlist}\n')
-
-    def visit_option_list_item(self, node):
-        pass
-
-    def depart_option_list_item(self, node):
-        pass
-
-    def visit_option_string(self, node):
-        ##self.body.append(self.starttag(node, 'span', '', CLASS='option'))
-        pass
-
-    def depart_option_string(self, node):
-        ##self.body.append('</span>')
-        pass
-
-    def visit_organization(self, node):
-        self.visit_docinfo_item(node, 'organization')
-
-    def depart_organization(self, node):
-        self.depart_docinfo_item(node)
-
-    def visit_paragraph(self, node):
-        index = node.parent.index(node)
-        if not ('contents' in self.topic_classes or
-                (isinstance(node.parent, nodes.compound) and
-                 index > 0 and
-                 not isinstance(node.parent[index - 1], nodes.paragraph) and
-                 not isinstance(node.parent[index - 1], nodes.compound))):
-            self.body.append('\n')
-
-    def depart_paragraph(self, node):
-        self.body.append('\n')
-
-    def visit_problematic(self, node):
-        self.body.append('{\\color{red}\\bfseries{}')
-
-    def depart_problematic(self, node):
-        self.body.append('}')
-
-    def visit_raw(self, node):
-        if 'latex' in node.get('format', '').split():
-            self.body.append(node.astext())
-        raise nodes.SkipNode
-
-    def visit_reference(self, node):
-        # BUG: hash_char "#" is trouble some in LaTeX.
-        # mbox and other environment do not like the '#'.
-        hash_char = '\\#'
-        if node.has_key('refuri'):
-            href = node['refuri'].replace('#',hash_char)
-        elif node.has_key('refid'):
-            href = hash_char + node['refid']
-        elif node.has_key('refname'):
-            href = hash_char + self.document.nameids[node['refname']]
-        else:
-            raise AssertionError('Unknown reference.')
-        self.body.append('\\href{%s}{' % href)
-        if self._reference_label and not node.has_key('refuri'):
-            self.body.append('\\%s{%s}}' % (self._reference_label,
-                        href.replace(hash_char, '')))
-            raise nodes.SkipNode
-
-    def depart_reference(self, node):
-        self.body.append('}')
-
-    def visit_revision(self, node):
-        self.visit_docinfo_item(node, 'revision')
-
-    def depart_revision(self, node):
-        self.depart_docinfo_item(node)
-
-    def visit_section(self, node):
-        self.section_level += 1
-        # Initialize counter for potential subsections:
-        self._section_number.append(0)
-        # Counter for this section's level (initialized by parent section):
-        self._section_number[self.section_level - 1] += 1
-
-    def depart_section(self, node):
-        # Remove counter for potential subsections:
-        self._section_number.pop()
-        self.section_level -= 1
-
-    def visit_sidebar(self, node):
-        # BUG:  this is just a hack to make sidebars render something
-        self.body.append('\n\\setlength{\\locallinewidth}{0.9\\admonitionwidth}\n')
-        self.body.append('\\begin{center}\\begin{sffamily}\n')
-        self.body.append('\\fbox{\\colorbox[gray]{0.80}{\\parbox{\\admonitionwidth}{\n')
-
-    def depart_sidebar(self, node):
-        self.body.append('}}}\n') # end parbox colorbox fbox
-        self.body.append('\\end{sffamily}\n\\end{center}\n');
-        self.body.append('\n\\setlength{\\locallinewidth}{\\linewidth}\n')
-
-
-    attribution_formats = {'dash': ('---', ''),
-                           'parentheses': ('(', ')'),
-                           'parens': ('(', ')'),
-                           'none': ('', '')}
-
-    def visit_attribution(self, node):
-        prefix, suffix = self.attribution_formats[self.settings.attribution]
-        self.body.append('\n\\begin{flushright}\n')
-        self.body.append(prefix)
-        self.context.append(suffix)
-
-    def depart_attribution(self, node):
-        self.body.append(self.context.pop() + '\n')
-        self.body.append('\\end{flushright}\n')
-
-    def visit_status(self, node):
-        self.visit_docinfo_item(node, 'status')
-
-    def depart_status(self, node):
-        self.depart_docinfo_item(node)
-
-    def visit_strong(self, node):
-        self.body.append('\\textbf{')
-        self.literal_block_stack.append('\\textbf{')
-
-    def depart_strong(self, node):
-        self.body.append('}')
-        self.literal_block_stack.pop()
-
-    def visit_substitution_definition(self, node):
-        raise nodes.SkipNode
-
-    def visit_substitution_reference(self, node):
-        self.unimplemented_visit(node)
-
-    def visit_subtitle(self, node):
-        if isinstance(node.parent, nodes.sidebar):
-            self.body.append('~\\\\\n\\textbf{')
-            self.context.append('}\n\\smallskip\n')
-        elif isinstance(node.parent, nodes.document):
-            self.title = self.title + \
-                '\\\\\n\\large{%s}\n' % self.encode(node.astext())
-            raise nodes.SkipNode
-        elif isinstance(node.parent, nodes.section):
-            self.body.append('\\textbf{')
-            self.context.append('}\\vspace{0.2cm}\n\n\\noindent ')
-
-    def depart_subtitle(self, node):
-        self.body.append(self.context.pop())
-
-    def visit_system_message(self, node):
-        pass
-
-    def depart_system_message(self, node):
-        self.body.append('\n')
-
-    def visit_table(self, node):
-        if self.active_table.is_open():
-            self.table_stack.append(self.active_table)
-            # nesting longtable does not work (e.g. 2007-04-18)
-            self.active_table = Table('tabular',self.settings.table_style)
-        self.active_table.open()
-        for cl in node['classes']:
-            self.active_table.set_table_style(cl)
-        self.body.append('\n' + self.active_table.get_opening())
-
-    def depart_table(self, node):
-        self.body.append(self.active_table.get_closing() + '\n')
-        self.active_table.close()
-        if len(self.table_stack)>0:
-            self.active_table = self.table_stack.pop()
-        else:
-            self.active_table.set_table_style(self.settings.table_style)
-
-    def visit_target(self, node):
-        # BUG: why not (refuri or refid or refname) means not footnote ?
-        if not (node.has_key('refuri') or node.has_key('refid')
-                or node.has_key('refname')):
-            for id in node['ids']:
-                self.body.append('\\hypertarget{%s}{' % id)
-            self.context.append('}' * len(node['ids']))
-        elif node.get("refid"):
-            self.body.append('\\hypertarget{%s}{' % node.get("refid"))
-            self.context.append('}')
-        else:
-            self.context.append('')
-
-    def depart_target(self, node):
-        self.body.append(self.context.pop())
-
-    def visit_tbody(self, node):
-        # BUG write preamble if not yet done (colspecs not [])
-        # for tables without heads.
-        if not self.active_table.get('preamble written'):
-            self.visit_thead(None)
-            # self.depart_thead(None)
-
-    def depart_tbody(self, node):
-        pass
-
-    def visit_term(self, node):
-        self.body.append('\\item[{')
-
-    def depart_term(self, node):
-        # definition list term.
-        # \leavevmode results in a line break if the term is followed by a item list.
-        self.body.append('}] \leavevmode ')
-
-    def visit_tgroup(self, node):
-        #self.body.append(self.starttag(node, 'colgroup'))
-        #self.context.append('</colgroup>\n')
-        pass
-
-    def depart_tgroup(self, node):
-        pass
-
-    def visit_thead(self, node):
-        self.body.append('{%s}\n' % self.active_table.get_colspecs())
-        if self.active_table.caption:
-            self.body.append('\\caption{%s}\\\\\n' % self.active_table.caption)
-        self.active_table.set('preamble written',1)
-        # TODO longtable supports firsthead and lastfoot too.
-        self.body.extend(self.active_table.visit_thead())
-
-    def depart_thead(self, node):
-        # the table header written should be on every page
-        # => \endhead
-        self.body.extend(self.active_table.depart_thead())
-        # and the firsthead => \endfirsthead
-        # BUG i want a "continued from previous page" on every not
-        # firsthead, but then we need the header twice.
-        #
-        # there is a \endfoot and \endlastfoot too.
-        # but we need the number of columns to
-        # self.body.append('\\multicolumn{%d}{c}{"..."}\n' % number_of_columns)
-        # self.body.append('\\hline\n\\endfoot\n')
-        # self.body.append('\\hline\n')
-        # self.body.append('\\endlastfoot\n')
-
-    def visit_tip(self, node):
-        self.visit_admonition(node, 'tip')
-
-    def depart_tip(self, node):
-        self.depart_admonition()
-
-    def bookmark(self, node):
-        """Append latex href and pdfbookmarks for titles.
-        """
-        if node.parent['ids']:
-            for id in node.parent['ids']:
-                self.body.append('\\hypertarget{%s}{}\n' % id)
-            if not self.use_latex_toc:
-                # BUG level depends on style. pdflatex allows level 0 to 3
-                # ToC would be the only on level 0 so i choose to decrement the rest.
-                # "Table of contents" bookmark to see the ToC. To avoid this
-                # we set all zeroes to one.
-                l = self.section_level
-                if l>0:
-                    l = l-1
-                # pdftex does not like "_" subscripts in titles
-                text = self.encode(node.astext())
-                for id in node.parent['ids']:
-                    self.body.append('\\pdfbookmark[%d]{%s}{%s}\n' % \
-                                     (l, text, id))
-
-    def visit_title(self, node):
-        """Section and other titles."""
-
-        if isinstance(node.parent, nodes.topic):
-            # the table of contents.
-            self.bookmark(node)
-            if ('contents' in self.topic_classes
-            and self.use_latex_toc):
-                self.body.append('\\renewcommand{\\contentsname}{')
-                self.context.append('}\n\\tableofcontents\n\n\\bigskip\n')
-            elif ('abstract' in self.topic_classes
-            and self.settings.use_latex_abstract):
-                raise nodes.SkipNode
-            else: # or section titles before the table of contents.
-                # BUG: latex chokes on center environment with 
-                # "perhaps a missing item", therefore we use hfill.
-                self.body.append('\\subsubsection*{~\\hfill ')
-                # the closing brace for subsection.
-                self.context.append('\\hfill ~}\n')
-        # TODO: for admonition titles before the first section
-        # either specify every possible node or ... ?
-        elif isinstance(node.parent, nodes.sidebar) \
-        or isinstance(node.parent, nodes.admonition):
-            self.body.append('\\textbf{\\large ')
-            self.context.append('}\n\\smallskip\n')
-        elif isinstance(node.parent, nodes.table):
-            # caption must be written after column spec
-            self.active_table.caption = self.encode(node.astext())
-            raise nodes.SkipNode
-        elif self.section_level == 0:
-            # document title
-            self.title = self.encode(node.astext())
-            if not self.pdfinfo == None:
-                self.pdfinfo.append( 'pdftitle={%s}' % self.encode(node.astext()) )
-            raise nodes.SkipNode
-        else:
-            self.body.append('\n\n')
-            self.body.append('%' + '_' * 75)
-            self.body.append('\n\n')
-            self.bookmark(node)
-
-            if self.use_latex_toc:
-                section_star = ""
-            else:
-                section_star = "*"
-
-            section_name = self.d_class.section(self.section_level)
-            self.body.append('\\%s%s{' % (section_name, section_star))
-            # MAYBE postfix paragraph and subparagraph with \leavemode to
-            # ensure floatables stay in the section and text starts on a new line.
-            self.context.append('}\n')
-
-    def depart_title(self, node):
-        self.body.append(self.context.pop())
-        for id in node.parent['ids']:
-            self.body.append('\\label{%s}\n' % id)
-
-    def visit_topic(self, node):
-        self.topic_classes = node['classes']
-        if ('abstract' in self.topic_classes
-            and self.settings.use_latex_abstract):
-            self.body.append('\\begin{abstract}\n')
-
-    def depart_topic(self, node):
-        if ('abstract' in self.topic_classes
-            and self.settings.use_latex_abstract):
-            self.body.append('\\end{abstract}\n')
-        self.topic_classes = []
-        if 'contents' in node['classes'] and self.use_latex_toc:
-            pass
-        else:
-            self.body.append('\n')
-
-    def visit_inline(self, node): # titlereference
-        classes = node.get('classes', ['Unknown', ])
-        for cls in classes:
-            self.body.append( '\\docutilsrole%s{' % cls)
-        self.context.append('}'*len(classes))
-
-    def depart_inline(self, node):
-        self.body.append(self.context.pop())
-
-    def visit_rubric(self, node):
-        self.body.append('\\rubric{')
-        self.context.append('}\n')
-
-    def depart_rubric(self, node):
-        self.body.append(self.context.pop())
-
-    def visit_transition(self, node):
-        self.body.append('\n\n')
-        self.body.append('%' + '_' * 75)
-        self.body.append('\n\\hspace*{\\fill}\\hrulefill\\hspace*{\\fill}')
-        self.body.append('\n\n')
-
-    def depart_transition(self, node):
-        pass
-
-    def visit_version(self, node):
-        self.visit_docinfo_item(node, 'version')
-
-    def depart_version(self, node):
-        self.depart_docinfo_item(node)
-
-    def visit_warning(self, node):
-        self.visit_admonition(node, 'warning')
-
-    def depart_warning(self, node):
-        self.depart_admonition()
-
-    def unimplemented_visit(self, node):
-        raise NotImplementedError('visiting unimplemented node type: %s'
-                                  % node.__class__.__name__)
-
-#    def unknown_visit(self, node):
-#    def default_visit(self, node):
-
-# vim: set ts=4 et ai :
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/latex2e/latex2e.tex	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-% latex include file for docutils latex writer
-% --------------------------------------------
-%
-% CVS: $Id: latex2e.tex 4163 2005-12-09 04:21:34Z goodger $
-%
-% This is included at the end of the latex header in the generated file,
-% to allow overwriting defaults, although this could get hairy.
-% Generated files should process well standalone too, LaTeX might give a
-% message about a missing file.
-
-% donot indent first line of paragraph.
-\setlength{\parindent}{0pt}
-\setlength{\parskip}{5pt plus 2pt minus 1pt}
-
-% sloppy
-% ------
-% Less strict (opposite to default fussy) space size between words. Therefore
-% less hyphenation.
-\sloppy
-
-% fonts
-% -----
-% times for pdf generation, gives smaller pdf files.
-%
-% But in standard postscript fonts: courier and times/helvetica do not fit.
-% Maybe use pslatex.
-\usepackage{times}
-
-% pagestyle
-% ---------
-% headings might put section titles in the page heading, but not if
-% the table of contents is done by docutils.
-% If pagestyle{headings} is used, \geometry{headheight=10pt,headsep=1pt}
-% should be set too.
-%\pagestyle{plain}
-%
-% or use fancyhdr (untested !)
-%\usepackage{fancyhdr}
-%\pagestyle{fancy}
-%\addtolength{\headheight}{\\baselineskip}
-%\renewcommand{\sectionmark}[1]{\markboth{#1}{}}
-%\renewcommand{\subsectionmark}[1]{\markright{#1}}
-%\fancyhf{}
-%\fancyhead[LE,RO]{\\bfseries\\textsf{\Large\\thepage}}
-%\fancyhead[LO]{\\textsf{\\footnotesize\\rightmark}}
-%\fancyhead[RE]{\\textsc{\\textsf{\\footnotesize\leftmark}}}
-%\\fancyfoot[LE,RO]{\\bfseries\\textsf{\scriptsize Docutils}}
-%\fancyfoot[RE,LO]{\\textsf{\scriptsize\\today}}
-
-% geometry 
-% --------
-% = papersizes and margins
-%\geometry{a4paper,twoside,tmargin=1.5cm,
-%          headheight=1cm,headsep=0.75cm}
-
-% Do section number display
-% -------------------------
-%\makeatletter
-%\def\@seccntformat#1{}
-%\makeatother
-% no numbers in toc
-%\renewcommand{\numberline}[1]{}
-
-
-% change maketitle
-% ----------------
-%\renewcommand{\maketitle}{
-%  \begin{titlepage}
-%    \begin{center}
-%    \textsf{TITLE \@title} \\
-%       Date: \today
-%    \end{center}
-%  \end{titlepage}
-%}
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,825 +0,0 @@
-# $Id: __init__.py 5174 2007-05-31 00:01:52Z wiemann $
-# Author: Lea Wiemann <LeWiemann@gmail.com>
-# Copyright: This module has been placed in the public domain.
-
-"""
-LaTeX2e document tree Writer.
-"""
-
-# Thanks to Engelbert Gruber and various contributors for the original
-# LaTeX writer, some code and many ideas of which have been used for
-# this writer.
-
-__docformat__ = 'reStructuredText'
-
-
-import re
-import os.path
-from types import ListType
-
-import docutils
-from docutils import nodes, writers, utils
-from docutils.writers.newlatex2e import unicode_map
-from docutils.transforms import writer_aux
-
-
-class Writer(writers.Writer):
-
-    supported = ('newlatex', 'newlatex2e')
-    """Formats this writer supports."""
-
-    default_stylesheet = 'base.tex'
-
-    default_stylesheet_path = utils.relative_path(
-        os.path.join(os.getcwd(), 'dummy'),
-        os.path.join(os.path.dirname(__file__), default_stylesheet))
-
-    settings_spec = (
-        'LaTeX-Specific Options',
-        'Note that this LaTeX writer is still EXPERIMENTAL and not '
-        'feature-complete. ',
-        (('Specify a stylesheet file.  The path is used verbatim to include '
-          'the file.  Overrides --stylesheet-path.',
-          ['--stylesheet'],
-          {'default': '', 'metavar': '<file>',
-           'overrides': 'stylesheet_path'}),
-         ('Specify a stylesheet file, relative to the current working '
-          'directory.  Overrides --stylesheet.  Default: "%s"'
-          % default_stylesheet_path,
-          ['--stylesheet-path'],
-          {'metavar': '<file>', 'overrides': 'stylesheet',
-           'default': default_stylesheet_path}),
-         ('Specify a user stylesheet file.  See --stylesheet.',
-          ['--user-stylesheet'],
-          {'default': '', 'metavar': '<file>',
-           'overrides': 'user_stylesheet_path'}),
-         ('Specify a user stylesheet file.  See --stylesheet-path.',
-          ['--user-stylesheet-path'],
-          {'metavar': '<file>', 'overrides': 'user_stylesheet'})
-         ),)
-
-    settings_defaults = {
-        # Many Unicode characters are provided by unicode_map.py, so
-        # we can default to latin-1.
-        'output_encoding': 'latin-1',
-        'output_encoding_error_handler': 'strict',
-        # Since we are using superscript footnotes, it is necessary to
-        # trim whitespace in front of footnote references.
-        'trim_footnote_reference_space': 1,
-        # Currently unsupported:
-        'docinfo_xform': 0,
-        # During development:
-        'traceback': 1
-        }
-
-    relative_path_settings = ('stylesheet_path', 'user_stylesheet_path')
-
-    config_section = 'newlatex2e writer'
-    config_section_dependencies = ('writers',)
-
-    output = None
-    """Final translated form of `document`."""
-
-    def get_transforms(self):
-        return writers.Writer.get_transforms(self) + [
-            writer_aux.Compound, writer_aux.Admonitions]
-
-    def __init__(self):
-        writers.Writer.__init__(self)
-        self.translator_class = LaTeXTranslator
-
-    def translate(self):
-        visitor = self.translator_class(self.document)
-        self.document.walkabout(visitor)
-        assert not visitor.context, 'context not empty: %s' % visitor.context
-        self.output = visitor.astext()
-        self.head = visitor.header
-        self.body = visitor.body
-
-
-class LaTeXException(Exception):
-    """
-    Exception base class to for exceptions which influence the
-    automatic generation of LaTeX code.
-    """
-
-
-class SkipAttrParentLaTeX(LaTeXException):
-    """
-    Do not generate ``\DECattr`` and ``\renewcommand{\DEVparent}{...}`` for this
-    node.
-
-    To be raised from ``before_...`` methods.
-    """
-
-
-class SkipParentLaTeX(LaTeXException):
-    """
-    Do not generate ``\renewcommand{\DEVparent}{...}`` for this node.
-
-    To be raised from ``before_...`` methods.
-    """
-
-
-class LaTeXTranslator(nodes.SparseNodeVisitor):
-
-    # Country code by a.schlock.
-    # Partly manually converted from iso and babel stuff.
-    iso639_to_babel = {
-        'no': 'norsk',     # added by hand
-        'gd': 'scottish',  # added by hand
-        'sl': 'slovenian',
-        'af': 'afrikaans',
-        'bg': 'bulgarian',
-        'br': 'breton',
-        'ca': 'catalan',
-        'cs': 'czech',
-        'cy': 'welsh',
-        'da': 'danish',
-        'fr': 'french',
-        # french, francais, canadien, acadian
-        'de': 'ngerman',
-        # ngerman, naustrian, german, germanb, austrian
-        'el': 'greek',
-        'en': 'english',
-        # english, USenglish, american, UKenglish, british, canadian
-        'eo': 'esperanto',
-        'es': 'spanish',
-        'et': 'estonian',
-        'eu': 'basque',
-        'fi': 'finnish',
-        'ga': 'irish',
-        'gl': 'galician',
-        'he': 'hebrew',
-        'hr': 'croatian',
-        'hu': 'hungarian',
-        'is': 'icelandic',
-        'it': 'italian',
-        'la': 'latin',
-        'nl': 'dutch',
-        'pl': 'polish',
-        'pt': 'portuguese',
-        'ro': 'romanian',
-        'ru': 'russian',
-        'sk': 'slovak',
-        'sr': 'serbian',
-        'sv': 'swedish',
-        'tr': 'turkish',
-        'uk': 'ukrainian'
-    }
-
-    # Start with left double quote.
-    left_quote = 1
-
-    def __init__(self, document):
-        nodes.NodeVisitor.__init__(self, document)
-        self.settings = document.settings
-        self.header = []
-        self.body = []
-        self.context = []
-        self.stylesheet_path = utils.get_stylesheet_reference(
-            self.settings, os.path.join(os.getcwd(), 'dummy'))
-        if self.stylesheet_path:
-            self.settings.record_dependencies.add(self.stylesheet_path)
-        # This ugly hack will be cleaned up when refactoring the
-        # stylesheet mess.
-        self.settings.stylesheet = self.settings.user_stylesheet
-        self.settings.stylesheet_path = self.settings.user_stylesheet_path
-        self.user_stylesheet_path = utils.get_stylesheet_reference(
-            self.settings, os.path.join(os.getcwd(), 'dummy'))
-        if self.user_stylesheet_path:
-            self.settings.record_dependencies.add(self.user_stylesheet_path)
-        self.write_header()
-
-    def write_header(self):
-        a = self.header.append
-        a('%% Generated by Docutils %s <http://docutils.sourceforge.net>.'
-          % docutils.__version__)
-        a('')
-        a('% Docutils settings:')
-        lang = self.settings.language_code or ''
-        a(r'\providecommand{\DEVlanguageiso}{%s}' % lang)
-        a(r'\providecommand{\DEVlanguagebabel}{%s}' % self.iso639_to_babel.get(
-            lang, self.iso639_to_babel.get(lang.split('_')[0], '')))
-        a('')
-        if self.user_stylesheet_path:
-            a('% User stylesheet:')
-            a(r'\input{%s}' % self.user_stylesheet_path)
-        a('% Docutils stylesheet:')
-        a(r'\input{%s}' % self.stylesheet_path)
-        a('')
-        a('% Default definitions for Docutils nodes:')
-        for node_name in nodes.node_class_names:
-            a(r'\providecommand{\DN%s}[1]{#1}' % node_name.replace('_', ''))
-        a('')
-        a('% Auxiliary definitions:')
-        for attr in (r'\DEVparent \DEVattrlen \DEVtitleastext '
-                     r'\DEVsinglebackref \DEVmultiplebackrefs'
-                     ).split():
-            # Later set using \renewcommand.
-            a(r'\providecommand{%s}{DOCUTILSUNINITIALIZEDVARIABLE}' % attr)
-        for attr in (r'\DEVparagraphindented \DEVhassubtitle').split():
-            # Initialize as boolean variables.
-            a(r'\providecommand{%s}{false}' % attr)
-        a('\n\n')
-
-    unicode_map = unicode_map.unicode_map # comprehensive Unicode map
-    # Fix problems with unimap.py.
-    unicode_map.update({
-        # We have AE or T1 encoding, so "``" etc. work.  The macros
-        # from unimap.py may *not* work.
-        u'\u201C': '{``}',
-        u'\u201D': "{''}",
-        u'\u201E': '{,,}',
-        })
-
-    character_map = {
-        '\\': r'{\textbackslash}',
-        '{': r'{\{}',
-        '}': r'{\}}',
-        '$': r'{\$}',
-        '&': r'{\&}',
-        '%': r'{\%}',
-        '#': r'{\#}',
-        '[': r'{[}',
-        ']': r'{]}',
-        '-': r'{-}',
-        '`': r'{`}',
-        "'": r"{'}",
-        ',': r'{,}',
-        '"': r'{"}',
-        '|': r'{\textbar}',
-        '<': r'{\textless}',
-        '>': r'{\textgreater}',
-        '^': r'{\textasciicircum}',
-        '~': r'{\textasciitilde}',
-        '_': r'{\DECtextunderscore}',
-        }
-    character_map.update(unicode_map)
-    #character_map.update(special_map)
-    
-    # `att_map` is for encoding attributes.  According to
-    # <http://www-h.eng.cam.ac.uk/help/tpl/textprocessing/teTeX/latex/latex2e-html/ltx-164.html>,
-    # the following characters are special: # $ % & ~ _ ^ \ { }
-    # These work without special treatment in macro parameters:
-    # $, &, ~, _, ^
-    att_map = {'#': '\\#',
-               '%': '\\%',
-               # We cannot do anything about backslashes.
-               '\\': '',
-               '{': '\\{',
-               '}': '\\}',
-               # The quotation mark may be redefined by babel.
-               '"': '"{}',
-               }
-    att_map.update(unicode_map)
-
-    def encode(self, text, attval=None):
-        """
-        Encode special characters in ``text`` and return it.
-
-        If attval is true, preserve as much as possible verbatim (used
-        in attribute value encoding).  If attval is 'width' or
-        'height', `text` is interpreted as a length value.
-        """
-        if attval in ('width', 'height'):
-            match = re.match(r'([0-9.]+)(\S*)$', text)
-            assert match, '%s="%s" must be a length' % (attval, text)
-            value, unit = match.groups()
-            if unit == '%':
-                value = str(float(value) / 100)
-                unit = r'\DECrelativeunit'
-            elif unit in ('', 'px'):
-                # If \DECpixelunit is "pt", this gives the same notion
-                # of pixels as graphicx.  This is a bit of a hack.
-                value = str(float(value) * 0.75)
-                unit = '\DECpixelunit'
-            return '%s%s' % (value, unit)
-        if attval:
-            get = self.att_map.get
-        else:
-            get = self.character_map.get
-        text = ''.join([get(c, c) for c in text])
-        if (self.literal_block or self.inline_literal) and not attval:
-            # NB: We can have inline literals within literal blocks.
-            # Shrink '\r\n'.
-            text = text.replace('\r\n', '\n')
-            # Convert space.  If "{ }~~~~~" is wrapped (at the
-            # brace-enclosed space "{ }"), the following non-breaking
-            # spaces ("~~~~") do *not* wind up at the beginning of the
-            # next line.  Also note that no hyphenation is done if the
-            # breaking space ("{ }") comes *after* the non-breaking
-            # spaces.
-            if self.literal_block:
-                # Replace newlines with real newlines.
-                text = text.replace('\n', '\mbox{}\\\\{}')
-                replace_fn = self.encode_replace_for_literal_block_spaces
-            else:
-                replace_fn = self.encode_replace_for_inline_literal_spaces
-            text = re.sub(r'\s+', replace_fn, text)
-            # Protect hyphens; if we don't, line breaks will be
-            # possible at the hyphens and even the \textnhtt macro
-            # from the hyphenat package won't change that.
-            text = text.replace('-', r'\mbox{-}')
-            text = text.replace("'", r'{\DECtextliteralsinglequote}')
-            return text
-        else:
-            if not attval:
-                # Replace space with single protected space.
-                text = re.sub(r'\s+', '{ }', text)
-                # Replace double quotes with macro calls.
-                L = []
-                for part in text.split(self.character_map['"']):
-                    if L:
-                        # Insert quote.
-                        L.append(self.left_quote and r'{\DECtextleftdblquote}'
-                                 or r'{\DECtextrightdblquote}')
-                        self.left_quote = not self.left_quote
-                    L.append(part)
-                return ''.join(L)
-            else:
-                return text
-
-    def encode_replace_for_literal_block_spaces(self, match):
-        return '~' * len(match.group())
-
-    def encode_replace_for_inline_literal_spaces(self, match):
-        return '{ }' + '~' * (len(match.group()) - 1)
-
-    def astext(self):
-        return '\n'.join(self.header) + (''.join(self.body))
-
-    def append(self, text, newline='%\n'):
-        """
-        Append text, stripping newlines, producing nice LaTeX code.
-        """
-        lines = ['  ' * self.indentation_level + line + newline
-                 for line in text.splitlines(0)]
-        self.body.append(''.join(lines))
-
-    def visit_Text(self, node):
-        self.append(self.encode(node.astext()))
-
-    def depart_Text(self, node):
-        pass
-
-    def is_indented(self, paragraph):
-        """Return true if `paragraph` should be first-line-indented."""
-        assert isinstance(paragraph, nodes.paragraph)
-        siblings = [n for n in paragraph.parent if
-                    self.is_visible(n) and not isinstance(n, nodes.Titular)]
-        index = siblings.index(paragraph)
-        if ('continued' in paragraph['classes'] or
-            index > 0 and isinstance(siblings[index-1], nodes.transition)):
-            return 0
-        # Indent all but the first paragraphs.
-        return index > 0
-
-    def before_paragraph(self, node):
-        self.append(r'\renewcommand{\DEVparagraphindented}{%s}'
-                    % (self.is_indented(node) and 'true' or 'false'))
-
-    def before_title(self, node):
-        self.append(r'\renewcommand{\DEVtitleastext}{%s}'
-                    % self.encode(node.astext()))
-        self.append(r'\renewcommand{\DEVhassubtitle}{%s}'
-                    % ((len(node.parent) > 2 and
-                        isinstance(node.parent[1], nodes.subtitle))
-                       and 'true' or 'false'))
-
-    def before_generated(self, node):
-        if 'sectnum' in node['classes']:
-            node[0] = node[0].strip()
-
-    literal_block = 0
-
-    def visit_literal_block(self, node):
-        self.literal_block = 1
-
-    def depart_literal_block(self, node):
-        self.literal_block = 0
-
-    visit_doctest_block = visit_literal_block
-    depart_doctest_block = depart_literal_block
-
-    inline_literal = 0
-
-    def visit_literal(self, node):
-        self.inline_literal += 1
-
-    def depart_literal(self, node):
-        self.inline_literal -= 1
-
-    def _make_encodable(self, text):
-        """
-        Return text (a unicode object) with all unencodable characters
-        replaced with '?'.
-
-        Thus, the returned unicode string is guaranteed to be encodable.
-        """
-        encoding = self.settings.output_encoding
-        return text.encode(encoding, 'replace').decode(encoding)
-
-    def visit_comment(self, node):
-        """
-        Insert the comment unchanged into the document, replacing
-        unencodable characters with '?'.
-
-        (This is done in order not to fail if comments contain unencodable
-        characters, because our default encoding is not UTF-8.)
-        """
-        self.append('\n'.join(['% ' + self._make_encodable(line) for line
-                               in node.astext().splitlines(0)]), newline='\n')
-        raise nodes.SkipChildren
-
-    def before_topic(self, node):
-        if 'contents' in node['classes']:
-            for bullet_list in list(node.traverse(nodes.bullet_list)):
-                p = bullet_list.parent
-                if isinstance(p, nodes.list_item):
-                    p.parent.insert(p.parent.index(p) + 1, bullet_list)
-                    del p[1]
-            for paragraph in node.traverse(nodes.paragraph):
-                paragraph.attributes.update(paragraph[0].attributes)
-                paragraph[:] = paragraph[0]
-                paragraph.parent['tocrefid'] = paragraph['refid']
-            node['contents'] = 1
-        else:
-            node['contents'] = 0
-
-    bullet_list_level = 0
-
-    def visit_bullet_list(self, node):
-        self.append(r'\DECsetbullet{\labelitem%s}' %
-                    ['i', 'ii', 'iii', 'iv'][min(self.bullet_list_level, 3)])
-        self.bullet_list_level += 1
-
-    def depart_bullet_list(self, node):
-        self.bullet_list_level -= 1
-
-    enum_styles = {'arabic': 'arabic', 'loweralpha': 'alph', 'upperalpha':
-                   'Alph', 'lowerroman': 'roman', 'upperroman': 'Roman'}
-
-    enum_counter = 0
-
-    def visit_enumerated_list(self, node):
-        # We create our own enumeration list environment.  This allows
-        # to set the style and starting value and unlimited nesting.
-        # Maybe the actual creation (\DEC) can be moved to the
-        # stylesheet?
-        self.enum_counter += 1
-        enum_prefix = self.encode(node['prefix'])
-        enum_suffix = self.encode(node['suffix'])
-        enum_type = '\\' + self.enum_styles.get(node['enumtype'], r'arabic')
-        start = node.get('start', 1) - 1
-        counter = 'Denumcounter%d' % self.enum_counter
-        self.append(r'\DECmakeenumeratedlist{%s}{%s}{%s}{%s}{%s}{'
-                    % (enum_prefix, enum_type, enum_suffix, counter, start))
-                    # for Emacs: }
-
-    def depart_enumerated_list(self, node):
-        self.append('}')  # for Emacs: {
-
-    def before_list_item(self, node):
-        # XXX needs cleanup.
-        if (len(node) and (isinstance(node[-1], nodes.TextElement) or
-                           isinstance(node[-1], nodes.Text)) and
-            node.parent.index(node) == len(node.parent) - 1):
-            node['lastitem'] = 'true'
-
-    before_line = before_list_item
-
-    def before_raw(self, node):
-        if 'latex' in node.get('format', '').split():
-            # We're inserting the text in before_raw and thus outside
-            # of \DN... and \DECattr in order to make grouping with
-            # curly brackets work.
-            self.append(node.astext())
-        raise nodes.SkipChildren
-
-    def process_backlinks(self, node, type):
-        """
-        Add LaTeX handling code for backlinks of footnote or citation
-        node `node`.  `type` is either 'footnote' or 'citation'.
-        """
-        self.append(r'\renewcommand{\DEVsinglebackref}{}')
-        self.append(r'\renewcommand{\DEVmultiplebackrefs}{}')
-        if len(node['backrefs']) > 1:
-            refs = []
-            for i in range(len(node['backrefs'])):
-                # \DECmulticitationbacklink or \DECmultifootnotebacklink.
-                refs.append(r'\DECmulti%sbacklink{%s}{%s}'
-                            % (type, node['backrefs'][i], i + 1))
-            self.append(r'\renewcommand{\DEVmultiplebackrefs}{(%s){ }}'
-                        % ', '.join(refs))
-        elif len(node['backrefs']) == 1:
-            self.append(r'\renewcommand{\DEVsinglebackref}{%s}'
-                        % node['backrefs'][0])
-
-    def visit_footnote(self, node):
-        self.process_backlinks(node, 'footnote')
-
-    def visit_citation(self, node):
-        self.process_backlinks(node, 'citation')
-
-    def before_table(self, node):
-        # A table contains exactly one tgroup.  See before_tgroup.
-        pass
-
-    def before_tgroup(self, node):
-        widths = []
-        total_width = 0
-        for i in range(int(node['cols'])):
-            assert isinstance(node[i], nodes.colspec)
-            widths.append(int(node[i]['colwidth']) + 1)
-            total_width += widths[-1]
-        del node[:len(widths)]
-        tablespec = '|'
-        for w in widths:
-            # 0.93 is probably wrong in many cases.  XXX Find a
-            # solution which works *always*.
-            tablespec += r'p{%s\textwidth}|' % (0.93 * w /
-                                                max(total_width, 60))
-        self.append(r'\DECmaketable{%s}{' % tablespec)
-        self.context.append('}')
-        raise SkipAttrParentLaTeX
-
-    def depart_tgroup(self, node):
-        self.append(self.context.pop())
-
-    def before_row(self, node):
-        raise SkipAttrParentLaTeX
-
-    def before_thead(self, node):
-        raise SkipAttrParentLaTeX
-
-    def before_tbody(self, node):
-        raise SkipAttrParentLaTeX
-
-    def is_simply_entry(self, node):
-        return (len(node) == 1 and isinstance(node[0], nodes.paragraph) or
-                len(node) == 0)
-
-    def before_entry(self, node):
-        is_leftmost = 0
-        if node.hasattr('morerows'):
-            self.document.reporter.severe('Rowspans are not supported.')
-            # Todo: Add empty cells below rowspanning cell and issue
-            # warning instead of severe.
-        if node.hasattr('morecols'):
-            # The author got a headache trying to implement
-            # multicolumn support.
-            if not self.is_simply_entry(node):
-                self.document.reporter.severe(
-                    'Colspanning table cells may only contain one paragraph.')
-                # Todo: Same as above.
-            # The number of columns this entry spans (as a string).
-            colspan = int(node['morecols']) + 1
-            del node['morecols']
-        else:
-            colspan = 1
-        # Macro to call -- \DECcolspan or \DECcolspanleft.
-        macro_name = r'\DECcolspan'
-        if node.parent.index(node) == 0:
-            # Leftmost column.
-            macro_name += 'left'
-            is_leftmost = 1
-        if colspan > 1:
-            self.append('%s{%s}{' % (macro_name, colspan))
-            self.context.append('}')
-        else:
-            # Do not add a multicolumn with colspan 1 beacuse we need
-            # at least one non-multicolumn cell per column to get the
-            # desired column widths, and we can only do colspans with
-            # cells consisting of only one paragraph.
-            if not is_leftmost:
-                self.append(r'\DECsubsequententry{')
-                self.context.append('}')
-            else:
-                self.context.append('')
-        if isinstance(node.parent.parent, nodes.thead):
-            node['tableheaderentry'] = 'true'
-
-        # Don't add \renewcommand{\DEVparent}{...} because there must
-        # not be any non-expandable commands in front of \multicolumn.
-        raise SkipParentLaTeX
-
-    def depart_entry(self, node):
-        self.append(self.context.pop())
-
-    def before_substitution_definition(self, node):
-        raise nodes.SkipNode
-
-    indentation_level = 0
-
-    def node_name(self, node):
-        return node.__class__.__name__.replace('_', '')
-
-    # Attribute propagation order.
-    attribute_order = ['align', 'classes', 'ids']
-
-    def attribute_cmp(self, a1, a2):
-        """
-        Compare attribute names `a1` and `a2`.  Used in
-        propagate_attributes to determine propagation order.
-
-        See built-in function `cmp` for return value.
-        """
-        if a1 in self.attribute_order and a2 in self.attribute_order:
-            return cmp(self.attribute_order.index(a1),
-                       self.attribute_order.index(a2))
-        if (a1 in self.attribute_order) != (a2 in self.attribute_order):
-            # Attributes not in self.attribute_order come last.
-            return a1 in self.attribute_order and -1 or 1
-        else:
-            return cmp(a1, a2)
-
-    def propagate_attributes(self, node):
-        # Propagate attributes using \DECattr macros.
-        node_name = self.node_name(node)
-        attlist = []
-        if isinstance(node, nodes.Element):
-            attlist = node.attlist()
-        attlist.sort(lambda pair1, pair2: self.attribute_cmp(pair1[0],
-                                                             pair2[0]))
-        # `numatts` may be greater than len(attlist) due to list
-        # attributes.
-        numatts = 0
-        pass_contents = self.pass_contents(node)
-        for key, value in attlist:
-            if isinstance(value, ListType):
-                self.append(r'\renewcommand{\DEVattrlen}{%s}' % len(value))
-                for i in range(len(value)):
-                    self.append(r'\DECattr{%s}{%s}{%s}{%s}{' %
-                                (i+1, key, self.encode(value[i], attval=key),
-                                 node_name))
-                    if not pass_contents:
-                        self.append('}')
-                numatts += len(value)
-            else:
-                self.append(r'\DECattr{}{%s}{%s}{%s}{' %
-                            (key, self.encode(unicode(value), attval=key),
-                             node_name))
-                if not pass_contents:
-                    self.append('}')
-                numatts += 1
-        if pass_contents:
-            self.context.append('}' * numatts)  # for Emacs: {
-        else:
-            self.context.append('')
-
-    def visit_docinfo(self, node):
-        raise NotImplementedError('Docinfo not yet implemented.')
-
-    def visit_document(self, node):
-        document = node
-        # Move IDs into TextElements.  This won't work for images.
-        # Need to review this.
-        for node in document.traverse(nodes.Element):
-            if node.has_key('ids') and not isinstance(node,
-                                                      nodes.TextElement):
-                next_text_element = node.next_node(nodes.TextElement)
-                if next_text_element:
-                    next_text_element['ids'].extend(node['ids'])
-                    node['ids'] = []
-
-    def pass_contents(self, node):
-        r"""
-        Return True if the node contents should be passed in
-        \DN<nodename>{<contents>} and \DECattr{}{}{}{}{<contents>}.
-        Return False if the node contents should be passed in
-        \DECvisit<nodename> <contents> \DECdepart<nodename>, and no
-        attribute handler should be called.
-        """
-        # Passing the whole document or whole sections as parameters
-        # to \DN... or \DECattr causes LaTeX to run out of memory.
-        return not isinstance(node, (nodes.document, nodes.section))
-
-    def dispatch_visit(self, node):
-        skip_attr = skip_parent = 0
-        # TreePruningException to be propagated.
-        tree_pruning_exception = None
-        if hasattr(self, 'before_' + node.__class__.__name__):
-            try:
-                getattr(self, 'before_' + node.__class__.__name__)(node)
-            except SkipParentLaTeX:
-                skip_parent = 1
-            except SkipAttrParentLaTeX:
-                skip_attr = 1
-                skip_parent = 1
-            except nodes.SkipNode:
-                raise
-            except (nodes.SkipChildren, nodes.SkipSiblings), instance:
-                tree_pruning_exception = instance
-            except nodes.SkipDeparture:
-                raise NotImplementedError(
-                    'SkipDeparture not usable in LaTeX writer')
-
-        if not isinstance(node, nodes.Text):
-            node_name = self.node_name(node)
-            # attribute_deleters will be appended to self.context.
-            attribute_deleters = []
-            if not skip_parent and not isinstance(node, nodes.document):
-                self.append(r'\renewcommand{\DEVparent}{%s}'
-                            % self.node_name(node.parent))
-                for name, value in node.attlist():
-                    if not isinstance(value, ListType) and not ':' in name:
-                        # For non-list and non-special (like
-                        # 'xml:preserve') attributes, set
-                        # \DEVcurrentN<nodename>A<attribute> to the
-                        # attribute value, so that the value of the
-                        # attribute is available in the node handler
-                        # and all children.
-                        macro = r'\DEVcurrentN%sA%s' % (node_name, name)
-                        self.append(r'\def%s{%s}' % (
-                            macro, self.encode(unicode(value), attval=name)))
-                        # Make the attribute undefined afterwards.
-                        attribute_deleters.append(r'\let%s=\relax' % macro)
-            self.context.append('\n'.join(attribute_deleters))
-            if self.pass_contents(node):
-                # Call \DN<nodename>{<contents>}.
-                self.append(r'\DN%s{' % node_name)
-                self.context.append('}')
-            else:
-                # Call \DECvisit<nodename> <contents>
-                # \DECdepart<nodename>.  (Maybe we should use LaTeX
-                # environments for this?)
-                self.append(r'\DECvisit%s' % node_name)
-                self.context.append(r'\DECdepart%s' % node_name)
-            self.indentation_level += 1
-            if not skip_attr:
-                self.propagate_attributes(node)
-            else:
-                self.context.append('')
-
-        if (isinstance(node, nodes.TextElement) and
-            not isinstance(node.parent, nodes.TextElement)):
-            # Reset current quote to left.
-            self.left_quote = 1
-
-        # Call visit_... method.
-        try:
-            nodes.SparseNodeVisitor.dispatch_visit(self, node)
-        except LaTeXException:
-            raise NotImplementedError(
-                'visit_... methods must not raise LaTeXExceptions')
-
-        if tree_pruning_exception:
-            # Propagate TreePruningException raised in before_... method.
-            raise tree_pruning_exception
-
-    def is_invisible(self, node):
-        # Return true if node is invisible or moved away in the LaTeX
-        # rendering.
-        return (not isinstance(node, nodes.Text) and
-                (isinstance(node, nodes.Invisible) or
-                 isinstance(node, nodes.footnote) or
-                 isinstance(node, nodes.citation) or
-                 # Assume raw nodes to be invisible.
-                 isinstance(node, nodes.raw) or
-                 # Floating image or figure.
-                 node.get('align') in ('left', 'right')))
-
-    def is_visible(self, node):
-        return not self.is_invisible(node)
-
-    def needs_space(self, node):
-        """Two nodes for which `needs_space` is true need auxiliary space."""
-        # Return true if node is a visible block-level element.
-        return ((isinstance(node, nodes.Body) or
-                 isinstance(node, nodes.topic)) and
-                not (self.is_invisible(node) or
-                     isinstance(node.parent, nodes.TextElement)))
-
-    def always_needs_space(self, node):
-        """
-        Always add space around nodes for which `always_needs_space()`
-        is true, regardless of whether the other node needs space as
-        well.  (E.g. transition next to section.)
-        """
-        return isinstance(node, nodes.transition)
-
-    def dispatch_departure(self, node):
-        # Call departure method.
-        nodes.SparseNodeVisitor.dispatch_departure(self, node)
-
-        if not isinstance(node, nodes.Text):
-            # Close attribute and node handler call (\DN...{...}).
-            self.indentation_level -= 1
-            self.append(self.context.pop() + self.context.pop())
-            # Delete \DECcurrentN... attribute macros.
-            self.append(self.context.pop())
-            # Get next sibling.
-            next_node = node.next_node(
-                ascend=0, siblings=1, descend=0,
-                condition=self.is_visible)
-            # Insert space if necessary.
-            if  (self.needs_space(node) and self.needs_space(next_node) or
-                 self.always_needs_space(node) or
-                 self.always_needs_space(next_node)):
-                if isinstance(node, nodes.paragraph) and isinstance(next_node, nodes.paragraph):
-                    # Space between paragraphs.
-                    self.append(r'\DECparagraphspace')
-                else:
-                    # One of the elements is not a paragraph.
-                    self.append(r'\DECauxiliaryspace')
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/base.tex	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1180 +0,0 @@
-% System stylesheet for the new LaTeX writer, newlatex2e.
-
-% Major parts of the rendering are done in this stylesheet and not in the
-% Python module.
-
-% For development notes, see notes.txt.
-
-% User documentation (in the stylesheet for now; that may change though):
-
-% Naming conventions:
-% All uppercase letters in macro names have a specific meaning.
-% \D...: All macros introduced by the Docutils LaTeX writer start with "D".
-% \DS<name>: Setup function (called at the bottom of this stylesheet).
-% \DN<nodename>{<contents>}: Handler for Docutils document tree node `node`; called by
-%                            the Python module.
-% \DEV<name>: External variable, set by the Python module.
-% \DEC<name>: External command.  It is called by the Python module and must be
-%             defined in this stylesheet.
-% \DN<nodename>A<attribute>{<number>}{<attribute>}{<value>}{<nodename>}{<contents>}:
-%     Attribute handler for `attribute` set on nodes of type `nodename`.
-%     See below for a discussion of attribute handlers.
-% \DA<attribute>{<number>}{<attribute>}{<value>}{<nodename>}{<contents>}:
-%     Attribute handler for all `attribute`.  Called only when no specific
-%     \DN<nodename>A<attribute> handler is defined.
-% \DN<nodename>C<class>{<contents>}:
-%     Handler for `class`, when set on nodes of type `nodename`.
-% \DC<class>{<contents>}:
-%     Handler for `class`.  Called only when no specific \DN<nodename>C<class>
-%     handler is defined.
-% \D<name>: Generic variable or function.
-
-% Attribute handlers:
-% TODO
-
-% ---------------------------------------------------------------------------
-
-% Having to intersperse code with \makeatletter-\makeatother pairs is very
-% annoying, so we call \makeatletter at the top and \makeatother at the
-% bottom.   Just be aware that you cannot use "@" as a text character inside
-% this stylesheet.
-\makeatletter
-
-% Print-mode (as opposed to online mode e.g. with Adobe Reader).
-% This causes for example blue hyperlinks.
-\providecommand{\Dprinting}{false}
-
-% \DSearly is called right after \documentclass.
-\providecommand{\DSearly}{}
-% \DSlate is called at the end of the stylesheet (right before the document
-% tree).
-\providecommand{\DSlate}{}
-
-% Use the KOMA script article class.
-\providecommand{\Ddocumentclass}{scrartcl}
-\providecommand{\Ddocumentoptions}{a4paper}
-\providecommand{\DSdocumentclass}{
-  \documentclass[\Ddocumentoptions]{\Ddocumentclass} }
-
-% Todo: This should be movable to the bottom, but it isn't as long as
-% we use \usepackage commands at the top level of this stylesheet
-% (which we shouldn't).
-\DSdocumentclass
-
-\providecommand{\DSpackages}{
-  % Load miscellaneous packages.
-  % Note 1: Many of the packages loaded here are used throughout this stylesheet.
-  % If one of these packages does not work on your system or in your scenario,
-  % please let us know, so we can consider making the package optional.
-  % Note 2: It would appear cleaner to load packages where they are used.
-  % However, since using a wrong package loading order can lead to *very*
-  % subtle bugs, we centralize the loading of most packages here.
-  \DSfontencoding % load font encoding packages
-  \DSlanguage % load babel
-  % Using \ifthenelse conditionals.
-  \usepackage{ifthen} % before hyperref (really!)
-  % There is not support for *not* using hyperref because it's used in many
-  % places.  If this is a problem (e.g. because hyperref doesn't work on your
-  % system), please let us know.
-  \usepackage[colorlinks=false,pdfborder={0 0 0}]{hyperref}
-  % Get color, e.g. for links and system messages.
-  \usepackage{color}
-  % Get \textnhtt macro (non-hyphenating type writer).
-  \usepackage{hyphenat}
-  % For sidebars.
-  \usepackage{picins}
-  % We use longtable to create tables.
-  \usepackage{longtable}
-  % Images.
-  \usepackage{graphicx}
-  % These packages might be useful (some just add magic pixie dust), so
-  % evaluate them:
-  %\usepackage{fixmath}
-  %\usepackage{amsmath}
-  % Add some missing symbols like \textonehalf.
-  \usepackage{textcomp}
-}
-
-\providecommand{\DSfontencoding}{
-  % Set up font encoding.  Called by \DSpackages.
-  % AE is a T1 emulation.  It provides mostly the same characters and
-  % features as T1-encoded fonts but doesn't use bitmap fonts (which are
-  % unsuitable for online reading and subtle for printers).
-  \usepackage{ae}
-  % Provide the characters not contained in AE from EC bitmap fonts.
-  \usepackage{aecompl}
-  % Guillemets ("<<", ">>") in AE.
-  \usepackage{aeguill}
-}
-
-\providecommand{\DSsymbols}{%
-  % Fix up symbols.
-  % The Euro symbol in Computer Modern looks, um, funny.  Let's get a
-  % proper Euro symbol.
-  \usepackage{eurosym}%
-  \renewcommand{\texteuro}{\euro}%
-}
-
-% Taken from
-% <http://groups.google.de/groups?selm=1i0n5tgtplti420e1omp4pctlv19jpuhbb%404ax.com>
-% and modified.  Used with permission.
-\providecommand{\Dprovidelength}[2]{%
-  \begingroup%
-    \escapechar\m@ne%
-    \xdef\@gtempa{{\string#1}}%
-  \endgroup%
-  \expandafter\@ifundefined\@gtempa%
-  {\newlength{#1}\setlength{#1}{#2}}%
-  {}%
-}
-
-\providecommand{\Dprovidecounter}[2]{%
-  % Like \newcounter except that it doesn't crash if the counter
-  % already exists.
-  \@ifundefined{c@#1}{\newcounter{#1}\setcounter{#1}{#2}}{}
-}
-
-\Dprovidelength{\Dboxparindent}{\parindent}
-
-\providecommand{\Dmakebox}[1]{%
-  % Make a centered, frameless box.  Useful e.g. for block quotes.
-  % Do not use minipages here, but create pseudo-lists to allow
-  % page-breaking.  (Don't use KOMA-script's addmargin environment
-  % because it messes up bullet lists.)
-  \Dmakelistenvironment{}{}{%
-    \setlength{\parskip}{0pt}%
-    \setlength{\parindent}{\Dboxparindent}%
-    \item{#1}%
-  }%
-}
-
-\providecommand{\Dmakefbox}[1]{%
-  % Make a centered, framed box.  Useful e.g. for admonitions.
-  \vspace{0.4\baselineskip}%
-  \begin{center}%
-    \fbox{%
-      \begin{minipage}[t]{0.9\linewidth}%
-        \setlength{\parindent}{\Dboxparindent}%
-        #1%
-      \end{minipage}%
-    }%
-  \end{center}%
-  \vspace{0.4\baselineskip}%
-}
-
-% We do not currently recognize the difference between an end-sentence and a
-% mid-sentence period (".  " vs. ". " in plain text).  So \frenchspacing is
-% appropriate.
-\providecommand{\DSfrenchspacing}{\frenchspacing}
-
-
-\Dprovidelength{\Dblocklevelvspace}{%
-  % Space between block-level elements other than paragraphs.
-  0.7\baselineskip plus 0.3\baselineskip minus 0.2\baselineskip%
-}
-\providecommand{\DECauxiliaryspace}{%
-  \ifthenelse{\equal{\Dneedvspace}{true}}{\vspace{\Dblocklevelvspace}}{}%
-  \par\noindent%
-}
-\providecommand{\DECparagraphspace}{\par}
-\providecommand{\Dneedvspace}{true}
-
-\providecommand{\DSlanguage}{%
-  % Set up babel.
-  \usepackage[\DEVlanguagebabel]{babel}
-}
-
-\providecommand{\Difdefined}[3]{\@ifundefined{#1}{#3}{#2}}
-
-% Handler for 'classes' attribute (called for each class attribute).
-\providecommand{\DAclasses}[5]{%
-  % Dispatch to \DN<nodename>C<class>.
-  \Difdefined{DN#4C#3}{%
-    % Pass only contents, nothing else!
-    \csname DN#4C#3\endcsname{#5}%
-  }{%
-    % Otherwise, dispatch to \DC<class>.
-    \Difdefined{DC#3}{%
-      \csname DC#3\endcsname{#5}%
-    }{%
-      #5%
-    }%
-  }%
-}
-
-\providecommand{\DECattr}[5]{%
-  % Global attribute dispatcher, called inside the document tree.
-  % Parameters:
-  % 1. Attribute number.
-  % 2. Attribute name.
-  % 3. Attribute value.
-  % 4. Node name.
-  % 5. Node contents.
-  \Difdefined{DN#4A#2}{%
-    % Dispatch to \DN<nodename>A<attribute>.
-    \csname DN#4A#2\endcsname{#1}{#2}{#3}{#4}{#5}%
-  }{\Difdefined{DA#2}{%
-    % Otherwise dispatch to \DA<attribute>.
-    \csname DA#2\endcsname{#1}{#2}{#3}{#4}{#5}%
-  }{%
-    % Otherwise simply run the contents without calling a handler.
-    #5%
-  }}%
-}
-
-% ---------- Link handling ----------
-% Targets and references.
-
-\providecommand{\Draisedlink}[1]{%
-  % Anchors are placed on the base line by default.  This is a bad thing for
-  % inline context, so we raise the anchor (normally by \baselineskip).
-  \Hy@raisedlink{#1}%
-}
-
-% References.
-% We're assuming here that the "refid" and "refuri" attributes occur
-% only in inline context (in TextElements).
-\providecommand{\DArefid}[5]{%
-  \ifthenelse{\equal{#4}{reference}}{%
-    \Dexplicitreference{\##3}{#5}%
-  }{%
-    % If this is not a target node (targets with refids are
-    % uninteresting and should be silently dropped).
-    \ifthenelse{\not\equal{#4}{target}}{%
-      % If this is a footnote reference, call special macro.
-      \ifthenelse{\equal{#4}{footnotereference}}{%
-        \Dimplicitfootnotereference{\##3}{#5}%
-      }{%
-        \ifthenelse{\equal{#4}{citationreference}}{%
-          \Dimplicitcitationreference{\##3}{#5}%
-        }{%
-          \Dimplicitreference{\##3}{#5}%
-        }%
-      }%
-    }{}%
-  }%
-}
-\providecommand{\DArefuri}[5]{%
-  \ifthenelse{\equal{#4}{target}}{%
-    % The node name is 'target', so this is a hyperlink target, like this:
-    % .. _mytarget: URI
-    % Hyperlink targets are ignored because they are invisible.
-  }{%
-    % If a non-target node has a refuri attribute, it must be an explicit URI
-    % reference (i.e. node name is 'reference').
-    \Durireference{#3}{#5}%
-  }%
-}
-% Targets.
-\providecommand{\DAids}[5]{%
-  \label{#3}%
-  \ifthenelse{\equal{#4}{footnotereference}}{%
-    {%
-      \renewcommand{\HyperRaiseLinkDefault}{%
-        % Dirty hack to make backrefs to footnote references work.
-        % For some reason, \baselineskip is 0pt in fn references.
-        0.5\Doriginalbaselineskip%
-      }%
-      \Draisedlink{\hypertarget{#3}{}}#5%
-    }%
-  }{%
-    \Draisedlink{\hypertarget{#3}{}}#5%
-  }%
-}
-\providecommand{\Dimplicitreference}[2]{%
-  % Create implicit reference to ID.  Implicit references occur
-  % e.g. in TOC-backlinks of section titles.  Parameters:
-  % 1. Target.
-  % 2. Link text.
-  \href{#1}{#2}%
-}
-\providecommand{\Dimplicitfootnotereference}[2]{%
-  % Ditto, but for the special case of footnotes.
-  % We want them to be rendered like explicit references.
-  \Dexplicitreference{#1}{#2}%
-}
-\providecommand{\Dimplicitcitationreference}[2]{%
-  % Ditto for citation references.
-  \Dimplicitfootnotereference{#1}{#2}%
-}
-\providecommand{\Dcolorexplicitreference}{%
-  \ifthenelse{\equal{\Dprinting}{true}}{\color{black}}{\color{blue}}%
-}
-\providecommand{\Dexplicitreference}[2]{%
-  % Create explicit reference to ID, e.g. created with "foo_".
-  % Parameters:
-  % 1. Target.
-  % 2. Link text.
-  \href{#1}{{\Dcolorexplicitreference#2}}%
-}
-\providecommand{\Dcolorurireference}{\Dcolorexplicitreference}
-\providecommand{\Durireference}[2]{%
-  % Create reference to URI.  Parameters:
-  % 1. Target.
-  % 2. Link text.
-  \href{#1}{{\Dcolorurireference#2}}%
-}
-
-\Dprovidecounter{Dpdfbookmarkid}{0}%
-\providecommand{\Dpdfbookmark}[1]{%
-  % Temporarily decrement Desctionlevel counter.
-  \addtocounter{Dsectionlevel}{-1}%
-  %\typeout{\arabic{Dsectionlevel}}%
-  %\typeout{#1}%
-  %\typeout{docutils\roman{Dpdfbookmarkid}}%
-  %\typeout{}%
-  \pdfbookmark[\arabic{Dsectionlevel}]{#1}{docutils\arabic{Dpdfbookmarkid}}%
-  \addtocounter{Dsectionlevel}{1}%
-  \addtocounter{Dpdfbookmarkid}{1}%
-}
-% ---------- End of Link Handling ----------
-
-\providecommand{\DNparagraph}[1]{%
-  \ifthenelse{\equal{\DEVparagraphindented}{true}}{\indent}{\noindent}%
-  #1%
-}
-\providecommand{\Dformatboxtitle}[1]{{\Large\textbf{#1}}}
-\providecommand{\Dformatboxsubtitle}[1]{{\large\textbf{#1}}}
-\providecommand{\Dtopictitle}[1]{%
-  \Difinsidetoc{\vspace{1em}\par}{}%
-  \noindent\Dformatboxtitle{#1}%
-  \ifthenelse{\equal{\DEVhassubtitle}{false}}{\vspace{1em}}{\vspace{0.5em}}%
-  \par%
-}
-\providecommand{\Dadmonitiontitle}[1]{%
-  \Dtopictitle{#1}%
-}
-\providecommand{\Dtopicsubtitle}[1]{%
-  \noindent\Dformatboxsubtitle{#1}%
-  \vspace{1em}%
-  \par%
-}
-\providecommand{\Dsidebartitle}[1]{\Dtopictitle{#1}}
-\providecommand{\Dsidebarsubtitle}[1]{\Dtopicsubtitle{#1}}
-\providecommand{\Ddocumenttitle}[1]{%
-  \begin{center}{\Huge#1}\end{center}%
-  \ifthenelse{\equal{\DEVhassubtitle}{true}}{\vspace{0.1cm}}{\vspace{1cm}}%
-}
-\providecommand{\Ddocumentsubtitle}[1]{%
-  \begin{center}{\huge#1}\end{center}%
-  \vspace{1cm}%
-}
-% Can be overwritten by user stylesheet.
-\providecommand{\Dformatsectiontitle}[1]{#1}
-\providecommand{\Dformatsectionsubtitle}[1]{\Dformatsectiontitle{#1}}
-\providecommand{\Dbookmarksectiontitle}[1]{%
-  % Return text suitable for use in \section*, \subsection*, etc.,
-  % containing a PDF bookmark.  Parameter:  The title (as node tree).
-  \Draisedlink{\Dpdfbookmark{\DEVtitleastext}}%
-  #1%
-}
-\providecommand{\Dsectiontitlehook}[1]{#1}
-\providecommand{\Dsectiontitle}[1]{%
-  \Dsectiontitlehook{%
-    \Ddispatchsectiontitle{\Dbookmarksectiontitle{\Dformatsectiontitle{#1}}}%
-  }%
-}
-\providecommand{\Ddispatchsectiontitle}[1]{%
-  \@ifundefined{Dsectiontitle\roman{Dsectionlevel}}{%
-    \Ddeepsectiontitle{#1}%
-  }{%
-    \csname Dsectiontitle\roman{Dsectionlevel}\endcsname{#1}%
-  }%
-}
-\providecommand{\Ddispatchsectionsubtitle}[1]{%
-  \Ddispatchsectiontitle{#1}%
-}
-\providecommand{\Dsectiontitlei}[1]{\section*{#1}}
-\providecommand{\Dsectiontitleii}[1]{\subsection*{#1}}
-\providecommand{\Ddeepsectiontitle}[1]{%
-  % Anything below \subsubsection (like \paragraph or \subparagraph)
-  % is useless because it uses the same font.  The only way to
-  % (visually) distinguish such deeply nested sections is to use
-  % section numbering.
-  \subsubsection*{#1}%
-}
-\providecommand{\Dsectionsubtitlehook}[1]{#1}
-\Dprovidelength{\Dsectionsubtitleraisedistance}{0.7em}
-\providecommand{\Dsectionsubtitlescaling}{0.85}
-\providecommand{\Dsectionsubtitle}[1]{%
-  \Dsectionsubtitlehook{%
-    % Move the subtitle nearer to the title.
-    \vspace{-\Dsectionsubtitleraisedistance}%
-    % Don't create a PDF bookmark.
-    \Ddispatchsectionsubtitle{%
-      \Dformatsectionsubtitle{\scalebox{\Dsectionsubtitlescaling}{#1}}%
-    }%
-  }%
-}
-\providecommand{\DNtitle}[1]{%
-  % Dispatch to \D<parent>title.
-  \csname D\DEVparent title\endcsname{#1}%
-}
-\providecommand{\DNsubtitle}[1]{%
-  % Dispatch to \D<parent>subtitle.
-  \csname D\DEVparent subtitle\endcsname{#1}%
-}
-
-\providecommand{\DNliteralblock}[1]{%
-  \Dmakelistenvironment{}{%
-    \ifthenelse{\equal{\Dinsidetabular}{true}}{%
-      \setlength{\leftmargin}{0pt}%
-    }{}%
-    \setlength{\rightmargin}{0pt}%
-  }{%
-    \raggedright\item\noindent\nohyphens{\textnhtt{#1\Dfinalstrut}}%
-  }%
-}
-\providecommand{\DNdoctestblock}[1]{\DNliteralblock{#1}}
-\providecommand{\DNliteral}[1]{\textnhtt{#1}}
-\providecommand{\DNemphasis}[1]{\emph{#1}}
-\providecommand{\DNstrong}[1]{\textbf{#1}}
-\providecommand{\DECvisitdocument}{\begin{document}\noindent}
-\providecommand{\DECdepartdocument}{\end{document}}
-\providecommand{\DNtopic}[1]{%
-  \ifthenelse{\equal{\DEVcurrentNtopicAcontents}{1}}{%
-    \addtocounter{Dtoclevel}{1}%
-    \par\noindent%
-    #1%
-    \addtocounter{Dtoclevel}{-1}%
-  }{%
-    \par\noindent%
-    \Dmakebox{#1}%
-  }%
-}
-\providecommand{\DNadmonition}[1]{%
-  \DNtopic{#1}%
-}
-\providecommand{\Dformatrubric}[1]{\textbf{#1}}
-\Dprovidelength{\Dprerubricspace}{0.3em}
-\providecommand{\DNrubric}[1]{%
-  \vspace{\Dprerubricspace}\par\noindent\Dformatrubric{#1}\par%
-}
-
-\providecommand{\Dbullet}{}
-\providecommand{\DECsetbullet}[1]{\renewcommand{\Dbullet}{#1}}
-\providecommand{\DNbulletlist}[1]{%
-  \Difinsidetoc{%
-    \Dtocbulletlist{#1}%
-  }{%
-    \Dmakelistenvironment{\Dbullet}{}{#1}%
-  }%
-}
-% Todo: So what on earth is @pnumwidth?
-\renewcommand{\@pnumwidth}{2.2em}
-\providecommand{\DNlistitem}[1]{%
-  \Difinsidetoc{%
-    \ifthenelse{\equal{\theDtoclevel}{1}\and\equal{\Dlocaltoc}{false}}{%
-      {%
-        \par\addvspace{1em}\noindent%
-        \sectfont%
-        #1\hfill\pageref{\DEVcurrentNlistitemAtocrefid}%
-      }%
-    }{%
-      \@dottedtocline{0}{\Dtocindent}{0em}{#1}{%
-        \pageref{\DEVcurrentNlistitemAtocrefid}%
-      }%
-    }%
-  }{%
-    \item{#1}%
-  }%
-}
-\providecommand{\DNenumeratedlist}[1]{#1}
-\Dprovidecounter{Dsectionlevel}{0}
-\providecommand{\Dvisitsectionhook}{}
-\providecommand{\Ddepartsectionhook}{}
-\providecommand{\DECvisitsection}{%
-  \addtocounter{Dsectionlevel}{1}%
-  \Dvisitsectionhook%
-}
-\providecommand{\DECdepartsection}{%
-  \Ddepartsectionhook%
-  \addtocounter{Dsectionlevel}{-1}%
-}
-
-% Using \_ will cause hyphenation after _ even in \textnhtt-typewriter
-% because the hyphenat package redefines \_.  So we use
-% \textunderscore here.
-\providecommand{\DECtextunderscore}{\textunderscore}
-
-\providecommand{\Dtextinlineliteralfirstspace}{{ }}
-\providecommand{\Dtextinlineliteralsecondspace}{{~}}
-
-\Dprovidelength{\Dlistspacing}{0.8\baselineskip}
-
-\providecommand{\Dsetlistrightmargin}{%
-  \ifthenelse{\lengthtest{\linewidth>12em}}{%
-    % Equal margins.
-    \setlength{\rightmargin}{\leftmargin}%
-  }{%
-    % If the line is narrower than 10em, we don't remove any further
-    % space from the right.
-    \setlength{\rightmargin}{0pt}%
-  }%
-}
-\providecommand{\Dresetlistdepth}{false}
-\Dprovidelength{\Doriginallabelsep}{\labelsep}
-\providecommand{\Dmakelistenvironment}[3]{%
-  % Make list environment with support for unlimited nesting and with
-  % reasonable default lengths.  Parameters:
-  % 1. Label (same as in list environment).
-  % 2. Spacing (same as in list environment).
-  % 3. List contents (contents of list environment).
-  \ifthenelse{\equal{\Dinsidetabular}{true}}{%
-    % Unfortunately, vertical spacing doesn't work correctly when
-    % using lists inside tabular environments, so we use a minipage.
-    \begin{minipage}[t]{\linewidth}%
-  }{}%
-    {%
-      \renewcommand{\Dneedvspace}{false}%
-      % \parsep0.5\baselineskip
-      \renewcommand{\Dresetlistdepth}{false}%
-      \ifnum \@listdepth>5%
-      \protect\renewcommand{\Dresetlistdepth}{true}%
-      \@listdepth=5%
-      \fi%
-      \begin{list}{%
-          #1%
-        }{%
-          \setlength{\itemsep}{0pt}%
-          \setlength{\partopsep}{0pt}%
-          \setlength{\topsep}{0pt}%
-                                  % List should take 90% of total width.
-          \setlength{\leftmargin}{0.05\linewidth}%
-          \ifthenelse{\lengthtest{\leftmargin<1.8em}}{%
-            \setlength{\leftmargin}{1.8em}%
-          }{}%
-          \setlength{\labelsep}{\Doriginallabelsep}%
-          \Dsetlistrightmargin%
-          #2%
-        }{%
-          #3%
-        }%
-      \end{list}%
-      \ifthenelse{\equal{\Dresetlistdepth}{true}}{\@listdepth=5}{}%
-    }%
-  \ifthenelse{\equal{\Dinsidetabular}{true}}{\end{minipage}}{}%
-}
-\providecommand{\Dfinalstrut}{\@finalstrut\@arstrutbox}
-\providecommand{\DAlastitem}[5]{#5\Dfinalstrut}
-
-\Dprovidelength{\Ditemsep}{0pt}
-\providecommand{\DECmakeenumeratedlist}[6]{%
-  % Make enumerated list.
-  % Parameters:
-  % - prefix
-  % - type (\arabic, \roman, ...)
-  % - suffix
-  % - suggested counter name
-  % - start number - 1
-  % - list contents
-  \newcounter{#4}%
-  \Dmakelistenvironment{#1#2{#4}#3}{%
-    % Use as much space as needed for the label.
-    \setlength{\labelwidth}{10em}%
-    % Reserve enough space so that the label doesn't go beyond the
-    % left margin of preceding paragraphs.  Like that:
-    %
-    %    A paragraph.
-    %
-    %   1. First item.
-    \setlength{\leftmargin}{2.5em}%
-    \Dsetlistrightmargin%
-    \setlength{\itemsep}{\Ditemsep}%
-    % Use counter recommended by Python module.
-    \usecounter{#4}%
-    % Set start value.
-    \addtocounter{#4}{#5}%
-  }{%
-    % The list contents.
-    #6%
-  }%
-}
-
-
-% Single quote in literal mode.  \textquotesingle from package
-% textcomp has wrong width when using package ae, so we use a normal
-% single curly quote here.
-\providecommand{\DECtextliteralsinglequote}{'}
-
-
-% "Tabular lists" are field lists and options lists (not definition
-% lists because there the term always appears on its own line).  We'll
-% use the terminology of field lists now ("field", "field name",
-% "field body"), but the same is also analogously applicable to option
-% lists.
-%
-% We want these lists to be breakable across pages.  We cannot
-% automatically get the narrowest possible size for the left column
-% (i.e. the field names or option groups) because tabularx does not
-% support multi-page tables, ltxtable needs to have the table in an
-% external file and we don't want to clutter the user's directories
-% with auxiliary files created by the filecontents environment, and
-% ltablex is not included in teTeX.
-%
-% Thus we set a fixed length for the left column and use list
-% environments.  This also has the nice side effect that breaking is
-% now possible anywhere, not just between fields.
-%
-% Note that we are creating a distinct list environment for each
-% field.  There is no macro for a whole tabular list!
-\Dprovidelength{\Dtabularlistfieldnamewidth}{6em}
-\Dprovidelength{\Dtabularlistfieldnamesep}{0.5em}
-\providecommand{\Dinsidetabular}{false}
-\providecommand{\Dsavefieldname}{}
-\providecommand{\Dsavefieldbody}{}
-\Dprovidelength{\Dusedfieldnamewidth}{0pt}
-\Dprovidelength{\Drealfieldnamewidth}{0pt}
-\providecommand{\Dtabularlistfieldname}[1]{\renewcommand{\Dsavefieldname}{#1}}
-\providecommand{\Dtabularlistfieldbody}[1]{\renewcommand{\Dsavefieldbody}{#1}}
-\Dprovidelength{\Dparskiptemp}{0pt}
-\providecommand{\Dtabularlistfield}[1]{%
-  {%
-    % This only saves field name and field body in \Dsavefieldname and
-    % \Dsavefieldbody, resp.  It does not insert any text into the
-    % document.
-    #1%
-    % Recalculate the real field name width everytime we encounter a
-    % tabular list field because it may have been changed using a
-    % "raw" node.
-    \setlength{\Drealfieldnamewidth}{\Dtabularlistfieldnamewidth}%
-    \addtolength{\Drealfieldnamewidth}{\Dtabularlistfieldnamesep}%
-    \Dmakelistenvironment{%
-      \makebox[\Drealfieldnamewidth][l]{\Dsavefieldname}%
-    }{%
-      \setlength{\labelwidth}{\Drealfieldnamewidth}%
-      \setlength{\leftmargin}{\Drealfieldnamewidth}%
-      \setlength{\rightmargin}{0pt}%
-      \setlength{\labelsep}{0pt}%
-    }{%
-      \item%
-      \settowidth{\Dusedfieldnamewidth}{\Dsavefieldname}%
-      \setlength{\Dparskiptemp}{\parskip}%
-      \ifthenelse{%
-        \lengthtest{\Dusedfieldnamewidth>\Dtabularlistfieldnamewidth}%
-      }{%
-        \mbox{}\par%
-        \setlength{\parskip}{0pt}%
-      }{}%
-      \Dsavefieldbody%
-      \setlength{\parskip}{\Dparskiptemp}%
-      %XXX Why did we need this?
-      %\@finalstrut\@arstrutbox%
-    }%
-    \par%
-  }%
-}
-
-\providecommand{\Dformatfieldname}[1]{\textbf{#1:}}
-\providecommand{\DNfieldlist}[1]{#1}
-\providecommand{\DNfield}[1]{\Dtabularlistfield{#1}}
-\providecommand{\DNfieldname}[1]{%
-  \Dtabularlistfieldname{%
-    \Dformatfieldname{#1}%
-  }%
-}
-\providecommand{\DNfieldbody}[1]{\Dtabularlistfieldbody{#1}}
-
-\providecommand{\Dformatoptiongroup}[1]{%
-  % Format option group, e.g. "-f file, --input file".
-  \texttt{#1}%
-}
-\providecommand{\Dformatoption}[1]{%
-  % Format option, e.g. "-f file".
-  % Put into mbox to avoid line-breaking at spaces.
-  \mbox{#1}%
-}
-\providecommand{\Dformatoptionstring}[1]{%
-  % Format option string, e.g. "-f".
-  #1%
-}
-\providecommand{\Dformatoptionargument}[1]{%
-  % Format option argument, e.g. "file".
-  \textsl{#1}%
-}
-\providecommand{\Dformatoptiondescription}[1]{%
-  % Format option description, e.g.
-  % "\DNparagraph{Read input data from file.}"
-  #1%
-}
-\providecommand{\DNoptionlist}[1]{#1}
-\providecommand{\Doptiongroupjoiner}{,{ }}
-\providecommand{\Disfirstoption}{%
-  % Auxiliary macro indicating if a given option is the first child
-  % of its option group (if it's not, it has to preceded by
-  % \Doptiongroupjoiner).
-  false%
-}
-\providecommand{\DNoptionlistitem}[1]{%
-  \Dtabularlistfield{#1}%
-}
-\providecommand{\DNoptiongroup}[1]{%
-  \renewcommand{\Disfirstoption}{true}%
-  \Dtabularlistfieldname{\Dformatoptiongroup{#1}}%
-}
-\providecommand{\DNoption}[1]{%
-  % If this is not the first option in this option group, add a
-  % joiner.
-  \ifthenelse{\equal{\Disfirstoption}{true}}{%
-    \renewcommand{\Disfirstoption}{false}%
-  }{%
-    \Doptiongroupjoiner%
-  }%
-  \Dformatoption{#1}%
-}
-\providecommand{\DNoptionstring}[1]{\Dformatoptionstring{#1}}
-\providecommand{\DNoptionargument}[1]{{ }\Dformatoptionargument{#1}}
-\providecommand{\DNdescription}[1]{%
-  \Dtabularlistfieldbody{\Dformatoptiondescription{#1}}%
-}
-
-\providecommand{\DNdefinitionlist}[1]{%
-  \begin{description}%
-    \parskip0pt%
-    #1%
-  \end{description}%
-}
-\providecommand{\DNdefinitionlistitem}[1]{%
-  % LaTeX expects the label in square brackets; we provide an empty
-  % label.
-  \item[]#1%
-}
-\providecommand{\Dformatterm}[1]{#1}
-\providecommand{\DNterm}[1]{\hspace{-5pt}\Dformatterm{#1}}
-% I'm still not sure what's the best rendering for classifiers.  The
-% colon syntax is used by reStructuredText, so it's at least WYSIWYG.
-% Use slanted text because italic would cause too much emphasis.
-\providecommand{\Dformatclassifier}[1]{\textsl{#1}}
-\providecommand{\DNclassifier}[1]{~:~\Dformatclassifier{#1}}
-\providecommand{\Dformatdefinition}[1]{#1}
-\providecommand{\DNdefinition}[1]{\par\Dformatdefinition{#1}}
-
-\providecommand{\Dlineblockindentation}{2.5em}
-\providecommand{\DNlineblock}[1]{%
-  \Dmakelistenvironment{}{%
-    \ifthenelse{\equal{\DEVparent}{lineblock}}{%
-      % Parent is a line block, so indent.
-      \setlength{\leftmargin}{\Dlineblockindentation}%
-    }{%
-      % At top level; don't indent.
-      \setlength{\leftmargin}{0pt}%
-    }%
-    \setlength{\rightmargin}{0pt}%
-    \setlength{\parsep}{0pt}%
-  }{%
-    #1%
-  }%
-}
-\providecommand{\DNline}[1]{\item#1}
-
-\providecommand{\DNtransition}{%
-  \raisebox{0.25em}{\parbox{\linewidth}{\hspace*{\fill}\hrulefill\hrulefill\hspace*{\fill}}}%
-}
-
-\providecommand{\Dformatblockquote}[1]{%
-  % Format contents of block quote.
-  % This occurs in block-level context, so we cannot use \textsl.
-  {\slshape#1}%
-}
-\providecommand{\Dformatattribution}[1]{---\textup{#1}}
-\providecommand{\DNblockquote}[1]{%
-  \Dmakebox{%
-    \Dformatblockquote{#1}
-  }%
-}
-\providecommand{\DNattribution}[1]{%
-  \par%
-  \begin{flushright}\Dformatattribution{#1}\end{flushright}%
-}
-
-
-% Sidebars:
-% Vertical and horizontal margins.
-\Dprovidelength{\Dsidebarvmargin}{0.5em}
-\Dprovidelength{\Dsidebarhmargin}{1em}
-% Padding (space between contents and frame).
-\Dprovidelength{\Dsidebarpadding}{1em}
-% Frame width.
-\Dprovidelength{\Dsidebarframewidth}{2\fboxrule}
-% Position ("l" or "r").
-\providecommand{\Dsidebarposition}{r}
-% Width.
-\Dprovidelength{\Dsidebarwidth}{0.45\linewidth}
-\providecommand{\DNsidebar}[1]{
-  \parpic[\Dsidebarposition]{%
-    \begin{minipage}[t]{\Dsidebarwidth}%
-      % Doing this with nested minipages is ugly, but I haven't found
-      % another way to place vertical space before and after the fbox.
-      \vspace{\Dsidebarvmargin}%
-      {%
-        \setlength{\fboxrule}{\Dsidebarframewidth}%
-        \setlength{\fboxsep}{\Dsidebarpadding}%
-        \fbox{%
-          \begin{minipage}[t]{\linewidth}%
-            \setlength{\parindent}{\Dboxparindent}%
-            #1%
-          \end{minipage}%
-        }%
-      }%
-      \vspace{\Dsidebarvmargin}%
-    \end{minipage}%
-  }%
-}
-
-
-% Citations and footnotes.
-\providecommand{\Dformatfootnote}[1]{%
-  % Format footnote.
-  {%
-    \footnotesize#1%
-    % \par is necessary for LaTeX to adjust baselineskip to the
-    % changed font size.
-    \par%
-  }%
-}
-\providecommand{\Dformatcitation}[1]{\Dformatfootnote{#1}}
-\Dprovidelength{\Doriginalbaselineskip}{0pt}
-\providecommand{\DNfootnotereference}[1]{%
-  {%
-    % \baselineskip is 0pt in \textsuperscript, so we save it here.
-    \setlength{\Doriginalbaselineskip}{\baselineskip}%
-    \textsuperscript{#1}%
-  }%
-}
-\providecommand{\DNcitationreference}[1]{{[}#1{]}}
-\Dprovidelength{\Dfootnotesep}{3.5pt}
-\providecommand{\Dsetfootnotespacing}{%
-  % Spacing commands executed at the beginning of footnotes.
-  \setlength{\parindent}{0pt}%
-  \hspace{1em}%
-}
-\providecommand{\DNfootnote}[1]{%
-  % See ltfloat.dtx for details.
-  {%
-    \insert\footins{%
-      % BUG: This is too small if the user adds
-      % \onehalfspacing or \doublespace.
-      \vspace{\Dfootnotesep}%
-      \Dsetfootnotespacing%
-      \Dformatfootnote{#1}%
-    }%
-  }%
-}
-\providecommand{\DNcitation}[1]{\DNfootnote{#1}}
-\providecommand{\Dformatfootnotelabel}[1]{%
-  % Keep \footnotesize in footnote labels (\textsuperscript would
-  % reduce the font size even more).
-  \textsuperscript{\footnotesize#1{ }}%
-}
-\providecommand{\Dformatcitationlabel}[1]{{[}#1{]}{ }}
-\providecommand{\Dformatmultiplebackrefs}[1]{%
-  % If in printing mode, do not write out multiple backrefs.
-  \ifthenelse{\equal{\Dprinting}{true}}{}{\textsl{#1}}%
-}
-\providecommand{\Dthislabel}{}
-\providecommand{\DNlabel}[1]{%
-  % Footnote or citatation label.
-  \renewcommand{\Dthislabel}{#1}%
-  \ifthenelse{\not\equal{\DEVsinglebackref}{}}{%
-    \let\Doriginallabel=\Dthislabel%
-    \def\Dthislabel{%
-      \Dsinglefootnotebacklink{\DEVsinglebackref}{\Doriginallabel}%
-    }%
-  }{}%
-  \ifthenelse{\equal{\DEVparent}{footnote}}{%
-    % Footnote label.
-    \Dformatfootnotelabel{\Dthislabel}%
-  }{%
-    \ifthenelse{\equal{\DEVparent}{citation}}{%
-      % Citation label.
-      \Dformatcitationlabel{\Dthislabel}%
-    }{}%
-  }%
-  % If there are multiple backrefs, add them now.
-  \Dformatmultiplebackrefs{\DEVmultiplebackrefs}%
-}
-\providecommand{\Dsinglefootnotebacklink}[2]{%
-  % Create normal backlink of a footnote label.  Parameters:
-  % 1. ID.
-  % 2. Link text.
-  % Treat like a footnote reference.
-  \Dimplicitfootnotereference{\##1}{#2}%
-}
-\providecommand{\DECmultifootnotebacklink}[2]{%
-  % Create generated backlink, as in (1, 2).  Parameters:
-  % 1. ID.
-  % 2. Link text.
-  % Treat like a footnote reference.
-  \Dimplicitfootnotereference{\##1}{#2}%
-}
-\providecommand{\Dsinglecitationbacklink}[2]{\Dsinglefootnotebacklink{#1}{#2}}
-\providecommand{\DECmulticitationbacklink}[2]{\DECmultifootnotebacklink{#1}{#2}}
-
-
-\providecommand{\DECmaketable}[2]{%
-  % Make table.  Parameters:
-  % 1. Table spec (like "|p|p|").
-  % 2. Table contents.
-  {%
-    \ifthenelse{\equal{\Dinsidetabular}{true}}{%
-      % Inside longtable; we cannot have nested longtables.
-      \begin{tabular}{#1}%
-        \hline%
-        #2%
-      \end{tabular}%
-    }{%
-      \renewcommand{\Dinsidetabular}{true}%
-      \begin{longtable}{#1}%
-        \hline%
-        #2%
-      \end{longtable}%
-    }%
-  }%
-}
-\providecommand{\DNthead}[1]{%
-  #1%
-  \endhead%
-}
-\providecommand{\DNrow}[1]{%
-  #1\tabularnewline%
-  \hline%
-}
-\providecommand{\Dinsidemulticolumn}{false}
-\providecommand{\Dcompensatingmulticol}[3]{%
-  \multicolumn{#1}{#2}{%
-    {%
-      \renewcommand{\Dinsidemulticolumn}{true}%
-      % Compensate for weird missing vertical space at top of paragraph.
-      \raisebox{-2.5pt}{#3}%
-    }%
-  }%
-}
-\providecommand{\DECcolspan}[2]{%
-  % Take care of the morecols attribute (but incremented by 1).
-  &%
-  \Dcompensatingmulticol{#1}{l|}{#2}%
-}
-\providecommand{\DECcolspanleft}[2]{%
-  % Like \Dmorecols, but called for the leftmost entries in a table
-  % row.
-  \Dcompensatingmulticol{#1}{|l|}{#2}%
-}
-\providecommand{\DECsubsequententry}[1]{%
-  &#1%
-}
-\providecommand{\DNentry}[1]{%
-  % The following sequence adds minimal vertical space above the top
-  % lines of the first cell paragraph, so that vertical space is
-  % balanced at the top and bottom of table cells.
-  \ifthenelse{\equal{\Dinsidemulticolumn}{false}}{%
-    \vspace{-1em}\vspace{-\parskip}\par%
-  }{}%
-  #1%
-  % No need to add an ampersand ("&"); that's done by \DECsubsequententry.
-}
-\providecommand{\DAtableheaderentry}[5]{\Dformattableheaderentry{#5}}
-\providecommand{\Dformattableheaderentry}[1]{{\bfseries#1}}
-
-
-\providecommand{\DNsystemmessage}[1]{%
-  {%
-    \ifthenelse{\equal{\Dprinting}{false}}{\color{red}}{}%
-    \bfseries%
-    #1%
-  }%
-}
-
-
-\providecommand{\Dinsidehalign}{false}
-\newsavebox{\Dalignedimagebox}
-\Dprovidelength{\Dalignedimagewidth}{0pt}
-\providecommand{\Dhalign}[2]{%
-  % Horizontally align the contents to the left or right so that the
-  % text flows around it.
-  % Parameters:
-  % 1. l or r
-  % 2. Contents.
-  \renewcommand{\Dinsidehalign}{true}%
-  % For some obscure reason \parpic consumes some vertical space.
-  \vspace{-3pt}%
-  % Now we do something *really* ugly, but this enables us to wrap the
-  % image in a minipage while still allowing tight frames when
-  % class=border (see \DNimageCborder).
-  \sbox{\Dalignedimagebox}{#2}%
-  \settowidth{\Dalignedimagewidth}{\usebox{\Dalignedimagebox}}%
-  \parpic[#1]{%
-    \begin{minipage}[b]{\Dalignedimagewidth}%
-      % Compensate for previously added space, but not entirely.
-      \vspace*{2.0pt}%
-      \vspace*{\Dfloatimagetopmargin}%
-      \usebox{\Dalignedimagebox}%
-      \vspace*{1.5pt}%
-      \vspace*{\Dfloatimagebottommargin}%
-    \end{minipage}%
-  }%
-  \renewcommand{\Dinsidehalign}{false}%
-}
-
-
-% Maximum width of an image.
-\providecommand{\Dimagemaxwidth}{\linewidth}
-\providecommand{\Dfloatimagemaxwidth}{0.5\linewidth}
-% Auxiliary variable.
-\Dprovidelength{\Dcurrentimagewidth}{0pt}
-\providecommand{\DNimageAalign}[5]{%
-  \ifthenelse{\equal{#3}{left}}{%
-    \Dhalign{l}{#5}%
-  }{%
-    \ifthenelse{\equal{#3}{right}}{%
-      \Dhalign{r}{#5}%
-    }{%
-      \ifthenelse{\equal{#3}{center}}{%
-        % Text floating around centered figures is a bad idea.  Thus
-        % we use a center environment.  Note that no extra space is
-        % added by the writer, so the space added by the center
-        % environment is fine.
-        \begin{center}#5\end{center}%
-      }{%
-        #5%
-      }%
-    }%
-  }%
-}
-% Base path for images.
-\providecommand{\Dimagebase}{}
-% Auxiliary command.  Current image path.
-\providecommand{\Dimagepath}{}
-\providecommand{\DNimageAuri}[5]{%
-  % Insert image.  We treat the URI like a path here.
-  \renewcommand{\Dimagepath}{\Dimagebase#3}%
-  \Difdefined{DcurrentNimageAwidth}{%
-    \Dwidthimage{\DEVcurrentNimageAwidth}{\Dimagepath}%
-  }{%
-    \Dsimpleimage{\Dimagepath}%
-  }%
-}
-\Dprovidelength{\Dfloatimagevmargin}{0pt}
-\providecommand{\Dfloatimagetopmargin}{\Dfloatimagevmargin}
-\providecommand{\Dfloatimagebottommargin}{\Dfloatimagevmargin}
-\providecommand{\Dwidthimage}[2]{%
-  % Image with specified width.
-  % Parameters:
-  % 1. Image width.
-  % 2. Image path.
-  % Need to make bottom-alignment dependent on align attribute (add
-  % functional test first).  Need to observe height attribute.
-  %\begin{minipage}[b]{#1}%
-    \includegraphics[width=#1,height=\textheight,keepaspectratio]{#2}%
-  %\end{minipage}%
-}  
-\providecommand{\Dcurrentimagemaxwidth}{}
-\providecommand{\Dsimpleimage}[1]{%
-  % Insert image, without much parametrization.
-  \settowidth{\Dcurrentimagewidth}{\includegraphics{#1}}%
-  \ifthenelse{\equal{\Dinsidehalign}{true}}{%
-    \renewcommand{\Dcurrentimagemaxwidth}{\Dfloatimagemaxwidth}%
-  }{%
-    \renewcommand{\Dcurrentimagemaxwidth}{\Dimagemaxwidth}%
-  }%
-  \ifthenelse{\lengthtest{\Dcurrentimagewidth>\Dcurrentimagemaxwidth}}{%
-    \Dwidthimage{\Dcurrentimagemaxwidth}{#1}%
-  }{%
-    \Dwidthimage{\Dcurrentimagewidth}{#1}%
-  }%
-}
-\providecommand{\Dwidthimage}[2]{%
-  % Image with specified width.
-  % Parameters:
-  % 1. Image width.
-  % 2. Image path.
-  \Dwidthimage{#1}{#2}%
-}
-
-% Figures.
-\providecommand{\DNfigureAalign}[5]{%
-  % Hack to make it work Right Now.
-  %\def\DEVcurrentNimageAwidth{\DEVcurrentNfigureAwidth}%
-  %
-    %\def\DEVcurrentNimageAwidth{\linewidth}%
-    \DNimageAalign{#1}{#2}{#3}{#4}{%
-      \begin{minipage}[b]{0.4\linewidth}#5\end{minipage}}%
-    %\let\DEVcurrentNimageAwidth=\relax%
-  %
-  %\let\DEVcurrentNimageAwidth=\relax%
-}
-\providecommand{\DNcaption}[1]{\par\noindent{\slshape#1}}
-\providecommand{\DNlegend}[1]{\DECauxiliaryspace#1}
-
-\providecommand{\DCborder}[1]{\fbox{#1}}
-% No padding between image and border.
-\providecommand{\DNimageCborder}[1]{\frame{#1}}
-
-
-% Need to replace with language-specific stuff.  Maybe look at
-% csquotes.sty and ask the author for permission to use parts of it.
-\providecommand{\DECtextleftdblquote}{``}
-\providecommand{\DECtextrightdblquote}{''}
-
-% Table of contents:
-\Dprovidelength{\Dtocininitialsectnumwidth}{2.4em}
-\Dprovidelength{\Dtocadditionalsectnumwidth}{0.7em}
-% Level inside a table of contents.  While this is at -1, we are not
-% inside a TOC.
-\Dprovidecounter{Dtoclevel}{-1}%
-\providecommand{\Dlocaltoc}{false}%
-\providecommand{\DNtopicClocal}[1]{%
-  \renewcommand{\Dlocaltoc}{true}%
-  \addtolength{\Dtocsectnumwidth}{2\Dtocadditionalsectnumwidth}%
-  \addtolength{\Dtocindent}{-2\Dtocadditionalsectnumwidth}%
-  #1%
-  \addtolength{\Dtocindent}{2\Dtocadditionalsectnumwidth}%
-  \addtolength{\Dtocsectnumwidth}{-2\Dtocadditionalsectnumwidth}%
-  \renewcommand{\Dlocaltoc}{false}%
-}
-\Dprovidelength{\Dtocindent}{0pt}%
-\Dprovidelength{\Dtocsectnumwidth}{\Dtocininitialsectnumwidth}
-% Compensate for one additional TOC indentation space so that the
-% top-level is unindented.
-\addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}
-\addtolength{\Dtocindent}{-\Dtocsectnumwidth}
-\providecommand{\Difinsidetoc}[2]{%
-  \ifthenelse{\not\equal{\theDtoclevel}{-1}}{#1}{#2}%
-}
-\providecommand{\DNgeneratedCsectnum}[1]{%
-  \Difinsidetoc{%
-    % Section number inside TOC.
-    \makebox[\Dtocsectnumwidth][l]{#1}%
-  }{%
-    % Section number inside section title.
-    #1\quad%
-  }%
-}
-\providecommand{\Dtocbulletlist}[1]{%
-  \addtocounter{Dtoclevel}{1}%
-  \addtolength{\Dtocindent}{\Dtocsectnumwidth}%
-  \addtolength{\Dtocsectnumwidth}{\Dtocadditionalsectnumwidth}%
-  #1%
-  \addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}%
-  \addtolength{\Dtocindent}{-\Dtocsectnumwidth}%
-  \addtocounter{Dtoclevel}{-1}%
-}
-
-
-% For \DECpixelunit, the length value is pre-multiplied with 0.75, so by
-% specifying "pt" we get the same notion of "pixel" as graphicx.
-\providecommand{\DECpixelunit}{pt}
-% Normally lengths are relative to the current linewidth.
-\providecommand{\DECrelativeunit}{\linewidth}
-
-
-% ACTION: These commands actually *do* something.
-% Ultimately, everything should be done here, and no active content should be
-% above (not even \usepackage).
-
-\DSearly
-\DSpackages
-\DSfrenchspacing
-\DSsymbols
-\DSlate
-
-\makeatother
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/unicode_map.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2369 +0,0 @@
-# $Id$
-# Author: Lea Wiemann <LeWiemann@gmail.com>
-# Copyright: This file has been placed in the public domain.
-
-# This is a mapping of Unicode characters to LaTeX equivalents.
-# The information has been extracted from
-# <http://www.w3.org/2003/entities/xml/unicode.xml>, written by
-# David Carlisle and Sebastian Rahtz.
-#
-# The extraction has been done by the "create_unimap.py" script
-# located at <http://docutils.sf.net/tools/dev/create_unimap.py>.
-
-unicode_map = {u'\xa0': '$~$',
-u'\xa1': '{\\textexclamdown}',
-u'\xa2': '{\\textcent}',
-u'\xa3': '{\\textsterling}',
-u'\xa4': '{\\textcurrency}',
-u'\xa5': '{\\textyen}',
-u'\xa6': '{\\textbrokenbar}',
-u'\xa7': '{\\textsection}',
-u'\xa8': '{\\textasciidieresis}',
-u'\xa9': '{\\textcopyright}',
-u'\xaa': '{\\textordfeminine}',
-u'\xab': '{\\guillemotleft}',
-u'\xac': '$\\lnot$',
-u'\xad': '$\\-$',
-u'\xae': '{\\textregistered}',
-u'\xaf': '{\\textasciimacron}',
-u'\xb0': '{\\textdegree}',
-u'\xb1': '$\\pm$',
-u'\xb2': '${^2}$',
-u'\xb3': '${^3}$',
-u'\xb4': '{\\textasciiacute}',
-u'\xb5': '$\\mathrm{\\mu}$',
-u'\xb6': '{\\textparagraph}',
-u'\xb7': '$\\cdot$',
-u'\xb8': '{\\c{}}',
-u'\xb9': '${^1}$',
-u'\xba': '{\\textordmasculine}',
-u'\xbb': '{\\guillemotright}',
-u'\xbc': '{\\textonequarter}',
-u'\xbd': '{\\textonehalf}',
-u'\xbe': '{\\textthreequarters}',
-u'\xbf': '{\\textquestiondown}',
-u'\xc0': '{\\`{A}}',
-u'\xc1': "{\\'{A}}",
-u'\xc2': '{\\^{A}}',
-u'\xc3': '{\\~{A}}',
-u'\xc4': '{\\"{A}}',
-u'\xc5': '{\\AA}',
-u'\xc6': '{\\AE}',
-u'\xc7': '{\\c{C}}',
-u'\xc8': '{\\`{E}}',
-u'\xc9': "{\\'{E}}",
-u'\xca': '{\\^{E}}',
-u'\xcb': '{\\"{E}}',
-u'\xcc': '{\\`{I}}',
-u'\xcd': "{\\'{I}}",
-u'\xce': '{\\^{I}}',
-u'\xcf': '{\\"{I}}',
-u'\xd0': '{\\DH}',
-u'\xd1': '{\\~{N}}',
-u'\xd2': '{\\`{O}}',
-u'\xd3': "{\\'{O}}",
-u'\xd4': '{\\^{O}}',
-u'\xd5': '{\\~{O}}',
-u'\xd6': '{\\"{O}}',
-u'\xd7': '{\\texttimes}',
-u'\xd8': '{\\O}',
-u'\xd9': '{\\`{U}}',
-u'\xda': "{\\'{U}}",
-u'\xdb': '{\\^{U}}',
-u'\xdc': '{\\"{U}}',
-u'\xdd': "{\\'{Y}}",
-u'\xde': '{\\TH}',
-u'\xdf': '{\\ss}',
-u'\xe0': '{\\`{a}}',
-u'\xe1': "{\\'{a}}",
-u'\xe2': '{\\^{a}}',
-u'\xe3': '{\\~{a}}',
-u'\xe4': '{\\"{a}}',
-u'\xe5': '{\\aa}',
-u'\xe6': '{\\ae}',
-u'\xe7': '{\\c{c}}',
-u'\xe8': '{\\`{e}}',
-u'\xe9': "{\\'{e}}",
-u'\xea': '{\\^{e}}',
-u'\xeb': '{\\"{e}}',
-u'\xec': '{\\`{\\i}}',
-u'\xed': "{\\'{\\i}}",
-u'\xee': '{\\^{\\i}}',
-u'\xef': '{\\"{\\i}}',
-u'\xf0': '{\\dh}',
-u'\xf1': '{\\~{n}}',
-u'\xf2': '{\\`{o}}',
-u'\xf3': "{\\'{o}}",
-u'\xf4': '{\\^{o}}',
-u'\xf5': '{\\~{o}}',
-u'\xf6': '{\\"{o}}',
-u'\xf7': '$\\div$',
-u'\xf8': '{\\o}',
-u'\xf9': '{\\`{u}}',
-u'\xfa': "{\\'{u}}",
-u'\xfb': '{\\^{u}}',
-u'\xfc': '{\\"{u}}',
-u'\xfd': "{\\'{y}}",
-u'\xfe': '{\\th}',
-u'\xff': '{\\"{y}}',
-u'\u0100': '{\\={A}}',
-u'\u0101': '{\\={a}}',
-u'\u0102': '{\\u{A}}',
-u'\u0103': '{\\u{a}}',
-u'\u0104': '{\\k{A}}',
-u'\u0105': '{\\k{a}}',
-u'\u0106': "{\\'{C}}",
-u'\u0107': "{\\'{c}}",
-u'\u0108': '{\\^{C}}',
-u'\u0109': '{\\^{c}}',
-u'\u010a': '{\\.{C}}',
-u'\u010b': '{\\.{c}}',
-u'\u010c': '{\\v{C}}',
-u'\u010d': '{\\v{c}}',
-u'\u010e': '{\\v{D}}',
-u'\u010f': '{\\v{d}}',
-u'\u0110': '{\\DJ}',
-u'\u0111': '{\\dj}',
-u'\u0112': '{\\={E}}',
-u'\u0113': '{\\={e}}',
-u'\u0114': '{\\u{E}}',
-u'\u0115': '{\\u{e}}',
-u'\u0116': '{\\.{E}}',
-u'\u0117': '{\\.{e}}',
-u'\u0118': '{\\k{E}}',
-u'\u0119': '{\\k{e}}',
-u'\u011a': '{\\v{E}}',
-u'\u011b': '{\\v{e}}',
-u'\u011c': '{\\^{G}}',
-u'\u011d': '{\\^{g}}',
-u'\u011e': '{\\u{G}}',
-u'\u011f': '{\\u{g}}',
-u'\u0120': '{\\.{G}}',
-u'\u0121': '{\\.{g}}',
-u'\u0122': '{\\c{G}}',
-u'\u0123': '{\\c{g}}',
-u'\u0124': '{\\^{H}}',
-u'\u0125': '{\\^{h}}',
-u'\u0126': '{{\\fontencoding{LELA}\\selectfont\\char40}}',
-u'\u0127': '$\\Elzxh$',
-u'\u0128': '{\\~{I}}',
-u'\u0129': '{\\~{\\i}}',
-u'\u012a': '{\\={I}}',
-u'\u012b': '{\\={\\i}}',
-u'\u012c': '{\\u{I}}',
-u'\u012d': '{\\u{\\i}}',
-u'\u012e': '{\\k{I}}',
-u'\u012f': '{\\k{i}}',
-u'\u0130': '{\\.{I}}',
-u'\u0131': '{\\i}',
-u'\u0132': '{IJ}',
-u'\u0133': '{ij}',
-u'\u0134': '{\\^{J}}',
-u'\u0135': '{\\^{\\j}}',
-u'\u0136': '{\\c{K}}',
-u'\u0137': '{\\c{k}}',
-u'\u0138': '{{\\fontencoding{LELA}\\selectfont\\char91}}',
-u'\u0139': "{\\'{L}}",
-u'\u013a': "{\\'{l}}",
-u'\u013b': '{\\c{L}}',
-u'\u013c': '{\\c{l}}',
-u'\u013d': '{\\v{L}}',
-u'\u013e': '{\\v{l}}',
-u'\u013f': '{{\\fontencoding{LELA}\\selectfont\\char201}}',
-u'\u0140': '{{\\fontencoding{LELA}\\selectfont\\char202}}',
-u'\u0141': '{\\L}',
-u'\u0142': '{\\l}',
-u'\u0143': "{\\'{N}}",
-u'\u0144': "{\\'{n}}",
-u'\u0145': '{\\c{N}}',
-u'\u0146': '{\\c{n}}',
-u'\u0147': '{\\v{N}}',
-u'\u0148': '{\\v{n}}',
-u'\u0149': "{'n}",
-u'\u014a': '{\\NG}',
-u'\u014b': '{\\ng}',
-u'\u014c': '{\\={O}}',
-u'\u014d': '{\\={o}}',
-u'\u014e': '{\\u{O}}',
-u'\u014f': '{\\u{o}}',
-u'\u0150': '{\\H{O}}',
-u'\u0151': '{\\H{o}}',
-u'\u0152': '{\\OE}',
-u'\u0153': '{\\oe}',
-u'\u0154': "{\\'{R}}",
-u'\u0155': "{\\'{r}}",
-u'\u0156': '{\\c{R}}',
-u'\u0157': '{\\c{r}}',
-u'\u0158': '{\\v{R}}',
-u'\u0159': '{\\v{r}}',
-u'\u015a': "{\\'{S}}",
-u'\u015b': "{\\'{s}}",
-u'\u015c': '{\\^{S}}',
-u'\u015d': '{\\^{s}}',
-u'\u015e': '{\\c{S}}',
-u'\u015f': '{\\c{s}}',
-u'\u0160': '{\\v{S}}',
-u'\u0161': '{\\v{s}}',
-u'\u0162': '{\\c{T}}',
-u'\u0163': '{\\c{t}}',
-u'\u0164': '{\\v{T}}',
-u'\u0165': '{\\v{t}}',
-u'\u0166': '{{\\fontencoding{LELA}\\selectfont\\char47}}',
-u'\u0167': '{{\\fontencoding{LELA}\\selectfont\\char63}}',
-u'\u0168': '{\\~{U}}',
-u'\u0169': '{\\~{u}}',
-u'\u016a': '{\\={U}}',
-u'\u016b': '{\\={u}}',
-u'\u016c': '{\\u{U}}',
-u'\u016d': '{\\u{u}}',
-u'\u016e': '{\\r{U}}',
-u'\u016f': '{\\r{u}}',
-u'\u0170': '{\\H{U}}',
-u'\u0171': '{\\H{u}}',
-u'\u0172': '{\\k{U}}',
-u'\u0173': '{\\k{u}}',
-u'\u0174': '{\\^{W}}',
-u'\u0175': '{\\^{w}}',
-u'\u0176': '{\\^{Y}}',
-u'\u0177': '{\\^{y}}',
-u'\u0178': '{\\"{Y}}',
-u'\u0179': "{\\'{Z}}",
-u'\u017a': "{\\'{z}}",
-u'\u017b': '{\\.{Z}}',
-u'\u017c': '{\\.{z}}',
-u'\u017d': '{\\v{Z}}',
-u'\u017e': '{\\v{z}}',
-u'\u0192': '$f$',
-u'\u0195': '{\\texthvlig}',
-u'\u019e': '{\\textnrleg}',
-u'\u01aa': '$\\eth$',
-u'\u01ba': '{{\\fontencoding{LELA}\\selectfont\\char195}}',
-u'\u01c2': '{\\textdoublepipe}',
-u'\u01f5': "{\\'{g}}",
-u'\u0250': '$\\Elztrna$',
-u'\u0252': '$\\Elztrnsa$',
-u'\u0254': '$\\Elzopeno$',
-u'\u0256': '$\\Elzrtld$',
-u'\u0258': '{{\\fontencoding{LEIP}\\selectfont\\char61}}',
-u'\u0259': '$\\Elzschwa$',
-u'\u025b': '$\\varepsilon$',
-u'\u0261': '{g}',
-u'\u0263': '$\\Elzpgamma$',
-u'\u0264': '$\\Elzpbgam$',
-u'\u0265': '$\\Elztrnh$',
-u'\u026c': '$\\Elzbtdl$',
-u'\u026d': '$\\Elzrtll$',
-u'\u026f': '$\\Elztrnm$',
-u'\u0270': '$\\Elztrnmlr$',
-u'\u0271': '$\\Elzltlmr$',
-u'\u0272': '{\\Elzltln}',
-u'\u0273': '$\\Elzrtln$',
-u'\u0277': '$\\Elzclomeg$',
-u'\u0278': '{\\textphi}',
-u'\u0279': '$\\Elztrnr$',
-u'\u027a': '$\\Elztrnrl$',
-u'\u027b': '$\\Elzrttrnr$',
-u'\u027c': '$\\Elzrl$',
-u'\u027d': '$\\Elzrtlr$',
-u'\u027e': '$\\Elzfhr$',
-u'\u027f': '{{\\fontencoding{LEIP}\\selectfont\\char202}}',
-u'\u0282': '$\\Elzrtls$',
-u'\u0283': '$\\Elzesh$',
-u'\u0287': '$\\Elztrnt$',
-u'\u0288': '$\\Elzrtlt$',
-u'\u028a': '$\\Elzpupsil$',
-u'\u028b': '$\\Elzpscrv$',
-u'\u028c': '$\\Elzinvv$',
-u'\u028d': '$\\Elzinvw$',
-u'\u028e': '$\\Elztrny$',
-u'\u0290': '$\\Elzrtlz$',
-u'\u0292': '$\\Elzyogh$',
-u'\u0294': '$\\Elzglst$',
-u'\u0295': '$\\Elzreglst$',
-u'\u0296': '$\\Elzinglst$',
-u'\u029e': '{\\textturnk}',
-u'\u02a4': '$\\Elzdyogh$',
-u'\u02a7': '$\\Elztesh$',
-u'\u02bc': "{'}",
-u'\u02c7': '{\\textasciicaron}',
-u'\u02c8': '$\\Elzverts$',
-u'\u02cc': '$\\Elzverti$',
-u'\u02d0': '$\\Elzlmrk$',
-u'\u02d1': '$\\Elzhlmrk$',
-u'\u02d2': '$\\Elzsbrhr$',
-u'\u02d3': '$\\Elzsblhr$',
-u'\u02d4': '$\\Elzrais$',
-u'\u02d5': '$\\Elzlow$',
-u'\u02d8': '{\\textasciibreve}',
-u'\u02d9': '{\\textperiodcentered}',
-u'\u02da': '{\\r{}}',
-u'\u02db': '{\\k{}}',
-u'\u02dc': '{\\texttildelow}',
-u'\u02dd': '{\\H{}}',
-u'\u02e5': '{\\tone{55}}',
-u'\u02e6': '{\\tone{44}}',
-u'\u02e7': '{\\tone{33}}',
-u'\u02e8': '{\\tone{22}}',
-u'\u02e9': '{\\tone{11}}',
-u'\u0300': '{\\`}',
-u'\u0301': "{\\'}",
-u'\u0302': '{\\^}',
-u'\u0303': '{\\~}',
-u'\u0304': '{\\=}',
-u'\u0306': '{\\u}',
-u'\u0307': '{\\.}',
-u'\u0308': '{\\"}',
-u'\u030a': '{\\r}',
-u'\u030b': '{\\H}',
-u'\u030c': '{\\v}',
-u'\u030f': '{\\cyrchar\\C}',
-u'\u0311': '{{\\fontencoding{LECO}\\selectfont\\char177}}',
-u'\u0318': '{{\\fontencoding{LECO}\\selectfont\\char184}}',
-u'\u0319': '{{\\fontencoding{LECO}\\selectfont\\char185}}',
-u'\u0321': '$\\Elzpalh$',
-u'\u0322': '{\\Elzrh}',
-u'\u0327': '{\\c}',
-u'\u0328': '{\\k}',
-u'\u032a': '$\\Elzsbbrg$',
-u'\u032b': '{{\\fontencoding{LECO}\\selectfont\\char203}}',
-u'\u032f': '{{\\fontencoding{LECO}\\selectfont\\char207}}',
-u'\u0335': '{\\Elzxl}',
-u'\u0336': '{\\Elzbar}',
-u'\u0337': '{{\\fontencoding{LECO}\\selectfont\\char215}}',
-u'\u0338': '{{\\fontencoding{LECO}\\selectfont\\char216}}',
-u'\u033a': '{{\\fontencoding{LECO}\\selectfont\\char218}}',
-u'\u033b': '{{\\fontencoding{LECO}\\selectfont\\char219}}',
-u'\u033c': '{{\\fontencoding{LECO}\\selectfont\\char220}}',
-u'\u033d': '{{\\fontencoding{LECO}\\selectfont\\char221}}',
-u'\u0361': '{{\\fontencoding{LECO}\\selectfont\\char225}}',
-u'\u0386': "{\\'{A}}",
-u'\u0388': "{\\'{E}}",
-u'\u0389': "{\\'{H}}",
-u'\u038a': "{\\'{}{I}}",
-u'\u038c': "{\\'{}O}",
-u'\u038e': "$\\mathrm{'Y}$",
-u'\u038f': "$\\mathrm{'\\Omega}$",
-u'\u0390': '$\\acute{\\ddot{\\iota}}$',
-u'\u0391': '$\\Alpha$',
-u'\u0392': '$\\Beta$',
-u'\u0393': '$\\Gamma$',
-u'\u0394': '$\\Delta$',
-u'\u0395': '$\\Epsilon$',
-u'\u0396': '$\\Zeta$',
-u'\u0397': '$\\Eta$',
-u'\u0398': '$\\Theta$',
-u'\u0399': '$\\Iota$',
-u'\u039a': '$\\Kappa$',
-u'\u039b': '$\\Lambda$',
-u'\u039c': '$M$',
-u'\u039d': '$N$',
-u'\u039e': '$\\Xi$',
-u'\u039f': '$O$',
-u'\u03a0': '$\\Pi$',
-u'\u03a1': '$\\Rho$',
-u'\u03a3': '$\\Sigma$',
-u'\u03a4': '$\\Tau$',
-u'\u03a5': '$\\Upsilon$',
-u'\u03a6': '$\\Phi$',
-u'\u03a7': '$\\Chi$',
-u'\u03a8': '$\\Psi$',
-u'\u03a9': '$\\Omega$',
-u'\u03aa': '$\\mathrm{\\ddot{I}}$',
-u'\u03ab': '$\\mathrm{\\ddot{Y}}$',
-u'\u03ac': "{\\'{$\\alpha$}}",
-u'\u03ad': '$\\acute{\\epsilon}$',
-u'\u03ae': '$\\acute{\\eta}$',
-u'\u03af': '$\\acute{\\iota}$',
-u'\u03b0': '$\\acute{\\ddot{\\upsilon}}$',
-u'\u03b1': '$\\alpha$',
-u'\u03b2': '$\\beta$',
-u'\u03b3': '$\\gamma$',
-u'\u03b4': '$\\delta$',
-u'\u03b5': '$\\epsilon$',
-u'\u03b6': '$\\zeta$',
-u'\u03b7': '$\\eta$',
-u'\u03b8': '{\\texttheta}',
-u'\u03b9': '$\\iota$',
-u'\u03ba': '$\\kappa$',
-u'\u03bb': '$\\lambda$',
-u'\u03bc': '$\\mu$',
-u'\u03bd': '$\\nu$',
-u'\u03be': '$\\xi$',
-u'\u03bf': '$o$',
-u'\u03c0': '$\\pi$',
-u'\u03c1': '$\\rho$',
-u'\u03c2': '$\\varsigma$',
-u'\u03c3': '$\\sigma$',
-u'\u03c4': '$\\tau$',
-u'\u03c5': '$\\upsilon$',
-u'\u03c6': '$\\varphi$',
-u'\u03c7': '$\\chi$',
-u'\u03c8': '$\\psi$',
-u'\u03c9': '$\\omega$',
-u'\u03ca': '$\\ddot{\\iota}$',
-u'\u03cb': '$\\ddot{\\upsilon}$',
-u'\u03cc': "{\\'{o}}",
-u'\u03cd': '$\\acute{\\upsilon}$',
-u'\u03ce': '$\\acute{\\omega}$',
-u'\u03d0': '{\\Pisymbol{ppi022}{87}}',
-u'\u03d1': '{\\textvartheta}',
-u'\u03d2': '$\\Upsilon$',
-u'\u03d5': '$\\phi$',
-u'\u03d6': '$\\varpi$',
-u'\u03da': '$\\Stigma$',
-u'\u03dc': '$\\Digamma$',
-u'\u03dd': '$\\digamma$',
-u'\u03de': '$\\Koppa$',
-u'\u03e0': '$\\Sampi$',
-u'\u03f0': '$\\varkappa$',
-u'\u03f1': '$\\varrho$',
-u'\u03f4': '{\\textTheta}',
-u'\u03f6': '$\\backepsilon$',
-u'\u0401': '{\\cyrchar\\CYRYO}',
-u'\u0402': '{\\cyrchar\\CYRDJE}',
-u'\u0403': "{\\cyrchar{\\'\\CYRG}}",
-u'\u0404': '{\\cyrchar\\CYRIE}',
-u'\u0405': '{\\cyrchar\\CYRDZE}',
-u'\u0406': '{\\cyrchar\\CYRII}',
-u'\u0407': '{\\cyrchar\\CYRYI}',
-u'\u0408': '{\\cyrchar\\CYRJE}',
-u'\u0409': '{\\cyrchar\\CYRLJE}',
-u'\u040a': '{\\cyrchar\\CYRNJE}',
-u'\u040b': '{\\cyrchar\\CYRTSHE}',
-u'\u040c': "{\\cyrchar{\\'\\CYRK}}",
-u'\u040e': '{\\cyrchar\\CYRUSHRT}',
-u'\u040f': '{\\cyrchar\\CYRDZHE}',
-u'\u0410': '{\\cyrchar\\CYRA}',
-u'\u0411': '{\\cyrchar\\CYRB}',
-u'\u0412': '{\\cyrchar\\CYRV}',
-u'\u0413': '{\\cyrchar\\CYRG}',
-u'\u0414': '{\\cyrchar\\CYRD}',
-u'\u0415': '{\\cyrchar\\CYRE}',
-u'\u0416': '{\\cyrchar\\CYRZH}',
-u'\u0417': '{\\cyrchar\\CYRZ}',
-u'\u0418': '{\\cyrchar\\CYRI}',
-u'\u0419': '{\\cyrchar\\CYRISHRT}',
-u'\u041a': '{\\cyrchar\\CYRK}',
-u'\u041b': '{\\cyrchar\\CYRL}',
-u'\u041c': '{\\cyrchar\\CYRM}',
-u'\u041d': '{\\cyrchar\\CYRN}',
-u'\u041e': '{\\cyrchar\\CYRO}',
-u'\u041f': '{\\cyrchar\\CYRP}',
-u'\u0420': '{\\cyrchar\\CYRR}',
-u'\u0421': '{\\cyrchar\\CYRS}',
-u'\u0422': '{\\cyrchar\\CYRT}',
-u'\u0423': '{\\cyrchar\\CYRU}',
-u'\u0424': '{\\cyrchar\\CYRF}',
-u'\u0425': '{\\cyrchar\\CYRH}',
-u'\u0426': '{\\cyrchar\\CYRC}',
-u'\u0427': '{\\cyrchar\\CYRCH}',
-u'\u0428': '{\\cyrchar\\CYRSH}',
-u'\u0429': '{\\cyrchar\\CYRSHCH}',
-u'\u042a': '{\\cyrchar\\CYRHRDSN}',
-u'\u042b': '{\\cyrchar\\CYRERY}',
-u'\u042c': '{\\cyrchar\\CYRSFTSN}',
-u'\u042d': '{\\cyrchar\\CYREREV}',
-u'\u042e': '{\\cyrchar\\CYRYU}',
-u'\u042f': '{\\cyrchar\\CYRYA}',
-u'\u0430': '{\\cyrchar\\cyra}',
-u'\u0431': '{\\cyrchar\\cyrb}',
-u'\u0432': '{\\cyrchar\\cyrv}',
-u'\u0433': '{\\cyrchar\\cyrg}',
-u'\u0434': '{\\cyrchar\\cyrd}',
-u'\u0435': '{\\cyrchar\\cyre}',
-u'\u0436': '{\\cyrchar\\cyrzh}',
-u'\u0437': '{\\cyrchar\\cyrz}',
-u'\u0438': '{\\cyrchar\\cyri}',
-u'\u0439': '{\\cyrchar\\cyrishrt}',
-u'\u043a': '{\\cyrchar\\cyrk}',
-u'\u043b': '{\\cyrchar\\cyrl}',
-u'\u043c': '{\\cyrchar\\cyrm}',
-u'\u043d': '{\\cyrchar\\cyrn}',
-u'\u043e': '{\\cyrchar\\cyro}',
-u'\u043f': '{\\cyrchar\\cyrp}',
-u'\u0440': '{\\cyrchar\\cyrr}',
-u'\u0441': '{\\cyrchar\\cyrs}',
-u'\u0442': '{\\cyrchar\\cyrt}',
-u'\u0443': '{\\cyrchar\\cyru}',
-u'\u0444': '{\\cyrchar\\cyrf}',
-u'\u0445': '{\\cyrchar\\cyrh}',
-u'\u0446': '{\\cyrchar\\cyrc}',
-u'\u0447': '{\\cyrchar\\cyrch}',
-u'\u0448': '{\\cyrchar\\cyrsh}',
-u'\u0449': '{\\cyrchar\\cyrshch}',
-u'\u044a': '{\\cyrchar\\cyrhrdsn}',
-u'\u044b': '{\\cyrchar\\cyrery}',
-u'\u044c': '{\\cyrchar\\cyrsftsn}',
-u'\u044d': '{\\cyrchar\\cyrerev}',
-u'\u044e': '{\\cyrchar\\cyryu}',
-u'\u044f': '{\\cyrchar\\cyrya}',
-u'\u0451': '{\\cyrchar\\cyryo}',
-u'\u0452': '{\\cyrchar\\cyrdje}',
-u'\u0453': "{\\cyrchar{\\'\\cyrg}}",
-u'\u0454': '{\\cyrchar\\cyrie}',
-u'\u0455': '{\\cyrchar\\cyrdze}',
-u'\u0456': '{\\cyrchar\\cyrii}',
-u'\u0457': '{\\cyrchar\\cyryi}',
-u'\u0458': '{\\cyrchar\\cyrje}',
-u'\u0459': '{\\cyrchar\\cyrlje}',
-u'\u045a': '{\\cyrchar\\cyrnje}',
-u'\u045b': '{\\cyrchar\\cyrtshe}',
-u'\u045c': "{\\cyrchar{\\'\\cyrk}}",
-u'\u045e': '{\\cyrchar\\cyrushrt}',
-u'\u045f': '{\\cyrchar\\cyrdzhe}',
-u'\u0460': '{\\cyrchar\\CYROMEGA}',
-u'\u0461': '{\\cyrchar\\cyromega}',
-u'\u0462': '{\\cyrchar\\CYRYAT}',
-u'\u0464': '{\\cyrchar\\CYRIOTE}',
-u'\u0465': '{\\cyrchar\\cyriote}',
-u'\u0466': '{\\cyrchar\\CYRLYUS}',
-u'\u0467': '{\\cyrchar\\cyrlyus}',
-u'\u0468': '{\\cyrchar\\CYRIOTLYUS}',
-u'\u0469': '{\\cyrchar\\cyriotlyus}',
-u'\u046a': '{\\cyrchar\\CYRBYUS}',
-u'\u046c': '{\\cyrchar\\CYRIOTBYUS}',
-u'\u046d': '{\\cyrchar\\cyriotbyus}',
-u'\u046e': '{\\cyrchar\\CYRKSI}',
-u'\u046f': '{\\cyrchar\\cyrksi}',
-u'\u0470': '{\\cyrchar\\CYRPSI}',
-u'\u0471': '{\\cyrchar\\cyrpsi}',
-u'\u0472': '{\\cyrchar\\CYRFITA}',
-u'\u0474': '{\\cyrchar\\CYRIZH}',
-u'\u0478': '{\\cyrchar\\CYRUK}',
-u'\u0479': '{\\cyrchar\\cyruk}',
-u'\u047a': '{\\cyrchar\\CYROMEGARND}',
-u'\u047b': '{\\cyrchar\\cyromegarnd}',
-u'\u047c': '{\\cyrchar\\CYROMEGATITLO}',
-u'\u047d': '{\\cyrchar\\cyromegatitlo}',
-u'\u047e': '{\\cyrchar\\CYROT}',
-u'\u047f': '{\\cyrchar\\cyrot}',
-u'\u0480': '{\\cyrchar\\CYRKOPPA}',
-u'\u0481': '{\\cyrchar\\cyrkoppa}',
-u'\u0482': '{\\cyrchar\\cyrthousands}',
-u'\u0488': '{\\cyrchar\\cyrhundredthousands}',
-u'\u0489': '{\\cyrchar\\cyrmillions}',
-u'\u048c': '{\\cyrchar\\CYRSEMISFTSN}',
-u'\u048d': '{\\cyrchar\\cyrsemisftsn}',
-u'\u048e': '{\\cyrchar\\CYRRTICK}',
-u'\u048f': '{\\cyrchar\\cyrrtick}',
-u'\u0490': '{\\cyrchar\\CYRGUP}',
-u'\u0491': '{\\cyrchar\\cyrgup}',
-u'\u0492': '{\\cyrchar\\CYRGHCRS}',
-u'\u0493': '{\\cyrchar\\cyrghcrs}',
-u'\u0494': '{\\cyrchar\\CYRGHK}',
-u'\u0495': '{\\cyrchar\\cyrghk}',
-u'\u0496': '{\\cyrchar\\CYRZHDSC}',
-u'\u0497': '{\\cyrchar\\cyrzhdsc}',
-u'\u0498': '{\\cyrchar\\CYRZDSC}',
-u'\u0499': '{\\cyrchar\\cyrzdsc}',
-u'\u049a': '{\\cyrchar\\CYRKDSC}',
-u'\u049b': '{\\cyrchar\\cyrkdsc}',
-u'\u049c': '{\\cyrchar\\CYRKVCRS}',
-u'\u049d': '{\\cyrchar\\cyrkvcrs}',
-u'\u049e': '{\\cyrchar\\CYRKHCRS}',
-u'\u049f': '{\\cyrchar\\cyrkhcrs}',
-u'\u04a0': '{\\cyrchar\\CYRKBEAK}',
-u'\u04a1': '{\\cyrchar\\cyrkbeak}',
-u'\u04a2': '{\\cyrchar\\CYRNDSC}',
-u'\u04a3': '{\\cyrchar\\cyrndsc}',
-u'\u04a4': '{\\cyrchar\\CYRNG}',
-u'\u04a5': '{\\cyrchar\\cyrng}',
-u'\u04a6': '{\\cyrchar\\CYRPHK}',
-u'\u04a7': '{\\cyrchar\\cyrphk}',
-u'\u04a8': '{\\cyrchar\\CYRABHHA}',
-u'\u04a9': '{\\cyrchar\\cyrabhha}',
-u'\u04aa': '{\\cyrchar\\CYRSDSC}',
-u'\u04ab': '{\\cyrchar\\cyrsdsc}',
-u'\u04ac': '{\\cyrchar\\CYRTDSC}',
-u'\u04ad': '{\\cyrchar\\cyrtdsc}',
-u'\u04ae': '{\\cyrchar\\CYRY}',
-u'\u04af': '{\\cyrchar\\cyry}',
-u'\u04b0': '{\\cyrchar\\CYRYHCRS}',
-u'\u04b1': '{\\cyrchar\\cyryhcrs}',
-u'\u04b2': '{\\cyrchar\\CYRHDSC}',
-u'\u04b3': '{\\cyrchar\\cyrhdsc}',
-u'\u04b4': '{\\cyrchar\\CYRTETSE}',
-u'\u04b5': '{\\cyrchar\\cyrtetse}',
-u'\u04b6': '{\\cyrchar\\CYRCHRDSC}',
-u'\u04b7': '{\\cyrchar\\cyrchrdsc}',
-u'\u04b8': '{\\cyrchar\\CYRCHVCRS}',
-u'\u04b9': '{\\cyrchar\\cyrchvcrs}',
-u'\u04ba': '{\\cyrchar\\CYRSHHA}',
-u'\u04bb': '{\\cyrchar\\cyrshha}',
-u'\u04bc': '{\\cyrchar\\CYRABHCH}',
-u'\u04bd': '{\\cyrchar\\cyrabhch}',
-u'\u04be': '{\\cyrchar\\CYRABHCHDSC}',
-u'\u04bf': '{\\cyrchar\\cyrabhchdsc}',
-u'\u04c0': '{\\cyrchar\\CYRpalochka}',
-u'\u04c3': '{\\cyrchar\\CYRKHK}',
-u'\u04c4': '{\\cyrchar\\cyrkhk}',
-u'\u04c7': '{\\cyrchar\\CYRNHK}',
-u'\u04c8': '{\\cyrchar\\cyrnhk}',
-u'\u04cb': '{\\cyrchar\\CYRCHLDSC}',
-u'\u04cc': '{\\cyrchar\\cyrchldsc}',
-u'\u04d4': '{\\cyrchar\\CYRAE}',
-u'\u04d5': '{\\cyrchar\\cyrae}',
-u'\u04d8': '{\\cyrchar\\CYRSCHWA}',
-u'\u04d9': '{\\cyrchar\\cyrschwa}',
-u'\u04e0': '{\\cyrchar\\CYRABHDZE}',
-u'\u04e1': '{\\cyrchar\\cyrabhdze}',
-u'\u04e8': '{\\cyrchar\\CYROTLD}',
-u'\u04e9': '{\\cyrchar\\cyrotld}',
-u'\u2002': '{\\hspace{0.6em}}',
-u'\u2003': '{\\hspace{1em}}',
-u'\u2004': '{\\hspace{0.33em}}',
-u'\u2005': '{\\hspace{0.25em}}',
-u'\u2006': '{\\hspace{0.166em}}',
-u'\u2007': '{\\hphantom{0}}',
-u'\u2008': '{\\hphantom{,}}',
-u'\u2009': '{\\hspace{0.167em}}',
-u'\u200a': '$\\mkern1mu$',
-u'\u2010': '{-}',
-u'\u2013': '{\\textendash}',
-u'\u2014': '{\\textemdash}',
-u'\u2015': '{\\rule{1em}{1pt}}',
-u'\u2016': '$\\Vert$',
-u'\u2018': '{`}',
-u'\u2019': "{'}",
-u'\u201a': '{,}',
-u'\u201b': '$\\Elzreapos$',
-u'\u201c': '{\\textquotedblleft}',
-u'\u201d': '{\\textquotedblright}',
-u'\u201e': '{,,}',
-u'\u2020': '{\\textdagger}',
-u'\u2021': '{\\textdaggerdbl}',
-u'\u2022': '{\\textbullet}',
-u'\u2024': '{.}',
-u'\u2025': '{..}',
-u'\u2026': '{\\ldots}',
-u'\u2030': '{\\textperthousand}',
-u'\u2031': '{\\textpertenthousand}',
-u'\u2032': "${'}$",
-u'\u2033': "${''}$",
-u'\u2034': "${'''}$",
-u'\u2035': '$\\backprime$',
-u'\u2039': '{\\guilsinglleft}',
-u'\u203a': '{\\guilsinglright}',
-u'\u2057': "$''''$",
-u'\u205f': '{\\mkern4mu}',
-u'\u2060': '{\\nolinebreak}',
-u'\u20a7': '{\\ensuremath{\\Elzpes}}',
-u'\u20ac': '{\\mbox{\\texteuro}}',
-u'\u20db': '$\\dddot$',
-u'\u20dc': '$\\ddddot$',
-u'\u2102': '$\\mathbb{C}$',
-u'\u210a': '{\\mathscr{g}}',
-u'\u210b': '$\\mathscr{H}$',
-u'\u210c': '$\\mathfrak{H}$',
-u'\u210d': '$\\mathbb{H}$',
-u'\u210f': '$\\hslash$',
-u'\u2110': '$\\mathscr{I}$',
-u'\u2111': '$\\mathfrak{I}$',
-u'\u2112': '$\\mathscr{L}$',
-u'\u2113': '$\\mathscr{l}$',
-u'\u2115': '$\\mathbb{N}$',
-u'\u2116': '{\\cyrchar\\textnumero}',
-u'\u2118': '$\\wp$',
-u'\u2119': '$\\mathbb{P}$',
-u'\u211a': '$\\mathbb{Q}$',
-u'\u211b': '$\\mathscr{R}$',
-u'\u211c': '$\\mathfrak{R}$',
-u'\u211d': '$\\mathbb{R}$',
-u'\u211e': '$\\Elzxrat$',
-u'\u2122': '{\\texttrademark}',
-u'\u2124': '$\\mathbb{Z}$',
-u'\u2126': '$\\Omega$',
-u'\u2127': '$\\mho$',
-u'\u2128': '$\\mathfrak{Z}$',
-u'\u2129': '$\\ElsevierGlyph{2129}$',
-u'\u212b': '{\\AA}',
-u'\u212c': '$\\mathscr{B}$',
-u'\u212d': '$\\mathfrak{C}$',
-u'\u212f': '$\\mathscr{e}$',
-u'\u2130': '$\\mathscr{E}$',
-u'\u2131': '$\\mathscr{F}$',
-u'\u2133': '$\\mathscr{M}$',
-u'\u2134': '$\\mathscr{o}$',
-u'\u2135': '$\\aleph$',
-u'\u2136': '$\\beth$',
-u'\u2137': '$\\gimel$',
-u'\u2138': '$\\daleth$',
-u'\u2153': '$\\textfrac{1}{3}$',
-u'\u2154': '$\\textfrac{2}{3}$',
-u'\u2155': '$\\textfrac{1}{5}$',
-u'\u2156': '$\\textfrac{2}{5}$',
-u'\u2157': '$\\textfrac{3}{5}$',
-u'\u2158': '$\\textfrac{4}{5}$',
-u'\u2159': '$\\textfrac{1}{6}$',
-u'\u215a': '$\\textfrac{5}{6}$',
-u'\u215b': '$\\textfrac{1}{8}$',
-u'\u215c': '$\\textfrac{3}{8}$',
-u'\u215d': '$\\textfrac{5}{8}$',
-u'\u215e': '$\\textfrac{7}{8}$',
-u'\u2190': '$\\leftarrow$',
-u'\u2191': '$\\uparrow$',
-u'\u2192': '$\\rightarrow$',
-u'\u2193': '$\\downarrow$',
-u'\u2194': '$\\leftrightarrow$',
-u'\u2195': '$\\updownarrow$',
-u'\u2196': '$\\nwarrow$',
-u'\u2197': '$\\nearrow$',
-u'\u2198': '$\\searrow$',
-u'\u2199': '$\\swarrow$',
-u'\u219a': '$\\nleftarrow$',
-u'\u219b': '$\\nrightarrow$',
-u'\u219c': '$\\arrowwaveright$',
-u'\u219d': '$\\arrowwaveright$',
-u'\u219e': '$\\twoheadleftarrow$',
-u'\u21a0': '$\\twoheadrightarrow$',
-u'\u21a2': '$\\leftarrowtail$',
-u'\u21a3': '$\\rightarrowtail$',
-u'\u21a6': '$\\mapsto$',
-u'\u21a9': '$\\hookleftarrow$',
-u'\u21aa': '$\\hookrightarrow$',
-u'\u21ab': '$\\looparrowleft$',
-u'\u21ac': '$\\looparrowright$',
-u'\u21ad': '$\\leftrightsquigarrow$',
-u'\u21ae': '$\\nleftrightarrow$',
-u'\u21b0': '$\\Lsh$',
-u'\u21b1': '$\\Rsh$',
-u'\u21b3': '$\\ElsevierGlyph{21B3}$',
-u'\u21b6': '$\\curvearrowleft$',
-u'\u21b7': '$\\curvearrowright$',
-u'\u21ba': '$\\circlearrowleft$',
-u'\u21bb': '$\\circlearrowright$',
-u'\u21bc': '$\\leftharpoonup$',
-u'\u21bd': '$\\leftharpoondown$',
-u'\u21be': '$\\upharpoonright$',
-u'\u21bf': '$\\upharpoonleft$',
-u'\u21c0': '$\\rightharpoonup$',
-u'\u21c1': '$\\rightharpoondown$',
-u'\u21c2': '$\\downharpoonright$',
-u'\u21c3': '$\\downharpoonleft$',
-u'\u21c4': '$\\rightleftarrows$',
-u'\u21c5': '$\\dblarrowupdown$',
-u'\u21c6': '$\\leftrightarrows$',
-u'\u21c7': '$\\leftleftarrows$',
-u'\u21c8': '$\\upuparrows$',
-u'\u21c9': '$\\rightrightarrows$',
-u'\u21ca': '$\\downdownarrows$',
-u'\u21cb': '$\\leftrightharpoons$',
-u'\u21cc': '$\\rightleftharpoons$',
-u'\u21cd': '$\\nLeftarrow$',
-u'\u21ce': '$\\nLeftrightarrow$',
-u'\u21cf': '$\\nRightarrow$',
-u'\u21d0': '$\\Leftarrow$',
-u'\u21d1': '$\\Uparrow$',
-u'\u21d2': '$\\Rightarrow$',
-u'\u21d3': '$\\Downarrow$',
-u'\u21d4': '$\\Leftrightarrow$',
-u'\u21d5': '$\\Updownarrow$',
-u'\u21da': '$\\Lleftarrow$',
-u'\u21db': '$\\Rrightarrow$',
-u'\u21dd': '$\\rightsquigarrow$',
-u'\u21f5': '$\\DownArrowUpArrow$',
-u'\u2200': '$\\forall$',
-u'\u2201': '$\\complement$',
-u'\u2202': '$\\partial$',
-u'\u2203': '$\\exists$',
-u'\u2204': '$\\nexists$',
-u'\u2205': '$\\varnothing$',
-u'\u2207': '$\\nabla$',
-u'\u2208': '$\\in$',
-u'\u2209': '$\\not\\in$',
-u'\u220b': '$\\ni$',
-u'\u220c': '$\\not\\ni$',
-u'\u220f': '$\\prod$',
-u'\u2210': '$\\coprod$',
-u'\u2211': '$\\sum$',
-u'\u2212': '{-}',
-u'\u2213': '$\\mp$',
-u'\u2214': '$\\dotplus$',
-u'\u2216': '$\\setminus$',
-u'\u2217': '${_\\ast}$',
-u'\u2218': '$\\circ$',
-u'\u2219': '$\\bullet$',
-u'\u221a': '$\\surd$',
-u'\u221d': '$\\propto$',
-u'\u221e': '$\\infty$',
-u'\u221f': '$\\rightangle$',
-u'\u2220': '$\\angle$',
-u'\u2221': '$\\measuredangle$',
-u'\u2222': '$\\sphericalangle$',
-u'\u2223': '$\\mid$',
-u'\u2224': '$\\nmid$',
-u'\u2225': '$\\parallel$',
-u'\u2226': '$\\nparallel$',
-u'\u2227': '$\\wedge$',
-u'\u2228': '$\\vee$',
-u'\u2229': '$\\cap$',
-u'\u222a': '$\\cup$',
-u'\u222b': '$\\int$',
-u'\u222c': '$\\int\\!\\int$',
-u'\u222d': '$\\int\\!\\int\\!\\int$',
-u'\u222e': '$\\oint$',
-u'\u222f': '$\\surfintegral$',
-u'\u2230': '$\\volintegral$',
-u'\u2231': '$\\clwintegral$',
-u'\u2232': '$\\ElsevierGlyph{2232}$',
-u'\u2233': '$\\ElsevierGlyph{2233}$',
-u'\u2234': '$\\therefore$',
-u'\u2235': '$\\because$',
-u'\u2237': '$\\Colon$',
-u'\u2238': '$\\ElsevierGlyph{2238}$',
-u'\u223a': '$\\mathbin{{:}\\!\\!{-}\\!\\!{:}}$',
-u'\u223b': '$\\homothetic$',
-u'\u223c': '$\\sim$',
-u'\u223d': '$\\backsim$',
-u'\u223e': '$\\lazysinv$',
-u'\u2240': '$\\wr$',
-u'\u2241': '$\\not\\sim$',
-u'\u2242': '$\\ElsevierGlyph{2242}$',
-u'\u2243': '$\\simeq$',
-u'\u2244': '$\\not\\simeq$',
-u'\u2245': '$\\cong$',
-u'\u2246': '$\\approxnotequal$',
-u'\u2247': '$\\not\\cong$',
-u'\u2248': '$\\approx$',
-u'\u2249': '$\\not\\approx$',
-u'\u224a': '$\\approxeq$',
-u'\u224b': '$\\tildetrpl$',
-u'\u224c': '$\\allequal$',
-u'\u224d': '$\\asymp$',
-u'\u224e': '$\\Bumpeq$',
-u'\u224f': '$\\bumpeq$',
-u'\u2250': '$\\doteq$',
-u'\u2251': '$\\doteqdot$',
-u'\u2252': '$\\fallingdotseq$',
-u'\u2253': '$\\risingdotseq$',
-u'\u2254': '{:=}',
-u'\u2255': '$=:$',
-u'\u2256': '$\\eqcirc$',
-u'\u2257': '$\\circeq$',
-u'\u2259': '$\\estimates$',
-u'\u225a': '$\\ElsevierGlyph{225A}$',
-u'\u225b': '$\\starequal$',
-u'\u225c': '$\\triangleq$',
-u'\u225f': '$\\ElsevierGlyph{225F}$',
-u'\u2260': '$\\not =$',
-u'\u2261': '$\\equiv$',
-u'\u2262': '$\\not\\equiv$',
-u'\u2264': '$\\leq$',
-u'\u2265': '$\\geq$',
-u'\u2266': '$\\leqq$',
-u'\u2267': '$\\geqq$',
-u'\u2268': '$\\lneqq$',
-u'\u2269': '$\\gneqq$',
-u'\u226a': '$\\ll$',
-u'\u226b': '$\\gg$',
-u'\u226c': '$\\between$',
-u'\u226d': '$\\not\\kern-0.3em\\times$',
-u'\u226e': '$\\not<$',
-u'\u226f': '$\\not>$',
-u'\u2270': '$\\not\\leq$',
-u'\u2271': '$\\not\\geq$',
-u'\u2272': '$\\lessequivlnt$',
-u'\u2273': '$\\greaterequivlnt$',
-u'\u2274': '$\\ElsevierGlyph{2274}$',
-u'\u2275': '$\\ElsevierGlyph{2275}$',
-u'\u2276': '$\\lessgtr$',
-u'\u2277': '$\\gtrless$',
-u'\u2278': '$\\notlessgreater$',
-u'\u2279': '$\\notgreaterless$',
-u'\u227a': '$\\prec$',
-u'\u227b': '$\\succ$',
-u'\u227c': '$\\preccurlyeq$',
-u'\u227d': '$\\succcurlyeq$',
-u'\u227e': '$\\precapprox$',
-u'\u227f': '$\\succapprox$',
-u'\u2280': '$\\not\\prec$',
-u'\u2281': '$\\not\\succ$',
-u'\u2282': '$\\subset$',
-u'\u2283': '$\\supset$',
-u'\u2284': '$\\not\\subset$',
-u'\u2285': '$\\not\\supset$',
-u'\u2286': '$\\subseteq$',
-u'\u2287': '$\\supseteq$',
-u'\u2288': '$\\not\\subseteq$',
-u'\u2289': '$\\not\\supseteq$',
-u'\u228a': '$\\subsetneq$',
-u'\u228b': '$\\supsetneq$',
-u'\u228e': '$\\uplus$',
-u'\u228f': '$\\sqsubset$',
-u'\u2290': '$\\sqsupset$',
-u'\u2291': '$\\sqsubseteq$',
-u'\u2292': '$\\sqsupseteq$',
-u'\u2293': '$\\sqcap$',
-u'\u2294': '$\\sqcup$',
-u'\u2295': '$\\oplus$',
-u'\u2296': '$\\ominus$',
-u'\u2297': '$\\otimes$',
-u'\u2298': '$\\oslash$',
-u'\u2299': '$\\odot$',
-u'\u229a': '$\\circledcirc$',
-u'\u229b': '$\\circledast$',
-u'\u229d': '$\\circleddash$',
-u'\u229e': '$\\boxplus$',
-u'\u229f': '$\\boxminus$',
-u'\u22a0': '$\\boxtimes$',
-u'\u22a1': '$\\boxdot$',
-u'\u22a2': '$\\vdash$',
-u'\u22a3': '$\\dashv$',
-u'\u22a4': '$\\top$',
-u'\u22a5': '$\\perp$',
-u'\u22a7': '$\\truestate$',
-u'\u22a8': '$\\forcesextra$',
-u'\u22a9': '$\\Vdash$',
-u'\u22aa': '$\\Vvdash$',
-u'\u22ab': '$\\VDash$',
-u'\u22ac': '$\\nvdash$',
-u'\u22ad': '$\\nvDash$',
-u'\u22ae': '$\\nVdash$',
-u'\u22af': '$\\nVDash$',
-u'\u22b2': '$\\vartriangleleft$',
-u'\u22b3': '$\\vartriangleright$',
-u'\u22b4': '$\\trianglelefteq$',
-u'\u22b5': '$\\trianglerighteq$',
-u'\u22b6': '$\\original$',
-u'\u22b7': '$\\image$',
-u'\u22b8': '$\\multimap$',
-u'\u22b9': '$\\hermitconjmatrix$',
-u'\u22ba': '$\\intercal$',
-u'\u22bb': '$\\veebar$',
-u'\u22be': '$\\rightanglearc$',
-u'\u22c0': '$\\ElsevierGlyph{22C0}$',
-u'\u22c1': '$\\ElsevierGlyph{22C1}$',
-u'\u22c2': '$\\bigcap$',
-u'\u22c3': '$\\bigcup$',
-u'\u22c4': '$\\diamond$',
-u'\u22c5': '$\\cdot$',
-u'\u22c6': '$\\star$',
-u'\u22c7': '$\\divideontimes$',
-u'\u22c8': '$\\bowtie$',
-u'\u22c9': '$\\ltimes$',
-u'\u22ca': '$\\rtimes$',
-u'\u22cb': '$\\leftthreetimes$',
-u'\u22cc': '$\\rightthreetimes$',
-u'\u22cd': '$\\backsimeq$',
-u'\u22ce': '$\\curlyvee$',
-u'\u22cf': '$\\curlywedge$',
-u'\u22d0': '$\\Subset$',
-u'\u22d1': '$\\Supset$',
-u'\u22d2': '$\\Cap$',
-u'\u22d3': '$\\Cup$',
-u'\u22d4': '$\\pitchfork$',
-u'\u22d6': '$\\lessdot$',
-u'\u22d7': '$\\gtrdot$',
-u'\u22d8': '$\\verymuchless$',
-u'\u22d9': '$\\verymuchgreater$',
-u'\u22da': '$\\lesseqgtr$',
-u'\u22db': '$\\gtreqless$',
-u'\u22de': '$\\curlyeqprec$',
-u'\u22df': '$\\curlyeqsucc$',
-u'\u22e2': '$\\not\\sqsubseteq$',
-u'\u22e3': '$\\not\\sqsupseteq$',
-u'\u22e5': '$\\Elzsqspne$',
-u'\u22e6': '$\\lnsim$',
-u'\u22e7': '$\\gnsim$',
-u'\u22e8': '$\\precedesnotsimilar$',
-u'\u22e9': '$\\succnsim$',
-u'\u22ea': '$\\ntriangleleft$',
-u'\u22eb': '$\\ntriangleright$',
-u'\u22ec': '$\\ntrianglelefteq$',
-u'\u22ed': '$\\ntrianglerighteq$',
-u'\u22ee': '$\\vdots$',
-u'\u22ef': '$\\cdots$',
-u'\u22f0': '$\\upslopeellipsis$',
-u'\u22f1': '$\\downslopeellipsis$',
-u'\u2305': '{\\barwedge}',
-u'\u2306': '$\\perspcorrespond$',
-u'\u2308': '$\\lceil$',
-u'\u2309': '$\\rceil$',
-u'\u230a': '$\\lfloor$',
-u'\u230b': '$\\rfloor$',
-u'\u2315': '$\\recorder$',
-u'\u2316': '$\\mathchar"2208$',
-u'\u231c': '$\\ulcorner$',
-u'\u231d': '$\\urcorner$',
-u'\u231e': '$\\llcorner$',
-u'\u231f': '$\\lrcorner$',
-u'\u2322': '$\\frown$',
-u'\u2323': '$\\smile$',
-u'\u2329': '$\\langle$',
-u'\u232a': '$\\rangle$',
-u'\u233d': '$\\ElsevierGlyph{E838}$',
-u'\u23a3': '$\\Elzdlcorn$',
-u'\u23b0': '$\\lmoustache$',
-u'\u23b1': '$\\rmoustache$',
-u'\u2423': '{\\textvisiblespace}',
-u'\u2460': '{\\ding{172}}',
-u'\u2461': '{\\ding{173}}',
-u'\u2462': '{\\ding{174}}',
-u'\u2463': '{\\ding{175}}',
-u'\u2464': '{\\ding{176}}',
-u'\u2465': '{\\ding{177}}',
-u'\u2466': '{\\ding{178}}',
-u'\u2467': '{\\ding{179}}',
-u'\u2468': '{\\ding{180}}',
-u'\u2469': '{\\ding{181}}',
-u'\u24c8': '$\\circledS$',
-u'\u2506': '$\\Elzdshfnc$',
-u'\u2519': '$\\Elzsqfnw$',
-u'\u2571': '$\\diagup$',
-u'\u25a0': '{\\ding{110}}',
-u'\u25a1': '$\\square$',
-u'\u25aa': '$\\blacksquare$',
-u'\u25ad': '$\\fbox{~~}$',
-u'\u25af': '$\\Elzvrecto$',
-u'\u25b1': '$\\ElsevierGlyph{E381}$',
-u'\u25b2': '{\\ding{115}}',
-u'\u25b3': '$\\bigtriangleup$',
-u'\u25b4': '$\\blacktriangle$',
-u'\u25b5': '$\\vartriangle$',
-u'\u25b8': '$\\blacktriangleright$',
-u'\u25b9': '$\\triangleright$',
-u'\u25bc': '{\\ding{116}}',
-u'\u25bd': '$\\bigtriangledown$',
-u'\u25be': '$\\blacktriangledown$',
-u'\u25bf': '$\\triangledown$',
-u'\u25c2': '$\\blacktriangleleft$',
-u'\u25c3': '$\\triangleleft$',
-u'\u25c6': '{\\ding{117}}',
-u'\u25ca': '$\\lozenge$',
-u'\u25cb': '$\\bigcirc$',
-u'\u25cf': '{\\ding{108}}',
-u'\u25d0': '$\\Elzcirfl$',
-u'\u25d1': '$\\Elzcirfr$',
-u'\u25d2': '$\\Elzcirfb$',
-u'\u25d7': '{\\ding{119}}',
-u'\u25d8': '$\\Elzrvbull$',
-u'\u25e7': '$\\Elzsqfl$',
-u'\u25e8': '$\\Elzsqfr$',
-u'\u25ea': '$\\Elzsqfse$',
-u'\u25ef': '$\\bigcirc$',
-u'\u2605': '{\\ding{72}}',
-u'\u2606': '{\\ding{73}}',
-u'\u260e': '{\\ding{37}}',
-u'\u261b': '{\\ding{42}}',
-u'\u261e': '{\\ding{43}}',
-u'\u263e': '{\\rightmoon}',
-u'\u263f': '{\\mercury}',
-u'\u2640': '{\\venus}',
-u'\u2642': '{\\male}',
-u'\u2643': '{\\jupiter}',
-u'\u2644': '{\\saturn}',
-u'\u2645': '{\\uranus}',
-u'\u2646': '{\\neptune}',
-u'\u2647': '{\\pluto}',
-u'\u2648': '{\\aries}',
-u'\u2649': '{\\taurus}',
-u'\u264a': '{\\gemini}',
-u'\u264b': '{\\cancer}',
-u'\u264c': '{\\leo}',
-u'\u264d': '{\\virgo}',
-u'\u264e': '{\\libra}',
-u'\u264f': '{\\scorpio}',
-u'\u2650': '{\\sagittarius}',
-u'\u2651': '{\\capricornus}',
-u'\u2652': '{\\aquarius}',
-u'\u2653': '{\\pisces}',
-u'\u2660': '{\\ding{171}}',
-u'\u2662': '$\\diamond$',
-u'\u2663': '{\\ding{168}}',
-u'\u2665': '{\\ding{170}}',
-u'\u2666': '{\\ding{169}}',
-u'\u2669': '{\\quarternote}',
-u'\u266a': '{\\eighthnote}',
-u'\u266d': '$\\flat$',
-u'\u266e': '$\\natural$',
-u'\u266f': '$\\sharp$',
-u'\u2701': '{\\ding{33}}',
-u'\u2702': '{\\ding{34}}',
-u'\u2703': '{\\ding{35}}',
-u'\u2704': '{\\ding{36}}',
-u'\u2706': '{\\ding{38}}',
-u'\u2707': '{\\ding{39}}',
-u'\u2708': '{\\ding{40}}',
-u'\u2709': '{\\ding{41}}',
-u'\u270c': '{\\ding{44}}',
-u'\u270d': '{\\ding{45}}',
-u'\u270e': '{\\ding{46}}',
-u'\u270f': '{\\ding{47}}',
-u'\u2710': '{\\ding{48}}',
-u'\u2711': '{\\ding{49}}',
-u'\u2712': '{\\ding{50}}',
-u'\u2713': '{\\ding{51}}',
-u'\u2714': '{\\ding{52}}',
-u'\u2715': '{\\ding{53}}',
-u'\u2716': '{\\ding{54}}',
-u'\u2717': '{\\ding{55}}',
-u'\u2718': '{\\ding{56}}',
-u'\u2719': '{\\ding{57}}',
-u'\u271a': '{\\ding{58}}',
-u'\u271b': '{\\ding{59}}',
-u'\u271c': '{\\ding{60}}',
-u'\u271d': '{\\ding{61}}',
-u'\u271e': '{\\ding{62}}',
-u'\u271f': '{\\ding{63}}',
-u'\u2720': '{\\ding{64}}',
-u'\u2721': '{\\ding{65}}',
-u'\u2722': '{\\ding{66}}',
-u'\u2723': '{\\ding{67}}',
-u'\u2724': '{\\ding{68}}',
-u'\u2725': '{\\ding{69}}',
-u'\u2726': '{\\ding{70}}',
-u'\u2727': '{\\ding{71}}',
-u'\u2729': '{\\ding{73}}',
-u'\u272a': '{\\ding{74}}',
-u'\u272b': '{\\ding{75}}',
-u'\u272c': '{\\ding{76}}',
-u'\u272d': '{\\ding{77}}',
-u'\u272e': '{\\ding{78}}',
-u'\u272f': '{\\ding{79}}',
-u'\u2730': '{\\ding{80}}',
-u'\u2731': '{\\ding{81}}',
-u'\u2732': '{\\ding{82}}',
-u'\u2733': '{\\ding{83}}',
-u'\u2734': '{\\ding{84}}',
-u'\u2735': '{\\ding{85}}',
-u'\u2736': '{\\ding{86}}',
-u'\u2737': '{\\ding{87}}',
-u'\u2738': '{\\ding{88}}',
-u'\u2739': '{\\ding{89}}',
-u'\u273a': '{\\ding{90}}',
-u'\u273b': '{\\ding{91}}',
-u'\u273c': '{\\ding{92}}',
-u'\u273d': '{\\ding{93}}',
-u'\u273e': '{\\ding{94}}',
-u'\u273f': '{\\ding{95}}',
-u'\u2740': '{\\ding{96}}',
-u'\u2741': '{\\ding{97}}',
-u'\u2742': '{\\ding{98}}',
-u'\u2743': '{\\ding{99}}',
-u'\u2744': '{\\ding{100}}',
-u'\u2745': '{\\ding{101}}',
-u'\u2746': '{\\ding{102}}',
-u'\u2747': '{\\ding{103}}',
-u'\u2748': '{\\ding{104}}',
-u'\u2749': '{\\ding{105}}',
-u'\u274a': '{\\ding{106}}',
-u'\u274b': '{\\ding{107}}',
-u'\u274d': '{\\ding{109}}',
-u'\u274f': '{\\ding{111}}',
-u'\u2750': '{\\ding{112}}',
-u'\u2751': '{\\ding{113}}',
-u'\u2752': '{\\ding{114}}',
-u'\u2756': '{\\ding{118}}',
-u'\u2758': '{\\ding{120}}',
-u'\u2759': '{\\ding{121}}',
-u'\u275a': '{\\ding{122}}',
-u'\u275b': '{\\ding{123}}',
-u'\u275c': '{\\ding{124}}',
-u'\u275d': '{\\ding{125}}',
-u'\u275e': '{\\ding{126}}',
-u'\u2761': '{\\ding{161}}',
-u'\u2762': '{\\ding{162}}',
-u'\u2763': '{\\ding{163}}',
-u'\u2764': '{\\ding{164}}',
-u'\u2765': '{\\ding{165}}',
-u'\u2766': '{\\ding{166}}',
-u'\u2767': '{\\ding{167}}',
-u'\u2776': '{\\ding{182}}',
-u'\u2777': '{\\ding{183}}',
-u'\u2778': '{\\ding{184}}',
-u'\u2779': '{\\ding{185}}',
-u'\u277a': '{\\ding{186}}',
-u'\u277b': '{\\ding{187}}',
-u'\u277c': '{\\ding{188}}',
-u'\u277d': '{\\ding{189}}',
-u'\u277e': '{\\ding{190}}',
-u'\u277f': '{\\ding{191}}',
-u'\u2780': '{\\ding{192}}',
-u'\u2781': '{\\ding{193}}',
-u'\u2782': '{\\ding{194}}',
-u'\u2783': '{\\ding{195}}',
-u'\u2784': '{\\ding{196}}',
-u'\u2785': '{\\ding{197}}',
-u'\u2786': '{\\ding{198}}',
-u'\u2787': '{\\ding{199}}',
-u'\u2788': '{\\ding{200}}',
-u'\u2789': '{\\ding{201}}',
-u'\u278a': '{\\ding{202}}',
-u'\u278b': '{\\ding{203}}',
-u'\u278c': '{\\ding{204}}',
-u'\u278d': '{\\ding{205}}',
-u'\u278e': '{\\ding{206}}',
-u'\u278f': '{\\ding{207}}',
-u'\u2790': '{\\ding{208}}',
-u'\u2791': '{\\ding{209}}',
-u'\u2792': '{\\ding{210}}',
-u'\u2793': '{\\ding{211}}',
-u'\u2794': '{\\ding{212}}',
-u'\u2798': '{\\ding{216}}',
-u'\u2799': '{\\ding{217}}',
-u'\u279a': '{\\ding{218}}',
-u'\u279b': '{\\ding{219}}',
-u'\u279c': '{\\ding{220}}',
-u'\u279d': '{\\ding{221}}',
-u'\u279e': '{\\ding{222}}',
-u'\u279f': '{\\ding{223}}',
-u'\u27a0': '{\\ding{224}}',
-u'\u27a1': '{\\ding{225}}',
-u'\u27a2': '{\\ding{226}}',
-u'\u27a3': '{\\ding{227}}',
-u'\u27a4': '{\\ding{228}}',
-u'\u27a5': '{\\ding{229}}',
-u'\u27a6': '{\\ding{230}}',
-u'\u27a7': '{\\ding{231}}',
-u'\u27a8': '{\\ding{232}}',
-u'\u27a9': '{\\ding{233}}',
-u'\u27aa': '{\\ding{234}}',
-u'\u27ab': '{\\ding{235}}',
-u'\u27ac': '{\\ding{236}}',
-u'\u27ad': '{\\ding{237}}',
-u'\u27ae': '{\\ding{238}}',
-u'\u27af': '{\\ding{239}}',
-u'\u27b1': '{\\ding{241}}',
-u'\u27b2': '{\\ding{242}}',
-u'\u27b3': '{\\ding{243}}',
-u'\u27b4': '{\\ding{244}}',
-u'\u27b5': '{\\ding{245}}',
-u'\u27b6': '{\\ding{246}}',
-u'\u27b7': '{\\ding{247}}',
-u'\u27b8': '{\\ding{248}}',
-u'\u27b9': '{\\ding{249}}',
-u'\u27ba': '{\\ding{250}}',
-u'\u27bb': '{\\ding{251}}',
-u'\u27bc': '{\\ding{252}}',
-u'\u27bd': '{\\ding{253}}',
-u'\u27be': '{\\ding{254}}',
-u'\u27f5': '$\\longleftarrow$',
-u'\u27f6': '$\\longrightarrow$',
-u'\u27f7': '$\\longleftrightarrow$',
-u'\u27f8': '$\\Longleftarrow$',
-u'\u27f9': '$\\Longrightarrow$',
-u'\u27fa': '$\\Longleftrightarrow$',
-u'\u27fc': '$\\longmapsto$',
-u'\u27ff': '$\\sim\\joinrel\\leadsto$',
-u'\u2905': '$\\ElsevierGlyph{E212}$',
-u'\u2912': '$\\UpArrowBar$',
-u'\u2913': '$\\DownArrowBar$',
-u'\u2923': '$\\ElsevierGlyph{E20C}$',
-u'\u2924': '$\\ElsevierGlyph{E20D}$',
-u'\u2925': '$\\ElsevierGlyph{E20B}$',
-u'\u2926': '$\\ElsevierGlyph{E20A}$',
-u'\u2927': '$\\ElsevierGlyph{E211}$',
-u'\u2928': '$\\ElsevierGlyph{E20E}$',
-u'\u2929': '$\\ElsevierGlyph{E20F}$',
-u'\u292a': '$\\ElsevierGlyph{E210}$',
-u'\u2933': '$\\ElsevierGlyph{E21C}$',
-u'\u2936': '$\\ElsevierGlyph{E21A}$',
-u'\u2937': '$\\ElsevierGlyph{E219}$',
-u'\u2940': '$\\Elolarr$',
-u'\u2941': '$\\Elorarr$',
-u'\u2942': '$\\ElzRlarr$',
-u'\u2944': '$\\ElzrLarr$',
-u'\u2947': '$\\Elzrarrx$',
-u'\u294e': '$\\LeftRightVector$',
-u'\u294f': '$\\RightUpDownVector$',
-u'\u2950': '$\\DownLeftRightVector$',
-u'\u2951': '$\\LeftUpDownVector$',
-u'\u2952': '$\\LeftVectorBar$',
-u'\u2953': '$\\RightVectorBar$',
-u'\u2954': '$\\RightUpVectorBar$',
-u'\u2955': '$\\RightDownVectorBar$',
-u'\u2956': '$\\DownLeftVectorBar$',
-u'\u2957': '$\\DownRightVectorBar$',
-u'\u2958': '$\\LeftUpVectorBar$',
-u'\u2959': '$\\LeftDownVectorBar$',
-u'\u295a': '$\\LeftTeeVector$',
-u'\u295b': '$\\RightTeeVector$',
-u'\u295c': '$\\RightUpTeeVector$',
-u'\u295d': '$\\RightDownTeeVector$',
-u'\u295e': '$\\DownLeftTeeVector$',
-u'\u295f': '$\\DownRightTeeVector$',
-u'\u2960': '$\\LeftUpTeeVector$',
-u'\u2961': '$\\LeftDownTeeVector$',
-u'\u296e': '$\\UpEquilibrium$',
-u'\u296f': '$\\ReverseUpEquilibrium$',
-u'\u2970': '$\\RoundImplies$',
-u'\u297c': '$\\ElsevierGlyph{E214}$',
-u'\u297d': '$\\ElsevierGlyph{E215}$',
-u'\u2980': '$\\Elztfnc$',
-u'\u2985': '$\\ElsevierGlyph{3018}$',
-u'\u2986': '$\\Elroang$',
-u'\u2993': '$<\\kern-0.58em($',
-u'\u2994': '$\\ElsevierGlyph{E291}$',
-u'\u2999': '$\\Elzddfnc$',
-u'\u299c': '$\\Angle$',
-u'\u29a0': '$\\Elzlpargt$',
-u'\u29b5': '$\\ElsevierGlyph{E260}$',
-u'\u29b6': '$\\ElsevierGlyph{E61B}$',
-u'\u29ca': '$\\ElzLap$',
-u'\u29cb': '$\\Elzdefas$',
-u'\u29cf': '$\\LeftTriangleBar$',
-u'\u29d0': '$\\RightTriangleBar$',
-u'\u29dc': '$\\ElsevierGlyph{E372}$',
-u'\u29eb': '$\\blacklozenge$',
-u'\u29f4': '$\\RuleDelayed$',
-u'\u2a04': '$\\Elxuplus$',
-u'\u2a05': '$\\ElzThr$',
-u'\u2a06': '$\\Elxsqcup$',
-u'\u2a07': '$\\ElzInf$',
-u'\u2a08': '$\\ElzSup$',
-u'\u2a0d': '$\\ElzCint$',
-u'\u2a0f': '$\\clockoint$',
-u'\u2a10': '$\\ElsevierGlyph{E395}$',
-u'\u2a16': '$\\sqrint$',
-u'\u2a25': '$\\ElsevierGlyph{E25A}$',
-u'\u2a2a': '$\\ElsevierGlyph{E25B}$',
-u'\u2a2d': '$\\ElsevierGlyph{E25C}$',
-u'\u2a2e': '$\\ElsevierGlyph{E25D}$',
-u'\u2a2f': '$\\ElzTimes$',
-u'\u2a34': '$\\ElsevierGlyph{E25E}$',
-u'\u2a35': '$\\ElsevierGlyph{E25E}$',
-u'\u2a3c': '$\\ElsevierGlyph{E259}$',
-u'\u2a3f': '$\\amalg$',
-u'\u2a53': '$\\ElzAnd$',
-u'\u2a54': '$\\ElzOr$',
-u'\u2a55': '$\\ElsevierGlyph{E36E}$',
-u'\u2a56': '$\\ElOr$',
-u'\u2a5e': '$\\perspcorrespond$',
-u'\u2a5f': '$\\Elzminhat$',
-u'\u2a63': '$\\ElsevierGlyph{225A}$',
-u'\u2a6e': '$\\stackrel{*}{=}$',
-u'\u2a75': '$\\Equal$',
-u'\u2a7d': '$\\leqslant$',
-u'\u2a7e': '$\\geqslant$',
-u'\u2a85': '$\\lessapprox$',
-u'\u2a86': '$\\gtrapprox$',
-u'\u2a87': '$\\lneq$',
-u'\u2a88': '$\\gneq$',
-u'\u2a89': '$\\lnapprox$',
-u'\u2a8a': '$\\gnapprox$',
-u'\u2a8b': '$\\lesseqqgtr$',
-u'\u2a8c': '$\\gtreqqless$',
-u'\u2a95': '$\\eqslantless$',
-u'\u2a96': '$\\eqslantgtr$',
-u'\u2a9d': '$\\Pisymbol{ppi020}{117}$',
-u'\u2a9e': '$\\Pisymbol{ppi020}{105}$',
-u'\u2aa1': '$\\NestedLessLess$',
-u'\u2aa2': '$\\NestedGreaterGreater$',
-u'\u2aaf': '$\\preceq$',
-u'\u2ab0': '$\\succeq$',
-u'\u2ab5': '$\\precneqq$',
-u'\u2ab6': '$\\succneqq$',
-u'\u2ab7': '$\\precapprox$',
-u'\u2ab8': '$\\succapprox$',
-u'\u2ab9': '$\\precnapprox$',
-u'\u2aba': '$\\succnapprox$',
-u'\u2ac5': '$\\subseteqq$',
-u'\u2ac6': '$\\supseteqq$',
-u'\u2acb': '$\\subsetneqq$',
-u'\u2acc': '$\\supsetneqq$',
-u'\u2aeb': '$\\ElsevierGlyph{E30D}$',
-u'\u2af6': '$\\Elztdcol$',
-u'\u2afd': '${{/}\\!\\!{/}}$',
-u'\u300a': '$\\ElsevierGlyph{300A}$',
-u'\u300b': '$\\ElsevierGlyph{300B}$',
-u'\u3018': '$\\ElsevierGlyph{3018}$',
-u'\u3019': '$\\ElsevierGlyph{3019}$',
-u'\u301a': '$\\openbracketleft$',
-u'\u301b': '$\\openbracketright$',
-u'\ufb00': '{ff}',
-u'\ufb01': '{fi}',
-u'\ufb02': '{fl}',
-u'\ufb03': '{ffi}',
-u'\ufb04': '{ffl}',
-u'\U0001d400': '$\\mathbf{A}$',
-u'\U0001d401': '$\\mathbf{B}$',
-u'\U0001d402': '$\\mathbf{C}$',
-u'\U0001d403': '$\\mathbf{D}$',
-u'\U0001d404': '$\\mathbf{E}$',
-u'\U0001d405': '$\\mathbf{F}$',
-u'\U0001d406': '$\\mathbf{G}$',
-u'\U0001d407': '$\\mathbf{H}$',
-u'\U0001d408': '$\\mathbf{I}$',
-u'\U0001d409': '$\\mathbf{J}$',
-u'\U0001d40a': '$\\mathbf{K}$',
-u'\U0001d40b': '$\\mathbf{L}$',
-u'\U0001d40c': '$\\mathbf{M}$',
-u'\U0001d40d': '$\\mathbf{N}$',
-u'\U0001d40e': '$\\mathbf{O}$',
-u'\U0001d40f': '$\\mathbf{P}$',
-u'\U0001d410': '$\\mathbf{Q}$',
-u'\U0001d411': '$\\mathbf{R}$',
-u'\U0001d412': '$\\mathbf{S}$',
-u'\U0001d413': '$\\mathbf{T}$',
-u'\U0001d414': '$\\mathbf{U}$',
-u'\U0001d415': '$\\mathbf{V}$',
-u'\U0001d416': '$\\mathbf{W}$',
-u'\U0001d417': '$\\mathbf{X}$',
-u'\U0001d418': '$\\mathbf{Y}$',
-u'\U0001d419': '$\\mathbf{Z}$',
-u'\U0001d41a': '$\\mathbf{a}$',
-u'\U0001d41b': '$\\mathbf{b}$',
-u'\U0001d41c': '$\\mathbf{c}$',
-u'\U0001d41d': '$\\mathbf{d}$',
-u'\U0001d41e': '$\\mathbf{e}$',
-u'\U0001d41f': '$\\mathbf{f}$',
-u'\U0001d420': '$\\mathbf{g}$',
-u'\U0001d421': '$\\mathbf{h}$',
-u'\U0001d422': '$\\mathbf{i}$',
-u'\U0001d423': '$\\mathbf{j}$',
-u'\U0001d424': '$\\mathbf{k}$',
-u'\U0001d425': '$\\mathbf{l}$',
-u'\U0001d426': '$\\mathbf{m}$',
-u'\U0001d427': '$\\mathbf{n}$',
-u'\U0001d428': '$\\mathbf{o}$',
-u'\U0001d429': '$\\mathbf{p}$',
-u'\U0001d42a': '$\\mathbf{q}$',
-u'\U0001d42b': '$\\mathbf{r}$',
-u'\U0001d42c': '$\\mathbf{s}$',
-u'\U0001d42d': '$\\mathbf{t}$',
-u'\U0001d42e': '$\\mathbf{u}$',
-u'\U0001d42f': '$\\mathbf{v}$',
-u'\U0001d430': '$\\mathbf{w}$',
-u'\U0001d431': '$\\mathbf{x}$',
-u'\U0001d432': '$\\mathbf{y}$',
-u'\U0001d433': '$\\mathbf{z}$',
-u'\U0001d434': '$\\mathsl{A}$',
-u'\U0001d435': '$\\mathsl{B}$',
-u'\U0001d436': '$\\mathsl{C}$',
-u'\U0001d437': '$\\mathsl{D}$',
-u'\U0001d438': '$\\mathsl{E}$',
-u'\U0001d439': '$\\mathsl{F}$',
-u'\U0001d43a': '$\\mathsl{G}$',
-u'\U0001d43b': '$\\mathsl{H}$',
-u'\U0001d43c': '$\\mathsl{I}$',
-u'\U0001d43d': '$\\mathsl{J}$',
-u'\U0001d43e': '$\\mathsl{K}$',
-u'\U0001d43f': '$\\mathsl{L}$',
-u'\U0001d440': '$\\mathsl{M}$',
-u'\U0001d441': '$\\mathsl{N}$',
-u'\U0001d442': '$\\mathsl{O}$',
-u'\U0001d443': '$\\mathsl{P}$',
-u'\U0001d444': '$\\mathsl{Q}$',
-u'\U0001d445': '$\\mathsl{R}$',
-u'\U0001d446': '$\\mathsl{S}$',
-u'\U0001d447': '$\\mathsl{T}$',
-u'\U0001d448': '$\\mathsl{U}$',
-u'\U0001d449': '$\\mathsl{V}$',
-u'\U0001d44a': '$\\mathsl{W}$',
-u'\U0001d44b': '$\\mathsl{X}$',
-u'\U0001d44c': '$\\mathsl{Y}$',
-u'\U0001d44d': '$\\mathsl{Z}$',
-u'\U0001d44e': '$\\mathsl{a}$',
-u'\U0001d44f': '$\\mathsl{b}$',
-u'\U0001d450': '$\\mathsl{c}$',
-u'\U0001d451': '$\\mathsl{d}$',
-u'\U0001d452': '$\\mathsl{e}$',
-u'\U0001d453': '$\\mathsl{f}$',
-u'\U0001d454': '$\\mathsl{g}$',
-u'\U0001d456': '$\\mathsl{i}$',
-u'\U0001d457': '$\\mathsl{j}$',
-u'\U0001d458': '$\\mathsl{k}$',
-u'\U0001d459': '$\\mathsl{l}$',
-u'\U0001d45a': '$\\mathsl{m}$',
-u'\U0001d45b': '$\\mathsl{n}$',
-u'\U0001d45c': '$\\mathsl{o}$',
-u'\U0001d45d': '$\\mathsl{p}$',
-u'\U0001d45e': '$\\mathsl{q}$',
-u'\U0001d45f': '$\\mathsl{r}$',
-u'\U0001d460': '$\\mathsl{s}$',
-u'\U0001d461': '$\\mathsl{t}$',
-u'\U0001d462': '$\\mathsl{u}$',
-u'\U0001d463': '$\\mathsl{v}$',
-u'\U0001d464': '$\\mathsl{w}$',
-u'\U0001d465': '$\\mathsl{x}$',
-u'\U0001d466': '$\\mathsl{y}$',
-u'\U0001d467': '$\\mathsl{z}$',
-u'\U0001d468': '$\\mathbit{A}$',
-u'\U0001d469': '$\\mathbit{B}$',
-u'\U0001d46a': '$\\mathbit{C}$',
-u'\U0001d46b': '$\\mathbit{D}$',
-u'\U0001d46c': '$\\mathbit{E}$',
-u'\U0001d46d': '$\\mathbit{F}$',
-u'\U0001d46e': '$\\mathbit{G}$',
-u'\U0001d46f': '$\\mathbit{H}$',
-u'\U0001d470': '$\\mathbit{I}$',
-u'\U0001d471': '$\\mathbit{J}$',
-u'\U0001d472': '$\\mathbit{K}$',
-u'\U0001d473': '$\\mathbit{L}$',
-u'\U0001d474': '$\\mathbit{M}$',
-u'\U0001d475': '$\\mathbit{N}$',
-u'\U0001d476': '$\\mathbit{O}$',
-u'\U0001d477': '$\\mathbit{P}$',
-u'\U0001d478': '$\\mathbit{Q}$',
-u'\U0001d479': '$\\mathbit{R}$',
-u'\U0001d47a': '$\\mathbit{S}$',
-u'\U0001d47b': '$\\mathbit{T}$',
-u'\U0001d47c': '$\\mathbit{U}$',
-u'\U0001d47d': '$\\mathbit{V}$',
-u'\U0001d47e': '$\\mathbit{W}$',
-u'\U0001d47f': '$\\mathbit{X}$',
-u'\U0001d480': '$\\mathbit{Y}$',
-u'\U0001d481': '$\\mathbit{Z}$',
-u'\U0001d482': '$\\mathbit{a}$',
-u'\U0001d483': '$\\mathbit{b}$',
-u'\U0001d484': '$\\mathbit{c}$',
-u'\U0001d485': '$\\mathbit{d}$',
-u'\U0001d486': '$\\mathbit{e}$',
-u'\U0001d487': '$\\mathbit{f}$',
-u'\U0001d488': '$\\mathbit{g}$',
-u'\U0001d489': '$\\mathbit{h}$',
-u'\U0001d48a': '$\\mathbit{i}$',
-u'\U0001d48b': '$\\mathbit{j}$',
-u'\U0001d48c': '$\\mathbit{k}$',
-u'\U0001d48d': '$\\mathbit{l}$',
-u'\U0001d48e': '$\\mathbit{m}$',
-u'\U0001d48f': '$\\mathbit{n}$',
-u'\U0001d490': '$\\mathbit{o}$',
-u'\U0001d491': '$\\mathbit{p}$',
-u'\U0001d492': '$\\mathbit{q}$',
-u'\U0001d493': '$\\mathbit{r}$',
-u'\U0001d494': '$\\mathbit{s}$',
-u'\U0001d495': '$\\mathbit{t}$',
-u'\U0001d496': '$\\mathbit{u}$',
-u'\U0001d497': '$\\mathbit{v}$',
-u'\U0001d498': '$\\mathbit{w}$',
-u'\U0001d499': '$\\mathbit{x}$',
-u'\U0001d49a': '$\\mathbit{y}$',
-u'\U0001d49b': '$\\mathbit{z}$',
-u'\U0001d49c': '$\\mathscr{A}$',
-u'\U0001d49e': '$\\mathscr{C}$',
-u'\U0001d49f': '$\\mathscr{D}$',
-u'\U0001d4a2': '$\\mathscr{G}$',
-u'\U0001d4a5': '$\\mathscr{J}$',
-u'\U0001d4a6': '$\\mathscr{K}$',
-u'\U0001d4a9': '$\\mathscr{N}$',
-u'\U0001d4aa': '$\\mathscr{O}$',
-u'\U0001d4ab': '$\\mathscr{P}$',
-u'\U0001d4ac': '$\\mathscr{Q}$',
-u'\U0001d4ae': '$\\mathscr{S}$',
-u'\U0001d4af': '$\\mathscr{T}$',
-u'\U0001d4b0': '$\\mathscr{U}$',
-u'\U0001d4b1': '$\\mathscr{V}$',
-u'\U0001d4b2': '$\\mathscr{W}$',
-u'\U0001d4b3': '$\\mathscr{X}$',
-u'\U0001d4b4': '$\\mathscr{Y}$',
-u'\U0001d4b5': '$\\mathscr{Z}$',
-u'\U0001d4b6': '$\\mathscr{a}$',
-u'\U0001d4b7': '$\\mathscr{b}$',
-u'\U0001d4b8': '$\\mathscr{c}$',
-u'\U0001d4b9': '$\\mathscr{d}$',
-u'\U0001d4bb': '$\\mathscr{f}$',
-u'\U0001d4bd': '$\\mathscr{h}$',
-u'\U0001d4be': '$\\mathscr{i}$',
-u'\U0001d4bf': '$\\mathscr{j}$',
-u'\U0001d4c0': '$\\mathscr{k}$',
-u'\U0001d4c1': '$\\mathscr{l}$',
-u'\U0001d4c2': '$\\mathscr{m}$',
-u'\U0001d4c3': '$\\mathscr{n}$',
-u'\U0001d4c5': '$\\mathscr{p}$',
-u'\U0001d4c6': '$\\mathscr{q}$',
-u'\U0001d4c7': '$\\mathscr{r}$',
-u'\U0001d4c8': '$\\mathscr{s}$',
-u'\U0001d4c9': '$\\mathscr{t}$',
-u'\U0001d4ca': '$\\mathscr{u}$',
-u'\U0001d4cb': '$\\mathscr{v}$',
-u'\U0001d4cc': '$\\mathscr{w}$',
-u'\U0001d4cd': '$\\mathscr{x}$',
-u'\U0001d4ce': '$\\mathscr{y}$',
-u'\U0001d4cf': '$\\mathscr{z}$',
-u'\U0001d4d0': '$\\mathmit{A}$',
-u'\U0001d4d1': '$\\mathmit{B}$',
-u'\U0001d4d2': '$\\mathmit{C}$',
-u'\U0001d4d3': '$\\mathmit{D}$',
-u'\U0001d4d4': '$\\mathmit{E}$',
-u'\U0001d4d5': '$\\mathmit{F}$',
-u'\U0001d4d6': '$\\mathmit{G}$',
-u'\U0001d4d7': '$\\mathmit{H}$',
-u'\U0001d4d8': '$\\mathmit{I}$',
-u'\U0001d4d9': '$\\mathmit{J}$',
-u'\U0001d4da': '$\\mathmit{K}$',
-u'\U0001d4db': '$\\mathmit{L}$',
-u'\U0001d4dc': '$\\mathmit{M}$',
-u'\U0001d4dd': '$\\mathmit{N}$',
-u'\U0001d4de': '$\\mathmit{O}$',
-u'\U0001d4df': '$\\mathmit{P}$',
-u'\U0001d4e0': '$\\mathmit{Q}$',
-u'\U0001d4e1': '$\\mathmit{R}$',
-u'\U0001d4e2': '$\\mathmit{S}$',
-u'\U0001d4e3': '$\\mathmit{T}$',
-u'\U0001d4e4': '$\\mathmit{U}$',
-u'\U0001d4e5': '$\\mathmit{V}$',
-u'\U0001d4e6': '$\\mathmit{W}$',
-u'\U0001d4e7': '$\\mathmit{X}$',
-u'\U0001d4e8': '$\\mathmit{Y}$',
-u'\U0001d4e9': '$\\mathmit{Z}$',
-u'\U0001d4ea': '$\\mathmit{a}$',
-u'\U0001d4eb': '$\\mathmit{b}$',
-u'\U0001d4ec': '$\\mathmit{c}$',
-u'\U0001d4ed': '$\\mathmit{d}$',
-u'\U0001d4ee': '$\\mathmit{e}$',
-u'\U0001d4ef': '$\\mathmit{f}$',
-u'\U0001d4f0': '$\\mathmit{g}$',
-u'\U0001d4f1': '$\\mathmit{h}$',
-u'\U0001d4f2': '$\\mathmit{i}$',
-u'\U0001d4f3': '$\\mathmit{j}$',
-u'\U0001d4f4': '$\\mathmit{k}$',
-u'\U0001d4f5': '$\\mathmit{l}$',
-u'\U0001d4f6': '$\\mathmit{m}$',
-u'\U0001d4f7': '$\\mathmit{n}$',
-u'\U0001d4f8': '$\\mathmit{o}$',
-u'\U0001d4f9': '$\\mathmit{p}$',
-u'\U0001d4fa': '$\\mathmit{q}$',
-u'\U0001d4fb': '$\\mathmit{r}$',
-u'\U0001d4fc': '$\\mathmit{s}$',
-u'\U0001d4fd': '$\\mathmit{t}$',
-u'\U0001d4fe': '$\\mathmit{u}$',
-u'\U0001d4ff': '$\\mathmit{v}$',
-u'\U0001d500': '$\\mathmit{w}$',
-u'\U0001d501': '$\\mathmit{x}$',
-u'\U0001d502': '$\\mathmit{y}$',
-u'\U0001d503': '$\\mathmit{z}$',
-u'\U0001d504': '$\\mathfrak{A}$',
-u'\U0001d505': '$\\mathfrak{B}$',
-u'\U0001d507': '$\\mathfrak{D}$',
-u'\U0001d508': '$\\mathfrak{E}$',
-u'\U0001d509': '$\\mathfrak{F}$',
-u'\U0001d50a': '$\\mathfrak{G}$',
-u'\U0001d50d': '$\\mathfrak{J}$',
-u'\U0001d50e': '$\\mathfrak{K}$',
-u'\U0001d50f': '$\\mathfrak{L}$',
-u'\U0001d510': '$\\mathfrak{M}$',
-u'\U0001d511': '$\\mathfrak{N}$',
-u'\U0001d512': '$\\mathfrak{O}$',
-u'\U0001d513': '$\\mathfrak{P}$',
-u'\U0001d514': '$\\mathfrak{Q}$',
-u'\U0001d516': '$\\mathfrak{S}$',
-u'\U0001d517': '$\\mathfrak{T}$',
-u'\U0001d518': '$\\mathfrak{U}$',
-u'\U0001d519': '$\\mathfrak{V}$',
-u'\U0001d51a': '$\\mathfrak{W}$',
-u'\U0001d51b': '$\\mathfrak{X}$',
-u'\U0001d51c': '$\\mathfrak{Y}$',
-u'\U0001d51e': '$\\mathfrak{a}$',
-u'\U0001d51f': '$\\mathfrak{b}$',
-u'\U0001d520': '$\\mathfrak{c}$',
-u'\U0001d521': '$\\mathfrak{d}$',
-u'\U0001d522': '$\\mathfrak{e}$',
-u'\U0001d523': '$\\mathfrak{f}$',
-u'\U0001d524': '$\\mathfrak{g}$',
-u'\U0001d525': '$\\mathfrak{h}$',
-u'\U0001d526': '$\\mathfrak{i}$',
-u'\U0001d527': '$\\mathfrak{j}$',
-u'\U0001d528': '$\\mathfrak{k}$',
-u'\U0001d529': '$\\mathfrak{l}$',
-u'\U0001d52a': '$\\mathfrak{m}$',
-u'\U0001d52b': '$\\mathfrak{n}$',
-u'\U0001d52c': '$\\mathfrak{o}$',
-u'\U0001d52d': '$\\mathfrak{p}$',
-u'\U0001d52e': '$\\mathfrak{q}$',
-u'\U0001d52f': '$\\mathfrak{r}$',
-u'\U0001d530': '$\\mathfrak{s}$',
-u'\U0001d531': '$\\mathfrak{t}$',
-u'\U0001d532': '$\\mathfrak{u}$',
-u'\U0001d533': '$\\mathfrak{v}$',
-u'\U0001d534': '$\\mathfrak{w}$',
-u'\U0001d535': '$\\mathfrak{x}$',
-u'\U0001d536': '$\\mathfrak{y}$',
-u'\U0001d537': '$\\mathfrak{z}$',
-u'\U0001d538': '$\\mathbb{A}$',
-u'\U0001d539': '$\\mathbb{B}$',
-u'\U0001d53b': '$\\mathbb{D}$',
-u'\U0001d53c': '$\\mathbb{E}$',
-u'\U0001d53d': '$\\mathbb{F}$',
-u'\U0001d53e': '$\\mathbb{G}$',
-u'\U0001d540': '$\\mathbb{I}$',
-u'\U0001d541': '$\\mathbb{J}$',
-u'\U0001d542': '$\\mathbb{K}$',
-u'\U0001d543': '$\\mathbb{L}$',
-u'\U0001d544': '$\\mathbb{M}$',
-u'\U0001d546': '$\\mathbb{O}$',
-u'\U0001d54a': '$\\mathbb{S}$',
-u'\U0001d54b': '$\\mathbb{T}$',
-u'\U0001d54c': '$\\mathbb{U}$',
-u'\U0001d54d': '$\\mathbb{V}$',
-u'\U0001d54e': '$\\mathbb{W}$',
-u'\U0001d54f': '$\\mathbb{X}$',
-u'\U0001d550': '$\\mathbb{Y}$',
-u'\U0001d552': '$\\mathbb{a}$',
-u'\U0001d553': '$\\mathbb{b}$',
-u'\U0001d554': '$\\mathbb{c}$',
-u'\U0001d555': '$\\mathbb{d}$',
-u'\U0001d556': '$\\mathbb{e}$',
-u'\U0001d557': '$\\mathbb{f}$',
-u'\U0001d558': '$\\mathbb{g}$',
-u'\U0001d559': '$\\mathbb{h}$',
-u'\U0001d55a': '$\\mathbb{i}$',
-u'\U0001d55b': '$\\mathbb{j}$',
-u'\U0001d55c': '$\\mathbb{k}$',
-u'\U0001d55d': '$\\mathbb{l}$',
-u'\U0001d55e': '$\\mathbb{m}$',
-u'\U0001d55f': '$\\mathbb{n}$',
-u'\U0001d560': '$\\mathbb{o}$',
-u'\U0001d561': '$\\mathbb{p}$',
-u'\U0001d562': '$\\mathbb{q}$',
-u'\U0001d563': '$\\mathbb{r}$',
-u'\U0001d564': '$\\mathbb{s}$',
-u'\U0001d565': '$\\mathbb{t}$',
-u'\U0001d566': '$\\mathbb{u}$',
-u'\U0001d567': '$\\mathbb{v}$',
-u'\U0001d568': '$\\mathbb{w}$',
-u'\U0001d569': '$\\mathbb{x}$',
-u'\U0001d56a': '$\\mathbb{y}$',
-u'\U0001d56b': '$\\mathbb{z}$',
-u'\U0001d56c': '$\\mathslbb{A}$',
-u'\U0001d56d': '$\\mathslbb{B}$',
-u'\U0001d56e': '$\\mathslbb{C}$',
-u'\U0001d56f': '$\\mathslbb{D}$',
-u'\U0001d570': '$\\mathslbb{E}$',
-u'\U0001d571': '$\\mathslbb{F}$',
-u'\U0001d572': '$\\mathslbb{G}$',
-u'\U0001d573': '$\\mathslbb{H}$',
-u'\U0001d574': '$\\mathslbb{I}$',
-u'\U0001d575': '$\\mathslbb{J}$',
-u'\U0001d576': '$\\mathslbb{K}$',
-u'\U0001d577': '$\\mathslbb{L}$',
-u'\U0001d578': '$\\mathslbb{M}$',
-u'\U0001d579': '$\\mathslbb{N}$',
-u'\U0001d57a': '$\\mathslbb{O}$',
-u'\U0001d57b': '$\\mathslbb{P}$',
-u'\U0001d57c': '$\\mathslbb{Q}$',
-u'\U0001d57d': '$\\mathslbb{R}$',
-u'\U0001d57e': '$\\mathslbb{S}$',
-u'\U0001d57f': '$\\mathslbb{T}$',
-u'\U0001d580': '$\\mathslbb{U}$',
-u'\U0001d581': '$\\mathslbb{V}$',
-u'\U0001d582': '$\\mathslbb{W}$',
-u'\U0001d583': '$\\mathslbb{X}$',
-u'\U0001d584': '$\\mathslbb{Y}$',
-u'\U0001d585': '$\\mathslbb{Z}$',
-u'\U0001d586': '$\\mathslbb{a}$',
-u'\U0001d587': '$\\mathslbb{b}$',
-u'\U0001d588': '$\\mathslbb{c}$',
-u'\U0001d589': '$\\mathslbb{d}$',
-u'\U0001d58a': '$\\mathslbb{e}$',
-u'\U0001d58b': '$\\mathslbb{f}$',
-u'\U0001d58c': '$\\mathslbb{g}$',
-u'\U0001d58d': '$\\mathslbb{h}$',
-u'\U0001d58e': '$\\mathslbb{i}$',
-u'\U0001d58f': '$\\mathslbb{j}$',
-u'\U0001d590': '$\\mathslbb{k}$',
-u'\U0001d591': '$\\mathslbb{l}$',
-u'\U0001d592': '$\\mathslbb{m}$',
-u'\U0001d593': '$\\mathslbb{n}$',
-u'\U0001d594': '$\\mathslbb{o}$',
-u'\U0001d595': '$\\mathslbb{p}$',
-u'\U0001d596': '$\\mathslbb{q}$',
-u'\U0001d597': '$\\mathslbb{r}$',
-u'\U0001d598': '$\\mathslbb{s}$',
-u'\U0001d599': '$\\mathslbb{t}$',
-u'\U0001d59a': '$\\mathslbb{u}$',
-u'\U0001d59b': '$\\mathslbb{v}$',
-u'\U0001d59c': '$\\mathslbb{w}$',
-u'\U0001d59d': '$\\mathslbb{x}$',
-u'\U0001d59e': '$\\mathslbb{y}$',
-u'\U0001d59f': '$\\mathslbb{z}$',
-u'\U0001d5a0': '$\\mathsf{A}$',
-u'\U0001d5a1': '$\\mathsf{B}$',
-u'\U0001d5a2': '$\\mathsf{C}$',
-u'\U0001d5a3': '$\\mathsf{D}$',
-u'\U0001d5a4': '$\\mathsf{E}$',
-u'\U0001d5a5': '$\\mathsf{F}$',
-u'\U0001d5a6': '$\\mathsf{G}$',
-u'\U0001d5a7': '$\\mathsf{H}$',
-u'\U0001d5a8': '$\\mathsf{I}$',
-u'\U0001d5a9': '$\\mathsf{J}$',
-u'\U0001d5aa': '$\\mathsf{K}$',
-u'\U0001d5ab': '$\\mathsf{L}$',
-u'\U0001d5ac': '$\\mathsf{M}$',
-u'\U0001d5ad': '$\\mathsf{N}$',
-u'\U0001d5ae': '$\\mathsf{O}$',
-u'\U0001d5af': '$\\mathsf{P}$',
-u'\U0001d5b0': '$\\mathsf{Q}$',
-u'\U0001d5b1': '$\\mathsf{R}$',
-u'\U0001d5b2': '$\\mathsf{S}$',
-u'\U0001d5b3': '$\\mathsf{T}$',
-u'\U0001d5b4': '$\\mathsf{U}$',
-u'\U0001d5b5': '$\\mathsf{V}$',
-u'\U0001d5b6': '$\\mathsf{W}$',
-u'\U0001d5b7': '$\\mathsf{X}$',
-u'\U0001d5b8': '$\\mathsf{Y}$',
-u'\U0001d5b9': '$\\mathsf{Z}$',
-u'\U0001d5ba': '$\\mathsf{a}$',
-u'\U0001d5bb': '$\\mathsf{b}$',
-u'\U0001d5bc': '$\\mathsf{c}$',
-u'\U0001d5bd': '$\\mathsf{d}$',
-u'\U0001d5be': '$\\mathsf{e}$',
-u'\U0001d5bf': '$\\mathsf{f}$',
-u'\U0001d5c0': '$\\mathsf{g}$',
-u'\U0001d5c1': '$\\mathsf{h}$',
-u'\U0001d5c2': '$\\mathsf{i}$',
-u'\U0001d5c3': '$\\mathsf{j}$',
-u'\U0001d5c4': '$\\mathsf{k}$',
-u'\U0001d5c5': '$\\mathsf{l}$',
-u'\U0001d5c6': '$\\mathsf{m}$',
-u'\U0001d5c7': '$\\mathsf{n}$',
-u'\U0001d5c8': '$\\mathsf{o}$',
-u'\U0001d5c9': '$\\mathsf{p}$',
-u'\U0001d5ca': '$\\mathsf{q}$',
-u'\U0001d5cb': '$\\mathsf{r}$',
-u'\U0001d5cc': '$\\mathsf{s}$',
-u'\U0001d5cd': '$\\mathsf{t}$',
-u'\U0001d5ce': '$\\mathsf{u}$',
-u'\U0001d5cf': '$\\mathsf{v}$',
-u'\U0001d5d0': '$\\mathsf{w}$',
-u'\U0001d5d1': '$\\mathsf{x}$',
-u'\U0001d5d2': '$\\mathsf{y}$',
-u'\U0001d5d3': '$\\mathsf{z}$',
-u'\U0001d5d4': '$\\mathsfbf{A}$',
-u'\U0001d5d5': '$\\mathsfbf{B}$',
-u'\U0001d5d6': '$\\mathsfbf{C}$',
-u'\U0001d5d7': '$\\mathsfbf{D}$',
-u'\U0001d5d8': '$\\mathsfbf{E}$',
-u'\U0001d5d9': '$\\mathsfbf{F}$',
-u'\U0001d5da': '$\\mathsfbf{G}$',
-u'\U0001d5db': '$\\mathsfbf{H}$',
-u'\U0001d5dc': '$\\mathsfbf{I}$',
-u'\U0001d5dd': '$\\mathsfbf{J}$',
-u'\U0001d5de': '$\\mathsfbf{K}$',
-u'\U0001d5df': '$\\mathsfbf{L}$',
-u'\U0001d5e0': '$\\mathsfbf{M}$',
-u'\U0001d5e1': '$\\mathsfbf{N}$',
-u'\U0001d5e2': '$\\mathsfbf{O}$',
-u'\U0001d5e3': '$\\mathsfbf{P}$',
-u'\U0001d5e4': '$\\mathsfbf{Q}$',
-u'\U0001d5e5': '$\\mathsfbf{R}$',
-u'\U0001d5e6': '$\\mathsfbf{S}$',
-u'\U0001d5e7': '$\\mathsfbf{T}$',
-u'\U0001d5e8': '$\\mathsfbf{U}$',
-u'\U0001d5e9': '$\\mathsfbf{V}$',
-u'\U0001d5ea': '$\\mathsfbf{W}$',
-u'\U0001d5eb': '$\\mathsfbf{X}$',
-u'\U0001d5ec': '$\\mathsfbf{Y}$',
-u'\U0001d5ed': '$\\mathsfbf{Z}$',
-u'\U0001d5ee': '$\\mathsfbf{a}$',
-u'\U0001d5ef': '$\\mathsfbf{b}$',
-u'\U0001d5f0': '$\\mathsfbf{c}$',
-u'\U0001d5f1': '$\\mathsfbf{d}$',
-u'\U0001d5f2': '$\\mathsfbf{e}$',
-u'\U0001d5f3': '$\\mathsfbf{f}$',
-u'\U0001d5f4': '$\\mathsfbf{g}$',
-u'\U0001d5f5': '$\\mathsfbf{h}$',
-u'\U0001d5f6': '$\\mathsfbf{i}$',
-u'\U0001d5f7': '$\\mathsfbf{j}$',
-u'\U0001d5f8': '$\\mathsfbf{k}$',
-u'\U0001d5f9': '$\\mathsfbf{l}$',
-u'\U0001d5fa': '$\\mathsfbf{m}$',
-u'\U0001d5fb': '$\\mathsfbf{n}$',
-u'\U0001d5fc': '$\\mathsfbf{o}$',
-u'\U0001d5fd': '$\\mathsfbf{p}$',
-u'\U0001d5fe': '$\\mathsfbf{q}$',
-u'\U0001d5ff': '$\\mathsfbf{r}$',
-u'\U0001d600': '$\\mathsfbf{s}$',
-u'\U0001d601': '$\\mathsfbf{t}$',
-u'\U0001d602': '$\\mathsfbf{u}$',
-u'\U0001d603': '$\\mathsfbf{v}$',
-u'\U0001d604': '$\\mathsfbf{w}$',
-u'\U0001d605': '$\\mathsfbf{x}$',
-u'\U0001d606': '$\\mathsfbf{y}$',
-u'\U0001d607': '$\\mathsfbf{z}$',
-u'\U0001d608': '$\\mathsfsl{A}$',
-u'\U0001d609': '$\\mathsfsl{B}$',
-u'\U0001d60a': '$\\mathsfsl{C}$',
-u'\U0001d60b': '$\\mathsfsl{D}$',
-u'\U0001d60c': '$\\mathsfsl{E}$',
-u'\U0001d60d': '$\\mathsfsl{F}$',
-u'\U0001d60e': '$\\mathsfsl{G}$',
-u'\U0001d60f': '$\\mathsfsl{H}$',
-u'\U0001d610': '$\\mathsfsl{I}$',
-u'\U0001d611': '$\\mathsfsl{J}$',
-u'\U0001d612': '$\\mathsfsl{K}$',
-u'\U0001d613': '$\\mathsfsl{L}$',
-u'\U0001d614': '$\\mathsfsl{M}$',
-u'\U0001d615': '$\\mathsfsl{N}$',
-u'\U0001d616': '$\\mathsfsl{O}$',
-u'\U0001d617': '$\\mathsfsl{P}$',
-u'\U0001d618': '$\\mathsfsl{Q}$',
-u'\U0001d619': '$\\mathsfsl{R}$',
-u'\U0001d61a': '$\\mathsfsl{S}$',
-u'\U0001d61b': '$\\mathsfsl{T}$',
-u'\U0001d61c': '$\\mathsfsl{U}$',
-u'\U0001d61d': '$\\mathsfsl{V}$',
-u'\U0001d61e': '$\\mathsfsl{W}$',
-u'\U0001d61f': '$\\mathsfsl{X}$',
-u'\U0001d620': '$\\mathsfsl{Y}$',
-u'\U0001d621': '$\\mathsfsl{Z}$',
-u'\U0001d622': '$\\mathsfsl{a}$',
-u'\U0001d623': '$\\mathsfsl{b}$',
-u'\U0001d624': '$\\mathsfsl{c}$',
-u'\U0001d625': '$\\mathsfsl{d}$',
-u'\U0001d626': '$\\mathsfsl{e}$',
-u'\U0001d627': '$\\mathsfsl{f}$',
-u'\U0001d628': '$\\mathsfsl{g}$',
-u'\U0001d629': '$\\mathsfsl{h}$',
-u'\U0001d62a': '$\\mathsfsl{i}$',
-u'\U0001d62b': '$\\mathsfsl{j}$',
-u'\U0001d62c': '$\\mathsfsl{k}$',
-u'\U0001d62d': '$\\mathsfsl{l}$',
-u'\U0001d62e': '$\\mathsfsl{m}$',
-u'\U0001d62f': '$\\mathsfsl{n}$',
-u'\U0001d630': '$\\mathsfsl{o}$',
-u'\U0001d631': '$\\mathsfsl{p}$',
-u'\U0001d632': '$\\mathsfsl{q}$',
-u'\U0001d633': '$\\mathsfsl{r}$',
-u'\U0001d634': '$\\mathsfsl{s}$',
-u'\U0001d635': '$\\mathsfsl{t}$',
-u'\U0001d636': '$\\mathsfsl{u}$',
-u'\U0001d637': '$\\mathsfsl{v}$',
-u'\U0001d638': '$\\mathsfsl{w}$',
-u'\U0001d639': '$\\mathsfsl{x}$',
-u'\U0001d63a': '$\\mathsfsl{y}$',
-u'\U0001d63b': '$\\mathsfsl{z}$',
-u'\U0001d63c': '$\\mathsfbfsl{A}$',
-u'\U0001d63d': '$\\mathsfbfsl{B}$',
-u'\U0001d63e': '$\\mathsfbfsl{C}$',
-u'\U0001d63f': '$\\mathsfbfsl{D}$',
-u'\U0001d640': '$\\mathsfbfsl{E}$',
-u'\U0001d641': '$\\mathsfbfsl{F}$',
-u'\U0001d642': '$\\mathsfbfsl{G}$',
-u'\U0001d643': '$\\mathsfbfsl{H}$',
-u'\U0001d644': '$\\mathsfbfsl{I}$',
-u'\U0001d645': '$\\mathsfbfsl{J}$',
-u'\U0001d646': '$\\mathsfbfsl{K}$',
-u'\U0001d647': '$\\mathsfbfsl{L}$',
-u'\U0001d648': '$\\mathsfbfsl{M}$',
-u'\U0001d649': '$\\mathsfbfsl{N}$',
-u'\U0001d64a': '$\\mathsfbfsl{O}$',
-u'\U0001d64b': '$\\mathsfbfsl{P}$',
-u'\U0001d64c': '$\\mathsfbfsl{Q}$',
-u'\U0001d64d': '$\\mathsfbfsl{R}$',
-u'\U0001d64e': '$\\mathsfbfsl{S}$',
-u'\U0001d64f': '$\\mathsfbfsl{T}$',
-u'\U0001d650': '$\\mathsfbfsl{U}$',
-u'\U0001d651': '$\\mathsfbfsl{V}$',
-u'\U0001d652': '$\\mathsfbfsl{W}$',
-u'\U0001d653': '$\\mathsfbfsl{X}$',
-u'\U0001d654': '$\\mathsfbfsl{Y}$',
-u'\U0001d655': '$\\mathsfbfsl{Z}$',
-u'\U0001d656': '$\\mathsfbfsl{a}$',
-u'\U0001d657': '$\\mathsfbfsl{b}$',
-u'\U0001d658': '$\\mathsfbfsl{c}$',
-u'\U0001d659': '$\\mathsfbfsl{d}$',
-u'\U0001d65a': '$\\mathsfbfsl{e}$',
-u'\U0001d65b': '$\\mathsfbfsl{f}$',
-u'\U0001d65c': '$\\mathsfbfsl{g}$',
-u'\U0001d65d': '$\\mathsfbfsl{h}$',
-u'\U0001d65e': '$\\mathsfbfsl{i}$',
-u'\U0001d65f': '$\\mathsfbfsl{j}$',
-u'\U0001d660': '$\\mathsfbfsl{k}$',
-u'\U0001d661': '$\\mathsfbfsl{l}$',
-u'\U0001d662': '$\\mathsfbfsl{m}$',
-u'\U0001d663': '$\\mathsfbfsl{n}$',
-u'\U0001d664': '$\\mathsfbfsl{o}$',
-u'\U0001d665': '$\\mathsfbfsl{p}$',
-u'\U0001d666': '$\\mathsfbfsl{q}$',
-u'\U0001d667': '$\\mathsfbfsl{r}$',
-u'\U0001d668': '$\\mathsfbfsl{s}$',
-u'\U0001d669': '$\\mathsfbfsl{t}$',
-u'\U0001d66a': '$\\mathsfbfsl{u}$',
-u'\U0001d66b': '$\\mathsfbfsl{v}$',
-u'\U0001d66c': '$\\mathsfbfsl{w}$',
-u'\U0001d66d': '$\\mathsfbfsl{x}$',
-u'\U0001d66e': '$\\mathsfbfsl{y}$',
-u'\U0001d66f': '$\\mathsfbfsl{z}$',
-u'\U0001d670': '$\\mathtt{A}$',
-u'\U0001d671': '$\\mathtt{B}$',
-u'\U0001d672': '$\\mathtt{C}$',
-u'\U0001d673': '$\\mathtt{D}$',
-u'\U0001d674': '$\\mathtt{E}$',
-u'\U0001d675': '$\\mathtt{F}$',
-u'\U0001d676': '$\\mathtt{G}$',
-u'\U0001d677': '$\\mathtt{H}$',
-u'\U0001d678': '$\\mathtt{I}$',
-u'\U0001d679': '$\\mathtt{J}$',
-u'\U0001d67a': '$\\mathtt{K}$',
-u'\U0001d67b': '$\\mathtt{L}$',
-u'\U0001d67c': '$\\mathtt{M}$',
-u'\U0001d67d': '$\\mathtt{N}$',
-u'\U0001d67e': '$\\mathtt{O}$',
-u'\U0001d67f': '$\\mathtt{P}$',
-u'\U0001d680': '$\\mathtt{Q}$',
-u'\U0001d681': '$\\mathtt{R}$',
-u'\U0001d682': '$\\mathtt{S}$',
-u'\U0001d683': '$\\mathtt{T}$',
-u'\U0001d684': '$\\mathtt{U}$',
-u'\U0001d685': '$\\mathtt{V}$',
-u'\U0001d686': '$\\mathtt{W}$',
-u'\U0001d687': '$\\mathtt{X}$',
-u'\U0001d688': '$\\mathtt{Y}$',
-u'\U0001d689': '$\\mathtt{Z}$',
-u'\U0001d68a': '$\\mathtt{a}$',
-u'\U0001d68b': '$\\mathtt{b}$',
-u'\U0001d68c': '$\\mathtt{c}$',
-u'\U0001d68d': '$\\mathtt{d}$',
-u'\U0001d68e': '$\\mathtt{e}$',
-u'\U0001d68f': '$\\mathtt{f}$',
-u'\U0001d690': '$\\mathtt{g}$',
-u'\U0001d691': '$\\mathtt{h}$',
-u'\U0001d692': '$\\mathtt{i}$',
-u'\U0001d693': '$\\mathtt{j}$',
-u'\U0001d694': '$\\mathtt{k}$',
-u'\U0001d695': '$\\mathtt{l}$',
-u'\U0001d696': '$\\mathtt{m}$',
-u'\U0001d697': '$\\mathtt{n}$',
-u'\U0001d698': '$\\mathtt{o}$',
-u'\U0001d699': '$\\mathtt{p}$',
-u'\U0001d69a': '$\\mathtt{q}$',
-u'\U0001d69b': '$\\mathtt{r}$',
-u'\U0001d69c': '$\\mathtt{s}$',
-u'\U0001d69d': '$\\mathtt{t}$',
-u'\U0001d69e': '$\\mathtt{u}$',
-u'\U0001d69f': '$\\mathtt{v}$',
-u'\U0001d6a0': '$\\mathtt{w}$',
-u'\U0001d6a1': '$\\mathtt{x}$',
-u'\U0001d6a2': '$\\mathtt{y}$',
-u'\U0001d6a3': '$\\mathtt{z}$',
-u'\U0001d6a8': '$\\mathbf{\\Alpha}$',
-u'\U0001d6a9': '$\\mathbf{\\Beta}$',
-u'\U0001d6aa': '$\\mathbf{\\Gamma}$',
-u'\U0001d6ab': '$\\mathbf{\\Delta}$',
-u'\U0001d6ac': '$\\mathbf{\\Epsilon}$',
-u'\U0001d6ad': '$\\mathbf{\\Zeta}$',
-u'\U0001d6ae': '$\\mathbf{\\Eta}$',
-u'\U0001d6af': '$\\mathbf{\\Theta}$',
-u'\U0001d6b0': '$\\mathbf{\\Iota}$',
-u'\U0001d6b1': '$\\mathbf{\\Kappa}$',
-u'\U0001d6b2': '$\\mathbf{\\Lambda}$',
-u'\U0001d6b3': '$M$',
-u'\U0001d6b4': '$N$',
-u'\U0001d6b5': '$\\mathbf{\\Xi}$',
-u'\U0001d6b6': '$O$',
-u'\U0001d6b7': '$\\mathbf{\\Pi}$',
-u'\U0001d6b8': '$\\mathbf{\\Rho}$',
-u'\U0001d6b9': '{\\mathbf{\\vartheta}}',
-u'\U0001d6ba': '$\\mathbf{\\Sigma}$',
-u'\U0001d6bb': '$\\mathbf{\\Tau}$',
-u'\U0001d6bc': '$\\mathbf{\\Upsilon}$',
-u'\U0001d6bd': '$\\mathbf{\\Phi}$',
-u'\U0001d6be': '$\\mathbf{\\Chi}$',
-u'\U0001d6bf': '$\\mathbf{\\Psi}$',
-u'\U0001d6c0': '$\\mathbf{\\Omega}$',
-u'\U0001d6c1': '$\\mathbf{\\nabla}$',
-u'\U0001d6c2': '$\\mathbf{\\Alpha}$',
-u'\U0001d6c3': '$\\mathbf{\\Beta}$',
-u'\U0001d6c4': '$\\mathbf{\\Gamma}$',
-u'\U0001d6c5': '$\\mathbf{\\Delta}$',
-u'\U0001d6c6': '$\\mathbf{\\Epsilon}$',
-u'\U0001d6c7': '$\\mathbf{\\Zeta}$',
-u'\U0001d6c8': '$\\mathbf{\\Eta}$',
-u'\U0001d6c9': '$\\mathbf{\\theta}$',
-u'\U0001d6ca': '$\\mathbf{\\Iota}$',
-u'\U0001d6cb': '$\\mathbf{\\Kappa}$',
-u'\U0001d6cc': '$\\mathbf{\\Lambda}$',
-u'\U0001d6cd': '$M$',
-u'\U0001d6ce': '$N$',
-u'\U0001d6cf': '$\\mathbf{\\Xi}$',
-u'\U0001d6d0': '$O$',
-u'\U0001d6d1': '$\\mathbf{\\Pi}$',
-u'\U0001d6d2': '$\\mathbf{\\Rho}$',
-u'\U0001d6d3': '$\\mathbf{\\varsigma}$',
-u'\U0001d6d4': '$\\mathbf{\\Sigma}$',
-u'\U0001d6d5': '$\\mathbf{\\Tau}$',
-u'\U0001d6d6': '$\\mathbf{\\Upsilon}$',
-u'\U0001d6d7': '$\\mathbf{\\Phi}$',
-u'\U0001d6d8': '$\\mathbf{\\Chi}$',
-u'\U0001d6d9': '$\\mathbf{\\Psi}$',
-u'\U0001d6da': '$\\mathbf{\\Omega}$',
-u'\U0001d6db': '$\\partial$',
-u'\U0001d6dc': '$\\in$',
-u'\U0001d6dd': '{\\mathbf{\\vartheta}}',
-u'\U0001d6de': '{\\mathbf{\\varkappa}}',
-u'\U0001d6df': '{\\mathbf{\\phi}}',
-u'\U0001d6e0': '{\\mathbf{\\varrho}}',
-u'\U0001d6e1': '{\\mathbf{\\varpi}}',
-u'\U0001d6e2': '$\\mathsl{\\Alpha}$',
-u'\U0001d6e3': '$\\mathsl{\\Beta}$',
-u'\U0001d6e4': '$\\mathsl{\\Gamma}$',
-u'\U0001d6e5': '$\\mathsl{\\Delta}$',
-u'\U0001d6e6': '$\\mathsl{\\Epsilon}$',
-u'\U0001d6e7': '$\\mathsl{\\Zeta}$',
-u'\U0001d6e8': '$\\mathsl{\\Eta}$',
-u'\U0001d6e9': '$\\mathsl{\\Theta}$',
-u'\U0001d6ea': '$\\mathsl{\\Iota}$',
-u'\U0001d6eb': '$\\mathsl{\\Kappa}$',
-u'\U0001d6ec': '$\\mathsl{\\Lambda}$',
-u'\U0001d6ed': '$M$',
-u'\U0001d6ee': '$N$',
-u'\U0001d6ef': '$\\mathsl{\\Xi}$',
-u'\U0001d6f0': '$O$',
-u'\U0001d6f1': '$\\mathsl{\\Pi}$',
-u'\U0001d6f2': '$\\mathsl{\\Rho}$',
-u'\U0001d6f3': '{\\mathsl{\\vartheta}}',
-u'\U0001d6f4': '$\\mathsl{\\Sigma}$',
-u'\U0001d6f5': '$\\mathsl{\\Tau}$',
-u'\U0001d6f6': '$\\mathsl{\\Upsilon}$',
-u'\U0001d6f7': '$\\mathsl{\\Phi}$',
-u'\U0001d6f8': '$\\mathsl{\\Chi}$',
-u'\U0001d6f9': '$\\mathsl{\\Psi}$',
-u'\U0001d6fa': '$\\mathsl{\\Omega}$',
-u'\U0001d6fb': '$\\mathsl{\\nabla}$',
-u'\U0001d6fc': '$\\mathsl{\\Alpha}$',
-u'\U0001d6fd': '$\\mathsl{\\Beta}$',
-u'\U0001d6fe': '$\\mathsl{\\Gamma}$',
-u'\U0001d6ff': '$\\mathsl{\\Delta}$',
-u'\U0001d700': '$\\mathsl{\\Epsilon}$',
-u'\U0001d701': '$\\mathsl{\\Zeta}$',
-u'\U0001d702': '$\\mathsl{\\Eta}$',
-u'\U0001d703': '$\\mathsl{\\Theta}$',
-u'\U0001d704': '$\\mathsl{\\Iota}$',
-u'\U0001d705': '$\\mathsl{\\Kappa}$',
-u'\U0001d706': '$\\mathsl{\\Lambda}$',
-u'\U0001d707': '$M$',
-u'\U0001d708': '$N$',
-u'\U0001d709': '$\\mathsl{\\Xi}$',
-u'\U0001d70a': '$O$',
-u'\U0001d70b': '$\\mathsl{\\Pi}$',
-u'\U0001d70c': '$\\mathsl{\\Rho}$',
-u'\U0001d70d': '$\\mathsl{\\varsigma}$',
-u'\U0001d70e': '$\\mathsl{\\Sigma}$',
-u'\U0001d70f': '$\\mathsl{\\Tau}$',
-u'\U0001d710': '$\\mathsl{\\Upsilon}$',
-u'\U0001d711': '$\\mathsl{\\Phi}$',
-u'\U0001d712': '$\\mathsl{\\Chi}$',
-u'\U0001d713': '$\\mathsl{\\Psi}$',
-u'\U0001d714': '$\\mathsl{\\Omega}$',
-u'\U0001d715': '$\\partial$',
-u'\U0001d716': '$\\in$',
-u'\U0001d717': '{\\mathsl{\\vartheta}}',
-u'\U0001d718': '{\\mathsl{\\varkappa}}',
-u'\U0001d719': '{\\mathsl{\\phi}}',
-u'\U0001d71a': '{\\mathsl{\\varrho}}',
-u'\U0001d71b': '{\\mathsl{\\varpi}}',
-u'\U0001d71c': '$\\mathbit{\\Alpha}$',
-u'\U0001d71d': '$\\mathbit{\\Beta}$',
-u'\U0001d71e': '$\\mathbit{\\Gamma}$',
-u'\U0001d71f': '$\\mathbit{\\Delta}$',
-u'\U0001d720': '$\\mathbit{\\Epsilon}$',
-u'\U0001d721': '$\\mathbit{\\Zeta}$',
-u'\U0001d722': '$\\mathbit{\\Eta}$',
-u'\U0001d723': '$\\mathbit{\\Theta}$',
-u'\U0001d724': '$\\mathbit{\\Iota}$',
-u'\U0001d725': '$\\mathbit{\\Kappa}$',
-u'\U0001d726': '$\\mathbit{\\Lambda}$',
-u'\U0001d727': '$M$',
-u'\U0001d728': '$N$',
-u'\U0001d729': '$\\mathbit{\\Xi}$',
-u'\U0001d72a': '$O$',
-u'\U0001d72b': '$\\mathbit{\\Pi}$',
-u'\U0001d72c': '$\\mathbit{\\Rho}$',
-u'\U0001d72d': '{\\mathbit{O}}',
-u'\U0001d72e': '$\\mathbit{\\Sigma}$',
-u'\U0001d72f': '$\\mathbit{\\Tau}$',
-u'\U0001d730': '$\\mathbit{\\Upsilon}$',
-u'\U0001d731': '$\\mathbit{\\Phi}$',
-u'\U0001d732': '$\\mathbit{\\Chi}$',
-u'\U0001d733': '$\\mathbit{\\Psi}$',
-u'\U0001d734': '$\\mathbit{\\Omega}$',
-u'\U0001d735': '$\\mathbit{\\nabla}$',
-u'\U0001d736': '$\\mathbit{\\Alpha}$',
-u'\U0001d737': '$\\mathbit{\\Beta}$',
-u'\U0001d738': '$\\mathbit{\\Gamma}$',
-u'\U0001d739': '$\\mathbit{\\Delta}$',
-u'\U0001d73a': '$\\mathbit{\\Epsilon}$',
-u'\U0001d73b': '$\\mathbit{\\Zeta}$',
-u'\U0001d73c': '$\\mathbit{\\Eta}$',
-u'\U0001d73d': '$\\mathbit{\\Theta}$',
-u'\U0001d73e': '$\\mathbit{\\Iota}$',
-u'\U0001d73f': '$\\mathbit{\\Kappa}$',
-u'\U0001d740': '$\\mathbit{\\Lambda}$',
-u'\U0001d741': '$M$',
-u'\U0001d742': '$N$',
-u'\U0001d743': '$\\mathbit{\\Xi}$',
-u'\U0001d744': '$O$',
-u'\U0001d745': '$\\mathbit{\\Pi}$',
-u'\U0001d746': '$\\mathbit{\\Rho}$',
-u'\U0001d747': '$\\mathbit{\\varsigma}$',
-u'\U0001d748': '$\\mathbit{\\Sigma}$',
-u'\U0001d749': '$\\mathbit{\\Tau}$',
-u'\U0001d74a': '$\\mathbit{\\Upsilon}$',
-u'\U0001d74b': '$\\mathbit{\\Phi}$',
-u'\U0001d74c': '$\\mathbit{\\Chi}$',
-u'\U0001d74d': '$\\mathbit{\\Psi}$',
-u'\U0001d74e': '$\\mathbit{\\Omega}$',
-u'\U0001d74f': '$\\partial$',
-u'\U0001d750': '$\\in$',
-u'\U0001d751': '{\\mathbit{\\vartheta}}',
-u'\U0001d752': '{\\mathbit{\\varkappa}}',
-u'\U0001d753': '{\\mathbit{\\phi}}',
-u'\U0001d754': '{\\mathbit{\\varrho}}',
-u'\U0001d755': '{\\mathbit{\\varpi}}',
-u'\U0001d756': '$\\mathsfbf{\\Alpha}$',
-u'\U0001d757': '$\\mathsfbf{\\Beta}$',
-u'\U0001d758': '$\\mathsfbf{\\Gamma}$',
-u'\U0001d759': '$\\mathsfbf{\\Delta}$',
-u'\U0001d75a': '$\\mathsfbf{\\Epsilon}$',
-u'\U0001d75b': '$\\mathsfbf{\\Zeta}$',
-u'\U0001d75c': '$\\mathsfbf{\\Eta}$',
-u'\U0001d75d': '$\\mathsfbf{\\Theta}$',
-u'\U0001d75e': '$\\mathsfbf{\\Iota}$',
-u'\U0001d75f': '$\\mathsfbf{\\Kappa}$',
-u'\U0001d760': '$\\mathsfbf{\\Lambda}$',
-u'\U0001d761': '$M$',
-u'\U0001d762': '$N$',
-u'\U0001d763': '$\\mathsfbf{\\Xi}$',
-u'\U0001d764': '$O$',
-u'\U0001d765': '$\\mathsfbf{\\Pi}$',
-u'\U0001d766': '$\\mathsfbf{\\Rho}$',
-u'\U0001d767': '{\\mathsfbf{\\vartheta}}',
-u'\U0001d768': '$\\mathsfbf{\\Sigma}$',
-u'\U0001d769': '$\\mathsfbf{\\Tau}$',
-u'\U0001d76a': '$\\mathsfbf{\\Upsilon}$',
-u'\U0001d76b': '$\\mathsfbf{\\Phi}$',
-u'\U0001d76c': '$\\mathsfbf{\\Chi}$',
-u'\U0001d76d': '$\\mathsfbf{\\Psi}$',
-u'\U0001d76e': '$\\mathsfbf{\\Omega}$',
-u'\U0001d76f': '$\\mathsfbf{\\nabla}$',
-u'\U0001d770': '$\\mathsfbf{\\Alpha}$',
-u'\U0001d771': '$\\mathsfbf{\\Beta}$',
-u'\U0001d772': '$\\mathsfbf{\\Gamma}$',
-u'\U0001d773': '$\\mathsfbf{\\Delta}$',
-u'\U0001d774': '$\\mathsfbf{\\Epsilon}$',
-u'\U0001d775': '$\\mathsfbf{\\Zeta}$',
-u'\U0001d776': '$\\mathsfbf{\\Eta}$',
-u'\U0001d777': '$\\mathsfbf{\\Theta}$',
-u'\U0001d778': '$\\mathsfbf{\\Iota}$',
-u'\U0001d779': '$\\mathsfbf{\\Kappa}$',
-u'\U0001d77a': '$\\mathsfbf{\\Lambda}$',
-u'\U0001d77b': '$M$',
-u'\U0001d77c': '$N$',
-u'\U0001d77d': '$\\mathsfbf{\\Xi}$',
-u'\U0001d77e': '$O$',
-u'\U0001d77f': '$\\mathsfbf{\\Pi}$',
-u'\U0001d780': '$\\mathsfbf{\\Rho}$',
-u'\U0001d781': '$\\mathsfbf{\\varsigma}$',
-u'\U0001d782': '$\\mathsfbf{\\Sigma}$',
-u'\U0001d783': '$\\mathsfbf{\\Tau}$',
-u'\U0001d784': '$\\mathsfbf{\\Upsilon}$',
-u'\U0001d785': '$\\mathsfbf{\\Phi}$',
-u'\U0001d786': '$\\mathsfbf{\\Chi}$',
-u'\U0001d787': '$\\mathsfbf{\\Psi}$',
-u'\U0001d788': '$\\mathsfbf{\\Omega}$',
-u'\U0001d789': '$\\partial$',
-u'\U0001d78a': '$\\in$',
-u'\U0001d78b': '{\\mathsfbf{\\vartheta}}',
-u'\U0001d78c': '{\\mathsfbf{\\varkappa}}',
-u'\U0001d78d': '{\\mathsfbf{\\phi}}',
-u'\U0001d78e': '{\\mathsfbf{\\varrho}}',
-u'\U0001d78f': '{\\mathsfbf{\\varpi}}',
-u'\U0001d790': '$\\mathsfbfsl{\\Alpha}$',
-u'\U0001d791': '$\\mathsfbfsl{\\Beta}$',
-u'\U0001d792': '$\\mathsfbfsl{\\Gamma}$',
-u'\U0001d793': '$\\mathsfbfsl{\\Delta}$',
-u'\U0001d794': '$\\mathsfbfsl{\\Epsilon}$',
-u'\U0001d795': '$\\mathsfbfsl{\\Zeta}$',
-u'\U0001d796': '$\\mathsfbfsl{\\Eta}$',
-u'\U0001d797': '$\\mathsfbfsl{\\vartheta}$',
-u'\U0001d798': '$\\mathsfbfsl{\\Iota}$',
-u'\U0001d799': '$\\mathsfbfsl{\\Kappa}$',
-u'\U0001d79a': '$\\mathsfbfsl{\\Lambda}$',
-u'\U0001d79b': '$M$',
-u'\U0001d79c': '$N$',
-u'\U0001d79d': '$\\mathsfbfsl{\\Xi}$',
-u'\U0001d79e': '$O$',
-u'\U0001d79f': '$\\mathsfbfsl{\\Pi}$',
-u'\U0001d7a0': '$\\mathsfbfsl{\\Rho}$',
-u'\U0001d7a1': '{\\mathsfbfsl{\\vartheta}}',
-u'\U0001d7a2': '$\\mathsfbfsl{\\Sigma}$',
-u'\U0001d7a3': '$\\mathsfbfsl{\\Tau}$',
-u'\U0001d7a4': '$\\mathsfbfsl{\\Upsilon}$',
-u'\U0001d7a5': '$\\mathsfbfsl{\\Phi}$',
-u'\U0001d7a6': '$\\mathsfbfsl{\\Chi}$',
-u'\U0001d7a7': '$\\mathsfbfsl{\\Psi}$',
-u'\U0001d7a8': '$\\mathsfbfsl{\\Omega}$',
-u'\U0001d7a9': '$\\mathsfbfsl{\\nabla}$',
-u'\U0001d7aa': '$\\mathsfbfsl{\\Alpha}$',
-u'\U0001d7ab': '$\\mathsfbfsl{\\Beta}$',
-u'\U0001d7ac': '$\\mathsfbfsl{\\Gamma}$',
-u'\U0001d7ad': '$\\mathsfbfsl{\\Delta}$',
-u'\U0001d7ae': '$\\mathsfbfsl{\\Epsilon}$',
-u'\U0001d7af': '$\\mathsfbfsl{\\Zeta}$',
-u'\U0001d7b0': '$\\mathsfbfsl{\\Eta}$',
-u'\U0001d7b1': '$\\mathsfbfsl{\\vartheta}$',
-u'\U0001d7b2': '$\\mathsfbfsl{\\Iota}$',
-u'\U0001d7b3': '$\\mathsfbfsl{\\Kappa}$',
-u'\U0001d7b4': '$\\mathsfbfsl{\\Lambda}$',
-u'\U0001d7b5': '$M$',
-u'\U0001d7b6': '$N$',
-u'\U0001d7b7': '$\\mathsfbfsl{\\Xi}$',
-u'\U0001d7b8': '$O$',
-u'\U0001d7b9': '$\\mathsfbfsl{\\Pi}$',
-u'\U0001d7ba': '$\\mathsfbfsl{\\Rho}$',
-u'\U0001d7bb': '$\\mathsfbfsl{\\varsigma}$',
-u'\U0001d7bc': '$\\mathsfbfsl{\\Sigma}$',
-u'\U0001d7bd': '$\\mathsfbfsl{\\Tau}$',
-u'\U0001d7be': '$\\mathsfbfsl{\\Upsilon}$',
-u'\U0001d7bf': '$\\mathsfbfsl{\\Phi}$',
-u'\U0001d7c0': '$\\mathsfbfsl{\\Chi}$',
-u'\U0001d7c1': '$\\mathsfbfsl{\\Psi}$',
-u'\U0001d7c2': '$\\mathsfbfsl{\\Omega}$',
-u'\U0001d7c3': '$\\partial$',
-u'\U0001d7c4': '$\\in$',
-u'\U0001d7c5': '{\\mathsfbfsl{\\vartheta}}',
-u'\U0001d7c6': '{\\mathsfbfsl{\\varkappa}}',
-u'\U0001d7c7': '{\\mathsfbfsl{\\phi}}',
-u'\U0001d7c8': '{\\mathsfbfsl{\\varrho}}',
-u'\U0001d7c9': '{\\mathsfbfsl{\\varpi}}',
-u'\U0001d7ce': '$\\mathbf{0}$',
-u'\U0001d7cf': '$\\mathbf{1}$',
-u'\U0001d7d0': '$\\mathbf{2}$',
-u'\U0001d7d1': '$\\mathbf{3}$',
-u'\U0001d7d2': '$\\mathbf{4}$',
-u'\U0001d7d3': '$\\mathbf{5}$',
-u'\U0001d7d4': '$\\mathbf{6}$',
-u'\U0001d7d5': '$\\mathbf{7}$',
-u'\U0001d7d6': '$\\mathbf{8}$',
-u'\U0001d7d7': '$\\mathbf{9}$',
-u'\U0001d7d8': '$\\mathbb{0}$',
-u'\U0001d7d9': '$\\mathbb{1}$',
-u'\U0001d7da': '$\\mathbb{2}$',
-u'\U0001d7db': '$\\mathbb{3}$',
-u'\U0001d7dc': '$\\mathbb{4}$',
-u'\U0001d7dd': '$\\mathbb{5}$',
-u'\U0001d7de': '$\\mathbb{6}$',
-u'\U0001d7df': '$\\mathbb{7}$',
-u'\U0001d7e0': '$\\mathbb{8}$',
-u'\U0001d7e1': '$\\mathbb{9}$',
-u'\U0001d7e2': '$\\mathsf{0}$',
-u'\U0001d7e3': '$\\mathsf{1}$',
-u'\U0001d7e4': '$\\mathsf{2}$',
-u'\U0001d7e5': '$\\mathsf{3}$',
-u'\U0001d7e6': '$\\mathsf{4}$',
-u'\U0001d7e7': '$\\mathsf{5}$',
-u'\U0001d7e8': '$\\mathsf{6}$',
-u'\U0001d7e9': '$\\mathsf{7}$',
-u'\U0001d7ea': '$\\mathsf{8}$',
-u'\U0001d7eb': '$\\mathsf{9}$',
-u'\U0001d7ec': '$\\mathsfbf{0}$',
-u'\U0001d7ed': '$\\mathsfbf{1}$',
-u'\U0001d7ee': '$\\mathsfbf{2}$',
-u'\U0001d7ef': '$\\mathsfbf{3}$',
-u'\U0001d7f0': '$\\mathsfbf{4}$',
-u'\U0001d7f1': '$\\mathsfbf{5}$',
-u'\U0001d7f2': '$\\mathsfbf{6}$',
-u'\U0001d7f3': '$\\mathsfbf{7}$',
-u'\U0001d7f4': '$\\mathsfbf{8}$',
-u'\U0001d7f5': '$\\mathsfbf{9}$',
-u'\U0001d7f6': '$\\mathtt{0}$',
-u'\U0001d7f7': '$\\mathtt{1}$',
-u'\U0001d7f8': '$\\mathtt{2}$',
-u'\U0001d7f9': '$\\mathtt{3}$',
-u'\U0001d7fa': '$\\mathtt{4}$',
-u'\U0001d7fb': '$\\mathtt{5}$',
-u'\U0001d7fc': '$\\mathtt{6}$',
-u'\U0001d7fd': '$\\mathtt{7}$',
-u'\U0001d7fe': '$\\mathtt{8}$',
-u'\U0001d7ff': '$\\mathtt{9}$'}
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/null.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-# $Id: null.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-A do-nothing Writer.
-"""
-
-from docutils import writers
-
-
-class Writer(writers.UnfilteredWriter):
-
-    supported = ('null',)
-    """Formats this writer supports."""
-
-    config_section = 'null writer'
-    config_section_dependencies = ('writers',)
-
-    def translate(self):
-        pass
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-PEP HTML Writer.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import sys
-import os
-import os.path
-import codecs
-import docutils
-from docutils import frontend, nodes, utils, writers
-from docutils.writers import html4css1
-
-
-class Writer(html4css1.Writer):
-
-    default_stylesheet = 'pep.css'
-
-    default_stylesheet_path = utils.relative_path(
-        os.path.join(os.getcwd(), 'dummy'),
-        os.path.join(os.path.dirname(__file__), default_stylesheet))
-
-    default_template = 'template.txt'
-
-    default_template_path = utils.relative_path(
-        os.path.join(os.getcwd(), 'dummy'),
-        os.path.join(os.path.dirname(__file__), default_template))
-
-    settings_spec = html4css1.Writer.settings_spec + (
-        'PEP/HTML-Specific Options',
-        'For the PEP/HTML writer, the default value for the --stylesheet-path '
-        'option is "%s", and the default value for --template is "%s". '
-        'See HTML-Specific Options above.'
-        % (default_stylesheet_path, default_template_path),
-        (('Python\'s home URL.  Default is "http://www.python.org".',
-          ['--python-home'],
-          {'default': 'http://www.python.org', 'metavar': '<URL>'}),
-         ('Home URL prefix for PEPs.  Default is "." (current directory).',
-          ['--pep-home'],
-          {'default': '.', 'metavar': '<URL>'}),
-         # For testing.
-         (frontend.SUPPRESS_HELP,
-          ['--no-random'],
-          {'action': 'store_true', 'validator': frontend.validate_boolean}),))
-
-    settings_default_overrides = {'stylesheet_path': default_stylesheet_path,
-                                  'template': default_template_path,}
-
-    relative_path_settings = (html4css1.Writer.relative_path_settings
-                              + ('template',))
-
-    config_section = 'pep_html writer'
-    config_section_dependencies = ('writers', 'html4css1 writer')
-
-    def __init__(self):
-        html4css1.Writer.__init__(self)
-        self.translator_class = HTMLTranslator
-
-    def interpolation_dict(self):
-        subs = html4css1.Writer.interpolation_dict(self)
-        settings = self.document.settings
-        pyhome = settings.python_home
-        subs['pyhome'] = pyhome
-        subs['pephome'] = settings.pep_home
-        if pyhome == '..':
-            subs['pepindex'] = '.'
-        else:
-            subs['pepindex'] = pyhome + '/dev/peps'
-        index = self.document.first_child_matching_class(nodes.field_list)
-        header = self.document[index]
-        self.pepnum = header[0][1].astext()
-        subs['pep'] = self.pepnum
-        if settings.no_random:
-            subs['banner'] = 0
-        else:
-            import random
-            subs['banner'] = random.randrange(64)
-        try:
-            subs['pepnum'] = '%04i' % int(self.pepnum)
-        except ValueError:
-            subs['pepnum'] = pepnum
-        self.title = header[1][1].astext()
-        subs['title'] = self.title
-        subs['body'] = ''.join(
-            self.body_pre_docinfo + self.docinfo + self.body)
-        return subs
-
-    def assemble_parts(self):
-        html4css1.Writer.assemble_parts(self)
-        self.parts['title'] = [self.title]
-        self.parts['pepnum'] = self.pepnum
-
-
-class HTMLTranslator(html4css1.HTMLTranslator):
-
-    def depart_field_list(self, node):
-        html4css1.HTMLTranslator.depart_field_list(self, node)
-        if 'rfc2822' in node['classes']:
-             self.body.append('<hr />\n')
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/pep.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,344 +0,0 @@
-/*
-:Author: David Goodger
-:Contact: goodger@python.org
-:date: $Date: 2006-05-21 22:44:42 +0200 (Sun, 21 May 2006) $
-:version: $Revision: 4564 $
-:copyright: This stylesheet has been placed in the public domain.
-
-Default cascading style sheet for the PEP HTML output of Docutils.
-*/
-
-/* "! important" is used here to override other ``margin-top`` and
-   ``margin-bottom`` styles that are later in the stylesheet or 
-   more specific.  See http://www.w3.org/TR/CSS1#the-cascade */
-.first {
-  margin-top: 0 ! important }
-
-.last, .with-subtitle {
-  margin-bottom: 0 ! important }
-
-.hidden {
-  display: none }
-
-.navigation {
-  width: 100% ;
-  background: #99ccff ;
-  margin-top: 0px ;
-  margin-bottom: 0px }
-
-.navigation .navicon {
-  width: 150px ;
-  height: 35px }
-
-.navigation .textlinks {
-  padding-left: 1em ;
-  text-align: left }
-
-.navigation td, .navigation th {
-  padding-left: 0em ;
-  padding-right: 0em ;
-  vertical-align: middle }
-
-.rfc2822 {
-  margin-top: 0.5em ;
-  margin-left: 0.5em ;
-  margin-right: 0.5em ;
-  margin-bottom: 0em }
-
-.rfc2822 td {
-  text-align: left }
-
-.rfc2822 th.field-name {
-  text-align: right ;
-  font-family: sans-serif ;
-  padding-right: 0.5em ;
-  font-weight: bold ;
-  margin-bottom: 0em }
-
-a.toc-backref {
-  text-decoration: none ;
-  color: black }
-
-blockquote.epigraph {
-  margin: 2em 5em ; }
-
-body {
-  margin: 0px ;
-  margin-bottom: 1em ;
-  padding: 0px }
-
-dl.docutils dd {
-  margin-bottom: 0.5em }
-
-div.section {
-  margin-left: 1em ;
-  margin-right: 1em ;
-  margin-bottom: 1.5em }
-
-div.section div.section {
-  margin-left: 0em ;
-  margin-right: 0em ;
-  margin-top: 1.5em }
-
-div.abstract {
-  margin: 2em 5em }
-
-div.abstract p.topic-title {
-  font-weight: bold ;
-  text-align: center }
-
-div.admonition, div.attention, div.caution, div.danger, div.error,
-div.hint, div.important, div.note, div.tip, div.warning {
-  margin: 2em ;
-  border: medium outset ;
-  padding: 1em }
-
-div.admonition p.admonition-title, div.hint p.admonition-title,
-div.important p.admonition-title, div.note p.admonition-title,
-div.tip p.admonition-title {
-  font-weight: bold ;
-  font-family: sans-serif }
-
-div.attention p.admonition-title, div.caution p.admonition-title,
-div.danger p.admonition-title, div.error p.admonition-title,
-div.warning p.admonition-title {
-  color: red ;
-  font-weight: bold ;
-  font-family: sans-serif }
-
-/* Uncomment (and remove this text!) to get reduced vertical space in
-   compound paragraphs.
-div.compound .compound-first, div.compound .compound-middle {
-  margin-bottom: 0.5em }
-
-div.compound .compound-last, div.compound .compound-middle {
-  margin-top: 0.5em }
-*/
-
-div.dedication {
-  margin: 2em 5em ;
-  text-align: center ;
-  font-style: italic }
-
-div.dedication p.topic-title {
-  font-weight: bold ;
-  font-style: normal }
-
-div.figure {
-  margin-left: 2em ;
-  margin-right: 2em }
-
-div.footer, div.header {
-  clear: both;
-  font-size: smaller }
-
-div.footer {
-  margin-left: 1em ;
-  margin-right: 1em }
-
-div.line-block {
-  display: block ;
-  margin-top: 1em ;
-  margin-bottom: 1em }
-
-div.line-block div.line-block {
-  margin-top: 0 ;
-  margin-bottom: 0 ;
-  margin-left: 1.5em }
-
-div.sidebar {
-  margin-left: 1em ;
-  border: medium outset ;
-  padding: 1em ;
-  background-color: #ffffee ;
-  width: 40% ;
-  float: right ;
-  clear: right }
-
-div.sidebar p.rubric {
-  font-family: sans-serif ;
-  font-size: medium }
-
-div.system-messages {
-  margin: 5em }
-
-div.system-messages h1 {
-  color: red }
-
-div.system-message {
-  border: medium outset ;
-  padding: 1em }
-
-div.system-message p.system-message-title {
-  color: red ;
-  font-weight: bold }
-
-div.topic {
-  margin: 2em }
-
-h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
-h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
-  margin-top: 0.4em }
-
-h1 {
-  font-family: sans-serif ;
-  font-size: large }
-
-h2 {
-  font-family: sans-serif ;
-  font-size: medium }
-
-h3 {
-  font-family: sans-serif ;
-  font-size: small }
-
-h4 {
-  font-family: sans-serif ;
-  font-style: italic ;
-  font-size: small }
-
-h5 {
-  font-family: sans-serif;
-  font-size: x-small }
-
-h6 {
-  font-family: sans-serif;
-  font-style: italic ;
-  font-size: x-small }
-
-hr.docutils {
-  width: 75% }
-
-img.align-left {
-  clear: left }
-
-img.align-right {
-  clear: right }
-
-img.borderless {
-  border: 0 }
-
-ol.simple, ul.simple {
-  margin-bottom: 1em }
-
-ol.arabic {
-  list-style: decimal }
-
-ol.loweralpha {
-  list-style: lower-alpha }
-
-ol.upperalpha {
-  list-style: upper-alpha }
-
-ol.lowerroman {
-  list-style: lower-roman }
-
-ol.upperroman {
-  list-style: upper-roman }
-
-p.attribution {
-  text-align: right ;
-  margin-left: 50% }
-
-p.caption {
-  font-style: italic }
-
-p.credits {
-  font-style: italic ;
-  font-size: smaller }
-
-p.label {
-  white-space: nowrap }
-
-p.rubric {
-  font-weight: bold ;
-  font-size: larger ;
-  color: maroon ;
-  text-align: center }
-
-p.sidebar-title {
-  font-family: sans-serif ;
-  font-weight: bold ;
-  font-size: larger }
-
-p.sidebar-subtitle {
-  font-family: sans-serif ;
-  font-weight: bold }
-
-p.topic-title {
-  font-family: sans-serif ;
-  font-weight: bold }
-
-pre.address {
-  margin-bottom: 0 ;
-  margin-top: 0 ;
-  font-family: serif ;
-  font-size: 100% }
-
-pre.literal-block, pre.doctest-block {
-  margin-left: 2em ;
-  margin-right: 2em }
-
-span.classifier {
-  font-family: sans-serif ;
-  font-style: oblique }
-
-span.classifier-delimiter {
-  font-family: sans-serif ;
-  font-weight: bold }
-
-span.interpreted {
-  font-family: sans-serif }
-
-span.option {
-  white-space: nowrap }
-
-span.option-argument {
-  font-style: italic }
-
-span.pre {
-  white-space: pre }
-
-span.problematic {
-  color: red }
-
-span.section-subtitle {
-  /* font-size relative to parent (h1..h6 element) */
-  font-size: 80% }
-
-table.citation {
-  border-left: solid 1px gray;
-  margin-left: 1px }
-
-table.docinfo {
-  margin: 2em 4em }
-
-table.docutils {
-  margin-top: 0.5em ;
-  margin-bottom: 0.5em }
-
-table.footnote {
-  border-left: solid 1px black;
-  margin-left: 1px }
-
-table.docutils td, table.docutils th,
-table.docinfo td, table.docinfo th {
-  padding-left: 0.5em ;
-  padding-right: 0.5em ;
-  vertical-align: top }
-
-td.num {
-  text-align: right }
-
-th.field-name {
-  font-weight: bold ;
-  text-align: left ;
-  white-space: nowrap ;
-  padding-left: 0 }
-
-h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
-h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
-  font-size: 100% }
-
-ul.auto-toc {
-  list-style-type: none }
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/template.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="%(encoding)s" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<!--
-This HTML is auto-generated.  DO NOT EDIT THIS FILE!  If you are writing a new
-PEP, see http://www.python.org/dev/peps/pep-0001 for instructions and links
-to templates.  DO NOT USE THIS HTML FILE AS YOUR TEMPLATE!
--->
-<head>
-  <meta http-equiv="Content-Type" content="text/html; charset=%(encoding)s" />
-  <meta name="generator" content="Docutils %(version)s: http://docutils.sourceforge.net/" />
-  <title>PEP %(pep)s -- %(title)s</title>
-  %(stylesheet)s
-</head>
-<body bgcolor="white">
-<table class="navigation" cellpadding="0" cellspacing="0"
-       width="100%%" border="0">
-<tr><td class="navicon" width="150" height="35">
-<a href="%(pyhome)s/" title="Python Home Page">
-<img src="%(pyhome)s/pics/PyBanner%(banner)03d.gif" alt="[Python]"
- border="0" width="150" height="35" /></a></td>
-<td class="textlinks" align="left">
-[<b><a href="%(pyhome)s/">Python Home</a></b>]
-[<b><a href="%(pepindex)s/">PEP Index</a></b>]
-[<b><a href="%(pephome)s/pep-%(pepnum)s.txt">PEP Source</a></b>]
-</td></tr></table>
-<div class="document">
-%(body)s
-%(body_suffix)s
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pseudoxml.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-# $Id: pseudoxml.py 4564 2006-05-21 20:44:42Z wiemann $
-# Author: David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-Simple internal document tree Writer, writes indented pseudo-XML.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-from docutils import writers
-
-
-class Writer(writers.Writer):
-
-    supported = ('pprint', 'pformat', 'pseudoxml')
-    """Formats this writer supports."""
-
-    config_section = 'pseudoxml writer'
-    config_section_dependencies = ('writers',)
-
-    output = None
-    """Final translated form of `document`."""
-
-    def translate(self):
-        self.output = self.document.pformat()
-
-    def supports(self, format):
-        """This writer supports all format-specific elements."""
-        return 1
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,337 +0,0 @@
-# $Id: __init__.py 4883 2007-01-16 01:51:28Z wiemann $
-# Authors: Chris Liechti <cliechti@gmx.net>;
-#          David Goodger <goodger@python.org>
-# Copyright: This module has been placed in the public domain.
-
-"""
-S5/HTML Slideshow Writer.
-"""
-
-__docformat__ = 'reStructuredText'
-
-
-import sys
-import os
-import re
-import docutils
-from docutils import frontend, nodes, utils
-from docutils.writers import html4css1
-from docutils.parsers.rst import directives
-
-themes_dir_path = utils.relative_path(
-    os.path.join(os.getcwd(), 'dummy'),
-    os.path.join(os.path.dirname(__file__), 'themes'))
-
-def find_theme(name):
-    # Where else to look for a theme?
-    # Check working dir?  Destination dir?  Config dir?  Plugins dir?
-    path = os.path.join(themes_dir_path, name)
-    if not os.path.isdir(path):
-        raise docutils.ApplicationError(
-            'Theme directory not found: %r (path: %r)' % (name, path))
-    return path
-
-
-class Writer(html4css1.Writer):
-
-    settings_spec = html4css1.Writer.settings_spec + (
-        'S5 Slideshow Specific Options',
-        'For the S5/HTML writer, the --no-toc-backlinks option '
-        '(defined in General Docutils Options above) is the default, '
-        'and should not be changed.',
-        (('Specify an installed S5 theme by name.  Overrides --theme-url.  '
-          'The default theme name is "default".  The theme files will be '
-          'copied into a "ui/<theme>" directory, in the same directory as the '
-          'destination file (output HTML).  Note that existing theme files '
-          'will not be overwritten (unless --overwrite-theme-files is used).',
-          ['--theme'],
-          {'default': 'default', 'metavar': '<name>',
-           'overrides': 'theme_url'}),
-         ('Specify an S5 theme URL.  The destination file (output HTML) will '
-          'link to this theme; nothing will be copied.  Overrides --theme.',
-          ['--theme-url'],
-          {'metavar': '<URL>', 'overrides': 'theme'}),
-         ('Allow existing theme files in the ``ui/<theme>`` directory to be '
-          'overwritten.  The default is not to overwrite theme files.',
-          ['--overwrite-theme-files'],
-          {'action': 'store_true', 'validator': frontend.validate_boolean}),
-         ('Keep existing theme files in the ``ui/<theme>`` directory; do not '
-          'overwrite any.  This is the default.',
-          ['--keep-theme-files'],
-          {'dest': 'overwrite_theme_files', 'action': 'store_false'}),
-         ('Set the initial view mode to "slideshow" [default] or "outline".',
-          ['--view-mode'],
-          {'choices': ['slideshow', 'outline'], 'default': 'slideshow',
-           'metavar': '<mode>'}),
-         ('Normally hide the presentation controls in slideshow mode. '
-          'This is the default.',
-          ['--hidden-controls'],
-          {'action': 'store_true', 'default': True,
-           'validator': frontend.validate_boolean}),
-         ('Always show the presentation controls in slideshow mode.  '
-          'The default is to hide the controls.',
-          ['--visible-controls'],
-          {'dest': 'hidden_controls', 'action': 'store_false'}),
-         ('Enable the current slide indicator ("1 / 15").  '
-          'The default is to disable it.',
-          ['--current-slide'],
-          {'action': 'store_true', 'validator': frontend.validate_boolean}),
-         ('Disable the current slide indicator.  This is the default.',
-          ['--no-current-slide'],
-          {'dest': 'current_slide', 'action': 'store_false'}),))
-
-    settings_default_overrides = {'toc_backlinks': 0}
-
-    config_section = 's5_html writer'
-    config_section_dependencies = ('writers', 'html4css1 writer')
-
-    def __init__(self):
-        html4css1.Writer.__init__(self)
-        self.translator_class = S5HTMLTranslator
-
-
-class S5HTMLTranslator(html4css1.HTMLTranslator):
-
-    s5_stylesheet_template = """\
-<!-- configuration parameters -->
-<meta name="defaultView" content="%(view_mode)s" />
-<meta name="controlVis" content="%(control_visibility)s" />
-<!-- style sheet links -->
-<script src="%(path)s/slides.js" type="text/javascript"></script>
-<link rel="stylesheet" href="%(path)s/slides.css"
-      type="text/css" media="projection" id="slideProj" />
-<link rel="stylesheet" href="%(path)s/outline.css"
-      type="text/css" media="screen" id="outlineStyle" />
-<link rel="stylesheet" href="%(path)s/print.css"
-      type="text/css" media="print" id="slidePrint" />
-<link rel="stylesheet" href="%(path)s/opera.css"
-      type="text/css" media="projection" id="operaFix" />\n"""
-    # The script element must go in front of the link elements to
-    # avoid a flash of unstyled content (FOUC), reproducible with
-    # Firefox.
-
-    disable_current_slide = """
-<style type="text/css">
-#currentSlide {display: none;}
-</style>\n"""
-
-    layout_template = """\
-<div class="layout">
-<div id="controls"></div>
-<div id="currentSlide"></div>
-<div id="header">
-%(header)s
-</div>
-<div id="footer">
-%(title)s%(footer)s
-</div>
-</div>\n"""
-# <div class="topleft"></div>
-# <div class="topright"></div>
-# <div class="bottomleft"></div>
-# <div class="bottomright"></div>
-
-    default_theme = 'default'
-    """Name of the default theme."""
-
-    base_theme_file = '__base__'
-    """Name of the file containing the name of the base theme."""
-
-    direct_theme_files = (
-        'slides.css', 'outline.css', 'print.css', 'opera.css', 'slides.js')
-    """Names of theme files directly linked to in the output HTML"""
-
-    indirect_theme_files = (
-        's5-core.css', 'framing.css', 'pretty.css', 'blank.gif', 'iepngfix.htc')
-    """Names of files used indirectly; imported or used by files in
-    `direct_theme_files`."""
-
-    required_theme_files = indirect_theme_files + direct_theme_files
-    """Names of mandatory theme files."""
-
-    def __init__(self, *args):
-        html4css1.HTMLTranslator.__init__(self, *args)
-        #insert S5-specific stylesheet and script stuff:
-        self.theme_file_path = None
-        self.setup_theme()
-        view_mode = self.document.settings.view_mode
-        control_visibility = ('visible', 'hidden')[self.document.settings
-                                                   .hidden_controls]
-        self.stylesheet.append(self.s5_stylesheet_template
-                               % {'path': self.theme_file_path,
-                                  'view_mode': view_mode,
-                                  'control_visibility': control_visibility})
-        if not self.document.settings.current_slide:
-            self.stylesheet.append(self.disable_current_slide)
-        self.add_meta('<meta name="version" content="S5 1.1" />\n')
-        self.s5_footer = []
-        self.s5_header = []
-        self.section_count = 0
-        self.theme_files_copied = None
-
-    def setup_theme(self):
-        if self.document.settings.theme:
-            self.copy_theme()
-        elif self.document.settings.theme_url:
-            self.theme_file_path = self.document.settings.theme_url
-        else:
-            raise docutils.ApplicationError(
-                'No theme specified for S5/HTML writer.')
-
-    def copy_theme(self):
-        """
-        Locate & copy theme files.
-
-        A theme may be explicitly based on another theme via a '__base__'
-        file.  The default base theme is 'default'.  Files are accumulated
-        from the specified theme, any base themes, and 'default'.
-        """
-        settings = self.document.settings
-        path = find_theme(settings.theme)
-        theme_paths = [path]
-        self.theme_files_copied = {}
-        required_files_copied = {}
-        # This is a link (URL) in HTML, so we use "/", not os.sep:
-        self.theme_file_path = '%s/%s' % ('ui', settings.theme)
-        if settings._destination:
-            dest = os.path.join(
-                os.path.dirname(settings._destination), 'ui', settings.theme)
-            if not os.path.isdir(dest):
-                os.makedirs(dest)
-        else:
-            # no destination, so we can't copy the theme
-            return
-        default = 0
-        while path:
-            for f in os.listdir(path):  # copy all files from each theme
-                if f == self.base_theme_file:
-                    continue            # ... except the "__base__" file
-                if ( self.copy_file(f, path, dest)
-                     and f in self.required_theme_files):
-                    required_files_copied[f] = 1
-            if default:
-                break                   # "default" theme has no base theme
-            # Find the "__base__" file in theme directory:
-            base_theme_file = os.path.join(path, self.base_theme_file)
-            # If it exists, read it and record the theme path:
-            if os.path.isfile(base_theme_file):
-                lines = open(base_theme_file).readlines()
-                for line in lines:
-                    line = line.strip()
-                    if line and not line.startswith('#'):
-                        path = find_theme(line)
-                        if path in theme_paths: # check for duplicates (cycles)
-                            path = None         # if found, use default base
-                        else:
-                            theme_paths.append(path)
-                        break
-                else:                   # no theme name found
-                    path = None         # use default base
-            else:                       # no base theme file found
-                path = None             # use default base
-            if not path:
-                path = find_theme(self.default_theme)
-                theme_paths.append(path)
-                default = 1
-        if len(required_files_copied) != len(self.required_theme_files):
-            # Some required files weren't found & couldn't be copied.
-            required = list(self.required_theme_files)
-            for f in required_files_copied.keys():
-                required.remove(f)
-            raise docutils.ApplicationError(
-                'Theme files not found: %s'
-                % ', '.join(['%r' % f for f in required]))
-
-    files_to_skip_pattern = re.compile(r'~$|\.bak$|#$|\.cvsignore$')
-
-    def copy_file(self, name, source_dir, dest_dir):
-        """
-        Copy file `name` from `source_dir` to `dest_dir`.
-        Return 1 if the file exists in either `source_dir` or `dest_dir`.
-        """
-        source = os.path.join(source_dir, name)
-        dest = os.path.join(dest_dir, name)
-        if self.theme_files_copied.has_key(dest):
-            return 1
-        else:
-            self.theme_files_copied[dest] = 1
-        if os.path.isfile(source):
-            if self.files_to_skip_pattern.search(source):
-                return None
-            settings = self.document.settings
-            if os.path.exists(dest) and not settings.overwrite_theme_files:
-                settings.record_dependencies.add(dest)
-            else:
-                src_file = open(source, 'rb')
-                src_data = src_file.read()
-                src_file.close()
-                dest_file = open(dest, 'wb')
-                dest_dir = dest_dir.replace(os.sep, '/')
-                dest_file.write(src_data.replace(
-                    'ui/default', dest_dir[dest_dir.rfind('ui/'):]))
-                dest_file.close()
-                settings.record_dependencies.add(source)
-            return 1
-        if os.path.isfile(dest):
-            return 1
-
-    def depart_document(self, node):
-        header = ''.join(self.s5_header)
-        footer = ''.join(self.s5_footer)
-        title = ''.join(self.html_title).replace('<h1 class="title">', '<h1>')
-        layout = self.layout_template % {'header': header,
-                                         'title': title,
-                                         'footer': footer}
-        self.fragment.extend(self.body)
-        self.body_prefix.extend(layout)
-        self.body_prefix.append('<div class="presentation">\n')
-        self.body_prefix.append(
-            self.starttag({'classes': ['slide'], 'ids': ['slide0']}, 'div'))
-        if not self.section_count:
-            self.body.append('</div>\n')
-        self.body_suffix.insert(0, '</div>\n')
-        # skip content-type meta tag with interpolated charset value:
-        self.html_head.extend(self.head[1:])
-        self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo
-                              + self.docinfo + self.body
-                              + self.body_suffix[:-1])
-
-    def depart_footer(self, node):
-        start = self.context.pop()
-        self.s5_footer.append('<h2>')
-        self.s5_footer.extend(self.body[start:])
-        self.s5_footer.append('</h2>')
-        del self.body[start:]
-
-    def depart_header(self, node):
-        start = self.context.pop()
-        header = ['<div id="header">\n']
-        header.extend(self.body[start:])
-        header.append('\n</div>\n')
-        del self.body[start:]
-        self.s5_header.extend(header)
-
-    def visit_section(self, node):
-        if not self.section_count:
-            self.body.append('\n</div>\n')
-        self.section_count += 1
-        self.section_level += 1
-        if self.section_level > 1:
-            # dummy for matching div's
-            self.body.append(self.starttag(node, 'div', CLASS='section'))
-        else:
-            self.body.append(self.starttag(node, 'div', CLASS='slide'))
-
-    def visit_subtitle(self, node):
-        if isinstance(node.parent, nodes.section):
-            level = self.section_level + self.initial_header_level - 1
-            if level == 1:
-                level = 2
-            tag = 'h%s' % level
-            self.body.append(self.starttag(node, tag, ''))
-            self.context.append('</%s>\n' % tag)
-        else:
-            html4css1.HTMLTranslator.visit_subtitle(self, node)
-
-    def visit_title(self, node):
-        html4css1.HTMLTranslator.visit_title(self, node)
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/README.txt	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-Except where otherwise noted (default/iepngfix.htc), all files in this
-directory have been released into the Public Domain.
-
-These files are based on files from S5 1.1, released into the Public
-Domain by Eric Meyer.  For further details, please see
-http://www.meyerweb.com/eric/tools/s5/credits.html.
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/__base__	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-# base theme of this theme:
-big-white
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/framing.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/* The following styles size, place, and layer the slide components.
-   Edit these if you want to change the overall slide layout.
-   The commented lines can be uncommented (and modified, if necessary) 
-    to help you with the rearrangement process. */
-
-/* target = 1024x768 */
-
-div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
-div#header {top: 0; z-index: 1;}
-div#footer {display:none;}
-.slide {top: 0; width: 92%; padding: 0.1em 4% 4%; z-index: 2;}
-/*  list-style: none;} */
-div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
-div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
-  margin: 0;}
-#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
-  z-index: 10;}
-html>body #currentSlide {position: fixed;}
-
-/*
-div#header {background: #FCC;}
-div#footer {background: #CCF;}
-div#controls {background: #BBD;}
-div#currentSlide {background: #FFC;}
-*/
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/pretty.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-/* This file has been placed in the public domain. */
-/* Following are the presentation styles -- edit away! */
-
-html, body {margin: 0; padding: 0;}
-body {background: black; color: white;}
-:link, :visited {text-decoration: none; color: cyan;}
-#controls :active {color: #888 !important;}
-#controls :focus {outline: 1px dotted #CCC;}
-
-blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
-blockquote p {margin: 0;}
-
-kbd {font-weight: bold; font-size: 1em;}
-sup {font-size: smaller; line-height: 1px;}
-
-.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
-.slide ul ul li {list-style: square;}
-.slide img.leader {display: block; margin: 0 auto;}
-.slide tt {font-size: 90%;}
-
-.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;}
-.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;}
-.slide h2 {font-size: 110%;}
-.slide h3 {font-size: 105%;}
-h1 abbr {font-variant: small-caps;}
-
-div#controls {position: absolute; left: 50%; bottom: 0;
-  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
-html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
-div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
-  margin: 0; padding: 0;}
-#controls #navLinks a {padding: 0; margin: 0 0.5em; 
-  border: none; color: #888; cursor: pointer;}
-#controls #navList {height: 1em;}
-#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
-  background: black; color: #CCC;}
-
-#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
-  font-family: sans-serif; font-weight: bold;}
-
-#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0;
-  font-size: 150%; white-space: normal; background: transparent;}
-#slide0 h2 {font: 110%; font-style: italic; color: gray;}
-#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
-#slide0 h4 {margin-top: 0; font-size: 1em;}
-
-ul.urls {list-style: none; display: inline; margin: 0;}
-.urls li {display: inline; margin: 0;}
-.external {border-bottom: 1px dotted gray;}
-html>body .external {border-bottom: none;}
-.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
-
-.incremental, .incremental *, .incremental *:after {
-  color: black; visibility: visible; border: 0;}
-img.incremental {visibility: hidden;}
-.slide .current {color: lime;}
-
-.slide-display {display: inline ! important;}
-
-.huge {font-size: 150%;}
-.big {font-size: 120%;}
-.small {font-size: 75%;}
-.tiny {font-size: 50%;}
-.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
-.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
-
-.maroon {color: maroon;}
-.red {color: red;}
-.magenta {color: magenta;}
-.fuchsia {color: fuchsia;}
-.pink {color: #FAA;}
-.orange {color: orange;}
-.yellow {color: yellow;}
-.lime {color: lime;}
-.green {color: green;}
-.olive {color: olive;}
-.teal {color: teal;}
-.cyan {color: cyan;}
-.aqua {color: aqua;}
-.blue {color: blue;}
-.navy {color: navy;}
-.purple {color: purple;}
-.black {color: black;}
-.gray {color: gray;}
-.silver {color: silver;}
-.white {color: white;}
-
-.left {text-align: left ! important;}
-.center {text-align: center ! important;}
-.right {text-align: right ! important;}
-
-.animation {position: relative; margin: 1em 0; padding: 0;}
-.animation img {position: absolute;}
-
-/* Docutils-specific overrides */
-
-.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
-
-div.sidebar {background-color: black;}
-
-pre.literal-block, pre.doctest-block {background-color: black;}
-
-tt.docutils {background-color: black;}
-
-/* diagnostics */
-/*
-li:after {content: " [" attr(class) "]"; color: #F88;}
-div:before {content: "[" attr(class) "]"; color: #F88;}
-*/
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/framing.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-/* This file has been placed in the public domain. */
-/* The following styles size, place, and layer the slide components.
-   Edit these if you want to change the overall slide layout.
-   The commented lines can be uncommented (and modified, if necessary) 
-   to help you with the rearrangement process. */
-
-/* target = 1024x768 */
-
-div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
-div#footer {display:none;}
-.slide {top: 0; width: 92%; padding: 0.25em 4% 4%; z-index: 2;}
-div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
-div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
-  margin: 0;}
-#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
-  z-index: 10;}
-html>body #currentSlide {position: fixed;}
-
-/*
-div#header {background: #FCC;}
-div#footer {background: #CCF;}
-div#controls {background: #BBD;}
-div#currentSlide {background: #FFC;}
-*/
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/pretty.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-/* This file has been placed in the public domain. */
-/* Following are the presentation styles -- edit away! */
-
-html, body {margin: 0; padding: 0;}
-body {background: white; color: black;}
-:link, :visited {text-decoration: none; color: #00C;}
-#controls :active {color: #88A !important;}
-#controls :focus {outline: 1px dotted #227;}
-
-blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
-blockquote p {margin: 0;}
-
-kbd {font-weight: bold; font-size: 1em;}
-sup {font-size: smaller; line-height: 1px;}
-
-.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
-.slide ul ul li {list-style: square;}
-.slide img.leader {display: block; margin: 0 auto;}
-.slide tt {font-size: 90%;}
-
-.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;}
-.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;}
-.slide h2 {font-size: 110%;}
-.slide h3 {font-size: 105%;}
-h1 abbr {font-variant: small-caps;}
-
-div#controls {position: absolute; left: 50%; bottom: 0;
-  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
-html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
-div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
-  margin: 0; padding: 0;}
-#controls #navLinks a {padding: 0; margin: 0 0.5em; 
-  border: none; color: #005; cursor: pointer;}
-#controls #navList {height: 1em;}
-#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
-  background: #DDD; color: #227;}
-
-#currentSlide {text-align: center; font-size: 0.5em; color: #444;
-  font-family: sans-serif; font-weight: bold;}
-
-#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0;
-  font-size: 150%; white-space: normal; background: transparent;}
-#slide0 h2 {font: 110%; font-style: italic; color: gray;}
-#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
-#slide0 h4 {margin-top: 0; font-size: 1em;}
-
-ul.urls {list-style: none; display: inline; margin: 0;}
-.urls li {display: inline; margin: 0;}
-.external {border-bottom: 1px dotted gray;}
-html>body .external {border-bottom: none;}
-.external:after {content: " \274F"; font-size: smaller; color: #77B;}
-
-.incremental, .incremental *, .incremental *:after {
-  color: white; visibility: visible; border: 0;}
-img.incremental {visibility: hidden;}
-.slide .current {color: green;}
-
-.slide-display {display: inline ! important;}
-
-.huge {font-size: 150%;}
-.big {font-size: 120%;}
-.small {font-size: 75%;}
-.tiny {font-size: 50%;}
-.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
-.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
-
-.maroon {color: maroon;}
-.red {color: red;}
-.magenta {color: magenta;}
-.fuchsia {color: fuchsia;}
-.pink {color: #FAA;}
-.orange {color: orange;}
-.yellow {color: yellow;}
-.lime {color: lime;}
-.green {color: green;}
-.olive {color: olive;}
-.teal {color: teal;}
-.cyan {color: cyan;}
-.aqua {color: aqua;}
-.blue {color: blue;}
-.navy {color: navy;}
-.purple {color: purple;}
-.black {color: black;}
-.gray {color: gray;}
-.silver {color: silver;}
-.white {color: white;}
-
-.left {text-align: left ! important;}
-.center {text-align: center ! important;}
-.right {text-align: right ! important;}
-
-.animation {position: relative; margin: 1em 0; padding: 0;}
-.animation img {position: absolute;}
-
-/* Docutils-specific overrides */
-
-.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
-
-pre.literal-block, pre.doctest-block {background-color: white;}
-
-tt.docutils {background-color: white;}
-
-/* diagnostics */
-/*
-li:after {content: " [" attr(class) "]"; color: #F88;}
-div:before {content: "[" attr(class) "]"; color: #F88;}
-*/
Binary file buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/blank.gif has changed
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/framing.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/* This file has been placed in the public domain. */
-/* The following styles size, place, and layer the slide components.
-   Edit these if you want to change the overall slide layout.
-   The commented lines can be uncommented (and modified, if necessary) 
-   to help you with the rearrangement process. */
-
-/* target = 1024x768 */
-
-div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
-div#header {position: fixed; top: 0; height: 3em; z-index: 1;}
-div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
-.slide {top: 0; width: 92%; padding: 2.5em 4% 4%; z-index: 2;}
-div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
-div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
-  margin: 0;}
-#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
-  z-index: 10;}
-html>body #currentSlide {position: fixed;}
-
-/*
-div#header {background: #FCC;}
-div#footer {background: #CCF;}
-div#controls {background: #BBD;}
-div#currentSlide {background: #FFC;}
-*/
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/iepngfix.htc	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-<public:component>
-<public:attach event="onpropertychange" onevent="doFix()" />
-
-<script>
-
-// IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull http://www.twinhelix.com
-// Free usage permitted as long as this notice remains intact.
-
-// This must be a path to a blank image. That's all the configuration you need here.
-var blankImg = 'ui/default/blank.gif';
-
-var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
-
-function filt(s, m) {
- if (filters[f]) {
-  filters[f].enabled = s ? true : false;
-  if (s) with (filters[f]) { src = s; sizingMethod = m }
- } else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
-}
-
-function doFix() {
- if ((parseFloat(navigator.userAgent.match(/MSIE (\S+)/)[1]) < 5.5) ||
-  (event && !/(background|src)/.test(event.propertyName))) return;
-
- if (tagName == 'IMG') {
-  if ((/\.png$/i).test(src)) {
-   filt(src, 'image');  // was 'scale'
-   src = blankImg;
-  } else if (src.indexOf(blankImg) < 0) filt();
- } else if (style.backgroundImage) {
-  if (style.backgroundImage.match(/^url[("']+(.*\.png)[)"']+$/i)) {
-   var s = RegExp.$1;
-   style.backgroundImage = '';
-   filt(s, 'crop');
-  } else filt();
- }
-}
-
-doFix();
-
-</script>
-</public:component>
\ No newline at end of file
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/opera.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-/* This file has been placed in the public domain. */
-/* DO NOT CHANGE THESE unless you really want to break Opera Show */
-.slide {
-	visibility: visible !important;
-	position: static !important;
-	page-break-before: always;
-}
-#slide0 {page-break-before: avoid;}
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/outline.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-/* This file has been placed in the public domain. */
-/* Don't change this unless you want the layout stuff to show up in the
-   outline view! */
-
-.layout div, #footer *, #controlForm * {display: none;}
-#footer, #controls, #controlForm, #navLinks, #toggle {
-  display: block; visibility: visible; margin: 0; padding: 0;}
-#toggle {float: right; padding: 0.5em;}
-html>body #toggle {position: fixed; top: 0; right: 0;}
-
-/* making the outline look pretty-ish */
-
-#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;}
-#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;}
-
-.outline {display: inline ! important;}
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/pretty.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,120 +0,0 @@
-/* This file has been placed in the public domain. */
-/* Following are the presentation styles -- edit away! */
-
-html, body {margin: 0; padding: 0;}
-body {background: white; color: black;}
-/* Replace the background style above with the style below (and again for
-   div#header) for a graphic: */
-/* background: white url(bodybg.gif) -16px 0 no-repeat; */
-:link, :visited {text-decoration: none; color: #00C;}
-#controls :active {color: #88A !important;}
-#controls :focus {outline: 1px dotted #227;}
-h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
-
-blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
-blockquote p {margin: 0;}
-
-kbd {font-weight: bold; font-size: 1em;}
-sup {font-size: smaller; line-height: 1px;}
-
-.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
-.slide ul ul li {list-style: square;}
-.slide img.leader {display: block; margin: 0 auto;}
-.slide tt {font-size: 90%;}
-
-div#header, div#footer {background: #005; color: #AAB; font-family: sans-serif;}
-/* background: #005 url(bodybg.gif) -16px 0 no-repeat; */
-div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;}
-#footer h1 {display: block; padding: 0 1em;}
-#footer h2 {display: block; padding: 0.8em 1em 0;}
-
-.slide {font-size: 1.2em;}
-.slide h1 {position: absolute; top: 0.45em; z-index: 1;
-  margin: 0; padding-left: 0.7em; white-space: nowrap;
-  font: bold 150% sans-serif; color: #DDE; background: #005;}
-.slide h2 {font: bold 120%/1em sans-serif; padding-top: 0.5em;}
-.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
-h1 abbr {font-variant: small-caps;}
-
-div#controls {position: absolute; left: 50%; bottom: 0;
-  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
-html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
-div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
-  margin: 0; padding: 0;}
-#controls #navLinks a {padding: 0; margin: 0 0.5em; 
-  background: #005; border: none; color: #779; cursor: pointer;}
-#controls #navList {height: 1em;}
-#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
-  background: #DDD; color: #227;}
-
-#currentSlide {text-align: center; font-size: 0.5em; color: #449;
-  font-family: sans-serif; font-weight: bold;}
-
-#slide0 {padding-top: 1.5em}
-#slide0 h1 {position: static; margin: 1em 0 0; padding: 0; color: #000;
-  font: bold 2em sans-serif; white-space: normal; background: transparent;}
-#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
-#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
-#slide0 h4 {margin-top: 0; font-size: 1em;}
-
-ul.urls {list-style: none; display: inline; margin: 0;}
-.urls li {display: inline; margin: 0;}
-.external {border-bottom: 1px dotted gray;}
-html>body .external {border-bottom: none;}
-.external:after {content: " \274F"; font-size: smaller; color: #77B;}
-
-.incremental, .incremental *, .incremental *:after {visibility: visible;
-  color: white; border: 0;}
-img.incremental {visibility: hidden;}
-.slide .current {color: green;}
-
-.slide-display {display: inline ! important;}
-
-.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
-.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
-.small {font-size: 75%;}
-.tiny {font-size: 50%;}
-.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
-.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
-
-.maroon {color: maroon;}
-.red {color: red;}
-.magenta {color: magenta;}
-.fuchsia {color: fuchsia;}
-.pink {color: #FAA;}
-.orange {color: orange;}
-.yellow {color: yellow;}
-.lime {color: lime;}
-.green {color: green;}
-.olive {color: olive;}
-.teal {color: teal;}
-.cyan {color: cyan;}
-.aqua {color: aqua;}
-.blue {color: blue;}
-.navy {color: navy;}
-.purple {color: purple;}
-.black {color: black;}
-.gray {color: gray;}
-.silver {color: silver;}
-.white {color: white;}
-
-.left {text-align: left ! important;}
-.center {text-align: center ! important;}
-.right {text-align: right ! important;}
-
-.animation {position: relative; margin: 1em 0; padding: 0;}
-.animation img {position: absolute;}
-
-/* Docutils-specific overrides */
-
-.slide table.docinfo {margin: 1em 0 0.5em 2em;}
-
-pre.literal-block, pre.doctest-block {background-color: white;}
-
-tt.docutils {background-color: white;}
-
-/* diagnostics */
-/*
-li:after {content: " [" attr(class) "]"; color: #F88;}
-div:before {content: "[" attr(class) "]"; color: #F88;}
-*/
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/print.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-/* This file has been placed in the public domain. */
-/* The following rule is necessary to have all slides appear in print!
-   DO NOT REMOVE IT! */
-.slide, ul {page-break-inside: avoid; visibility: visible !important;}
-h1 {page-break-after: avoid;}
-
-body {font-size: 12pt; background: white;}
-* {color: black;}
-
-#slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;}
-#slide0 h3 {margin: 0; padding: 0;}
-#slide0 h4 {margin: 0 0 0.5em; padding: 0;}
-#slide0 {margin-bottom: 3em;}
-
-#header {display: none;}
-#footer h1 {margin: 0; border-bottom: 1px solid; color: gray;
-  font-style: italic;}
-#footer h2, #controls {display: none;}
-
-.print {display: inline ! important;}
-
-/* The following rule keeps the layout stuff out of print.
-   Remove at your own risk! */
-.layout, .layout * {display: none !important;}
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/s5-core.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-/* This file has been placed in the public domain. */
-/* Do not edit or override these styles!
-   The system will likely break if you do. */
-
-div#header, div#footer, div#controls, .slide {position: absolute;}
-html>body div#header, html>body div#footer, 
-  html>body div#controls, html>body .slide {position: fixed;}
-.handout {display: none;}
-.layout {display: block;}
-.slide, .hideme, .incremental {visibility: hidden;}
-#slide0 {visibility: visible;}
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-/* This file has been placed in the public domain. */
-
-/* required to make the slide show run at all */
-@import url(s5-core.css);
-
-/* sets basic placement and size of slide components */
-@import url(framing.css);
-
-/* styles that make the slides look good */
-@import url(pretty.css);
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.js	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,558 +0,0 @@
-// S5 v1.1 slides.js -- released into the Public Domain
-// Modified for Docutils (http://docutils.sf.net) by David Goodger
-//
-// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for
-// information about all the wonderful and talented contributors to this code!
-
-var undef;
-var slideCSS = '';
-var snum = 0;
-var smax = 1;
-var slideIDs = new Array();
-var incpos = 0;
-var number = undef;
-var s5mode = true;
-var defaultView = 'slideshow';
-var controlVis = 'visible';
-
-var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0;
-var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
-var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
-
-function hasClass(object, className) {
-	if (!object.className) return false;
-	return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
-}
-
-function hasValue(object, value) {
-	if (!object) return false;
-	return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
-}
-
-function removeClass(object,className) {
-	if (!object) return;
-	object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
-}
-
-function addClass(object,className) {
-	if (!object || hasClass(object, className)) return;
-	if (object.className) {
-		object.className += ' '+className;
-	} else {
-		object.className = className;
-	}
-}
-
-function GetElementsWithClassName(elementName,className) {
-	var allElements = document.getElementsByTagName(elementName);
-	var elemColl = new Array();
-	for (var i = 0; i< allElements.length; i++) {
-		if (hasClass(allElements[i], className)) {
-			elemColl[elemColl.length] = allElements[i];
-		}
-	}
-	return elemColl;
-}
-
-function isParentOrSelf(element, id) {
-	if (element == null || element.nodeName=='BODY') return false;
-	else if (element.id == id) return true;
-	else return isParentOrSelf(element.parentNode, id);
-}
-
-function nodeValue(node) {
-	var result = "";
-	if (node.nodeType == 1) {
-		var children = node.childNodes;
-		for (var i = 0; i < children.length; ++i) {
-			result += nodeValue(children[i]);
-		}		
-	}
-	else if (node.nodeType == 3) {
-		result = node.nodeValue;
-	}
-	return(result);
-}
-
-function slideLabel() {
-	var slideColl = GetElementsWithClassName('*','slide');
-	var list = document.getElementById('jumplist');
-	smax = slideColl.length;
-	for (var n = 0; n < smax; n++) {
-		var obj = slideColl[n];
-
-		var did = 'slide' + n.toString();
-		if (obj.getAttribute('id')) {
-			slideIDs[n] = obj.getAttribute('id');
-		}
-		else {
-			obj.setAttribute('id',did);
-			slideIDs[n] = did;
-		}
-		if (isOp) continue;
-
-		var otext = '';
-		var menu = obj.firstChild;
-		if (!menu) continue; // to cope with empty slides
-		while (menu && menu.nodeType == 3) {
-			menu = menu.nextSibling;
-		}
-	 	if (!menu) continue; // to cope with slides with only text nodes
-
-		var menunodes = menu.childNodes;
-		for (var o = 0; o < menunodes.length; o++) {
-			otext += nodeValue(menunodes[o]);
-		}
-		list.options[list.length] = new Option(n + ' : '  + otext, n);
-	}
-}
-
-function currentSlide() {
-	var cs;
-	var footer_nodes;
-	var vis = 'visible';
-	if (document.getElementById) {
-		cs = document.getElementById('currentSlide');
-		footer_nodes = document.getElementById('footer').childNodes;
-	} else {
-		cs = document.currentSlide;
-		footer = document.footer.childNodes;
-	}
-	cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' + 
-		'<span id="csSep">\/<\/span> ' + 
-		'<span id="csTotal">' + (smax-1) + '<\/span>';
-	if (snum == 0) {
-		vis = 'hidden';
-	}
-	cs.style.visibility = vis;
-	for (var i = 0; i < footer_nodes.length; i++) {
-		if (footer_nodes[i].nodeType == 1) {
-			footer_nodes[i].style.visibility = vis;
-		}
-	}		
-}
-
-function go(step) {
-	if (document.getElementById('slideProj').disabled || step == 0) return;
-	var jl = document.getElementById('jumplist');
-	var cid = slideIDs[snum];
-	var ce = document.getElementById(cid);
-	if (incrementals[snum].length > 0) {
-		for (var i = 0; i < incrementals[snum].length; i++) {
-			removeClass(incrementals[snum][i], 'current');
-			removeClass(incrementals[snum][i], 'incremental');
-		}
-	}
-	if (step != 'j') {
-		snum += step;
-		lmax = smax - 1;
-		if (snum > lmax) snum = lmax;
-		if (snum < 0) snum = 0;
-	} else
-		snum = parseInt(jl.value);
-	var nid = slideIDs[snum];
-	var ne = document.getElementById(nid);
-	if (!ne) {
-		ne = document.getElementById(slideIDs[0]);
-		snum = 0;
-	}
-	if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
-	if (incrementals[snum].length > 0 && incpos == 0) {
-		for (var i = 0; i < incrementals[snum].length; i++) {
-			if (hasClass(incrementals[snum][i], 'current'))
-				incpos = i + 1;
-			else
-				addClass(incrementals[snum][i], 'incremental');
-		}
-	}
-	if (incrementals[snum].length > 0 && incpos > 0)
-		addClass(incrementals[snum][incpos - 1], 'current');
-	ce.style.visibility = 'hidden';
-	ne.style.visibility = 'visible';
-	jl.selectedIndex = snum;
-	currentSlide();
-	number = 0;
-}
-
-function goTo(target) {
-	if (target >= smax || target == snum) return;
-	go(target - snum);
-}
-
-function subgo(step) {
-	if (step > 0) {
-		removeClass(incrementals[snum][incpos - 1],'current');
-		removeClass(incrementals[snum][incpos], 'incremental');
-		addClass(incrementals[snum][incpos],'current');
-		incpos++;
-	} else {
-		incpos--;
-		removeClass(incrementals[snum][incpos],'current');
-		addClass(incrementals[snum][incpos], 'incremental');
-		addClass(incrementals[snum][incpos - 1],'current');
-	}
-}
-
-function toggle() {
-	var slideColl = GetElementsWithClassName('*','slide');
-	var slides = document.getElementById('slideProj');
-	var outline = document.getElementById('outlineStyle');
-	if (!slides.disabled) {
-		slides.disabled = true;
-		outline.disabled = false;
-		s5mode = false;
-		fontSize('1em');
-		for (var n = 0; n < smax; n++) {
-			var slide = slideColl[n];
-			slide.style.visibility = 'visible';
-		}
-	} else {
-		slides.disabled = false;
-		outline.disabled = true;
-		s5mode = true;
-		fontScale();
-		for (var n = 0; n < smax; n++) {
-			var slide = slideColl[n];
-			slide.style.visibility = 'hidden';
-		}
-		slideColl[snum].style.visibility = 'visible';
-	}
-}
-
-function showHide(action) {
-	var obj = GetElementsWithClassName('*','hideme')[0];
-	switch (action) {
-	case 's': obj.style.visibility = 'visible'; break;
-	case 'h': obj.style.visibility = 'hidden'; break;
-	case 'k':
-		if (obj.style.visibility != 'visible') {
-			obj.style.visibility = 'visible';
-		} else {
-			obj.style.visibility = 'hidden';
-		}
-	break;
-	}
-}
-
-// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
-function keys(key) {
-	if (!key) {
-		key = event;
-		key.which = key.keyCode;
-	}
-	if (key.which == 84) {
-		toggle();
-		return;
-	}
-	if (s5mode) {
-		switch (key.which) {
-			case 10: // return
-			case 13: // enter
-				if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
-				if (key.target && isParentOrSelf(key.target, 'controls')) return;
-				if(number != undef) {
-					goTo(number);
-					break;
-				}
-			case 32: // spacebar
-			case 34: // page down
-			case 39: // rightkey
-			case 40: // downkey
-				if(number != undef) {
-					go(number);
-				} else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
-					go(1);
-				} else {
-					subgo(1);
-				}
-				break;
-			case 33: // page up
-			case 37: // leftkey
-			case 38: // upkey
-				if(number != undef) {
-					go(-1 * number);
-				} else if (!incrementals[snum] || incpos <= 0) {
-					go(-1);
-				} else {
-					subgo(-1);
-				}
-				break;
-			case 36: // home
-				goTo(0);
-				break;
-			case 35: // end
-				goTo(smax-1);
-				break;
-			case 67: // c
-				showHide('k');
-				break;
-		}
-		if (key.which < 48 || key.which > 57) {
-			number = undef;
-		} else {
-			if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
-			if (key.target && isParentOrSelf(key.target, 'controls')) return;
-			number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
-		}
-	}
-	return false;
-}
-
-function clicker(e) {
-	number = undef;
-	var target;
-	if (window.event) {
-		target = window.event.srcElement;
-		e = window.event;
-	} else target = e.target;
-    if (target.href != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target, 'object')) return true; 
-	if (!e.which || e.which == 1) {
-		if (!incrementals[snum] || incpos >= incrementals[snum].length) {
-			go(1);
-		} else {
-			subgo(1);
-		}
-	}
-}
-
-function findSlide(hash) {
-	var target = document.getElementById(hash);
-	if (target) {
-		for (var i = 0; i < slideIDs.length; i++) {
-			if (target.id == slideIDs[i]) return i;
-		}
-	}
-	return null;
-}
-
-function slideJump() {
-	if (window.location.hash == null || window.location.hash == '') {
-		currentSlide();
-		return;
-	}
-	if (window.location.hash == null) return;
-	var dest = null;
-	dest = findSlide(window.location.hash.slice(1));
-	if (dest == null) {
-		dest = 0;
-	}
-	go(dest - snum);
-}
-
-function fixLinks() {
-	var thisUri = window.location.href;
-	thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
-	var aelements = document.getElementsByTagName('A');
-	for (var i = 0; i < aelements.length; i++) {
-		var a = aelements[i].href;
-		var slideID = a.match('\#.+');
-		if ((slideID) && (slideID[0].slice(0,1) == '#')) {
-			var dest = findSlide(slideID[0].slice(1));
-			if (dest != null) {
-				if (aelements[i].addEventListener) {
-					aelements[i].addEventListener("click", new Function("e",
-						"if (document.getElementById('slideProj').disabled) return;" +
-						"go("+dest+" - snum); " +
-						"if (e.preventDefault) e.preventDefault();"), true);
-				} else if (aelements[i].attachEvent) {
-					aelements[i].attachEvent("onclick", new Function("",
-						"if (document.getElementById('slideProj').disabled) return;" +
-						"go("+dest+" - snum); " +
-						"event.returnValue = false;"));
-				}
-			}
-		}
-	}
-}
-
-function externalLinks() {
-	if (!document.getElementsByTagName) return;
-	var anchors = document.getElementsByTagName('a');
-	for (var i=0; i<anchors.length; i++) {
-		var anchor = anchors[i];
-		if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
-			anchor.target = '_blank';
-			addClass(anchor,'external');
-		}
-	}
-}
-
-function createControls() {
-	var controlsDiv = document.getElementById("controls");
-	if (!controlsDiv) return;
-	var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
-	var hideDiv, hideList = '';
-	if (controlVis == 'hidden') {
-		hideDiv = hider;
-	} else {
-		hideList = hider;
-	}
-	controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
-	'<div id="navLinks">' +
-	'<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
-	'<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
-	'<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
-	'<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
-	'<\/div><\/form>';
-	if (controlVis == 'hidden') {
-		var hidden = document.getElementById('navLinks');
-	} else {
-		var hidden = document.getElementById('jumplist');
-	}
-	addClass(hidden,'hideme');
-}
-
-function fontScale() {  // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers
-	if (!s5mode) return false;
-	var vScale = 22;  // both yield 32 (after rounding) at 1024x768
-	var hScale = 32;  // perhaps should auto-calculate based on theme's declared value?
-	if (window.innerHeight) {
-		var vSize = window.innerHeight;
-		var hSize = window.innerWidth;
-	} else if (document.documentElement.clientHeight) {
-		var vSize = document.documentElement.clientHeight;
-		var hSize = document.documentElement.clientWidth;
-	} else if (document.body.clientHeight) {
-		var vSize = document.body.clientHeight;
-		var hSize = document.body.clientWidth;
-	} else {
-		var vSize = 700;  // assuming 1024x768, minus chrome and such
-		var hSize = 1024; // these do not account for kiosk mode or Opera Show
-	}
-	var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
-	fontSize(newSize + 'px');
-	if (isGe) {  // hack to counter incremental reflow bugs
-		var obj = document.getElementsByTagName('body')[0];
-		obj.style.display = 'none';
-		obj.style.display = 'block';
-	}
-}
-
-function fontSize(value) {
-	if (!(s5ss = document.getElementById('s5ss'))) {
-		if (!isIE) {
-			document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
-			s5ss.setAttribute('media','screen, projection');
-			s5ss.setAttribute('id','s5ss');
-		} else {
-			document.createStyleSheet();
-			document.s5ss = document.styleSheets[document.styleSheets.length - 1];
-		}
-	}
-	if (!isIE) {
-		while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
-		s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
-	} else {
-		document.s5ss.addRule('body','font-size: ' + value + ' !important;');
-	}
-}
-
-function notOperaFix() {
-	slideCSS = document.getElementById('slideProj').href;
-	var slides = document.getElementById('slideProj');
-	var outline = document.getElementById('outlineStyle');
-	slides.setAttribute('media','screen');
-	outline.disabled = true;
-	if (isGe) {
-		slides.setAttribute('href','null');   // Gecko fix
-		slides.setAttribute('href',slideCSS); // Gecko fix
-	}
-	if (isIE && document.styleSheets && document.styleSheets[0]) {
-		document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)');
-		document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)');
-		document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)');
-	}
-}
-
-function getIncrementals(obj) {
-	var incrementals = new Array();
-	if (!obj) 
-		return incrementals;
-	var children = obj.childNodes;
-	for (var i = 0; i < children.length; i++) {
-		var child = children[i];
-		if (hasClass(child, 'incremental')) {
-			if (child.nodeName == 'OL' || child.nodeName == 'UL') {
-				removeClass(child, 'incremental');
-				for (var j = 0; j < child.childNodes.length; j++) {
-					if (child.childNodes[j].nodeType == 1) {
-						addClass(child.childNodes[j], 'incremental');
-					}
-				}
-			} else {
-				incrementals[incrementals.length] = child;
-				removeClass(child,'incremental');
-			}
-		}
-		if (hasClass(child, 'show-first')) {
-			if (child.nodeName == 'OL' || child.nodeName == 'UL') {
-				removeClass(child, 'show-first');
-				if (child.childNodes[isGe].nodeType == 1) {
-					removeClass(child.childNodes[isGe], 'incremental');
-				}
-			} else {
-				incrementals[incrementals.length] = child;
-			}
-		}
-		incrementals = incrementals.concat(getIncrementals(child));
-	}
-	return incrementals;
-}
-
-function createIncrementals() {
-	var incrementals = new Array();
-	for (var i = 0; i < smax; i++) {
-		incrementals[i] = getIncrementals(document.getElementById(slideIDs[i]));
-	}
-	return incrementals;
-}
-
-function defaultCheck() {
-	var allMetas = document.getElementsByTagName('meta');
-	for (var i = 0; i< allMetas.length; i++) {
-		if (allMetas[i].name == 'defaultView') {
-			defaultView = allMetas[i].content;
-		}
-		if (allMetas[i].name == 'controlVis') {
-			controlVis = allMetas[i].content;
-		}
-	}
-}
-
-// Key trap fix, new function body for trap()
-function trap(e) {
-	if (!e) {
-		e = event;
-		e.which = e.keyCode;
-	}
-	try {
-		modifierKey = e.ctrlKey || e.altKey || e.metaKey;
-	}
-	catch(e) {
-		modifierKey = false;
-	}
-	return modifierKey || e.which == 0;
-}
-
-function startup() {
-	defaultCheck();
-	if (!isOp) createControls();
-	slideLabel();
-	fixLinks();
-	externalLinks();
-	fontScale();
-	if (!isOp) {
-		notOperaFix();
-		incrementals = createIncrementals();
-		slideJump();
-		if (defaultView == 'outline') {
-			toggle();
-		}
-		document.onkeyup = keys;
-		document.onkeypress = trap;
-		document.onclick = clicker;
-	}
-}
-
-window.onload = startup;
-window.onresize = function(){setTimeout('fontScale()', 50);}
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-black/__base__	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-# base theme of this theme:
-medium-white
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-black/pretty.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,115 +0,0 @@
-/* This file has been placed in the public domain. */
-/* Following are the presentation styles -- edit away! */
-
-html, body {margin: 0; padding: 0;}
-body {background: black; color: white;}
-:link, :visited {text-decoration: none; color: cyan;}
-#controls :active {color: #888 !important;}
-#controls :focus {outline: 1px dotted #CCC;}
-h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
-
-blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
-blockquote p {margin: 0;}
-
-kbd {font-weight: bold; font-size: 1em;}
-sup {font-size: smaller; line-height: 1px;}
-
-.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
-.slide ul ul li {list-style: square;}
-.slide img.leader {display: block; margin: 0 auto;}
-.slide tt {font-size: 90%;}
-
-div#footer {font-family: sans-serif; color: #AAA; 
-  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
-#footer h1 {display: block; padding: 0 1em;}
-#footer h2 {display: block; padding: 0.8em 1em 0;}
-
-.slide {font-size: 1.75em;}
-.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
-.slide h2 {font: bold 125% sans-serif; padding-top: 0.5em;}
-.slide h3 {font: bold 110% sans-serif; padding-top: 0.5em;}
-h1 abbr {font-variant: small-caps;}
-
-div#controls {position: absolute; left: 50%; bottom: 0;
-  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
-html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
-div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
-  margin: 0; padding: 0;}
-#controls #navLinks a {padding: 0; margin: 0 0.5em; 
-  border: none; color: #888; cursor: pointer;}
-#controls #navList {height: 1em;}
-#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
-  background: black; color: #CCC;}
-
-#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
-  font-family: sans-serif; font-weight: bold;}
-
-#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 1em; top: 0;
-  font: bold 150% sans-serif; white-space: normal; background: transparent;}
-#slide0 h2 {font: bold italic 125% sans-serif; color: gray;}
-#slide0 h3 {margin-top: 1.5em; font: bold 110% sans-serif;}
-#slide0 h4 {margin-top: 0; font-size: 1em;}
-
-ul.urls {list-style: none; display: inline; margin: 0;}
-.urls li {display: inline; margin: 0;}
-.external {border-bottom: 1px dotted gray;}
-html>body .external {border-bottom: none;}
-.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
-
-.incremental, .incremental *, .incremental *:after {
-  color: black; visibility: visible; border: 0;}
-img.incremental {visibility: hidden;}
-.slide .current {color: lime;}
-
-.slide-display {display: inline ! important;}
-
-.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
-.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
-.small {font-size: 75%;}
-.tiny {font-size: 50%;}
-.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
-.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
-
-.maroon {color: maroon;}
-.red {color: red;}
-.magenta {color: magenta;}
-.fuchsia {color: fuchsia;}
-.pink {color: #FAA;}
-.orange {color: orange;}
-.yellow {color: yellow;}
-.lime {color: lime;}
-.green {color: green;}
-.olive {color: olive;}
-.teal {color: teal;}
-.cyan {color: cyan;}
-.aqua {color: aqua;}
-.blue {color: blue;}
-.navy {color: navy;}
-.purple {color: purple;}
-.black {color: black;}
-.gray {color: gray;}
-.silver {color: silver;}
-.white {color: white;}
-
-.left {text-align: left ! important;}
-.center {text-align: center ! important;}
-.right {text-align: right ! important;}
-
-.animation {position: relative; margin: 1em 0; padding: 0;}
-.animation img {position: absolute;}
-
-/* Docutils-specific overrides */
-
-.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
-
-div.sidebar {background-color: black;}
-
-pre.literal-block, pre.doctest-block {background-color: black;}
-
-tt.docutils {background-color: black;}
-
-/* diagnostics */
-/*
-li:after {content: " [" attr(class) "]"; color: #F88;}
-div:before {content: "[" attr(class) "]"; color: #F88;}
-*/
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-white/framing.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-/* This file has been placed in the public domain. */
-/* The following styles size, place, and layer the slide components.
-   Edit these if you want to change the overall slide layout.
-   The commented lines can be uncommented (and modified, if necessary) 
-    to help you with the rearrangement process. */
-
-/* target = 1024x768 */
-
-div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
-div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
-.slide {top: 0; width: 92%; padding: 0.75em 4% 0 4%; z-index: 2;}
-div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
-div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
-  margin: 0;}
-#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
-  z-index: 10;}
-html>body #currentSlide {position: fixed;}
-
-/*
-div#header {background: #FCC;}
-div#footer {background: #CCF;}
-div#controls {background: #BBD;}
-div#currentSlide {background: #FFC;}
-*/
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-white/pretty.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-/* This file has been placed in the public domain. */
-/* Following are the presentation styles -- edit away! */
-
-html, body {margin: 0; padding: 0;}
-body {background: white; color: black;}
-:link, :visited {text-decoration: none; color: #00C;}
-#controls :active {color: #888 !important;}
-#controls :focus {outline: 1px dotted #222;}
-h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
-
-blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
-blockquote p {margin: 0;}
-
-kbd {font-weight: bold; font-size: 1em;}
-sup {font-size: smaller; line-height: 1px;}
-
-.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
-.slide ul ul li {list-style: square;}
-.slide img.leader {display: block; margin: 0 auto;}
-.slide tt {font-size: 90%;}
-
-div#footer {font-family: sans-serif; color: #444; 
-  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
-#footer h1 {display: block; padding: 0 1em;}
-#footer h2 {display: block; padding: 0.8em 1em 0;}
-
-.slide {font-size: 1.75em;}
-.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
-.slide h2 {font: bold 125% sans-serif; padding-top: 0.5em;}
-.slide h3 {font: bold 110% sans-serif; padding-top: 0.5em;}
-h1 abbr {font-variant: small-caps;}
-
-div#controls {position: absolute; left: 50%; bottom: 0;
-  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
-html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
-div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
-  margin: 0; padding: 0;}
-#controls #navLinks a {padding: 0; margin: 0 0.5em; 
-  border: none; color: #888; cursor: pointer;}
-#controls #navList {height: 1em;}
-#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
-  background: #DDD; color: #222;}
-
-#currentSlide {text-align: center; font-size: 0.5em; color: #444;
-  font-family: sans-serif; font-weight: bold;}
-
-#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 1em; top: 0;
-  font: bold 150% sans-serif; white-space: normal; background: transparent;}
-#slide0 h2 {font: bold italic 125% sans-serif; color: gray;}
-#slide0 h3 {margin-top: 1.5em; font: bold 110% sans-serif;}
-#slide0 h4 {margin-top: 0; font-size: 1em;}
-
-ul.urls {list-style: none; display: inline; margin: 0;}
-.urls li {display: inline; margin: 0;}
-.external {border-bottom: 1px dotted gray;}
-html>body .external {border-bottom: none;}
-.external:after {content: " \274F"; font-size: smaller; color: #77B;}
-
-.incremental, .incremental *, .incremental *:after {
-  color: white; visibility: visible; border: 0;}
-img.incremental {visibility: hidden;}
-.slide .current {color: green;}
-
-.slide-display {display: inline ! important;}
-
-.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
-.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
-.small {font-size: 75%;}
-.tiny {font-size: 50%;}
-.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
-.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
-
-.maroon {color: maroon;}
-.red {color: red;}
-.magenta {color: magenta;}
-.fuchsia {color: fuchsia;}
-.pink {color: #FAA;}
-.orange {color: orange;}
-.yellow {color: yellow;}
-.lime {color: lime;}
-.green {color: green;}
-.olive {color: olive;}
-.teal {color: teal;}
-.cyan {color: cyan;}
-.aqua {color: aqua;}
-.blue {color: blue;}
-.navy {color: navy;}
-.purple {color: purple;}
-.black {color: black;}
-.gray {color: gray;}
-.silver {color: silver;}
-.white {color: white;}
-
-.left {text-align: left ! important;}
-.center {text-align: center ! important;}
-.right {text-align: right ! important;}
-
-.animation {position: relative; margin: 1em 0; padding: 0;}
-.animation img {position: absolute;}
-
-/* Docutils-specific overrides */
-
-.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
-
-pre.literal-block, pre.doctest-block {background-color: white;}
-
-tt.docutils {background-color: white;}
-
-/* diagnostics */
-/*
-li:after {content: " [" attr(class) "]"; color: #F88;}
-div:before {content: "[" attr(class) "]"; color: #F88;}
-*/
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-black/__base__	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-# base theme of this theme:
-small-white
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-black/pretty.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,116 +0,0 @@
-/* This file has been placed in the public domain. */
-/* Following are the presentation styles -- edit away! */
-
-html, body {margin: 0; padding: 0;}
-body {background: black; color: white;}
-:link, :visited {text-decoration: none; color: cyan;}
-#controls :active {color: #888 !important;}
-#controls :focus {outline: 1px dotted #CCC;}
-h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
-
-blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
-blockquote p {margin: 0;}
-
-kbd {font-weight: bold; font-size: 1em;}
-sup {font-size: smaller; line-height: 1px;}
-
-.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
-.slide ul ul li {list-style: square;}
-.slide img.leader {display: block; margin: 0 auto;}
-.slide tt {font-size: 90%;}
-
-div#footer {font-family: sans-serif; color: #AAA; 
-  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
-#footer h1 {display: block; padding: 0 1em;}
-#footer h2 {display: block; padding: 0.8em 1em 0;}
-
-.slide {font-size: 1.2em;}
-.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
-.slide h2 {font: bold 120% sans-serif; padding-top: 0.5em;}
-.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
-h1 abbr {font-variant: small-caps;}
-
-div#controls {position: absolute; left: 50%; bottom: 0;
-  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
-html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
-div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
-  margin: 0; padding: 0;}
-#controls #navLinks a {padding: 0; margin: 0 0.5em; 
-  border: none; color: #888; cursor: pointer;}
-#controls #navList {height: 1em;}
-#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
-  background: black; color: #CCC;}
-
-#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
-  font-family: sans-serif; font-weight: bold;}
-
-#slide0 {padding-top: 0em}
-#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
-  font: bold 2em sans-serif; white-space: normal; background: transparent;}
-#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
-#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
-#slide0 h4 {margin-top: 0; font-size: 1em;}
-
-ul.urls {list-style: none; display: inline; margin: 0;}
-.urls li {display: inline; margin: 0;}
-.external {border-bottom: 1px dotted gray;}
-html>body .external {border-bottom: none;}
-.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
-
-.incremental, .incremental *, .incremental *:after {
-  color: black; visibility: visible; border: 0;}
-img.incremental {visibility: hidden;}
-.slide .current {color: lime;}
-
-.slide-display {display: inline ! important;}
-
-.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
-.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
-.small {font-size: 75%;}
-.tiny {font-size: 50%;}
-.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
-.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
-
-.maroon {color: maroon;}
-.red {color: red;}
-.magenta {color: magenta;}
-.fuchsia {color: fuchsia;}
-.pink {color: #FAA;}
-.orange {color: orange;}
-.yellow {color: yellow;}
-.lime {color: lime;}
-.green {color: green;}
-.olive {color: olive;}
-.teal {color: teal;}
-.cyan {color: cyan;}
-.aqua {color: aqua;}
-.blue {color: blue;}
-.navy {color: navy;}
-.purple {color: purple;}
-.black {color: black;}
-.gray {color: gray;}
-.silver {color: silver;}
-.white {color: white;}
-
-.left {text-align: left ! important;}
-.center {text-align: center ! important;}
-.right {text-align: right ! important;}
-
-.animation {position: relative; margin: 1em 0; padding: 0;}
-.animation img {position: absolute;}
-
-/* Docutils-specific overrides */
-
-.slide table.docinfo {margin: 1em 0 0.5em 2em;}
-
-div.sidebar {background-color: black;}
-
-pre.literal-block, pre.doctest-block {background-color: black;}
-
-tt.docutils {background-color: black;}
-
-/* diagnostics */
-/*
-li:after {content: " [" attr(class) "]"; color: #F88;}
-div:before {content: "[" attr(class) "]"; color: #F88;}
-*/
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-white/framing.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-/* This file has been placed in the public domain. */
-/* The following styles size, place, and layer the slide components.
-   Edit these if you want to change the overall slide layout.
-   The commented lines can be uncommented (and modified, if necessary) 
-    to help you with the rearrangement process. */
-
-/* target = 1024x768 */
-
-div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
-div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
-.slide {top: 0; width: 92%; padding: 1em 4% 0 4%; z-index: 2;}
-div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
-div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
-  margin: 0;}
-#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
-  z-index: 10;}
-html>body #currentSlide {position: fixed;}
-
-/*
-div#header {background: #FCC;}
-div#footer {background: #CCF;}
-div#controls {background: #BBD;}
-div#currentSlide {background: #FFC;}
-*/
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-white/pretty.css	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-/* This file has been placed in the public domain. */
-/* Following are the presentation styles -- edit away! */
-
-html, body {margin: 0; padding: 0;}
-body {background: white; color: black;}
-:link, :visited {text-decoration: none; color: #00C;}
-#controls :active {color: #888 !important;}
-#controls :focus {outline: 1px dotted #222;}
-h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
-
-blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
-blockquote p {margin: 0;}
-
-kbd {font-weight: bold; font-size: 1em;}
-sup {font-size: smaller; line-height: 1px;}
-
-.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
-.slide ul ul li {list-style: square;}
-.slide img.leader {display: block; margin: 0 auto;}
-.slide tt {font-size: 90%;}
-
-div#footer {font-family: sans-serif; color: #444; 
-  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
-#footer h1 {display: block; padding: 0 1em;}
-#footer h2 {display: block; padding: 0.8em 1em 0;}
-
-.slide {font-size: 1.2em;}
-.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
-.slide h2 {font: bold 120% sans-serif; padding-top: 0.5em;}
-.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
-h1 abbr {font-variant: small-caps;}
-
-div#controls {position: absolute; left: 50%; bottom: 0;
-  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
-html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
-div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
-  margin: 0; padding: 0;}
-#controls #navLinks a {padding: 0; margin: 0 0.5em; 
-  border: none; color: #888; cursor: pointer;}
-#controls #navList {height: 1em;}
-#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
-  background: #DDD; color: #222;}
-
-#currentSlide {text-align: center; font-size: 0.5em; color: #444;
-  font-family: sans-serif; font-weight: bold;}
-
-#slide0 {padding-top: 0em}
-#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
-  font: bold 2em sans-serif; white-space: normal; background: transparent;}
-#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
-#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
-#slide0 h4 {margin-top: 0; font-size: 1em;}
-
-ul.urls {list-style: none; display: inline; margin: 0;}
-.urls li {display: inline; margin: 0;}
-.external {border-bottom: 1px dotted gray;}
-html>body .external {border-bottom: none;}
-.external:after {content: " \274F"; font-size: smaller; color: #77B;}
-
-.incremental, .incremental *, .incremental *:after {
-  color: white; visibility: visible; border: 0; border: 0;}
-img.incremental {visibility: hidden;}
-.slide .current {color: green;}
-
-.slide-display {display: inline ! important;}
-
-.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
-.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
-.small {font-size: 75%;}
-.tiny {font-size: 50%;}
-.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
-.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
-
-.maroon {color: maroon;}
-.red {color: red;}
-.magenta {color: magenta;}
-.fuchsia {color: fuchsia;}
-.pink {color: #FAA;}
-.orange {color: orange;}
-.yellow {color: yellow;}
-.lime {color: lime;}
-.green {color: green;}
-.olive {color: olive;}
-.teal {color: teal;}
-.cyan {color: cyan;}
-.aqua {color: aqua;}
-.blue {color: blue;}
-.navy {color: navy;}
-.purple {color: purple;}
-.black {color: black;}
-.gray {color: gray;}
-.silver {color: silver;}
-.white {color: white;}
-
-.left {text-align: left ! important;}
-.center {text-align: center ! important;}
-.right {text-align: right ! important;}
-
-.animation {position: relative; margin: 1em 0; padding: 0;}
-.animation img {position: absolute;}
-
-/* Docutils-specific overrides */
-
-.slide table.docinfo {margin: 1em 0 0.5em 2em;}
-
-pre.literal-block, pre.doctest-block {background-color: white;}
-
-tt.docutils {background-color: white;}
-
-/* diagnostics */
-/*
-li:after {content: " [" attr(class) "]"; color: #F88;}
-div:before {content: "[" attr(class) "]"; color: #F88;}
-*/
--- a/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/roman.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-"""Convert to and from Roman numerals"""
-
-__author__ = "Mark Pilgrim (f8dy@diveintopython.org)"
-__version__ = "1.4"
-__date__ = "8 August 2001"
-__copyright__ = """Copyright (c) 2001 Mark Pilgrim
-
-This program is part of "Dive Into Python", a free Python tutorial for
-experienced programmers.  Visit http://diveintopython.org/ for the
-latest version.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the Python 2.1.1 license, available at
-http://www.python.org/2.1.1/license.html
-"""
-
-import re
-
-#Define exceptions
-class RomanError(Exception): pass
-class OutOfRangeError(RomanError): pass
-class NotIntegerError(RomanError): pass
-class InvalidRomanNumeralError(RomanError): pass
-
-#Define digit mapping
-romanNumeralMap = (('M',  1000),
-                   ('CM', 900),
-                   ('D',  500),
-                   ('CD', 400),
-                   ('C',  100),
-                   ('XC', 90),
-                   ('L',  50),
-                   ('XL', 40),
-                   ('X',  10),
-                   ('IX', 9),
-                   ('V',  5),
-                   ('IV', 4),
-                   ('I',  1))
-
-def toRoman(n):
-    """convert integer to Roman numeral"""
-    if not (0 < n < 5000):
-        raise OutOfRangeError, "number out of range (must be 1..4999)"
-    if int(n) <> n:
-        raise NotIntegerError, "decimals can not be converted"
-
-    result = ""
-    for numeral, integer in romanNumeralMap:
-        while n >= integer:
-            result += numeral
-            n -= integer
-    return result
-
-#Define pattern to detect valid Roman numerals
-romanNumeralPattern = re.compile("""
-    ^                   # beginning of string
-    M{0,4}              # thousands - 0 to 4 M's
-    (CM|CD|D?C{0,3})    # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
-                        #            or 500-800 (D, followed by 0 to 3 C's)
-    (XC|XL|L?X{0,3})    # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
-                        #        or 50-80 (L, followed by 0 to 3 X's)
-    (IX|IV|V?I{0,3})    # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
-                        #        or 5-8 (V, followed by 0 to 3 I's)
-    $                   # end of string
-    """ ,re.VERBOSE)
-
-def fromRoman(s):
-    """convert Roman numeral to integer"""
-    if not s:
-        raise InvalidRomanNumeralError, 'Input can not be blank'
-    if not romanNumeralPattern.search(s):
-        raise InvalidRomanNumeralError, 'Invalid Roman numeral: %s' % s
-
-    result = 0
-    index = 0
-    for numeral, integer in romanNumeralMap:
-        while s[index:index+len(numeral)] == numeral:
-            result += integer
-            index += len(numeral)
-    return result
-
--- a/buildframework/helium/external/python/lib/2.5/easy-install.pth	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/external/python/lib/2.5/easy-install.pth	Wed Dec 23 19:29:07 2009 +0200
@@ -1,21 +1,5 @@
 import sys; sys.__plen = len(sys.path)
-./setuptools-0.6c5-py2.5.egg
 ./PyXML-0.8.4-py2.5-win32.egg
 ./4Suite_XML-1.0.2-py2.5-win32.egg
-#../2.6/4Suite_XML-1.0.2-py2.6-win32.egg
-./Amara-1.2.0.1-py2.5.egg
-./coverage-2.85-py2.5.egg
-./docutils-0.5-py2.5.egg
-./epydoc-3.0beta1-py2.5.egg
-./Jinja-1.2-py2.5-win32.egg
-./Jinja2-2.0rc1-py2.5-win32.egg
 ./lxml-1.3.5-py2.5-win32.egg
-#../2.6/lxml-2.2.1-py2.6-win32.egg
-./nose-0.10.4-py2.5.egg
-./mocker-0.10.1-py2.5.egg
-./path-2.2-py2.5.egg
-./pygments-0.10-py2.5.egg
-./simplejson-1.9.1-py2.5-win32.egg
-./sphinx-0.5.1-py2.5.egg
-./psyco-1.6-py2.5.egg
 import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
Binary file buildframework/helium/external/python/lib/2.5/epydoc-3.0beta1-py2.5.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/linux/4Suite_XML-1.0.2-py2.5-linux-i686.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/linux/PyXML-0.8.4-py2.5-linux-i686.egg has changed
--- a/buildframework/helium/external/python/lib/2.5/linux/easy-install.pth	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-import sys; sys.__plen = len(sys.path)
-../setuptools-0.6c5-py2.5.egg
-./PyXML-0.8.4-py2.5-linux-i686.egg
-./4Suite_XML-1.0.2-py2.5-linux-i686.egg
-../Amara-1.2.0.1-py2.5.egg
-./..
-../coverage-2.85-py2.5.egg
-../docutils-0.5-py2.5.egg
-./epydoc-3.0beta1-py2.5.egg
-../Jinja-1.2-py2.5-win32.egg
-../Jinja2-2.0rc1-py2.5-win32.egg
-./lxml-1.3.6-py2.5-linux-i686.egg
-../nose-0.10.2-py2.5.egg
-../mocker-0.10.1-py2.5.egg
-../path-2.2-py2.5.egg
-../pygments-0.10-py2.5.egg
-../simplejson-1.9.1-py2.5-win32.egg
-../sphinx-0.5.1-py2.5.egg
-../psyco-1.6-py2.5.egg
-import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
Binary file buildframework/helium/external/python/lib/2.5/linux/lxml-1.3.6-py2.5-linux-i686.egg has changed
--- a/buildframework/helium/external/python/lib/2.5/linux/site.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,394 +0,0 @@
-# Duplicating setuptools' site.py...
-def __boot():
-    PYTHONPATH = []    
-    if sys.platform=='win32':
-        PYTHONPATH.append(os.path.join(sys.prefix, 'lib'))
-    if not (os.environ.get('PYTHONPATH') is None or (sys.platform=='win32' and not os.environ.get('PYTHONPATH'))):
-        PYTHONPATH.extend(os.environ.get('PYTHONPATH').split(os.pathsep))
-    pic = getattr(sys,'path_importer_cache',{})
-    stdpath = sys.path[len(PYTHONPATH):]
-    mydir = os.path.dirname(__file__)
-    known_paths = dict([(makepath(item)[1],1) for item in sys.path]) # 2.2 comp
-
-    oldpos = getattr(sys,'__egginsert',0)   # save old insertion position
-    sys.__egginsert = 0                     # and reset the current one
-
-    for item in PYTHONPATH:
-        addsitedir(item)
-        item_site_packages = os.path.join(item, 'site-packages')
-        if os.path.exists(item_site_packages):
-            addsitedir(item_site_packages)
-
-    sys.__egginsert += oldpos           # restore effective old position
-
-    d,nd = makepath(stdpath[0])
-    insert_at = None
-    new_path = []
-
-    for item in sys.path:
-        p,np = makepath(item)
-
-        if np==nd and insert_at is None:
-            # We've hit the first 'system' path entry, so added entries go here
-            insert_at = len(new_path)
-
-        if np in known_paths or insert_at is None:
-            new_path.append(item)
-        else:
-            # new path after the insert point, back-insert it
-            new_path.insert(insert_at, item)
-            insert_at += 1
-
-    sys.path[:] = new_path
-    
-import sys
-import os
-import __builtin__
-
-def makepath(*paths):
-    dir = os.path.abspath(os.path.join(*paths))
-    return dir, os.path.normcase(dir)
-
-def abs__file__():
-    """Set all module' __file__ attribute to an absolute path"""
-    for m in sys.modules.values():
-        try:
-            m.__file__ = os.path.abspath(m.__file__)
-        except AttributeError:
-            continue
-
-try:
-    set
-except NameError:
-    class set:
-        def __init__(self, args=()):
-            self.d = {}
-            for v in args:
-                self.d[v] = None
-        def __contains__(self, key):
-            return key in self.d
-        def add(self, key):
-            self.d[key] = None
-
-def removeduppaths():
-    """ Remove duplicate entries from sys.path along with making them
-    absolute"""
-    # This ensures that the initial path provided by the interpreter contains
-    # only absolute pathnames, even if we're running from the build directory.
-    L = []
-    known_paths = set()
-    for dir in sys.path:
-        # Filter out duplicate paths (on case-insensitive file systems also
-        # if they only differ in case); turn relative paths into absolute
-        # paths.
-        dir, dircase = makepath(dir)
-        if not dircase in known_paths:
-            L.append(dir)
-            known_paths.add(dircase)
-    sys.path[:] = L
-    return known_paths
-
-def _init_pathinfo():
-    """Return a set containing all existing directory entries from sys.path"""
-    d = set()
-    for dir in sys.path:
-        try:
-            if os.path.isdir(dir):
-                dir, dircase = makepath(dir)
-                d.add(dircase)
-        except TypeError:
-            continue
-    return d
-
-def addpackage(sitedir, name, known_paths, exclude_packages=()):
-    """Add a new path to known_paths by combining sitedir and 'name' or execute
-    sitedir if it starts with 'import'"""
-    import fnmatch
-    if known_paths is None:
-        _init_pathinfo()
-        reset = 1
-    else:
-        reset = 0
-    fullname = os.path.join(sitedir, name)
-    try:
-        f = open(fullname, "rU")
-    except IOError:
-        return
-    try:
-        for line in f:
-            if line.startswith("#"):
-                continue
-            found_exclude = False
-            for exclude in exclude_packages:
-                if exclude(line):
-                    found_exclude = True
-                    break
-            if found_exclude:
-                continue
-            if line.startswith("import"):
-                exec line
-                continue
-            line = line.rstrip()
-            dir, dircase = makepath(sitedir, line)
-            if not dircase in known_paths and os.path.exists(dir):
-                sys.path.append(dir)
-                known_paths.add(dircase)
-    finally:
-        f.close()
-    if reset:
-        known_paths = None
-    return known_paths
-
-def addsitedir(sitedir, known_paths=None, exclude_packages=()):
-    """Add 'sitedir' argument to sys.path if missing and handle .pth files in
-    'sitedir'"""
-    if known_paths is None:
-        known_paths = _init_pathinfo()
-        reset = 1
-    else:
-        reset = 0
-    sitedir, sitedircase = makepath(sitedir)
-    if not sitedircase in known_paths:
-        sys.path.append(sitedir)        # Add path component
-    try:
-        names = os.listdir(sitedir)
-    except os.error:
-        return
-    names.sort()
-    for name in names:
-        if name.endswith(os.extsep + "pth"):
-            addpackage(sitedir, name, known_paths,
-                       exclude_packages=exclude_packages)
-    if reset:
-        known_paths = None
-    return known_paths
-
-def addsitepackages(known_paths):
-    """Add site-packages (and possibly site-python) to sys.path"""
-    prefixes = [os.path.join(sys.prefix, "local"), sys.prefix]
-    if sys.exec_prefix != sys.prefix:
-        prefixes.append(os.path.join(sys.exec_prefix, "local"))
-    for prefix in prefixes:
-        if prefix:
-            if sys.platform in ('os2emx', 'riscos'):
-                sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
-            elif os.sep == '/':
-                sitedirs = [os.path.join(prefix,
-                                         "lib",
-                                         "python" + sys.version[:3],
-                                         "site-packages"),
-                            os.path.join(prefix, "lib", "site-python")]
-                try:
-                    # sys.getobjects only available in --with-pydebug build
-                    # pylint: disable-msg=E1101
-                    sys.getobjects
-                    sitedirs.insert(0, os.path.join(sitedirs[0], 'debug'))
-                except AttributeError:
-                    pass
-            else:
-                sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
-            if sys.platform == 'darwin':
-                sitedirs.append( os.path.join('/opt/local', 'lib', 'python' + sys.version[:3], 'site-packages') )
-                # for framework builds *only* we add the standard Apple
-                # locations. Currently only per-user, but /Library and
-                # /Network/Library could be added too
-                if 'Python.framework' in prefix:
-                    home = os.environ.get('HOME')
-                    if home:
-                        sitedirs.append(
-                            os.path.join(home,
-                                         'Library',
-                                         'Python',
-                                         sys.version[:3],
-                                         'site-packages'))
-            for sitedir in sitedirs:
-                if os.path.isdir(sitedir):
-                    addsitedir(sitedir, known_paths,
-                               exclude_packages=[lambda line: 'setuptools' in line])
-    return None
-
-def setquit():
-    """Define new built-ins 'quit' and 'exit'.
-    These are simply strings that display a hint on how to exit.
-
-    """
-    if os.sep == ':':
-        exit = 'Use Cmd-Q to quit.'
-    elif os.sep == '\\':
-        exit = 'Use Ctrl-Z plus Return to exit.'
-    else:
-        exit = 'Use Ctrl-D (i.e. EOF) to exit.'
-    __builtin__.quit = __builtin__.exit = exit
-
-
-class _Printer(object):
-    """interactive prompt objects for printing the license text, a list of
-    contributors and the copyright notice."""
-
-    MAXLINES = 23
-
-    def __init__(self, name, data, files=(), dirs=()):
-        self.__name = name
-        self.__data = data
-        self.__files = files
-        self.__dirs = dirs
-        self.__lines = None
-
-    def __setup(self):
-        if self.__lines:
-            return
-        data = None
-        for dir in self.__dirs:
-            for filename in self.__files:
-                filename = os.path.join(dir, filename)
-                try:
-                    fp = file(filename, "rU")
-                    data = fp.read()
-                    fp.close()
-                    break
-                except IOError:
-                    pass
-            if data:
-                break
-        if not data:
-            data = self.__data
-        self.__lines = data.split('\n')
-        self.__linecnt = len(self.__lines)
-
-    def __repr__(self):
-        self.__setup()
-        if len(self.__lines) <= self.MAXLINES:
-            return "\n".join(self.__lines)
-        else:
-            return "Type %s() to see the full %s text" % ((self.__name,)*2)
-
-    def __call__(self):
-        self.__setup()
-        prompt = 'Hit Return for more, or q (and Return) to quit: '
-        lineno = 0
-        while 1:
-            try:
-                for i in range(lineno, lineno + self.MAXLINES):
-                    print self.__lines[i]
-            except IndexError:
-                break
-            else:
-                lineno += self.MAXLINES
-                key = None
-                while key is None:
-                    key = raw_input(prompt)
-                    if key not in ('', 'q'):
-                        key = None
-                if key == 'q':
-                    break
-
-def setcopyright():
-    """Set 'copyright' and 'credits' in __builtin__"""
-    __builtin__.copyright = _Printer("copyright", sys.copyright)
-    if sys.platform[:4] == 'java':
-        __builtin__.credits = _Printer(
-            "credits",
-            "Jython is maintained by the Jython developers (www.jython.org).")
-    else:
-        __builtin__.credits = _Printer("credits", """\
-    Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
-    for supporting Python development.  See www.python.org for more information.""")
-    here = os.path.dirname(os.__file__)
-    __builtin__.license = _Printer(
-        "license", "See http://www.python.org/%.3s/license.html" % sys.version,
-        ["LICENSE.txt", "LICENSE"],
-        [os.path.join(here, os.pardir), here, os.curdir])
-
-
-class _Helper(object):
-    """Define the built-in 'help'.
-    This is a wrapper around pydoc.help (with a twist).
-
-    """
-
-    def __repr__(self):
-        return "Type help() for interactive help, " \
-               "or help(object) for help about object."
-    def __call__(self, *args, **kwds):
-        import pydoc
-        return pydoc.help(*args, **kwds)
-
-def sethelper():
-    __builtin__.help = _Helper()
-
-def aliasmbcs():
-    """On Windows, some default encodings are not provided by Python,
-    while they are always available as "mbcs" in each locale. Make
-    them usable by aliasing to "mbcs" in such a case."""
-    if sys.platform == 'win32':
-        import locale, codecs
-        enc = locale.getdefaultlocale()[1]
-        if enc.startswith('cp'):            # "cp***" ?
-            try:
-                codecs.lookup(enc)
-            except LookupError:
-                import encodings
-                encodings._cache[enc] = encodings._unknown
-                encodings.aliases.aliases[enc] = 'mbcs'
-
-def setencoding():
-    """Set the string encoding used by the Unicode implementation.  The
-    default is 'ascii', but if you're willing to experiment, you can
-    change this."""
-    encoding = "ascii" # Default value set by _PyUnicode_Init()
-    if 0:
-        # Enable to support locale aware default string encodings.
-        import locale
-        loc = locale.getdefaultlocale()
-        if loc[1]:
-            encoding = loc[1]
-    if 0:
-        # Enable to switch off string to Unicode coercion and implicit
-        # Unicode to string conversion.
-        encoding = "undefined"
-    if encoding != "ascii":
-        # On Non-Unicode builds this will raise an AttributeError...
-        sys.setdefaultencoding(encoding) # Needs Python Unicode build !
-
-
-def execsitecustomize():
-    """Run custom site specific code, if available."""
-    try:
-        import sitecustomize
-    except ImportError:
-        pass
-
-def fixup_setuptools():
-    """Make sure our setuptools monkeypatch is in place"""
-    for i in range(len(sys.path)):
-        if sys.path[i].find('setuptools') != -1:
-            path = sys.path[i]
-            del sys.path[i]
-            sys.path.append(path)
-
-def main():
-    abs__file__()
-    paths_in_sys = removeduppaths()
-    if include_site_packages:
-        paths_in_sys = addsitepackages(paths_in_sys)
-    setquit()
-    setcopyright()
-    sethelper()
-    aliasmbcs()
-    setencoding()
-    execsitecustomize()
-    # Remove sys.setdefaultencoding() so that users cannot change the
-    # encoding after initialization.  The test for presence is needed when
-    # this module is run as a script, because this code is executed twice.
-    if hasattr(sys, "setdefaultencoding"):
-        del sys.setdefaultencoding
-    __boot()
-    fixup_setuptools()
-    
-
-
-include_site_packages = False
-
-
-
-main()
Binary file buildframework/helium/external/python/lib/2.5/mocker-0.10.1-py2.5.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/nose-0.10.4-py2.5.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/path-2.2-py2.5.egg has changed
--- a/buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/EGG-INFO/PKG-INFO	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-Metadata-Version: 1.0
-Name: psyco
-Version: 1.6
-Summary: Psyco, the Python specializing compiler
-Home-page: http://psyco.sourceforge.net/
-Author: Armin Rigo
-Author-email: arigo@users.sourceforge.net
-License: MIT License
-Description: Psyco shows that it is possible to execute Python code at speeds
-        approaching that of fully compiled languages, by "specialization".
-        This extension module for the unmodified interpreter accelerates
-        user programs with little or not change in their sources, by a
-        factor that can be very interesting (2-10 times is common).
-Platform: i386
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: C
-Classifier: Topic :: Software Development :: Compilers
-Classifier: Topic :: Software Development :: Interpreters
--- a/buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-###########################################################################
-# 
-#  Psyco top-level file of the Psyco package.
-#   Copyright (C) 2001-2002  Armin Rigo et.al.
-
-"""Psyco -- the Python Specializing Compiler.
-
-Typical usage: add the following lines to your application's main module,
-preferably after the other imports:
-
-try:
-    import psyco
-    psyco.full()
-except ImportError:
-    print 'Psyco not installed, the program will just run slower'
-"""
-###########################################################################
-
-
-#
-# This module is present to make 'psyco' a package and to
-# publish the main functions and variables.
-#
-# More documentation can be found in core.py.
-#
-
-
-# Try to import the dynamic-loading _psyco and report errors
-try:
-    import _psyco
-except ImportError, e:
-    extramsg = ''
-    import sys, imp
-    try:
-        file, filename, (suffix, mode, type) = imp.find_module('_psyco', __path__)
-    except ImportError:
-        ext = [suffix for suffix, mode, type in imp.get_suffixes()
-               if type == imp.C_EXTENSION]
-        if ext:
-            extramsg = (" (cannot locate the compiled extension '_psyco%s' "
-                        "in the package path '%s')" % (ext[0], '; '.join(__path__)))
-    else:
-        extramsg = (" (check that the compiled extension '%s' is for "
-                    "the correct Python version; this is Python %s)" %
-                    (filename, sys.version.split()[0]))
-    raise ImportError, str(e) + extramsg
-
-# Publish important data by importing them in the package
-from support import __version__, error, warning, _getrealframe, _getemulframe
-from support import version_info, __version__ as hexversion
-from core import full, profile, background, runonly, stop, cannotcompile
-from core import log, bind, unbind, proxy, unproxy, dumpcodebuf
-from _psyco import setfilter
-from _psyco import compact, compacttype
Binary file buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/_psyco.pyd has changed
--- a/buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/classes.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-###########################################################################
-# 
-#  Psyco class support module.
-#   Copyright (C) 2001-2002  Armin Rigo et.al.
-
-"""Psyco class support module.
-
-'psyco.classes.psyobj' is an alternate Psyco-optimized root for classes.
-Any class inheriting from it or using the metaclass '__metaclass__' might
-get optimized specifically for Psyco. It is equivalent to call
-psyco.bind() on the class object after its creation.
-
-Importing everything from psyco.classes in a module will import the
-'__metaclass__' name, so all classes defined after a
-
-       from psyco.classes import *
-
-will automatically use the Psyco-optimized metaclass.
-"""
-###########################################################################
-
-__all__ = ['psyobj', 'psymetaclass', '__metaclass__']
-
-
-from _psyco import compacttype
-import core
-from types import FunctionType
-
-class psymetaclass(compacttype):
-    "Psyco-optimized meta-class. Turns all methods into Psyco proxies."
-
-    def __new__(cls, name, bases, dict):
-        bindlist = dict.get('__psyco__bind__')
-        if bindlist is None:
-            bindlist = [key for key, value in dict.items()
-                        if isinstance(value, FunctionType)]
-        for attr in bindlist:
-            dict[attr] = core.proxy(dict[attr])
-        return super(psymetaclass, cls).__new__(cls, name, bases, dict)
-
-psyobj = psymetaclass("psyobj", (), {})
-__metaclass__ = psymetaclass
--- a/buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/core.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,228 +0,0 @@
-###########################################################################
-# 
-#  Psyco main functions.
-#   Copyright (C) 2001-2002  Armin Rigo et.al.
-
-"""Psyco main functions.
-
-Here are the routines that you can use from your applications.
-These are mostly interfaces to the C core, but they depend on
-the Python version.
-
-You can use these functions from the 'psyco' module instead of
-'psyco.core', e.g.
-
-    import psyco
-    psyco.log('/tmp/psyco.log')
-    psyco.profile()
-"""
-###########################################################################
-
-import _psyco
-import types, new
-from support import *
-
-
-# Default charge profiler values
-default_watermark     = 0.09     # between 0.0 (0%) and 1.0 (100%)
-default_halflife      = 0.5      # seconds
-default_pollfreq_profile    = 20       # Hz
-default_pollfreq_background = 100      # Hz -- a maximum for sleep's resolution
-default_parentframe   = 0.25     # should not be more than 0.5 (50%)
-
-
-def full(memory=None, time=None, memorymax=None, timemax=None):
-    """Compile as much as possible.
-
-Typical use is for small scripts performing intensive computations
-or string handling."""
-    import profiler
-    p = profiler.FullCompiler()
-    p.run(memory, time, memorymax, timemax)
-
-
-def profile(watermark   = default_watermark,
-            halflife    = default_halflife,
-            pollfreq    = default_pollfreq_profile,
-            parentframe = default_parentframe,
-            memory=None, time=None, memorymax=None, timemax=None):
-    """Turn on profiling.
-
-The 'watermark' parameter controls how easily running functions will
-be compiled. The smaller the value, the more functions are compiled."""
-    import profiler
-    p = profiler.ActivePassiveProfiler(watermark, halflife,
-                                       pollfreq, parentframe)
-    p.run(memory, time, memorymax, timemax)
-
-
-def background(watermark   = default_watermark,
-               halflife    = default_halflife,
-               pollfreq    = default_pollfreq_background,
-               parentframe = default_parentframe,
-               memory=None, time=None, memorymax=None, timemax=None):
-    """Turn on passive profiling.
-
-This is a very lightweight mode in which only intensively computing
-functions can be detected. The smaller the 'watermark', the more functions
-are compiled."""
-    import profiler
-    p = profiler.PassiveProfiler(watermark, halflife, pollfreq, parentframe)
-    p.run(memory, time, memorymax, timemax)
-
-
-def runonly(memory=None, time=None, memorymax=None, timemax=None):
-    """Nonprofiler.
-
-XXX check if this is useful and document."""
-    import profiler
-    p = profiler.RunOnly()
-    p.run(memory, time, memorymax, timemax)
-
-
-def stop():
-    """Turn off all automatic compilation.  bind() calls remain in effect."""
-    import profiler
-    profiler.go([])
-
-
-def log(logfile='', mode='w', top=10):
-    """Enable logging to the given file.
-
-If the file name is unspecified, a default name is built by appending
-a 'log-psyco' extension to the main script name.
-
-Mode is 'a' to append to a possibly existing file or 'w' to overwrite
-an existing file. Note that the log file may grow quickly in 'a' mode."""
-    import profiler, logger
-    if not logfile:
-        import os
-        logfile, dummy = os.path.splitext(sys.argv[0])
-        if os.path.basename(logfile):
-            logfile += '.'
-        logfile += 'log-psyco'
-    if hasattr(_psyco, 'VERBOSE_LEVEL'):
-        print >> sys.stderr, 'psyco: logging to', logfile
-    # logger.current should be a real file object; subtle problems
-    # will show up if its write() and flush() methods are written
-    # in Python, as Psyco will invoke them while compiling.
-    logger.current = open(logfile, mode)
-    logger.print_charges = top
-    profiler.logger = logger
-    logger.writedate('Logging started')
-    cannotcompile(logger.psycowrite)
-    _psyco.statwrite(logger=logger.psycowrite)
-
-
-def bind(x, rec=None):
-    """Enable compilation of the given function, method, or class object.
-
-If C is a class (or anything with a '__dict__' attribute), bind(C) will
-rebind all functions and methods found in C.__dict__ (which means, for
-classes, all methods defined in the class but not in its parents).
-
-The optional second argument specifies the number of recursive
-compilation levels: all functions called by func are compiled
-up to the given depth of indirection."""
-    if isinstance(x, types.MethodType):
-        x = x.im_func
-    if isinstance(x, types.FunctionType):
-        if rec is None:
-            x.func_code = _psyco.proxycode(x)
-        else:
-            x.func_code = _psyco.proxycode(x, rec)
-        return
-    if hasattr(x, '__dict__'):
-        funcs = [o for o in x.__dict__.values()
-                 if isinstance(o, types.MethodType)
-                 or isinstance(o, types.FunctionType)]
-        if not funcs:
-            raise error, ("nothing bindable found in %s object" %
-                          type(x).__name__)
-        for o in funcs:
-            bind(o, rec)
-        return
-    raise TypeError, "cannot bind %s objects" % type(x).__name__
-
-
-def unbind(x):
-    """Reverse of bind()."""
-    if isinstance(x, types.MethodType):
-        x = x.im_func
-    if isinstance(x, types.FunctionType):
-        try:
-            f = _psyco.unproxycode(x.func_code)
-        except error:
-            pass
-        else:
-            x.func_code = f.func_code
-        return
-    if hasattr(x, '__dict__'):
-        for o in x.__dict__.values():
-            if (isinstance(o, types.MethodType)
-             or isinstance(o, types.FunctionType)):
-                unbind(o)
-        return
-    raise TypeError, "cannot unbind %s objects" % type(x).__name__
-
-
-def proxy(x, rec=None):
-    """Return a Psyco-enabled copy of the function.
-
-The original function is still available for non-compiled calls.
-The optional second argument specifies the number of recursive
-compilation levels: all functions called by func are compiled
-up to the given depth of indirection."""
-    if isinstance(x, types.FunctionType):
-        if rec is None:
-            code = _psyco.proxycode(x)
-        else:
-            code = _psyco.proxycode(x, rec)
-        return new.function(code, x.func_globals, x.func_name)
-    if isinstance(x, types.MethodType):
-        p = proxy(x.im_func, rec)
-        return new.instancemethod(p, x.im_self, x.im_class)
-    raise TypeError, "cannot proxy %s objects" % type(x).__name__
-
-
-def unproxy(proxy):
-    """Return a new copy of the original function of method behind a proxy.
-The result behaves like the original function in that calling it
-does not trigger compilation nor execution of any compiled code."""
-    if isinstance(proxy, types.FunctionType):
-        return _psyco.unproxycode(proxy.func_code)
-    if isinstance(proxy, types.MethodType):
-        f = unproxy(proxy.im_func)
-        return new.instancemethod(f, proxy.im_self, proxy.im_class)
-    raise TypeError, "%s objects cannot be proxies" % type(proxy).__name__
-
-
-def cannotcompile(x):
-    """Instruct Psyco never to compile the given function, method
-or code object."""
-    if isinstance(x, types.MethodType):
-        x = x.im_func
-    if isinstance(x, types.FunctionType):
-        x = x.func_code
-    if isinstance(x, types.CodeType):
-        _psyco.cannotcompile(x)
-    else:
-        raise TypeError, "unexpected %s object" % type(x).__name__
-
-
-def dumpcodebuf():
-    """Write in file psyco.dump a copy of the emitted machine code,
-provided Psyco was compiled with a non-zero CODE_DUMP.
-See py-utils/httpxam.py to examine psyco.dump."""
-    if hasattr(_psyco, 'dumpcodebuf'):
-        _psyco.dumpcodebuf()
-
-
-###########################################################################
-# Psyco variables
-#   error         * the error raised by Psyco
-#   warning       * the warning raised by Psyco
-#   __in_psyco__  * a new built-in variable which is always zero, but which
-#                     Psyco special-cases by returning 1 instead. So
-#                     __in_psyco__ can be used in a function to know if
-#                     that function is being executed by Psyco or not.
--- a/buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/kdictproxy.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,133 +0,0 @@
-###########################################################################
-#
-#  Support code for the 'psyco.compact' type.
-
-from __future__ import generators
-
-try:
-    from UserDict import DictMixin
-except ImportError:
-
-    # backported from Python 2.3 to Python 2.2
-    class DictMixin:
-        # Mixin defining all dictionary methods for classes that already have
-        # a minimum dictionary interface including getitem, setitem, delitem,
-        # and keys. Without knowledge of the subclass constructor, the mixin
-        # does not define __init__() or copy().  In addition to the four base
-        # methods, progressively more efficiency comes with defining
-        # __contains__(), __iter__(), and iteritems().
-
-        # second level definitions support higher levels
-        def __iter__(self):
-            for k in self.keys():
-                yield k
-        def has_key(self, key):
-            try:
-                value = self[key]
-            except KeyError:
-                return False
-            return True
-        def __contains__(self, key):
-            return self.has_key(key)
-
-        # third level takes advantage of second level definitions
-        def iteritems(self):
-            for k in self:
-                yield (k, self[k])
-        def iterkeys(self):
-            return self.__iter__()
-
-        # fourth level uses definitions from lower levels
-        def itervalues(self):
-            for _, v in self.iteritems():
-                yield v
-        def values(self):
-            return [v for _, v in self.iteritems()]
-        def items(self):
-            return list(self.iteritems())
-        def clear(self):
-            for key in self.keys():
-                del self[key]
-        def setdefault(self, key, default):
-            try:
-                return self[key]
-            except KeyError:
-                self[key] = default
-            return default
-        def pop(self, key, *args):
-            if len(args) > 1:
-                raise TypeError, "pop expected at most 2 arguments, got "\
-                                  + repr(1 + len(args))
-            try:
-                value = self[key]
-            except KeyError:
-                if args:
-                    return args[0]
-                raise
-            del self[key]
-            return value
-        def popitem(self):
-            try:
-                k, v = self.iteritems().next()
-            except StopIteration:
-                raise KeyError, 'container is empty'
-            del self[k]
-            return (k, v)
-        def update(self, other):
-            # Make progressively weaker assumptions about "other"
-            if hasattr(other, 'iteritems'):  # iteritems saves memory and lookups
-                for k, v in other.iteritems():
-                    self[k] = v
-            elif hasattr(other, '__iter__'): # iter saves memory
-                for k in other:
-                    self[k] = other[k]
-            else:
-                for k in other.keys():
-                    self[k] = other[k]
-        def get(self, key, default=None):
-            try:
-                return self[key]
-            except KeyError:
-                return default
-        def __repr__(self):
-            return repr(dict(self.iteritems()))
-        def __cmp__(self, other):
-            if other is None:
-                return 1
-            if isinstance(other, DictMixin):
-                other = dict(other.iteritems())
-            return cmp(dict(self.iteritems()), other)
-        def __len__(self):
-            return len(self.keys())
-
-###########################################################################
-
-from _psyco import compact
-
-
-class compactdictproxy(DictMixin):
-
-    def __init__(self, ko):
-        self._ko = ko    # compact object of which 'self' is the dict
-
-    def __getitem__(self, key):
-        return compact.__getslot__(self._ko, key)
-
-    def __setitem__(self, key, value):
-        compact.__setslot__(self._ko, key, value)
-
-    def __delitem__(self, key):
-        compact.__delslot__(self._ko, key)
-
-    def keys(self):
-        return compact.__members__.__get__(self._ko)
-
-    def clear(self):
-        keys = self.keys()
-        keys.reverse()
-        for key in keys:
-            del self[key]
-
-    def __repr__(self):
-        keys = ', '.join(self.keys())
-        return '<compactdictproxy object {%s}>' % (keys,)
--- a/buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/logger.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-###########################################################################
-# 
-#  Psyco logger.
-#   Copyright (C) 2001-2002  Armin Rigo et.al.
-
-"""Psyco logger.
-
-See log() in core.py.
-"""
-###########################################################################
-
-
-import _psyco
-from time import time, localtime, strftime
-
-
-current = None
-print_charges = 10
-dump_delay = 0.2
-dump_last = 0.0
-
-def write(s, level):
-    t = time()
-    f = t-int(t)
-    try:
-        current.write("%s.%02d  %-*s%s\n" % (
-            strftime("%X", localtime(int(t))),
-            int(f*100.0), 63-level, s,
-            "%"*level))
-        current.flush()
-    except (OSError, IOError):
-        pass
-
-def psycowrite(s):
-    t = time()
-    f = t-int(t)
-    try:
-        current.write("%s.%02d  %-*s%s\n" % (
-            strftime("%X", localtime(int(t))),
-            int(f*100.0), 60, s.strip(),
-            "% %"))
-        current.flush()
-    except (OSError, IOError):
-        pass
-
-##def writelines(lines, level=0):
-##    if lines:
-##        t = time()
-##        f = t-int(t)
-##        timedesc = strftime("%x %X", localtime(int(t)))
-##        print >> current, "%s.%03d  %-*s %s" % (
-##            timedesc, int(f*1000),
-##            50-level, lines[0],
-##            "+"*level)
-##        timedesc = " " * (len(timedesc)+5)
-##        for line in lines[1:]:
-##            print >> current, timedesc, line
-
-def writememory():
-    write("memory usage: %d+ kb" % _psyco.memory(), 1)
-
-def dumpcharges():
-    global dump_last
-    if print_charges:
-        t = time()
-        if not (dump_last <= t < dump_last+dump_delay):
-            if t <= dump_last+1.5*dump_delay:
-                dump_last += dump_delay
-            else:
-                dump_last = t
-            #write("%s: charges:" % who, 0)
-            lst = _psyco.stattop(print_charges)
-            if lst:
-                f = t-int(t)
-                lines = ["%s.%02d   ______\n" % (
-                    strftime("%X", localtime(int(t))),
-                    int(f*100.0))]
-                i = 1
-                for co, charge in lst:
-                    detail = co.co_filename
-                    if len(detail) > 19:
-                        detail = '...' + detail[-17:]
-                    lines.append("        #%-3d |%4.1f %%|  %-26s%20s:%d\n" %
-                                 (i, charge*100.0, co.co_name, detail,
-                                  co.co_firstlineno))
-                    i += 1
-                current.writelines(lines)
-                current.flush()
-
-def writefinalstats():
-    dumpcharges()
-    writememory()
-    writedate("program exit")
-
-def writedate(msg):
-    write('%s, %s' % (msg, strftime("%x")), 20)
--- a/buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/profiler.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,379 +0,0 @@
-###########################################################################
-# 
-#  Psyco profiler (Python part).
-#   Copyright (C) 2001-2002  Armin Rigo et.al.
-
-"""Psyco profiler (Python part).
-
-The implementation of the non-time-critical parts of the profiler.
-See profile() and full() in core.py for the easy interface.
-"""
-###########################################################################
-
-import _psyco
-from support import *
-import math, time, types, atexit
-now = time.time
-try:
-    import thread
-except ImportError:
-    import dummy_thread as thread
-
-
-# current profiler instance
-current = None
-
-# enabled profilers, in order of priority
-profilers = []
-
-# logger module (when enabled by core.log())
-logger = None
-
-# a lock for a thread-safe go()
-go_lock = thread.allocate_lock()
-
-def go(stop=0):
-    # run the highest-priority profiler in 'profilers'
-    global current
-    go_lock.acquire()
-    try:
-        prev = current
-        if stop:
-            del profilers[:]
-        if prev:
-            if profilers and profilers[0] is prev:
-                return    # best profiler already running
-            prev.stop()
-            current = None
-        for p in profilers[:]:
-            if p.start():
-                current = p
-                if logger: # and p is not prev:
-                    logger.write("%s: starting" % p.__class__.__name__, 5)
-                return
-    finally:
-        go_lock.release()
-    # no profiler is running now
-    if stop:
-        if logger:
-            logger.writefinalstats()
-    else:
-        tag2bind()
-
-atexit.register(go, 1)
-
-
-def buildfncache(globals, cache):
-    if hasattr(types.IntType, '__dict__'):
-        clstypes = (types.ClassType, types.TypeType)
-    else:
-        clstypes = types.ClassType
-    for x in globals.values():
-        if isinstance(x, types.MethodType):
-            x = x.im_func
-        if isinstance(x, types.FunctionType):
-            cache[x.func_code] = x, ''
-        elif isinstance(x, clstypes):
-            for y in x.__dict__.values():
-                if isinstance(y, types.MethodType):
-                    y = y.im_func
-                if isinstance(y, types.FunctionType):
-                    cache[y.func_code] = y, x.__name__
-
-# code-to-function mapping (cache)
-function_cache = {}
-
-def trytobind(co, globals, log=1):
-    try:
-        f, clsname = function_cache[co]
-    except KeyError:
-        buildfncache(globals, function_cache)
-        try:
-            f, clsname = function_cache[co]
-        except KeyError:
-            if logger:
-                logger.write('warning: cannot find function %s in %s' %
-                             (co.co_name, globals.get('__name__', '?')), 3)
-            return  # give up
-    if logger and log:
-        modulename = globals.get('__name__', '?')
-        if clsname:
-            modulename += '.' + clsname
-        logger.write('bind function: %s.%s' % (modulename, co.co_name), 1)
-    f.func_code = _psyco.proxycode(f)
-
-
-# the list of code objects that have been tagged
-tagged_codes = []
-
-def tag(co, globals):
-    if logger:
-        try:
-            f, clsname = function_cache[co]
-        except KeyError:
-            buildfncache(globals, function_cache)
-            try:
-                f, clsname = function_cache[co]
-            except KeyError:
-                clsname = ''  # give up
-        modulename = globals.get('__name__', '?')
-        if clsname:
-            modulename += '.' + clsname
-        logger.write('tag function: %s.%s' % (modulename, co.co_name), 1)
-    tagged_codes.append((co, globals))
-    _psyco.turbo_frame(co)
-    _psyco.turbo_code(co)
-
-def tag2bind():
-    if tagged_codes:
-        if logger:
-            logger.write('profiling stopped, binding %d functions' %
-                         len(tagged_codes), 2)
-        for co, globals in tagged_codes:
-            trytobind(co, globals, 0)
-        function_cache.clear()
-        del tagged_codes[:]
-
-
-class Profiler:
-    MemoryTimerResolution = 0.103
-
-    def run(self, memory, time, memorymax, timemax):
-        self.memory = memory
-        self.memorymax = memorymax
-        self.time = time
-        if timemax is None:
-            self.endtime = None
-        else:
-            self.endtime = now() + timemax
-        self.alarms = []
-        profilers.append(self)
-        go()
-    
-    def start(self):
-        curmem = _psyco.memory()
-        memlimits = []
-        if self.memorymax is not None:
-            if curmem >= self.memorymax:
-                if logger:
-                    logger.writememory()
-                return self.limitreached('memorymax')
-            memlimits.append(self.memorymax)
-        if self.memory is not None:
-            if self.memory <= 0:
-                if logger:
-                    logger.writememory()
-                return self.limitreached('memory')
-            memlimits.append(curmem + self.memory)
-            self.memory_at_start = curmem
-
-        curtime = now()
-        timelimits = []
-        if self.endtime is not None:
-            if curtime >= self.endtime:
-                return self.limitreached('timemax')
-            timelimits.append(self.endtime - curtime)
-        if self.time is not None:
-            if self.time <= 0.0:
-                return self.limitreached('time')
-            timelimits.append(self.time)
-            self.time_at_start = curtime
-        
-        try:
-            self.do_start()
-        except error, e:
-            if logger:
-                logger.write('%s: disabled by psyco.error:' % (
-                    self.__class__.__name__), 4)
-                logger.write('    %s' % str(e), 3)
-            return 0
-        
-        if memlimits:
-            self.memlimits_args = (time.sleep, (self.MemoryTimerResolution,),
-                                   self.check_memory, (min(memlimits),))
-            self.alarms.append(_psyco.alarm(*self.memlimits_args))
-        if timelimits:
-            self.alarms.append(_psyco.alarm(time.sleep, (min(timelimits),),
-                                            self.time_out))
-        return 1
-    
-    def stop(self):
-        for alarm in self.alarms:
-            alarm.stop(0)
-        for alarm in self.alarms:
-            alarm.stop(1)   # wait for parallel threads to stop
-        del self.alarms[:]
-        if self.time is not None:
-            self.time -= now() - self.time_at_start
-        if self.memory is not None:
-            self.memory -= _psyco.memory() - self.memory_at_start
-
-        try:
-            self.do_stop()
-        except error:
-            return 0
-        return 1
-
-    def check_memory(self, limit):
-        if _psyco.memory() < limit:
-            return self.memlimits_args
-        go()
-
-    def time_out(self):
-        self.time = 0.0
-        go()
-
-    def limitreached(self, limitname):
-        try:
-            profilers.remove(self)
-        except ValueError:
-            pass
-        if logger:
-            logger.write('%s: disabled (%s limit reached)' % (
-                self.__class__.__name__, limitname), 4)
-        return 0
-
-
-class FullCompiler(Profiler):
-
-    def do_start(self):
-        _psyco.profiling('f')
-
-    def do_stop(self):
-        _psyco.profiling('.')
-
-
-class RunOnly(Profiler):
-
-    def do_start(self):
-        _psyco.profiling('n')
-
-    def do_stop(self):
-        _psyco.profiling('.')
-
-
-class ChargeProfiler(Profiler):
-
-    def __init__(self, watermark, parentframe):
-        self.watermark = watermark
-        self.parent2 = parentframe * 2.0
-        self.lock = thread.allocate_lock()
-
-    def init_charges(self):
-        _psyco.statwrite(watermark = self.watermark,
-                         parent2   = self.parent2)
-
-    def do_stop(self):
-        _psyco.profiling('.')
-        _psyco.statwrite(callback = None)
-
-
-class ActiveProfiler(ChargeProfiler):
-
-    def active_start(self):
-        _psyco.profiling('p')
-
-    def do_start(self):
-        self.init_charges()
-        self.active_start()
-        _psyco.statwrite(callback = self.charge_callback)
-
-    def charge_callback(self, frame, charge):
-        tag(frame.f_code, frame.f_globals)
-
-
-class PassiveProfiler(ChargeProfiler):
-
-    initial_charge_unit   = _psyco.statread('unit')
-    reset_stats_after     = 120      # half-lives (maximum 200!)
-    reset_limit           = initial_charge_unit * (2.0 ** reset_stats_after)
-
-    def __init__(self, watermark, halflife, pollfreq, parentframe):
-        ChargeProfiler.__init__(self, watermark, parentframe)
-        self.pollfreq = pollfreq
-        # self.progress is slightly more than 1.0, and computed so that
-        # do_profile() will double the change_unit every 'halflife' seconds.
-        self.progress = 2.0 ** (1.0 / (halflife * pollfreq))
-
-    def reset(self):
-        _psyco.statwrite(unit = self.initial_charge_unit, callback = None)
-        _psyco.statreset()
-        if logger:
-            logger.write("%s: resetting stats" % self.__class__.__name__, 1)
-
-    def passive_start(self):
-        self.passivealarm_args = (time.sleep, (1.0 / self.pollfreq,),
-                                  self.do_profile)
-        self.alarms.append(_psyco.alarm(*self.passivealarm_args))
-
-    def do_start(self):
-        tag2bind()
-        self.init_charges()
-        self.passive_start()
-
-    def do_profile(self):
-        _psyco.statcollect()
-        if logger:
-            logger.dumpcharges()
-        nunit = _psyco.statread('unit') * self.progress
-        if nunit > self.reset_limit:
-            self.reset()
-        else:
-            _psyco.statwrite(unit = nunit, callback = self.charge_callback)
-        return self.passivealarm_args
-
-    def charge_callback(self, frame, charge):
-        trytobind(frame.f_code, frame.f_globals)
-
-
-class ActivePassiveProfiler(PassiveProfiler, ActiveProfiler):
-
-    def do_start(self):
-        self.init_charges()
-        self.active_start()
-        self.passive_start()
-
-    def charge_callback(self, frame, charge):
-        tag(frame.f_code, frame.f_globals)
-
-
-
-#
-# we register our own version of sys.settrace(), sys.setprofile()
-# and thread.start_new_thread().
-#
-
-def psyco_settrace(*args, **kw):
-    "This is the Psyco-aware version of sys.settrace()."
-    result = original_settrace(*args, **kw)
-    go()
-    return result
-
-def psyco_setprofile(*args, **kw):
-    "This is the Psyco-aware version of sys.setprofile()."
-    result = original_setprofile(*args, **kw)
-    go()
-    return result
-
-def psyco_thread_stub(callable, args, kw):
-    _psyco.statcollect()
-    if kw is None:
-        return callable(*args)
-    else:
-        return callable(*args, **kw)
-
-def psyco_start_new_thread(callable, args, kw=None):
-    "This is the Psyco-aware version of thread.start_new_thread()."
-    return original_start_new_thread(psyco_thread_stub, (callable, args, kw))
-
-original_settrace         = sys.settrace
-original_setprofile       = sys.setprofile
-original_start_new_thread = thread.start_new_thread
-sys.settrace            = psyco_settrace
-sys.setprofile          = psyco_setprofile
-thread.start_new_thread = psyco_start_new_thread
-# hack to patch threading._start_new_thread if the module is
-# already loaded
-if (sys.modules.has_key('threading') and
-    hasattr(sys.modules['threading'], '_start_new_thread')):
-    sys.modules['threading']._start_new_thread = psyco_start_new_thread
--- a/buildframework/helium/external/python/lib/2.5/psyco-1.6-py2.5.egg/psyco/support.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,191 +0,0 @@
-###########################################################################
-# 
-#  Psyco general support module.
-#   Copyright (C) 2001-2002  Armin Rigo et.al.
-
-"""Psyco general support module.
-
-For internal use.
-"""
-###########################################################################
-
-import sys, _psyco, __builtin__
-
-error = _psyco.error
-class warning(Warning):
-    pass
-
-_psyco.NoLocalsWarning = warning
-
-def warn(msg):
-    from warnings import warn
-    warn(msg, warning, stacklevel=2)
-
-#
-# Version checks
-#
-__version__ = 0x010600f0
-if _psyco.PSYVER != __version__:
-    raise error, "version mismatch between Psyco parts, reinstall it"
-
-version_info = (__version__ >> 24,
-                (__version__ >> 16) & 0xff,
-                (__version__ >> 8) & 0xff,
-                {0xa0: 'alpha',
-                 0xb0: 'beta',
-                 0xc0: 'candidate',
-                 0xf0: 'final'}[__version__ & 0xf0],
-                __version__ & 0xf)
-
-
-VERSION_LIMITS = [0x02020200,   # 2.2.2
-                  0x02030000,   # 2.3
-                  0x02040000]   # 2.4
-
-if ([v for v in VERSION_LIMITS if v <= sys.hexversion] !=
-    [v for v in VERSION_LIMITS if v <= _psyco.PYVER  ]):
-    if sys.hexversion < VERSION_LIMITS[0]:
-        warn("Psyco requires Python version 2.2.2 or later")
-    else:
-        warn("Psyco version does not match Python version. "
-             "Psyco must be updated or recompiled")
-
-
-if hasattr(_psyco, 'ALL_CHECKS') and hasattr(_psyco, 'VERBOSE_LEVEL'):
-    print >> sys.stderr, ('psyco: running in debugging mode on %s' %
-                          _psyco.PROCESSOR)
-
-
-###########################################################################
-# sys._getframe() gives strange results on a mixed Psyco- and Python-style
-# stack frame. Psyco provides a replacement that partially emulates Python
-# frames from Psyco frames. The new sys._getframe() may return objects of
-# a custom "Psyco frame" type, which is a subtype of the normal frame type.
-#
-# The same problems require some other built-in functions to be replaced
-# as well. Note that the local variables are not available in any
-# dictionary with Psyco.
-
-
-class Frame:
-    pass
-
-
-class PythonFrame(Frame):
-
-    def __init__(self, frame):
-        self.__dict__.update({
-            '_frame': frame,
-            })
-
-    def __getattr__(self, attr):
-        if attr == 'f_back':
-            try:
-                result = embedframe(_psyco.getframe(self._frame))
-            except ValueError:
-                result = None
-            except error:
-                warn("f_back is skipping dead Psyco frames")
-                result = self._frame.f_back
-            self.__dict__['f_back'] = result
-            return result
-        else:
-            return getattr(self._frame, attr)
-
-    def __setattr__(self, attr, value):
-        setattr(self._frame, attr, value)
-
-    def __delattr__(self, attr):
-        delattr(self._frame, attr)
-
-
-class PsycoFrame(Frame):
-
-    def __init__(self, tag):
-        self.__dict__.update({
-            '_tag'     : tag,
-            'f_code'   : tag[0],
-            'f_globals': tag[1],
-            })
-
-    def __getattr__(self, attr):
-        if attr == 'f_back':
-            try:
-                result = embedframe(_psyco.getframe(self._tag))
-            except ValueError:
-                result = None
-        elif attr == 'f_lineno':
-            result = self.f_code.co_firstlineno  # better than nothing
-        elif attr == 'f_builtins':
-            result = self.f_globals['__builtins__']
-        elif attr == 'f_restricted':
-            result = self.f_builtins is not __builtins__
-        elif attr == 'f_locals':
-            raise AttributeError, ("local variables of functions run by Psyco "
-                                   "cannot be accessed in any way, sorry")
-        else:
-            raise AttributeError, ("emulated Psyco frames have "
-                                   "no '%s' attribute" % attr)
-        self.__dict__[attr] = result
-        return result
-
-    def __setattr__(self, attr, value):
-        raise AttributeError, "Psyco frame objects are read-only"
-
-    def __delattr__(self, attr):
-        if attr == 'f_trace':
-            # for bdb which relies on CPython frames exhibiting a slightly
-            # buggy behavior: you can 'del f.f_trace' as often as you like
-            # even without having set it previously.
-            return
-        raise AttributeError, "Psyco frame objects are read-only"
-
-
-def embedframe(result):
-    if type(result) is type(()):
-        return PsycoFrame(result)
-    else:
-        return PythonFrame(result)
-
-def _getframe(depth=0):
-    """Return a frame object from the call stack. This is a replacement for
-sys._getframe() which is aware of Psyco frames.
-
-The returned objects are instances of either PythonFrame or PsycoFrame
-instead of being real Python-level frame object, so that they can emulate
-the common attributes of frame objects.
-
-The original sys._getframe() ignoring Psyco frames altogether is stored in
-psyco._getrealframe(). See also psyco._getemulframe()."""
-    # 'depth+1' to account for this _getframe() Python function
-    return embedframe(_psyco.getframe(depth+1))
-
-def _getemulframe(depth=0):
-    """As _getframe(), but the returned objects are real Python frame objects
-emulating Psyco frames. Some of their attributes can be wrong or missing,
-however."""
-    # 'depth+1' to account for this _getemulframe() Python function
-    return _psyco.getframe(depth+1, 1)
-
-def patch(name, module=__builtin__):
-    f = getattr(_psyco, name)
-    org = getattr(module, name)
-    if org is not f:
-        setattr(module, name, f)
-        setattr(_psyco, 'original_' + name, org)
-
-_getrealframe = sys._getframe
-sys._getframe = _getframe
-patch('globals')
-patch('eval')
-patch('execfile')
-patch('locals')
-patch('vars')
-patch('dir')
-patch('input')
-_psyco.original_raw_input = raw_input
-__builtin__.__in_psyco__ = 0==1   # False
-
-if hasattr(_psyco, 'compact'):
-    import kdictproxy
-    _psyco.compactdictproxy = kdictproxy.compactdictproxy
Binary file buildframework/helium/external/python/lib/2.5/setuptools-0.6c5-py2.5.egg has changed
Binary file buildframework/helium/external/python/lib/2.5/simplejson-1.9.1-py2.5-win32.egg has changed
--- a/buildframework/helium/external/python/lib/2.5/sphinx-build.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-#!python.exe
-# EASY-INSTALL-ENTRY-SCRIPT: 'Sphinx==0.5.1','console_scripts','sphinx-build'
-__requires__ = 'Sphinx==0.5.1'
-import sys
-from pkg_resources import load_entry_point
-
-sys.exit(
-   load_entry_point('Sphinx==0.5.1', 'console_scripts', 'sphinx-build')()
-)
--- a/buildframework/helium/external/python/lib/2.5/threadpool.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,337 +0,0 @@
-
-# -*- coding: UTF-8 -*-
-"""Easy to use object-oriented thread pool framework.
-
-A thread pool is an object that maintains a pool of worker threads to perform
-time consuming operations in parallel. It assigns jobs to the threads
-by putting them in a work request queue, where they are picked up by the
-next available thread. This then performs the requested operation in the
-background and puts the results in a another queue.
-
-The thread pool object can then collect the results from all threads from
-this queue as soon as they become available or after all threads have
-finished their work. It's also possible, to define callbacks to handle
-each result as it comes in.
-
-The basic concept and some code was taken from the book "Python in a Nutshell"
-by Alex Martelli, copyright 2003, ISBN 0-596-00188-6, from section 14.5
-"Threaded Program Architecture". I wrapped the main program logic in the
-ThreadPool class, added the WorkRequest class and the callback system and
-tweaked the code here and there. Kudos also to Florent Aide for the exception
-handling mechanism.
-
-Basic usage:
-
->>> pool = TreadPool(poolsize)
->>> requests = makeRequests(some_callable, list_of_args, callback)
->>> [pool.putRequest(req) for req in requests]
->>> pool.wait()
-
-See the end of the module code for a brief, annotated usage example.
-
-Website : http://chrisarndt.de/en/software/python/threadpool/
-"""
-
-__all__ = [
-  'makeRequests',
-  'NoResultsPending',
-  'NoWorkersAvailable',
-  'ThreadPool',
-  'WorkRequest',
-  'WorkerThread'
-]
-
-__author__ = "Christopher Arndt"
-__version__ = "1.2.3"
-__revision__ = "$Revision: 1.5 $"
-__date__ = "$Date: 2006/06/23 12:32:25 $"
-__license__ = 'Python license'
-
-# standard library modules
-import sys
-import threading
-import Queue
-
-# exceptions
-class NoResultsPending(Exception):
-    """All work requests have been processed."""
-    pass
-
-class NoWorkersAvailable(Exception):
-    """No worker threads available to process remaining requests."""
-    pass
-
-# classes
-class WorkerThread(threading.Thread):
-    """Background thread connected to the requests/results queues.
-
-    A worker thread sits in the background and picks up work requests from
-    one queue and puts the results in another until it is dismissed.
-    """
-
-    def __init__(self, requestsQueue, resultsQueue, **kwds):
-        """Set up thread in daemonic mode and start it immediatedly.
-
-        requestsQueue and resultQueue are instances of Queue.Queue passed
-        by the ThreadPool class when it creates a new worker thread.
-        """
-
-        threading.Thread.__init__(self, **kwds)
-        self.setDaemon(1)
-        self.workRequestQueue = requestsQueue
-        self.resultQueue = resultsQueue
-        self._dismissed = threading.Event()
-        self.start()
-
-    def run(self):
-        """Repeatedly process the job queue until told to exit."""
-
-        while not self._dismissed.isSet():
-            # thread blocks here, if queue empty
-            request = self.workRequestQueue.get()
-            if self._dismissed.isSet():
-                # if told to exit, return the work request we just picked up
-                self.workRequestQueue.put(request)
-                break # and exit
-            try:
-                self.resultQueue.put(
-                    (request, request.callable(*request.args, **request.kwds))
-                )
-            except:
-                request.exception = True
-                self.resultQueue.put((request, sys.exc_info()))
-
-    def dismiss(self):
-        """Sets a flag to tell the thread to exit when done with current job.
-        """
-
-        self._dismissed.set()
-
-
-class WorkRequest:
-    """A request to execute a callable for putting in the request queue later.
-
-    See the module function makeRequests() for the common case
-    where you want to build several WorkRequests for the same callable
-    but with different arguments for each call.
-    """
-
-    def __init__(self, callable, args=None, kwds=None, requestID=None,
-      callback=None, exc_callback=None):
-        """Create a work request for a callable and attach callbacks.
-
-        A work request consists of the a callable to be executed by a
-        worker thread, a list of positional arguments, a dictionary
-        of keyword arguments.
-
-        A callback function can be specified, that is called when the results
-        of the request are picked up from the result queue. It must accept
-        two arguments, the request object and the results of the callable,
-        in that order. If you want to pass additional information to the
-        callback, just stick it on the request object.
-
-        You can also give a callback for when an exception occurs. It should
-        also accept two arguments, the work request and a tuple with the
-        exception details as returned by sys.exc_info().
-
-        requestID, if given, must be hashable since it is used by the
-        ThreadPool object to store the results of that work request in a
-        dictionary. It defaults to the return value of id(self).
-        """
-
-        if requestID is None:
-            self.requestID = id(self)
-        else:
-            try:
-                hash(requestID)
-            except TypeError:
-                raise TypeError("requestID must be hashable.")
-            self.requestID = requestID
-        self.exception = False
-        self.callback = callback
-        self.exc_callback = exc_callback
-        self.callable = callable
-        self.args = args or []
-        self.kwds = kwds or {}
-
-
-class ThreadPool:
-    """A thread pool, distributing work requests and collecting results.
-
-    See the module doctring for more information.
-    """
-
-    def __init__(self, num_workers, q_size=0):
-        """Set up the thread pool and start num_workers worker threads.
-
-        num_workers is the number of worker threads to start initialy.
-        If q_size > 0 the size of the work request queue is limited and
-        the thread pool blocks when the queue is full and it tries to put
-        more work requests in it (see putRequest method).
-        """
-
-        self.requestsQueue = Queue.Queue(q_size)
-        self.resultsQueue = Queue.Queue()
-        self.workers = []
-        self.workRequests = {}
-        self.createWorkers(num_workers)
-
-    def createWorkers(self, num_workers):
-        """Add num_workers worker threads to the pool."""
-
-        for i in range(num_workers):
-            self.workers.append(WorkerThread(self.requestsQueue,
-              self.resultsQueue))
-
-    def dismissWorkers(self, num_workers):
-        """Tell num_workers worker threads to quit after their current task.
-        """
-
-        for i in range(min(num_workers, len(self.workers))):
-            worker = self.workers.pop()
-            worker.dismiss()
-
-    def addWork(self, callable, args=None, kwds=None, requestID=None, callback=None, exc_callback=None, block=True, timeout=0):
-        request = WorkRequest(callable, args, kwds, requestID, callback, exc_callback)
-        self.putRequest(request, block, timeout)
-        
-    def putRequest(self, request, block=True, timeout=0):
-        """Put work request into work queue and save its id for later."""
-
-        assert isinstance(request, WorkRequest)
-        self.requestsQueue.put(request, block, timeout)
-        self.workRequests[request.requestID] = request
-
-    def poll(self, block=False):
-        """Process any new results in the queue."""
-
-        while True:
-            # still results pending?
-            if not self.workRequests:
-                raise NoResultsPending
-            # are there still workers to process remaining requests?
-            elif block and not self.workers:
-                raise NoWorkersAvailable
-            try:
-                # get back next results
-                request, result = self.resultsQueue.get(block=block)
-                # has an exception occured?
-                if request.exception and request.exc_callback:
-                    request.exc_callback(request, result)
-                # hand results to callback, if any
-                if request.callback and not \
-                  (request.exception and request.exc_callback):
-                    request.callback(request, result)
-                del self.workRequests[request.requestID]
-            except Queue.Empty:
-                break
-
-    def wait(self):
-        """Wait for results, blocking until all have arrived."""
-
-        while 1:
-            try:
-                self.poll(True)
-            except NoResultsPending:
-                break
-
-# helper functions
-def makeRequests(callable, args_list, callback=None, exc_callback=None):
-    """Create several work requests for same callable with different arguments.
-
-    Convenience function for creating several work requests for the same
-    callable where each invocation of the callable receives different values
-    for its arguments.
-
-    args_list contains the parameters for each invocation of callable.
-    Each item in 'args_list' should be either a 2-item tuple of the list of
-    positional arguments and a dictionary of keyword arguments or a single,
-    non-tuple argument.
-
-    See docstring for WorkRequest for info on callback and exc_callback.
-    """
-
-    requests = []
-    for item in args_list:
-        if isinstance(item, tuple):
-            requests.append(
-              WorkRequest(callable, item[0], item[1], callback=callback,
-                exc_callback=exc_callback)
-            )
-        else:
-            requests.append(
-              WorkRequest(callable, [item], None, callback=callback,
-                exc_callback=exc_callback)
-            )
-    return requests
-
-################
-# USAGE EXAMPLE
-################
-
-if __name__ == '__main__':
-    import random
-    import time
-
-    # the work the threads will have to do (rather trivial in our example)
-    def do_something(data):
-        time.sleep(random.randint(1, 5))
-        result = round(random.random() * data, 5)
-        # just to show off, we throw an exception once in a while
-        if result > 3:
-            raise RuntimeError("Something extraordinary happened!")
-        return result
-
-    # this will be called each time a result is available
-    def print_result(request, result):
-        print "**Result: %s from request #%s" % (result, request.requestID)
-
-    # this will be called when an exception occurs within a thread
-    def handle_exception(request, exc_info):
-        print "Exception occured in request #%s: %s" % \
-          (request.requestID, exc_info[1])
-
-    # assemble the arguments for each job to a list...
-    data = [random.randint(1, 10) for i in range(20)]
-    # ... and build a WorkRequest object for each item in data
-    requests = makeRequests(do_something, data, print_result, handle_exception)
-
-    # or the other form of args_lists accepted by makeRequests: ((,), {})
-    data = [((random.randint(1, 10), ), {}) for i in range(20)]
-    requests.extend(
-      makeRequests(do_something, data, print_result, handle_exception)
-    )
-
-    # we create a pool of 3 worker threads
-    main = ThreadPool(3)
-
-    # then we put the work requests in the queue...
-    for req in requests:
-        main.putRequest(req)
-        print "Work request #%s added." % req.requestID
-    # or shorter:
-    # [main.putRequest(req) for req in requests]
-
-    # ...and wait for the results to arrive in the result queue
-    # by using ThreadPool.wait(). This would block until results for
-    # all work requests have arrived:
-    # main.wait()
-
-    # instead we can poll for results while doing something else:
-    i = 0
-    while 1:
-        try:
-            main.poll()
-            print "Main thread working..."
-            time.sleep(0.5)
-            if i == 10:
-                print "Adding 3 more worker threads..."
-                main.createWorkers(3)
-            i += 1
-        except KeyboardInterrupt:
-            print "Interrupted!"
-            break
-        except NoResultsPending:
-            print "All results collected."
-            break
-
Binary file buildframework/helium/external/python/lib/2.6/PyXML-0.8.4-py2.6-win32.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.6/easy-install.pth	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,5 @@
+import sys; sys.__plen = len(sys.path)
+./PyXML-0.8.4-py2.6-win32.egg
+./4Suite_XML-1.0.2-py2.6-win32.egg
+./lxml-2.2.1-py2.6-win32.egg
+import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/2.6/site.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,394 @@
+# Duplicating setuptools' site.py...
+def __boot():
+    PYTHONPATH = []    
+    if sys.platform=='win32':
+        PYTHONPATH.append(os.path.join(sys.prefix, 'lib'))
+    if not (os.environ.get('PYTHONPATH') is None or (sys.platform=='win32' and not os.environ.get('PYTHONPATH'))):
+        PYTHONPATH.extend(os.environ.get('PYTHONPATH').split(os.pathsep))
+    pic = getattr(sys,'path_importer_cache',{})
+    stdpath = sys.path[len(PYTHONPATH):]
+    mydir = os.path.dirname(__file__)
+    known_paths = dict([(makepath(item)[1],1) for item in sys.path]) # 2.2 comp
+
+    oldpos = getattr(sys,'__egginsert',0)   # save old insertion position
+    sys.__egginsert = 0                     # and reset the current one
+
+    for item in PYTHONPATH:
+        addsitedir(item)
+        item_site_packages = os.path.join(item, 'site-packages')
+        if os.path.exists(item_site_packages):
+            addsitedir(item_site_packages)
+
+    sys.__egginsert += oldpos           # restore effective old position
+
+    d,nd = makepath(stdpath[0])
+    insert_at = None
+    new_path = []
+
+    for item in sys.path:
+        p,np = makepath(item)
+
+        if np==nd and insert_at is None:
+            # We've hit the first 'system' path entry, so added entries go here
+            insert_at = len(new_path)
+
+        if np in known_paths or insert_at is None:
+            new_path.append(item)
+        else:
+            # new path after the insert point, back-insert it
+            new_path.insert(insert_at, item)
+            insert_at += 1
+
+    sys.path[:] = new_path
+    
+import sys
+import os
+import __builtin__
+
+def makepath(*paths):
+    dir = os.path.abspath(os.path.join(*paths))
+    return dir, os.path.normcase(dir)
+
+def abs__file__():
+    """Set all module' __file__ attribute to an absolute path"""
+    for m in sys.modules.values():
+        try:
+            m.__file__ = os.path.abspath(m.__file__)
+        except AttributeError:
+            continue
+
+try:
+    set
+except NameError:
+    class set:
+        def __init__(self, args=()):
+            self.d = {}
+            for v in args:
+                self.d[v] = None
+        def __contains__(self, key):
+            return key in self.d
+        def add(self, key):
+            self.d[key] = None
+
+def removeduppaths():
+    """ Remove duplicate entries from sys.path along with making them
+    absolute"""
+    # This ensures that the initial path provided by the interpreter contains
+    # only absolute pathnames, even if we're running from the build directory.
+    L = []
+    known_paths = set()
+    for dir in sys.path:
+        # Filter out duplicate paths (on case-insensitive file systems also
+        # if they only differ in case); turn relative paths into absolute
+        # paths.
+        dir, dircase = makepath(dir)
+        if not dircase in known_paths:
+            L.append(dir)
+            known_paths.add(dircase)
+    sys.path[:] = L
+    return known_paths
+
+def _init_pathinfo():
+    """Return a set containing all existing directory entries from sys.path"""
+    d = set()
+    for dir in sys.path:
+        try:
+            if os.path.isdir(dir):
+                dir, dircase = makepath(dir)
+                d.add(dircase)
+        except TypeError:
+            continue
+    return d
+
+def addpackage(sitedir, name, known_paths, exclude_packages=()):
+    """Add a new path to known_paths by combining sitedir and 'name' or execute
+    sitedir if it starts with 'import'"""
+    import fnmatch
+    if known_paths is None:
+        _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    fullname = os.path.join(sitedir, name)
+    try:
+        f = open(fullname, "rU")
+    except IOError:
+        return
+    try:
+        for line in f:
+            if line.startswith("#"):
+                continue
+            found_exclude = False
+            for exclude in exclude_packages:
+                if exclude(line):
+                    found_exclude = True
+                    break
+            if found_exclude:
+                continue
+            if line.startswith("import"):
+                exec line
+                continue
+            line = line.rstrip()
+            dir, dircase = makepath(sitedir, line)
+            if not dircase in known_paths and os.path.exists(dir):
+                sys.path.append(dir)
+                known_paths.add(dircase)
+    finally:
+        f.close()
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitedir(sitedir, known_paths=None, exclude_packages=()):
+    """Add 'sitedir' argument to sys.path if missing and handle .pth files in
+    'sitedir'"""
+    if known_paths is None:
+        known_paths = _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    sitedir, sitedircase = makepath(sitedir)
+    if not sitedircase in known_paths:
+        sys.path.append(sitedir)        # Add path component
+    try:
+        names = os.listdir(sitedir)
+    except os.error:
+        return
+    names.sort()
+    for name in names:
+        if name.endswith(os.extsep + "pth"):
+            addpackage(sitedir, name, known_paths,
+                       exclude_packages=exclude_packages)
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitepackages(known_paths):
+    """Add site-packages (and possibly site-python) to sys.path"""
+    prefixes = [os.path.join(sys.prefix, "local"), sys.prefix]
+    if sys.exec_prefix != sys.prefix:
+        prefixes.append(os.path.join(sys.exec_prefix, "local"))
+    for prefix in prefixes:
+        if prefix:
+            if sys.platform in ('os2emx', 'riscos'):
+                sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
+            elif os.sep == '/':
+                sitedirs = [os.path.join(prefix,
+                                         "lib",
+                                         "python" + sys.version[:3],
+                                         "site-packages"),
+                            os.path.join(prefix, "lib", "site-python")]
+                try:
+                    # sys.getobjects only available in --with-pydebug build
+                    # pylint: disable-msg=E1101
+                    sys.getobjects
+                    sitedirs.insert(0, os.path.join(sitedirs[0], 'debug'))
+                except AttributeError:
+                    pass
+            else:
+                sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
+            if sys.platform == 'darwin':
+                sitedirs.append( os.path.join('/opt/local', 'lib', 'python' + sys.version[:3], 'site-packages') )
+                # for framework builds *only* we add the standard Apple
+                # locations. Currently only per-user, but /Library and
+                # /Network/Library could be added too
+                if 'Python.framework' in prefix:
+                    home = os.environ.get('HOME')
+                    if home:
+                        sitedirs.append(
+                            os.path.join(home,
+                                         'Library',
+                                         'Python',
+                                         sys.version[:3],
+                                         'site-packages'))
+            for sitedir in sitedirs:
+                if os.path.isdir(sitedir):
+                    addsitedir(sitedir, known_paths,
+                               exclude_packages=[lambda line: 'setuptools' in line])
+    return None
+
+def setquit():
+    """Define new built-ins 'quit' and 'exit'.
+    These are simply strings that display a hint on how to exit.
+
+    """
+    if os.sep == ':':
+        exit = 'Use Cmd-Q to quit.'
+    elif os.sep == '\\':
+        exit = 'Use Ctrl-Z plus Return to exit.'
+    else:
+        exit = 'Use Ctrl-D (i.e. EOF) to exit.'
+    __builtin__.quit = __builtin__.exit = exit
+
+
+class _Printer(object):
+    """interactive prompt objects for printing the license text, a list of
+    contributors and the copyright notice."""
+
+    MAXLINES = 23
+
+    def __init__(self, name, data, files=(), dirs=()):
+        self.__name = name
+        self.__data = data
+        self.__files = files
+        self.__dirs = dirs
+        self.__lines = None
+
+    def __setup(self):
+        if self.__lines:
+            return
+        data = None
+        for dir in self.__dirs:
+            for filename in self.__files:
+                filename = os.path.join(dir, filename)
+                try:
+                    fp = file(filename, "rU")
+                    data = fp.read()
+                    fp.close()
+                    break
+                except IOError:
+                    pass
+            if data:
+                break
+        if not data:
+            data = self.__data
+        self.__lines = data.split('\n')
+        self.__linecnt = len(self.__lines)
+
+    def __repr__(self):
+        self.__setup()
+        if len(self.__lines) <= self.MAXLINES:
+            return "\n".join(self.__lines)
+        else:
+            return "Type %s() to see the full %s text" % ((self.__name,)*2)
+
+    def __call__(self):
+        self.__setup()
+        prompt = 'Hit Return for more, or q (and Return) to quit: '
+        lineno = 0
+        while 1:
+            try:
+                for i in range(lineno, lineno + self.MAXLINES):
+                    print self.__lines[i]
+            except IndexError:
+                break
+            else:
+                lineno += self.MAXLINES
+                key = None
+                while key is None:
+                    key = raw_input(prompt)
+                    if key not in ('', 'q'):
+                        key = None
+                if key == 'q':
+                    break
+
+def setcopyright():
+    """Set 'copyright' and 'credits' in __builtin__"""
+    __builtin__.copyright = _Printer("copyright", sys.copyright)
+    if sys.platform[:4] == 'java':
+        __builtin__.credits = _Printer(
+            "credits",
+            "Jython is maintained by the Jython developers (www.jython.org).")
+    else:
+        __builtin__.credits = _Printer("credits", """\
+    Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
+    for supporting Python development.  See www.python.org for more information.""")
+    here = os.path.dirname(os.__file__)
+    __builtin__.license = _Printer(
+        "license", "See http://www.python.org/%.3s/license.html" % sys.version,
+        ["LICENSE.txt", "LICENSE"],
+        [os.path.join(here, os.pardir), here, os.curdir])
+
+
+class _Helper(object):
+    """Define the built-in 'help'.
+    This is a wrapper around pydoc.help (with a twist).
+
+    """
+
+    def __repr__(self):
+        return "Type help() for interactive help, " \
+               "or help(object) for help about object."
+    def __call__(self, *args, **kwds):
+        import pydoc
+        return pydoc.help(*args, **kwds)
+
+def sethelper():
+    __builtin__.help = _Helper()
+
+def aliasmbcs():
+    """On Windows, some default encodings are not provided by Python,
+    while they are always available as "mbcs" in each locale. Make
+    them usable by aliasing to "mbcs" in such a case."""
+    if sys.platform == 'win32':
+        import locale, codecs
+        enc = locale.getdefaultlocale()[1]
+        if enc.startswith('cp'):            # "cp***" ?
+            try:
+                codecs.lookup(enc)
+            except LookupError:
+                import encodings
+                encodings._cache[enc] = encodings._unknown
+                encodings.aliases.aliases[enc] = 'mbcs'
+
+def setencoding():
+    """Set the string encoding used by the Unicode implementation.  The
+    default is 'ascii', but if you're willing to experiment, you can
+    change this."""
+    encoding = "ascii" # Default value set by _PyUnicode_Init()
+    if 0:
+        # Enable to support locale aware default string encodings.
+        import locale
+        loc = locale.getdefaultlocale()
+        if loc[1]:
+            encoding = loc[1]
+    if 0:
+        # Enable to switch off string to Unicode coercion and implicit
+        # Unicode to string conversion.
+        encoding = "undefined"
+    if encoding != "ascii":
+        # On Non-Unicode builds this will raise an AttributeError...
+        sys.setdefaultencoding(encoding) # Needs Python Unicode build !
+
+
+def execsitecustomize():
+    """Run custom site specific code, if available."""
+    try:
+        import sitecustomize
+    except ImportError:
+        pass
+
+def fixup_setuptools():
+    """Make sure our setuptools monkeypatch is in place"""
+    for i in range(len(sys.path)):
+        if sys.path[i].find('setuptools') != -1:
+            path = sys.path[i]
+            del sys.path[i]
+            sys.path.append(path)
+
+def main():
+    abs__file__()
+    paths_in_sys = removeduppaths()
+    if include_site_packages:
+        paths_in_sys = addsitepackages(paths_in_sys)
+    setquit()
+    setcopyright()
+    sethelper()
+    aliasmbcs()
+    setencoding()
+    execsitecustomize()
+    # Remove sys.setdefaultencoding() so that users cannot change the
+    # encoding after initialization.  The test for presence is needed when
+    # this module is run as a script, because this code is executed twice.
+    if hasattr(sys, "setdefaultencoding"):
+        del sys.setdefaultencoding
+    __boot()
+    fixup_setuptools()
+    
+
+
+include_site_packages = False
+
+
+
+main()
Binary file buildframework/helium/external/python/lib/common/Amara-1.2.0.1-py2.5.egg has changed
Binary file buildframework/helium/external/python/lib/common/Jinja-1.2-py2.5-win32.egg has changed
Binary file buildframework/helium/external/python/lib/common/Jinja2-2.2.1-py2.5.egg has changed
Binary file buildframework/helium/external/python/lib/common/Pygments-0.10-py2.5.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/EGG-INFO/PKG-INFO	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,45 @@
+Metadata-Version: 1.0
+Name: Sphinx
+Version: 0.5.1
+Summary: Python documentation generator
+Home-page: http://sphinx.pocoo.org/
+Author: Georg Brandl
+Author-email: georg@python.org
+License: BSD
+Download-URL: http://pypi.python.org/pypi/Sphinx
+Description: 
+        Sphinx is a tool that makes it easy to create intelligent and beautiful
+        documentation for Python projects (or other documents consisting of
+        multiple reStructuredText sources), written by Georg Brandl.
+        It was originally created to translate the new Python documentation,
+        but has now been cleaned up in the hope that it will be useful to many
+        other projects.
+        
+        Sphinx uses reStructuredText as its markup language, and many of its strengths
+        come from the power and straightforwardness of reStructuredText and its
+        parsing and translating suite, the Docutils.
+        
+        Although it is still under constant development, the following features
+        are already present, work fine and can be seen "in action" in the Python docs:
+        
+        * Output formats: HTML (including Windows HTML Help), plain text and LaTeX,
+        for printable PDF versions
+        * Extensive cross-references: semantic markup and automatic links
+        for functions, classes, glossary terms and similar pieces of information
+        * Hierarchical structure: easy definition of a document tree, with automatic
+        links to siblings, parents and children
+        * Automatic indices: general index as well as a module index
+        * Code handling: automatic highlighting using the Pygments highlighter
+        * Various extensions are available, e.g. for automatic testing of snippets
+        and inclusion of appropriately formatted docstrings.
+        
+Platform: any
+Classifier: Development Status :: 4 - Beta
+Classifier: Environment :: Console
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Documentation
+Classifier: Topic :: Utilities
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/EGG-INFO/SOURCES.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,216 @@
+AUTHORS
+CHANGES
+EXAMPLES
+LICENSE
+MANIFEST.in
+Makefile
+README
+TODO
+babel.cfg
+ez_setup.py
+setup.cfg
+setup.py
+sphinx-build.py
+sphinx-quickstart.py
+Sphinx.egg-info/PKG-INFO
+Sphinx.egg-info/SOURCES.txt
+Sphinx.egg-info/dependency_links.txt
+Sphinx.egg-info/entry_points.txt
+Sphinx.egg-info/not-zip-safe
+Sphinx.egg-info/requires.txt
+Sphinx.egg-info/top_level.txt
+doc/Makefile
+doc/builders.rst
+doc/changes.rst
+doc/concepts.rst
+doc/conf.py
+doc/config.rst
+doc/contents.rst
+doc/examples.rst
+doc/extensions.rst
+doc/glossary.rst
+doc/intro.rst
+doc/rest.rst
+doc/templating.rst
+doc/_static/sphinx.png
+doc/_templates/index.html
+doc/_templates/indexsidebar.html
+doc/_templates/layout.html
+doc/ext/appapi.rst
+doc/ext/autodoc.rst
+doc/ext/builderapi.rst
+doc/ext/coverage.rst
+doc/ext/doctest.rst
+doc/ext/ifconfig.rst
+doc/ext/intersphinx.rst
+doc/ext/math.rst
+doc/ext/refcounting.rst
+doc/ext/todo.rst
+doc/markup/code.rst
+doc/markup/desc.rst
+doc/markup/index.rst
+doc/markup/inline.rst
+doc/markup/misc.rst
+doc/markup/para.rst
+sphinx/__init__.py
+sphinx/_jinja.py
+sphinx/addnodes.py
+sphinx/application.py
+sphinx/builder.py
+sphinx/cmdline.py
+sphinx/config.py
+sphinx/environment.py
+sphinx/highlighting.py
+sphinx/htmlhelp.py
+sphinx/htmlwriter.py
+sphinx/latexwriter.py
+sphinx/linkcheck.py
+sphinx/quickstart.py
+sphinx/roles.py
+sphinx/search.py
+sphinx/setup_command.py
+sphinx/textwriter.py
+sphinx/directives/__init__.py
+sphinx/directives/code.py
+sphinx/directives/desc.py
+sphinx/directives/other.py
+sphinx/ext/__init__.py
+sphinx/ext/autodoc.py
+sphinx/ext/coverage.py
+sphinx/ext/doctest.py
+sphinx/ext/ifconfig.py
+sphinx/ext/intersphinx.py
+sphinx/ext/jsmath.py
+sphinx/ext/mathbase.py
+sphinx/ext/pngmath.py
+sphinx/ext/refcounting.py
+sphinx/ext/todo.py
+sphinx/locale/__init__.py
+sphinx/locale/__init__.pyc
+sphinx/locale/sphinx.pot
+sphinx/locale/cs/LC_MESSAGES/sphinx.js
+sphinx/locale/cs/LC_MESSAGES/sphinx.mo
+sphinx/locale/cs/LC_MESSAGES/sphinx.po
+sphinx/locale/de/LC_MESSAGES/sphinx.js
+sphinx/locale/de/LC_MESSAGES/sphinx.mo
+sphinx/locale/de/LC_MESSAGES/sphinx.po
+sphinx/locale/es/LC_MESSAGES/sphinx.js
+sphinx/locale/es/LC_MESSAGES/sphinx.mo
+sphinx/locale/es/LC_MESSAGES/sphinx.po
+sphinx/locale/fr/LC_MESSAGES/sphinx.js
+sphinx/locale/fr/LC_MESSAGES/sphinx.mo
+sphinx/locale/fr/LC_MESSAGES/sphinx.po
+sphinx/locale/ja/LC_MESSAGES/sphinx.js
+sphinx/locale/ja/LC_MESSAGES/sphinx.mo
+sphinx/locale/ja/LC_MESSAGES/sphinx.po
+sphinx/locale/nl/LC_MESSAGES/sphinx.js
+sphinx/locale/nl/LC_MESSAGES/sphinx.mo
+sphinx/locale/nl/LC_MESSAGES/sphinx.po
+sphinx/locale/pl/LC_MESSAGES/sphinx.js
+sphinx/locale/pl/LC_MESSAGES/sphinx.mo
+sphinx/locale/pl/LC_MESSAGES/sphinx.po
+sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js
+sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo
+sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po
+sphinx/locale/sl/LC_MESSAGES/sphinx.js
+sphinx/locale/sl/LC_MESSAGES/sphinx.mo
+sphinx/locale/sl/LC_MESSAGES/sphinx.po
+sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js
+sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo
+sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po
+sphinx/static/contents.png
+sphinx/static/default.css
+sphinx/static/doctools.js
+sphinx/static/file.png
+sphinx/static/jquery.js
+sphinx/static/minus.png
+sphinx/static/navigation.png
+sphinx/static/plus.png
+sphinx/static/rightsidebar.css
+sphinx/static/searchtools.js
+sphinx/static/sphinxdoc.css
+sphinx/static/stickysidebar.css
+sphinx/static/traditional.css
+sphinx/templates/defindex.html
+sphinx/templates/genindex-single.html
+sphinx/templates/genindex-split.html
+sphinx/templates/genindex.html
+sphinx/templates/layout.html
+sphinx/templates/modindex.html
+sphinx/templates/opensearch.xml
+sphinx/templates/page.html
+sphinx/templates/search.html
+sphinx/templates/changes/frameset.html
+sphinx/templates/changes/rstsource.html
+sphinx/templates/changes/versionchanges.html
+sphinx/texinputs/Makefile
+sphinx/texinputs/fncychap.sty
+sphinx/texinputs/howto.cls
+sphinx/texinputs/manual.cls
+sphinx/texinputs/python.ist
+sphinx/texinputs/sphinx.sty
+sphinx/texinputs/tabulary.sty
+sphinx/util/__init__.py
+sphinx/util/compat.py
+sphinx/util/console.py
+sphinx/util/jsdump.py
+sphinx/util/png.py
+sphinx/util/smartypants.py
+sphinx/util/stemmer.py
+sphinx/util/texescape.py
+tests/path.py
+tests/path.pyc
+tests/run.py
+tests/test_application.py
+tests/test_application.pyc
+tests/test_autodoc.py
+tests/test_autodoc.pyc
+tests/test_build.py
+tests/test_build.pyc
+tests/test_config.py
+tests/test_config.pyc
+tests/test_coverage.py
+tests/test_coverage.pyc
+tests/test_env.py
+tests/test_env.pyc
+tests/test_i18n.py
+tests/test_i18n.pyc
+tests/test_markup.py
+tests/test_markup.pyc
+tests/test_quickstart.py
+tests/test_quickstart.pyc
+tests/util.py
+tests/util.pyc
+tests/etree13/ElementPath.py
+tests/etree13/ElementPath.pyc
+tests/etree13/ElementTree.py
+tests/etree13/ElementTree.pyc
+tests/etree13/HTMLTreeBuilder.py
+tests/etree13/__init__.py
+tests/etree13/__init__.pyc
+tests/root/Makefile
+tests/root/autodoc.txt
+tests/root/conf.py
+tests/root/contents.txt
+tests/root/desc.txt
+tests/root/ext.py
+tests/root/ext.pyc
+tests/root/images.txt
+tests/root/img.gif
+tests/root/img.pdf
+tests/root/img.png
+tests/root/includes.txt
+tests/root/literal.inc
+tests/root/markup.txt
+tests/root/math.txt
+tests/root/wrongenc.inc
+tests/root/_static/README
+tests/root/_templates/layout.html
+tests/root/special/api.h
+tests/root/subdir/images.txt
+tests/root/subdir/img.png
+tests/root/subdir/include.inc
+tests/root/subdir/simg.png
+utils/check_sources.py
+utils/pylintrc
+utils/reindent.py
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/EGG-INFO/dependency_links.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/EGG-INFO/entry_points.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,7 @@
+[console_scripts]
+sphinx-build = sphinx:main
+sphinx-quickstart = sphinx.quickstart:main
+
+[distutils.commands]
+build_sphinx = sphinx.setup_command:BuildDoc
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/EGG-INFO/not-zip-safe	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/EGG-INFO/requires.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,3 @@
+Pygments>=0.8
+Jinja>=1.1
+docutils>=0.4
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/EGG-INFO/top_level.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1 @@
+sphinx
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+"""
+    Sphinx
+    ~~~~~~
+
+    The Sphinx documentation toolchain.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import sys
+
+__revision__ = '$Revision$'
+__version__ = '0.5.1'
+__released__ = '0.5.1'
+
+
+def main(argv=sys.argv):
+    if sys.version_info[:3] < (2, 4, 0):
+        print >>sys.stderr, \
+              'Error: Sphinx requires at least Python 2.4 to run.'
+        return 1
+
+    try:
+        from sphinx import cmdline
+    except ImportError, err:
+        errstr = str(err)
+        if errstr.lower().startswith('no module named'):
+            whichmod = errstr[16:]
+            if whichmod.startswith('docutils'):
+                whichmod = 'Docutils library'
+            elif whichmod.startswith('jinja'):
+                whichmod = 'Jinja library'
+            elif whichmod == 'roman':
+                whichmod = 'roman module (which is distributed with Docutils)'
+            else:
+                whichmod += ' module'
+            print >>sys.stderr, \
+                  'Error: The %s cannot be found. Did you install Sphinx '\
+                  'and its dependencies correctly?' % whichmod
+            return 1
+        raise
+    return cmdline.main(argv)
+
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/_jinja.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,113 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx._jinja
+    ~~~~~~~~~~~~~
+
+    Jinja glue.
+
+    :copyright: 2007-2008 by Georg Brandl, Horst Gutmann.
+    :license: BSD.
+"""
+
+import codecs
+from os import path
+
+from sphinx.util import mtimes_of_files
+from sphinx.application import TemplateBridge
+
+from jinja import Environment
+from jinja.loaders import BaseLoader
+from jinja.exceptions import TemplateNotFound
+
+
+def babel_extract(fileobj, keywords, comment_tags, options):
+    """
+    Simple extractor to get some basic Babel support.
+    """
+    env = Environment()
+    for lineno, sg, pl in env.get_translations_for_string(fileobj.read()):
+        yield lineno, None, (sg, pl), ''
+
+
+class SphinxFileSystemLoader(BaseLoader):
+    """
+    A loader that loads templates either relative to one of a list of given
+    paths, or from an absolute path.
+    """
+
+    def __init__(self, basepath, extpaths):
+        self.basepath = path.abspath(basepath)
+        self.extpaths = map(path.abspath, extpaths)
+        self.searchpaths = self.extpaths + [self.basepath]
+
+    def get_source(self, environment, name, parent):
+        name = name.replace('/', path.sep)
+        if name.startswith('!'):
+            name = name[1:]
+            if not path.exists(path.join(self.basepath, name)):
+                raise TemplateNotFound(name)
+            filename = path.join(self.basepath, name)
+        elif path.isabs(name):
+            if not path.exists(name):
+                raise TemplateNotFound(name)
+            filename = name
+        else:
+            for searchpath in self.searchpaths:
+                if path.exists(path.join(searchpath, name)):
+                    filename = path.join(searchpath, name)
+                    break
+            else:
+                raise TemplateNotFound(name)
+        f = codecs.open(filename, 'r', environment.template_charset)
+        try:
+            return f.read()
+        finally:
+            f.close()
+
+
+class TranslatorEnvironment(Environment):
+    class _Translator(object):
+        def __init__(self, translator):
+            self.trans = translator
+
+        def gettext(self, string):
+            return self.trans.ugettext(string)
+
+        def ngettext(self, singular, plural, n):
+            return self.trans.ungettext(singular, plural, n)
+
+    def __init__(self, *args, **kwargs):
+        self.translator = kwargs['translator']
+        del kwargs['translator']
+        super(TranslatorEnvironment, self).__init__(*args, **kwargs)
+
+    def get_translator(self, context):
+        return TranslatorEnvironment._Translator(self.translator)
+
+
+class BuiltinTemplates(TemplateBridge):
+    def init(self, builder):
+        self.templates = {}
+        base_templates_path = path.join(path.dirname(__file__), 'templates')
+        ext_templates_path = [path.join(builder.confdir, dir)
+                              for dir in builder.config.templates_path]
+        self.templates_path = [base_templates_path] + ext_templates_path
+        loader = SphinxFileSystemLoader(base_templates_path, ext_templates_path)
+        if builder.translator is not None:
+            self.jinja_env = TranslatorEnvironment(loader=loader,
+                    friendly_traceback=False, translator=builder.translator)
+        else:
+            self.jinja_env = Environment(loader=loader,
+                    # disable traceback, more likely that something
+                    # in the application is broken than in the templates
+                    friendly_traceback=False)
+
+    def newest_template_mtime(self):
+        return max(mtimes_of_files(self.templates_path, '.html'))
+
+    def render(self, template, context):
+        if template in self.templates:
+            return self.templates[template].render(context)
+        templateobj = self.templates[template] = \
+                      self.jinja_env.get_template(template)
+        return templateobj.render(context)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/addnodes.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,97 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.addnodes
+    ~~~~~~~~~~~~~~~
+
+    Additional docutils nodes.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from docutils import nodes
+
+# index markup
+class index(nodes.Invisible, nodes.Inline, nodes.TextElement): pass
+
+# description units (classdesc, funcdesc etc.)
+
+# parent node for signature and content
+class desc(nodes.Admonition, nodes.Element): pass
+
+# additional name parts (module name, class name)
+class desc_addname(nodes.Part, nodes.Inline, nodes.TextElement): pass
+# compatibility alias
+desc_classname = desc_addname
+# return type (C); object type, e.g. -> annotation (Python)
+class desc_type(nodes.Part, nodes.Inline, nodes.TextElement): pass
+# main name of object
+class desc_name(nodes.Part, nodes.Inline, nodes.TextElement): pass
+# argument list
+class desc_signature(nodes.Part, nodes.Inline, nodes.TextElement): pass
+class desc_parameterlist(nodes.Part, nodes.Inline, nodes.TextElement):
+    child_text_separator = ', '
+class desc_parameter(nodes.Part, nodes.Inline, nodes.TextElement): pass
+class desc_optional(nodes.Part, nodes.Inline, nodes.TextElement):
+    child_text_separator = ', '
+    def astext(self):
+        return '[' + nodes.TextElement.astext(self) + ']'
+# annotation (not Python 3-style annotations)
+class desc_annotation(nodes.Part, nodes.Inline, nodes.TextElement): pass
+
+# node for content
+class desc_content(nodes.General, nodes.Element): pass
+
+# \versionadded, \versionchanged, \deprecated
+class versionmodified(nodes.Admonition, nodes.TextElement): pass
+
+# seealso
+class seealso(nodes.Admonition, nodes.Element): pass
+
+# productionlist
+class productionlist(nodes.Admonition, nodes.Element): pass
+class production(nodes.Part, nodes.Inline, nodes.TextElement): pass
+
+# toc tree
+class toctree(nodes.General, nodes.Element): pass
+
+# centered
+class centered(nodes.Part, nodes.Element): pass
+
+# pending xref
+class pending_xref(nodes.Element): pass
+
+# compact paragraph -- never makes a <p>
+class compact_paragraph(nodes.paragraph): pass
+
+# for the ACKS list
+class acks(nodes.Element): pass
+
+# sets the highlighting language for literal blocks
+class highlightlang(nodes.Element): pass
+
+# like emphasis, but doesn't apply further text processors, e.g. smartypants
+class literal_emphasis(nodes.emphasis): pass
+
+# glossary
+class glossary(nodes.Element): pass
+
+# module declaration
+class module(nodes.Element): pass
+
+# start of a file, used in the LaTeX builder only
+class start_of_file(nodes.Element): pass
+
+# tabular column specification, used for the LaTeX writer
+class tabular_col_spec(nodes.Element): pass
+
+# meta directive -- same as docutils' standard meta node, but pickleable
+class meta(nodes.Special, nodes.PreBibliographic, nodes.Element): pass
+
+# make them known to docutils. this is needed, because the HTML writer
+# will choke at some point if these are not added
+nodes._add_node_class_names("""index desc desc_content desc_signature desc_type
+      desc_addname desc_name desc_parameterlist desc_parameter desc_optional
+      centered versionmodified seealso productionlist production toctree
+      pending_xref compact_paragraph highlightlang literal_emphasis
+      glossary acks module start_of_file tabular_col_spec meta""".split())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/application.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,325 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.application
+    ~~~~~~~~~~~~~~~~~~
+
+    Sphinx application object.
+
+    Gracefully adapted from the TextPress system by Armin.
+
+
+    :copyright: 2008 by Georg Brandl, Armin Ronacher.
+    :license: BSD.
+"""
+
+import sys
+import posixpath
+from cStringIO import StringIO
+
+from docutils import nodes
+from docutils.parsers.rst import directives, roles
+
+import sphinx
+from sphinx.roles import xfileref_role, innernodetypes
+from sphinx.config import Config
+from sphinx.builder import builtin_builders, StandaloneHTMLBuilder
+from sphinx.directives import desc_directive, target_directive, additional_xref_types
+from sphinx.environment import SphinxStandaloneReader
+from sphinx.util.console import bold
+
+
+class SphinxError(Exception):
+    """
+    Base class for Sphinx errors that are shown to the user in a nicer
+    way than normal exceptions.
+    """
+    category = 'Sphinx error'
+
+class ExtensionError(SphinxError):
+    """Raised if something's wrong with the configuration."""
+    category = 'Extension error'
+
+    def __init__(self, message, orig_exc=None):
+        super(ExtensionError, self).__init__(message)
+        self.orig_exc = orig_exc
+
+    def __repr__(self):
+        if self.orig_exc:
+            return '%s(%r, %r)' % (self.__class__.__name__,
+                                   self.message, self.orig_exc)
+        return '%s(%r)' % (self.__class__.__name__, self.message)
+
+    def __str__(self):
+        parent_str = super(ExtensionError, self).__str__()
+        if self.orig_exc:
+            return '%s (exception: %s)' % (parent_str, self.orig_exc)
+        return parent_str
+
+
+# List of all known core events. Maps name to arguments description.
+events = {
+    'builder-inited': '',
+    'env-purge-doc': 'env, docname',
+    'source-read': 'docname, source text',
+    'doctree-read': 'the doctree before being pickled',
+    'missing-reference': 'env, node, contnode',
+    'doctree-resolved': 'doctree, docname',
+    'env-updated': 'env',
+    'html-page-context': 'pagename, context, doctree or None',
+    'build-finished': 'exception',
+}
+
+CONFIG_FILENAME = 'conf.py'
+
+class Sphinx(object):
+
+    def __init__(self, srcdir, confdir, outdir, doctreedir, buildername,
+                 confoverrides, status, warning=sys.stderr, freshenv=False):
+        self.next_listener_id = 0
+        self._listeners = {}
+        self.builderclasses = builtin_builders.copy()
+        self.builder = None
+
+        self.srcdir = srcdir
+        self.confdir = confdir
+        self.outdir = outdir
+        self.doctreedir = doctreedir
+
+        if status is None:
+            self._status = StringIO()
+            self.quiet = True
+        else:
+            self._status = status
+            self.quiet = False
+        if warning is None:
+            self._warning = StringIO()
+        else:
+            self._warning = warning
+        self._warncount = 0
+
+        self._events = events.copy()
+
+        # status code for command-line application
+        self.statuscode = 0
+
+        # read config
+        self.config = Config(confdir, CONFIG_FILENAME, confoverrides)
+
+        # load all extension modules
+        for extension in self.config.extensions:
+            self.setup_extension(extension)
+        # the config file itself can be an extension
+        if self.config.setup:
+            self.config.setup(self)
+
+        # now that we know all config values, collect them from conf.py
+        self.config.init_values()
+
+        if buildername is None:
+            print >>status, 'No builder selected, using default: html'
+            buildername = 'html'
+        if buildername not in self.builderclasses:
+            raise SphinxError('Builder name %s not registered' % buildername)
+
+        self.info(bold('Sphinx v%s, building %s' % (sphinx.__released__,
+                                                    buildername)))
+
+        builderclass = self.builderclasses[buildername]
+        self.builder = builderclass(self, freshenv=freshenv)
+        self.emit('builder-inited')
+
+    def build(self, all_files, filenames):
+        try:
+            if all_files:
+                self.builder.build_all()
+            elif filenames:
+                self.builder.build_specific(filenames)
+            else:
+                self.builder.build_update()
+        except Exception, err:
+            self.emit('build-finished', err)
+            raise
+        else:
+            self.emit('build-finished', None)
+
+    def warn(self, message):
+        self._warncount += 1
+        try:
+            self._warning.write('WARNING: %s\n' % message)
+        except UnicodeEncodeError:
+            encoding = getattr(self._warning, 'encoding', 'ascii')
+            self._warning.write(('WARNING: %s\n' % message).encode(encoding, 'replace'))
+
+    def info(self, message='', nonl=False):
+        try:
+            self._status.write(message)
+        except UnicodeEncodeError:
+            encoding = getattr(self._status, 'encoding', 'ascii')
+            self._status.write(message.encode(encoding, 'replace'))
+        if not nonl:
+            self._status.write('\n')
+        self._status.flush()
+
+    # general extensibility interface
+
+    def setup_extension(self, extension):
+        """Import and setup a Sphinx extension module."""
+        try:
+            mod = __import__(extension, None, None, ['setup'])
+        except ImportError, err:
+            raise ExtensionError('Could not import extension %s' % extension, err)
+        if hasattr(mod, 'setup'):
+            mod.setup(self)
+
+    def import_object(self, objname, source=None):
+        """Import an object from a 'module.name' string."""
+        try:
+            module, name = objname.rsplit('.', 1)
+        except ValueError, err:
+            raise ExtensionError('Invalid full object name %s' % objname +
+                                 (source and ' (needed for %s)' % source or ''), err)
+        try:
+            return getattr(__import__(module, None, None, [name]), name)
+        except ImportError, err:
+            raise ExtensionError('Could not import %s' % module +
+                                 (source and ' (needed for %s)' % source or ''), err)
+        except AttributeError, err:
+            raise ExtensionError('Could not find %s' % objname +
+                                 (source and ' (needed for %s)' % source or ''), err)
+
+    # event interface
+
+    def _validate_event(self, event):
+        event = intern(event)
+        if event not in self._events:
+            raise ExtensionError('Unknown event name: %s' % event)
+
+    def connect(self, event, callback):
+        self._validate_event(event)
+        listener_id = self.next_listener_id
+        if event not in self._listeners:
+            self._listeners[event] = {listener_id: callback}
+        else:
+            self._listeners[event][listener_id] = callback
+        self.next_listener_id += 1
+        return listener_id
+
+    def disconnect(self, listener_id):
+        for event in self._listeners.itervalues():
+            event.pop(listener_id, None)
+
+    def emit(self, event, *args):
+        result = []
+        if event in self._listeners:
+            for _, callback in self._listeners[event].iteritems():
+                result.append(callback(self, *args))
+        return result
+
+    def emit_firstresult(self, event, *args):
+        for result in self.emit(event, *args):
+            if result is not None:
+                return result
+        return None
+
+    # registering addon parts
+
+    def add_builder(self, builder):
+        if not hasattr(builder, 'name'):
+            raise ExtensionError('Builder class %s has no "name" attribute' % builder)
+        if builder.name in self.builderclasses:
+            raise ExtensionError('Builder %r already exists (in module %s)' % (
+                builder.name, self.builderclasses[builder.name].__module__))
+        self.builderclasses[builder.name] = builder
+
+    def add_config_value(self, name, default, rebuild_env):
+        if name in self.config.values:
+            raise ExtensionError('Config value %r already present' % name)
+        self.config.values[name] = (default, rebuild_env)
+
+    def add_event(self, name):
+        if name in self._events:
+            raise ExtensionError('Event %r already present' % name)
+        self._events[name] = ''
+
+    def add_node(self, node, **kwds):
+        nodes._add_node_class_names([node.__name__])
+        for key, val in kwds.iteritems():
+            try:
+                visit, depart = val
+            except ValueError:
+                raise ExtensionError('Value for key %r must be a (visit, depart) '
+                                     'function tuple' % key)
+            if key == 'html':
+                from sphinx.htmlwriter import HTMLTranslator as translator
+            elif key == 'latex':
+                from sphinx.latexwriter import LaTeXTranslator as translator
+            elif key == 'text':
+                from sphinx.textwriter import TextTranslator as translator
+            else:
+                # ignore invalid keys for compatibility
+                continue
+            setattr(translator, 'visit_'+node.__name__, visit)
+            if depart:
+                setattr(translator, 'depart_'+node.__name__, depart)
+
+    def add_directive(self, name, func, content, arguments, **options):
+        func.content = content
+        func.arguments = arguments
+        func.options = options
+        directives.register_directive(name, func)
+
+    def add_role(self, name, role):
+        roles.register_canonical_role(name, role)
+
+    def add_description_unit(self, directivename, rolename, indextemplate='',
+                             parse_node=None, ref_nodeclass=None):
+        additional_xref_types[directivename] = (rolename, indextemplate, parse_node)
+        directives.register_directive(directivename, desc_directive)
+        roles.register_canonical_role(rolename, xfileref_role)
+        if ref_nodeclass is not None:
+            innernodetypes[rolename] = ref_nodeclass
+
+    def add_crossref_type(self, directivename, rolename, indextemplate='',
+                          ref_nodeclass=None):
+        additional_xref_types[directivename] = (rolename, indextemplate, None)
+        directives.register_directive(directivename, target_directive)
+        roles.register_canonical_role(rolename, xfileref_role)
+        if ref_nodeclass is not None:
+            innernodetypes[rolename] = ref_nodeclass
+
+    def add_transform(self, transform):
+        SphinxStandaloneReader.transforms.append(transform)
+
+    def add_javascript(self, filename):
+        StandaloneHTMLBuilder.script_files.append(
+            posixpath.join('_static', filename))
+
+
+class TemplateBridge(object):
+    """
+    This class defines the interface for a "template bridge", that is, a class
+    that renders templates given a template name and a context.
+    """
+
+    def init(self, builder):
+        """
+        Called by the builder to initialize the template system.  *builder*
+        is the builder object; you'll probably want to look at the value of
+        ``builder.config.templates_path``.
+        """
+        raise NotImplementedError('must be implemented in subclasses')
+
+    def newest_template_mtime(self):
+        """
+        Called by the builder to determine if output files are outdated
+        because of template changes.  Return the mtime of the newest template
+        file that was changed.  The default implementation returns ``0``.
+        """
+        return 0
+
+    def render(self, template, context):
+        """
+        Called by the builder to render a *template* with a specified
+        context (a Python dictionary).
+        """
+        raise NotImplementedError('must be implemented in subclasses')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/builder.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1272 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.builder
+    ~~~~~~~~~~~~~~
+
+    Builder classes for different output formats.
+
+    :copyright: 2007-2008 by Georg Brandl, Sebastian Wiesner, Horst Gutmann.
+    :license: BSD.
+"""
+
+import os
+import time
+import codecs
+import shutil
+import gettext
+import cPickle as pickle
+from os import path
+from cgi import escape
+
+from docutils import nodes
+from docutils.io import StringOutput, FileOutput, DocTreeInput
+from docutils.core import publish_parts
+from docutils.utils import new_document
+from docutils.frontend import OptionParser
+from docutils.readers.doctree import Reader as DoctreeReader
+
+from sphinx import addnodes, locale, __version__
+from sphinx.util import ensuredir, relative_uri, SEP, os_path, texescape, ustrftime
+from sphinx.htmlhelp import build_hhx
+from sphinx.htmlwriter import HTMLWriter, HTMLTranslator, SmartyPantsHTMLTranslator
+from sphinx.textwriter import TextWriter
+from sphinx.latexwriter import LaTeXWriter
+from sphinx.environment import BuildEnvironment, NoUri
+from sphinx.highlighting import PygmentsBridge
+from sphinx.util.console import bold, purple, darkgreen
+from sphinx.search import js_index
+
+try:
+    import json
+except ImportError:
+    try:
+        import simplejson as json
+    except ImportError:
+        json = None
+
+# side effect: registers roles and directives
+from sphinx import roles
+from sphinx import directives
+
+ENV_PICKLE_FILENAME = 'environment.pickle'
+LAST_BUILD_FILENAME = 'last_build'
+INVENTORY_FILENAME = 'objects.inv'
+
+
+class Builder(object):
+    """
+    Builds target formats from the reST sources.
+    """
+
+    # builder's name, for the -b command line options
+    name = ''
+
+    def __init__(self, app, env=None, freshenv=False):
+        self.srcdir = app.srcdir
+        self.confdir = app.confdir
+        self.outdir = app.outdir
+        self.doctreedir = app.doctreedir
+        if not path.isdir(self.doctreedir):
+            os.makedirs(self.doctreedir)
+
+        self.app = app
+        self.warn = app.warn
+        self.info = app.info
+        self.config = app.config
+
+        self.load_i18n()
+
+        # images that need to be copied over (source -> dest)
+        self.images = {}
+
+        # if None, this is set in load_env()
+        self.env = env
+        self.freshenv = freshenv
+
+        self.init()
+        self.load_env()
+
+    # helper methods
+
+    def init(self):
+        """Load necessary templates and perform initialization."""
+        raise NotImplementedError
+
+    def init_templates(self):
+        # Call this from init() if you need templates.
+        if self.config.template_bridge:
+            self.templates = self.app.import_object(
+                self.config.template_bridge, 'template_bridge setting')()
+        else:
+            from sphinx._jinja import BuiltinTemplates
+            self.templates = BuiltinTemplates()
+        self.templates.init(self)
+
+    def get_target_uri(self, docname, typ=None):
+        """
+        Return the target URI for a document name (typ can be used to qualify
+        the link characteristic for individual builders).
+        """
+        raise NotImplementedError
+
+    def get_relative_uri(self, from_, to, typ=None):
+        """
+        Return a relative URI between two source filenames. May raise environment.NoUri
+        if there's no way to return a sensible URI.
+        """
+        return relative_uri(self.get_target_uri(from_),
+                            self.get_target_uri(to, typ))
+
+    def get_outdated_docs(self):
+        """
+        Return an iterable of output files that are outdated, or a string describing
+        what an update build will build.
+        """
+        raise NotImplementedError
+
+    def status_iterator(self, iterable, summary, colorfunc=darkgreen):
+        l = -1
+        for item in iterable:
+            if l == -1:
+                self.info(bold(summary), nonl=1)
+                l = 0
+            self.info(colorfunc(item) + ' ', nonl=1)
+            yield item
+        if l == 0:
+            self.info()
+
+    supported_image_types = []
+
+    def post_process_images(self, doctree):
+        """
+        Pick the best candidate for all image URIs.
+        """
+        for node in doctree.traverse(nodes.image):
+            if '?' in node['candidates']:
+                # don't rewrite nonlocal image URIs
+                continue
+            if '*' not in node['candidates']:
+                for imgtype in self.supported_image_types:
+                    candidate = node['candidates'].get(imgtype, None)
+                    if candidate:
+                        break
+                else:
+                    self.warn('%s:%s: no matching candidate for image URI %r' %
+                              (node.source, getattr(node, 'lineno', ''), node['uri']))
+                    continue
+                node['uri'] = candidate
+            else:
+                candidate = node['uri']
+            if candidate not in self.env.images:
+                # non-existing URI; let it alone
+                continue
+            self.images[candidate] = self.env.images[candidate][1]
+
+    # build methods
+
+    def load_i18n(self):
+        """
+        Load translated strings from the configured localedirs if
+        enabled in the configuration.
+        """
+        self.translator = None
+        if self.config.language is not None:
+            self.info(bold('loading translations [%s]... ' % self.config.language),
+                      nonl=True)
+            locale_dirs = [path.join(path.dirname(__file__), 'locale')] + \
+                          [path.join(self.srcdir, x) for x in self.config.locale_dirs]
+            for dir_ in locale_dirs:
+                try:
+                    trans = gettext.translation('sphinx', localedir=dir_,
+                            languages=[self.config.language])
+                    if self.translator is None:
+                        self.translator = trans
+                    else:
+                        self.translator._catalog.update(trans.catalog)
+                except Exception:
+                    # Language couldn't be found in the specified path
+                    pass
+            if self.translator is not None:
+                self.info('done')
+            else:
+                self.info('locale not available')
+        if self.translator is None:
+            self.translator = gettext.NullTranslations()
+        self.translator.install(unicode=True)
+        locale.init()  # translate common labels
+
+    def load_env(self):
+        """Set up the build environment."""
+        if self.env:
+            return
+        if not self.freshenv:
+            try:
+                self.info(bold('loading pickled environment... '), nonl=True)
+                self.env = BuildEnvironment.frompickle(self.config,
+                    path.join(self.doctreedir, ENV_PICKLE_FILENAME))
+                self.info('done')
+            except Exception, err:
+                if type(err) is IOError and err.errno == 2:
+                    self.info('not found')
+                else:
+                    self.info('failed: %s' % err)
+                self.env = BuildEnvironment(self.srcdir, self.doctreedir, self.config)
+                self.env.find_files(self.config)
+        else:
+            self.env = BuildEnvironment(self.srcdir, self.doctreedir, self.config)
+            self.env.find_files(self.config)
+        self.env.set_warnfunc(self.warn)
+
+    def build_all(self):
+        """Build all source files."""
+        self.build(None, summary='all source files', method='all')
+
+    def build_specific(self, filenames):
+        """Only rebuild as much as needed for changes in the source_filenames."""
+        # bring the filenames to the canonical format, that is,
+        # relative to the source directory and without source_suffix.
+        dirlen = len(self.srcdir) + 1
+        to_write = []
+        suffix = self.config.source_suffix
+        for filename in filenames:
+            filename = path.abspath(filename)[dirlen:]
+            if filename.endswith(suffix):
+                filename = filename[:-len(suffix)]
+            filename = filename.replace(os.path.sep, SEP)
+            to_write.append(filename)
+        self.build(to_write, method='specific',
+                   summary='%d source files given on command '
+                   'line' % len(to_write))
+
+    def build_update(self):
+        """Only rebuild files changed or added since last build."""
+        to_build = self.get_outdated_docs()
+        if isinstance(to_build, str):
+            self.build(['__all__'], to_build)
+        else:
+            to_build = list(to_build)
+            self.build(to_build,
+                       summary='targets for %d source files that are '
+                       'out of date' % len(to_build))
+
+    def build(self, docnames, summary=None, method='update'):
+        if summary:
+            self.info(bold('building [%s]: ' % self.name), nonl=1)
+            self.info(summary)
+
+        updated_docnames = []
+        # while reading, collect all warnings from docutils
+        warnings = []
+        self.env.set_warnfunc(warnings.append)
+        self.info(bold('updating environment: '), nonl=1)
+        iterator = self.env.update(self.config, self.srcdir, self.doctreedir, self.app)
+        # the first item in the iterator is a summary message
+        self.info(iterator.next())
+        for docname in self.status_iterator(iterator, 'reading sources... ', purple):
+            updated_docnames.append(docname)
+            # nothing further to do, the environment has already done the reading
+        for warning in warnings:
+            if warning.strip():
+                self.warn(warning)
+        self.env.set_warnfunc(self.warn)
+
+        if updated_docnames:
+            # save the environment
+            self.info(bold('pickling environment... '), nonl=True)
+            self.env.topickle(path.join(self.doctreedir, ENV_PICKLE_FILENAME))
+            self.info('done')
+
+            # global actions
+            self.info(bold('checking consistency... '), nonl=True)
+            self.env.check_consistency()
+            self.info('done')
+        else:
+            if method == 'update' and not docnames:
+                self.info(bold('no targets are out of date.'))
+                return
+
+        # another indirection to support methods which don't build files
+        # individually
+        self.write(docnames, updated_docnames, method)
+
+        # finish (write static files etc.)
+        self.finish()
+        status = self.app.statuscode == 0 and 'succeeded' or 'finished with problems'
+        if self.app._warncount:
+            self.info(bold('build %s, %s warning%s.' %
+                           (status, self.app._warncount,
+                            self.app._warncount != 1 and 's' or '')))
+        else:
+            self.info(bold('build %s.' % status))
+
+    def write(self, build_docnames, updated_docnames, method='update'):
+        if build_docnames is None or build_docnames == ['__all__']:
+            # build_all
+            build_docnames = self.env.found_docs
+        if method == 'update':
+            # build updated ones as well
+            docnames = set(build_docnames) | set(updated_docnames)
+        else:
+            docnames = set(build_docnames)
+
+        # add all toctree-containing files that may have changed
+        for docname in list(docnames):
+            for tocdocname in self.env.files_to_rebuild.get(docname, []):
+                docnames.add(tocdocname)
+        docnames.add(self.config.master_doc)
+
+        self.info(bold('preparing documents... '), nonl=True)
+        self.prepare_writing(docnames)
+        self.info('done')
+
+        # write target files
+        warnings = []
+        self.env.set_warnfunc(warnings.append)
+        for docname in self.status_iterator(sorted(docnames),
+                                            'writing output... ', darkgreen):
+            doctree = self.env.get_and_resolve_doctree(docname, self)
+            self.write_doc(docname, doctree)
+        for warning in warnings:
+            if warning.strip():
+                self.warn(warning)
+        self.env.set_warnfunc(self.warn)
+
+    def prepare_writing(self, docnames):
+        raise NotImplementedError
+
+    def write_doc(self, docname, doctree):
+        raise NotImplementedError
+
+    def finish(self):
+        raise NotImplementedError
+
+
+class StandaloneHTMLBuilder(Builder):
+    """
+    Builds standalone HTML docs.
+    """
+    name = 'html'
+    copysource = True
+    out_suffix = '.html'
+    indexer_format = js_index
+    supported_image_types = ['image/svg+xml', 'image/png', 'image/gif',
+                             'image/jpeg']
+    searchindex_filename = 'searchindex.js'
+    add_header_links = True
+    add_definition_links = True
+
+    # This is a class attribute because it is mutated by Sphinx.add_javascript.
+    script_files = ['_static/jquery.js', '_static/doctools.js']
+
+    def init(self):
+        """Load templates."""
+        self.init_templates()
+        self.init_translator_class()
+        if self.config.html_file_suffix:
+            self.out_suffix = self.config.html_file_suffix
+
+        if self.config.language is not None:
+            jsfile = path.join(path.dirname(__file__), 'locale', self.config.language,
+                               'LC_MESSAGES', 'sphinx.js')
+            if path.isfile(jsfile):
+                self.script_files.append('_static/translations.js')
+
+    def init_translator_class(self):
+        if self.config.html_translator_class:
+            self.translator_class = self.app.import_object(
+                self.config.html_translator_class, 'html_translator_class setting')
+        elif self.config.html_use_smartypants:
+            self.translator_class = SmartyPantsHTMLTranslator
+        else:
+            self.translator_class = HTMLTranslator
+
+    def render_partial(self, node):
+        """Utility: Render a lone doctree node."""
+        doc = new_document('<partial node>')
+        doc.append(node)
+        return publish_parts(
+            doc,
+            source_class=DocTreeInput,
+            reader=DoctreeReader(),
+            writer=HTMLWriter(self),
+            settings_overrides={'output_encoding': 'unicode'}
+        )
+
+    def prepare_writing(self, docnames):
+        from sphinx.search import IndexBuilder
+
+        self.indexer = IndexBuilder(self.env)
+        self.load_indexer(docnames)
+        self.docwriter = HTMLWriter(self)
+        self.docsettings = OptionParser(
+            defaults=self.env.settings,
+            components=(self.docwriter,)).get_default_values()
+
+        # format the "last updated on" string, only once is enough since it
+        # typically doesn't include the time of day
+        lufmt = self.config.html_last_updated_fmt
+        if lufmt is not None:
+            self.last_updated = ustrftime(lufmt or _('%b %d, %Y'))
+        else:
+            self.last_updated = None
+
+        logo = self.config.html_logo and \
+               path.basename(self.config.html_logo) or ''
+
+        favicon = self.config.html_favicon and \
+                  path.basename(self.config.html_favicon) or ''
+        if favicon and os.path.splitext(favicon)[1] != '.ico':
+            self.warn('html_favicon is not an .ico file')
+
+        if not isinstance(self.config.html_use_opensearch, basestring):
+            self.warn('html_use_opensearch config value must now be a string')
+
+        self.relations = self.env.collect_relations()
+
+        rellinks = []
+        if self.config.html_use_index:
+            rellinks.append(('genindex', _('General Index'), 'I', _('index')))
+        if self.config.html_use_modindex and self.env.modules:
+            rellinks.append(('modindex', _('Global Module Index'), 'M', _('modules')))
+
+        self.globalcontext = dict(
+            project = self.config.project,
+            release = self.config.release,
+            version = self.config.version,
+            last_updated = self.last_updated,
+            copyright = self.config.copyright,
+            master_doc = self.config.master_doc,
+            style = self.config.html_style,
+            use_opensearch = self.config.html_use_opensearch,
+            docstitle = self.config.html_title,
+            shorttitle = self.config.html_short_title,
+            show_sphinx = self.config.html_show_sphinx,
+            has_source = self.config.html_copy_source,
+            file_suffix = self.out_suffix,
+            script_files = self.script_files,
+            sphinx_version = __version__,
+            rellinks = rellinks,
+            builder = self.name,
+            parents = [],
+            logo = logo,
+            favicon = favicon,
+        )
+        self.globalcontext.update(self.config.html_context)
+
+    def get_doc_context(self, docname, body, metatags):
+        """Collect items for the template context of a page."""
+        # find out relations
+        prev = next = None
+        parents = []
+        rellinks = self.globalcontext['rellinks'][:]
+        related = self.relations.get(docname)
+        titles = self.env.titles
+        if related and related[2]:
+            try:
+                next = {'link': self.get_relative_uri(docname, related[2]),
+                        'title': self.render_partial(titles[related[2]])['title']}
+                rellinks.append((related[2], next['title'], 'N', _('next')))
+            except KeyError:
+                next = None
+        if related and related[1]:
+            try:
+                prev = {'link': self.get_relative_uri(docname, related[1]),
+                        'title': self.render_partial(titles[related[1]])['title']}
+                rellinks.append((related[1], prev['title'], 'P', _('previous')))
+            except KeyError:
+                # the relation is (somehow) not in the TOC tree, handle that gracefully
+                prev = None
+        while related and related[0]:
+            try:
+                parents.append(
+                    {'link': self.get_relative_uri(docname, related[0]),
+                     'title': self.render_partial(titles[related[0]])['title']})
+            except KeyError:
+                pass
+            related = self.relations.get(related[0])
+        if parents:
+            parents.pop() # remove link to the master file; we have a generic
+                          # "back to index" link already
+        parents.reverse()
+
+        # title rendered as HTML
+        title = titles.get(docname)
+        title = title and self.render_partial(title)['title'] or ''
+        # the name for the copied source
+        sourcename = self.config.html_copy_source and docname + '.txt' or ''
+
+        # metadata for the document
+        meta = self.env.metadata.get(docname)
+
+        return dict(
+            parents = parents,
+            prev = prev,
+            next = next,
+            title = title,
+            meta = meta,
+            body = body,
+            metatags = metatags,
+            rellinks = rellinks,
+            sourcename = sourcename,
+            toc = self.render_partial(self.env.get_toc_for(docname))['fragment'],
+            # only display a TOC if there's more than one item to show
+            display_toc = (self.env.toc_num_entries[docname] > 1),
+        )
+
+    def write_doc(self, docname, doctree):
+        self.post_process_images(doctree)
+        destination = StringOutput(encoding='utf-8')
+        doctree.settings = self.docsettings
+
+        self.imgpath = relative_uri(self.get_target_uri(docname), '_images')
+        self.docwriter.write(doctree, destination)
+        self.docwriter.assemble_parts()
+        body = self.docwriter.parts['fragment']
+        metatags = self.docwriter.clean_meta
+
+        ctx = self.get_doc_context(docname, body, metatags)
+        self.index_page(docname, doctree, ctx.get('title', ''))
+        self.handle_page(docname, ctx, event_arg=doctree)
+
+    def finish(self):
+        self.info(bold('writing additional files...'), nonl=1)
+
+        # the global general index
+
+        if self.config.html_use_index:
+            # the total count of lines for each index letter, used to distribute
+            # the entries into two columns
+            genindex = self.env.create_index(self)
+            indexcounts = []
+            for _, entries in genindex:
+                indexcounts.append(sum(1 + len(subitems)
+                                       for _, (_, subitems) in entries))
+
+            genindexcontext = dict(
+                genindexentries = genindex,
+                genindexcounts = indexcounts,
+                split_index = self.config.html_split_index,
+            )
+            self.info(' genindex', nonl=1)
+
+            if self.config.html_split_index:
+                self.handle_page('genindex', genindexcontext, 'genindex-split.html')
+                self.handle_page('genindex-all', genindexcontext, 'genindex.html')
+                for (key, entries), count in zip(genindex, indexcounts):
+                    ctx = {'key': key, 'entries': entries, 'count': count,
+                           'genindexentries': genindex}
+                    self.handle_page('genindex-' + key, ctx, 'genindex-single.html')
+            else:
+                self.handle_page('genindex', genindexcontext, 'genindex.html')
+
+        # the global module index
+
+        if self.config.html_use_modindex and self.env.modules:
+            # the sorted list of all modules, for the global module index
+            modules = sorted(((mn, (self.get_relative_uri('modindex', fn) +
+                                    '#module-' + mn, sy, pl, dep))
+                              for (mn, (fn, sy, pl, dep)) in
+                              self.env.modules.iteritems()),
+                             key=lambda x: x[0].lower())
+            # collect all platforms
+            platforms = set()
+            # sort out collapsable modules
+            modindexentries = []
+            letters = []
+            pmn = ''
+            num_toplevels = 0
+            num_collapsables = 0
+            cg = 0 # collapse group
+            fl = '' # first letter
+            for mn, (fn, sy, pl, dep) in modules:
+                pl = pl and pl.split(', ') or []
+                platforms.update(pl)
+                if fl != mn[0].lower() and mn[0] != '_':
+                    # heading
+                    modindexentries.append(['', False, 0, False,
+                                            mn[0].upper(), '', [], False])
+                    letters.append(mn[0].upper())
+                tn = mn.split('.')[0]
+                if tn != mn:
+                    # submodule
+                    if pmn == tn:
+                        # first submodule - make parent collapsable
+                        modindexentries[-1][1] = True
+                        num_collapsables += 1
+                    elif not pmn.startswith(tn):
+                        # submodule without parent in list, add dummy entry
+                        cg += 1
+                        modindexentries.append([tn, True, cg, False, '', '', [], False])
+                else:
+                    num_toplevels += 1
+                    cg += 1
+                modindexentries.append([mn, False, cg, (tn != mn), fn, sy, pl, dep])
+                pmn = mn
+                fl = mn[0].lower()
+            platforms = sorted(platforms)
+
+            # apply heuristics when to collapse modindex at page load:
+            # only collapse if number of toplevel modules is larger than
+            # number of submodules
+            collapse = len(modules) - num_toplevels < num_toplevels
+
+            modindexcontext = dict(
+                modindexentries = modindexentries,
+                platforms = platforms,
+                letters = letters,
+                collapse_modindex = collapse,
+            )
+            self.info(' modindex', nonl=1)
+            self.handle_page('modindex', modindexcontext, 'modindex.html')
+
+        # the search page
+        if self.name != 'htmlhelp':
+            self.info(' search', nonl=1)
+            self.handle_page('search', {}, 'search.html')
+
+        # additional pages from conf.py
+        for pagename, template in self.config.html_additional_pages.items():
+            self.info(' '+pagename, nonl=1)
+            self.handle_page(pagename, {}, template)
+
+        if self.config.html_use_opensearch and self.name != 'htmlhelp':
+            self.info(' opensearch', nonl=1)
+            fn = path.join(self.outdir, '_static', 'opensearch.xml')
+            self.handle_page('opensearch', {}, 'opensearch.xml', outfilename=fn)
+
+        self.info()
+
+        # copy image files
+        if self.images:
+            self.info(bold('copying images...'), nonl=True)
+            ensuredir(path.join(self.outdir, '_images'))
+            for src, dest in self.images.iteritems():
+                self.info(' '+src, nonl=1)
+                shutil.copyfile(path.join(self.srcdir, src),
+                                path.join(self.outdir, '_images', dest))
+            self.info()
+
+        # copy static files
+        self.info(bold('copying static files... '), nonl=True)
+        ensuredir(path.join(self.outdir, '_static'))
+        # first, create pygments style file
+        f = open(path.join(self.outdir, '_static', 'pygments.css'), 'w')
+        f.write(PygmentsBridge('html', self.config.pygments_style).get_stylesheet())
+        f.close()
+        # then, copy translations JavaScript file
+        if self.config.language is not None:
+            jsfile = path.join(path.dirname(__file__), 'locale', self.config.language,
+                               'LC_MESSAGES', 'sphinx.js')
+            if path.isfile(jsfile):
+                shutil.copyfile(jsfile, path.join(self.outdir, '_static',
+                                                  'translations.js'))
+        # then, copy over all user-supplied static files
+        staticdirnames = [path.join(path.dirname(__file__), 'static')] + \
+                         [path.join(self.confdir, spath)
+                          for spath in self.config.html_static_path]
+        for staticdirname in staticdirnames:
+            for filename in os.listdir(staticdirname):
+                if filename.startswith('.'):
+                    continue
+                fullname = path.join(staticdirname, filename)
+                targetname = path.join(self.outdir, '_static', filename)
+                if path.isfile(fullname):
+                    shutil.copyfile(fullname, targetname)
+                elif path.isdir(fullname):
+                    if filename in self.config.exclude_dirnames:
+                        continue
+                    if path.exists(targetname):
+                        shutil.rmtree(targetname)
+                    shutil.copytree(fullname, targetname)
+        # last, copy logo file (handled differently)
+        if self.config.html_logo:
+            logobase = path.basename(self.config.html_logo)
+            shutil.copyfile(path.join(self.confdir, self.config.html_logo),
+                            path.join(self.outdir, '_static', logobase))
+        self.info('done')
+
+        # dump the search index
+        self.handle_finish()
+
+    def get_outdated_docs(self):
+        if self.templates:
+            template_mtime = self.templates.newest_template_mtime()
+        else:
+            template_mtime = 0
+        for docname in self.env.found_docs:
+            if docname not in self.env.all_docs:
+                yield docname
+                continue
+            targetname = self.env.doc2path(docname, self.outdir, self.out_suffix)
+            try:
+                targetmtime = path.getmtime(targetname)
+            except Exception:
+                targetmtime = 0
+            try:
+                srcmtime = max(path.getmtime(self.env.doc2path(docname)),
+                               template_mtime)
+                if srcmtime > targetmtime:
+                    yield docname
+            except EnvironmentError:
+                # source doesn't exist anymore
+                pass
+
+    def load_indexer(self, docnames):
+        keep = set(self.env.all_docs) - set(docnames)
+        try:
+            f = open(path.join(self.outdir, self.searchindex_filename), 'rb')
+            try:
+                self.indexer.load(f, self.indexer_format)
+            finally:
+                f.close()
+        except (IOError, OSError, ValueError):
+            if keep:
+                self.warn("search index couldn't be loaded, but not all documents "
+                          "will be built: the index will be incomplete.")
+        # delete all entries for files that will be rebuilt
+        self.indexer.prune(keep)
+
+    def index_page(self, pagename, doctree, title):
+        # only index pages with title
+        if self.indexer is not None and title:
+            self.indexer.feed(pagename, title, doctree)
+
+    # --------- these are overwritten by the serialization builder
+
+    def get_target_uri(self, docname, typ=None):
+        return docname + self.out_suffix
+
+    def handle_page(self, pagename, addctx, templatename='page.html',
+                    outfilename=None, event_arg=None):
+        ctx = self.globalcontext.copy()
+        # current_page_name is backwards compatibility
+        ctx['pagename'] = ctx['current_page_name'] = pagename
+
+        def pathto(otheruri, resource=False,
+                   baseuri=self.get_target_uri(pagename)):
+            if not resource:
+                otheruri = self.get_target_uri(otheruri)
+            return relative_uri(baseuri, otheruri)
+        ctx['pathto'] = pathto
+        ctx['hasdoc'] = lambda name: name in self.env.all_docs
+        ctx['customsidebar'] = self.config.html_sidebars.get(pagename)
+        ctx.update(addctx)
+
+        self.app.emit('html-page-context', pagename, templatename, ctx, event_arg)
+
+        output = self.templates.render(templatename, ctx)
+        if not outfilename:
+            outfilename = path.join(self.outdir, os_path(pagename) + self.out_suffix)
+        ensuredir(path.dirname(outfilename)) # normally different from self.outdir
+        try:
+            f = codecs.open(outfilename, 'w', 'utf-8')
+            try:
+                f.write(output)
+            finally:
+                f.close()
+        except (IOError, OSError), err:
+            self.warn("Error writing file %s: %s" % (outfilename, err))
+        if self.copysource and ctx.get('sourcename'):
+            # copy the source file for the "show source" link
+            source_name = path.join(self.outdir, '_sources', os_path(ctx['sourcename']))
+            ensuredir(path.dirname(source_name))
+            shutil.copyfile(self.env.doc2path(pagename), source_name)
+
+    def handle_finish(self):
+        self.info(bold('dumping search index... '), nonl=True)
+        self.indexer.prune(self.env.all_docs)
+        f = open(path.join(self.outdir, self.searchindex_filename), 'wb')
+        try:
+            self.indexer.dump(f, self.indexer_format)
+        finally:
+            f.close()
+        self.info('done')
+
+        self.info(bold('dumping object inventory... '), nonl=True)
+        f = open(path.join(self.outdir, INVENTORY_FILENAME), 'w')
+        try:
+            f.write('# Sphinx inventory version 1\n')
+            f.write('# Project: %s\n' % self.config.project.encode('utf-8'))
+            f.write('# Version: %s\n' % self.config.version)
+            for modname, info in self.env.modules.iteritems():
+                f.write('%s mod %s\n' % (modname, self.get_target_uri(info[0])))
+            for refname, (docname, desctype) in self.env.descrefs.iteritems():
+                f.write('%s %s %s\n' % (refname, desctype, self.get_target_uri(docname)))
+        finally:
+            f.close()
+        self.info('done')
+
+
+class SerializingHTMLBuilder(StandaloneHTMLBuilder):
+    """
+    An abstract builder that serializes the HTML generated.
+    """
+    #: the serializing implementation to use.  Set this to a module that
+    #: implements a `dump`, `load`, `dumps` and `loads` functions
+    #: (pickle, simplejson etc.)
+    implementation = None
+
+    #: the filename for the global context file
+    globalcontext_filename = None
+
+    supported_image_types = ('image/svg+xml', 'image/png', 'image/gif',
+                             'image/jpeg')
+
+    def init(self):
+        self.init_translator_class()
+        self.templates = None   # no template bridge necessary
+
+    def get_target_uri(self, docname, typ=None):
+        if docname == 'index':
+            return ''
+        if docname.endswith(SEP + 'index'):
+            return docname[:-5] # up to sep
+        return docname + SEP
+
+    def handle_page(self, pagename, ctx, templatename='page.html',
+                    outfilename=None, event_arg=None):
+        ctx['current_page_name'] = pagename
+        sidebarfile = self.config.html_sidebars.get(pagename)
+        if sidebarfile:
+            ctx['customsidebar'] = sidebarfile
+
+        if not outfilename:
+            outfilename = path.join(self.outdir, os_path(pagename) + self.out_suffix)
+
+        self.app.emit('html-page-context', pagename, templatename, ctx, event_arg)
+
+        ensuredir(path.dirname(outfilename))
+        f = open(outfilename, 'wb')
+        try:
+            self.implementation.dump(ctx, f, 2)
+        finally:
+            f.close()
+
+        # if there is a source file, copy the source file for the
+        # "show source" link
+        if ctx.get('sourcename'):
+            source_name = path.join(self.outdir, '_sources',
+                                    os_path(ctx['sourcename']))
+            ensuredir(path.dirname(source_name))
+            shutil.copyfile(self.env.doc2path(pagename), source_name)
+
+    def handle_finish(self):
+        # dump the global context
+        outfilename = path.join(self.outdir, self.globalcontext_filename)
+        f = open(outfilename, 'wb')
+        try:
+            self.implementation.dump(self.globalcontext, f, 2)
+        finally:
+            f.close()
+
+        # super here to dump the search index
+        StandaloneHTMLBuilder.handle_finish(self)
+
+        # copy the environment file from the doctree dir to the output dir
+        # as needed by the web app
+        shutil.copyfile(path.join(self.doctreedir, ENV_PICKLE_FILENAME),
+                        path.join(self.outdir, ENV_PICKLE_FILENAME))
+
+        # touch 'last build' file, used by the web application to determine
+        # when to reload its environment and clear the cache
+        open(path.join(self.outdir, LAST_BUILD_FILENAME), 'w').close()
+
+
+class PickleHTMLBuilder(SerializingHTMLBuilder):
+    """
+    A Builder that dumps the generated HTML into pickle files.
+    """
+    implementation = pickle
+    indexer_format = pickle
+    name = 'pickle'
+    out_suffix = '.fpickle'
+    globalcontext_filename = 'globalcontext.pickle'
+    searchindex_filename = 'searchindex.pickle'
+
+
+class JSONHTMLBuilder(SerializingHTMLBuilder):
+    """
+    A builder that dumps the generated HTML into JSON files.
+    """
+    implementation = json
+    indexer_format = json
+    name = 'json'
+    out_suffix = '.fjson'
+    globalcontext_filename = 'globalcontext.json'
+    searchindex_filename = 'searchindex.json'
+
+    def init(self):
+        if json is None:
+            from sphinx.application import SphinxError
+            raise SphinxError('The module simplejson (or json in Python >= 2.6) '
+                              'is not available. The JSONHTMLBuilder builder '
+                              'will not work.')
+        SerializingHTMLBuilder.init(self)
+
+
+class HTMLHelpBuilder(StandaloneHTMLBuilder):
+    """
+    Builder that also outputs Windows HTML help project, contents and index files.
+    Adapted from the original Doc/tools/prechm.py.
+    """
+    name = 'htmlhelp'
+
+    # don't copy the reST source
+    copysource = False
+    supported_image_types = ['image/png', 'image/gif', 'image/jpeg']
+
+    # don't add links
+    add_header_links = False
+    add_definition_links = False
+
+    def init(self):
+        StandaloneHTMLBuilder.init(self)
+        # the output files for HTML help must be .html only
+        self.out_suffix = '.html'
+
+    def handle_finish(self):
+        build_hhx(self, self.outdir, self.config.htmlhelp_basename)
+
+
+class LaTeXBuilder(Builder):
+    """
+    Builds LaTeX output to create PDF.
+    """
+    name = 'latex'
+    supported_image_types = ['application/pdf', 'image/png', 'image/gif',
+                             'image/jpeg']
+
+    def init(self):
+        self.docnames = []
+        self.document_data = []
+        texescape.init()
+
+    def get_outdated_docs(self):
+        return 'all documents' # for now
+
+    def get_target_uri(self, docname, typ=None):
+        if typ == 'token':
+            # token references are always inside production lists and must be
+            # replaced by \token{} in LaTeX
+            return '@token'
+        if docname not in self.docnames:
+            raise NoUri
+        else:
+            return ''
+
+    def init_document_data(self):
+        preliminary_document_data = map(list, self.config.latex_documents)
+        if not preliminary_document_data:
+            self.warn('No "latex_documents" config value found; no documents '
+                      'will be written.')
+            return
+        # assign subdirs to titles
+        self.titles = []
+        for entry in preliminary_document_data:
+            docname = entry[0]
+            if docname not in self.env.all_docs:
+                self.warn('"latex_documents" config value references unknown '
+                          'document %s' % docname)
+                continue
+            self.document_data.append(entry)
+            if docname.endswith(SEP+'index'):
+                docname = docname[:-5]
+            self.titles.append((docname, entry[2]))
+
+    def write(self, *ignored):
+        # first, assemble the "appendix" docs that are in every PDF
+        appendices = []
+        for fname in self.config.latex_appendices:
+            appendices.append(self.env.get_doctree(fname))
+
+        docwriter = LaTeXWriter(self)
+        docsettings = OptionParser(
+            defaults=self.env.settings,
+            components=(docwriter,)).get_default_values()
+
+        self.init_document_data()
+
+        for entry in self.document_data:
+            docname, targetname, title, author, docclass = entry[:5]
+            toctree_only = False
+            if len(entry) > 5:
+                toctree_only = entry[5]
+            destination = FileOutput(
+                destination_path=path.join(self.outdir, targetname),
+                encoding='utf-8')
+            self.info("processing " + targetname + "... ", nonl=1)
+            doctree = self.assemble_doctree(docname, toctree_only,
+                appendices=(docclass == 'manual') and appendices or [])
+            self.post_process_images(doctree)
+            self.info("writing... ", nonl=1)
+            doctree.settings = docsettings
+            doctree.settings.author = author
+            doctree.settings.title = title
+            doctree.settings.docname = docname
+            doctree.settings.docclass = docclass
+            docwriter.write(doctree, destination)
+            self.info("done")
+
+    def assemble_doctree(self, indexfile, toctree_only, appendices):
+        self.docnames = set([indexfile] + appendices)
+        self.info(darkgreen(indexfile) + " ", nonl=1)
+        def process_tree(docname, tree):
+            tree = tree.deepcopy()
+            for toctreenode in tree.traverse(addnodes.toctree):
+                newnodes = []
+                includefiles = map(str, toctreenode['includefiles'])
+                for includefile in includefiles:
+                    try:
+                        self.info(darkgreen(includefile) + " ", nonl=1)
+                        subtree = process_tree(includefile,
+                                               self.env.get_doctree(includefile))
+                        self.docnames.add(includefile)
+                    except Exception:
+                        self.warn('%s: toctree contains ref to nonexisting file %r' %
+                                  (docname, includefile))
+                    else:
+                        sof = addnodes.start_of_file()
+                        sof.children = subtree.children
+                        newnodes.append(sof)
+                toctreenode.parent.replace(toctreenode, newnodes)
+            return tree
+        tree = self.env.get_doctree(indexfile)
+        if toctree_only:
+            # extract toctree nodes from the tree and put them in a fresh document
+            new_tree = new_document('<latex output>')
+            new_sect = nodes.section()
+            new_sect += nodes.title(u'<Set title in conf.py>', u'<Set title in conf.py>')
+            new_tree += new_sect
+            for node in tree.traverse(addnodes.toctree):
+                new_sect += node
+            tree = new_tree
+        largetree = process_tree(indexfile, tree)
+        largetree.extend(appendices)
+        self.info()
+        self.info("resolving references...")
+        self.env.resolve_references(largetree, indexfile, self)
+        # resolve :ref:s to distant tex files -- we can't add a cross-reference,
+        # but append the document name
+        for pendingnode in largetree.traverse(addnodes.pending_xref):
+            docname = pendingnode['refdocname']
+            sectname = pendingnode['refsectname']
+            newnodes = [nodes.emphasis(sectname, sectname)]
+            for subdir, title in self.titles:
+                if docname.startswith(subdir):
+                    newnodes.append(nodes.Text(_(' (in '), _(' (in ')))
+                    newnodes.append(nodes.emphasis(title, title))
+                    newnodes.append(nodes.Text(')', ')'))
+                    break
+            else:
+                pass
+            pendingnode.replace_self(newnodes)
+        return largetree
+
+    def finish(self):
+        # copy image files
+        if self.images:
+            self.info(bold('copying images...'), nonl=1)
+            for src, dest in self.images.iteritems():
+                self.info(' '+src, nonl=1)
+                shutil.copyfile(path.join(self.srcdir, src),
+                                path.join(self.outdir, dest))
+            self.info()
+
+        # the logo is handled differently
+        if self.config.latex_logo:
+            logobase = path.basename(self.config.latex_logo)
+            shutil.copyfile(path.join(self.confdir, self.config.latex_logo),
+                            path.join(self.outdir, logobase))
+
+        self.info(bold('copying TeX support files... '), nonl=True)
+        staticdirname = path.join(path.dirname(__file__), 'texinputs')
+        for filename in os.listdir(staticdirname):
+            if not filename.startswith('.'):
+                shutil.copyfile(path.join(staticdirname, filename),
+                                path.join(self.outdir, filename))
+        self.info('done')
+
+
+class ChangesBuilder(Builder):
+    """
+    Write a summary with all versionadded/changed directives.
+    """
+    name = 'changes'
+
+    def init(self):
+        self.init_templates()
+
+    def get_outdated_docs(self):
+        return self.outdir
+
+    typemap = {
+        'versionadded': 'added',
+        'versionchanged': 'changed',
+        'deprecated': 'deprecated',
+    }
+
+    def write(self, *ignored):
+        version = self.config.version
+        libchanges = {}
+        apichanges = []
+        otherchanges = {}
+        if version not in self.env.versionchanges:
+            self.info(bold('no changes in this version.'))
+            return
+        self.info(bold('writing summary file...'))
+        for type, docname, lineno, module, descname, content in \
+                self.env.versionchanges[version]:
+            ttext = self.typemap[type]
+            context = content.replace('\n', ' ')
+            if descname and docname.startswith('c-api'):
+                if not descname:
+                    continue
+                if context:
+                    entry = '<b>%s</b>: <i>%s:</i> %s' % (descname, ttext, context)
+                else:
+                    entry = '<b>%s</b>: <i>%s</i>.' % (descname, ttext)
+                apichanges.append((entry, docname, lineno))
+            elif descname or module:
+                if not module:
+                    module = _('Builtins')
+                if not descname:
+                    descname = _('Module level')
+                if context:
+                    entry = '<b>%s</b>: <i>%s:</i> %s' % (descname, ttext, context)
+                else:
+                    entry = '<b>%s</b>: <i>%s</i>.' % (descname, ttext)
+                libchanges.setdefault(module, []).append((entry, docname, lineno))
+            else:
+                if not context:
+                    continue
+                entry = '<i>%s:</i> %s' % (ttext.capitalize(), context)
+                title = self.env.titles[docname].astext()
+                otherchanges.setdefault((docname, title), []).append(
+                    (entry, docname, lineno))
+
+        ctx = {
+            'project': self.config.project,
+            'version': version,
+            'docstitle': self.config.html_title,
+            'shorttitle': self.config.html_short_title,
+            'libchanges': sorted(libchanges.iteritems()),
+            'apichanges': sorted(apichanges),
+            'otherchanges': sorted(otherchanges.iteritems()),
+            'show_sphinx': self.config.html_show_sphinx,
+        }
+        f = open(path.join(self.outdir, 'index.html'), 'w')
+        try:
+            f.write(self.templates.render('changes/frameset.html', ctx))
+        finally:
+            f.close()
+        f = open(path.join(self.outdir, 'changes.html'), 'w')
+        try:
+            f.write(self.templates.render('changes/versionchanges.html', ctx))
+        finally:
+            f.close()
+
+        hltext = ['.. versionadded:: %s' % version,
+                  '.. versionchanged:: %s' % version,
+                  '.. deprecated:: %s' % version]
+
+        def hl(no, line):
+            line = '<a name="L%s"> </a>' % no + escape(line)
+            for x in hltext:
+                if x in line:
+                    line = '<span class="hl">%s</span>' % line
+                    break
+            return line
+
+        self.info(bold('copying source files...'))
+        for docname in self.env.all_docs:
+            f = open(self.env.doc2path(docname))
+            lines = f.readlines()
+            targetfn = path.join(self.outdir, 'rst', os_path(docname)) + '.html'
+            ensuredir(path.dirname(targetfn))
+            f = codecs.open(targetfn, 'w', 'utf8')
+            try:
+                text = ''.join(hl(i+1, line) for (i, line) in enumerate(lines))
+                ctx = {'filename': self.env.doc2path(docname, None), 'text': text}
+                f.write(self.templates.render('changes/rstsource.html', ctx))
+            finally:
+                f.close()
+        shutil.copyfile(path.join(path.dirname(__file__), 'static', 'default.css'),
+                        path.join(self.outdir, 'default.css'))
+
+    def hl(self, text, version):
+        text = escape(text)
+        for directive in ['versionchanged', 'versionadded', 'deprecated']:
+            text = text.replace('.. %s:: %s' % (directive, version),
+                                '<b>.. %s:: %s</b>' % (directive, version))
+        return text
+
+    def finish(self):
+        pass
+
+
+class TextBuilder(Builder):
+    name = 'text'
+    out_suffix = '.txt'
+
+    def init(self):
+        pass
+
+    def get_outdated_docs(self):
+        for docname in self.env.found_docs:
+            if docname not in self.env.all_docs:
+                yield docname
+                continue
+            targetname = self.env.doc2path(docname, self.outdir, self.out_suffix)
+            try:
+                targetmtime = path.getmtime(targetname)
+            except Exception:
+                targetmtime = 0
+            try:
+                srcmtime = path.getmtime(self.env.doc2path(docname))
+                if srcmtime > targetmtime:
+                    yield docname
+            except EnvironmentError:
+                # source doesn't exist anymore
+                pass
+
+    def get_target_uri(self, docname, typ=None):
+        return ''
+
+    def prepare_writing(self, docnames):
+        self.writer = TextWriter(self)
+
+    def write_doc(self, docname, doctree):
+        destination = StringOutput(encoding='utf-8')
+        self.writer.write(doctree, destination)
+        outfilename = path.join(self.outdir, os_path(docname) + self.out_suffix)
+        ensuredir(path.dirname(outfilename)) # normally different from self.outdir
+        try:
+            f = codecs.open(outfilename, 'w', 'utf-8')
+            try:
+                f.write(self.writer.output)
+            finally:
+                f.close()
+        except (IOError, OSError), err:
+            self.warn("Error writing file %s: %s" % (outfilename, err))
+
+    def finish(self):
+        pass
+
+
+# compatibility alias
+WebHTMLBuilder = PickleHTMLBuilder
+
+
+from sphinx.linkcheck import CheckExternalLinksBuilder
+
+builtin_builders = {
+    'html': StandaloneHTMLBuilder,
+    'pickle': PickleHTMLBuilder,
+    'json': JSONHTMLBuilder,
+    'web': PickleHTMLBuilder,
+    'htmlhelp': HTMLHelpBuilder,
+    'latex': LaTeXBuilder,
+    'text': TextBuilder,
+    'changes': ChangesBuilder,
+    'linkcheck': CheckExternalLinksBuilder,
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/cmdline.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,186 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.cmdline
+    ~~~~~~~~~~~~~~
+
+    sphinx-build command-line handling.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import os
+import sys
+import getopt
+import traceback
+from os import path
+
+from docutils.utils import SystemMessage
+
+from sphinx import __version__
+from sphinx.application import Sphinx, SphinxError
+from sphinx.util import format_exception_cut_frames, save_traceback
+from sphinx.util.console import darkred, nocolor, color_terminal
+
+
+def usage(argv, msg=None):
+    if msg:
+        print >>sys.stderr, msg
+        print >>sys.stderr
+    print >>sys.stderr, """\
+Sphinx v%s
+Usage: %s [options] sourcedir outdir [filenames...]
+Options: -b <builder> -- builder to use; default is html
+         -a        -- write all files; default is to only write new and changed files
+         -E        -- don't use a saved environment, always read all files
+         -d <path> -- path for the cached environment and doctree files
+                      (default: outdir/.doctrees)
+         -c <path> -- path where configuration file (conf.py) is located
+                      (default: same as sourcedir)
+         -C        -- use no config file at all, only -D options
+         -D <setting=value> -- override a setting in configuration
+         -A <name=value>    -- pass a value into the templates, for HTML builder
+         -N        -- do not do colored output
+         -q        -- no output on stdout, just warnings on stderr
+         -Q        -- no output at all, not even warnings
+         -P        -- run Pdb on exception
+Modi:
+* without -a and without filenames, write new and changed files.
+* with -a, write all files.
+* with filenames, write these.""" % (__version__, argv[0])
+
+
+def main(argv):
+    if not sys.stdout.isatty() or not color_terminal():
+        # Windows' poor cmd box doesn't understand ANSI sequences
+        nocolor()
+
+    try:
+        opts, args = getopt.getopt(argv[1:], 'ab:d:c:CD:A:NEqP')
+        allopts = set(opt[0] for opt in opts)
+        srcdir = confdir = path.abspath(args[0])
+        if not path.isdir(srcdir):
+            print >>sys.stderr, 'Error: Cannot find source directory.'
+            return 1
+        if not path.isfile(path.join(srcdir, 'conf.py')) and \
+               '-c' not in allopts and '-C' not in allopts:
+            print >>sys.stderr, 'Error: Source directory doesn\'t contain conf.py file.'
+            return 1
+        outdir = path.abspath(args[1])
+        if not path.isdir(outdir):
+            print >>sys.stderr, 'Making output directory...'
+            os.makedirs(outdir)
+    except (IndexError, getopt.error):
+        usage(argv)
+        return 1
+
+    filenames = args[2:]
+    err = 0
+    for filename in filenames:
+        if not path.isfile(filename):
+            print >>sys.stderr, 'Cannot find file %r.' % filename
+            err = 1
+    if err:
+        return 1
+
+    buildername = all_files = None
+    freshenv = use_pdb = False
+    status = sys.stdout
+    warning = sys.stderr
+    confoverrides = {}
+    htmlcontext = {}
+    doctreedir = path.join(outdir, '.doctrees')
+    for opt, val in opts:
+        if opt == '-b':
+            buildername = val
+        elif opt == '-a':
+            if filenames:
+                usage(argv, 'Cannot combine -a option and filenames.')
+                return 1
+            all_files = True
+        elif opt == '-d':
+            doctreedir = path.abspath(val)
+        elif opt == '-c':
+            confdir = path.abspath(val)
+            if not path.isfile(path.join(confdir, 'conf.py')):
+                print >>sys.stderr, \
+                      'Error: Configuration directory doesn\'t contain conf.py file.'
+                return 1
+        elif opt == '-C':
+            confdir = None
+        elif opt == '-D':
+            try:
+                key, val = val.split('=')
+            except ValueError:
+                print >>sys.stderr, \
+                      'Error: -D option argument must be in the form name=value.'
+                return 1
+            try:
+                val = int(val)
+            except ValueError:
+                pass
+            confoverrides[key] = val
+        elif opt == '-A':
+            try:
+                key, val = val.split('=')
+            except ValueError:
+                print >>sys.stderr, \
+                      'Error: -A option argument must be in the form name=value.'
+                return 1
+            try:
+                val = int(val)
+            except ValueError:
+                pass
+            htmlcontext[key] = val
+        elif opt == '-N':
+            nocolor()
+        elif opt == '-E':
+            freshenv = True
+        elif opt == '-q':
+            status = None
+        elif opt == '-Q':
+            status = None
+            warning = None
+        elif opt == '-P':
+            use_pdb = True
+    confoverrides['html_context'] = htmlcontext
+
+    try:
+        app = Sphinx(srcdir, confdir, outdir, doctreedir, buildername,
+                     confoverrides, status, warning, freshenv)
+        app.build(all_files, filenames)
+        return app.statuscode
+    except KeyboardInterrupt:
+        if use_pdb:
+            import pdb
+            print >>sys.stderr, darkred('Interrupted while building, starting debugger:')
+            traceback.print_exc()
+            pdb.post_mortem(sys.exc_info()[2])
+        return 1
+    except Exception, err:
+        if use_pdb:
+            import pdb
+            print >>sys.stderr, darkred('Exception occurred while building, '
+                                        'starting debugger:')
+            traceback.print_exc()
+            pdb.post_mortem(sys.exc_info()[2])
+        else:
+            if isinstance(err, SystemMessage):
+                print >>sys.stderr, darkred('reST markup error:')
+                print >>sys.stderr, err.args[0].encode('ascii', 'backslashreplace')
+            elif isinstance(err, SphinxError):
+                print >>sys.stderr, darkred('%s:' % err.category)
+                print >>sys.stderr, err
+            else:
+                print >>sys.stderr, darkred('Exception occurred:')
+                print >>sys.stderr, format_exception_cut_frames().rstrip()
+                tbpath = save_traceback()
+                print >>sys.stderr, darkred('The full traceback has been saved '
+                                            'in %s, if you want to report the '
+                                            'issue to the author.' % tbpath)
+                print >>sys.stderr, ('Please also report this if it was a user '
+                                     'error, so that a better error message '
+                                     'can be provided next time.')
+                print >>sys.stderr, ('Send reports to sphinx-dev@googlegroups.com. '
+                                     'Thanks!')
+            return 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/config.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,140 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.config
+    ~~~~~~~~~~~~~
+
+    Build configuration file handling.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD license.
+"""
+
+import os
+from os import path
+
+
+class Config(object):
+    """Configuration file abstraction."""
+
+    # the values are: (default, needs fresh doctrees if changed)
+
+    # If you add a value here, don't forget to include it in the
+    # quickstart.py file template as well as in the docs!
+
+    config_values = dict(
+        # general options
+        project = ('Python', True),
+        copyright = ('', False),
+        version = ('', True),
+        release = ('', True),
+        today = ('', True),
+        today_fmt = (None, True),  # the real default is locale-dependent
+
+        language = (None, True),
+        locale_dirs = ([], True),
+
+        master_doc = ('contents', True),
+        source_suffix = ('.rst', True),
+        source_encoding = ('utf-8', True),
+        unused_docs = ([], True),
+        exclude_dirs = ([], True),
+        exclude_trees = ([], True),
+        exclude_dirnames = ([], True),
+        default_role = (None, True),
+        add_function_parentheses = (True, True),
+        add_module_names = (True, True),
+        show_authors = (False, True),
+        pygments_style = ('sphinx', False),
+        highlight_language = ('python', False),
+        templates_path = ([], False),
+        template_bridge = (None, False),
+        keep_warnings = (False, True),
+
+        # HTML options
+        html_title = (lambda self: '%s v%s documentation' %
+                                   (self.project, self.release),
+                      False),
+        html_short_title = (lambda self: self.html_title, False),
+        html_style = ('default.css', False),
+        html_logo = (None, False),
+        html_favicon = (None, False),
+        html_static_path = ([], False),
+        html_last_updated_fmt = (None, False),  # the real default is locale-dependent
+        html_use_smartypants = (True, False),
+        html_translator_class = (None, False),
+        html_sidebars = ({}, False),
+        html_additional_pages = ({}, False),
+        html_use_modindex = (True, False),
+        html_use_index = (True, False),
+        html_split_index = (False, False),
+        html_copy_source = (True, False),
+        html_use_opensearch = ('', False),
+        html_file_suffix = (None, False),
+        html_show_sphinx = (True, False),
+        html_context = ({}, False),
+
+        # HTML help only options
+        htmlhelp_basename = ('pydoc', False),
+
+        # LaTeX options
+        latex_documents = ([], False),
+        latex_logo = (None, False),
+        latex_appendices = ([], False),
+        latex_use_parts = (False, False),
+        latex_use_modindex = (True, False),
+        # paper_size and font_size are still separate values
+        # so that you can give them easily on the command line
+        latex_paper_size = ('letter', False),
+        latex_font_size = ('10pt', False),
+        latex_elements = ({}, False),
+        # now deprecated - use latex_elements
+        latex_preamble = ('', False),
+    )
+
+    def __init__(self, dirname, filename, overrides):
+        self.overrides = overrides
+        self.values = Config.config_values.copy()
+        config = {}
+        if dirname is not None:
+            config['__file__'] = path.join(dirname, filename)
+            olddir = os.getcwd()
+            try:
+                os.chdir(dirname)
+                execfile(config['__file__'], config)
+            finally:
+                os.chdir(olddir)
+        self._raw_config = config
+        # these two must be preinitialized because extensions can add their
+        # own config values
+        self.setup = config.get('setup', None)
+        self.extensions = config.get('extensions', [])
+
+    def init_values(self):
+        config = self._raw_config
+        config.update(self.overrides)
+        for name in config:
+            if name in self.values:
+                self.__dict__[name] = config[name]
+        del self._raw_config
+
+    def __getattr__(self, name):
+        if name.startswith('_'):
+            raise AttributeError(name)
+        if name not in self.values:
+            raise AttributeError('No such config value: %s' % name)
+        default = self.values[name][0]
+        if callable(default):
+            return default(self)
+        return default
+
+    def __getitem__(self, name):
+        return getattr(self, name)
+
+    def __setitem__(self, name, value):
+        setattr(self, name, value)
+
+    def __delitem__(self, name):
+        delattr(self, name)
+
+    def __contains__(self, name):
+        return name in self.values
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/directives/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,14 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.directives
+    ~~~~~~~~~~~~~~~~~
+
+    Handlers for additional ReST directives.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from sphinx.directives.desc import *
+from sphinx.directives.code import *
+from sphinx.directives.other import *
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/directives/code.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.directives.code
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import sys
+import codecs
+from os import path
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx import addnodes
+
+
+# ------ highlight directive --------------------------------------------------------
+
+def highlightlang_directive(name, arguments, options, content, lineno,
+                            content_offset, block_text, state, state_machine):
+    if 'linenothreshold' in options:
+        try:
+            linenothreshold = int(options['linenothreshold'])
+        except Exception:
+            linenothreshold = 10
+    else:
+        linenothreshold = sys.maxint
+    return [addnodes.highlightlang(lang=arguments[0].strip(),
+                                   linenothreshold=linenothreshold)]
+
+highlightlang_directive.content = 0
+highlightlang_directive.arguments = (1, 0, 0)
+highlightlang_directive.options = {'linenothreshold': directives.unchanged}
+directives.register_directive('highlight', highlightlang_directive)
+directives.register_directive('highlightlang', highlightlang_directive) # old name
+
+
+# ------ code-block directive -------------------------------------------------------
+
+def codeblock_directive(name, arguments, options, content, lineno,
+                        content_offset, block_text, state, state_machine):
+    code = u'\n'.join(content)
+    literal = nodes.literal_block(code, code)
+    literal['language'] = arguments[0]
+    literal['linenos'] = 'linenos' in options
+    return [literal]
+
+codeblock_directive.content = 1
+codeblock_directive.arguments = (1, 0, 0)
+codeblock_directive.options = {'linenos': directives.flag}
+directives.register_directive('code-block', codeblock_directive)
+directives.register_directive('sourcecode', codeblock_directive)
+
+
+# ------ literalinclude directive ---------------------------------------------------
+
+def literalinclude_directive(name, arguments, options, content, lineno,
+                             content_offset, block_text, state, state_machine):
+    """Like .. include:: :literal:, but only warns if the include file is not found."""
+    if not state.document.settings.file_insertion_enabled:
+        return [state.document.reporter.warning('File insertion disabled', line=lineno)]
+    env = state.document.settings.env
+    rel_fn = arguments[0]
+    source_dir = path.dirname(path.abspath(state_machine.input_lines.source(
+        lineno - state_machine.input_offset - 1)))
+    fn = path.normpath(path.join(source_dir, rel_fn))
+
+    encoding = options.get('encoding', env.config.source_encoding)
+    try:
+        f = codecs.open(fn, 'r', encoding)
+        text = f.read()
+        f.close()
+    except (IOError, OSError):
+        retnode = state.document.reporter.warning(
+            'Include file %r not found or reading it failed' % arguments[0], line=lineno)
+    except UnicodeError:
+        retnode = state.document.reporter.warning(
+            'Encoding %r used for reading included file %r seems to '
+            'be wrong, try giving an :encoding: option' %
+            (encoding, arguments[0]))
+    else:
+        retnode = nodes.literal_block(text, text, source=fn)
+        retnode.line = 1
+        if options.get('language', ''):
+            retnode['language'] = options['language']
+        if 'linenos' in options:
+            retnode['linenos'] = True
+        state.document.settings.env.note_dependency(rel_fn)
+    return [retnode]
+
+literalinclude_directive.options = {'linenos': directives.flag,
+                                    'language': directives.unchanged,
+                                    'encoding': directives.encoding}
+literalinclude_directive.content = 0
+literalinclude_directive.arguments = (1, 0, 0)
+directives.register_directive('literalinclude', literalinclude_directive)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/directives/desc.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,592 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.directives.desc
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import string
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx import addnodes
+from sphinx.util import ws_re
+
+
+# ------ information units ---------------------------------------------------------
+
+def desc_index_text(desctype, module, name, add_modules):
+    if desctype == 'function':
+        if not module:
+            return _('%s() (built-in function)') % name
+        return _('%s() (in module %s)') % (name, module)
+    elif desctype == 'data':
+        if not module:
+            return _('%s (built-in variable)') % name
+        return _('%s (in module %s)') % (name, module)
+    elif desctype == 'class':
+        if not module:
+            return _('%s (built-in class)') % name
+        return _('%s (class in %s)') % (name, module)
+    elif desctype == 'exception':
+        return name
+    elif desctype == 'method':
+        try:
+            clsname, methname = name.rsplit('.', 1)
+        except ValueError:
+            if module:
+                return _('%s() (in module %s)') % (name, module)
+            else:
+                return '%s()' % name
+        if module and add_modules:
+            return _('%s() (%s.%s method)') % (methname, module, clsname)
+        else:
+            return _('%s() (%s method)') % (methname, clsname)
+    elif desctype == 'staticmethod':
+        try:
+            clsname, methname = name.rsplit('.', 1)
+        except ValueError:
+            if module:
+                return _('%s() (in module %s)') % (name, module)
+            else:
+                return '%s()' % name
+        if module and add_modules:
+            return _('%s() (%s.%s static method)') % (methname, module, clsname)
+        else:
+            return _('%s() (%s static method)') % (methname, clsname)
+    elif desctype == 'attribute':
+        try:
+            clsname, attrname = name.rsplit('.', 1)
+        except ValueError:
+            if module:
+                return _('%s (in module %s)') % (name, module)
+            else:
+                return name
+        if module and add_modules:
+            return _('%s (%s.%s attribute)') % (attrname, module, clsname)
+        else:
+            return _('%s (%s attribute)') % (attrname, clsname)
+    elif desctype == 'cfunction':
+        return _('%s (C function)') % name
+    elif desctype == 'cmember':
+        return _('%s (C member)') % name
+    elif desctype == 'cmacro':
+        return _('%s (C macro)') % name
+    elif desctype == 'ctype':
+        return _('%s (C type)') % name
+    elif desctype == 'cvar':
+        return _('%s (C variable)') % name
+    else:
+        raise ValueError('unhandled descenv: %s' % desctype)
+
+
+# ------ make field lists (like :param foo:) in desc bodies prettier
+
+_ = lambda x: x  # make gettext extraction in constants possible
+
+doc_fields_with_arg = {
+    'param': '%param',
+    'parameter': '%param',
+    'arg': '%param',
+    'argument': '%param',
+    'keyword': '%param',
+    'kwarg': '%param',
+    'kwparam': '%param',
+    'type': '%type',
+    'raises': _('Raises'),
+    'raise': 'Raises',
+    'exception': 'Raises',
+    'except': 'Raises',
+    'var': _('Variable'),
+    'ivar': 'Variable',
+    'cvar': 'Variable',
+    'returns': _('Returns'),
+    'return': 'Returns',
+}
+
+doc_fields_with_linked_arg = ('raises', 'raise', 'exception', 'except')
+
+doc_fields_without_arg = {
+    'returns': 'Returns',
+    'return': 'Returns',
+    'rtype': _('Return type'),
+}
+
+del _
+
+
+def _is_only_paragraph(node):
+    # determine if the node only contains one paragraph (and system messages)
+    if len(node) == 0:
+        return False
+    elif len(node) > 1:
+        for subnode in node[1:]:
+            if not isinstance(subnode, nodes.system_message):
+                return False
+    if isinstance(node[0], nodes.paragraph):
+        return True
+    return False
+
+
+def handle_doc_fields(node, env):
+    # don't traverse, only handle field lists that are immediate children
+    for child in node.children:
+        if not isinstance(child, nodes.field_list):
+            continue
+        params = None
+        param_nodes = {}
+        param_types = {}
+        new_list = nodes.field_list()
+        for field in child:
+            fname, fbody = field
+            try:
+                typ, obj = fname.astext().split(None, 1)
+                typdesc = _(doc_fields_with_arg[typ])
+                if _is_only_paragraph(fbody):
+                    children = fbody.children[0].children
+                else:
+                    children = fbody.children
+                if typdesc == '%param':
+                    if not params:
+                        pfield = nodes.field()
+                        pfield += nodes.field_name('', _('Parameters'))
+                        pfield += nodes.field_body()
+                        params = nodes.bullet_list()
+                        pfield[1] += params
+                        new_list += pfield
+                    dlitem = nodes.list_item()
+                    dlpar = nodes.paragraph()
+                    dlpar += nodes.emphasis(obj, obj)
+                    dlpar += nodes.Text(' -- ', ' -- ')
+                    dlpar += children
+                    param_nodes[obj] = dlpar
+                    dlitem += dlpar
+                    params += dlitem
+                elif typdesc == '%type':
+                    typenodes = fbody.children
+                    if _is_only_paragraph(fbody):
+                        typenodes = [nodes.Text(' (')] + \
+                                    typenodes[0].children + [nodes.Text(')')]
+                    param_types[obj] = typenodes
+                else:
+                    fieldname = typdesc + ' '
+                    nfield = nodes.field()
+                    nfieldname = nodes.field_name(fieldname, fieldname)
+                    nfield += nfieldname
+                    node = nfieldname
+                    if typ in doc_fields_with_linked_arg:
+                        node = addnodes.pending_xref(obj, reftype='obj',
+                                                     refcaption=False,
+                                                     reftarget=obj,
+                                                     modname=env.currmodule,
+                                                     classname=env.currclass)
+                        nfieldname += node
+                    node += nodes.Text(obj, obj)
+                    nfield += nodes.field_body()
+                    nfield[1] += fbody.children
+                    new_list += nfield
+            except (KeyError, ValueError):
+                fnametext = fname.astext()
+                try:
+                    typ = _(doc_fields_without_arg[fnametext])
+                except KeyError:
+                    # at least capitalize the field name
+                    typ = fnametext.capitalize()
+                fname[0] = nodes.Text(typ)
+                new_list += field
+        for param, type in param_types.iteritems():
+            if param in param_nodes:
+                param_nodes[param][1:1] = type
+        child.replace_self(new_list)
+
+
+# ------ functions to parse a Python or C signature and create desc_* nodes.
+
+py_sig_re = re.compile(
+    r'''^ ([\w.]*\.)?            # class name(s)
+          (\w+)  \s*             # thing name
+          (?: \((.*)\)           # optional arguments
+          (\s* -> \s* .*)? )? $  # optional return annotation
+          ''', re.VERBOSE)
+
+py_paramlist_re = re.compile(r'([\[\],])')  # split at '[', ']' and ','
+
+def parse_py_signature(signode, sig, desctype, module, env):
+    """
+    Transform a python signature into RST nodes.
+    Return (fully qualified name of the thing, classname if any).
+
+    If inside a class, the current class name is handled intelligently:
+    * it is stripped from the displayed name if present
+    * it is added to the full name (return value) if not present
+    """
+    m = py_sig_re.match(sig)
+    if m is None:
+        raise ValueError
+    classname, name, arglist, retann = m.groups()
+
+    if retann:
+        retann = u' \N{RIGHTWARDS ARROW} ' + retann.strip()[2:]
+
+    if env.currclass:
+        add_module = False
+        if classname and classname.startswith(env.currclass):
+            fullname = classname + name
+            # class name is given again in the signature
+            classname = classname[len(env.currclass):].lstrip('.')
+        elif classname:
+            # class name is given in the signature, but different
+            # (shouldn't happen)
+            fullname = env.currclass + '.' + classname + name
+        else:
+            # class name is not given in the signature
+            fullname = env.currclass + '.' + name
+    else:
+        add_module = True
+        fullname = classname and classname + name or name
+
+    if desctype == 'staticmethod':
+        signode += addnodes.desc_annotation('static ', 'static ')
+
+    if classname:
+        signode += addnodes.desc_addname(classname, classname)
+    # exceptions are a special case, since they are documented in the
+    # 'exceptions' module.
+    elif add_module and env.config.add_module_names and \
+           module and module != 'exceptions':
+        nodetext = module + '.'
+        signode += addnodes.desc_addname(nodetext, nodetext)
+
+    signode += addnodes.desc_name(name, name)
+    if not arglist:
+        if desctype in ('function', 'method', 'staticmethod'):
+            # for callables, add an empty parameter list
+            signode += addnodes.desc_parameterlist()
+        if retann:
+            signode += addnodes.desc_type(retann, retann)
+        return fullname, classname
+    signode += addnodes.desc_parameterlist()
+
+    stack = [signode[-1]]
+    for token in py_paramlist_re.split(arglist):
+        if token == '[':
+            opt = addnodes.desc_optional()
+            stack[-1] += opt
+            stack.append(opt)
+        elif token == ']':
+            try:
+                stack.pop()
+            except IndexError:
+                raise ValueError
+        elif not token or token == ',' or token.isspace():
+            pass
+        else:
+            token = token.strip()
+            stack[-1] += addnodes.desc_parameter(token, token)
+    if len(stack) != 1:
+        raise ValueError
+    if retann:
+        signode += addnodes.desc_type(retann, retann)
+    return fullname, classname
+
+
+c_sig_re = re.compile(
+    r'''^([^(]*?)          # return type
+        ([\w:]+)  \s*      # thing name (colon allowed for C++ class names)
+        (?: \((.*)\) )?    # optionally arguments
+        (\s+const)? $      # const specifier
+    ''', re.VERBOSE)
+c_funcptr_sig_re = re.compile(
+    r'''^([^(]+?)          # return type
+        (\( [^()]+ \)) \s* # name in parentheses
+        \( (.*) \)         # arguments
+        (\s+const)? $      # const specifier
+    ''', re.VERBOSE)
+c_funcptr_name_re = re.compile(r'^\(\s*\*\s*(.*?)\s*\)$')
+
+# RE to split at word boundaries
+wsplit_re = re.compile(r'(\W+)')
+
+# These C types aren't described in the reference, so don't try to create
+# a cross-reference to them
+stopwords = set(('const', 'void', 'char', 'int', 'long', 'FILE', 'struct'))
+
+def parse_c_type(node, ctype):
+    # add cross-ref nodes for all words
+    for part in filter(None, wsplit_re.split(ctype)):
+        tnode = nodes.Text(part, part)
+        if part[0] in string.letters+'_' and part not in stopwords:
+            pnode = addnodes.pending_xref(
+                '', reftype='ctype', reftarget=part, modname=None, classname=None)
+            pnode += tnode
+            node += pnode
+        else:
+            node += tnode
+
+def parse_c_signature(signode, sig, desctype):
+    """Transform a C (or C++) signature into RST nodes."""
+    # first try the function pointer signature regex, it's more specific
+    m = c_funcptr_sig_re.match(sig)
+    if m is None:
+        m = c_sig_re.match(sig)
+    if m is None:
+        raise ValueError('no match')
+    rettype, name, arglist, const = m.groups()
+
+    signode += addnodes.desc_type('', '')
+    parse_c_type(signode[-1], rettype)
+    try:
+        classname, funcname = name.split('::', 1)
+        classname += '::'
+        signode += addnodes.desc_addname(classname, classname)
+        signode += addnodes.desc_name(funcname, funcname)
+        # name (the full name) is still both parts
+    except ValueError:
+        signode += addnodes.desc_name(name, name)
+    # clean up parentheses from canonical name
+    m = c_funcptr_name_re.match(name)
+    if m:
+        name = m.group(1)
+    if not arglist:
+        if desctype == 'cfunction':
+            # for functions, add an empty parameter list
+            signode += addnodes.desc_parameterlist()
+        return name
+
+    paramlist = addnodes.desc_parameterlist()
+    arglist = arglist.replace('`', '').replace('\\ ', '') # remove markup
+    # this messes up function pointer types, but not too badly ;)
+    args = arglist.split(',')
+    for arg in args:
+        arg = arg.strip()
+        param = addnodes.desc_parameter('', '', noemph=True)
+        try:
+            ctype, argname = arg.rsplit(' ', 1)
+        except ValueError:
+            # no argument name given, only the type
+            parse_c_type(param, arg)
+        else:
+            parse_c_type(param, ctype)
+            param += nodes.emphasis(' '+argname, ' '+argname)
+        paramlist += param
+    signode += paramlist
+    if const:
+        signode += addnodes.desc_addname(const, const)
+    return name
+
+
+option_desc_re = re.compile(
+    r'((?:/|-|--)[-_a-zA-Z0-9]+)(\s*.*?)(?=,\s+(?:/|-|--)|$)')
+
+def parse_option_desc(signode, sig):
+    """Transform an option description into RST nodes."""
+    count = 0
+    firstname = ''
+    for m in option_desc_re.finditer(sig):
+        optname, args = m.groups()
+        if count:
+            signode += addnodes.desc_addname(', ', ', ')
+        signode += addnodes.desc_name(optname, optname)
+        signode += addnodes.desc_addname(args, args)
+        if not count:
+            firstname = optname
+        count += 1
+    if not firstname:
+        raise ValueError
+    return firstname
+
+
+strip_backslash_re = re.compile(r'\\(?=[^\\])')
+
+def desc_directive(desctype, arguments, options, content, lineno,
+                   content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+    inode = addnodes.index(entries=[])
+    node = addnodes.desc()
+    node['desctype'] = desctype
+
+    noindex = ('noindex' in options)
+    node['noindex'] = noindex
+    # remove backslashes to support (dummy) escapes; helps Vim's highlighting
+    signatures = map(lambda s: strip_backslash_re.sub('', s.strip()),
+                     arguments[0].split('\n'))
+    names = []
+    clsname = None
+    module = options.get('module', env.currmodule)
+    for i, sig in enumerate(signatures):
+        # add a signature node for each signature in the current unit
+        # and add a reference target for it
+        sig = sig.strip()
+        signode = addnodes.desc_signature(sig, '')
+        signode['first'] = False
+        node.append(signode)
+        try:
+            if desctype in ('function', 'data', 'class', 'exception',
+                            'method', 'staticmethod', 'attribute'):
+                name, clsname = parse_py_signature(signode, sig, desctype, module, env)
+            elif desctype in ('cfunction', 'cmember', 'cmacro', 'ctype', 'cvar'):
+                name = parse_c_signature(signode, sig, desctype)
+            elif desctype == 'cmdoption':
+                optname = parse_option_desc(signode, sig)
+                if not noindex:
+                    targetname = optname.replace('/', '-')
+                    if env.currprogram:
+                        targetname = '-' + env.currprogram + targetname
+                    targetname = 'cmdoption' + targetname
+                    signode['ids'].append(targetname)
+                    state.document.note_explicit_target(signode)
+                    inode['entries'].append(
+                        ('pair', _('%scommand line option; %s') %
+                         ((env.currprogram and env.currprogram + ' ' or ''), sig),
+                         targetname, targetname))
+                    env.note_progoption(optname, targetname)
+                continue
+            elif desctype == 'describe':
+                signode.clear()
+                signode += addnodes.desc_name(sig, sig)
+                continue
+            else:
+                # another registered generic x-ref directive
+                rolename, indextemplate, parse_node = additional_xref_types[desctype]
+                if parse_node:
+                    fullname = parse_node(env, sig, signode)
+                else:
+                    signode.clear()
+                    signode += addnodes.desc_name(sig, sig)
+                    # normalize whitespace like xfileref_role does
+                    fullname = ws_re.sub('', sig)
+                if not noindex:
+                    targetname = '%s-%s' % (rolename, fullname)
+                    signode['ids'].append(targetname)
+                    state.document.note_explicit_target(signode)
+                    if indextemplate:
+                        indexentry = _(indextemplate) % (fullname,)
+                        indextype = 'single'
+                        colon = indexentry.find(':')
+                        if colon != -1:
+                            indextype = indexentry[:colon].strip()
+                            indexentry = indexentry[colon+1:].strip()
+                        inode['entries'].append((indextype, indexentry,
+                                                 targetname, targetname))
+                    env.note_reftarget(rolename, fullname, targetname)
+                # don't use object indexing below
+                continue
+        except ValueError, err:
+            # signature parsing failed
+            signode.clear()
+            signode += addnodes.desc_name(sig, sig)
+            continue             # we don't want an index entry here
+        # only add target and index entry if this is the first description of the
+        # function name in this desc block
+        if not noindex and name not in names:
+            fullname = (module and module + '.' or '') + name
+            # note target
+            if fullname not in state.document.ids:
+                signode['names'].append(fullname)
+                signode['ids'].append(fullname)
+                signode['first'] = (not names)
+                state.document.note_explicit_target(signode)
+                env.note_descref(fullname, desctype, lineno)
+            names.append(name)
+
+            indextext = desc_index_text(desctype, module, name,
+                                        env.config.add_module_names)
+            inode['entries'].append(('single', indextext, fullname, fullname))
+
+    subnode = addnodes.desc_content()
+    # needed for automatic qualification of members
+    clsname_set = False
+    if desctype in ('class', 'exception') and names:
+        env.currclass = names[0]
+        clsname_set = True
+    elif desctype in ('method', 'staticmethod', 'attribute') and \
+             clsname and not env.currclass:
+        env.currclass = clsname.strip('.')
+        clsname_set = True
+    # needed for association of version{added,changed} directives
+    if names:
+        env.currdesc = names[0]
+    state.nested_parse(content, content_offset, subnode)
+    handle_doc_fields(subnode, env)
+    if clsname_set:
+        env.currclass = None
+    env.currdesc = None
+    node.append(subnode)
+    return [inode, node]
+
+desc_directive.content = 1
+desc_directive.arguments = (1, 0, 1)
+desc_directive.options = {'noindex': directives.flag,
+                          'module': directives.unchanged}
+
+desctypes = [
+    # the Python ones
+    'function',
+    'data',
+    'class',
+    'method',
+    'staticmethod',
+    'attribute',
+    'exception',
+    # the C ones
+    'cfunction',
+    'cmember',
+    'cmacro',
+    'ctype',
+    'cvar',
+    # for command line options
+    'cmdoption',
+    # the generic one
+    'describe',
+    'envvar',
+]
+
+for _name in desctypes:
+    directives.register_directive(_name, desc_directive)
+
+_ = lambda x: x
+
+# Generic cross-reference types; they can be registered in the application;
+# the directives are either desc_directive or target_directive
+additional_xref_types = {
+    # directive name: (role name, index text, function to parse the desc node)
+    'envvar': ('envvar', _('environment variable; %s'), None),
+}
+
+del _
+
+
+# ------ target --------------------------------------------------------------------
+
+def target_directive(targettype, arguments, options, content, lineno,
+                     content_offset, block_text, state, state_machine):
+    """Generic target for user-defined cross-reference types."""
+    env = state.document.settings.env
+    rolename, indextemplate, foo = additional_xref_types[targettype]
+    # normalize whitespace in fullname like xfileref_role does
+    fullname = ws_re.sub('', arguments[0].strip())
+    targetname = '%s-%s' % (rolename, fullname)
+    node = nodes.target('', '', ids=[targetname])
+    state.document.note_explicit_target(node)
+    ret = [node]
+    if indextemplate:
+        indexentry = indextemplate % (fullname,)
+        indextype = 'single'
+        colon = indexentry.find(':')
+        if colon != -1:
+            indextype = indexentry[:colon].strip()
+            indexentry = indexentry[colon+1:].strip()
+        inode = addnodes.index(entries=[(indextype, indexentry, targetname, targetname)])
+        ret.insert(0, inode)
+    env.note_reftarget(rolename, fullname, targetname)
+    return ret
+
+target_directive.content = 0
+target_directive.arguments = (1, 0, 1)
+
+# note, the target directive is not registered here, it is used by the application
+# when registering additional xref types
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/directives/other.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,411 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.directives.other
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import posixpath
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx import addnodes
+from sphinx.locale import pairindextypes
+from sphinx.util import patfilter, ws_re, caption_ref_re
+from sphinx.util.compat import make_admonition
+
+
+# ------ the TOC tree ---------------------------------------------------------------
+
+def toctree_directive(name, arguments, options, content, lineno,
+                      content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+    suffix = env.config.source_suffix
+    dirname = posixpath.dirname(env.docname)
+    glob = 'glob' in options
+
+    ret = []
+    subnode = addnodes.toctree()
+    includefiles = []
+    includetitles = {}
+    all_docnames = env.found_docs.copy()
+    # don't add the currently visited file in catch-all patterns
+    all_docnames.remove(env.docname)
+    for entry in content:
+        if not entry:
+            continue
+        if not glob:
+            # look for explicit titles and documents ("Some Title <document>").
+            m = caption_ref_re.match(entry)
+            if m:
+                docname = m.group(2)
+                includetitles[docname] = m.group(1)
+            else:
+                docname = entry
+            # remove suffixes (backwards compatibility)
+            if docname.endswith(suffix):
+                docname = docname[:-len(suffix)]
+            # absolutize filenames
+            docname = posixpath.normpath(posixpath.join(dirname, docname))
+            if docname not in env.found_docs:
+                ret.append(state.document.reporter.warning(
+                    'toctree references unknown document %r' % docname, line=lineno))
+            else:
+                includefiles.append(docname)
+        else:
+            patname = posixpath.normpath(posixpath.join(dirname, entry))
+            docnames = sorted(patfilter(all_docnames, patname))
+            for docname in docnames:
+                all_docnames.remove(docname) # don't include it again
+                includefiles.append(docname)
+            if not docnames:
+                ret.append(state.document.reporter.warning(
+                    'toctree glob pattern %r didn\'t match any documents' % entry,
+                    line=lineno))
+    subnode['includefiles'] = includefiles
+    subnode['includetitles'] = includetitles
+    subnode['maxdepth'] = options.get('maxdepth', -1)
+    subnode['glob'] = glob
+    ret.append(subnode)
+    return ret
+
+toctree_directive.content = 1
+toctree_directive.options = {'maxdepth': int, 'glob': directives.flag}
+directives.register_directive('toctree', toctree_directive)
+
+
+# ------ section metadata ----------------------------------------------------------
+
+def module_directive(name, arguments, options, content, lineno,
+                     content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+    modname = arguments[0].strip()
+    noindex = 'noindex' in options
+    env.currmodule = modname
+    env.note_module(modname, options.get('synopsis', ''),
+                    options.get('platform', ''),
+                    'deprecated' in options)
+    modulenode = addnodes.module()
+    modulenode['modname'] = modname
+    modulenode['synopsis'] = options.get('synopsis', '')
+    targetnode = nodes.target('', '', ids=['module-' + modname])
+    state.document.note_explicit_target(targetnode)
+    ret = [modulenode, targetnode]
+    if 'platform' in options:
+        modulenode['platform'] = options['platform']
+        node = nodes.paragraph()
+        node += nodes.emphasis('', _('Platforms: '))
+        node += nodes.Text(options['platform'], options['platform'])
+        ret.append(node)
+    # the synopsis isn't printed; in fact, it is only used in the modindex currently
+    if not noindex:
+        indextext = _('%s (module)') % modname
+        inode = addnodes.index(entries=[('single', indextext,
+                                         'module-' + modname, modname)])
+        ret.insert(0, inode)
+    return ret
+
+module_directive.arguments = (1, 0, 0)
+module_directive.options = {'platform': lambda x: x,
+                            'synopsis': lambda x: x,
+                            'noindex': directives.flag,
+                            'deprecated': directives.flag}
+directives.register_directive('module', module_directive)
+
+
+def currentmodule_directive(name, arguments, options, content, lineno,
+                            content_offset, block_text, state, state_machine):
+    # This directive is just to tell people that we're documenting
+    # stuff in module foo, but links to module foo won't lead here.
+    env = state.document.settings.env
+    modname = arguments[0].strip()
+    if modname == 'None':
+        env.currmodule = None
+    else:
+        env.currmodule = modname
+    return []
+
+currentmodule_directive.arguments = (1, 0, 0)
+directives.register_directive('currentmodule', currentmodule_directive)
+
+
+def author_directive(name, arguments, options, content, lineno,
+                     content_offset, block_text, state, state_machine):
+    # Show authors only if the show_authors option is on
+    env = state.document.settings.env
+    if not env.config.show_authors:
+        return []
+    para = nodes.paragraph()
+    emph = nodes.emphasis()
+    para += emph
+    if name == 'sectionauthor':
+        text = _('Section author: ')
+    elif name == 'moduleauthor':
+        text = _('Module author: ')
+    else:
+        text = _('Author: ')
+    emph += nodes.Text(text, text)
+    inodes, messages = state.inline_text(arguments[0], lineno)
+    emph.extend(inodes)
+    return [para] + messages
+
+author_directive.arguments = (1, 0, 1)
+directives.register_directive('sectionauthor', author_directive)
+directives.register_directive('moduleauthor', author_directive)
+
+
+def program_directive(name, arguments, options, content, lineno,
+                      content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+    program = ws_re.sub('-', arguments[0].strip())
+    if program == 'None':
+        env.currprogram = None
+    else:
+        env.currprogram = program
+    return []
+
+program_directive.arguments = (1, 0, 1)
+directives.register_directive('program', program_directive)
+
+
+# ------ index markup --------------------------------------------------------------
+
+indextypes = [
+    'single', 'pair', 'triple',
+]
+
+def index_directive(name, arguments, options, content, lineno,
+                    content_offset, block_text, state, state_machine):
+    arguments = arguments[0].split('\n')
+    env = state.document.settings.env
+    targetid = 'index-%s' % env.index_num
+    env.index_num += 1
+    targetnode = nodes.target('', '', ids=[targetid])
+    state.document.note_explicit_target(targetnode)
+    indexnode = addnodes.index()
+    indexnode['entries'] = ne = []
+    for entry in arguments:
+        entry = entry.strip()
+        for type in pairindextypes:
+            if entry.startswith(type+':'):
+                value = entry[len(type)+1:].strip()
+                value = pairindextypes[type] + '; ' + value
+                ne.append(('pair', value, targetid, value))
+                break
+        else:
+            for type in indextypes:
+                if entry.startswith(type+':'):
+                    value = entry[len(type)+1:].strip()
+                    ne.append((type, value, targetid, value))
+                    break
+            # shorthand notation for single entries
+            else:
+                for value in entry.split(','):
+                    value = value.strip()
+                    if not value:
+                        continue
+                    ne.append(('single', value, targetid, value))
+    return [indexnode, targetnode]
+
+index_directive.arguments = (1, 0, 1)
+directives.register_directive('index', index_directive)
+
+# ------ versionadded/versionchanged -----------------------------------------------
+
+def version_directive(name, arguments, options, content, lineno,
+                      content_offset, block_text, state, state_machine):
+    node = addnodes.versionmodified()
+    node['type'] = name
+    node['version'] = arguments[0]
+    if len(arguments) == 2:
+        inodes, messages = state.inline_text(arguments[1], lineno+1)
+        node.extend(inodes)
+        if content:
+            state.nested_parse(content, content_offset, node)
+        ret = [node] + messages
+    else:
+        ret = [node]
+    env = state.document.settings.env
+    env.note_versionchange(node['type'], node['version'], node, lineno)
+    return ret
+
+version_directive.arguments = (1, 1, 1)
+version_directive.content = 1
+
+directives.register_directive('deprecated', version_directive)
+directives.register_directive('versionadded', version_directive)
+directives.register_directive('versionchanged', version_directive)
+
+
+# ------ see also ------------------------------------------------------------------
+
+def seealso_directive(name, arguments, options, content, lineno,
+                      content_offset, block_text, state, state_machine):
+    ret = make_admonition(
+        addnodes.seealso, name, [_('See also')], options, content,
+        lineno, content_offset, block_text, state, state_machine)
+    if arguments:
+        argnodes, msgs = state.inline_text(arguments[0], lineno)
+        para = nodes.paragraph()
+        para += argnodes
+        para += msgs
+        ret[0].insert(1, para)
+    return ret
+
+seealso_directive.content = 1
+seealso_directive.arguments = (0, 1, 1)
+directives.register_directive('seealso', seealso_directive)
+
+
+# ------ production list (for the reference) ---------------------------------------
+
+token_re = re.compile('`([a-z_]+)`')
+
+def token_xrefs(text, env):
+    retnodes = []
+    pos = 0
+    for m in token_re.finditer(text):
+        if m.start() > pos:
+            txt = text[pos:m.start()]
+            retnodes.append(nodes.Text(txt, txt))
+        refnode = addnodes.pending_xref(m.group(1))
+        refnode['reftype'] = 'token'
+        refnode['reftarget'] = m.group(1)
+        refnode['modname'] = env.currmodule
+        refnode['classname'] = env.currclass
+        refnode += nodes.literal(m.group(1), m.group(1), classes=['xref'])
+        retnodes.append(refnode)
+        pos = m.end()
+    if pos < len(text):
+        retnodes.append(nodes.Text(text[pos:], text[pos:]))
+    return retnodes
+
+def productionlist_directive(name, arguments, options, content, lineno,
+                             content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+    node = addnodes.productionlist()
+    messages = []
+    i = 0
+
+    for rule in arguments[0].split('\n'):
+        if i == 0 and ':' not in rule:
+            # production group
+            continue
+        i += 1
+        try:
+            name, tokens = rule.split(':', 1)
+        except ValueError:
+            break
+        subnode = addnodes.production()
+        subnode['tokenname'] = name.strip()
+        if subnode['tokenname']:
+            idname = 'grammar-token-%s' % subnode['tokenname']
+            if idname not in state.document.ids:
+                subnode['ids'].append(idname)
+            state.document.note_implicit_target(subnode, subnode)
+            env.note_reftarget('token', subnode['tokenname'], idname)
+        subnode.extend(token_xrefs(tokens, env))
+        node.append(subnode)
+    return [node] + messages
+
+productionlist_directive.content = 0
+productionlist_directive.arguments = (1, 0, 1)
+directives.register_directive('productionlist', productionlist_directive)
+
+
+# ------ glossary directive ---------------------------------------------------------
+
+def glossary_directive(name, arguments, options, content, lineno,
+                       content_offset, block_text, state, state_machine):
+    """Glossary with cross-reference targets for :term: roles."""
+    env = state.document.settings.env
+    node = addnodes.glossary()
+    state.nested_parse(content, content_offset, node)
+
+    # the content should be definition lists
+    dls = [child for child in node if isinstance(child, nodes.definition_list)]
+    # now, extract definition terms to enable cross-reference creation
+    for dl in dls:
+        dl['classes'].append('glossary')
+        for li in dl.children:
+            if not li.children or not isinstance(li[0], nodes.term):
+                continue
+            termtext = li.children[0].astext()
+            new_id = 'term-' + nodes.make_id(termtext)
+            if new_id in env.gloss_entries:
+                new_id = 'term-' + str(len(env.gloss_entries))
+            env.gloss_entries.add(new_id)
+            li[0]['names'].append(new_id)
+            li[0]['ids'].append(new_id)
+            state.document.settings.env.note_reftarget('term', termtext.lower(),
+                                                       new_id)
+            # add an index entry too
+            indexnode = addnodes.index()
+            indexnode['entries'] = [('single', termtext, new_id, termtext)]
+            li.insert(0, indexnode)
+    return [node]
+
+glossary_directive.content = 1
+glossary_directive.arguments = (0, 0, 0)
+directives.register_directive('glossary', glossary_directive)
+
+
+# ------ miscellaneous markup -------------------------------------------------------
+
+def centered_directive(name, arguments, options, content, lineno,
+                       content_offset, block_text, state, state_machine):
+    if not arguments:
+        return []
+    subnode = addnodes.centered()
+    inodes, messages = state.inline_text(arguments[0], lineno)
+    subnode.extend(inodes)
+    return [subnode] + messages
+
+centered_directive.arguments = (1, 0, 1)
+directives.register_directive('centered', centered_directive)
+
+
+def acks_directive(name, arguments, options, content, lineno,
+                   content_offset, block_text, state, state_machine):
+    node = addnodes.acks()
+    state.nested_parse(content, content_offset, node)
+    if len(node.children) != 1 or not isinstance(node.children[0], nodes.bullet_list):
+        return [state.document.reporter.warning('.. acks content is not a list',
+                                                line=lineno)]
+    return [node]
+
+acks_directive.content = 1
+acks_directive.arguments = (0, 0, 0)
+directives.register_directive('acks', acks_directive)
+
+
+def tabularcolumns_directive(name, arguments, options, content, lineno,
+                             content_offset, block_text, state, state_machine):
+    # support giving explicit tabulary column definition to latex
+    node = addnodes.tabular_col_spec()
+    node['spec'] = arguments[0]
+    return [node]
+
+tabularcolumns_directive.content = 0
+tabularcolumns_directive.arguments = (1, 0, 1)
+directives.register_directive('tabularcolumns', tabularcolumns_directive)
+
+
+# register the standard rst class directive under a different name
+
+try:
+    # docutils 0.4
+    from docutils.parsers.rst.directives.misc import class_directive
+    directives.register_directive('cssclass', class_directive)
+except ImportError:
+    try:
+        # docutils 0.5
+        from docutils.parsers.rst.directives.misc import Class
+        directives.register_directive('cssclass', Class)
+    except ImportError:
+        # whatever :)
+        pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/environment.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1387 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.environment
+    ~~~~~~~~~~~~~~~~~~
+
+    Global creation environment.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import os
+import time
+import heapq
+import types
+import imghdr
+import difflib
+import cPickle as pickle
+from os import path
+from glob import glob
+from string import uppercase
+from itertools import izip, groupby
+try:
+    import hashlib
+    md5 = hashlib.md5
+except ImportError:
+    # 2.4 compatibility
+    import md5
+    md5 = md5.new
+
+from docutils import nodes
+from docutils.io import FileInput, NullOutput
+from docutils.core import Publisher
+from docutils.utils import Reporter, relative_path
+from docutils.readers import standalone
+from docutils.parsers.rst import roles
+from docutils.parsers.rst.languages import en as english
+from docutils.parsers.rst.directives.html import MetaBody
+from docutils.writers import UnfilteredWriter
+from docutils.transforms import Transform
+from docutils.transforms.parts import ContentsFilter
+
+from sphinx import addnodes
+from sphinx.util import get_matching_docs, SEP, ustrftime
+from sphinx.directives import additional_xref_types
+
+default_settings = {
+    'embed_stylesheet': False,
+    'cloak_email_addresses': True,
+    'pep_base_url': 'http://www.python.org/dev/peps/',
+    'rfc_base_url': 'http://rfc.net/',
+    'input_encoding': 'utf-8',
+    'doctitle_xform': False,
+    'sectsubtitle_xform': False,
+}
+
+# This is increased every time an environment attribute is added
+# or changed to properly invalidate pickle files.
+ENV_VERSION = 26
+
+
+default_substitutions = set([
+    'version',
+    'release',
+    'today',
+])
+
+dummy_reporter = Reporter('', 4, 4)
+
+
+class RedirStream(object):
+    def __init__(self, writefunc):
+        self.writefunc = writefunc
+    def write(self, text):
+        if text.strip():
+            self.writefunc(text)
+
+
+class NoUri(Exception):
+    """Raised by get_relative_uri if there is no URI available."""
+    pass
+
+
+class DefaultSubstitutions(Transform):
+    """
+    Replace some substitutions if they aren't defined in the document.
+    """
+    # run before the default Substitutions
+    default_priority = 210
+
+    def apply(self):
+        config = self.document.settings.env.config
+        # only handle those not otherwise defined in the document
+        to_handle = default_substitutions - set(self.document.substitution_defs)
+        for ref in self.document.traverse(nodes.substitution_reference):
+            refname = ref['refname']
+            if refname in to_handle:
+                text = config[refname]
+                if refname == 'today' and not text:
+                    # special handling: can also specify a strftime format
+                    text = ustrftime(config.today_fmt or _('%B %d, %Y'))
+                ref.replace_self(nodes.Text(text, text))
+
+
+class MoveModuleTargets(Transform):
+    """
+    Move module targets to their nearest enclosing section title.
+    """
+    default_priority = 210
+
+    def apply(self):
+        for node in self.document.traverse(nodes.target):
+            if not node['ids']:
+                continue
+            if node['ids'][0].startswith('module-') and \
+                   node.parent.__class__ is nodes.section:
+                node.parent['ids'] = node['ids']
+                node.parent.remove(node)
+
+
+class HandleCodeBlocks(Transform):
+    """
+    Move doctest blocks out of blockquotes.
+    """
+    default_priority = 210
+
+    def apply(self):
+        for node in self.document.traverse(nodes.block_quote):
+            if len(node.children) == 1 and isinstance(node.children[0],
+                                                      nodes.doctest_block):
+                node.replace_self(node.children[0])
+
+class CitationReferences(Transform):
+    """
+    Handle citation references before the default docutils transform does.
+    """
+    default_priority = 619
+
+    def apply(self):
+        for citnode in self.document.traverse(nodes.citation_reference):
+            cittext = citnode.astext()
+            refnode = addnodes.pending_xref(cittext, reftype='citation',
+                                            reftarget=cittext)
+            refnode += nodes.Text('[' + cittext + ']')
+            citnode.parent.replace(citnode, refnode)
+
+
+class SphinxStandaloneReader(standalone.Reader):
+    """
+    Add our own transforms.
+    """
+    transforms = [CitationReferences, DefaultSubstitutions, MoveModuleTargets,
+                  HandleCodeBlocks]
+
+    def get_transforms(self):
+        return standalone.Reader.get_transforms(self) + self.transforms
+
+
+class SphinxDummyWriter(UnfilteredWriter):
+    supported = ('html',)  # needed to keep "meta" nodes
+
+    def translate(self):
+        pass
+
+
+
+class SphinxContentsFilter(ContentsFilter):
+    """
+    Used with BuildEnvironment.add_toc_from() to discard cross-file links
+    within table-of-contents link nodes.
+    """
+    def visit_pending_xref(self, node):
+        text = node.astext()
+        self.parent.append(nodes.literal(text, text))
+        raise nodes.SkipNode
+
+
+class BuildEnvironment:
+    """
+    The environment in which the ReST files are translated.
+    Stores an inventory of cross-file targets and provides doctree
+    transformations to resolve links to them.
+    """
+
+    # --------- ENVIRONMENT PERSISTENCE ----------------------------------------
+
+    @staticmethod
+    def frompickle(config, filename):
+        picklefile = open(filename, 'rb')
+        try:
+            env = pickle.load(picklefile)
+        finally:
+            picklefile.close()
+        env.config.values = config.values
+        if env.version != ENV_VERSION:
+            raise IOError('env version not current')
+        return env
+
+    def topickle(self, filename):
+        # remove unpicklable attributes
+        warnfunc = self._warnfunc
+        self.set_warnfunc(None)
+        values = self.config.values
+        del self.config.values
+        picklefile = open(filename, 'wb')
+        # remove potentially pickling-problematic values from config
+        for key, val in vars(self.config).items():
+            if key.startswith('_') or \
+                   isinstance(val, types.ModuleType) or \
+                   isinstance(val, types.FunctionType) or \
+                   isinstance(val, (type, types.ClassType)):
+                del self.config[key]
+        try:
+            pickle.dump(self, picklefile, pickle.HIGHEST_PROTOCOL)
+        finally:
+            picklefile.close()
+        # reset attributes
+        self.config.values = values
+        self.set_warnfunc(warnfunc)
+
+    # --------- ENVIRONMENT INITIALIZATION -------------------------------------
+
+    def __init__(self, srcdir, doctreedir, config):
+        self.doctreedir = doctreedir
+        self.srcdir = srcdir
+        self.config = config
+
+        # the application object; only set while update() runs
+        self.app = None
+
+        # the docutils settings for building
+        self.settings = default_settings.copy()
+        self.settings['env'] = self
+
+        # the function to write warning messages with
+        self._warnfunc = None
+
+        # this is to invalidate old pickles
+        self.version = ENV_VERSION
+
+        # All "docnames" here are /-separated and relative and exclude the source suffix.
+
+        self.found_docs = set()     # contains all existing docnames
+        self.all_docs = {}          # docname -> mtime at the time of build
+                                    # contains all built docnames
+        self.dependencies = {}      # docname -> set of dependent file names, relative to
+                                    # documentation root
+
+        # File metadata
+        self.metadata = {}          # docname -> dict of metadata items
+
+        # TOC inventory
+        self.titles = {}            # docname -> title node
+        self.tocs = {}              # docname -> table of contents nodetree
+        self.toc_num_entries = {}   # docname -> number of real entries
+                                    # used to determine when to show the TOC in a sidebar
+                                    # (don't show if it's only one item)
+        self.toctree_includes = {}  # docname -> list of toctree includefiles
+        self.files_to_rebuild = {}  # docname -> set of files (containing its TOCs)
+                                    # to rebuild too
+        self.glob_toctrees = set()  # docnames that have :glob: toctrees
+
+        # X-ref target inventory
+        self.descrefs = {}          # fullname -> docname, desctype
+        self.filemodules = {}       # docname -> [modules]
+        self.modules = {}           # modname -> docname, synopsis, platform, deprecated
+        self.labels = {}            # labelname -> docname, labelid, sectionname
+        self.anonlabels = {}        # labelname -> docname, labelid
+        self.progoptions = {}       # (program, name) -> docname, labelid
+        self.reftargets = {}        # (type, name) -> docname, labelid
+                                    # where type is term, token, envvar, citation
+
+        # Other inventories
+        self.indexentries = {}      # docname -> list of
+                                    # (type, string, target, aliasname)
+        self.versionchanges = {}    # version -> list of
+                                    # (type, docname, lineno, module, descname, content)
+        self.images = {}            # absolute path -> (docnames, unique filename)
+
+        # These are set while parsing a file
+        self.docname = None         # current document name
+        self.currmodule = None      # current module name
+        self.currclass = None       # current class name
+        self.currdesc = None        # current descref name
+        self.currprogram = None     # current program name
+        self.index_num = 0          # autonumber for index targets
+        self.gloss_entries = set()  # existing definition labels
+
+        # Some magically present labels
+        self.labels['genindex'] = ('genindex', '', _('Index'))
+        self.labels['modindex'] = ('modindex', '', _('Module Index'))
+        self.labels['search']   = ('search', '', _('Search Page'))
+
+    def set_warnfunc(self, func):
+        self._warnfunc = func
+        self.settings['warning_stream'] = RedirStream(func)
+
+    def warn(self, docname, msg, lineno=None):
+        if docname:
+            if lineno is None:
+                lineno = ''
+            self._warnfunc('%s:%s: %s' % (self.doc2path(docname), lineno, msg))
+        else:
+            self._warnfunc('GLOBAL:: ' + msg)
+
+    def clear_doc(self, docname):
+        """Remove all traces of a source file in the inventory."""
+        if docname in self.all_docs:
+            self.all_docs.pop(docname, None)
+            self.metadata.pop(docname, None)
+            self.dependencies.pop(docname, None)
+            self.titles.pop(docname, None)
+            self.tocs.pop(docname, None)
+            self.toc_num_entries.pop(docname, None)
+            self.toctree_includes.pop(docname, None)
+            self.filemodules.pop(docname, None)
+            self.indexentries.pop(docname, None)
+            self.glob_toctrees.discard(docname)
+
+            for subfn, fnset in self.files_to_rebuild.items():
+                fnset.discard(docname)
+                if not fnset:
+                    del self.files_to_rebuild[subfn]
+            for fullname, (fn, _) in self.descrefs.items():
+                if fn == docname:
+                    del self.descrefs[fullname]
+            for modname, (fn, _, _, _) in self.modules.items():
+                if fn == docname:
+                    del self.modules[modname]
+            for labelname, (fn, _, _) in self.labels.items():
+                if fn == docname:
+                    del self.labels[labelname]
+            for key, (fn, _) in self.reftargets.items():
+                if fn == docname:
+                    del self.reftargets[key]
+            for key, (fn, _) in self.progoptions.items():
+                if fn == docname:
+                    del self.progoptions[key]
+            for version, changes in self.versionchanges.items():
+                new = [change for change in changes if change[1] != docname]
+                changes[:] = new
+            for fullpath, (docs, _) in self.images.items():
+                docs.discard(docname)
+                if not docs:
+                    del self.images[fullpath]
+
+    def doc2path(self, docname, base=True, suffix=None):
+        """
+        Return the filename for the document name.
+        If base is True, return absolute path under self.srcdir.
+        If base is None, return relative path to self.srcdir.
+        If base is a path string, return absolute path under that.
+        If suffix is not None, add it instead of config.source_suffix.
+        """
+        suffix = suffix or self.config.source_suffix
+        if base is True:
+            return path.join(self.srcdir, docname.replace(SEP, path.sep)) + suffix
+        elif base is None:
+            return docname.replace(SEP, path.sep) + suffix
+        else:
+            return path.join(base, docname.replace(SEP, path.sep)) + suffix
+
+    def find_files(self, config):
+        """
+        Find all source files in the source dir and put them in self.found_docs.
+        """
+        exclude_dirs  = [d.replace(SEP, path.sep) for d in config.exclude_dirs]
+        exclude_trees = [d.replace(SEP, path.sep) for d in config.exclude_trees]
+        self.found_docs = set(get_matching_docs(
+            self.srcdir, config.source_suffix, exclude_docs=set(config.unused_docs),
+            exclude_dirs=exclude_dirs, exclude_trees=exclude_trees,
+            exclude_dirnames=['_sources'] + config.exclude_dirnames))
+
+    def get_outdated_files(self, config_changed):
+        """
+        Return (added, changed, removed) sets.
+        """
+        # clear all files no longer present
+        removed = set(self.all_docs) - self.found_docs
+
+        added = set()
+        changed = set()
+
+        if config_changed:
+            # config values affect e.g. substitutions
+            added = self.found_docs
+        else:
+            for docname in self.found_docs:
+                if docname not in self.all_docs:
+                    added.add(docname)
+                    continue
+                # if the doctree file is not there, rebuild
+                if not path.isfile(self.doc2path(docname, self.doctreedir,
+                                                 '.doctree')):
+                    changed.add(docname)
+                    continue
+                # check the mtime of the document
+                mtime = self.all_docs[docname]
+                newmtime = path.getmtime(self.doc2path(docname))
+                if newmtime > mtime:
+                    changed.add(docname)
+                    continue
+                # finally, check the mtime of dependencies
+                for dep in self.dependencies.get(docname, ()):
+                    try:
+                        # this will do the right thing when dep is absolute too
+                        deppath = path.join(self.srcdir, dep)
+                        if not path.isfile(deppath):
+                            changed.add(docname)
+                            break
+                        depmtime = path.getmtime(deppath)
+                        if depmtime > mtime:
+                            changed.add(docname)
+                            break
+                    except EnvironmentError:
+                        # give it another chance
+                        changed.add(docname)
+                        break
+
+        return added, changed, removed
+
+    def update(self, config, srcdir, doctreedir, app=None):
+        """(Re-)read all files new or changed since last update.  Yields a summary
+        and then docnames as it processes them.  Store all environment docnames
+        in the canonical format (ie using SEP as a separator in place of
+        os.path.sep)."""
+        config_changed = False
+        if self.config is None:
+            msg = '[new config] '
+            config_changed = True
+        else:
+            # check if a config value was changed that affects how doctrees are read
+            for key, descr in config.config_values.iteritems():
+                if not descr[1]:
+                    continue
+                if self.config[key] != config[key]:
+                    msg = '[config changed] '
+                    config_changed = True
+                    break
+            else:
+                msg = ''
+            # this value is not covered by the above loop because it is handled
+            # specially by the config class
+            if self.config.extensions != config.extensions:
+                msg = '[extensions changed] '
+                config_changed = True
+        # the source and doctree directories may have been relocated
+        self.srcdir = srcdir
+        self.doctreedir = doctreedir
+        self.find_files(config)
+
+        added, changed, removed = self.get_outdated_files(config_changed)
+
+        # if files were added or removed, all documents with globbed toctrees
+        # must be reread
+        if added or removed:
+            changed.update(self.glob_toctrees)
+
+        msg += '%s added, %s changed, %s removed' % (len(added), len(changed),
+                                                     len(removed))
+        yield msg
+
+        self.config = config
+        self.app = app
+
+        # clear all files no longer present
+        for docname in removed:
+            if app:
+                app.emit('env-purge-doc', self, docname)
+            self.clear_doc(docname)
+
+        # read all new and changed files
+        for docname in sorted(added | changed):
+            yield docname
+            self.read_doc(docname, app=app)
+
+        if config.master_doc not in self.all_docs:
+            self.warn(None, 'master file %s not found' %
+                      self.doc2path(config.master_doc))
+
+        self.app = None
+
+        # remove all non-existing images from inventory
+        for imgsrc in self.images.keys():
+            if not os.access(path.join(self.srcdir, imgsrc), os.R_OK):
+                del self.images[imgsrc]
+
+        if app:
+            app.emit('env-updated', self)
+
+
+    # --------- SINGLE FILE READING --------------------------------------------
+
+    def read_doc(self, docname, src_path=None, save_parsed=True, app=None):
+        """
+        Parse a file and add/update inventory entries for the doctree.
+        If srcpath is given, read from a different source file.
+        """
+        # remove all inventory entries for that file
+        if app:
+            app.emit('env-purge-doc', self, docname)
+        self.clear_doc(docname)
+
+        if src_path is None:
+            src_path = self.doc2path(docname)
+
+        if self.config.default_role:
+            role_fn, messages = roles.role(self.config.default_role, english,
+                                           0, dummy_reporter)
+            if role_fn:
+                roles._roles[''] = role_fn
+            else:
+                self.warn(docname, 'default role %s not found' %
+                          self.config.default_role)
+
+        self.docname = docname
+        self.settings['input_encoding'] = self.config.source_encoding
+
+        class SphinxSourceClass(FileInput):
+            def read(self):
+                data = FileInput.read(self)
+                if app:
+                    arg = [data]
+                    app.emit('source-read', docname, arg)
+                    data = arg[0]
+                return data
+
+        # publish manually
+        pub = Publisher(reader=SphinxStandaloneReader(),
+                        writer=SphinxDummyWriter(),
+                        source_class=SphinxSourceClass,
+                        destination_class=NullOutput)
+        pub.set_components(None, 'restructuredtext', None)
+        pub.process_programmatic_settings(None, self.settings, None)
+        pub.set_source(None, src_path)
+        pub.set_destination(None, None)
+        try:
+            pub.publish()
+            doctree = pub.document
+        except UnicodeError, err:
+            from sphinx.application import SphinxError
+            raise SphinxError(err.message)
+        self.filter_messages(doctree)
+        self.process_dependencies(docname, doctree)
+        self.process_images(docname, doctree)
+        self.process_metadata(docname, doctree)
+        self.create_title_from(docname, doctree)
+        self.note_labels_from(docname, doctree)
+        self.note_indexentries_from(docname, doctree)
+        self.note_citations_from(docname, doctree)
+        self.build_toc_from(docname, doctree)
+
+        # store time of reading, used to find outdated files
+        self.all_docs[docname] = time.time()
+
+        if app:
+            app.emit('doctree-read', doctree)
+
+        # make it picklable
+        doctree.reporter = None
+        doctree.transformer = None
+        doctree.settings.warning_stream = None
+        doctree.settings.env = None
+        doctree.settings.record_dependencies = None
+        for metanode in doctree.traverse(MetaBody.meta):
+            # docutils' meta nodes aren't picklable because the class is nested
+            metanode.__class__ = addnodes.meta
+
+        # cleanup
+        self.docname = None
+        self.currmodule = None
+        self.currclass = None
+        self.gloss_entries = set()
+
+        if save_parsed:
+            # save the parsed doctree
+            doctree_filename = self.doc2path(docname, self.doctreedir, '.doctree')
+            dirname = path.dirname(doctree_filename)
+            if not path.isdir(dirname):
+                os.makedirs(dirname)
+            f = open(doctree_filename, 'wb')
+            try:
+                pickle.dump(doctree, f, pickle.HIGHEST_PROTOCOL)
+            finally:
+                f.close()
+        else:
+            return doctree
+
+    def filter_messages(self, doctree):
+        """
+        Filter system messages from a doctree.
+        """
+        filterlevel = self.config.keep_warnings and 2 or 5
+        for node in doctree.traverse(nodes.system_message):
+            if node['level'] < filterlevel:
+                node.parent.remove(node)
+
+    def process_dependencies(self, docname, doctree):
+        """
+        Process docutils-generated dependency info.
+        """
+        deps = doctree.settings.record_dependencies
+        if not deps:
+            return
+        docdir = path.dirname(self.doc2path(docname, base=None))
+        for dep in deps.list:
+            dep = path.join(docdir, dep)
+            self.dependencies.setdefault(docname, set()).add(dep)
+
+    def process_images(self, docname, doctree):
+        """
+        Process and rewrite image URIs.
+        """
+        existing_names = set(v[1] for v in self.images.itervalues())
+        docdir = path.dirname(self.doc2path(docname, base=None))
+        for node in doctree.traverse(nodes.image):
+            # Map the mimetype to the corresponding image.  The writer may
+            # choose the best image from these candidates.  The special key * is
+            # set if there is only single candiate to be used by a writer.
+            # The special key ? is set for nonlocal URIs.
+            node['candidates'] = candidates = {}
+            imguri = node['uri']
+            if imguri.find('://') != -1:
+                self.warn(docname, 'Nonlocal image URI found: %s' % imguri, node.line)
+                candidates['?'] = imguri
+                continue
+            # imgpath is the image path *from srcdir*
+            imgpath = path.normpath(path.join(docdir, imguri))
+            # set imgpath as default URI
+            node['uri'] = imgpath
+            if imgpath.endswith(os.extsep + '*'):
+                for filename in glob(path.join(self.srcdir, imgpath)):
+                    new_imgpath = relative_path(self.srcdir, filename)
+                    if filename.lower().endswith('.pdf'):
+                        candidates['application/pdf'] = new_imgpath
+                    elif filename.lower().endswith('.svg'):
+                        candidates['image/svg+xml'] = new_imgpath
+                    else:
+                        try:
+                            f = open(filename, 'rb')
+                            try:
+                                imgtype = imghdr.what(f)
+                            finally:
+                                f.close()
+                        except (OSError, IOError):
+                            self.warn(docname, 'Image file %s not readable' % filename)
+                        if imgtype:
+                            candidates['image/' + imgtype] = new_imgpath
+            else:
+                candidates['*'] = imgpath
+            # map image paths to unique image names (so that they can be put
+            # into a single directory)
+            for imgpath in candidates.itervalues():
+                self.dependencies.setdefault(docname, set()).add(imgpath)
+                if not os.access(path.join(self.srcdir, imgpath), os.R_OK):
+                    self.warn(docname, 'Image file not readable: %s' % imgpath,
+                              node.line)
+                if imgpath in self.images:
+                    self.images[imgpath][0].add(docname)
+                    continue
+                uniquename = path.basename(imgpath)
+                base, ext = path.splitext(uniquename)
+                i = 0
+                while uniquename in existing_names:
+                    i += 1
+                    uniquename = '%s%s%s' % (base, i, ext)
+                self.images[imgpath] = (set([docname]), uniquename)
+                existing_names.add(uniquename)
+
+    def process_metadata(self, docname, doctree):
+        """
+        Process the docinfo part of the doctree as metadata.
+        """
+        self.metadata[docname] = md = {}
+        try:
+            docinfo = doctree[0]
+        except IndexError:
+            # probably an empty document
+            return
+        if docinfo.__class__ is not nodes.docinfo:
+            # nothing to see here
+            return
+        for node in docinfo:
+            if node.__class__ is nodes.author:
+                # handled specially by docutils
+                md['author'] = node.astext()
+            elif node.__class__ is nodes.field:
+                name, body = node
+                md[name.astext()] = body.astext()
+        del doctree[0]
+
+    def create_title_from(self, docname, document):
+        """
+        Add a title node to the document (just copy the first section title),
+        and store that title in the environment.
+        """
+        for node in document.traverse(nodes.section):
+            titlenode = nodes.title()
+            visitor = SphinxContentsFilter(document)
+            node[0].walkabout(visitor)
+            titlenode += visitor.get_entry_text()
+            self.titles[docname] = titlenode
+            return
+
+    def note_labels_from(self, docname, document):
+        for name, explicit in document.nametypes.iteritems():
+            if not explicit:
+                continue
+            labelid = document.nameids[name]
+            if labelid is None:
+                continue
+            node = document.ids[labelid]
+            if name.isdigit() or node.has_key('refuri') or \
+                   node.tagname.startswith('desc_'):
+                # ignore footnote labels, labels automatically generated from a
+                # link and description units
+                continue
+            if name in self.labels:
+                self.warn(docname, 'duplicate label %s, ' % name +
+                          'other instance in %s' % self.doc2path(self.labels[name][0]),
+                          node.line)
+            self.anonlabels[name] = docname, labelid
+            if node.tagname == 'section':
+                sectname = node[0].astext() # node[0] == title node
+            elif node.tagname == 'figure':
+                for n in node:
+                    if n.tagname == 'caption':
+                        sectname = n.astext()
+                        break
+                else:
+                    continue
+            else:
+                # anonymous-only labels
+                continue
+            self.labels[name] = docname, labelid, sectname
+
+    def note_indexentries_from(self, docname, document):
+        entries = self.indexentries[docname] = []
+        for node in document.traverse(addnodes.index):
+            entries.extend(node['entries'])
+
+    def note_citations_from(self, docname, document):
+        for node in document.traverse(nodes.citation):
+            label = node[0].astext()
+            if ('citation', label) in self.reftargets:
+                self.warn(docname, 'duplicate citation %s, ' % label +
+                          'other instance in %s' % self.doc2path(
+                    self.reftargets['citation', label][0]), node.line)
+            self.reftargets['citation', label] = (docname, node['ids'][0])
+
+    def note_toctree(self, docname, toctreenode):
+        """Note a TOC tree directive in a document and gather information about
+           file relations from it."""
+        if toctreenode['glob']:
+            self.glob_toctrees.add(docname)
+        includefiles = toctreenode['includefiles']
+        for includefile in includefiles:
+            # note that if the included file is rebuilt, this one must be
+            # too (since the TOC of the included file could have changed)
+            self.files_to_rebuild.setdefault(includefile, set()).add(docname)
+        self.toctree_includes.setdefault(docname, []).extend(includefiles)
+
+    def build_toc_from(self, docname, document):
+        """Build a TOC from the doctree and store it in the inventory."""
+        numentries = [0] # nonlocal again...
+
+        try:
+            maxdepth = int(self.metadata[docname].get('tocdepth', 0))
+        except ValueError:
+            maxdepth = 0
+
+        def build_toc(node, depth=1):
+            entries = []
+            for subnode in node:
+                if isinstance(subnode, addnodes.toctree):
+                    # just copy the toctree node which is then resolved
+                    # in self.get_and_resolve_doctree
+                    item = subnode.copy()
+                    entries.append(item)
+                    # do the inventory stuff
+                    self.note_toctree(docname, subnode)
+                    continue
+                if not isinstance(subnode, nodes.section):
+                    continue
+                title = subnode[0]
+                # copy the contents of the section title, but without references
+                # and unnecessary stuff
+                visitor = SphinxContentsFilter(document)
+                title.walkabout(visitor)
+                nodetext = visitor.get_entry_text()
+                if not numentries[0]:
+                    # for the very first toc entry, don't add an anchor
+                    # as it is the file's title anyway
+                    anchorname = ''
+                else:
+                    anchorname = '#' + subnode['ids'][0]
+                numentries[0] += 1
+                reference = nodes.reference('', '', refuri=docname,
+                                            anchorname=anchorname,
+                                            *nodetext)
+                para = addnodes.compact_paragraph('', '', reference)
+                item = nodes.list_item('', para)
+                if maxdepth == 0 or depth < maxdepth:
+                    item += build_toc(subnode, depth+1)
+                entries.append(item)
+            if entries:
+                return nodes.bullet_list('', *entries)
+            return []
+        toc = build_toc(document)
+        if toc:
+            self.tocs[docname] = toc
+        else:
+            self.tocs[docname] = nodes.bullet_list('')
+        self.toc_num_entries[docname] = numentries[0]
+
+    def get_toc_for(self, docname):
+        """Return a TOC nodetree -- for use on the same page only!"""
+        toc = self.tocs[docname].deepcopy()
+        for node in toc.traverse(nodes.reference):
+            node['refuri'] = node['anchorname']
+        return toc
+
+    # -------
+    # these are called from docutils directives and therefore use self.docname
+    #
+    def note_descref(self, fullname, desctype, line):
+        if fullname in self.descrefs:
+            self.warn(self.docname,
+                      'duplicate canonical description name %s, ' % fullname +
+                      'other instance in %s' % self.doc2path(self.descrefs[fullname][0]),
+                      line)
+        self.descrefs[fullname] = (self.docname, desctype)
+
+    def note_module(self, modname, synopsis, platform, deprecated):
+        self.modules[modname] = (self.docname, synopsis, platform, deprecated)
+        self.filemodules.setdefault(self.docname, []).append(modname)
+
+    def note_progoption(self, optname, labelid):
+        self.progoptions[self.currprogram, optname] = (self.docname, labelid)
+
+    def note_reftarget(self, type, name, labelid):
+        self.reftargets[type, name] = (self.docname, labelid)
+
+    def note_versionchange(self, type, version, node, lineno):
+        self.versionchanges.setdefault(version, []).append(
+            (type, self.docname, lineno, self.currmodule, self.currdesc, node.astext()))
+
+    def note_dependency(self, filename):
+        basename = path.dirname(self.doc2path(self.docname, base=None))
+        # this will do the right thing when filename is absolute too
+        filename = path.join(basename, filename)
+        self.dependencies.setdefault(self.docname, set()).add(filename)
+    # -------
+
+    # --------- RESOLVING REFERENCES AND TOCTREES ------------------------------
+
+    def get_doctree(self, docname):
+        """Read the doctree for a file from the pickle and return it."""
+        doctree_filename = self.doc2path(docname, self.doctreedir, '.doctree')
+        f = open(doctree_filename, 'rb')
+        try:
+            doctree = pickle.load(f)
+        finally:
+            f.close()
+        doctree.settings.env = self
+        doctree.reporter = Reporter(self.doc2path(docname), 2, 4,
+                                    stream=RedirStream(self._warnfunc))
+        return doctree
+
+
+    def get_and_resolve_doctree(self, docname, builder, doctree=None,
+                                prune_toctrees=True):
+        """Read the doctree from the pickle, resolve cross-references and
+           toctrees and return it."""
+        if doctree is None:
+            doctree = self.get_doctree(docname)
+
+        # resolve all pending cross-references
+        self.resolve_references(doctree, docname, builder)
+
+        # now, resolve all toctree nodes
+        for toctreenode in doctree.traverse(addnodes.toctree):
+            result = self.resolve_toctree(docname, builder, toctreenode,
+                                          prune=prune_toctrees)
+            if result is None:
+                toctreenode.replace_self([])
+            else:
+                toctreenode.replace_self(result)
+
+        return doctree
+
+    def resolve_toctree(self, docname, builder, toctree, prune=True, maxdepth=0,
+                        titles_only=False):
+        """
+        Resolve a *toctree* node into individual bullet lists with titles
+        as items, returning None (if no containing titles are found) or
+        a new node.
+
+        If *prune* is True, the tree is pruned to *maxdepth*, or if that is 0,
+        to the value of the *maxdepth* option on the *toctree* node.
+        If *titles_only* is True, only toplevel document titles will be in the
+        resulting tree.
+        """
+
+        def _walk_depth(node, depth, maxdepth, titleoverrides):
+            """Utility: Cut a TOC at a specified depth."""
+            for subnode in node.children[:]:
+                if isinstance(subnode, (addnodes.compact_paragraph, nodes.list_item)):
+                    subnode['classes'].append('toctree-l%d' % (depth-1))
+                    _walk_depth(subnode, depth, maxdepth, titleoverrides)
+                elif isinstance(subnode, nodes.bullet_list):
+                    if maxdepth > 0 and depth > maxdepth:
+                        subnode.parent.replace(subnode, [])
+                    else:
+                        _walk_depth(subnode, depth+1, maxdepth, titleoverrides)
+
+        def _entries_from_toctree(toctreenode, separate=False):
+            """Return TOC entries for a toctree node."""
+            includefiles = map(str, toctreenode['includefiles'])
+
+            entries = []
+            for includefile in includefiles:
+                try:
+                    toc = self.tocs[includefile].deepcopy()
+                    if not toc.children:
+                        # empty toc means: no titles will show up in the toctree
+                        self.warn(docname, 'toctree contains reference to document '
+                                  '%r that doesn\'t have a title: no link will be '
+                                  'generated' % includefile)
+                except KeyError:
+                    # this is raised if the included file does not exist
+                    self.warn(docname, 'toctree contains reference to nonexisting '
+                              'document %r' % includefile)
+                else:
+                    # if titles_only is given, only keep the main title and
+                    # sub-toctrees
+                    if titles_only:
+                        # delete everything but the toplevel title(s) and toctrees
+                        for toplevel in toc:
+                            # nodes with length 1 don't have any children anyway
+                            if len(toplevel) > 1:
+                                subtoctrees = toplevel.traverse(addnodes.toctree)
+                                toplevel[1][:] = subtoctrees
+                    # resolve all sub-toctrees
+                    for toctreenode in toc.traverse(addnodes.toctree):
+                        i = toctreenode.parent.index(toctreenode) + 1
+                        for item in _entries_from_toctree(toctreenode):
+                            toctreenode.parent.insert(i, item)
+                            i += 1
+                        toctreenode.parent.remove(toctreenode)
+                    if separate:
+                        entries.append(toc)
+                    else:
+                        entries.extend(toc.children)
+            return entries
+
+        maxdepth = maxdepth or toctree.get('maxdepth', -1)
+        titleoverrides = toctree.get('includetitles', {})
+
+        tocentries = _entries_from_toctree(toctree, separate=True)
+        if not tocentries:
+            return None
+
+        newnode = addnodes.compact_paragraph('', '', *tocentries)
+        newnode['toctree'] = True
+        # prune the tree to maxdepth and replace titles, also set level classes
+        _walk_depth(newnode, 1, prune and maxdepth or 0, titleoverrides)
+        # replace titles, if needed, and set the target paths in the
+        # toctrees (they are not known at TOC generation time)
+        for refnode in newnode.traverse(nodes.reference):
+            refnode['refuri'] = builder.get_relative_uri(
+                docname, refnode['refuri']) + refnode['anchorname']
+            if titleoverrides and not refnode['anchorname'] \
+                   and refnode['refuri'] in titleoverrides:
+                newtitle = titleoverrides[refnode['refuri']]
+                refnode.children = [nodes.Text(newtitle)]
+        return newnode
+
+    descroles = frozenset(('data', 'exc', 'func', 'class', 'const', 'attr', 'obj',
+                           'meth', 'cfunc', 'cmember', 'cdata', 'ctype', 'cmacro'))
+
+    def resolve_references(self, doctree, fromdocname, builder):
+        reftarget_roles = set(('token', 'term', 'citation'))
+        # add all custom xref types too
+        reftarget_roles.update(i[0] for i in additional_xref_types.values())
+
+        for node in doctree.traverse(addnodes.pending_xref):
+            contnode = node[0].deepcopy()
+            newnode = None
+
+            typ = node['reftype']
+            target = node['reftarget']
+
+            try:
+                if typ == 'ref':
+                    if node['refcaption']:
+                        # reference to anonymous label; the reference uses the supplied
+                        # link caption
+                        docname, labelid = self.anonlabels.get(target, ('',''))
+                        sectname = node.astext()
+                        if not docname:
+                            newnode = doctree.reporter.system_message(
+                                2, 'undefined label: %s' % target)
+                    else:
+                        # reference to the named label; the final node will contain the
+                        # section name after the label
+                        docname, labelid, sectname = self.labels.get(target, ('','',''))
+                        if not docname:
+                            newnode = doctree.reporter.system_message(
+                                2, 'undefined label: %s -- if you don\'t ' % target +
+                                'give a link caption the label must precede a section '
+                                'header.')
+                    if docname:
+                        newnode = nodes.reference('', '')
+                        innernode = nodes.emphasis(sectname, sectname)
+                        if docname == fromdocname:
+                            newnode['refid'] = labelid
+                        else:
+                            # set more info in contnode in case the get_relative_uri call
+                            # raises NoUri, the builder will then have to resolve these
+                            contnode = addnodes.pending_xref('')
+                            contnode['refdocname'] = docname
+                            contnode['refsectname'] = sectname
+                            newnode['refuri'] = builder.get_relative_uri(
+                                fromdocname, docname)
+                            if labelid:
+                                newnode['refuri'] += '#' + labelid
+                        newnode.append(innernode)
+                elif typ == 'keyword':
+                    # keywords are referenced by named labels
+                    docname, labelid, _ = self.labels.get(target, ('','',''))
+                    if not docname:
+                        #self.warn(fromdocname, 'unknown keyword: %s' % target)
+                        newnode = contnode
+                    else:
+                        newnode = nodes.reference('', '')
+                        if docname == fromdocname:
+                            newnode['refid'] = labelid
+                        else:
+                            newnode['refuri'] = builder.get_relative_uri(
+                                fromdocname, docname) + '#' + labelid
+                        newnode.append(contnode)
+                elif typ == 'option':
+                    progname = node['refprogram']
+                    docname, labelid = self.progoptions.get((progname, target), ('', ''))
+                    if not docname:
+                        newnode = contnode
+                    else:
+                        newnode = nodes.reference('', '')
+                        if docname == fromdocname:
+                            newnode['refid'] = labelid
+                        else:
+                            newnode['refuri'] = builder.get_relative_uri(
+                                fromdocname, docname) + '#' + labelid
+                        newnode.append(contnode)
+                elif typ in reftarget_roles:
+                    docname, labelid = self.reftargets.get((typ, target), ('', ''))
+                    if not docname:
+                        if typ == 'term':
+                            self.warn(fromdocname, 'term not in glossary: %s' % target,
+                                      node.line)
+                        elif typ == 'citation':
+                            self.warn(fromdocname, 'citation not found: %s' % target,
+                                      node.line)
+                        newnode = contnode
+                    else:
+                        newnode = nodes.reference('', '')
+                        if docname == fromdocname:
+                            newnode['refid'] = labelid
+                        else:
+                            newnode['refuri'] = builder.get_relative_uri(
+                                fromdocname, docname, typ) + '#' + labelid
+                        newnode.append(contnode)
+                elif typ == 'mod':
+                    docname, synopsis, platform, deprecated = \
+                        self.modules.get(target, ('','','', ''))
+                    if not docname:
+                        newnode = builder.app.emit_firstresult('missing-reference',
+                                                               self, node, contnode)
+                        if not newnode:
+                            newnode = contnode
+                    elif docname == fromdocname:
+                        # don't link to self
+                        newnode = contnode
+                    else:
+                        newnode = nodes.reference('', '')
+                        newnode['refuri'] = builder.get_relative_uri(
+                            fromdocname, docname) + '#module-' + target
+                        newnode['reftitle'] = '%s%s%s' % (
+                            (platform and '(%s) ' % platform),
+                            synopsis, (deprecated and ' (deprecated)' or ''))
+                        newnode.append(contnode)
+                elif typ in self.descroles:
+                    # "descrefs"
+                    modname = node['modname']
+                    clsname = node['classname']
+                    searchorder = node.hasattr('refspecific') and 1 or 0
+                    name, desc = self.find_desc(modname, clsname,
+                                                target, typ, searchorder)
+                    if not desc:
+                        newnode = builder.app.emit_firstresult('missing-reference',
+                                                               self, node, contnode)
+                        if not newnode:
+                            newnode = contnode
+                    else:
+                        newnode = nodes.reference('', '')
+                        if desc[0] == fromdocname:
+                            newnode['refid'] = name
+                        else:
+                            newnode['refuri'] = (
+                                builder.get_relative_uri(fromdocname, desc[0])
+                                + '#' + name)
+                        newnode['reftitle'] = name
+                        newnode.append(contnode)
+                else:
+                    raise RuntimeError('unknown xfileref node encountered: %s' % node)
+            except NoUri:
+                newnode = contnode
+            if newnode:
+                node.replace_self(newnode)
+
+        # allow custom references to be resolved
+        builder.app.emit('doctree-resolved', doctree, fromdocname)
+
+    def create_index(self, builder, _fixre=re.compile(r'(.*) ([(][^()]*[)])')):
+        """Create the real index from the collected index entries."""
+        new = {}
+
+        def add_entry(word, subword, dic=new):
+            entry = dic.get(word)
+            if not entry:
+                dic[word] = entry = [[], {}]
+            if subword:
+                add_entry(subword, '', dic=entry[1])
+            else:
+                try:
+                    entry[0].append(builder.get_relative_uri('genindex', fn)
+                                    + '#' + tid)
+                except NoUri:
+                    pass
+
+        for fn, entries in self.indexentries.iteritems():
+            # new entry types must be listed in directives/other.py!
+            for type, string, tid, alias in entries:
+                if type == 'single':
+                    try:
+                        entry, subentry = string.split(';', 1)
+                    except ValueError:
+                        entry, subentry = string, ''
+                    if not entry:
+                        self.warn(fn, 'invalid index entry %r' % string)
+                        continue
+                    add_entry(entry.strip(), subentry.strip())
+                elif type == 'pair':
+                    try:
+                        first, second = map(lambda x: x.strip(),
+                                            string.split(';', 1))
+                        if not first or not second:
+                            raise ValueError
+                    except ValueError:
+                        self.warn(fn, 'invalid pair index entry %r' % string)
+                        continue
+                    add_entry(first, second)
+                    add_entry(second, first)
+                elif type == 'triple':
+                    try:
+                        first, second, third = map(lambda x: x.strip(),
+                                                   string.split(';', 2))
+                        if not first or not second or not third:
+                            raise ValueError
+                    except ValueError:
+                        self.warn(fn, 'invalid triple index entry %r' % string)
+                        continue
+                    add_entry(first, second+' '+third)
+                    add_entry(second, third+', '+first)
+                    add_entry(third, first+' '+second)
+                else:
+                    self.warn(fn, 'unknown index entry type %r' % type)
+
+        newlist = new.items()
+        newlist.sort(key=lambda t: t[0].lower())
+
+        # fixup entries: transform
+        #   func() (in module foo)
+        #   func() (in module bar)
+        # into
+        #   func()
+        #     (in module foo)
+        #     (in module bar)
+        oldkey = ''
+        oldsubitems = None
+        i = 0
+        while i < len(newlist):
+            key, (targets, subitems) = newlist[i]
+            # cannot move if it hassubitems; structure gets too complex
+            if not subitems:
+                m = _fixre.match(key)
+                if m:
+                    if oldkey == m.group(1):
+                        # prefixes match: add entry as subitem of the previous entry
+                        oldsubitems.setdefault(m.group(2), [[], {}])[0].extend(targets)
+                        del newlist[i]
+                        continue
+                    oldkey = m.group(1)
+                else:
+                    oldkey = key
+            oldsubitems = subitems
+            i += 1
+
+        # group the entries by letter
+        def keyfunc((k, v), ltrs=uppercase+'_'):
+            # hack: mutate the subitems dicts to a list in the keyfunc
+            v[1] = sorted((si, se) for (si, (se, void)) in v[1].iteritems())
+            # now calculate the key
+            letter = k[0].upper()
+            if letter in ltrs:
+                return letter
+            else:
+                # get all other symbols under one heading
+                return 'Symbols'
+        return [(key, list(group)) for (key, group) in groupby(newlist, keyfunc)]
+
+    def collect_relations(self):
+        relations = {}
+        getinc = self.toctree_includes.get
+        def collect(parents, docname, previous, next):
+            includes = getinc(docname)
+            # previous
+            if not previous:
+                # if no previous sibling, go to parent
+                previous = parents[0][0]
+            else:
+                # else, go to previous sibling, or if it has children, to
+                # the last of its children, or if that has children, to the
+                # last of those, and so forth
+                while 1:
+                    previncs = getinc(previous)
+                    if previncs:
+                        previous = previncs[-1]
+                    else:
+                        break
+            # next
+            if includes:
+                # if it has children, go to first of them
+                next = includes[0]
+            elif next:
+                # else, if next sibling, go to it
+                pass
+            else:
+                # else, go to the next sibling of the parent, if present,
+                # else the grandparent's sibling, if present, and so forth
+                for parname, parindex in parents:
+                    parincs = getinc(parname)
+                    if parincs and parindex + 1 < len(parincs):
+                        next = parincs[parindex+1]
+                        break
+                # else it will stay None
+            # same for children
+            if includes:
+                for subindex, args in enumerate(izip(includes, [None] + includes,
+                                                     includes[1:] + [None])):
+                    collect([(docname, subindex)] + parents, *args)
+            relations[docname] = [parents[0][0], previous, next]
+        collect([(None, 0)], self.config.master_doc, None, None)
+        return relations
+
+    def check_consistency(self):
+        """Do consistency checks."""
+
+        for docname in sorted(self.all_docs):
+            if docname not in self.files_to_rebuild:
+                if docname == self.config.master_doc:
+                    # the master file is not included anywhere ;)
+                    continue
+                self.warn(docname, 'document isn\'t included in any toctree')
+
+    # --------- QUERYING -------------------------------------------------------
+
+    def find_desc(self, modname, classname, name, type, searchorder=0):
+        """Find a description node matching "name", perhaps using
+           the given module and/or classname."""
+        # skip parens
+        if name[-2:] == '()':
+            name = name[:-2]
+
+        if not name:
+            return None, None
+
+        # don't add module and class names for C things
+        if type[0] == 'c' and type not in ('class', 'const'):
+            # skip trailing star and whitespace
+            name = name.rstrip(' *')
+            if name in self.descrefs and self.descrefs[name][1][0] == 'c':
+                return name, self.descrefs[name]
+            return None, None
+
+        newname = None
+        if searchorder == 1:
+            if modname and classname and \
+                   modname + '.' + classname + '.' + name in self.descrefs:
+                newname = modname + '.' + classname + '.' + name
+            elif modname and modname + '.' + name in self.descrefs:
+                newname = modname + '.' + name
+            elif name in self.descrefs:
+                newname = name
+        else:
+            if name in self.descrefs:
+                newname = name
+            elif modname and modname + '.' + name in self.descrefs:
+                newname = modname + '.' + name
+            elif modname and classname and \
+                     modname + '.' + classname + '.' + name in self.descrefs:
+                newname = modname + '.' + classname + '.' + name
+            # special case: builtin exceptions have module "exceptions" set
+            elif type == 'exc' and '.' not in name and \
+                 'exceptions.' + name in self.descrefs:
+                newname = 'exceptions.' + name
+            # special case: object methods
+            elif type in ('func', 'meth') and '.' not in name and \
+                 'object.' + name in self.descrefs:
+                newname = 'object.' + name
+        if newname is None:
+            return None, None
+        return newname, self.descrefs[newname]
+
+    def find_keyword(self, keyword, avoid_fuzzy=False, cutoff=0.6, n=20):
+        """
+        Find keyword matches for a keyword. If there's an exact match, just return
+        it, else return a list of fuzzy matches if avoid_fuzzy isn't True.
+
+        Keywords searched are: first modules, then descrefs.
+
+        Returns: None if nothing found
+                 (type, docname, anchorname) if exact match found
+                 list of (quality, type, docname, anchorname, description) if fuzzy
+        """
+
+        if keyword in self.modules:
+            docname, title, system, deprecated = self.modules[keyword]
+            return 'module', docname, 'module-' + keyword
+        if keyword in self.descrefs:
+            docname, ref_type = self.descrefs[keyword]
+            return ref_type, docname, keyword
+        # special cases
+        if '.' not in keyword:
+            # exceptions are documented in the exceptions module
+            if 'exceptions.'+keyword in self.descrefs:
+                docname, ref_type = self.descrefs['exceptions.'+keyword]
+                return ref_type, docname, 'exceptions.'+keyword
+            # special methods are documented as object methods
+            if 'object.'+keyword in self.descrefs:
+                docname, ref_type = self.descrefs['object.'+keyword]
+                return ref_type, docname, 'object.'+keyword
+
+        if avoid_fuzzy:
+            return
+
+        # find fuzzy matches
+        s = difflib.SequenceMatcher()
+        s.set_seq2(keyword.lower())
+
+        def possibilities():
+            for title, (fn, desc, _, _) in self.modules.iteritems():
+                yield ('module', fn, 'module-'+title, desc)
+            for title, (fn, desctype) in self.descrefs.iteritems():
+                yield (desctype, fn, title, '')
+
+        def dotsearch(string):
+            parts = string.lower().split('.')
+            for idx in xrange(0, len(parts)):
+                yield '.'.join(parts[idx:])
+
+        result = []
+        for type, docname, title, desc in possibilities():
+            best_res = 0
+            for part in dotsearch(title):
+                s.set_seq1(part)
+                if s.real_quick_ratio() >= cutoff and \
+                   s.quick_ratio() >= cutoff and \
+                   s.ratio() >= cutoff and \
+                   s.ratio() > best_res:
+                    best_res = s.ratio()
+            if best_res:
+                result.append((best_res, type, docname, title, desc))
+
+        return heapq.nlargest(n, result)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext
+    ~~~~~~~~~~
+
+    Contains Sphinx features not activated by default.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/autodoc.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,655 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.autodoc
+    ~~~~~~~~~~~~~~~~~~
+
+    Automatically insert docstrings for functions, classes or whole modules into
+    the doctree, thus avoiding duplication between docstrings and documentation
+    for those who like elaborate docstrings.
+
+    :copyright: 2008 by Georg Brandl, Pauli Virtanen, Martin Hans.
+    :license: BSD.
+"""
+
+import re
+import sys
+import types
+import inspect
+import linecache
+from types import FunctionType, BuiltinMethodType, MethodType
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+from docutils.statemachine import ViewList
+
+from sphinx.util import rpartition, nested_parse_with_titles
+from sphinx.directives.desc import py_sig_re
+
+try:
+    base_exception = BaseException
+except NameError:
+    base_exception = Exception
+
+_charset_re = re.compile(r'coding[:=]\s*([-\w.]+)')
+_module_charsets = {}
+
+
+class Options(object):
+    pass
+
+
+def is_static_method(obj):
+    """Check if the object given is a static method."""
+    if isinstance(obj, (FunctionType, classmethod)):
+        return True
+    elif isinstance(obj, BuiltinMethodType):
+        return obj.__self__ is not None
+    elif isinstance(obj, MethodType):
+        return obj.im_self is not None
+    return False
+
+
+class AutodocReporter(object):
+    """
+    A reporter replacement that assigns the correct source name
+    and line number to a system message, as recorded in a ViewList.
+    """
+    def __init__(self, viewlist, reporter):
+        self.viewlist = viewlist
+        self.reporter = reporter
+
+    def __getattr__(self, name):
+        return getattr(self.reporter, name)
+
+    def system_message(self, level, message, *children, **kwargs):
+        if 'line' in kwargs:
+            try:
+                source, line = self.viewlist.items[kwargs['line']]
+            except IndexError:
+                pass
+            else:
+                kwargs['source'] = source
+                kwargs['line'] = line
+        return self.reporter.system_message(level, message,
+                                            *children, **kwargs)
+
+    def debug(self, *args, **kwargs):
+        if self.reporter.debug_flag:
+            return self.system_message(0, *args, **kwargs)
+
+    def info(self, *args, **kwargs):
+        return self.system_message(1, *args, **kwargs)
+
+    def warning(self, *args, **kwargs):
+        return self.system_message(2, *args, **kwargs)
+
+    def error(self, *args, **kwargs):
+        return self.system_message(3, *args, **kwargs)
+
+    def severe(self, *args, **kwargs):
+        return self.system_message(4, *args, **kwargs)
+
+
+# Some useful event listener factories for autodoc-process-docstring.
+
+def cut_lines(pre, post=0, what=None):
+    """
+    Return a listener that removes the first *pre* and last *post*
+    lines of every docstring.  If *what* is a sequence of strings,
+    only docstrings of a type in *what* will be processed.
+
+    Use like this (e.g. in the ``setup()`` function of :file:`conf.py`)::
+
+       from sphinx.ext.autodoc import cut_lines
+       app.connect('autodoc-process-docstring', cut_lines(4, what=['module']))
+
+    This can (and should) be used in place of :confval:`automodule_skip_lines`.
+    """
+    def process(app, what_, name, obj, options, lines):
+        if what and what_ not in what:
+            return
+        del lines[:pre]
+        if post:
+            # remove one trailing blank line.
+            if lines and not lines[-1]:
+                lines.pop(-1)
+            del lines[-post:]
+        # make sure there is a blank line at the end
+        if lines and lines[-1]:
+            lines.append('')
+    return process
+
+def between(marker, what=None, keepempty=False):
+    """
+    Return a listener that only keeps lines between lines that match the
+    *marker* regular expression.  If no line matches, the resulting docstring
+    would be empty, so no change will be made unless *keepempty* is true.
+
+    If *what* is a sequence of strings, only docstrings of a type in *what* will
+    be processed.
+    """
+    marker_re = re.compile(marker)
+    def process(app, what_, name, obj, options, lines):
+        if what and what_ not in what:
+            return
+        deleted = 0
+        delete = True
+        orig_lines = lines[:]
+        for i, line in enumerate(orig_lines):
+            if delete:
+                lines.pop(i - deleted)
+                deleted += 1
+            if marker_re.match(line):
+                delete = not delete
+                if delete:
+                    lines.pop(i - deleted)
+                    deleted += 1
+        if not lines and not keepempty:
+            lines[:] = orig_lines
+        # make sure there is a blank line at the end
+        if lines and lines[-1]:
+            lines.append('')
+    return process
+
+
+def isdescriptor(x):
+    """Check if the object is some kind of descriptor."""
+    for item in '__get__', '__set__', '__delete__':
+        if callable(getattr(x, item, None)):
+            return True
+    return False
+
+
+def prepare_docstring(s):
+    """
+    Convert a docstring into lines of parseable reST.  Return it as a list of
+    lines usable for inserting into a docutils ViewList (used as argument
+    of nested_parse().)  An empty line is added to act as a separator between
+    this docstring and following content.
+    """
+    lines = s.expandtabs().splitlines()
+    # Find minimum indentation of any non-blank lines after first line.
+    margin = sys.maxint
+    for line in lines[1:]:
+        content = len(line.lstrip())
+        if content:
+            indent = len(line) - content
+            margin = min(margin, indent)
+    # Remove indentation.
+    if lines:
+        lines[0] = lines[0].lstrip()
+    if margin < sys.maxint:
+        for i in range(1, len(lines)): lines[i] = lines[i][margin:]
+    # Remove any leading blank lines.
+    while lines and not lines[0]:
+        lines.pop(0)
+    # make sure there is an empty line at the end
+    if lines and lines[-1]:
+        lines.append('')
+    return lines
+
+
+def get_module_charset(module):
+    """Return the charset of the given module (cached in _module_charsets)."""
+    if module in _module_charsets:
+        return _module_charsets[module]
+    try:
+        filename = __import__(module, None, None, ['foo']).__file__
+    except (ImportError, AttributeError):
+        return None
+    if filename[-4:].lower() in ('.pyc', '.pyo'):
+        filename = filename[:-1]
+    for line in [linecache.getline(filename, x) for x in (1, 2)]:
+        match = _charset_re.search(line)
+        if match is not None:
+            charset = match.group(1)
+            break
+    else:
+        charset = 'ascii'
+    _module_charsets[module] = charset
+    return charset
+
+
+class RstGenerator(object):
+    def __init__(self, options, document, lineno):
+        self.options = options
+        self.env = document.settings.env
+        self.reporter = document.reporter
+        self.lineno = lineno
+        self.filename_set = set()
+        self.warnings = []
+        self.result = ViewList()
+
+    def warn(self, msg):
+        self.warnings.append(self.reporter.warning(msg, line=self.lineno))
+
+    def get_doc(self, what, name, obj):
+        """Format and yield lines of the docstring(s) for the object."""
+        docstrings = []
+        if getattr(obj, '__doc__', None):
+            docstrings.append(obj.__doc__)
+        # skip some lines in module docstrings if configured
+        if what == 'module' and self.env.config.automodule_skip_lines and docstrings:
+            docstrings[0] = '\n'.join(docstrings[0].splitlines()
+                                      [self.env.config.automodule_skip_lines:])
+        # for classes, what the "docstring" is can be controlled via an option
+        if what in ('class', 'exception'):
+            content = self.env.config.autoclass_content
+            if content in ('both', 'init'):
+                initdocstring = getattr(obj, '__init__', None).__doc__
+                # for new-style classes, no __init__ means default __init__
+                if initdocstring == object.__init__.__doc__:
+                    initdocstring = None
+                if initdocstring:
+                    if content == 'init':
+                        docstrings = [initdocstring]
+                    else:
+                        docstrings.append(initdocstring)
+            # the default is only the class docstring
+
+        # decode the docstrings using the module's source encoding
+        charset = None
+        module = getattr(obj, '__module__', None)
+        if module is not None:
+            charset = get_module_charset(module)
+
+        for docstring in docstrings:
+            if isinstance(docstring, str):
+                if charset:
+                    docstring = docstring.decode(charset)
+                else:
+                    try:
+                        # try decoding with utf-8, should only work for real UTF-8
+                        docstring = docstring.decode('utf-8')
+                    except UnicodeError:
+                        # last resort -- can't fail
+                        docstring = docstring.decode('latin1')
+            docstringlines = prepare_docstring(docstring)
+            if self.env.app:
+                # let extensions preprocess docstrings
+                self.env.app.emit('autodoc-process-docstring',
+                                  what, name, obj, self.options, docstringlines)
+            for line in docstringlines:
+                yield line
+
+    def resolve_name(self, what, name):
+        """
+        Determine what module to import and what attribute to document.
+
+        Returns a tuple of: the full name, the module name, a path of
+        names to get via getattr, the signature and return annotation.
+        """
+        # first, parse the definition -- auto directives for classes and functions
+        # can contain a signature which is then used instead of an autogenerated one
+        try:
+            path, base, args, retann = py_sig_re.match(name).groups()
+        except:
+            self.warn('invalid signature for auto%s (%r)' % (what, name))
+            return
+        # fullname is the fully qualified name, base the name after the last dot
+        fullname = (path or '') + base
+
+        if what == 'module':
+            if args or retann:
+                self.warn('ignoring signature arguments and return annotation '
+                          'for automodule %s' % fullname)
+            return fullname, fullname, [], None, None
+
+        elif what in ('class', 'exception', 'function'):
+            if path:
+                mod = path.rstrip('.')
+            else:
+                mod = None
+                # if documenting a toplevel object without explicit module, it can
+                # be contained in another auto directive ...
+                if hasattr(self.env, 'autodoc_current_module'):
+                    mod = self.env.autodoc_current_module
+                # ... or in the scope of a module directive
+                if not mod:
+                    mod = self.env.currmodule
+            return fullname, mod, [base], args, retann
+
+        else:
+            if path:
+                mod_cls = path.rstrip('.')
+            else:
+                mod_cls = None
+                # if documenting a class-level object without path, there must be a
+                # current class, either from a parent auto directive ...
+                if hasattr(self.env, 'autodoc_current_class'):
+                    mod_cls = self.env.autodoc_current_class
+                # ... or from a class directive
+                if mod_cls is None:
+                    mod_cls = self.env.currclass
+                # ... if still None, there's no way to know
+                if mod_cls is None:
+                    return fullname, None, [], args, retann
+            mod, cls = rpartition(mod_cls, '.')
+            # if the module name is still missing, get it like above
+            if not mod and hasattr(self.env, 'autodoc_current_module'):
+                mod = self.env.autodoc_current_module
+            if not mod:
+                mod = self.env.currmodule
+            return fullname, mod, [cls, base], args, retann
+
+    def format_signature(self, what, name, obj, args, retann):
+        """
+        Return the signature of the object, formatted for display.
+        """
+        if what not in ('class', 'method', 'function'):
+            return ''
+
+        err = None
+        if args is not None:
+            # signature given explicitly
+            args = "(%s)" % args
+        else:
+            # try to introspect the signature
+            try:
+                args = None
+                getargs = True
+                if what == 'class':
+                    # for classes, the relevant signature is the __init__ method's
+                    obj = getattr(obj, '__init__', None)
+                    # classes without __init__ method, default __init__ or
+                    # __init__ written in C?
+                    if obj is None or obj is object.__init__ or not \
+                       (inspect.ismethod(obj) or inspect.isfunction(obj)):
+                        getargs = False
+                elif inspect.isbuiltin(obj) or inspect.ismethoddescriptor(obj):
+                    # can never get arguments of a C function or method
+                    getargs = False
+                if getargs:
+                    argspec = inspect.getargspec(obj)
+                    if what in ('class', 'method') and argspec[0] and \
+                           argspec[0][0] in ('cls', 'self'):
+                        del argspec[0][0]
+                    args = inspect.formatargspec(*argspec)
+            except Exception, e:
+                args = None
+                err = e
+
+        result = self.env.app.emit_firstresult('autodoc-process-signature', what,
+                                               name, obj, self.options, args, retann)
+        if result:
+            args, retann = result
+
+        if args is not None:
+            return '%s%s' % (args, retann or '')
+        elif err:
+            # re-raise the error for perusal of the handler in generate()
+            raise RuntimeError(err)
+        else:
+            return ''
+
+    def generate(self, what, name, members, add_content, indent=u'', check_module=False):
+        """
+        Generate reST for the object in self.result.
+        """
+        fullname, mod, objpath, args, retann = self.resolve_name(what, name)
+        if not mod:
+            # need a module to import
+            self.warn('don\'t know which module to import for autodocumenting %r '
+                      '(try placing a "module" or "currentmodule" directive in the '
+                      'document, or giving an explicit module name)' % fullname)
+            return
+
+        # the name to put into the generated directive -- doesn't contain the module
+        name_in_directive = '.'.join(objpath) or mod
+
+        # now, import the module and get object to document
+        try:
+            todoc = module = __import__(mod, None, None, ['foo'])
+            if hasattr(module, '__file__') and module.__file__:
+                modfile = module.__file__
+                if modfile[-4:].lower() in ('.pyc', '.pyo'):
+                    modfile = modfile[:-1]
+                self.filename_set.add(modfile)
+            else:
+                modfile = None  # e.g. for builtin and C modules
+            for part in objpath:
+                todoc = getattr(todoc, part)
+        except (ImportError, AttributeError), err:
+            self.warn('autodoc can\'t import/find %s %r, it reported error: "%s", '
+                      'please check your spelling and sys.path' %
+                      (what, str(fullname), err))
+            return
+
+        # check __module__ of object if wanted (for members not given explicitly)
+        if check_module:
+            if hasattr(todoc, '__module__'):
+                if todoc.__module__ != mod:
+                    return
+
+        # format the object's signature, if any
+        try:
+            sig = self.format_signature(what, name, todoc, args, retann)
+        except Exception, err:
+            self.warn('error while formatting signature for %s: %s' %
+                      (fullname, err))
+            sig = ''
+
+        # make sure that the result starts with an empty line.  This is
+        # necessary for some situations where another directive preprocesses
+        # reST and no starting newline is present
+        self.result.append(u'', '')
+
+        # now, create the directive header
+        directive = (what == 'method' and is_static_method(todoc)) \
+                    and 'staticmethod' or what
+        self.result.append(indent + u'.. %s:: %s%s' %
+                           (directive, name_in_directive, sig), '<autodoc>')
+        if what == 'module':
+            # Add some module-specific options
+            if self.options.synopsis:
+                self.result.append(indent + u'   :synopsis: ' + self.options.synopsis,
+                              '<autodoc>')
+            if self.options.platform:
+                self.result.append(indent + u'   :platform: ' + self.options.platform,
+                              '<autodoc>')
+            if self.options.deprecated:
+                self.result.append(indent + u'   :deprecated:', '<autodoc>')
+        else:
+            # Be explicit about the module, this is necessary since .. class:: doesn't
+            # support a prepended module name
+            self.result.append(indent + u'   :module: %s' % mod, '<autodoc>')
+        if self.options.noindex:
+            self.result.append(indent + u'   :noindex:', '<autodoc>')
+        self.result.append(u'', '<autodoc>')
+
+        if self.options.show_inheritance and what in ('class', 'exception'):
+            if len(todoc.__bases__):
+                bases = [b.__module__ == '__builtin__' and
+                         u':class:`%s`' % b.__name__ or
+                         u':class:`%s.%s`' % (b.__module__, b.__name__)
+                         for b in todoc.__bases__]
+                self.result.append(indent + u'   Bases: %s' % ', '.join(bases),
+                                   '<autodoc>')
+                self.result.append(u'', '<autodoc>')
+
+        # the module directive doesn't have content
+        if what != 'module':
+            indent += u'   '
+
+        if modfile:
+            sourcename = '%s:docstring of %s' % (modfile, fullname)
+        else:
+            sourcename = 'docstring of %s' % fullname
+
+        # add content from docstrings
+        for i, line in enumerate(self.get_doc(what, fullname, todoc)):
+            self.result.append(indent + line, sourcename, i)
+
+        # add source content, if present
+        if add_content:
+            for line, src in zip(add_content.data, add_content.items):
+                self.result.append(indent + line, src[0], src[1])
+
+        # document members?
+        if not members or what in ('function', 'method', 'attribute'):
+            return
+
+        # set current namespace for finding members
+        self.env.autodoc_current_module = mod
+        if objpath:
+            self.env.autodoc_current_class = objpath[0]
+
+        # add members, if possible
+        _all = members == ['__all__']
+        members_check_module = False
+        if _all:
+            # unqualified :members: given
+            if what == 'module':
+                if hasattr(todoc, '__all__'):
+                    members_check_module = False
+                    all_members = []
+                    for mname in todoc.__all__:
+                        try:
+                            all_members.append((mname, getattr(todoc, mname)))
+                        except AttributeError:
+                            self.warn('missing attribute mentioned in __all__: '
+                                      'module %s, attribute %s' %
+                                      (todoc.__name__, mname))
+                else:
+                    # for implicit module members, check __module__ to avoid
+                    # documenting imported objects
+                    members_check_module = True
+                    all_members = inspect.getmembers(todoc)
+            else:
+                if self.options.inherited_members:
+                    # getmembers() uses dir() which pulls in members from all
+                    # base classes
+                    all_members = inspect.getmembers(todoc)
+                else:
+                    # __dict__ contains only the members directly defined in the class
+                    all_members = sorted(todoc.__dict__.iteritems())
+        else:
+            all_members = [(mname, getattr(todoc, mname)) for mname in members]
+        for (membername, member) in all_members:
+            # ignore members whose name starts with _ by default
+            if _all and membername.startswith('_'):
+                continue
+
+            # ignore undocumented members if :undoc-members: is not given
+            doc = getattr(member, '__doc__', None)
+            skip = not self.options.undoc_members and not doc
+            # give the user a chance to decide whether this member should be skipped
+            if self.env.app:
+                # let extensions preprocess docstrings
+                skip_user = self.env.app.emit_firstresult(
+                    'autodoc-skip-member', what, membername, member, skip, self.options)
+                if skip_user is not None:
+                    skip = skip_user
+            if skip:
+                continue
+
+            if what == 'module':
+                if isinstance(member, (types.FunctionType,
+                                       types.BuiltinFunctionType)):
+                    memberwhat = 'function'
+                elif isinstance(member, types.ClassType) or \
+                     isinstance(member, type):
+                    if issubclass(member, base_exception):
+                        memberwhat = 'exception'
+                    else:
+                        memberwhat = 'class'
+                else:
+                    # XXX: todo -- attribute docs
+                    continue
+            else:
+                if callable(member):
+                    memberwhat = 'method'
+                elif isdescriptor(member):
+                    memberwhat = 'attribute'
+                else:
+                    # XXX: todo -- attribute docs
+                    continue
+            full_membername = fullname + '.' + membername
+            self.generate(memberwhat, full_membername, ['__all__'], None, indent,
+                          check_module=members_check_module)
+
+        self.env.autodoc_current_module = None
+        self.env.autodoc_current_class = None
+
+
+def _auto_directive(dirname, arguments, options, content, lineno,
+                    content_offset, block_text, state, state_machine):
+    what = dirname[4:]  # strip "auto"
+    name = arguments[0]
+    genopt = Options()
+    members = options.get('members', [])
+    genopt.inherited_members = 'inherited-members' in options
+    if genopt.inherited_members and not members:
+        # :inherited-members: implies :members:
+        members = ['__all__']
+    genopt.undoc_members = 'undoc-members' in options
+    genopt.show_inheritance = 'show-inheritance' in options
+    genopt.noindex = 'noindex' in options
+    genopt.synopsis = options.get('synopsis', '')
+    genopt.platform = options.get('platform', '')
+    genopt.deprecated = 'deprecated' in options
+
+    generator = RstGenerator(genopt, state.document, lineno)
+    generator.generate(what, name, members, content)
+    if not generator.result:
+        return generator.warnings
+
+    # record all filenames as dependencies -- this will at least partially make
+    # automatic invalidation possible
+    for fn in generator.filename_set:
+        state.document.settings.env.note_dependency(fn)
+
+    # use a custom reporter that correctly assigns lines to source and lineno
+    old_reporter = state.memo.reporter
+    state.memo.reporter = AutodocReporter(generator.result, state.memo.reporter)
+    if dirname == 'automodule':
+        node = nodes.section()
+        nested_parse_with_titles(state, generator.result, node)
+    else:
+        node = nodes.paragraph()
+        state.nested_parse(generator.result, 0, node)
+    state.memo.reporter = old_reporter
+    return generator.warnings + node.children
+
+def auto_directive(*args, **kwds):
+    return _auto_directive(*args, **kwds)
+
+def automodule_directive(*args, **kwds):
+    return _auto_directive(*args, **kwds)
+
+def autoclass_directive(*args, **kwds):
+    return _auto_directive(*args, **kwds)
+
+
+def members_option(arg):
+    if arg is None:
+        return ['__all__']
+    return [x.strip() for x in arg.split(',')]
+
+
+def setup(app):
+    mod_options = {'members': members_option, 'undoc-members': directives.flag,
+                   'noindex': directives.flag, 'inherited-members': directives.flag,
+                   'show-inheritance': directives.flag, 'synopsis': lambda x: x,
+                   'platform': lambda x: x, 'deprecated': directives.flag}
+    cls_options = {'members': members_option, 'undoc-members': directives.flag,
+                   'noindex': directives.flag, 'inherited-members': directives.flag,
+                   'show-inheritance': directives.flag}
+    app.add_directive('automodule', automodule_directive,
+                      1, (1, 0, 1), **mod_options)
+    app.add_directive('autoclass', autoclass_directive,
+                      1, (1, 0, 1), **cls_options)
+    app.add_directive('autoexception', autoclass_directive,
+                      1, (1, 0, 1), **cls_options)
+    app.add_directive('autofunction', auto_directive, 1, (1, 0, 1),
+                      noindex=directives.flag)
+    app.add_directive('automethod', auto_directive, 1, (1, 0, 1),
+                      noindex=directives.flag)
+    app.add_directive('autoattribute', auto_directive, 1, (1, 0, 1),
+                      noindex=directives.flag)
+    # deprecated: remove in some future version.
+    app.add_config_value('automodule_skip_lines', 0, True)
+    app.add_config_value('autoclass_content', 'class', True)
+    app.add_event('autodoc-process-docstring')
+    app.add_event('autodoc-process-signature')
+    app.add_event('autodoc-skip-member')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/coverage.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,241 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.coverage
+    ~~~~~~~~~~~~~~~~~~~
+
+    Check Python modules and C API for coverage.  Mostly written by Josip
+    Dzolonga for the Google Highly Open Participation contest.
+
+    :copyright: 2008 by Josip Dzolonga, Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import glob
+import inspect
+import cPickle as pickle
+from os import path
+
+from sphinx.builder import Builder
+
+
+# utility
+def write_header(f, text, char='-'):
+    f.write(text + '\n')
+    f.write(char * len(text) + '\n')
+
+def compile_regex_list(name, exps, warnfunc):
+    lst = []
+    for exp in exps:
+        try:
+            lst.append(re.compile(exp))
+        except Exception:
+            warnfunc('invalid regex %r in %s' % (exp, name))
+    return lst
+
+
+class CoverageBuilder(Builder):
+
+    name = 'coverage'
+
+    def init(self):
+        self.c_sourcefiles = []
+        for pattern in self.config.coverage_c_path:
+            pattern = path.join(self.srcdir, pattern)
+            self.c_sourcefiles.extend(glob.glob(pattern))
+
+        self.c_regexes = []
+        for (name, exp) in self.config.coverage_c_regexes.items():
+            try:
+                self.c_regexes.append((name, re.compile(exp)))
+            except Exception:
+                self.warn('invalid regex %r in coverage_c_regexes' % exp)
+
+        self.c_ignorexps = {}
+        for (name, exps) in self.config.coverage_ignore_c_items.iteritems():
+            self.c_ignorexps[name] = compile_regex_list('coverage_ignore_c_items',
+                                                        exps, self.warn)
+        self.mod_ignorexps = compile_regex_list('coverage_ignore_modules',
+                                                self.config.coverage_ignore_modules,
+                                                self.warn)
+        self.cls_ignorexps = compile_regex_list('coverage_ignore_classes',
+                                                self.config.coverage_ignore_classes,
+                                                self.warn)
+        self.fun_ignorexps = compile_regex_list('coverage_ignore_functions',
+                                                self.config.coverage_ignore_functions,
+                                                self.warn)
+
+    def get_outdated_docs(self):
+        return 'coverage overview'
+
+    def write(self, *ignored):
+        self.py_undoc = {}
+        self.build_py_coverage()
+        self.write_py_coverage()
+
+        self.c_undoc = {}
+        self.build_c_coverage()
+        self.write_c_coverage()
+
+    def build_c_coverage(self):
+        # Fetch all the info from the header files
+        for filename in self.c_sourcefiles:
+            undoc = []
+            f = open(filename, 'r')
+            try:
+                for line in f:
+                    for key, regex in self.c_regexes:
+                        match = regex.match(line)
+                        if match:
+                            name = match.groups()[0]
+                            if name not in self.env.descrefs:
+                                for exp in self.c_ignorexps.get(key, ()):
+                                    if exp.match(name):
+                                        break
+                                else:
+                                    undoc.append((key, name))
+                            continue
+            finally:
+                f.close()
+            if undoc:
+                self.c_undoc[filename] = undoc
+
+    def write_c_coverage(self):
+        output_file = path.join(self.outdir, 'c.txt')
+        op = open(output_file, 'w')
+        try:
+            write_header(op, 'Undocumented C API elements', '=')
+            op.write('\n')
+
+            for filename, undoc in self.c_undoc.iteritems():
+                write_header(op, filename)
+                for typ, name in undoc:
+                    op.write(' * %-50s [%9s]\n' % (name, typ))
+                op.write('\n')
+        finally:
+            op.close()
+
+    def build_py_coverage(self):
+        for mod_name in self.env.modules:
+            ignore = False
+            for exp in self.mod_ignorexps:
+                if exp.match(mod_name):
+                    ignore = True
+                    break
+            if ignore:
+                continue
+
+            try:
+                mod = __import__(mod_name, fromlist=['foo'])
+            except ImportError, err:
+                self.warn('module %s could not be imported: %s' % (mod_name, err))
+                self.py_undoc[mod_name] = {'error': err}
+                continue
+
+            funcs = []
+            classes = {}
+
+            for name, obj in inspect.getmembers(mod):
+                # diverse module attributes are ignored:
+                if name[0] == '_':
+                    # begins in an underscore
+                    continue
+                if not hasattr(obj, '__module__'):
+                    # cannot be attributed to a module
+                    continue
+                if obj.__module__ != mod_name:
+                    # is not defined in this module
+                    continue
+
+                full_name = '%s.%s' % (mod_name, name)
+
+                if inspect.isfunction(obj):
+                    if full_name not in self.env.descrefs:
+                        for exp in self.fun_ignorexps:
+                            if exp.match(name):
+                                break
+                        else:
+                            funcs.append(name)
+                elif inspect.isclass(obj):
+                    for exp in self.cls_ignorexps:
+                        if exp.match(name):
+                            break
+                    else:
+                        if full_name not in self.env.descrefs:
+                            # not documented at all
+                            classes[name] = []
+                            continue
+
+                        attrs = []
+
+                        for attr_name, attr in inspect.getmembers(obj, inspect.ismethod):
+                            if attr_name[0] == '_':
+                                # starts with an underscore, ignore it
+                                continue
+
+                            full_attr_name = '%s.%s' % (full_name, attr_name)
+                            if full_attr_name not in self.env.descrefs:
+                                attrs.append(attr_name)
+
+                        if attrs:
+                            # some attributes are undocumented
+                            classes[name] = attrs
+
+            self.py_undoc[mod_name] = {'funcs': funcs, 'classes': classes}
+
+    def write_py_coverage(self):
+        output_file = path.join(self.outdir, 'python.txt')
+        op = open(output_file, 'w')
+        failed = []
+        try:
+            write_header(op, 'Undocumented Python objects', '=')
+
+            keys = self.py_undoc.keys()
+            keys.sort()
+            for name in keys:
+                undoc = self.py_undoc[name]
+                if 'error' in undoc:
+                    failed.append((name, undoc['error']))
+                else:
+                    if not undoc['classes'] and not undoc['funcs']:
+                        continue
+
+                    write_header(op, name)
+                    if undoc['funcs']:
+                        op.write('Functions:\n')
+                        op.writelines(' * %s\n' % x for x in undoc['funcs'])
+                        op.write('\n')
+                    if undoc['classes']:
+                        op.write('Classes:\n')
+                        for name, methods in undoc['classes'].iteritems():
+                            if not methods:
+                                op.write(' * %s\n' % name)
+                            else:
+                                op.write(' * %s -- missing methods:\n' % name)
+                                op.writelines('   - %s\n' % x for x in methods)
+                        op.write('\n')
+
+            if failed:
+                write_header(op, 'Modules that failed to import')
+                op.writelines(' * %s -- %s\n' % x for x in failed)
+        finally:
+            op.close()
+
+    def finish(self):
+        # dump the coverage data to a pickle file too
+        picklepath = path.join(self.outdir, 'undoc.pickle')
+        dumpfile = open(picklepath, 'wb')
+        try:
+            pickle.dump((self.py_undoc, self.c_undoc), dumpfile)
+        finally:
+            dumpfile.close()
+
+
+def setup(app):
+    app.add_builder(CoverageBuilder)
+    app.add_config_value('coverage_ignore_modules', [], False)
+    app.add_config_value('coverage_ignore_functions', [], False)
+    app.add_config_value('coverage_ignore_classes', [], False)
+    app.add_config_value('coverage_c_path', [], False)
+    app.add_config_value('coverage_c_regexes', {}, False)
+    app.add_config_value('coverage_ignore_c_items', {}, False)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/doctest.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,337 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.doctest
+    ~~~~~~~~~~~~~~~~~~
+
+    Mimic doctest by automatically executing code snippets and checking
+    their results.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import sys
+import time
+import codecs
+import StringIO
+from os import path
+# circumvent relative import
+doctest = __import__('doctest')
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx.builder import Builder
+from sphinx.util.console import bold
+
+blankline_re = re.compile(r'^\s*<BLANKLINE>', re.MULTILINE)
+doctestopt_re = re.compile(r'#\s*doctest:.+$', re.MULTILINE)
+
+# set up the necessary directives
+
+def test_directive(name, arguments, options, content, lineno,
+                   content_offset, block_text, state, state_machine):
+    # use ordinary docutils nodes for test code: they get special attributes
+    # so that our builder recognizes them, and the other builders are happy.
+    code = '\n'.join(content)
+    test = None
+    if name == 'doctest':
+        if '<BLANKLINE>' in code:
+            # convert <BLANKLINE>s to ordinary blank lines for presentation
+            test = code
+            code = blankline_re.sub('', code)
+        if doctestopt_re.search(code):
+            if not test:
+                test = code
+            code = doctestopt_re.sub('', code)
+    nodetype = nodes.literal_block
+    if name == 'testsetup' or 'hide' in options:
+        nodetype = nodes.comment
+    if arguments:
+        groups = [x.strip() for x in arguments[0].split(',')]
+    else:
+        groups = ['default']
+    node = nodetype(code, code, testnodetype=name, groups=groups)
+    node.line = lineno
+    if test is not None:
+        # only save if it differs from code
+        node['test'] = test
+    if name == 'testoutput':
+        # don't try to highlight output
+        node['language'] = 'none'
+    node['options'] = {}
+    if name in ('doctest', 'testoutput') and 'options' in options:
+        # parse doctest-like output comparison flags
+        option_strings = options['options'].replace(',', ' ').split()
+        for option in option_strings:
+            if (option[0] not in '+-' or option[1:] not in
+                doctest.OPTIONFLAGS_BY_NAME):
+                # XXX warn?
+                continue
+            flag = doctest.OPTIONFLAGS_BY_NAME[option[1:]]
+            node['options'][flag] = (option[0] == '+')
+    return [node]
+
+# need to have individual functions for each directive due to different
+# options they accept
+
+def testsetup_directive(*args):
+    return test_directive(*args)
+
+def doctest_directive(*args):
+    return test_directive(*args)
+
+def testcode_directive(*args):
+    return test_directive(*args)
+
+def testoutput_directive(*args):
+    return test_directive(*args)
+
+
+parser = doctest.DocTestParser()
+
+# helper classes
+
+class TestGroup(object):
+    def __init__(self, name):
+        self.name = name
+        self.setup = []
+        self.tests = []
+
+    def add_code(self, code):
+        if code.type == 'testsetup':
+            self.setup.append(code)
+        elif code.type == 'doctest':
+            self.tests.append([code])
+        elif code.type == 'testcode':
+            self.tests.append([code, None])
+        elif code.type == 'testoutput':
+            if self.tests and len(self.tests[-1]) == 2:
+                self.tests[-1][1] = code
+        else:
+            raise RuntimeError('invalid TestCode type')
+
+    def __repr__(self):
+        return 'TestGroup(name=%r, setup=%r, tests=%r)' % (
+            self.name, self.setup, self.tests)
+
+
+class TestCode(object):
+    def __init__(self, code, type, lineno, options=None):
+        self.code = code
+        self.type = type
+        self.lineno = lineno
+        self.options = options or {}
+
+    def __repr__(self):
+        return 'TestCode(%r, %r, %r, options=%r)' % (
+            self.code, self.type, self.lineno, self.options)
+
+
+class SphinxDocTestRunner(doctest.DocTestRunner):
+    def summarize(self, out, verbose=None):
+        io = StringIO.StringIO()
+        old_stdout = sys.stdout
+        sys.stdout = io
+        try:
+            res = doctest.DocTestRunner.summarize(self, verbose)
+        finally:
+            sys.stdout = old_stdout
+        out(io.getvalue())
+        return res
+
+# the new builder -- use sphinx-build.py -b doctest to run
+
+class DocTestBuilder(Builder):
+    """
+    Runs test snippets in the documentation.
+    """
+    name = 'doctest'
+
+    def init(self):
+        # default options
+        self.opt = doctest.DONT_ACCEPT_TRUE_FOR_1 | doctest.ELLIPSIS | \
+                   doctest.IGNORE_EXCEPTION_DETAIL
+
+        # HACK HACK HACK
+        # doctest compiles its snippets with type 'single'. That is nice
+        # for doctest examples but unusable for multi-statement code such
+        # as setup code -- to be able to use doctest error reporting with
+        # that code nevertheless, we monkey-patch the "compile" it uses.
+        doctest.compile = self.compile
+
+        self.type = 'single'
+
+        self.total_failures = 0
+        self.total_tries = 0
+        self.setup_failures = 0
+        self.setup_tries = 0
+
+        date = time.strftime('%Y-%m-%d %H:%M:%S')
+
+        self.outfile = codecs.open(path.join(self.outdir, 'output.txt'),
+                                   'w', encoding='utf-8')
+        self.outfile.write('''\
+Results of doctest builder run on %s
+==================================%s
+''' % (date, '='*len(date)))
+
+    def _out(self, text):
+        self.info(text, nonl=True)
+        self.outfile.write(text)
+
+    def _warn_out(self, text):
+        self.info(text, nonl=True)
+        if self.app.quiet:
+            self.warn(text)
+        self.outfile.write(text)
+
+    def get_target_uri(self, docname, typ=None):
+        return ''
+
+    def get_outdated_docs(self):
+        return self.env.found_docs
+
+    def finish(self):
+        # write executive summary
+        def s(v):
+            return v != 1 and 's' or ''
+        self._out('''
+Doctest summary
+===============
+%5d test%s
+%5d failure%s in tests
+%5d failure%s in setup code
+''' % (self.total_tries, s(self.total_tries),
+       self.total_failures, s(self.total_failures),
+       self.setup_failures, s(self.setup_failures)))
+        self.outfile.close()
+
+        if self.total_failures or self.setup_failures:
+            self.app.statuscode = 1
+
+        sys.path[0:0] = self.config.doctest_path
+
+    def write(self, build_docnames, updated_docnames, method='update'):
+        if build_docnames is None:
+            build_docnames = sorted(self.env.all_docs)
+
+        self.info(bold('running tests...'))
+        for docname in build_docnames:
+            # no need to resolve the doctree
+            doctree = self.env.get_doctree(docname)
+            self.test_doc(docname, doctree)
+
+    def test_doc(self, docname, doctree):
+        groups = {}
+        add_to_all_groups = []
+        self.setup_runner = SphinxDocTestRunner(verbose=False,
+                                                optionflags=self.opt)
+        self.test_runner = SphinxDocTestRunner(verbose=False,
+                                               optionflags=self.opt)
+        if self.config.doctest_test_doctest_blocks:
+            def condition(node):
+                return (isinstance(node, (nodes.literal_block, nodes.comment))
+                        and node.has_key('testnodetype')) or \
+                       isinstance(node, nodes.doctest_block)
+        else:
+            def condition(node):
+                return isinstance(node, (nodes.literal_block, nodes.comment)) \
+                        and node.has_key('testnodetype')
+        for node in doctree.traverse(condition):
+            source = node.has_key('test') and node['test'] or node.astext()
+            if not source:
+                self.warn('no code/output in %s block at %s:%s' %
+                          (node.get('testnodetype', 'doctest'),
+                           self.env.doc2path(docname), node.line))
+            code = TestCode(source, type=node.get('testnodetype', 'doctest'),
+                            lineno=node.line, options=node.get('options'))
+            node_groups = node.get('groups', ['default'])
+            if '*' in node_groups:
+                add_to_all_groups.append(code)
+                continue
+            for groupname in node_groups:
+                if groupname not in groups:
+                    groups[groupname] = TestGroup(groupname)
+                groups[groupname].add_code(code)
+        for code in add_to_all_groups:
+            for group in groups.itervalues():
+                group.add_code(code)
+        if not groups:
+            return
+
+        self._out('\nDocument: %s\n----------%s\n' % (docname, '-'*len(docname)))
+        for group in groups.itervalues():
+            self.test_group(group, self.env.doc2path(docname, base=None))
+        # Separately count results from setup code
+        res_f, res_t = self.setup_runner.summarize(self._out, verbose=False)
+        self.setup_failures += res_f
+        self.setup_tries += res_t
+        if self.test_runner.tries:
+            res_f, res_t = self.test_runner.summarize(self._out, verbose=True)
+            self.total_failures += res_f
+            self.total_tries += res_t
+
+    def compile(self, code, name, type, flags, dont_inherit):
+        return compile(code, name, self.type, flags, dont_inherit)
+
+    def test_group(self, group, filename):
+        ns = {}
+        examples = []
+        for setup in group.setup:
+            examples.append(doctest.Example(setup.code, '', lineno=setup.lineno))
+        if examples:
+            # simulate a doctest with the setup code
+            setup_doctest = doctest.DocTest(examples, {},
+                                            '%s (setup code)' % group.name,
+                                            filename, 0, None)
+            setup_doctest.globs = ns
+            old_f = self.setup_runner.failures
+            self.type = 'exec' # the snippet may contain multiple statements
+            self.setup_runner.run(setup_doctest, out=self._warn_out,
+                                  clear_globs=False)
+            if self.setup_runner.failures > old_f:
+                # don't run the group
+                return
+        for code in group.tests:
+            if len(code) == 1:
+                test = parser.get_doctest(code[0].code, {},
+                                          group.name, filename, code[0].lineno)
+                if not test.examples:
+                    continue
+                for example in test.examples:
+                    # apply directive's comparison options
+                    new_opt = code[0].options.copy()
+                    new_opt.update(example.options)
+                    example.options = new_opt
+                self.type = 'single' # ordinary doctests
+            else:
+                output = code[1] and code[1].code or ''
+                options = code[1] and code[1].options or {}
+                # disable <BLANKLINE> processing as it is not needed
+                options[doctest.DONT_ACCEPT_BLANKLINE] = True
+                example = doctest.Example(code[0].code, output,
+                                          lineno=code[0].lineno,
+                                          options=options)
+                test = doctest.DocTest([example], {}, group.name,
+                                       filename, code[0].lineno, None)
+                self.type = 'exec' # multiple statements again
+            # DocTest.__init__ copies the globs namespace, which we don't want
+            test.globs = ns
+            # also don't clear the globs namespace after running the doctest
+            self.test_runner.run(test, out=self._warn_out, clear_globs=False)
+
+
+def setup(app):
+    app.add_directive('testsetup', testsetup_directive, 1, (0, 1, 1))
+    app.add_directive('doctest', doctest_directive, 1, (0, 1, 1),
+                      hide=directives.flag, options=directives.unchanged)
+    app.add_directive('testcode', testcode_directive, 1, (0, 1, 1),
+                      hide=directives.flag)
+    app.add_directive('testoutput', testoutput_directive, 1, (0, 1, 1),
+                      hide=directives.flag, options=directives.unchanged)
+    app.add_builder(DocTestBuilder)
+    # this config value adds to sys.path
+    app.add_config_value('doctest_path', [], False)
+    app.add_config_value('doctest_test_doctest_blocks', 'default', False)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/ifconfig.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.ifconfig
+    ~~~~~~~~~~~~~~~~~~~
+
+    Provides the ``ifconfig`` directive that allows to write documentation
+    that is included depending on configuration variables.
+
+    Usage::
+
+        .. ifconfig:: releaselevel in ('alpha', 'beta', 'rc')
+
+           This stuff is only included in the built docs for unstable versions.
+
+    The argument for ``ifconfig`` is a plain Python expression, evaluated in the
+    namespace of the project configuration (that is, all variables from ``conf.py``
+    are available.)
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from docutils import nodes
+
+
+class ifconfig(nodes.Element): pass
+
+
+def ifconfig_directive(name, arguments, options, content, lineno,
+                       content_offset, block_text, state, state_machine):
+    node = ifconfig()
+    node.line = lineno
+    node['expr'] = arguments[0]
+    state.nested_parse(content, content_offset, node)
+    return [node]
+
+
+def process_ifconfig_nodes(app, doctree, docname):
+    ns = app.config.__dict__.copy()
+    ns['builder'] = app.builder.name
+    for node in doctree.traverse(ifconfig):
+        try:
+            res = eval(node['expr'], ns)
+        except Exception, err:
+            # handle exceptions in a clean fashion
+            from traceback import format_exception_only
+            msg = ''.join(format_exception_only(err.__class__, err))
+            newnode = doctree.reporter.error('Exception occured in '
+                                             'ifconfig expression: \n%s' %
+                                             msg, base_node=node)
+            node.replace_self(newnode)
+        else:
+            if not res:
+                node.replace_self([])
+            else:
+                node.replace_self(node.children)
+
+
+def setup(app):
+    app.add_node(ifconfig)
+    app.add_directive('ifconfig', ifconfig_directive, 1, (1, 0, 1))
+    app.connect('doctree-resolved', process_ifconfig_nodes)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/intersphinx.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,141 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.intersphinx
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Insert links to Python objects documented in remote Sphinx documentation.
+
+    This works as follows:
+
+    * Each Sphinx HTML build creates a file named "objects.inv" that contains
+      a mapping from Python identifiers to URIs relative to the HTML set's root.
+
+    * Projects using the Intersphinx extension can specify links to such mapping
+      files in the `intersphinx_mapping` config value.  The mapping will then be
+      used to resolve otherwise missing references to Python objects into links
+      to the other documentation.
+
+    * By default, the mapping file is assumed to be at the same location as the
+      rest of the documentation; however, the location of the mapping file can
+      also be specified individually, e.g. if the docs should be buildable
+      without Internet access.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import time
+import urllib
+import posixpath
+from os import path
+
+from docutils import nodes
+
+from sphinx.builder import INVENTORY_FILENAME
+
+
+def fetch_inventory(app, uri, inv):
+    """Fetch, parse and return an intersphinx inventory file."""
+    invdata = {}
+    # both *uri* (base URI of the links to generate) and *inv* (actual
+    # location of the inventory file) can be local or remote URIs
+    localuri = uri.find('://') == -1
+    try:
+        if inv.find('://') != -1:
+            f = urllib.urlopen(inv)
+        else:
+            f = open(path.join(app.srcdir, inv))
+    except Exception, err:
+        app.warn('intersphinx inventory %r not fetchable due to '
+                 '%s: %s' % (inv, err.__class__, err))
+        return
+    try:
+        line = f.next()
+        if line.rstrip() != '# Sphinx inventory version 1':
+            raise ValueError('unknown or unsupported inventory version')
+        line = f.next()
+        projname = line.rstrip()[11:].decode('utf-8')
+        line = f.next()
+        version = line.rstrip()[11:]
+        for line in f:
+            name, type, location = line.rstrip().split(None, 2)
+            if localuri:
+                location = path.join(uri, location)
+            else:
+                location = posixpath.join(uri, location)
+            invdata[name] = (type, projname, version, location)
+        f.close()
+    except Exception, err:
+        app.warn('intersphinx inventory %r not readable due to '
+                 '%s: %s' % (inv, err.__class__, err))
+    else:
+        return invdata
+
+
+def load_mappings(app):
+    """Load all intersphinx mappings into the environment."""
+    now = int(time.time())
+    cache_time = now - app.config.intersphinx_cache_limit * 86400
+    env = app.builder.env
+    if not hasattr(env, 'intersphinx_cache'):
+        env.intersphinx_cache = {}
+    cache = env.intersphinx_cache
+    update = False
+    for uri, inv in app.config.intersphinx_mapping.iteritems():
+        # we can safely assume that the uri<->inv mapping is not changed
+        # during partial rebuilds since a changed intersphinx_mapping
+        # setting will cause a full environment reread
+        if not inv:
+            inv = posixpath.join(uri, INVENTORY_FILENAME)
+        # decide whether the inventory must be read: always read local
+        # files; remote ones only if the cache time is expired
+        if '://' not in inv or uri not in cache \
+               or cache[uri][0] < cache_time:
+            invdata = fetch_inventory(app, uri, inv)
+            cache[uri] = (now, invdata)
+            update = True
+    if update:
+        env.intersphinx_inventory = {}
+        for _, invdata in cache.itervalues():
+            if invdata:
+                env.intersphinx_inventory.update(invdata)
+
+
+def missing_reference(app, env, node, contnode):
+    """Attempt to resolve a missing reference via intersphinx references."""
+    type = node['reftype']
+    target = node['reftarget']
+    if type == 'mod':
+        type, proj, version, uri = env.intersphinx_inventory.get(target,
+                                                                 ('','','',''))
+        if type != 'mod':
+            return None
+        target = 'module-' + target   # for link anchor
+    else:
+        if target[-2:] == '()':
+            target = target[:-2]
+        target = target.rstrip(' *')
+        # special case: exceptions and object methods
+        if type == 'exc' and '.' not in target and \
+           'exceptions.' + target in env.intersphinx_inventory:
+            target = 'exceptions.' + target
+        elif type in ('func', 'meth') and '.' not in target and \
+           'object.' + target in env.intersphinx_inventory:
+            target = 'object.' + target
+        if target not in env.intersphinx_inventory:
+            return None
+        type, proj, version, uri = env.intersphinx_inventory[target]
+    print "Intersphinx hit:", target, uri
+    newnode = nodes.reference('', '')
+    newnode['refuri'] = uri + '#' + target
+    newnode['reftitle'] = '(in %s v%s)' % (proj, version)
+    newnode['class'] = 'external-xref'
+    newnode.append(contnode)
+    return newnode
+
+
+def setup(app):
+    app.add_config_value('intersphinx_mapping', {}, True)
+    app.add_config_value('intersphinx_cache_limit', 5, False)
+    app.connect('missing-reference', missing_reference)
+    app.connect('builder-inited', load_mappings)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/jsmath.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.jsmath
+    ~~~~~~~~~~~~~~~~~
+
+    Set up everything for use of JSMath to display math in HTML
+    via JavaScript.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from docutils import nodes
+
+from sphinx.application import ExtensionError
+from sphinx.ext.mathbase import setup as mathbase_setup
+
+
+def html_visit_math(self, node):
+    self.body.append(self.starttag(node, 'span', '', CLASS='math'))
+    self.body.append(self.encode(node['latex']) + '</span>')
+    raise nodes.SkipNode
+
+def html_visit_displaymath(self, node):
+    if node['nowrap']:
+        self.body.append(self.starttag(node, 'div', CLASS='math'))
+        self.body.append(node['latex'])
+        self.body.append('</div>')
+        raise nodes.SkipNode
+    for i, part in enumerate(node['latex'].split('\n\n')):
+        part = self.encode(part)
+        if i == 0:
+            # necessary to e.g. set the id property correctly
+            if node['number']:
+                self.body.append('<span class="eqno">(%s)</span>' % node['number'])
+            self.body.append(self.starttag(node, 'div', CLASS='math'))
+        else:
+            # but only once!
+            self.body.append('<div class="math">')
+        if '&' in part or '\\\\' in part:
+            self.body.append('\\begin{split}' + part + '\\end{split}')
+        else:
+            self.body.append(part)
+        self.body.append('</div>\n')
+    raise nodes.SkipNode
+
+def builder_inited(app):
+    if not app.config.jsmath_path:
+        raise ExtensionError('jsmath_path config value must be set for the '
+                             'jsmath extension to work')
+    app.add_javascript(app.config.jsmath_path)
+
+
+def setup(app):
+    mathbase_setup(app, (html_visit_math, None), (html_visit_displaymath, None))
+    app.add_config_value('jsmath_path', '', False)
+    app.connect('builder-inited', builder_inited)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/mathbase.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,139 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.mathbase
+    ~~~~~~~~~~~~~~~~~~~
+
+    Set up math support in source files and LaTeX/text output.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from docutils import nodes, utils
+from docutils.parsers.rst import directives
+
+
+class math(nodes.Inline, nodes.TextElement):
+    pass
+
+class displaymath(nodes.Part, nodes.Element):
+    pass
+
+class eqref(nodes.Inline, nodes.TextElement):
+    pass
+
+
+def wrap_displaymath(math, label):
+    parts = math.split('\n\n')
+    ret = []
+    for i, part in enumerate(parts):
+        if label is not None and i == 0:
+            ret.append('\\begin{split}%s\\end{split}' % part +
+                       (label and '\\label{'+label+'}' or ''))
+        else:
+            ret.append('\\begin{split}%s\\end{split}\\notag' % part)
+    return '\\begin{gather}\n' + '\\\\'.join(ret) + '\n\\end{gather}'
+
+
+def math_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
+    latex = utils.unescape(text, restore_backslashes=True)
+    return [math(latex=latex)], []
+
+def eq_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
+    text = utils.unescape(text)
+    node = eqref('(?)', '(?)', target=text)
+    node['docname'] = inliner.document.settings.env.docname
+    return [node], []
+
+def math_directive(name, arguments, options, content, lineno,
+                   content_offset, block_text, state, state_machine):
+    latex = '\n'.join(content)
+    if arguments and arguments[0]:
+        latex = arguments[0] + '\n\n' + latex
+    node = displaymath()
+    node['latex'] = latex
+    node['label'] = options.get('label', None)
+    node['nowrap'] = 'nowrap' in options
+    node['docname'] = state.document.settings.env.docname
+    ret = [node]
+    if node['label']:
+        tnode = nodes.target('', '', ids=['equation-' + node['label']])
+        state.document.note_explicit_target(tnode)
+        ret.insert(0, tnode)
+    return ret
+
+
+def latex_visit_math(self, node):
+    self.body.append('$' + node['latex'] + '$')
+    raise nodes.SkipNode
+
+def latex_visit_displaymath(self, node):
+    if node['nowrap']:
+        self.body.append(node['latex'])
+    else:
+        label = node['label'] and node['docname'] + '-' + node['label'] or None
+        self.body.append(wrap_displaymath(node['latex'], label))
+    raise nodes.SkipNode
+
+def latex_visit_eqref(self, node):
+    self.body.append('\\eqref{%s-%s}' % (node['docname'], node['target']))
+    raise nodes.SkipNode
+
+
+def text_visit_math(self, node):
+    self.add_text(node['latex'])
+    raise nodes.SkipNode
+
+def text_visit_displaymath(self, node):
+    self.new_state()
+    self.add_text(node['latex'])
+    self.end_state()
+    raise nodes.SkipNode
+
+def text_visit_eqref(self, node):
+    self.add_text(node['target'])
+    raise nodes.SkipNode
+
+
+def html_visit_eqref(self, node):
+    self.body.append('<a href="#equation-%s">' % node['target'])
+
+def html_depart_eqref(self, node):
+    self.body.append('</a>')
+
+
+def number_equations(app, doctree, docname):
+    num = 0
+    numbers = {}
+    for node in doctree.traverse(displaymath):
+        if node['label'] is not None:
+            num += 1
+            node['number'] = num
+            numbers[node['label']] = num
+        else:
+            node['number'] = None
+    for node in doctree.traverse(eqref):
+        if node['target'] not in numbers:
+            continue
+        num = '(%d)' % numbers[node['target']]
+        node[0] = nodes.Text(num, num)
+
+
+def setup(app, htmlinlinevisitors, htmldisplayvisitors):
+    app.add_node(math,
+                 latex=(latex_visit_math, None),
+                 text=(text_visit_math, None),
+                 html=htmlinlinevisitors)
+    app.add_node(displaymath,
+                 latex=(latex_visit_displaymath, None),
+                 text=(text_visit_displaymath, None),
+                 html=htmldisplayvisitors)
+    app.add_node(eqref,
+                 latex=(latex_visit_eqref, None),
+                 text=(text_visit_eqref, None),
+                 html=(html_visit_eqref, html_depart_eqref))
+    app.add_role('math', math_role)
+    app.add_role('eq', eq_role)
+    app.add_directive('math', math_directive, 1, (0, 1, 1),
+                      label=directives.unchanged, nowrap=directives.flag)
+    app.connect('doctree-resolved', number_equations)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/pngmath.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,224 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.pngmath
+    ~~~~~~~~~~~~~~~~~~
+
+    Render math in HTML via dvipng.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import shutil
+import tempfile
+import posixpath
+from os import path, getcwd, chdir
+from subprocess import Popen, PIPE
+try:
+    from hashlib import sha1 as sha
+except ImportError:
+    from sha import sha
+
+from docutils import nodes
+
+from sphinx.util import ensuredir
+from sphinx.util.png import read_png_depth, write_png_depth
+from sphinx.application import SphinxError
+from sphinx.ext.mathbase import setup as mathbase_setup, wrap_displaymath
+
+class MathExtError(SphinxError):
+    category = 'Math extension error'
+
+
+DOC_HEAD = r'''
+\documentclass[12pt]{article}
+\usepackage[utf8]{inputenc}
+\usepackage{amsmath}
+\usepackage{amsthm}
+\usepackage{amssymb}
+\usepackage{amsfonts}
+\usepackage{bm}
+\pagestyle{empty}
+'''
+
+DOC_BODY = r'''
+\begin{document}
+%s
+\end{document}
+'''
+
+DOC_BODY_PREVIEW = r'''
+\usepackage[active]{preview}
+\begin{document}
+\begin{preview}
+%s
+\end{preview}
+\end{document}
+'''
+
+depth_re = re.compile(r'\[\d+ depth=(-?\d+)\]')
+
+def render_math(self, math):
+    """
+    Render the LaTeX math expression *math* using latex and dvipng.
+
+    Return the filename relative to the built document and the "depth",
+    that is, the distance of image bottom and baseline in pixels, if the
+    option to use preview_latex is switched on.
+
+    Error handling may seem strange, but follows a pattern: if LaTeX or
+    dvipng aren't available, only a warning is generated (since that enables
+    people on machines without these programs to at least build the rest
+    of the docs successfully).  If the programs are there, however, they
+    may not fail since that indicates a problem in the math source.
+    """
+    use_preview = self.builder.config.pngmath_use_preview
+
+    shasum = "%s.png" % sha(math.encode('utf-8')).hexdigest()
+    relfn = posixpath.join(self.builder.imgpath, 'math', shasum)
+    outfn = path.join(self.builder.outdir, '_images', 'math', shasum)
+    if path.isfile(outfn):
+        depth = read_png_depth(outfn)
+        return relfn, depth
+
+    latex = DOC_HEAD + self.builder.config.pngmath_latex_preamble
+    latex += (use_preview and DOC_BODY_PREVIEW or DOC_BODY) % math
+    if isinstance(latex, unicode):
+        latex = latex.encode('utf-8')
+
+    # use only one tempdir per build -- the use of a directory is cleaner
+    # than using temporary files, since we can clean up everything at once
+    # just removing the whole directory (see cleanup_tempdir)
+    if not hasattr(self.builder, '_mathpng_tempdir'):
+        tempdir = self.builder._mathpng_tempdir = tempfile.mkdtemp()
+    else:
+        tempdir = self.builder._mathpng_tempdir
+
+    tf = open(path.join(tempdir, 'math.tex'), 'w')
+    tf.write(latex)
+    tf.close()
+
+    # build latex command; old versions of latex don't have the
+    # --output-directory option, so we have to manually chdir to the
+    # temp dir to run it.
+    ltx_args = [self.builder.config.pngmath_latex, '--interaction=nonstopmode']
+    # add custom args from the config file
+    ltx_args.extend(self.builder.config.pngmath_latex_args)
+    ltx_args.append('math.tex')
+
+    curdir = getcwd()
+    chdir(tempdir)
+
+    try:
+        try:
+            p = Popen(ltx_args, stdout=PIPE, stderr=PIPE)
+        except OSError, err:
+            if err.errno != 2:   # No such file or directory
+                raise
+            if not hasattr(self.builder, '_mathpng_warned_latex'):
+                self.builder.warn('LaTeX command %r cannot be run (needed for math '
+                                  'display), check the pngmath_latex setting' %
+                                  self.builder.config.pngmath_latex)
+                self.builder._mathpng_warned_latex = True
+            return relfn, None
+    finally:
+        chdir(curdir)
+
+    stdout, stderr = p.communicate()
+    if p.returncode != 0:
+        raise MathExtError('latex exited with error:\n[stderr]\n%s\n[stdout]\n%s'
+                           % (stderr, stdout))
+
+    ensuredir(path.dirname(outfn))
+    # use some standard dvipng arguments
+    dvipng_args = [self.builder.config.pngmath_dvipng]
+    dvipng_args += ['-o', outfn, '-T', 'tight', '-z9']
+    # add custom ones from config value
+    dvipng_args.extend(self.builder.config.pngmath_dvipng_args)
+    if use_preview:
+        dvipng_args.append('--depth')
+    # last, the input file name
+    dvipng_args.append(path.join(tempdir, 'math.dvi'))
+    try:
+        p = Popen(dvipng_args, stdout=PIPE, stderr=PIPE)
+    except OSError, err:
+        if err.errno != 2:   # No such file or directory
+            raise
+        if not hasattr(self.builder, '_mathpng_warned_dvipng'):
+            self.builder.warn('dvipng command %r cannot be run (needed for math '
+                              'display), check the pngmath_dvipng setting' %
+                              self.builder.config.pngmath_dvipng)
+            self.builder._mathpng_warned_dvipng = True
+        return relfn, None
+    stdout, stderr = p.communicate()
+    if p.returncode != 0:
+        raise MathExtError('dvipng exited with error:\n[stderr]\n%s\n[stdout]\n%s'
+                           % (stderr, stdout))
+    depth = None
+    if use_preview:
+        for line in stdout.splitlines():
+            m = depth_re.match(line)
+            if m:
+                depth = int(m.group(1))
+                write_png_depth(outfn, depth)
+                break
+
+    return relfn, depth
+
+def cleanup_tempdir(app, exc):
+    if exc:
+        return
+    if not hasattr(app.builder, '_mathpng_tempdir'):
+        return
+    try:
+        shutil.rmtree(app.builder._mathpng_tempdir)
+    except Exception:
+        pass
+
+def html_visit_math(self, node):
+    try:
+        fname, depth = render_math(self, '$'+node['latex']+'$')
+    except MathExtError, exc:
+        sm = nodes.system_message(str(exc), type='WARNING', level=2,
+                                  backrefs=[], source=node['latex'])
+        sm.walkabout(self)
+        self.builder.warn('display latex %r: ' % node['latex'] + str(exc))
+        raise nodes.SkipNode
+    self.body.append('<img class="math" src="%s" alt="%s" %s/>' %
+                     (fname, self.encode(node['latex']).strip(),
+                      depth and 'style="vertical-align: %dpx" ' % (-depth) or ''))
+    raise nodes.SkipNode
+
+def html_visit_displaymath(self, node):
+    if node['nowrap']:
+        latex = node['latex']
+    else:
+        latex = wrap_displaymath(node['latex'], None)
+    try:
+        fname, depth = render_math(self, latex)
+    except MathExtError, exc:
+        sm = nodes.system_message(str(exc), type='WARNING', level=2,
+                                  backrefs=[], source=node['latex'])
+        sm.walkabout(self)
+        self.builder.warn('inline latex %r: ' % node['latex'] + str(exc))
+        raise nodes.SkipNode
+    self.body.append(self.starttag(node, 'div', CLASS='math'))
+    self.body.append('<p>')
+    if node['number']:
+        self.body.append('<span class="eqno">(%s)</span>' % node['number'])
+    self.body.append('<img src="%s" alt="%s" />\n</div>' %
+                     (fname, self.encode(node['latex']).strip()))
+    self.body.append('</p>')
+    raise nodes.SkipNode
+
+
+def setup(app):
+    mathbase_setup(app, (html_visit_math, None), (html_visit_displaymath, None))
+    app.add_config_value('pngmath_dvipng', 'dvipng', False)
+    app.add_config_value('pngmath_latex', 'latex', False)
+    app.add_config_value('pngmath_use_preview', False, False)
+    app.add_config_value('pngmath_dvipng_args', ['-gamma 1.5', '-D 110'], False)
+    app.add_config_value('pngmath_latex_args', [], False)
+    app.add_config_value('pngmath_latex_preamble', '', False)
+    app.connect('build-finished', cleanup_tempdir)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/refcounting.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.refcounting
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Supports reference count annotations for C API functions.  Based on
+    refcount.py and anno-api.py in the old Python documentation tools.
+
+    Usage: Set the `refcount_file` config value to the path to the reference
+    count data file.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from os import path
+from docutils import nodes
+
+from sphinx import addnodes
+
+
+# refcount annotation
+class refcount(nodes.emphasis): pass
+
+
+class RCEntry:
+    def __init__(self, name):
+        self.name = name
+        self.args = []
+        self.result_type = ''
+        self.result_refs = None
+
+
+class Refcounts(dict):
+    @classmethod
+    def fromfile(cls, filename):
+        d = cls()
+        fp = open(filename, 'r')
+        try:
+            for line in fp:
+                line = line.strip()
+                if line[:1] in ("", "#"):
+                    # blank lines and comments
+                    continue
+                parts = line.split(":", 4)
+                if len(parts) != 5:
+                    raise ValueError("Wrong field count in %r" % line)
+                function, type, arg, refcount, comment = parts
+                # Get the entry, creating it if needed:
+                try:
+                    entry = d[function]
+                except KeyError:
+                    entry = d[function] = RCEntry(function)
+                if not refcount or refcount == "null":
+                    refcount = None
+                else:
+                    refcount = int(refcount)
+                # Update the entry with the new parameter or the result information.
+                if arg:
+                    entry.args.append((arg, type, refcount))
+                else:
+                    entry.result_type = type
+                    entry.result_refs = refcount
+        finally:
+            fp.close()
+        return d
+
+    def add_refcount_annotations(self, app, doctree):
+        for node in doctree.traverse(addnodes.desc_content):
+            par = node.parent
+            if par['desctype'] != 'cfunction':
+                continue
+            if not par[0].has_key('names') or not par[0]['names']:
+                continue
+            entry = self.get(par[0]['names'][0])
+            if not entry:
+                continue
+            elif entry.result_type not in ("PyObject*", "PyVarObject*"):
+                continue
+            rc = 'Return value: '
+            if entry.result_refs is None:
+                rc += "Always NULL."
+            else:
+                rc += (entry.result_refs and "New" or "Borrowed") + " reference."
+            node.insert(0, refcount(rc, rc))
+
+
+def init_refcounts(app):
+    if app.config.refcount_file:
+        refcounts = Refcounts.fromfile(
+            path.join(app.srcdir, app.config.refcount_file))
+        app.connect('doctree-read', refcounts.add_refcount_annotations)
+
+
+def setup(app):
+    app.add_node(refcount)
+    app.add_config_value('refcount_file', '', True)
+    app.connect('builder-inited', init_refcounts)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/todo.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,123 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.ext.todo
+    ~~~~~~~~~~~~~~~
+
+    Allow todos to be inserted into your documentation.  Inclusion of todos can
+    be switched of by a configuration variable.  The todolist directive collects
+    all todos of your project and lists them along with a backlink to the
+    original location.
+
+    :copyright: 2008 Daniel Bültmann.
+    :license: BSD.
+"""
+
+from docutils import nodes
+
+from sphinx.util.compat import make_admonition
+
+class todo_node(nodes.Admonition, nodes.Element): pass
+class todolist(nodes.General, nodes.Element): pass
+
+
+def todo_directive(name, arguments, options, content, lineno,
+                   content_offset, block_text, state, state_machine):
+    env = state.document.settings.env
+
+    targetid = "todo-%s" % env.index_num
+    env.index_num += 1
+    targetnode = nodes.target('', '', ids=[targetid])
+
+    ad = make_admonition(todo_node, name, [_('Todo')], options, content, lineno,
+                         content_offset, block_text, state, state_machine)
+
+    # Attach a list of all todos to the environment,
+    # the todolist works with the collected todo nodes
+    if not hasattr(env, 'todo_all_todos'):
+        env.todo_all_todos = []
+    env.todo_all_todos.append({
+        'docname': env.docname,
+        'lineno': lineno,
+        'todo': ad[0].deepcopy(),
+        'target': targetnode,
+    })
+
+    return [targetnode] + ad
+
+
+def todolist_directive(name, arguments, options, content, lineno,
+                       content_offset, block_text, state, state_machine):
+    # Simply insert an empty todolist node which will be replaced later
+    # when process_todo_nodes is called
+    return [todolist('')]
+
+
+def process_todo_nodes(app, doctree, fromdocname):
+    if not app.config['todo_include_todos']:
+        for node in doctree.traverse(todo_node):
+            node.parent.remove(node)
+
+    # Replace all todolist nodes with a list of the collected todos.
+    # Augment each todo with a backlink to the original location.
+    env = app.builder.env
+
+    for node in doctree.traverse(todolist):
+        if not app.config['todo_include_todos']:
+            node.replace_self([])
+            continue
+
+        content = []
+
+        for todo_info in env.todo_all_todos:
+            para = nodes.paragraph()
+            filename = env.doc2path(todo_info['docname'], base=None)
+            description = (
+                _('(The original entry is located in %s, line %d and can be found ') %
+                (filename, todo_info['lineno']))
+            para += nodes.Text(description, description)
+
+            # Create a reference
+            newnode = nodes.reference('', '')
+            innernode = nodes.emphasis(_('here'), _('here'))
+            newnode['refdocname'] = todo_info['docname']
+            newnode['refuri'] = app.builder.get_relative_uri(
+                fromdocname, todo_info['docname'])
+            newnode['refuri'] += '#' + todo_info['target']['refid']
+            newnode.append(innernode)
+            para += newnode
+            para += nodes.Text('.)', '.)')
+
+            # Insert into the todolist
+            content.append(todo_info['todo'])
+            content.append(para)
+
+        node.replace_self(content)
+
+
+def purge_todos(app, env, docname):
+    if not hasattr(env, 'todo_all_todos'):
+        return
+    env.todo_all_todos = [todo for todo in env.todo_all_todos
+                          if todo['docname'] != docname]
+
+
+def visit_todo_node(self, node):
+    self.visit_admonition(node)
+
+def depart_todo_node(self, node):
+    self.depart_admonition(node)
+
+def setup(app):
+    app.add_config_value('todo_include_todos', False, False)
+
+    app.add_node(todolist)
+    app.add_node(todo_node,
+                 html=(visit_todo_node, depart_todo_node),
+                 latex=(visit_todo_node, depart_todo_node),
+                 text=(visit_todo_node, depart_todo_node))
+
+    app.add_directive('todo', todo_directive, 1, (0, 0, 1))
+    app.add_directive('todolist', todolist_directive, 0, (0, 0, 0))
+    app.connect('doctree-resolved', process_todo_nodes)
+    app.connect('env-purge-doc', purge_todos)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/highlighting.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,195 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.highlighting
+    ~~~~~~~~~~~~~~~~~~~
+
+    Highlight code blocks using Pygments.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import sys
+import cgi
+import re
+import parser
+
+from sphinx.util.texescape import tex_hl_escape_map
+
+try:
+    import pygments
+    from pygments import highlight
+    from pygments.lexers import PythonLexer, PythonConsoleLexer, CLexer, \
+         TextLexer, RstLexer
+    from pygments.lexers import get_lexer_by_name, guess_lexer
+    from pygments.formatters import HtmlFormatter, LatexFormatter
+    from pygments.filters import ErrorToken
+    from pygments.style import Style
+    from pygments.styles import get_style_by_name
+    from pygments.styles.friendly import FriendlyStyle
+    from pygments.token import Generic, Comment, Number
+except ImportError:
+    pygments = None
+else:
+    class SphinxStyle(Style):
+        """
+        Like friendly, but a bit darker to enhance contrast on the green
+        background.
+        """
+
+        background_color = '#eeffcc'
+        default_style = ''
+
+        styles = FriendlyStyle.styles
+        styles.update({
+            Generic.Output: '#333',
+            Comment: 'italic #408090',
+            Number: '#208050',
+        })
+
+    lexers = dict(
+        none = TextLexer(),
+        python = PythonLexer(),
+        pycon = PythonConsoleLexer(),
+        # the python3 option exists as of Pygments 0.12, but it doesn't
+        # do any harm in previous versions
+        pycon3 = PythonConsoleLexer(python3=True),
+        rest = RstLexer(),
+        c = CLexer(),
+    )
+    for _lexer in lexers.values():
+        _lexer.add_filter('raiseonerror')
+
+
+escape_hl_chars = {ord(u'@'): u'@PYGZat[]',
+                   ord(u'['): u'@PYGZlb[]',
+                   ord(u']'): u'@PYGZrb[]'}
+
+# used if Pygments is not available
+_LATEX_STYLES = r'''
+\newcommand\PYGZat{@}
+\newcommand\PYGZlb{[}
+\newcommand\PYGZrb{]}
+'''
+
+
+parsing_exceptions = (SyntaxError, UnicodeEncodeError)
+if sys.version_info < (2, 5):
+    # Python <= 2.4 raises MemoryError when parsing an
+    # invalid encoding cookie
+    parsing_exceptions += MemoryError,
+
+
+class PygmentsBridge(object):
+    def __init__(self, dest='html', stylename='sphinx'):
+        self.dest = dest
+        if not pygments:
+            return
+        if stylename == 'sphinx':
+            style = SphinxStyle
+        elif '.' in stylename:
+            module, stylename = stylename.rsplit('.', 1)
+            style = getattr(__import__(module, None, None, ['']), stylename)
+        else:
+            style = get_style_by_name(stylename)
+        self.hfmter = {False: HtmlFormatter(style=style),
+                       True: HtmlFormatter(style=style, linenos=True)}
+        self.lfmter = {False: LatexFormatter(style=style, commandprefix='PYG'),
+                       True: LatexFormatter(style=style, linenos=True,
+                                            commandprefix='PYG')}
+
+    def unhighlighted(self, source):
+        if self.dest == 'html':
+            return '<pre>' + cgi.escape(source) + '</pre>\n'
+        else:
+            # first, escape highlighting characters like Pygments does
+            source = source.translate(escape_hl_chars)
+            # then, escape all characters nonrepresentable in LaTeX
+            source = source.translate(tex_hl_escape_map)
+            return '\\begin{Verbatim}[commandchars=@\\[\\]]\n' + \
+                   source + '\\end{Verbatim}\n'
+
+    def try_parse(self, src):
+        # Make sure it ends in a newline
+        src += '\n'
+
+        # Replace "..." by a mark which is also a valid python expression
+        # (Note, the highlighter gets the original source, this is only done
+        #  to allow "..." in code and still highlight it as Python code.)
+        mark = "__highlighting__ellipsis__"
+        src = src.replace("...", mark)
+
+        # lines beginning with "..." are probably placeholders for suite
+        src = re.sub(r"(?m)^(\s*)" + mark + "(.)", r"\1"+ mark + r"# \2", src)
+
+        # if we're using 2.5, use the with statement
+        if sys.version_info >= (2, 5):
+            src = 'from __future__ import with_statement\n' + src
+
+        if isinstance(src, unicode):
+            # Non-ASCII chars will only occur in string literals
+            # and comments.  If we wanted to give them to the parser
+            # correctly, we'd have to find out the correct source
+            # encoding.  Since it may not even be given in a snippet,
+            # just replace all non-ASCII characters.
+            src = src.encode('ascii', 'replace')
+
+        try:
+            parser.suite(src)
+        except parsing_exceptions:
+            return False
+        else:
+            return True
+
+    def highlight_block(self, source, lang, linenos=False):
+        if not pygments:
+            return self.unhighlighted(source)
+        if lang in ('py', 'python'):
+            if source.startswith('>>>'):
+                # interactive session
+                lexer = lexers['pycon']
+            else:
+                # maybe Python -- try parsing it
+                if self.try_parse(source):
+                    lexer = lexers['python']
+                else:
+                    return self.unhighlighted(source)
+        elif lang in ('python3', 'py3') and source.startswith('>>>'):
+            # for py3, recognize interactive sessions, but do not try parsing...
+            lexer = lexers['pycon3']
+        elif lang == 'guess':
+            try:
+                lexer = guess_lexer(source)
+            except Exception:
+                return self.unhighlighted(source)
+        else:
+            if lang in lexers:
+                lexer = lexers[lang]
+            else:
+                lexer = lexers[lang] = get_lexer_by_name(lang)
+                lexer.add_filter('raiseonerror')
+        try:
+            if self.dest == 'html':
+                return highlight(source, lexer, self.hfmter[bool(linenos)])
+            else:
+                hlsource = highlight(source, lexer, self.lfmter[bool(linenos)])
+                return hlsource.translate(tex_hl_escape_map)
+        except ErrorToken:
+            # this is most probably not the selected language,
+            # so let it pass unhighlighted
+            return self.unhighlighted(source)
+
+    def get_stylesheet(self):
+        if not pygments:
+            if self.dest == 'latex':
+                return _LATEX_STYLES
+            # no HTML styles needed
+            return ''
+        if self.dest == 'html':
+            return self.hfmter[0].get_style_defs()
+        else:
+            styledefs = self.lfmter[0].get_style_defs()
+            # workaround for Pygments < 0.12
+            if styledefs.startswith('\\newcommand\\at{@}'):
+                styledefs += _LATEX_STYLES
+            return styledefs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/htmlhelp.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,220 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.htmlhelp
+    ~~~~~~~~~~~~~~~
+
+    Build HTML help support files.
+    Adapted from the original Doc/tools/prechm.py.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import os
+import cgi
+from os import path
+
+from docutils import nodes
+
+from sphinx import addnodes
+
+# Project file (*.hhp) template.  'outname' is the file basename (like
+# the pythlp in pythlp.hhp); 'version' is the doc version number (like
+# the 2.2 in Python 2.2).
+# The magical numbers in the long line under [WINDOWS] set most of the
+# user-visible features (visible buttons, tabs, etc).
+# About 0x10384e:  This defines the buttons in the help viewer.  The
+# following defns are taken from htmlhelp.h.  Not all possibilities
+# actually work, and not all those that work are available from the Help
+# Workshop GUI.  In particular, the Zoom/Font button works and is not
+# available from the GUI.  The ones we're using are marked with 'x':
+#
+#    0x000002   Hide/Show   x
+#    0x000004   Back        x
+#    0x000008   Forward     x
+#    0x000010   Stop
+#    0x000020   Refresh
+#    0x000040   Home        x
+#    0x000080   Forward
+#    0x000100   Back
+#    0x000200   Notes
+#    0x000400   Contents
+#    0x000800   Locate      x
+#    0x001000   Options     x
+#    0x002000   Print       x
+#    0x004000   Index
+#    0x008000   Search
+#    0x010000   History
+#    0x020000   Favorites
+#    0x040000   Jump 1
+#    0x080000   Jump 2
+#    0x100000   Zoom/Font   x
+#    0x200000   TOC Next
+#    0x400000   TOC Prev
+
+project_template = '''\
+[OPTIONS]
+Binary TOC=Yes
+Binary Index=No
+Compiled file=%(outname)s.chm
+Contents file=%(outname)s.hhc
+Default Window=%(outname)s
+Default topic=index.html
+Display compile progress=No
+Full text search stop list file=%(outname)s.stp
+Full-text search=Yes
+Index file=%(outname)s.hhk
+Language=0x409
+Title=%(title)s
+
+[WINDOWS]
+%(outname)s="%(title)s","%(outname)s.hhc","%(outname)s.hhk",\
+"index.html","index.html",,,,,0x63520,220,0x10384e,[0,0,1024,768],,,,,,,0
+
+[FILES]
+'''
+
+contents_header = '''\
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<HTML>
+<HEAD>
+<meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
+<!-- Sitemap 1.0 -->
+</HEAD><BODY>
+<OBJECT type="text/site properties">
+        <param name="Window Styles" value="0x801227">
+        <param name="ImageType" value="Folder">
+</OBJECT>
+<UL>
+'''
+
+contents_footer = '''\
+</UL></BODY></HTML>
+'''
+
+object_sitemap = '''\
+<OBJECT type="text/sitemap">
+    <param name="Name" value="%s">
+    <param name="Local" value="%s">
+</OBJECT>
+'''
+
+# List of words the full text search facility shouldn't index.  This
+# becomes file outname.stp.  Note that this list must be pretty small!
+# Different versions of the MS docs claim the file has a maximum size of
+# 256 or 512 bytes (including \r\n at the end of each line).
+# Note that "and", "or", "not" and "near" are operators in the search
+# language, so no point indexing them even if we wanted to.
+stopwords = """
+a  and  are  as  at
+be  but  by
+for
+if  in  into  is  it
+near  no  not
+of  on  or
+such
+that  the  their  then  there  these  they  this  to
+was  will  with
+""".split()
+
+
+def build_hhx(builder, outdir, outname):
+    builder.info('dumping stopword list...')
+    f = open(path.join(outdir, outname+'.stp'), 'w')
+    try:
+        for word in sorted(stopwords):
+            print >>f, word
+    finally:
+        f.close()
+
+    builder.info('writing project file...')
+    f = open(path.join(outdir, outname+'.hhp'), 'w')
+    try:
+        f.write(project_template % {'outname': outname,
+                                    'title': builder.config.html_title,
+                                    'version': builder.config.version,
+                                    'project': builder.config.project})
+        if not outdir.endswith(os.sep):
+            outdir += os.sep
+        olen = len(outdir)
+        for root, dirs, files in os.walk(outdir):
+            staticdir = (root == path.join(outdir, '_static'))
+            for fn in files:
+                if (staticdir and not fn.endswith('.js')) or fn.endswith('.html'):
+                    print >>f, path.join(root, fn)[olen:].replace(os.sep, '\\')
+    finally:
+        f.close()
+
+    builder.info('writing TOC file...')
+    f = open(path.join(outdir, outname+'.hhc'), 'w')
+    try:
+        f.write(contents_header)
+        # special books
+        f.write('<LI> ' + object_sitemap % (builder.config.html_short_title,
+                                            'index.html'))
+        if builder.config.html_use_modindex:
+            f.write('<LI> ' + object_sitemap % (_('Global Module Index'),
+                                                'modindex.html'))
+        # the TOC
+        tocdoc = builder.env.get_and_resolve_doctree(builder.config.master_doc, builder,
+                                                     prune_toctrees=False)
+        def write_toc(node, ullevel=0):
+            if isinstance(node, nodes.list_item):
+                f.write('<LI> ')
+                for subnode in node:
+                    write_toc(subnode, ullevel)
+            elif isinstance(node, nodes.reference):
+                link = node['refuri']
+                title = cgi.escape(node.astext()).replace('"','&quot;')
+                item = object_sitemap % (title, link)
+                f.write(item.encode('ascii', 'xmlcharrefreplace'))
+            elif isinstance(node, nodes.bullet_list):
+                if ullevel != 0:
+                    f.write('<UL>\n')
+                for subnode in node:
+                    write_toc(subnode, ullevel+1)
+                if ullevel != 0:
+                    f.write('</UL>\n')
+            elif isinstance(node, addnodes.compact_paragraph):
+                for subnode in node:
+                    write_toc(subnode, ullevel)
+        istoctree = lambda node: isinstance(node, addnodes.compact_paragraph) and \
+                    node.has_key('toctree')
+        for node in tocdoc.traverse(istoctree):
+            write_toc(node)
+        f.write(contents_footer)
+    finally:
+        f.close()
+
+    builder.info('writing index file...')
+    index = builder.env.create_index(builder)
+    f = open(path.join(outdir, outname+'.hhk'), 'w')
+    try:
+        f.write('<UL>\n')
+        def write_index(title, refs, subitems):
+            def write_param(name, value):
+                item = '    <param name="%s" value="%s">\n' % (name, value)
+                f.write(item.encode('ascii', 'xmlcharrefreplace'))
+            title = cgi.escape(title)
+            f.write('<LI> <OBJECT type="text/sitemap">\n')
+            write_param('Keyword', title)
+            if len(refs) == 0:
+                write_param('See Also', title)
+            elif len(refs) == 1:
+                write_param('Local', refs[0])
+            else:
+                for i, ref in enumerate(refs):
+                    write_param('Name', '[%d] %s' % (i, ref)) # XXX: better title?
+                    write_param('Local', ref)
+            f.write('</OBJECT>\n')
+            if subitems:
+                f.write('<UL> ')
+                for subitem in subitems:
+                    write_index(subitem[0], subitem[1], [])
+                f.write('</UL>')
+        for (key, group) in index:
+            for title, (refs, subitems) in group:
+                write_index(title, refs, subitems)
+        f.write('</UL>\n')
+    finally:
+        f.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/htmlwriter.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,457 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.htmlwriter
+    ~~~~~~~~~~~~~~~~~
+
+    docutils writers handling Sphinx' custom nodes.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import sys
+import posixpath
+import os
+
+from docutils import nodes
+from docutils.writers.html4css1 import Writer, HTMLTranslator as BaseTranslator
+
+from sphinx.locale import admonitionlabels, versionlabels
+from sphinx.highlighting import PygmentsBridge
+from sphinx.util.smartypants import sphinx_smarty_pants
+
+try:
+    import Image                        # check for the Python Imaging Library
+except ImportError:
+    Image = None
+
+class HTMLWriter(Writer):
+    def __init__(self, builder):
+        Writer.__init__(self)
+        self.builder = builder
+
+    def translate(self):
+        # sadly, this is mostly copied from parent class
+        self.visitor = visitor = self.builder.translator_class(self.builder,
+                                                               self.document)
+        self.document.walkabout(visitor)
+        self.output = visitor.astext()
+        for attr in ('head_prefix', 'stylesheet', 'head', 'body_prefix',
+                     'body_pre_docinfo', 'docinfo', 'body', 'fragment',
+                     'body_suffix', 'meta', 'title', 'subtitle', 'header',
+                     'footer', 'html_prolog', 'html_head', 'html_title',
+                     'html_subtitle', 'html_body', ):
+            setattr(self, attr, getattr(visitor, attr, None))
+        self.clean_meta = ''.join(visitor.meta[2:])
+
+
+class HTMLTranslator(BaseTranslator):
+    """
+    Our custom HTML translator.
+    """
+
+    def __init__(self, builder, *args, **kwds):
+        BaseTranslator.__init__(self, *args, **kwds)
+        self.highlighter = PygmentsBridge('html', builder.config.pygments_style)
+        self.no_smarty = 0
+        self.builder = builder
+        self.highlightlang = builder.config.highlight_language
+        self.highlightlinenothreshold = sys.maxint
+        self.protect_literal_text = 0
+
+    def visit_desc(self, node):
+        self.body.append(self.starttag(node, 'dl', CLASS=node['desctype']))
+    def depart_desc(self, node):
+        self.body.append('</dl>\n\n')
+
+    def visit_desc_signature(self, node):
+        # the id is set automatically
+        self.body.append(self.starttag(node, 'dt'))
+        # anchor for per-desc interactive data
+        if node.parent['desctype'] != 'describe' and node['ids'] and node['first']:
+            self.body.append('<!--[%s]-->' % node['ids'][0])
+        if node.parent['desctype'] in ('class', 'exception'):
+            self.body.append('%s ' % node.parent['desctype'])
+    def depart_desc_signature(self, node):
+        if node['ids'] and self.builder.add_definition_links:
+            self.body.append(u'<a class="headerlink" href="#%s" ' % node['ids'][0] +
+                             u'title="%s">\u00B6</a>' %
+                             _('Permalink to this definition'))
+        self.body.append('</dt>\n')
+
+    def visit_desc_addname(self, node):
+        self.body.append(self.starttag(node, 'tt', '', CLASS='descclassname'))
+    def depart_desc_addname(self, node):
+        self.body.append('</tt>')
+
+    def visit_desc_type(self, node):
+        pass
+    def depart_desc_type(self, node):
+        pass
+
+    def visit_desc_name(self, node):
+        self.body.append(self.starttag(node, 'tt', '', CLASS='descname'))
+    def depart_desc_name(self, node):
+        self.body.append('</tt>')
+
+    def visit_desc_parameterlist(self, node):
+        self.body.append('<big>(</big>')
+        self.first_param = 1
+    def depart_desc_parameterlist(self, node):
+        self.body.append('<big>)</big>')
+
+    def visit_desc_parameter(self, node):
+        if not self.first_param:
+            self.body.append(', ')
+        else:
+            self.first_param = 0
+        if not node.hasattr('noemph'):
+            self.body.append('<em>')
+    def depart_desc_parameter(self, node):
+        if not node.hasattr('noemph'):
+            self.body.append('</em>')
+
+    def visit_desc_optional(self, node):
+        self.body.append('<span class="optional">[</span>')
+    def depart_desc_optional(self, node):
+        self.body.append('<span class="optional">]</span>')
+
+    def visit_desc_annotation(self, node):
+        self.body.append(self.starttag(node, 'em', CLASS='property'))
+    def depart_desc_annotation(self, node):
+        self.body.append('</em>')
+
+    def visit_desc_content(self, node):
+        self.body.append(self.starttag(node, 'dd', ''))
+    def depart_desc_content(self, node):
+        self.body.append('</dd>')
+
+    def visit_refcount(self, node):
+        self.body.append(self.starttag(node, 'em', '', CLASS='refcount'))
+    def depart_refcount(self, node):
+        self.body.append('</em>')
+
+    def visit_versionmodified(self, node):
+        self.body.append(self.starttag(node, 'p'))
+        text = versionlabels[node['type']] % node['version']
+        if len(node):
+            text += ': '
+        else:
+            text += '.'
+        self.body.append('<span class="versionmodified">%s</span>' % text)
+    def depart_versionmodified(self, node):
+        self.body.append('</p>\n')
+
+    # overwritten
+    def visit_reference(self, node):
+        BaseTranslator.visit_reference(self, node)
+        if node.hasattr('reftitle'):
+            # ugly hack to add a title attribute
+            starttag = self.body[-1]
+            if not starttag.startswith('<a '):
+                return
+            self.body[-1] = '<a title="%s"' % self.attval(node['reftitle']) + \
+                            starttag[2:]
+
+    # overwritten -- we don't want source comments to show up in the HTML
+    def visit_comment(self, node):
+        raise nodes.SkipNode
+
+    # overwritten
+    def visit_admonition(self, node, name=''):
+        self.body.append(self.starttag(
+            node, 'div', CLASS=('admonition ' + name)))
+        if name and name != 'seealso':
+            node.insert(0, nodes.title(name, admonitionlabels[name]))
+        self.set_first_last(node)
+
+    def visit_seealso(self, node):
+        self.visit_admonition(node, 'seealso')
+    def depart_seealso(self, node):
+        self.depart_admonition(node)
+
+    # overwritten for docutils 0.4
+    if hasattr(BaseTranslator, 'start_tag_with_title'):
+        def visit_section(self, node):
+            # the 0.5 version, to get the id attribute in the <div> tag
+            self.section_level += 1
+            self.body.append(self.starttag(node, 'div', CLASS='section'))
+
+        def visit_title(self, node):
+            # don't move the id attribute inside the <h> tag
+            BaseTranslator.visit_title(self, node, move_ids=0)
+
+    # overwritten
+    def visit_literal_block(self, node):
+        if node.rawsource != node.astext():
+            # most probably a parsed-literal block -- don't highlight
+            return BaseTranslator.visit_literal_block(self, node)
+        lang = self.highlightlang
+        linenos = node.rawsource.count('\n') >= self.highlightlinenothreshold - 1
+        if node.has_key('language'):
+            # code-block directives
+            lang = node['language']
+        if node.has_key('linenos'):
+            linenos = node['linenos']
+        highlighted = self.highlighter.highlight_block(node.rawsource, lang, linenos)
+        starttag = self.starttag(node, 'div', suffix='', CLASS='highlight-%s' % lang)
+        self.body.append(starttag + highlighted + '</div>\n')
+        raise nodes.SkipNode
+
+    def visit_doctest_block(self, node):
+        self.visit_literal_block(node)
+
+    # overwritten
+    def visit_literal(self, node):
+        if len(node.children) == 1 and \
+               node.children[0] in ('None', 'True', 'False'):
+            node['classes'].append('xref')
+        self.body.append(self.starttag(node, 'tt', '', CLASS='docutils literal'))
+        self.protect_literal_text += 1
+    def depart_literal(self, node):
+        self.protect_literal_text -= 1
+        self.body.append('</tt>')
+
+    def visit_productionlist(self, node):
+        self.body.append(self.starttag(node, 'pre'))
+        names = []
+        for production in node:
+            names.append(production['tokenname'])
+        maxlen = max(len(name) for name in names)
+        for production in node:
+            if production['tokenname']:
+                lastname = production['tokenname'].ljust(maxlen)
+                self.body.append(self.starttag(production, 'strong', ''))
+                self.body.append(lastname + '</strong> ::= ')
+            else:
+                self.body.append('%s     ' % (' '*len(lastname)))
+            production.walkabout(self)
+            self.body.append('\n')
+        self.body.append('</pre>\n')
+        raise nodes.SkipNode
+    def depart_productionlist(self, node):
+        pass
+
+    def visit_production(self, node):
+        pass
+    def depart_production(self, node):
+        pass
+
+    def visit_centered(self, node):
+        self.body.append(self.starttag(node, 'p', CLASS="centered") + '<strong>')
+    def depart_centered(self, node):
+        self.body.append('</strong></p>')
+
+    def visit_compact_paragraph(self, node):
+        pass
+    def depart_compact_paragraph(self, node):
+        pass
+
+    def visit_highlightlang(self, node):
+        self.highlightlang = node['lang']
+        self.highlightlinenothreshold = node['linenothreshold']
+    def depart_highlightlang(self, node):
+        pass
+
+    # overwritten
+    def visit_image(self, node):
+        olduri = node['uri']
+        # rewrite the URI if the environment knows about it
+        if olduri in self.builder.images:
+            node['uri'] = posixpath.join(self.builder.imgpath,
+                                         self.builder.images[olduri])
+
+        if node.has_key('scale'):
+            if Image and not (node.has_key('width')
+                              and node.has_key('height')):
+                try:
+                    im = Image.open(os.path.join(self.builder.srcdir,
+                                                    olduri))
+                except (IOError, # Source image can't be found or opened
+                        UnicodeError):  # PIL doesn't like Unicode paths.
+                    print olduri
+                    pass
+                else:
+                    if not node.has_key('width'):
+                        node['width'] = str(im.size[0])
+                    if not node.has_key('height'):
+                        node['height'] = str(im.size[1])
+                    del im
+        BaseTranslator.visit_image(self, node)
+
+    def visit_toctree(self, node):
+        # this only happens when formatting a toc from env.tocs -- in this
+        # case we don't want to include the subtree
+        raise nodes.SkipNode
+
+    def visit_index(self, node):
+        raise nodes.SkipNode
+
+    def visit_tabular_col_spec(self, node):
+        raise nodes.SkipNode
+
+    def visit_glossary(self, node):
+        pass
+    def depart_glossary(self, node):
+        pass
+
+    def visit_acks(self, node):
+        pass
+    def depart_acks(self, node):
+        pass
+
+    def visit_module(self, node):
+        pass
+    def depart_module(self, node):
+        pass
+
+    def bulk_text_processor(self, text):
+        return text
+
+    # overwritten
+    def visit_Text(self, node):
+        text = node.astext()
+        encoded = self.encode(text)
+        if self.protect_literal_text:
+            # moved here from base class's visit_literal to support
+            # more formatting in literal nodes
+            for token in self.words_and_spaces.findall(encoded):
+                if token.strip():
+                    # protect literal text from line wrapping
+                    self.body.append('<span class="pre">%s</span>' % token)
+                elif token in ' \n':
+                    # allow breaks at whitespace
+                    self.body.append(token)
+                else:
+                    # protect runs of multiple spaces; the last one can wrap
+                    self.body.append('&nbsp;' * (len(token)-1) + ' ')
+        else:
+            if self.in_mailto and self.settings.cloak_email_addresses:
+                encoded = self.cloak_email(encoded)
+            else:
+                encoded = self.bulk_text_processor(encoded)
+            self.body.append(encoded)
+
+    # these are all for docutils 0.5 compatibility
+
+    def visit_note(self, node):
+        self.visit_admonition(node, 'note')
+    def depart_note(self, node):
+        self.depart_admonition(node)
+
+    def visit_warning(self, node):
+        self.visit_admonition(node, 'warning')
+    def depart_warning(self, node):
+        self.depart_admonition(node)
+
+    def visit_attention(self, node):
+        self.visit_admonition(node, 'attention')
+
+    def depart_attention(self, node):
+        self.depart_admonition()
+
+    def visit_caution(self, node):
+        self.visit_admonition(node, 'caution')
+    def depart_caution(self, node):
+        self.depart_admonition()
+
+    def visit_danger(self, node):
+        self.visit_admonition(node, 'danger')
+    def depart_danger(self, node):
+        self.depart_admonition()
+
+    def visit_error(self, node):
+        self.visit_admonition(node, 'error')
+    def depart_error(self, node):
+        self.depart_admonition()
+
+    def visit_hint(self, node):
+        self.visit_admonition(node, 'hint')
+    def depart_hint(self, node):
+        self.depart_admonition()
+
+    def visit_important(self, node):
+        self.visit_admonition(node, 'important')
+    def depart_important(self, node):
+        self.depart_admonition()
+
+    def visit_tip(self, node):
+        self.visit_admonition(node, 'tip')
+    def depart_tip(self, node):
+        self.depart_admonition()
+
+    # these are only handled specially in the SmartyPantsHTMLTranslator
+    def visit_literal_emphasis(self, node):
+        return self.visit_emphasis(node)
+    def depart_literal_emphasis(self, node):
+        return self.depart_emphasis(node)
+
+    def depart_title(self, node):
+        close_tag = self.context[-1]
+        if self.builder.add_header_links and \
+               (close_tag.startswith('</h') or
+                close_tag.startswith('</a></h')) and \
+               node.parent.hasattr('ids') and node.parent['ids']:
+            aname = node.parent['ids'][0]
+            # add permalink anchor
+            self.body.append(u'<a class="headerlink" href="#%s" ' % aname +
+                             u'title="%s">\u00B6</a>' %
+                             _('Permalink to this headline'))
+        BaseTranslator.depart_title(self, node)
+
+    def unknown_visit(self, node):
+        raise NotImplementedError('Unknown node: ' + node.__class__.__name__)
+
+
+class SmartyPantsHTMLTranslator(HTMLTranslator):
+    """
+    Handle ordinary text via smartypants, converting quotes and dashes
+    to the correct entities.
+    """
+
+    def __init__(self, *args, **kwds):
+        self.no_smarty = 0
+        HTMLTranslator.__init__(self, *args, **kwds)
+
+    def visit_literal(self, node):
+        self.no_smarty += 1
+        try:
+            # this raises SkipNode
+            HTMLTranslator.visit_literal(self, node)
+        finally:
+            self.no_smarty -= 1
+
+    def visit_literal_emphasis(self, node):
+        self.no_smarty += 1
+        self.visit_emphasis(node)
+
+    def depart_literal_emphasis(self, node):
+        self.depart_emphasis(node)
+        self.no_smarty -= 1
+
+    def visit_desc_signature(self, node):
+        self.no_smarty += 1
+        HTMLTranslator.visit_desc_signature(self, node)
+
+    def depart_desc_signature(self, node):
+        self.no_smarty -= 1
+        HTMLTranslator.depart_desc_signature(self, node)
+
+    def visit_productionlist(self, node):
+        self.no_smarty += 1
+        try:
+            HTMLTranslator.visit_productionlist(self, node)
+        finally:
+            self.no_smarty -= 1
+
+    def visit_option(self, node):
+        self.no_smarty += 1
+        HTMLTranslator.visit_option(self, node)
+    def depart_option(self, node):
+        self.no_smarty -= 1
+        HTMLTranslator.depart_option(self, node)
+
+    def bulk_text_processor(self, text):
+        if self.no_smarty <= 0:
+            return sphinx_smarty_pants(text)
+        return text
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/latexwriter.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1192 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.latexwriter
+    ~~~~~~~~~~~~~~~~~~
+
+    Custom docutils writer for LaTeX.
+
+    Much of this code is adapted from Dave Kuhlman's "docpy" writer from his
+    docutils sandbox.
+
+    :copyright: 2007-2008 by Georg Brandl, Dave Kuhlman.
+    :license: BSD.
+"""
+
+import re
+import sys
+from os import path
+
+from docutils import nodes, writers
+from docutils.writers.latex2e import Babel
+
+from sphinx import addnodes
+from sphinx import highlighting
+from sphinx.locale import admonitionlabels, versionlabels
+from sphinx.util import ustrftime
+from sphinx.util.texescape import tex_escape_map
+from sphinx.util.smartypants import educateQuotesLatex
+
+HEADER = r'''%% Generated by Sphinx.
+\documentclass[%(papersize)s,%(pointsize)s%(classoptions)s]{%(docclass)s}
+%(inputenc)s
+%(fontenc)s
+%(babel)s
+%(fontpkg)s
+%(fncychap)s
+\usepackage{sphinx}
+%(preamble)s
+
+\title{%(title)s}
+\date{%(date)s}
+\release{%(release)s}
+\author{%(author)s}
+\newcommand{\sphinxlogo}{%(logo)s}
+\renewcommand{\releasename}{%(releasename)s}
+%(makeindex)s
+%(makemodindex)s
+'''
+
+BEGIN_DOC = r'''
+\begin{document}
+%(shorthandoff)s
+%(maketitle)s
+%(tableofcontents)s
+'''
+
+FOOTER = r'''
+%(footer)s
+\renewcommand{\indexname}{%(modindexname)s}
+%(printmodindex)s
+\renewcommand{\indexname}{%(indexname)s}
+%(printindex)s
+\end{document}
+'''
+
+
+class LaTeXWriter(writers.Writer):
+
+    supported = ('sphinxlatex',)
+
+    settings_spec = ('LaTeX writer options', '', (
+        ('Document name', ['--docname'], {'default': ''}),
+        ('Document class', ['--docclass'], {'default': 'manual'}),
+        ('Author', ['--author'], {'default': ''}),
+        ))
+    settings_defaults = {}
+
+    output = None
+
+    def __init__(self, builder):
+        writers.Writer.__init__(self)
+        self.builder = builder
+
+    def translate(self):
+        visitor = LaTeXTranslator(self.document, self.builder)
+        self.document.walkabout(visitor)
+        self.output = visitor.astext()
+
+
+# Helper classes
+
+class ExtBabel(Babel):
+    def get_shorthandoff(self):
+        shortlang = self.language.split('_')[0]
+        if shortlang in ('de', 'sl', 'pt', 'es', 'nl', 'pl'):
+            return '\\shorthandoff{"}'
+        return ''
+
+    _ISO639_TO_BABEL = Babel._ISO639_TO_BABEL.copy()
+    _ISO639_TO_BABEL['sl'] = 'slovene'
+
+
+class Table(object):
+    def __init__(self):
+        self.col = 0
+        self.colcount = 0
+        self.colspec = None
+        self.had_head = False
+        self.has_verbatim = False
+        self.caption = None
+
+
+class Desc(object):
+    def __init__(self, node):
+        self.env = LaTeXTranslator.desc_map.get(node['desctype'], 'describe')
+        self.type = self.cls = self.name = self.params = self.annotation = ''
+        self.count = 0
+
+
+class LaTeXTranslator(nodes.NodeVisitor):
+    sectionnames = ["part", "chapter", "section", "subsection",
+                    "subsubsection", "paragraph", "subparagraph"]
+
+    ignore_missing_images = False
+
+    default_elements = {
+        'docclass':        'manual',
+        'papersize':       'letterpaper',
+        'pointsize':       '10pt',
+        'classoptions':    '',
+        'inputenc':        '\\usepackage[utf8]{inputenc}',
+        'fontenc':         '\\usepackage[T1]{fontenc}',
+        'babel':           '\\usepackage{babel}',
+        'fontpkg':         '\\usepackage{times}',
+        'fncychap':        '\\usepackage[Bjarne]{fncychap}',
+        'preamble':        '',
+        'title':           '',
+        'date':            '',
+        'release':         '',
+        'author':          '',
+        'logo':            '',
+        'releasename':     'Release',
+        'makeindex':       '\\makeindex',
+        'makemodindex':    '\\makemodindex',
+        'shorthandoff':    '',
+        'maketitle':       '\\maketitle',
+        'tableofcontents': '\\tableofcontents',
+        'footer':          '',
+        'printmodindex':   '\\printmodindex',
+        'printindex':      '\\printindex',
+    }
+
+    def __init__(self, document, builder):
+        nodes.NodeVisitor.__init__(self, document)
+        self.builder = builder
+        self.body = []
+
+        # sort out some elements
+        papersize = builder.config.latex_paper_size + 'paper'
+        if papersize == 'paper': # e.g. command line "-D latex_paper_size="
+            papersize = 'letterpaper'
+
+        self.elements = self.default_elements.copy()
+        self.elements.update({
+            'docclass':     document.settings.docclass,
+            'papersize':    papersize,
+            'pointsize':    builder.config.latex_font_size,
+            # if empty, the title is set to the first section title
+            'title':        document.settings.title,
+            'date':         ustrftime(builder.config.today_fmt or _('%B %d, %Y')),
+            'release':      builder.config.release,
+            'author':       document.settings.author,
+            'releasename':  _('Release'),
+            'preamble':     builder.config.latex_preamble,
+            'modindexname': _('Module Index'),
+            'indexname':    _('Index'),
+        })
+        if builder.config.latex_logo:
+            self.elements['logo'] = '\\includegraphics{%s}\\par' % \
+                                    path.basename(builder.config.latex_logo)
+        if builder.config.language:
+            babel = ExtBabel(builder.config.language)
+            lang = babel.get_language()
+            if lang:
+                self.elements['classoptions'] += ',' + babel.get_language()
+            else:
+                self.builder.warn('no Babel option known for language %r' %
+                                  builder.config.language)
+            self.elements['shorthandoff'] = babel.get_shorthandoff()
+            self.elements['fncychap'] = '\\usepackage[Sonny]{fncychap}'
+        else:
+            self.elements['classoptions'] += ',english'
+        if not builder.config.latex_use_modindex:
+            self.elements['makemodindex'] = ''
+            self.elements['printmodindex'] = ''
+        # allow the user to override them all
+        self.elements.update(builder.config.latex_elements)
+
+        self.highlighter = highlighting.PygmentsBridge(
+            'latex', builder.config.pygments_style)
+        self.context = []
+        self.descstack = []
+        self.bibitems = []
+        self.table = None
+        self.next_table_colspec = None
+        self.highlightlang = builder.config.highlight_language
+        self.highlightlinenothreshold = sys.maxint
+        self.written_ids = set()
+        self.footnotestack = []
+        if self.elements['docclass'] == 'manual':
+            if builder.config.latex_use_parts:
+                self.top_sectionlevel = 0
+            else:
+                self.top_sectionlevel = 1
+        else:
+            self.top_sectionlevel = 2
+        self.next_section_target = None
+        # flags
+        self.verbatim = None
+        self.in_title = 0
+        self.in_production_list = 0
+        self.first_document = 1
+        self.this_is_the_title = 1
+        self.literal_whitespace = 0
+        self.no_contractions = 0
+
+    def astext(self):
+        return (HEADER % self.elements + self.highlighter.get_stylesheet() +
+                u''.join(self.body) + FOOTER % self.elements)
+
+    def visit_document(self, node):
+        self.footnotestack.append(self.collect_footnotes(node))
+        if self.first_document == 1:
+            # the first document is all the regular content ...
+            self.body.append(BEGIN_DOC % self.elements)
+            self.first_document = 0
+        elif self.first_document == 0:
+            # ... and all others are the appendices
+            self.body.append('\n\\appendix\n')
+            self.first_document = -1
+        # "- 1" because the level is increased before the title is visited
+        self.sectionlevel = self.top_sectionlevel - 1
+    def depart_document(self, node):
+        if self.bibitems:
+            widest_label = ""
+            for bi in self.bibitems:
+                if len(widest_label) < len(bi[0]):
+                    widest_label = bi[0]
+            self.body.append('\n\\begin{thebibliography}{%s}\n' % widest_label)
+            for bi in self.bibitems:
+                # cite_key: underscores must not be escaped
+                cite_key = bi[0].replace(r"\_", "_")
+                self.body.append('\\bibitem[%s]{%s}{%s}\n' % (bi[0], cite_key, bi[1]))
+            self.body.append('\\end{thebibliography}\n')
+            self.bibitems = []
+
+    def visit_start_of_file(self, node):
+        # This marks the begin of a new file; therefore the current module and
+        # class must be reset
+        self.body.append('\n\\resetcurrentobjects\n')
+        # and also, new footnotes
+        self.footnotestack.append(self.collect_footnotes(node))
+
+    def collect_footnotes(self, node):
+        fnotes = {}
+        def footnotes_under(n):
+            if isinstance(n, nodes.footnote):
+                yield n
+            else:
+                for c in n.children:
+                    if isinstance(c, addnodes.start_of_file):
+                        continue
+                    for k in footnotes_under(c):
+                        yield k
+        for fn in footnotes_under(node):
+            num = fn.children[0].astext().strip()
+            fnotes[num] = fn
+            fn.parent.remove(fn)
+        return fnotes
+
+    def depart_start_of_file(self, node):
+        self.footnotestack.pop()
+
+    def visit_highlightlang(self, node):
+        self.highlightlang = node['lang']
+        self.highlightlinenothreshold = node['linenothreshold']
+        raise nodes.SkipNode
+
+    def visit_section(self, node):
+        if not self.this_is_the_title:
+            self.sectionlevel += 1
+        self.body.append('\n\n')
+        if self.next_section_target:
+            self.body.append(r'\hypertarget{%s}{}' % self.next_section_target)
+            self.next_section_target = None
+        #if node.get('ids'):
+        #    for id in node['ids']:
+        #        if id not in self.written_ids:
+        #            self.body.append(r'\hypertarget{%s}{}' % id)
+        #            self.written_ids.add(id)
+    def depart_section(self, node):
+        self.sectionlevel = max(self.sectionlevel - 1, self.top_sectionlevel - 1)
+
+    def visit_problematic(self, node):
+        self.body.append(r'{\color{red}\bfseries{}')
+    def depart_problematic(self, node):
+        self.body.append('}')
+
+    def visit_topic(self, node):
+        self.body.append('\\setbox0\\vbox{\n'
+                         '\\begin{minipage}{0.95\\textwidth}\n')
+    def depart_topic(self, node):
+        self.body.append('\\end{minipage}}\n'
+                         '\\begin{center}\\setlength{\\fboxsep}{5pt}'
+                         '\\shadowbox{\\box0}\\end{center}\n')
+    visit_sidebar = visit_topic
+    depart_sidebar = depart_topic
+
+    def visit_glossary(self, node):
+        pass
+    def depart_glossary(self, node):
+        pass
+
+    def visit_productionlist(self, node):
+        self.body.append('\n\n\\begin{productionlist}\n')
+        self.in_production_list = 1
+    def depart_productionlist(self, node):
+        self.body.append('\\end{productionlist}\n\n')
+        self.in_production_list = 0
+
+    def visit_production(self, node):
+        if node['tokenname']:
+            self.body.append('\\production{%s}{' % self.encode(node['tokenname']))
+        else:
+            self.body.append('\\productioncont{')
+    def depart_production(self, node):
+        self.body.append('}\n')
+
+    def visit_transition(self, node):
+        self.body.append('\n\n\\bigskip\\hrule{}\\bigskip\n\n')
+    def depart_transition(self, node):
+        pass
+
+    def visit_title(self, node):
+        parent = node.parent
+        if isinstance(parent, addnodes.seealso):
+            # the environment already handles this
+            raise nodes.SkipNode
+        elif self.this_is_the_title:
+            if len(node.children) != 1 and not isinstance(node.children[0], nodes.Text):
+                self.builder.warn('document title is not a single Text node')
+            if not self.elements['title']:
+                # text needs to be escaped since it is inserted into
+                # the output literally
+                self.elements['title'] = node.astext().translate(tex_escape_map)
+            self.this_is_the_title = 0
+            raise nodes.SkipNode
+        elif isinstance(parent, nodes.section):
+            try:
+                self.body.append(r'\%s{' % self.sectionnames[self.sectionlevel])
+            except IndexError:
+                from sphinx.application import SphinxError
+                raise SphinxError('too many nesting section levels for LaTeX, '
+                                  'at heading: %s' % node.astext())
+            self.context.append('}\n')
+        elif isinstance(parent, (nodes.topic, nodes.sidebar)):
+            self.body.append(r'\textbf{')
+            self.context.append('}\n\n\medskip\n\n')
+        elif isinstance(parent, nodes.Admonition):
+            self.body.append('{')
+            self.context.append('}\n')
+        elif isinstance(parent, nodes.table):
+            self.table.caption = self.encode(node.astext())
+            raise nodes.SkipNode
+        else:
+            self.builder.warn('encountered title node not in section, topic, '
+                              'table, admonition or sidebar')
+            self.body.append('\\textbf{')
+            self.context.append('}\n')
+        self.in_title = 1
+    def depart_title(self, node):
+        self.in_title = 0
+        self.body.append(self.context.pop())
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.sidebar):
+            self.body.append('~\\\\\n\\textbf{')
+            self.context.append('}\n\\smallskip\n')
+        else:
+            self.context.append('')
+    def depart_subtitle(self, node):
+        self.body.append(self.context.pop())
+
+    desc_map = {
+        'function' : 'funcdesc',
+        'class': 'classdesc',
+        'method': 'methoddesc',
+        'staticmethod': 'staticmethoddesc',
+        'exception': 'excdesc',
+        'data': 'datadesc',
+        'attribute': 'memberdesc',
+        'opcode': 'opcodedesc',
+
+        'cfunction': 'cfuncdesc',
+        'cmember': 'cmemberdesc',
+        'cmacro': 'csimplemacrodesc',
+        'ctype': 'ctypedesc',
+        'cvar': 'cvardesc',
+
+        'describe': 'describe',
+        # and all others are 'describe' too
+    }
+
+    def visit_desc(self, node):
+        self.descstack.append(Desc(node))
+    def depart_desc(self, node):
+        d = self.descstack.pop()
+        self.body.append("\\end{%s}\n" % d.env)
+
+    def visit_desc_signature(self, node):
+        d = self.descstack[-1]
+        # reset these for every signature
+        d.type = d.cls = d.name = d.params = ''
+    def depart_desc_signature(self, node):
+        d = self.descstack[-1]
+        d.cls = d.cls.rstrip('.')
+        if node.parent['desctype'] != 'describe' and node['ids']:
+            hyper = '\\hypertarget{%s}{}' % node['ids'][0]
+        else:
+            hyper = ''
+        if d.count == 0:
+            t1 = "\n\n%s\\begin{%s}" % (hyper, d.env)
+        else:
+            t1 = "\n%s\\%sline" % (hyper, d.env[:-4])
+        d.count += 1
+        if d.env in ('funcdesc', 'classdesc', 'excclassdesc'):
+            t2 = "{%s}{%s}" % (d.name, d.params)
+        elif d.env in ('datadesc', 'excdesc', 'csimplemacrodesc'):
+            t2 = "{%s}" % (d.name)
+        elif d.env in ('methoddesc', 'staticmethoddesc'):
+            if d.cls:
+                t2 = "[%s]{%s}{%s}" % (d.cls, d.name, d.params)
+            else:
+                t2 = "{%s}{%s}" % (d.name, d.params)
+        elif d.env == 'memberdesc':
+            if d.cls:
+                t2 = "[%s]{%s}" % (d.cls, d.name)
+            else:
+                t2 = "{%s}" % d.name
+        elif d.env == 'cfuncdesc':
+            if d.cls:
+                # C++ class names
+                d.name = '%s::%s' % (d.cls, d.name)
+            t2 = "{%s}{%s}{%s}" % (d.type, d.name, d.params)
+        elif d.env == 'cmemberdesc':
+            try:
+                type, container = d.type.rsplit(' ', 1)
+                container = container.rstrip('.')
+            except ValueError:
+                container = ''
+                type = d.type
+            t2 = "{%s}{%s}{%s}" % (container, type, d.name)
+        elif d.env == 'cvardesc':
+            t2 = "{%s}{%s}" % (d.type, d.name)
+        elif d.env == 'ctypedesc':
+            t2 = "{%s}" % (d.name)
+        elif d.env == 'opcodedesc':
+            t2 = "{%s}{%s}" % (d.name, d.params)
+        elif d.env == 'describe':
+            t2 = "{%s}" % d.name
+        self.body.append(t1 + t2)
+
+    def visit_desc_type(self, node):
+        d = self.descstack[-1]
+        if d.env == 'describe':
+            d.name += self.encode(node.astext())
+        else:
+            self.descstack[-1].type = self.encode(node.astext().strip())
+        raise nodes.SkipNode
+
+    def visit_desc_name(self, node):
+        d = self.descstack[-1]
+        if d.env == 'describe':
+            d.name += self.encode(node.astext())
+        else:
+            self.descstack[-1].name = self.encode(node.astext().strip())
+        raise nodes.SkipNode
+
+    def visit_desc_addname(self, node):
+        d = self.descstack[-1]
+        if d.env == 'describe':
+            d.name += self.encode(node.astext())
+        else:
+            self.descstack[-1].cls = self.encode(node.astext().strip())
+        raise nodes.SkipNode
+
+    def visit_desc_parameterlist(self, node):
+        d = self.descstack[-1]
+        if d.env == 'describe':
+            d.name += self.encode(node.astext())
+        else:
+            self.descstack[-1].params = self.encode(node.astext().strip())
+        raise nodes.SkipNode
+
+    def visit_desc_annotation(self, node):
+        d = self.descstack[-1]
+        if d.env == 'describe':
+            d.name += self.encode(node.astext())
+        else:
+            self.descstack[-1].annotation = self.encode(node.astext().strip())
+        raise nodes.SkipNode
+
+    def visit_refcount(self, node):
+        self.body.append("\\emph{")
+    def depart_refcount(self, node):
+        self.body.append("}\\\\")
+
+    def visit_desc_content(self, node):
+        if node.children and not isinstance(node.children[0], nodes.paragraph):
+            # avoid empty desc environment which causes a formatting bug
+            self.body.append('~')
+    def depart_desc_content(self, node):
+        pass
+
+    def visit_seealso(self, node):
+        self.body.append("\n\n\\strong{%s:}\n\n" % admonitionlabels['seealso'])
+    def depart_seealso(self, node):
+        self.body.append("\n\n")
+
+    def visit_rubric(self, node):
+        if len(node.children) == 1 and node.children[0].astext() == 'Footnotes':
+            raise nodes.SkipNode
+        self.body.append('\\paragraph{')
+        self.context.append('}\n')
+    def depart_rubric(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_footnote(self, node):
+        pass
+    def depart_footnote(self, node):
+        pass
+
+    def visit_label(self, node):
+        if isinstance(node.parent, nodes.citation):
+            self.bibitems[-1][0] = node.astext()
+        raise nodes.SkipNode
+
+    def visit_tabular_col_spec(self, node):
+        self.next_table_colspec = node['spec']
+        raise nodes.SkipNode
+
+    def visit_table(self, node):
+        if self.table:
+            raise NotImplementedError('Nested tables are not supported.')
+        self.table = Table()
+        self.tablebody = []
+        # Redirect body output until table is finished.
+        self._body = self.body
+        self.body = self.tablebody
+    def depart_table(self, node):
+        self.body = self._body
+        if self.table.caption is not None:
+            self.body.append('\n\\begin{threeparttable}\n'
+                             '\\caption{%s}\n' % self.table.caption)
+        if self.table.has_verbatim:
+            self.body.append('\n\\begin{tabular}')
+        else:
+            self.body.append('\n\\begin{tabulary}{\\textwidth}')
+        if self.table.colspec:
+            self.body.append(self.table.colspec)
+        else:
+            if self.table.has_verbatim:
+                colwidth = 0.95 / self.table.colcount
+                colspec = ('p{%.3f\\textwidth}|' % colwidth) * self.table.colcount
+                self.body.append('{|' + colspec + '}\n')
+            else:
+                self.body.append('{|' + ('L|' * self.table.colcount) + '}\n')
+        self.body.extend(self.tablebody)
+        if self.table.has_verbatim:
+            self.body.append('\\end{tabular}\n\n')
+        else:
+            self.body.append('\\end{tabulary}\n\n')
+        if self.table.caption is not None:
+            self.body.append('\\end{threeparttable}\n\n')
+        self.table = None
+        self.tablebody = None
+
+    def visit_colspec(self, node):
+        self.table.colcount += 1
+    def depart_colspec(self, node):
+        pass
+
+    def visit_tgroup(self, node):
+        pass
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_thead(self, node):
+        if self.next_table_colspec:
+            self.table.colspec = '{%s}\n' % self.next_table_colspec
+        self.next_table_colspec = None
+        self.body.append('\\hline\n')
+        self.table.had_head = True
+    def depart_thead(self, node):
+        self.body.append('\\hline\n')
+
+    def visit_tbody(self, node):
+        if not self.table.had_head:
+            self.visit_thead(node)
+    def depart_tbody(self, node):
+        self.body.append('\\hline\n')
+
+    def visit_row(self, node):
+        self.table.col = 0
+    def depart_row(self, node):
+        self.body.append('\\\\\n')
+
+    def visit_entry(self, node):
+        if node.has_key('morerows') or node.has_key('morecols'):
+            raise NotImplementedError('Column or row spanning cells are '
+                                      'not implemented.')
+        if self.table.col > 0:
+            self.body.append(' & ')
+        self.table.col += 1
+        if isinstance(node.parent.parent, nodes.thead):
+            self.body.append('\\textbf{')
+            self.context.append('}')
+        else:
+            self.context.append('')
+    def depart_entry(self, node):
+        self.body.append(self.context.pop()) # header
+
+    def visit_acks(self, node):
+        # this is a list in the source, but should be rendered as a
+        # comma-separated list here
+        self.body.append('\n\n')
+        self.body.append(', '.join(n.astext() for n in node.children[0].children) + '.')
+        self.body.append('\n\n')
+        raise nodes.SkipNode
+
+    def visit_bullet_list(self, node):
+        self.body.append('\\begin{itemize}\n' )
+    def depart_bullet_list(self, node):
+        self.body.append('\\end{itemize}\n' )
+
+    def visit_enumerated_list(self, node):
+        self.body.append('\\begin{enumerate}\n' )
+    def depart_enumerated_list(self, node):
+        self.body.append('\\end{enumerate}\n' )
+
+    def visit_list_item(self, node):
+        # Append "{}" in case the next character is "[", which would break
+        # LaTeX's list environment (no numbering and the "[" is not printed).
+        self.body.append(r'\item {} ')
+    def depart_list_item(self, node):
+        self.body.append('\n')
+
+    def visit_definition_list(self, node):
+        self.body.append('\\begin{description}\n')
+    def depart_definition_list(self, node):
+        self.body.append('\\end{description}\n')
+
+    def visit_definition_list_item(self, node):
+        pass
+    def depart_definition_list_item(self, node):
+        pass
+
+    def visit_term(self, node):
+        ctx = ']'
+        if node.has_key('ids') and node['ids']:
+            ctx += '\\hypertarget{%s}{}' % node['ids'][0]
+        self.body.append('\\item[')
+        self.context.append(ctx)
+    def depart_term(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_classifier(self, node):
+        self.body.append('{[}')
+    def depart_classifier(self, node):
+        self.body.append('{]}')
+
+    def visit_definition(self, node):
+        pass
+    def depart_definition(self, node):
+        self.body.append('\n')
+
+    def visit_field_list(self, node):
+        self.body.append('\\begin{quote}\\begin{description}\n')
+    def depart_field_list(self, node):
+        self.body.append('\\end{description}\\end{quote}\n')
+
+    def visit_field(self, node):
+        pass
+    def depart_field(self, node):
+        pass
+
+    visit_field_name = visit_term
+    depart_field_name = depart_term
+
+    visit_field_body = visit_definition
+    depart_field_body = depart_definition
+
+    def visit_paragraph(self, node):
+        self.body.append('\n')
+    def depart_paragraph(self, node):
+        self.body.append('\n')
+
+    def visit_centered(self, node):
+        self.body.append('\n\\begin{centering}')
+    def depart_centered(self, node):
+        self.body.append('\n\\end{centering}')
+
+    def visit_module(self, node):
+        modname = node['modname']
+        self.body.append('\n\\declaremodule[%s]{}{%s}' % (modname.replace('_', ''),
+                                                          self.encode(modname)))
+        self.body.append('\n\\modulesynopsis{%s}' % self.encode(node['synopsis']))
+        if node.has_key('platform'):
+            self.body.append('\\platform{%s}' % self.encode(node['platform']))
+    def depart_module(self, node):
+        pass
+
+    def latex_image_length(self, width_str):
+        match = re.match('(\d*\.?\d*)\s*(\S*)', width_str)
+        if not match:
+            # fallback
+            return width_str
+        res = width_str
+        amount, unit = match.groups()[:2]
+        if not unit or unit == "px":
+            # pixels: let LaTeX alone
+            return None
+        elif unit == "%":
+            res = "%.3f\\linewidth" % (float(amount) / 100.0)
+        return res
+
+    def visit_image(self, node):
+        attrs = node.attributes
+        pre = []                        # in reverse order
+        post = []
+        include_graphics_options = []
+        inline = isinstance(node.parent, nodes.TextElement)
+        if attrs.has_key('scale'):
+            # Could also be done with ``scale`` option to
+            # ``\includegraphics``; doing it this way for consistency.
+            pre.append('\\scalebox{%f}{' % (attrs['scale'] / 100.0,))
+            post.append('}')
+        if attrs.has_key('width'):
+            w = self.latex_image_length(attrs['width'])
+            if w:
+                include_graphics_options.append('width=%s' % w)
+        if attrs.has_key('height'):
+            h = self.latex_image_length(attrs['height'])
+            if h:
+                include_graphics_options.append('height=%s' % h)
+        if attrs.has_key('align'):
+            align_prepost = {
+                # By default latex aligns the top of an image.
+                (1, 'top'): ('', ''),
+                (1, 'middle'): ('\\raisebox{-0.5\\height}{', '}'),
+                (1, 'bottom'): ('\\raisebox{-\\height}{', '}'),
+                (0, 'center'): ('{\\hfill', '\\hfill}'),
+                # These 2 don't exactly do the right thing.  The image should
+                # be floated alongside the paragraph.  See
+                # http://www.w3.org/TR/html4/struct/objects.html#adef-align-IMG
+                (0, 'left'): ('{', '\\hfill}'),
+                (0, 'right'): ('{\\hfill', '}'),}
+            try:
+                pre.append(align_prepost[inline, attrs['align']][0])
+                post.append(align_prepost[inline, attrs['align']][1])
+            except KeyError:
+                pass                    # XXX complain here?
+        if not inline:
+            pre.append('\n')
+            post.append('\n')
+        pre.reverse()
+        if node['uri'] in self.builder.images:
+            uri = self.builder.images[node['uri']]
+        else:
+            # missing image!
+            if self.ignore_missing_images:
+                return
+            uri = node['uri']
+        if uri.find('://') != -1:
+            # ignore remote images
+            return
+        self.body.extend(pre)
+        options = ''
+        if include_graphics_options:
+            options = '[%s]' % ','.join(include_graphics_options)
+        self.body.append('\\includegraphics%s{%s}' % (options, uri))
+        self.body.extend(post)
+    def depart_image(self, node):
+        pass
+
+    def visit_figure(self, node):
+        if (not node.attributes.has_key('align') or
+            node.attributes['align'] == 'center'):
+            # centering does not add vertical space like center.
+            align = '\n\\centering'
+            align_end = ''
+        else:
+            # TODO non vertical space for other alignments.
+            align = '\\begin{flush%s}' % node.attributes['align']
+            align_end = '\\end{flush%s}' % node.attributes['align']
+        self.body.append('\\begin{figure}[htbp]%s\n' % align)
+        self.context.append('%s\\end{figure}\n' % align_end)
+    def depart_figure(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_caption(self, node):
+        self.body.append('\\caption{')
+    def depart_caption(self, node):
+        self.body.append('}')
+
+    def visit_legend(self, node):
+        self.body.append('{\\small ')
+    def depart_legend(self, node):
+        self.body.append('}')
+
+    def visit_admonition(self, node):
+        self.body.append('\n\\begin{notice}{note}')
+    def depart_admonition(self, node):
+        self.body.append('\\end{notice}\n')
+
+    def _make_visit_admonition(name):
+        def visit_admonition(self, node):
+            self.body.append('\n\\begin{notice}{%s}{%s:}' %
+                             (name, admonitionlabels[name]))
+        return visit_admonition
+    def _depart_named_admonition(self, node):
+        self.body.append('\\end{notice}\n')
+
+    visit_attention = _make_visit_admonition('attention')
+    depart_attention = _depart_named_admonition
+    visit_caution = _make_visit_admonition('caution')
+    depart_caution = _depart_named_admonition
+    visit_danger = _make_visit_admonition('danger')
+    depart_danger = _depart_named_admonition
+    visit_error = _make_visit_admonition('error')
+    depart_error = _depart_named_admonition
+    visit_hint = _make_visit_admonition('hint')
+    depart_hint = _depart_named_admonition
+    visit_important = _make_visit_admonition('important')
+    depart_important = _depart_named_admonition
+    visit_note = _make_visit_admonition('note')
+    depart_note = _depart_named_admonition
+    visit_tip = _make_visit_admonition('tip')
+    depart_tip = _depart_named_admonition
+    visit_warning = _make_visit_admonition('warning')
+    depart_warning = _depart_named_admonition
+
+    def visit_versionmodified(self, node):
+        intro = versionlabels[node['type']] % node['version']
+        if node.children:
+            intro += ': '
+        else:
+            intro += '.'
+        self.body.append(intro)
+    def depart_versionmodified(self, node):
+        pass
+
+    def visit_target(self, node):
+        def add_target(id):
+            # indexing uses standard LaTeX index markup, so the targets
+            # will be generated differently
+            if not id.startswith('index-'):
+                self.body.append(r'\hypertarget{%s}{}' % id)
+
+        if node.has_key('refid') and node['refid'] not in self.written_ids:
+            parindex = node.parent.index(node)
+            try:
+                next = node.parent[parindex+1]
+                if isinstance(next, nodes.section):
+                    self.next_section_target = node['refid']
+                    return
+            except IndexError:
+                pass
+            add_target(node['refid'])
+            self.written_ids.add(node['refid'])
+    def depart_target(self, node):
+        pass
+
+    def visit_attribution(self, node):
+        self.body.append('\n\\begin{flushright}\n')
+        self.body.append('---')
+    def depart_attribution(self, node):
+        self.body.append('\n\\end{flushright}\n')
+
+    def visit_index(self, node, scre=re.compile(r';\s*')):
+        entries = node['entries']
+        for type, string, tid, _ in entries:
+            if type == 'single':
+                self.body.append(r'\index{%s}' % scre.sub('!', self.encode(string)))
+            elif type == 'pair':
+                parts = tuple(self.encode(x.strip()) for x in string.split(';', 1))
+                try:
+                    self.body.append(r'\indexii{%s}{%s}' % parts)
+                except TypeError:
+                    self.builder.warn('invalid pair index entry %r' % string)
+            elif type == 'triple':
+                parts = tuple(self.encode(x.strip()) for x in string.split(';', 2))
+                try:
+                    self.body.append(r'\indexiii{%s}{%s}{%s}' % parts)
+                except TypeError:
+                    self.builder.warn('invalid triple index entry %r' % string)
+            else:
+                self.builder.warn('unknown index entry type %s found' % type)
+        raise nodes.SkipNode
+
+    def visit_raw(self, node):
+        if 'latex' in node.get('format', '').split():
+            self.body.append(node.astext())
+        raise nodes.SkipNode
+
+    def visit_reference(self, node):
+        uri = node.get('refuri', '')
+        if self.in_title or not uri:
+            self.context.append('')
+        elif uri.startswith('mailto:') or uri.startswith('http:') or \
+             uri.startswith('https:') or uri.startswith('ftp:'):
+            self.body.append('\\href{%s}{' % self.encode(uri))
+            self.context.append('}')
+        elif uri.startswith('#'):
+            self.body.append('\\hyperlink{%s}{' % uri[1:])
+            self.context.append('}')
+        elif uri.startswith('@token'):
+            if self.in_production_list:
+                self.body.append('\\token{')
+            else:
+                self.body.append('\\grammartoken{')
+            self.context.append('}')
+        else:
+            self.builder.warn('unusable reference target found: %s' % uri)
+            self.context.append('')
+    def depart_reference(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_pending_xref(self, node):
+        pass
+    def depart_pending_xref(self, node):
+        pass
+
+    def visit_emphasis(self, node):
+        self.body.append(r'\emph{')
+    def depart_emphasis(self, node):
+        self.body.append('}')
+
+    def visit_literal_emphasis(self, node):
+        self.body.append(r'\emph{\texttt{')
+        self.no_contractions += 1
+    def depart_literal_emphasis(self, node):
+        self.body.append('}}')
+        self.no_contractions -= 1
+
+    def visit_strong(self, node):
+        self.body.append(r'\textbf{')
+    def depart_strong(self, node):
+        self.body.append('}')
+
+    def visit_title_reference(self, node):
+        self.body.append(r'\emph{')
+    def depart_title_reference(self, node):
+        self.body.append('}')
+
+    def visit_citation(self, node):
+        # TODO maybe use cite bibitems
+        self.bibitems.append(['', ''])
+        self.context.append(len(self.body))
+    def depart_citation(self, node):
+        size = self.context.pop()
+        text = ''.join(self.body[size:])
+        del self.body[size:]
+        self.bibitems[-1][1] = text
+
+    def visit_citation_reference(self, node):
+        citeid = node.astext()
+        self.body.append('\\cite{%s}' % citeid)
+        raise nodes.SkipNode
+
+    def visit_literal(self, node):
+        content = self.encode(node.astext().strip())
+        if self.in_title:
+            self.body.append(r'\texttt{%s}' % content)
+        elif node.has_key('role') and node['role'] == 'samp':
+            self.body.append(r'\samp{%s}' % content)
+        else:
+            self.body.append(r'\code{%s}' % content)
+        raise nodes.SkipNode
+
+    def visit_footnote_reference(self, node):
+        num = node.astext().strip()
+        try:
+            fn = self.footnotestack[-1][num]
+        except (KeyError, IndexError):
+            raise nodes.SkipNode
+        self.body.append('\\footnote{')
+        fn.walkabout(self)
+        raise nodes.SkipChildren
+    def depart_footnote_reference(self, node):
+        self.body.append('}')
+
+    def visit_literal_block(self, node):
+        self.verbatim = ''
+    def depart_literal_block(self, node):
+        code = self.verbatim.rstrip('\n')
+        lang = self.highlightlang
+        linenos = code.count('\n') >= self.highlightlinenothreshold - 1
+        if node.has_key('language'):
+            # code-block directives
+            lang = node['language']
+        if node.has_key('linenos'):
+            linenos = node['linenos']
+        hlcode = self.highlighter.highlight_block(code, lang, linenos)
+        # workaround for Unicode issue
+        hlcode = hlcode.replace(u'€', u'@texteuro[]')
+        # must use original Verbatim environment and "tabular" environment
+        if self.table:
+            hlcode = hlcode.replace('\\begin{Verbatim}',
+                                    '\\begin{OriginalVerbatim}')
+            self.table.has_verbatim = True
+        # get consistent trailer
+        hlcode = hlcode.rstrip()[:-14] # strip \end{Verbatim}
+        hlcode = hlcode.rstrip() + '\n'
+        self.body.append('\n' + hlcode + '\\end{%sVerbatim}\n' %
+                         (self.table and 'Original' or ''))
+        self.verbatim = None
+    visit_doctest_block = visit_literal_block
+    depart_doctest_block = depart_literal_block
+
+    def visit_line_block(self, node):
+        """line-block:
+        * whitespace (including linebreaks) is significant
+        * inline markup is supported.
+        * serif typeface
+        """
+        self.body.append('{\\raggedright{}')
+        self.literal_whitespace = 1
+    def depart_line_block(self, node):
+        self.literal_whitespace = 0
+        # remove the last \\
+        del self.body[-1]
+        self.body.append('}\n')
+
+    def visit_line(self, node):
+        self._line_start = len(self.body)
+    def depart_line(self, node):
+        if self._line_start == len(self.body):
+            # no output in this line -- add a nonbreaking space, else the
+            # \\ command will give an error
+            self.body.append('~')
+        if self.table is not None:
+            self.body.append('\\newline\n')
+        else:
+            self.body.append('\\\\\n')
+
+    def visit_block_quote(self, node):
+        # If the block quote contains a single object and that object
+        # is a list, then generate a list not a block quote.
+        # This lets us indent lists.
+        done = 0
+        if len(node.children) == 1:
+            child = node.children[0]
+            if isinstance(child, nodes.bullet_list) or \
+                    isinstance(child, nodes.enumerated_list):
+                done = 1
+        if not done:
+            self.body.append('\\begin{quote}\n')
+    def depart_block_quote(self, node):
+        done = 0
+        if len(node.children) == 1:
+            child = node.children[0]
+            if isinstance(child, nodes.bullet_list) or \
+                    isinstance(child, nodes.enumerated_list):
+                done = 1
+        if not done:
+            self.body.append('\\end{quote}\n')
+
+    # option node handling copied from docutils' latex writer
+
+    def visit_option(self, node):
+        if self.context[-1]:
+            # this is not the first option
+            self.body.append(', ')
+    def depart_option(self, node):
+        # flag that the first option is done.
+        self.context[-1] += 1
+
+    def visit_option_argument(self, node):
+        """The delimiter betweeen an option and its argument."""
+        self.body.append(node.get('delimiter', ' '))
+    def depart_option_argument(self, node):
+        pass
+
+    def visit_option_group(self, node):
+        self.body.append('\\item [')
+        # flag for first option
+        self.context.append(0)
+    def depart_option_group(self, node):
+        self.context.pop() # the flag
+        self.body.append('] ')
+
+    def visit_option_list(self, node):
+        self.body.append('\\begin{optionlist}{3cm}\n')
+    def depart_option_list(self, node):
+        self.body.append('\\end{optionlist}\n')
+
+    def visit_option_list_item(self, node):
+        pass
+    def depart_option_list_item(self, node):
+        pass
+
+    def visit_option_string(self, node):
+        ostring = node.astext()
+        self.body.append(self.encode(ostring.replace('--', u'-{-}')))
+        raise nodes.SkipNode
+
+    def visit_description(self, node):
+        self.body.append( ' ' )
+    def depart_description(self, node):
+        pass
+
+    def visit_superscript(self, node):
+        self.body.append('$^{\\text{')
+    def depart_superscript(self, node):
+        self.body.append('}}$')
+
+    def visit_subscript(self, node):
+        self.body.append('$_{\\text{')
+    def depart_subscript(self, node):
+        self.body.append('}}$')
+
+    def visit_substitution_definition(self, node):
+        raise nodes.SkipNode
+
+    def visit_substitution_reference(self, node):
+        raise nodes.SkipNode
+
+    def visit_generated(self, node):
+        pass
+    def depart_generated(self, node):
+        pass
+
+    def visit_compound(self, node):
+        pass
+    def depart_compound(self, node):
+        pass
+
+    def visit_container(self, node):
+        pass
+    def depart_container(self, node):
+        pass
+
+    def visit_decoration(self, node):
+        pass
+    def depart_decoration(self, node):
+        pass
+
+    # text handling
+
+    def encode(self, text):
+        text = unicode(text).translate(tex_escape_map)
+        if self.literal_whitespace:
+            # Insert a blank before the newline, to avoid
+            # ! LaTeX Error: There's no line here to end.
+            text = text.replace(u'\n', u'~\\\\\n').replace(u' ', u'~')
+        if self.no_contractions:
+            text = text.replace('--', u'-{-}')
+        return text
+
+    def visit_Text(self, node):
+        if self.verbatim is not None:
+            self.verbatim += node.astext()
+        else:
+            text = self.encode(node.astext())
+            self.body.append(educateQuotesLatex(text))
+    def depart_Text(self, node):
+        pass
+
+    def visit_comment(self, node):
+        raise nodes.SkipNode
+
+    def visit_meta(self, node):
+        # only valid for HTML
+        raise nodes.SkipNode
+
+    def visit_system_message(self, node):
+        pass
+    def depart_system_message(self, node):
+        self.body.append('\n')
+
+    def unknown_visit(self, node):
+        raise NotImplementedError('Unknown node: ' + node.__class__.__name__)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/linkcheck.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,130 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.linkcheck
+    ~~~~~~~~~~~~~~~~
+
+    The CheckExternalLinksBuilder class.
+
+    :copyright: 2008 by Georg Brandl, Thomas Lamb.
+    :license: BSD.
+"""
+
+import socket
+from os import path
+from urllib2 import build_opener, HTTPError
+
+from docutils import nodes
+
+from sphinx.builder import Builder
+from sphinx.util.console import purple, red, darkgreen
+
+# create an opener that will simulate a browser user-agent
+opener = build_opener()
+opener.addheaders = [('User-agent', 'Mozilla/5.0')]
+
+
+class CheckExternalLinksBuilder(Builder):
+    """
+    Checks for broken external links.
+    """
+    name = 'linkcheck'
+
+    def init(self):
+        self.good = set()
+        self.broken = {}
+        self.redirected = {}
+        # set a timeout for non-responding servers
+        socket.setdefaulttimeout(5.0)
+        # create output file
+        open(path.join(self.outdir, 'output.txt'), 'w').close()
+
+    def get_target_uri(self, docname, typ=None):
+        return ''
+
+    def get_outdated_docs(self):
+        return self.env.found_docs
+
+    def prepare_writing(self, docnames):
+        return
+
+    def write_doc(self, docname, doctree):
+        self.info()
+        for node in doctree.traverse(nodes.reference):
+            try:
+                self.check(node, docname)
+            except KeyError:
+                continue
+
+    def check(self, node, docname):
+        uri = node['refuri']
+
+        if '#' in uri:
+            uri = uri.split('#')[0]
+
+        if uri in self.good:
+            return
+
+        lineno = None
+        while lineno is None and node:
+            node = node.parent
+            lineno = node.line
+
+        if uri[0:5] == 'http:' or uri[0:6] == 'https:':
+            self.info(uri, nonl=1)
+
+            if uri in self.broken:
+                (r, s) = self.broken[uri]
+            elif uri in self.redirected:
+                (r, s) = self.redirected[uri]
+            else:
+                (r, s) = self.resolve(uri)
+
+            if r == 0:
+                self.info(' - ' + darkgreen('working'))
+                self.good.add(uri)
+            elif r == 2:
+                self.info(' - ' + red('broken: ') + s)
+                self.write_entry('broken', docname, lineno, uri + ': ' + s)
+                self.broken[uri] = (r, s)
+                if self.app.quiet:
+                    self.warn('%s:%s: broken link: %s' % (docname, lineno, uri))
+            else:
+                self.info(' - ' + purple('redirected') + ' to ' + s)
+                self.write_entry('redirected', docname, lineno, uri + ' to ' + s)
+                self.redirected[uri] = (r, s)
+        elif len(uri) == 0 or uri[0:7] == 'mailto:' or uri[0:4] == 'ftp:':
+            return
+        else:
+            self.warn(uri + ' - ' + red('malformed!'))
+            self.write_entry('malformed', docname, lineno, uri)
+            if self.app.quiet:
+                self.warn('%s:%s: malformed link: %s' % (docname, lineno, uri))
+            self.app.statuscode = 1
+
+        if self.broken:
+            self.app.statuscode = 1
+
+    def write_entry(self, what, docname, line, uri):
+        output = open(path.join(self.outdir, 'output.txt'), 'a')
+        output.write("%s:%s: [%s] %s\n" % (self.env.doc2path(docname, None),
+                                           line, what, uri))
+        output.close()
+
+    def resolve(self, uri):
+        try:
+            f = opener.open(uri)
+            f.close()
+        except HTTPError, err:
+            #if err.code == 403 and uri.startswith('http://en.wikipedia.org/'):
+            #    # Wikipedia blocks requests from urllib User-Agent
+            #    return (0, 0)
+            return (2, str(err))
+        except Exception, err:
+            return (2, str(err))
+        if f.url.rstrip('/') == uri.rstrip('/'):
+            return (0, 0)
+        else:
+            return (1, f.url)
+
+    def finish(self):
+        return
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.locale
+    ~~~~~~~~~~~~~
+
+    Locale utilities.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+_ = lambda x: x
+
+admonitionlabels = {
+    'attention': _('Attention'),
+    'caution':   _('Caution'),
+    'danger':    _('Danger'),
+    'error':     _('Error'),
+    'hint':      _('Hint'),
+    'important': _('Important'),
+    'note':      _('Note'),
+    'seealso':   _('See Also'),
+    'tip':       _('Tip'),
+    'warning':   _('Warning'),
+}
+
+versionlabels = {
+    'versionadded':   _('New in version %s'),
+    'versionchanged': _('Changed in version %s'),
+    'deprecated':     _('Deprecated since version %s'),
+}
+
+pairindextypes = {
+    'module':    _('module'),
+    'keyword':   _('keyword'),
+    'operator':  _('operator'),
+    'object':    _('object'),
+    'exception': _('exception'),
+    'statement': _('statement'),
+    'builtin':   _('built-in function'),
+}
+
+del _
+
+def init():
+    for dct in (admonitionlabels, versionlabels, pairindextypes):
+        for key in dct:
+            dct[key] = _(dct[key])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.js	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "cs", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"module, in ": "modul", "Preparing search...": "", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "", "Search finished, found %s page(s) matching the search query.": "", ", in ": "", "Permalink to this headline": "Trval\u00fd odkaz na tento nadpis", "Searching": "hledej", "Permalink to this definition": "Trval\u00fd odkaz na tuto definici", "Hide Search Matches": "", "Search Results": "V\u00fdsledky hled\u00e1n\u00ed"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.po	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,604 @@
+# Czech translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-08-10 11:43+0000\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Pavel Kosina <pavel.kosina@gmail.com>\n"
+"Language-Team: Pavel Kosina <pavel.kosina@gmail.com>\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d.%m.%Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Rejstřík indexů"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "index"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Rejstřík modulů"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "moduly"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "další"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "předchozí"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Vestavěné funkce"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Úroveň modulů"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d.%m.%Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+#, fuzzy
+msgid "Module Index"
+msgstr "Rejstřík modulů"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+#, fuzzy
+msgid "Search Page"
+msgstr "Vyhledávací stránka"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Trvalý odkaz na tuto definici"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Trvalý odkaz na tento nadpis"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Vydání"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "promměná prostředí, %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Platforma: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[obrázek]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (vestavěná funkce)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (v modulu %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s() (vestavěná proměnná)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s() (v modulu %s)"
+
+#: sphinx/directives/desc.py:33
+#, fuzzy, python-format
+msgid "%s (built-in class)"
+msgstr "%s() (vestavěná proměnná)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s() (třída v %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (metoda %s.%s)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (metoda %s)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (statická metoda %s.%s)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (statická metoda %s)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s() (atribut %s.%s)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s() (atribut %s)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C funkce)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (Älen C)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C makro)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C typ)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C proměnná)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Vyvolá"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Proměnná"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Vrací"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Typ navrácené hodnoty"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parametry"
+
+#: sphinx/directives/desc.py:423
+#, fuzzy, python-format
+msgid "%scommand line option; %s"
+msgstr "%sparametry příkazového řádku; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Platformy: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (module)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Autor sekce: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Autor modulu: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Viz také"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Výstraha"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Upozornění"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "NebezpeÄí"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Chyba"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Rada"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Důležité"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Poznámka"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Viz také"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Tip"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Varování"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Nové ve verzi %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Změněno ve verzi %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Zastaralé od verze %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "modul"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "klíÄové slovo"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operátor"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "objekt"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "výjimka"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "příkaz"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "vestavěná funkce"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/static/searchtools.js:274
+#, fuzzy
+msgid "Searching"
+msgstr "hledej"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/static/searchtools.js:338
+#, fuzzy
+msgid "module, in "
+msgstr "modul"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Výsledky hledání"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr ""
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Přehled"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Rejstříky a tabulky:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Celkový obsah"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "seznam všech sekcí a podsekcí"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "prohledej tuto dokumentaci"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "rychlý přístup ke všem modulům"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "všechny funkce, třídy, termíny"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Plný index na jedné stránce"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Index podle písmene"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "může být obrovský"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navigace"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Obsah"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Přechozí téma"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "předchozí kapitola"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Další téma"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "další kapitola"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Tato stránka"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Návrh změnu"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Ukázat zdroj"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Rychlé vyhledávání"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Hledání dle klíÄe"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "hledej"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Zadej jméno modulu, třídy nebo funkce."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Hledání uvnitř %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "O těchto dokumentech"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Hledání"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Veškerá práva vyhrazena"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Naposledy aktualizováno dne %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Vytvořeno pomocí <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Nejpopulárnější moduly:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Zobrazit moduly dostupné na této platformě"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Zastaralé"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Prohledat %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Poznámka:</strong> Stránka, kterou hledáte, "
+"neexistuje.<br>Snažili jsme se najít nové umístění této stránky, ale "
+"nepovedlo se."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Toto je vyhledávací stránka. Zadejte klíÄová slova    do pole níže a "
+"klikněte na \"hledej\". \n"
+"Prohledávání funkcí  hledá automaticky všechna slova. Stránky obsahující"
+"    slov méně, nebudou nalezeny."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "hledej"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Nic jsme nenašli."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Změny ve verzi %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automaticky generovaný seznam změn ve verzi %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Změny v knihovnách"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Změny API"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Ostatní změny"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.js	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "de", "plural_expr": "(n != 1)", "messages": {"module, in ": "Modul, in ", "Preparing search...": "Suche wird vorbereitet...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Es wurden keine Dokumente gefunden. Haben Sie alle Suchworte richtig geschrieben und gen\u00fcgend Kategorien ausgew\u00e4hlt?", "Search finished, found %s page(s) matching the search query.": "Suche beendet, %s Seite(n) mit Ergebnissen wurden gefunden.", ", in ": "", "Permalink to this headline": "Permalink zu dieser \u00dcberschrift", "Searching": "Suchen...", "Permalink to this definition": "Permalink zu dieser Definition", "Hide Search Matches": "Suchergebnisse ausblenden", "Search Results": "Suchergebnisse"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.po	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,601 @@
+# German translations for Sphinx.
+# Copyright (C) 2008 Translators.
+# This file is distributed under the same license as the Sphinx project.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-08-07 21:40+0200\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Horst Gutmann <zerok@zerokspot.com>\n"
+"Language-Team: de <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d. %m. %Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Allgemeiner Index"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "Index"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Globaler Modulindex"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "Module"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "weiter"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "zurück"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Builtins"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Modulebene"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d. %m. %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Stichwortverzeichnis"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Modulindex"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Suche"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Permalink zu dieser Definition"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Permalink zu dieser Ãœberschrift"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Release"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "Umgebungsvariable; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Plattform: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[Bild]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (eingebaute Funktion)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (in Modul %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (eingebaute Variable)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (in Modul %s)"
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (eingebaute Klasse)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (Klasse in %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (Methode von %s.%s)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (Methode von %s)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (statische Methode von %s.%s)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (statische Methode von %s)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (Attribut von %s.%s)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (Attribut von %s)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C-Funktion)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C-Member)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C-Makro)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C-Typ)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C-Variable)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Verursacht:"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Variable"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Rückgabe"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Rückgabetyp"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parameter"
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%sKommandozeilenoption; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Plattformen: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (Modul)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Autor des Abschnitts: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Autor des Moduls: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Siehe auch"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Achtung"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Vorsicht"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Gefahr"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Fehler"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Hinweis"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Wichtig"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Bemerkung"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Siehe auch"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Tipp"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Warnung"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Neu in Version %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Geändert in Version %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Veraltet ab Version %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "Module"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "Schlüsselwort"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "Operator"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "Objekt"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "Exception"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "Statement"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "eingebaute Funktion"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Suchergebnisse ausblenden"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "Suchen..."
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Suche wird vorbereitet..."
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr "Modul, in "
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Suchergebnisse"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Es wurden keine Dokumente gefunden. Haben Sie alle Suchworte richtig "
+"geschrieben und genügend Kategorien ausgewählt?"
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "Suche beendet, %s Seite(n) mit Ergebnissen wurden gefunden."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Ãœbersicht"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Indizes und Tabellen:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Vollständiges Inhaltsverzeichnis"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "Liste aller Kapitel und Unterkapitel"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "Durchsuche diese Dokumentation"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "Schneller Zugriff auf alle Module"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "Alle Funktionen, Klassen, Begriffe"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Stichwortverzeichnis &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Gesamtes Stichwortverzeichnis auf einer Seite"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Stichwortverzeichnis nach Anfangsbuchstabe"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "kann groß sein"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navigation"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Inhalt"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Vorheriges Thema"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "vorheriges Kapitel"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Nächstes Thema"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "nächstes Kapitel"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Diese Seite"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Änderung vorschlagen"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Quelltext anzeigen"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Schnellsuche"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Stichwortsuche"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Los"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Gib einen Modul-, Klassen- oder Funktionsnamen an."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Suche in %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "Ãœber diese Dokumentation"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Suche"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Zuletzt aktualisiert am %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Mit <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> %(sphinx_version)s "
+"erstellt."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Beliebteste Module:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Zeige nur Module, die auf diesen Plattformen verfügbar sind"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Veraltet"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Suche in %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Anmerkung:</strong> Du hast eine nicht länger gültige URL von "
+"diesem Server angefragt. Wir haben versucht dich auf die neue Adresse "
+"dieser Seite umzuleiten, aber dies muss nicht die richtige Seite sein."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Von hier aus kannst du die Dokumentation durchsuchen. Gib deine "
+"Suchbegriffe in das untenstehende Feld ein und klicke auf \"suchen\". "
+"Bitte beachte, dass die Suchfunktion automatisch nach all diesen Worten "
+"suchen wird. Seiten, die nicht alle Worte enthalten, werden nicht in der "
+"Ergebnisliste erscheinen."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "suchen"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Deine Suche ergab leider keine Treffer."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Änderungen in Version %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatisch generierte Liste der Änderungen in Version %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Bibliotheksänderungen"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API-Änderungen"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Andere Änderungen"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.js	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "es", "plural_expr": "(n != 1)", "messages": {"module, in ": "m\u00f3dulo", "Preparing search...": "Preparando la b\u00fasqueda", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "La b\u00fasqueda no dio ning\u00fan resultado.  Por favor aseg\u00farese que escribi\u00f3 todas las palabras correctamente y que ha seleccionado suficientes categor\u00edas", "Search finished, found %s page(s) matching the search query.": "B\u00fasqueda finalizada, se han encontrado %s p\u00e1gina(s) que concuerdan con su consulta", ", in ": "", "Permalink to this headline": "Enlazar permanentemente con este t\u00edtulo", "Searching": "Buscando", "Permalink to this definition": "Enlazar permanentemente con esta definici\u00f3n", "Hide Search Matches": "Coincidencias de la b\u00fasqueda", "Search Results": "Resultados de la b\u00fasqueda"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.po	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,611 @@
+# Spanish translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: guillem@torroja.dmt.upm.es\n"
+"POT-Creation-Date: 2008-09-11 23:58+0200\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Guillem Borrell <guillem@torroja.dmt.upm.es>\n"
+"Language-Team: es <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b, %Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Ãndice General"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "índice"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Ãndice Global de Módulos"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "módulos"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "siguiente"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "anterior"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+#, fuzzy
+msgid "Builtins"
+msgstr "Funciones de base"
+
+#: sphinx/builder.py:1131
+#, fuzzy
+msgid "Module level"
+msgstr "Módulos"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, fuzzy, python-format
+msgid "%B %d, %Y"
+msgstr "%d de %B de %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Ãndice"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Ãndice de Módulos"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Página de Búsqueda"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Enlazar permanentemente con esta definición"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Enlazar permanentemente con este título"
+
+#: sphinx/latexwriter.py:172
+#, fuzzy
+msgid "Release"
+msgstr "Versión"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "variables de entorno; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Plataforma: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[imagen]"
+
+#: sphinx/directives/desc.py:25
+#, fuzzy, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (función de base)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (en el módulo %s)"
+
+#: sphinx/directives/desc.py:29
+#, fuzzy, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variable de base)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (en el módulo %s)"
+
+#: sphinx/directives/desc.py:33
+#, fuzzy, python-format
+msgid "%s (built-in class)"
+msgstr "%s (variable de base)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (clase en %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s método)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s método)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s método estático)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s método estático)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s atributo)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atributo)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (función C)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (miembro C)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (macro C)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (tipo C)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (variable C)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Muestra"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Variable"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Devuelve"
+
+#: sphinx/directives/desc.py:116
+#, fuzzy
+msgid "Return type"
+msgstr "Tipo del argumento devuelto"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parámetros"
+
+#: sphinx/directives/desc.py:423
+#, fuzzy, python-format
+msgid "%scommand line option; %s"
+msgstr "%sOpciones en línea de comandos; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Plataformas:"
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (módulo)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Autor de la sección"
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Autor del módulo"
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Autor:"
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Ver también"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Atención"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Prudencia"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Peligro"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Error"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Consejo"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Importante"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Nota"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Ver También"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Truco"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Advertencia"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Nuevo en la versión %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Distinto en la versión %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Obsoleto desde la versión %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "módulo"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "palabra clave"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operador"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "objeto"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "excepción"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "sentencia"
+
+#: sphinx/locale/__init__.py:40
+#, fuzzy
+msgid "built-in function"
+msgstr "función de base"
+
+#: sphinx/static/doctools.js:174
+#, fuzzy
+msgid "Hide Search Matches"
+msgstr "Coincidencias de la búsqueda"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "Buscando"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Preparando la búsqueda"
+
+#: sphinx/static/searchtools.js:338
+#, fuzzy
+msgid "module, in "
+msgstr "módulo"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Resultados de la búsqueda"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"La búsqueda no dio ningún resultado.  Por favor asegúrese que escribió "
+"todas las palabras correctamente y que ha seleccionado suficientes "
+"categorías"
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr ""
+"Búsqueda finalizada, se han encontrado %s página(s) que concuerdan con su"
+" consulta"
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Resumen"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Ãndices y tablas:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Ãndice de contenidos completo"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "Muestra todas las secciones"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "buscar en esta documentación"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "acceso rápido a todos los módulos"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "todas las funciones, clases, términos"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Ãndice &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Ãndice completo en una página"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Ãndice alfabético"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "puede ser muy grande"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navegación"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Contenidos"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Tema anterior"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "Capítulo anterior"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Próximo tema"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "Próximo capítulo"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Esta página"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Sugerir una modificación"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Enseñar el código"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Búsqueda rápida"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Búsqueda por palabras clave"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Ir a"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Introducir en nombre de un módulo, clase o función"
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Buscar en %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "Sobre este documento"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Búsqueda"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\\\"%(path)s\\\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Actualizado por última vez en %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Creado con <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Módulos más comunes:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Mostrar sólo los módulos disponibles en estas plataformas"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Obsoleto"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Buscar en %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Nota:</strong> Has solicitado una dirección desactualizada a este"
+" servidor.  Hemos intentado redirigirte a la nueva dirección de la misma "
+"página pero puede no ser la correcta."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Este es el diálogo de búsqueda.  Introduce los términos en el diálogo "
+"siguiente y pulsa \"buscar\".  El asistente buscará automáticamente todas"
+" las palabras.  Las páginas que contengan menos palabras no aparecerán en"
+" la lista de resultados."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "buscar"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Tu consulta no obtuvo ningún resultado"
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Cambios en la versión %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Lista de cambios generada automáticamente en la versión %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Cambios en la biblioteca"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Cambios en la API C"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Otros cambios"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.js	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "fr", "plural_expr": "(n > 1)", "messages": {"module, in ": "module, dans", "Preparing search...": "Pr\u00e9paration de la recherche...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Votre recherche ne correspond \u00e0 aucun document. V\u00e9rifiez l'orthographe des termes de recherche et que vous avez s\u00e9lectionn\u00e9 suffisamment de cat\u00e9gories.", "Search finished, found %s page(s) matching the search query.": "La recherche est termin\u00e9e, %s page(s) correspond(ent) \u00e0 la requ\u00eate.", ", in ": ", dans", "Permalink to this headline": "Lien permanent vers ce titre", "Searching": "En cours de recherche", "Permalink to this definition": "Lien permanent vers cette d\u00e9finition", "Hide Search Matches": "Cacher les r\u00e9sultats de la recherche", "Search Results": "R\u00e9sultats de la recherche"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.po	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,606 @@
+# French translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# David Larlet <larlet@gmail.com>, 2008.
+# Sebastien Douche <sdouche@gmail.com>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: larlet@gmail.com\n"
+"POT-Creation-Date: 2008-08-08 12:39+0000\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Sébastien Douche <sdouche@gmail.com>\n"
+"Language-Team: French Translation Team <sphinx-dev@googlegroups.com>\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b %Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Index général"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "index"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Index général des modules"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "modules"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "suivant"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "précédent"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr "(dans"
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Fonctions de base"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Module"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d %B %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Index du module"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Page de recherche"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Lien permanent vers cette définition"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Lien permanent vers ce titre"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Version"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "variable d'environnement; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Plateforme : %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[image]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (fonction de base)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (dans le module %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variable de base)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (dans le module %s)"
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (classe de base)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (classe dans %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (méthode %s.%s)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (méthode %s)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (méthode statique %s.%s)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (méthode statique %s)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (attribut %s.%s)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (attribut %s)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (fonction C)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (membre C)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (macro C)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (type C)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (variable C)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Lève"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Variable"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Retourne"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Type retourné"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Paramètres"
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%soption de ligne de commande; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Plateformes : "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (module)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Auteur de la section : "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Auteur du module : "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Auteur : "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Voir aussi"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr "A faire"
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr "(L'entrée orginale se trouve dans %s, à la ligne %d et peut être trouvé"
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr "ici"
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Attention"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Prudence"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Danger"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Erreur"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Indice"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Important"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Note"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Voir aussi"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Astuce"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Warning"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Introduit dans la version %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Modifié dans la version %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Obsolète depuis la version %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "module"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "mot-clé"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "opérateur"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "objet"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "exception"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "état"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "fonction de base"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Cacher les résultats de la recherche"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "En cours de recherche"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Préparation de la recherche..."
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr "module, dans"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ", dans"
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Résultats de la recherche"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Votre recherche ne correspond à aucun document. Vérifiez l'orthographe "
+"des termes de recherche et que vous avez sélectionné suffisamment de "
+"catégories."
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "La recherche est terminée, %s page(s) correspond(ent) à la requête."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Résumé"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Indices et tables :"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Table des matières complète"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "lister l'ensemble des sections et sous-sections"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "rechercher dans cette documentation"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "accès rapide à l'ensemble des modules"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "toutes les fonctions, classes, termes"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Index complet sur une seule page"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Indexer les pages par lettre"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "peut être énorme"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navigation"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Table des matières"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Sujet précédent"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "Chapitre précédent"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Sujet suivant"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "Chapitre suivant"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Cette page"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Suggérer une modification"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Montrer la source"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Recherche rapide"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Recherche par mot-clé"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Go"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Saisissez un nom de module, classe ou fonction."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Recherchez dans %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "À propos de ces documents"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Recherche"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Mis à jour le %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Créé avec <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Modules les plus utilisés :"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "N'afficher que les modules disponibles sur ces plateformes"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Obsolète"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Rechercher %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Note :</strong> Vous tentez d'accéder à une ancienne URL de ce "
+"serveur. Nous avons essayé de vous rediriger vers la nouvelle adresse de "
+"cette page, mais ce n'est peut-être pas la bonne."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Vous pouvez effectuer une recherche au sein des documents. Saisissez les "
+"termes\n"
+"    de votre recherche dans le champs ci-dessous et cliquez sur "
+"\"rechercher\". Notez que la fonctionnalité de recherche\n"
+"    va automatique chercher pour tous les mots. Les pages\n"
+"    contenant moins de mots n'apparaîtront pas dans la liste des "
+"résultats."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "rechercher"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Votre recherche n'a retourné aucun résultat"
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Modifications dans la version %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Liste auto-générée des modifications dans la version %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Modifications de la bibliothèque"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Modifications de l'API C"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Autres modifications"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.js	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "ja", "plural_expr": "0", "messages": {"module, in ": "\u30e2\u30b8\u30e5\u30fc\u30eb", "Preparing search...": "\u691c\u7d22\u306e\u6e96\u5099\u4e2d...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u691c\u7d22\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u691c\u7d22\u3057\u305f\u3044\u8a00\u8449\u3092\u6b63\u3057\u3044\u3064\u3065\u308a\u3067\u5165\u529b\u3057\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u307e\u305f\u3001\u6b63\u3057\u3044\u30ab\u30c6\u30b4\u30ea\u306e\u691c\u7d22\u3092\u884c\u3063\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002", "Search finished, found %s page(s) matching the search query.": "\u691c\u7d22\u304c\u7d42\u4e86\u3057\u3001\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30da\u30fc\u30b8\u304c %s \u500b\u307f\u3064\u304b\u308a\u307e\u3057\u305f\u3002", ", in ": "", "Permalink to this headline": "\u3053\u306e\u30d8\u30c3\u30c9\u30e9\u30a4\u30f3\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Searching": "\u691c\u7d22\u4e2d", "Permalink to this definition": "\u3053\u306e\u5b9a\u7fa9\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Hide Search Matches": "\u691c\u7d22\u7d50\u679c\u3092\u96a0\u3059", "Search Results": "\u691c\u7d22\u7d50\u679c"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.po	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,595 @@
+# Japanese translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# Yasushi Masuda <whosaysni@gmail.com>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-09-11 23:58+0200\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Yasushi MASUDA <whosaysni@gmail.com>\n"
+"Language-Team: ja <LL@li.org>\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%Y 年 %m 月 %d 日"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "ç·åˆç´¢å¼•"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "索引"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "モジュールç·ç´¢å¼•"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "モジュール"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "次ã¸"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "å‰ã¸"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "組ã¿è¾¼ã¿"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "モジュールレベル"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%Y 年 %m 月 %d 日"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "索引"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "モジュール索引"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "検索ページ"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "ã“ã®å®šç¾©ã¸ã®ãƒ‘ーマリンク"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "ã“ã®ãƒ˜ãƒƒãƒ‰ãƒ©ã‚¤ãƒ³ã¸ã®ãƒ‘ーマリンク"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "リリース"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "環境変数; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "プラットフォーム: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[ç”»åƒ]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (組ã¿è¾¼ã¿é–¢æ•°)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (%s モジュール)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (組ã¿è¾¼ã¿å¤‰æ•°)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (%s モジュール)"
+
+#: sphinx/directives/desc.py:33
+#, fuzzy, python-format
+msgid "%s (built-in class)"
+msgstr "%s (組ã¿è¾¼ã¿å¤‰æ•°)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (%s ã®ã‚¯ãƒ©ã‚¹)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s ã®ãƒ¡ã‚½ãƒƒãƒ‰)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s ã®ãƒ¡ã‚½ãƒƒãƒ‰)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s ã®é™çš„メソッド)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s ã®é™çš„メソッド)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s ã®å±žæ€§)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s ã®å±žæ€§)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C ã®é–¢æ•°)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C ã®ãƒ¡ãƒ³ãƒå¤‰æ•°)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C ã®ãƒžã‚¯ãƒ­)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C ã®ãƒ‡ãƒ¼ã‚¿åž‹)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C ã®å¤‰æ•°)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "例外"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "変数"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "戻り値"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "戻り値ã®åž‹"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "パラメタ"
+
+#: sphinx/directives/desc.py:423
+#, fuzzy, python-format
+msgid "%scommand line option; %s"
+msgstr "%sコマンドラインオプション; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "プラットフォーム: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (モジュール)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "ã“ã®ç¯€ã®ä½œè€…: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "モジュールã®ä½œè€…: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "作者: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "å‚考"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "注æ„"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "ã”用心"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "å±é™º"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "エラー"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "ヒント"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "é‡è¦"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "ノート"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "å‚考"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "ã¡ãªã¿ã«"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "警告"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§è¿½åŠ "
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§å¤‰æ›´"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§æ’¤å»ƒ"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "モジュール"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "キーワード"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "演算å­"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "オブジェクト"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "例外"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "æ–‡"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "組ã¿è¾¼ã¿é–¢æ•°"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "検索çµæžœã‚’éš ã™"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "検索中"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "検索ã®æº–備中..."
+
+#: sphinx/static/searchtools.js:338
+#, fuzzy
+msgid "module, in "
+msgstr "モジュール"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "検索çµæžœ"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr "検索æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¯ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚検索ã—ãŸã„言葉を正ã—ã„ã¤ã¥ã‚Šã§å…¥åŠ›ã—ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。ã¾ãŸã€æ­£ã—ã„カテゴリã®æ¤œç´¢ã‚’è¡Œã£ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。"
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "検索ãŒçµ‚了ã—ã€æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹ãƒšãƒ¼ã‚¸ãŒ %s 個ã¿ã¤ã‹ã‚Šã¾ã—ãŸã€‚"
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "概è¦"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "索引ã¨è¡¨ä¸€è¦§:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "ç·åˆç›®æ¬¡"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "ç« ï¼ç¯€ä¸€è¦§"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "ドキュメントを検索"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "全モジュール早見表"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "関数ã€ã‚¯ãƒ©ã‚¹ãŠã‚ˆã³ç”¨èªžç·è¦§"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "索引 &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "ç·ç´¢å¼•"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "頭文字別索引"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "大ãã„å ´åˆãŒã‚ã‚‹ã®ã§æ³¨æ„"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "ナビゲーション"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "目次"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "å‰ã®ãƒˆãƒ”ックã¸"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "å‰ã®ç« ã¸"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "次ã®ãƒˆãƒ”ックã¸"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "次ã®ç« ã¸"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "ã“ã®ãƒšãƒ¼ã‚¸"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "変更ã®ã‚µã‚¸ã‚§ã‚¹ãƒˆ"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "ソースコードを表示"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "クイック検索"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "キーワード検索"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "検索"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "モジュールã€ã‚¯ãƒ©ã‚¹ã€ã¾ãŸã¯é–¢æ•°åを入力ã—ã¦ãã ã•ã„"
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "%(docstitle)s 内を検索"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«ã¤ã„ã¦"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "検索"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "著作権"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "最終更新: %(last_updated)s"
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¯ <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s ã§ç”Ÿæˆã—ã¾ã—ãŸã€‚"
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "よãå‚ç…§ã•ã‚Œã¦ã„るモジュール:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "ã“ã®ãƒ—ラットフォームã§åˆ©ç”¨å¯èƒ½ãªãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã ã‘を表示ã™ã‚‹"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "撤廃"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "%(docstitle)s 内を検索"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>注æ„:</strong> ã‚ãªãŸãŒè¡¨ç¤ºã—よã†ã¨ã—ã¦ã„ã‚‹ã®ã¯å¤ã„ URL ã§ã™ã€‚ã“ã®ãƒšãƒ¼ã‚¸ã«å¯¾å¿œã™ã‚‹æ–°ã—ã„ URL "
+"ã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã‚’試ã¿ã¾ã™ãŒã€é©åˆ‡ãªãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆå…ˆã§ãªã„ã‹ã‚‚ã—ã‚Œãªã„ã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。"
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’検索ã§ãã¾ã™ã€‚キーワードを下ã®ãƒœãƒƒã‚¯ã‚¹ã«å…¥åŠ›ã—ã¦ã€ã€Œæ¤œç´¢ã€ã‚’クリックã—ã¦ãã ã•ã„。入力ã•ã‚ŒãŸå…¨ã¦ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’å«ã‚€ãƒšãƒ¼ã‚¸ãŒæ¤œç´¢ã•ã‚Œã¾ã™ã€‚一部ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã—ã‹å«ã¾ãªã„ページã¯æ¤œç´¢çµæžœã«è¡¨ç¤ºã•ã‚Œãªã„ã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。"
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "検索"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "検索æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹é …ç›®ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %(version)s ã®å¤‰æ›´ç‚¹ &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %(version)s ã®å¤‰æ›´ç‚¹ï¼ˆã“ã®ãƒªã‚¹ãƒˆã¯è‡ªå‹•ç”Ÿæˆã•ã‚Œã¦ã„ã¾ã™ï¼‰"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "ライブラリã«é–¢ã™ã‚‹å¤‰æ›´"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API ã«é–¢ã™ã‚‹å¤‰æ›´"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "ãã®å¤šã®å¤‰æ›´"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.js	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "nl", "plural_expr": "(n != 1)", "messages": {"module, in ": "module", "Preparing search...": "Het zoeken wordt voorbereid", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Uw zoekopdracht leverde geen resultaten op.  Controleer of alle woordencorrect gespeld zijn en dat u genoeg categori\u00ebn hebt geselecteerd.", "Search finished, found %s page(s) matching the search query.": "Zoeken voltooid, %s pagina(s) gevonden.", ", in ": "", "Permalink to this headline": "Permanente link naar deze titel", "Searching": "Zoeken", "Permalink to this definition": "Permanente link naar deze definitie", "Hide Search Matches": "Zoekresultaten verbergen", "Search Results": "Zoekresultaten"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.po	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,603 @@
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-09-11 23:58+0200\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: nl <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d.%b.%Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Algemene index"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "Index"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Globale Module-index"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "modules"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "volgende"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "vorige"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Builtins"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Moduleniveau"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d. %B %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Module-index"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Zoekpagina"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Permanente link naar deze definitie"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Permanente link naar deze titel"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Release"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "Omgevingsvariabele; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Platform: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[afbeelding]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (geïntegreerde functie)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (in module %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (geïntegreerde variabele)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (in module %s)"
+
+#: sphinx/directives/desc.py:33
+#, fuzzy, python-format
+msgid "%s (built-in class)"
+msgstr "%s (geïntegreerde variabele)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (klasse in %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s methode)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s methode)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s statische methode)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statische methode)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s attribuut)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s attribuut)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C-functie)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C member)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C-macro)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C type)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C-variabele)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Veroorzaakt"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Variabele"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Returns"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Return type"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parameters"
+
+#: sphinx/directives/desc.py:423
+#, fuzzy, python-format
+msgid "%scommand line option; %s"
+msgstr "%scommandolijn optie; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Platformen: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (module)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Auteur van deze sectie: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Auteur van deze module: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Auteur: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Zie ook"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Let op!"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Pas op!"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Gevaar"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Fout"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Hint"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Belangrijk"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Notitie"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Zie Ook"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Tip"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Waarschuwing"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Nieuw in versie %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Veranderd in versie %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Verouderd sinds versie %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "module"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "trefwoord"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operator"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "object"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "foutmelding"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "statement"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "geïntegreerde functie"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Zoekresultaten verbergen"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "Zoeken"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Het zoeken wordt voorbereid"
+
+#: sphinx/static/searchtools.js:338
+#, fuzzy
+msgid "module, in "
+msgstr "module"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Zoekresultaten"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Uw zoekopdracht leverde geen resultaten op.  Controleer of alle "
+"woordencorrect gespeld zijn en dat u genoeg categoriën hebt geselecteerd."
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "Zoeken voltooid, %s pagina(s) gevonden."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Overzicht"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Indices en tabellen:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Volledige inhoudstafel"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "geeft alle secties en subsecties weer"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "zoeken in deze documentatie"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "sneltoegang naar alle modules"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "alle functies, klasses en begrippen"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Volledige index op een pagina"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Index pagineerd per letter"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "kan heel groot zijn"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navigatie"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Inhoudstafel"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Vorig onderwerp"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "Vorig hoofdstuk"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Volgend onderwerp"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "volgend hoofdstuk"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Deze Pagina"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Wijziging Voorstellen"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Broncode weergeven"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Snel zoeken"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Trefwoord opzoeken"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Go"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Geef de naam van een module, klasse of functie."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Zoeken in %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "Over deze documenten"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Zoeken"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Laatste aanpassing op %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Aangemaakt met <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Populairste modules:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Enkel modules weergeven die op deze platformen beschikbaar zijn"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Verouderd"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Zoeken %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Opgelet:</strong> U heeft een verouderde URL aangevraagd op deze "
+"server. Wij hebben probeerd u door te verwijzen naar de nieuwe locatie "
+"van deze pagina,  maar dat is misschien niet gelukt."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Hier kan u de documenten doorzoeken.  Geef enkele trefwoorden\n"
+"    in het veld hieronder en klik \"zoeken\".  Merk op dat de zoekfunctie"
+"\n"
+"    steeds naar alle woorden zoekt.  Pagina's die minder woorden bevatten"
+"\n"
+"    zullen niet tussen de resultaten verschijnen."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "zoeken"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Uw zoekopdracht leverde geen resultaten op."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Veranderingen in versie %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatisch genereerde lijst van veranderingen in versie %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Veranderingen in de bibliotheek"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Veranderingen in de C-API"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Andere veranderingen"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.js	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "pl", "plural_expr": "(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"module, in ": "modu\u0142", "Preparing search...": "Przygotowanie wyszukiwania...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Nie znaleziono \u017cadnych pasuj\u0105cych dokument\u00f3w. Upewnij si\u0119, \u017ce wszystkie s\u0142owa s\u0105 poprawnie wpisane i \u017ce wybra\u0142e\u015b wystarczaj\u0105c\u0105liczb\u0119 kategorii.", "Search finished, found %s page(s) matching the search query.": "Przeszukiwanie zako\u0144czone, znaleziono %s pasuj\u0105cych stron.", ", in ": "", "Permalink to this headline": "Sta\u0142y odno\u015bnik do tego nag\u0142\u00f3wka", "Searching": "Wyszukiwanie", "Permalink to this definition": "Sta\u0142y odno\u015bnik do tej definicji", "Hide Search Matches": "Ukryj wyniki wyszukiwania", "Search Results": "Wyniki wyszukiwania"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.po	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,600 @@
+
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-08-10 11:43+0000\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Michał Kandulski <Michal.Kandulski@poczta.onet.pl>\n"
+"Language-Team: \n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && "
+"(n%100<10 || n%100>=20) ? 1 : 2)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d %Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Indeks ogólny"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "indeks"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Indeks modułów"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "moduły"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "dalej"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "wstecz"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Wbudowane"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Poziom modułu"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%B %d %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Indeks"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Indeks modułów"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Wyszukiwanie"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Stały odnośnik do tej definicji"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Stały odnośnik do tego nagłówka"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Wydanie"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "zmienna środowiskowa; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Platforma: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[obrazek]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (funkcja wbudowana)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (w module %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (zmienna wbudowana)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (w module %s)"
+
+#: sphinx/directives/desc.py:33
+#, fuzzy, python-format
+msgid "%s (built-in class)"
+msgstr "%s (zmienna wbudowana)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (w klasie %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s metoda)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metoda)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s statyczna metoda)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statyczna metoda)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s atrybut)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atrybut)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (funkcja C)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (pole C)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (makro C)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (typ C)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (zmienna C)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Wyrzuca"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Zmienna"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Zwraca"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Typ zwracany"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parametry"
+
+#: sphinx/directives/desc.py:423
+#, fuzzy, python-format
+msgid "%scommand line option; %s"
+msgstr "%sopcja linii komend; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Platformy: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (moduł)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Autor rozdziału: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Autor modułu: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Zobacz także"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Uwaga"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Ostrożnie"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Niebezpieczeństwo"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "BÅ‚Ä…d"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Podpowiedź"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Ważne"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Uwaga"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Zobacz także"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Wskazówka"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Ostrzeżenie"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Nowe w wersji %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Zmienione w wersji %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Niezalecane od wersji %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "moduł"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "słowo kluczowe"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operator"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "obiekt"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "wyjÄ…tek"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "instrukcja"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "funkcja wbudowana"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Ukryj wyniki wyszukiwania"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "Wyszukiwanie"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Przygotowanie wyszukiwania..."
+
+#: sphinx/static/searchtools.js:338
+#, fuzzy
+msgid "module, in "
+msgstr "moduł"
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Wyniki wyszukiwania"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Nie znaleziono żadnych pasujących dokumentów. Upewnij się, że wszystkie "
+"słowa są poprawnie wpisane i że wybrałeś wystarczającąliczbę kategorii."
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "Przeszukiwanie zakończone, znaleziono %s pasujących stron."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "PrzeglÄ…d"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Indeksy i tablice:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Kompletny spis treści"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "wymień wszystkie rozdziały i podrozdziały"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "wyszukaj w dokumentacji"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "szybki dostęp do wszystkich modułów"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "wszystkie funkcje, klasy, terminy"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Indeks &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Cały indeks na jednej stronie"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Strony indeksu alfabetycznie"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "może być ogromny"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Nawigacja"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Spis treści"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Poprzedni temat"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "poprzedni rozdział"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Następny temat"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "następny rozdział"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Ta strona"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Zasugeruj zmianÄ™"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Pokaż źródło"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Szybkie wyszukiwanie"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Szukanie wg słowa kluczowego"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Szukaj"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Wprowadź nazwę modułu, klasy lub funkcji."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Szukaj pośród %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "O tych dokumentach"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Szukaj"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Ostatnia modyfikacja %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Utworzone przy pomocy <a href=\"http://sphinx.pocoo.org/\">Sphinx</a>'a "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Najbardziej popularne moduły:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Pokaż moduły dostępne tylko na tych platformach"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Niezalecane"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Przeszukaj %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Uwaga:</strong> Zażądano przedawnionego URL'a z tego serwera. "
+"Nastąpiła próba przekierowania do nowej lokalizacji, ale może ona być "
+"niewłaściwa."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"Stąd możesz przeszukać dokumentację. Wprowadź szukane\n"
+"    słowa w poniższym okienku i kliknij \"Szukaj\". Zwróć uwagę, że\n"
+"    funkcja szukająca będzie automatycznie szukała wszystkich słów.     "
+"Strony nie zawierające wszystkich słów nie znajdą się na wynikowej     "
+"liście."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "Szukaj"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Nie znaleziono żadnych pasujących stron."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Zmiany w wesji %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatycznie wygenerowana lista zmian w wersji %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Zmiany w bibliotekach"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Zmiany w C API"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Inne zmiany"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "pt_BR", "plural_expr": "(n > 1)", "messages": {"module, in ": "m\u00f3dulo, em ", "Preparing search...": "Preparando pesquisa...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Sua pesquisa n\u00e3o encontrou nenhum documento. Por favor assegure-se de que todas as palavras foram digitadas corretamente e de que voc\u00ea tenha selecionado o m\u00ednimo de categorias.", "Search finished, found %s page(s) matching the search query.": "Pesquisa finalizada, foram encontrada(s) %s p\u00e1gina(s) que conferem com o crit\u00e9rio de pesquisa.", ", in ": ", em ", "Permalink to this headline": "Link permanente para este t\u00edtulo", "Searching": "Pesquisando", "Permalink to this definition": "Link permanente para esta defini\u00e7\u00e3o", "Hide Search Matches": "Esconder Resultados da Pesquisa", "Search Results": "Resultados da Pesquisa"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,606 @@
+# Portuguese (Brazil) translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <roger.demetrescu@gmail.com>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: roger.demetrescu@gmail.com\n"
+"POT-Creation-Date: 2008-11-09 19:46+0100\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Roger Demetrescu <roger.demetrescu@gmail.com>\n"
+"Language-Team: pt_BR <roger.demetrescu@gmail.com>\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d/%m/%Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Ãndice Geral"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "índice"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Ãndice Global de Módulos"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "módulos"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "próximo"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "anterior"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr " (em "
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Internos"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Módulo"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d/%m/%Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Ãndice"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Ãndice do Módulo"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Página de Pesquisa"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Link permanente para esta definição"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Link permanente para este título"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Versão"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "váriavel de ambiente; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Plataforma: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[imagem]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (função interna)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (no módulo %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variável interna)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (no módulo %s)"
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (classe interna)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (classe em %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (método %s.%s)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (método %s)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (método estático %s.%s)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (método estático %s)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (atributo %s.%s)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (atributo %s)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (função C)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (membro C)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (macro C)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (tipo C)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (variável C)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Levanta"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Variável"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Retorna"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Tipo de retorno"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parâmetros"
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%sopção de linha de comando; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Plataformas: "
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (módulo)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Autor da seção: "
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Autor do módulo: "
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Veja também"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr "Por fazer"
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr "(A entrada original está localizada em %s, linha %d e pode ser encontrada "
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr "aqui"
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Atenção"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Cuidado"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Perigo"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Erro"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Dica"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Importante"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Nota"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Veja Também"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Dica"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Aviso"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Novo na versão %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Alterado na versão %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Obsoleto desde a versão %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "módulo"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "palavra-chave"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operador"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "objeto"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "exceção"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "comando"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "função interna"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Esconder Resultados da Pesquisa"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "Pesquisando"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Preparando pesquisa..."
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr "módulo, em "
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ", em "
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Resultados da Pesquisa"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Sua pesquisa não encontrou nenhum documento. Por favor assegure-se de que"
+" todas as palavras foram digitadas corretamente e de que você tenha "
+"selecionado o mínimo de categorias."
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr ""
+"Pesquisa finalizada, foram encontrada(s) %s página(s) que conferem com o "
+"critério de pesquisa."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Visão geral"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Ãndices e tabelas:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Tabela de Conteúdo Completa"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "Lista todas seções e subseções"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "Pesquisar esta documentação"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "acesso rápido para todos os módulos"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "todas funções, classes, termos"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Ãndice &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Ãndice completo em uma página"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Paginas de índice por letra"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "pode ser enorme"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navegação"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Tabela de Conteúdo"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Tópico anterior"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "capítulo anterior"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Próximo tópico"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "próximo capítulo"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Esta Página"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Sugerir Alteração"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Exibir Fonte"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Pesquisa rápida"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Pesquisa de palavras-chave"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Ir"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Informe o nome de um módulo, classe ou função."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Pesquisar dentro de %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "Sobre estes documentos"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "Pesquisar"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Copyright %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Última atualização em %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Criado com <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Módulos mais populares:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Exibir somente módulos disponíveis nestas plataformas"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Obsoleto"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Pesquisar em %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Nota:</strong> Você requisitou uma URL desatualizada deste "
+"servidor. Tentamos redirecioná-lo para um novo endereço desta página, "
+"porém é possível que o mesmo não seja o correto."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"A partir daqui você pode pesquisar estes documentos. Preencha suas \n"
+"    palavras de pesquisa na caixa abaixo e clique em  \"pesquisar\". "
+"Observe que a função de pesquisa\n"
+"    irá pesquisar automaticamente por todas as palavras.\n"
+"    Páginas contendo menos palavras não irão aparecer na lista de "
+"resultado."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "pesquisar"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Sua pesquisa não encontrou nenhum resultado."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Alterações na Versão%(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Lista de alterações na versão %(version)s gerada automaticamente"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Alterações na biblioteca"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Alterações na API C"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Outras alterações"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.js	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "sl", "plural_expr": "0", "messages": {"module, in ": "modul, v ", "Preparing search...": "Pripravljam iskanje...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Za va\u0161e iskanje ni rezultatov. Prosimo preglejte ali so vse besede pravilno \u010drkovane in ali ste izbrali dovolj kategorij.", "Search finished, found %s page(s) matching the search query.": "Iskanje kon\u010dano, najdeno %s strani, ki ustrezajo iskalnemu nizu.", ", in ": ", v ", "Permalink to this headline": "Povezava na naslov", "Searching": "I\u0161\u010dem", "Permalink to this definition": "Povezava na to definicijo", "Hide Search Matches": "Skrij Resultate Iskanja", "Search Results": "Rezultati Iskanja"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.po	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,597 @@
+
+msgid ""
+msgstr ""
+"Project-Id-Version:  Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-09-11 23:58+0200\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Rok Garbas <rok.garbas@gmail.com>\n"
+"Language-Team: Rok Garbas <rok.garbas@gmail.com>\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b, %Y"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "Splošni abecedni seznam"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "abecedni seznam"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr "Splošen Seznam Modulov"
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "Moduli"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "naprej"
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "nazaj"
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr "(v "
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr "Vgrajeni deli"
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr "Nivo modula"
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%d %B, %Y"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "Abecedni seznam"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "Seznam modulov"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "Iskalna stran"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr "Povezava na to definicijo"
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr "Povezava na naslov"
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "Izdaja"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "globalna spremenljivka; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python Enhancement Proposals!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "Platforma: %s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[slika]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (vgrajene funkcije)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (v modulu %s)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (vgrajene spremenljivke)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (v modulu %s)"
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (vgrajen razred)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (razred v %s)"
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s metoda)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metoda)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s statiÄna metoda)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statiÄna metoda)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s atribut)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atribut)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C funkcija)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C Älan)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C makro)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C tip)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C spremenljivka)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr "Javi"
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "Spremenljivka"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "Vrne"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "Vrne tip"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "Parametri"
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%sopcija komandne linije; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "Platforma:"
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modul)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Avtor sekcije:"
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "Avtor modula:"
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "Avtor:"
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr "Poglej tudi"
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr "Naredi"
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr "(Originalen vnos se nahajana v %s, vrstica %d in jo je moÄ poiskati "
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr "tukaj"
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "Pozor"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "Previdno"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "Navarno"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "Napaka"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "Nasvet"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "Pomembno"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "Opomba"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr "Poglej Tudi"
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "Nasvet"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "Opozorilo"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "Novo v verziji %s"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "Spemenjeno v verziji %s"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Zastarelo od verzije %s"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "modul"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "klluÄna beseda"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "operator"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "objekt"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "izjema"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr "izjava"
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "vgrajene funkcije"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr "Skrij Resultate Iskanja"
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "IÅ¡Äem"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "Pripravljam iskanje..."
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr "modul, v "
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ", v "
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "Rezultati Iskanja"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+"Za vaše iskanje ni rezultatov. Prosimo preglejte ali so vse besede "
+"pravilno Ärkovane in ali ste izbrali dovolj kategorij."
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr "Iskanje konÄano, najdeno %s strani, ki ustrezajo iskalnemu nizu."
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr "Pregled"
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr "Kazalo in tabele:"
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr "Popoln Seznam Vsebine"
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr "prikazi vse sekcije in podsekcije"
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr "isÄi po dokumentaciji"
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr "hiter dostop do vseh modulov"
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr "vse funkcije, rezredi, termini"
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Seznam &ndash; %(key)s"
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr "Poln indeks na eni strani"
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr "Indeksiraj strani po Ärki"
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr "lahko je veliko"
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "Navigacija"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "Seznam Vsebine"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "Prejšnja tema"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "prejšnje poglavje"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "Naslednja tema"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "naslednje poglavje"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "Ta stran"
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr "Predlagaj spremembo"
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "Prikaži izvorno kodo"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "Hitro iskanje"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "Iskanje po kljuÄniih besedah"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr "Potrdi"
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "Vnesi ime mudla, razreda ali funkcije."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "IÅ¡Äi med %(docstitle)s"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr "O teh dokumentih"
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "IÅ¡Äi"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "Vse pravice pridržane"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr "&copy; <a href=\"%(path)s\">Vse pravice pridržane</a> %(copyright)s."
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr "&copy; Vse pravice pridržane %(copyright)s."
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "ZadnjiÄ posodobljeno na %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+"Narejeno s <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr "Najbolj popularni moduli:"
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr "Prikaži module na razpolago na platformah"
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "Zastarelo"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "IÅ¡Äi %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+"<strong>Opomba:</strong> Vaš zahtevek za URL s tega streznika je "
+"zastaral. Poskušali smo vas preusmeriti na novo lokacijo, vendar utegne "
+"biti napaÄna."
+
+#: sphinx/templates/search.html:7
+#, fuzzy
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+"O tukaj lahko isÄete dokumente. Vnesite iskalni\n"
+"    niz v polje spodaj in pritisnite \"iÅ¡Äi\". Sproženo iskanje\n"
+"    bo iskalo po vseh besedah v iskalnem nizu. Strani, ki ne\n"
+"    vsebujejo vseh besed ne bodo prikazane na seznamu rezultatov."
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "iÅ¡Äi"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr "Vaše iskanje ni imelo nobenega zadetka."
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr "Spremembe v Verziji %(version)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr "%(filename)s &mdash; %(docstitle)s"
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Avtomatsko generiran seznam sprememb v verziji %(version)s"
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Spremembe knjižnice"
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API spremembe"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Ostale spremembe"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sphinx.pot	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,589 @@
+# Translations template for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-11-27 18:39+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr ""
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr ""
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr ""
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr ""
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr ""
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr ""
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr ""
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr ""
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr ""
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr ""
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr ""
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr ""
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr ""
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr ""
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr ""
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr ""
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr ""
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr ""
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr ""
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr ""
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr ""
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr ""
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr ""
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr ""
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr ""
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr ""
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr ""
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr ""
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr ""
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr ""
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr ""
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr ""
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr ""
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr ""
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr ""
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr ""
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr ""
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr ""
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr ""
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr ""
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr ""
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr ""
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr ""
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr ""
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr ""
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr ""
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr ""
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr ""
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr ""
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr ""
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr ""
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr ""
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr ""
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr ""
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr ""
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr ""
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr ""
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr ""
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr ""
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr ""
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+
+#: sphinx/templates/search.html:7
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr ""
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr ""
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1 @@
+Documentation.addTranslations({"locale": "zh_TW", "plural_expr": "0", "messages": {"module, in ": "", "Preparing search...": "\u6e96\u5099\u641c\u5c0b...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "", "Search finished, found %s page(s) matching the search query.": "", ", in ": "", "Permalink to this headline": "", "Searching": "\u641c\u5c0b\u4e2d", "Permalink to this definition": "", "Hide Search Matches": "", "Search Results": "\u641c\u5c0b\u7d50\u679c"}});
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,598 @@
+# Chinese (Taiwan) translations for Sphinx.
+# Copyright (C) 2008 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# Fred Lin <gasolin@gmail.com>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 0.5\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2008-11-09 19:46+0100\n"
+"PO-Revision-Date: 2008-11-27 18:40+0100\n"
+"Last-Translator: Fred Lin <gasolin@gmail.com>\n"
+"Language-Team: tw <LL@li.org>\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.4\n"
+
+#: sphinx/builder.py:408
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%Y 年 %m 月 %d 日"
+
+#: sphinx/builder.py:427 sphinx/templates/defindex.html:21
+msgid "General Index"
+msgstr "總索引"
+
+#: sphinx/builder.py:427
+msgid "index"
+msgstr "索引"
+
+#: sphinx/builder.py:429 sphinx/htmlhelp.py:156
+#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2
+#: sphinx/templates/modindex.html:13
+msgid "Global Module Index"
+msgstr ""
+
+#: sphinx/builder.py:429
+msgid "modules"
+msgstr "模組"
+
+#: sphinx/builder.py:466
+msgid "next"
+msgstr "下一é "
+
+#: sphinx/builder.py:473
+msgid "previous"
+msgstr "上一é "
+
+#: sphinx/builder.py:1054
+msgid " (in "
+msgstr ""
+
+#: sphinx/builder.py:1129
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builder.py:1131
+msgid "Module level"
+msgstr ""
+
+#: sphinx/environment.py:102 sphinx/latexwriter.py:169
+#, python-format
+msgid "%B %d, %Y"
+msgstr "%Y 年 %m 月 %d 日"
+
+#: sphinx/environment.py:291 sphinx/latexwriter.py:175
+#: sphinx/templates/genindex-single.html:2
+#: sphinx/templates/genindex-split.html:2
+#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2
+#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48
+#: sphinx/templates/layout.html:130
+msgid "Index"
+msgstr "索引"
+
+#: sphinx/environment.py:292 sphinx/latexwriter.py:174
+msgid "Module Index"
+msgstr "模組索引"
+
+#: sphinx/environment.py:293 sphinx/templates/defindex.html:16
+msgid "Search Page"
+msgstr "æœå°‹é é¢"
+
+#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145
+msgid "Permalink to this definition"
+msgstr ""
+
+#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139
+msgid "Permalink to this headline"
+msgstr ""
+
+#: sphinx/latexwriter.py:172
+msgid "Release"
+msgstr "釋出"
+
+#: sphinx/roles.py:53 sphinx/directives/desc.py:537
+#, python-format
+msgid "environment variable; %s"
+msgstr "環境變數; %s"
+
+#: sphinx/roles.py:60
+#, python-format
+msgid "Python Enhancement Proposals!PEP %s"
+msgstr "Python 建議文件!PEP %s"
+
+#: sphinx/textwriter.py:166
+#, python-format
+msgid "Platform: %s"
+msgstr "å¹³å°ï¼š%s"
+
+#: sphinx/textwriter.py:422
+msgid "[image]"
+msgstr "[圖片]"
+
+#: sphinx/directives/desc.py:25
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (內建函å¼)"
+
+#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42
+#: sphinx/directives/desc.py:54
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (在 %s 模組中)"
+
+#: sphinx/directives/desc.py:29
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (內建變數)"
+
+#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s() (在 %s 模組中)"
+
+#: sphinx/directives/desc.py:33
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (內建類別)"
+
+#: sphinx/directives/desc.py:34
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/directives/desc.py:46
+#, python-format
+msgid "%s() (%s.%s method)"
+msgstr "%s() (%s.%s 方法)"
+
+#: sphinx/directives/desc.py:48
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s 方法)"
+
+#: sphinx/directives/desc.py:58
+#, python-format
+msgid "%s() (%s.%s static method)"
+msgstr "%s() (%s.%s éœæ…‹æ–¹æ³•)"
+
+#: sphinx/directives/desc.py:60
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s éœæ…‹æ–¹æ³•)"
+
+#: sphinx/directives/desc.py:70
+#, python-format
+msgid "%s (%s.%s attribute)"
+msgstr "%s (%s.%s 屬性)"
+
+#: sphinx/directives/desc.py:72
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s 屬性)"
+
+#: sphinx/directives/desc.py:74
+#, python-format
+msgid "%s (C function)"
+msgstr "%s (C 函å¼)"
+
+#: sphinx/directives/desc.py:76
+#, python-format
+msgid "%s (C member)"
+msgstr "%s (C æˆå“¡)"
+
+#: sphinx/directives/desc.py:78
+#, python-format
+msgid "%s (C macro)"
+msgstr "%s (C 巨集)"
+
+#: sphinx/directives/desc.py:80
+#, python-format
+msgid "%s (C type)"
+msgstr "%s (C 類別)"
+
+#: sphinx/directives/desc.py:82
+#, python-format
+msgid "%s (C variable)"
+msgstr "%s (C 變數)"
+
+#: sphinx/directives/desc.py:100
+msgid "Raises"
+msgstr ""
+
+#: sphinx/directives/desc.py:104
+msgid "Variable"
+msgstr "變數"
+
+#: sphinx/directives/desc.py:107
+msgid "Returns"
+msgstr "返回"
+
+#: sphinx/directives/desc.py:116
+msgid "Return type"
+msgstr "返回類別"
+
+#: sphinx/directives/desc.py:143
+msgid "Parameters"
+msgstr "åƒæ•¸"
+
+#: sphinx/directives/desc.py:423
+#, python-format
+msgid "%scommand line option; %s"
+msgstr "%s命令列é¸é …; %s"
+
+#: sphinx/directives/other.py:101
+msgid "Platforms: "
+msgstr "å¹³å°"
+
+#: sphinx/directives/other.py:106
+#, python-format
+msgid "%s (module)"
+msgstr "%s (模組)"
+
+#: sphinx/directives/other.py:146
+msgid "Section author: "
+msgstr "Section 作者:"
+
+#: sphinx/directives/other.py:148
+msgid "Module author: "
+msgstr "模組作者:"
+
+#: sphinx/directives/other.py:150
+msgid "Author: "
+msgstr "作者:"
+
+#: sphinx/directives/other.py:246
+msgid "See also"
+msgstr ""
+
+#: sphinx/ext/todo.py:31
+msgid "Todo"
+msgstr "待辦"
+
+#: sphinx/ext/todo.py:75
+#, python-format
+msgid "(The original entry is located in %s, line %d and can be found "
+msgstr ""
+
+#: sphinx/ext/todo.py:81
+msgid "here"
+msgstr ""
+
+#: sphinx/locale/__init__.py:15
+msgid "Attention"
+msgstr "注æ„"
+
+#: sphinx/locale/__init__.py:16
+msgid "Caution"
+msgstr "警示"
+
+#: sphinx/locale/__init__.py:17
+msgid "Danger"
+msgstr "å±éšª"
+
+#: sphinx/locale/__init__.py:18
+msgid "Error"
+msgstr "錯誤"
+
+#: sphinx/locale/__init__.py:19
+msgid "Hint"
+msgstr "æ示"
+
+#: sphinx/locale/__init__.py:20
+msgid "Important"
+msgstr "é‡è¦"
+
+#: sphinx/locale/__init__.py:21
+msgid "Note"
+msgstr "註解"
+
+#: sphinx/locale/__init__.py:22
+msgid "See Also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:23
+msgid "Tip"
+msgstr "å°æŠ€å·§"
+
+#: sphinx/locale/__init__.py:24
+msgid "Warning"
+msgstr "警告"
+
+#: sphinx/locale/__init__.py:28
+#, python-format
+msgid "New in version %s"
+msgstr "%s 版新功能"
+
+#: sphinx/locale/__init__.py:29
+#, python-format
+msgid "Changed in version %s"
+msgstr "在 %s 版改變"
+
+#: sphinx/locale/__init__.py:30
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "%s 版後已移除"
+
+#: sphinx/locale/__init__.py:34
+msgid "module"
+msgstr "模組"
+
+#: sphinx/locale/__init__.py:35
+msgid "keyword"
+msgstr "é—œéµå­—"
+
+#: sphinx/locale/__init__.py:36
+msgid "operator"
+msgstr "é‹ç®—å­"
+
+#: sphinx/locale/__init__.py:37
+msgid "object"
+msgstr "物件"
+
+#: sphinx/locale/__init__.py:38
+msgid "exception"
+msgstr "例外"
+
+#: sphinx/locale/__init__.py:39
+msgid "statement"
+msgstr ""
+
+#: sphinx/locale/__init__.py:40
+msgid "built-in function"
+msgstr "內建函å¼"
+
+#: sphinx/static/doctools.js:174
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/static/searchtools.js:274
+msgid "Searching"
+msgstr "æœå°‹ä¸­"
+
+#: sphinx/static/searchtools.js:279
+msgid "Preparing search..."
+msgstr "準備æœå°‹..."
+
+#: sphinx/static/searchtools.js:338
+msgid "module, in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:347
+msgid ", in "
+msgstr ""
+
+#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18
+msgid "Search Results"
+msgstr "æœå°‹çµæžœ"
+
+#: sphinx/static/searchtools.js:449
+msgid ""
+"Your search did not match any documents. Please make sure that all words "
+"are spelled correctly and that you've selected enough categories."
+msgstr ""
+
+#: sphinx/static/searchtools.js:451
+#, python-format
+msgid "Search finished, found %s page(s) matching the search query."
+msgstr ""
+
+#: sphinx/templates/defindex.html:2
+msgid "Overview"
+msgstr ""
+
+#: sphinx/templates/defindex.html:11
+msgid "Indices and tables:"
+msgstr ""
+
+#: sphinx/templates/defindex.html:14
+msgid "Complete Table of Contents"
+msgstr ""
+
+#: sphinx/templates/defindex.html:15
+msgid "lists all sections and subsections"
+msgstr ""
+
+#: sphinx/templates/defindex.html:17
+msgid "search this documentation"
+msgstr ""
+
+#: sphinx/templates/defindex.html:20
+msgid "quick access to all modules"
+msgstr ""
+
+#: sphinx/templates/defindex.html:22
+msgid "all functions, classes, terms"
+msgstr ""
+
+#: sphinx/templates/genindex-single.html:5
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/templates/genindex-single.html:44
+#: sphinx/templates/genindex-split.html:14
+#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54
+msgid "Full index on one page"
+msgstr ""
+
+#: sphinx/templates/genindex-split.html:7
+msgid "Index pages by letter"
+msgstr ""
+
+#: sphinx/templates/genindex-split.html:15
+msgid "can be huge"
+msgstr ""
+
+#: sphinx/templates/layout.html:9
+msgid "Navigation"
+msgstr "ç€è¦½"
+
+#: sphinx/templates/layout.html:40
+msgid "Table Of Contents"
+msgstr "內容目錄"
+
+#: sphinx/templates/layout.html:46
+msgid "Previous topic"
+msgstr "上一個主題"
+
+#: sphinx/templates/layout.html:47
+msgid "previous chapter"
+msgstr "上一章"
+
+#: sphinx/templates/layout.html:50
+msgid "Next topic"
+msgstr "下一個主題"
+
+#: sphinx/templates/layout.html:51
+msgid "next chapter"
+msgstr "下一章"
+
+#: sphinx/templates/layout.html:55
+msgid "This Page"
+msgstr "本é "
+
+#: sphinx/templates/layout.html:59
+msgid "Suggest Change"
+msgstr ""
+
+#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62
+msgid "Show Source"
+msgstr "顯示原始碼"
+
+#: sphinx/templates/layout.html:71
+msgid "Quick search"
+msgstr "快速æœå°‹"
+
+#: sphinx/templates/layout.html:71
+msgid "Keyword search"
+msgstr "é—œéµå­—æœå°‹"
+
+#: sphinx/templates/layout.html:73
+msgid "Go"
+msgstr ""
+
+#: sphinx/templates/layout.html:78
+msgid "Enter a module, class or function name."
+msgstr "輸入一個模組ã€é¡žåˆ¥ã€æˆ–是函å¼å稱."
+
+#: sphinx/templates/layout.html:119
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "在 %(docstitle)s 中æœå°‹"
+
+#: sphinx/templates/layout.html:128
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2
+#: sphinx/templates/search.html:5
+msgid "Search"
+msgstr "æœå°‹"
+
+#: sphinx/templates/layout.html:133
+msgid "Copyright"
+msgstr "版權所有"
+
+#: sphinx/templates/layout.html:178
+#, python-format
+msgid "&copy; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
+msgstr ""
+
+#: sphinx/templates/layout.html:180
+#, python-format
+msgid "&copy; Copyright %(copyright)s."
+msgstr ""
+
+#: sphinx/templates/layout.html:183
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "最後更新日期是 %(last_updated)s."
+
+#: sphinx/templates/layout.html:186
+#, python-format
+msgid ""
+"Created using <a href=\"http://sphinx.pocoo.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/templates/modindex.html:15
+msgid "Most popular modules:"
+msgstr ""
+
+#: sphinx/templates/modindex.html:24
+msgid "Show modules only available on these platforms"
+msgstr ""
+
+#: sphinx/templates/modindex.html:56
+msgid "Deprecated"
+msgstr "已移除"
+
+#: sphinx/templates/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "æœå°‹ %(docstitle)s"
+
+#: sphinx/templates/page.html:8
+msgid ""
+"<strong>Note:</strong> You requested an out-of-date URL from this server."
+" We've tried to redirect you to the new location of this page, but it may"
+" not be the right one."
+msgstr ""
+
+#: sphinx/templates/search.html:7
+msgid ""
+"From here you can search these documents. Enter your search\n"
+"    words into the box below and click \"search\". Note that the search\n"
+"    function will automatically search for all of the words. Pages\n"
+"    containing fewer words won't appear in the result list."
+msgstr ""
+
+#: sphinx/templates/search.html:14
+msgid "search"
+msgstr "æœå°‹"
+
+#: sphinx/templates/search.html:20
+msgid "Your search did not match any results."
+msgstr ""
+
+#: sphinx/templates/changes/frameset.html:5
+#: sphinx/templates/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &mdash; %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &mdash; %(docstitle)s"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/templates/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API 改變"
+
+#: sphinx/templates/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "其他改變:"
+
+#~ msgid ""
+#~ "From here you can search these documents. Enter your search\n"
+#~ "    words into the box below and"
+#~ " click \"search\". Note that the "
+#~ "search\n"
+#~ "    function will automatically search for all of the words. Pages\n"
+#~ "    containing less words won't appear in the result list."
+#~ msgstr ""
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/quickstart.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,533 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.quickstart
+    ~~~~~~~~~~~~~~~~~
+
+    Quickly setup documentation source to work with Sphinx.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import sys, os, time
+from os import path
+
+TERM_ENCODING = getattr(sys.stdin, 'encoding', None)
+
+from sphinx.util import make_filename
+from sphinx.util.console import purple, bold, red, turquoise, nocolor, color_terminal
+from sphinx.util.texescape import tex_escape_map
+
+
+PROMPT_PREFIX = '> '
+
+QUICKSTART_CONF = '''\
+# -*- coding: utf-8 -*-
+#
+# %(project)s documentation build configuration file, created by
+# sphinx-quickstart on %(now)s.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# The contents of this file are pickled, so don't put values in the namespace
+# that aren't pickleable (module imports are okay, they're removed automatically).
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If your extensions are in another directory, add it here. If the directory
+# is relative to the documentation root, use os.path.abspath to make it
+# absolute, like shown here.
+#sys.path.append(os.path.abspath('.'))
+
+# General configuration
+# ---------------------
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = [%(extensions)s]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['%(dot)stemplates']
+
+# The suffix of source filenames.
+source_suffix = '%(suffix)s'
+
+# The encoding of source files.
+#source_encoding = 'utf-8'
+
+# The master toctree document.
+master_doc = '%(master)s'
+
+# General information about the project.
+project = u'%(project)s'
+copyright = u'%(copyright)s'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '%(version)s'
+# The full version, including alpha/beta/rc tags.
+release = '%(release)s'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%%B %%d, %%Y'
+
+# List of documents that shouldn't be included in the build.
+#unused_docs = []
+
+# List of directories, relative to source directory, that shouldn't be searched
+# for source files.
+exclude_trees = [%(exclude_trees)s]
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+
+# Options for HTML output
+# -----------------------
+
+# The style sheet to use for HTML and HTML Help pages. A file of that name
+# must exist either in Sphinx' static/ path, or in one of the custom paths
+# given in html_static_path.
+html_style = 'default.css'
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['%(dot)sstatic']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%%b %%d, %%Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_use_modindex = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, the reST sources are included in the HTML build as _sources/<name>.
+#html_copy_source = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = ''
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = '%(project_fn)sdoc'
+
+
+# Options for LaTeX output
+# ------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, document class [howto/manual]).
+latex_documents = [
+  ('%(master)s', '%(project_fn)s.tex', ur'%(project_doc_texescaped)s',
+   ur'%(author_texescaped)s', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_use_modindex = True
+'''
+
+INTERSPHINX_CONFIG = '''
+
+# Example configuration for intersphinx: refer to the Python standard library.
+intersphinx_mapping = {'http://docs.python.org/dev': None}
+'''
+
+MASTER_FILE = '''\
+.. %(project)s documentation master file, created by sphinx-quickstart on %(now)s.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Welcome to %(project)s's documentation!
+===========%(underline)s=================
+
+Contents:
+
+.. toctree::
+   :maxdepth: 2
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
+'''
+
+MAKEFILE = '''\
+# 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 %(rbuilddir)s/doctrees $(PAPEROPT_$(PAPER)) \
+$(SPHINXOPTS) %(rsrcdir)s
+
+.PHONY: help clean html web pickle htmlhelp latex changes linkcheck
+
+help:
+\t@echo "Please use \\`make <target>' where <target> is one of"
+\t@echo "  html      to make standalone HTML files"
+\t@echo "  pickle    to make pickle files"
+\t@echo "  json      to make JSON files"
+\t@echo "  htmlhelp  to make HTML files and a HTML help project"
+\t@echo "  latex     to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+\t@echo "  changes   to make an overview over all changed/added/deprecated items"
+\t@echo "  linkcheck to check all external links for integrity"
+
+clean:
+\t-rm -rf %(rbuilddir)s/*
+
+html:
+\tmkdir -p %(rbuilddir)s/html %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) %(rbuilddir)s/html
+\t@echo
+\t@echo "Build finished. The HTML pages are in %(rbuilddir)s/html."
+
+pickle:
+\tmkdir -p %(rbuilddir)s/pickle %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) %(rbuilddir)s/pickle
+\t@echo
+\t@echo "Build finished; now you can process the pickle files."
+
+web: pickle
+
+json:
+\tmkdir -p %(rbuilddir)s/json %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) %(rbuilddir)s/json
+\t@echo
+\t@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+\tmkdir -p %(rbuilddir)s/htmlhelp %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) %(rbuilddir)s/htmlhelp
+\t@echo
+\t@echo "Build finished; now you can run HTML Help Workshop with the" \\
+\t      ".hhp project file in %(rbuilddir)s/htmlhelp."
+
+latex:
+\tmkdir -p %(rbuilddir)s/latex %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) %(rbuilddir)s/latex
+\t@echo
+\t@echo "Build finished; the LaTeX files are in %(rbuilddir)s/latex."
+\t@echo "Run \\`make all-pdf' or \\`make all-ps' in that directory to" \\
+\t      "run these through (pdf)latex."
+
+changes:
+\tmkdir -p %(rbuilddir)s/changes %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) %(rbuilddir)s/changes
+\t@echo
+\t@echo "The overview file is in %(rbuilddir)s/changes."
+
+linkcheck:
+\tmkdir -p %(rbuilddir)s/linkcheck %(rbuilddir)s/doctrees
+\t$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) %(rbuilddir)s/linkcheck
+\t@echo
+\t@echo "Link check complete; look for any errors in the above output " \\
+\t      "or in %(rbuilddir)s/linkcheck/output.txt."
+'''
+
+
+def mkdir_p(dir):
+    if path.isdir(dir):
+        return
+    os.makedirs(dir)
+
+
+def is_path(x):
+    """Please enter a valid path name."""
+    return path.isdir(x) or not path.exists(x)
+
+def nonempty(x):
+    """Please enter some text."""
+    return len(x)
+
+def choice(*l):
+    def val(x):
+        return x in l
+    val.__doc__ = 'Please enter one of %s.' % ', '.join(l)
+    return val
+
+def boolean(x):
+    """Please enter either 'y' or 'n'."""
+    return x.upper() in ('Y', 'YES', 'N', 'NO')
+
+def suffix(x):
+    """Please enter a file suffix, e.g. '.rst' or '.txt'."""
+    return x[0:1] == '.' and len(x) > 1
+
+def ok(x):
+    return True
+
+
+def do_prompt(d, key, text, default=None, validator=nonempty):
+    while True:
+        if default:
+            prompt = purple(PROMPT_PREFIX + '%s [%s]: ' % (text, default))
+        else:
+            prompt = purple(PROMPT_PREFIX + text + ': ')
+        x = raw_input(prompt)
+        if default and not x:
+            x = default
+        if x.decode('ascii', 'replace').encode('ascii', 'replace') != x:
+            if TERM_ENCODING:
+                x = x.decode(TERM_ENCODING)
+            else:
+                print turquoise('* Note: non-ASCII characters entered and terminal '
+                                'encoding unknown -- assuming UTF-8 or Latin-1.')
+                try:
+                    x = x.decode('utf-8')
+                except UnicodeDecodeError:
+                    x = x.decode('latin1')
+        if validator and not validator(x):
+            print red('* ' + validator.__doc__)
+            continue
+        break
+    d[key] = x
+
+
+def inner_main(args):
+    d = {}
+
+    if not sys.stdout.isatty() or not color_terminal():
+        nocolor()
+
+    print bold('Welcome to the Sphinx quickstart utility.')
+    print '''
+Please enter values for the following settings (just press Enter to
+accept a default value, if one is given in brackets).'''
+
+    print '''
+Enter the root path for documentation.'''
+    do_prompt(d, 'path', 'Root path for the documentation', '.', is_path)
+
+    while path.isfile(path.join(d['path'], 'conf.py')) or \
+          path.isfile(path.join(d['path'], 'source', 'conf.py')):
+        print
+        print bold('Error: an existing conf.py has been found in the '
+                   'selected root path.')
+        print 'sphinx-quickstart will not overwrite existing Sphinx projects.'
+        print
+        do_prompt(d, 'path', 'Please enter a new root path (or just Enter to exit)',
+                  '', is_path)
+        if not d['path']:
+            sys.exit(1)
+
+    print '''
+You have two options for placing the build directory for Sphinx output.
+Either, you use a directory ".build" within the root path, or you separate
+"source" and "build" directories within the root path.'''
+    do_prompt(d, 'sep', 'Separate source and build directories (y/N)', 'n',
+              boolean)
+    print '''
+Inside the root directory, two more directories will be created; ".templates"
+for custom HTML templates and ".static" for custom stylesheets and other
+static files. Since the leading dot may be inconvenient for Windows users,
+you can enter another prefix (such as "_") to replace the dot.'''
+    do_prompt(d, 'dot', 'Name prefix for templates and static dir', '.', ok)
+
+    print '''
+The project name will occur in several places in the built documentation.'''
+    do_prompt(d, 'project', 'Project name')
+    do_prompt(d, 'author', 'Author name(s)')
+    print '''
+Sphinx has the notion of a "version" and a "release" for the
+software. Each version can have multiple releases. For example, for
+Python the version is something like 2.5 or 3.0, while the release is
+something like 2.5.1 or 3.0a1.  If you don't need this dual structure,
+just set both to the same value.'''
+    do_prompt(d, 'version', 'Project version')
+    do_prompt(d, 'release', 'Project release', d['version'])
+    print '''
+The file name suffix for source files. Commonly, this is either ".txt"
+or ".rst".  Only files with this suffix are considered documents.'''
+    do_prompt(d, 'suffix', 'Source file suffix', '.rst', suffix)
+    print '''
+One document is special in that it is considered the top node of the
+"contents tree", that is, it is the root of the hierarchical structure
+of the documents. Normally, this is "index", but if your "index"
+document is a custom template, you can also set this to another filename.'''
+    do_prompt(d, 'master', 'Name of your master document (without suffix)',
+              'index')
+    print '''
+Please indicate if you want to use one of the following Sphinx extensions:'''
+    do_prompt(d, 'ext_autodoc', 'autodoc: automatically insert docstrings '
+              'from modules (y/N)', 'n', boolean)
+    do_prompt(d, 'ext_doctest', 'doctest: automatically test code snippets '
+              'in doctest blocks (y/N)', 'n', boolean)
+    do_prompt(d, 'ext_intersphinx', 'intersphinx: link between Sphinx documentation '
+              'of different projects (y/N)', 'n', boolean)
+    print '''
+If you are under Unix, a Makefile can be generated for you so that you
+only have to run e.g. `make html' instead of invoking sphinx-build
+directly.'''
+    do_prompt(d, 'makefile', 'Create Makefile? (Y/n)',
+              os.name == 'posix' and 'y' or 'n', boolean)
+
+    d['project_fn'] = make_filename(d['project'])
+    d['now'] = time.asctime()
+    d['underline'] = len(d['project']) * '='
+    d['extensions'] = ', '.join(
+        repr('sphinx.ext.' + name) for name in ('autodoc', 'doctest', 'intersphinx')
+        if d['ext_' + name].upper() in ('Y', 'YES'))
+    d['copyright'] = time.strftime('%Y') + ', ' + d['author']
+    d['author_texescaped'] = unicode(d['author']).translate(tex_escape_map)
+    d['project_doc'] = d['project'] + ' Documentation'
+    d['project_doc_texescaped'] = \
+        unicode(d['project'] + ' Documentation').translate(tex_escape_map)
+
+    if not path.isdir(d['path']):
+        mkdir_p(d['path'])
+
+    separate = d['sep'].upper() in ('Y', 'YES')
+    srcdir = separate and path.join(d['path'], 'source') or d['path']
+
+    mkdir_p(srcdir)
+    if separate:
+        builddir = path.join(d['path'], 'build')
+        d['exclude_trees'] = ''
+    else:
+        builddir = path.join(srcdir, d['dot'] + 'build')
+        d['exclude_trees'] = repr(d['dot'] + 'build')
+    mkdir_p(builddir)
+    mkdir_p(path.join(srcdir, d['dot'] + 'templates'))
+    mkdir_p(path.join(srcdir, d['dot'] + 'static'))
+
+    conf_text = QUICKSTART_CONF % d
+    if d['ext_intersphinx'].upper() in ('Y', 'YES'):
+        conf_text += INTERSPHINX_CONFIG
+
+    f = open(path.join(srcdir, 'conf.py'), 'w')
+    f.write(conf_text.encode('utf-8'))
+    f.close()
+
+    masterfile = path.join(srcdir, d['master'] + d['suffix'])
+    f = open(masterfile, 'w')
+    f.write((MASTER_FILE % d).encode('utf-8'))
+    f.close()
+
+    create_makefile = d['makefile'].upper() in ('Y', 'YES')
+    if create_makefile:
+        d['rsrcdir'] = separate and 'source' or '.'
+        d['rbuilddir'] = separate and 'build' or d['dot'] + 'build'
+        f = open(path.join(d['path'], 'Makefile'), 'w')
+        f.write((MAKEFILE % d).encode('utf-8'))
+        f.close()
+
+    print
+    print bold('Finished: An initial directory structure has been created.')
+    print '''
+You should now populate your master file %s and create other documentation
+source files. ''' % masterfile + (create_makefile and '''\
+Use the Makefile to build the docs, like so:
+   make builder
+''' or '''\
+Use the sphinx-build command to build the docs, like so:
+   sphinx-build -b builder %s %s
+''' % (srcdir, builddir)) + '''\
+where "builder" is one of the supported builders, e.g. html, latex or linkcheck.
+'''
+
+
+def main(argv=sys.argv):
+    try:
+        return inner_main(argv)
+    except (KeyboardInterrupt, EOFError):
+        print
+        print '[Interrupted.]'
+        return
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/roles.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,245 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.roles
+    ~~~~~~~~~~~~
+
+    Handlers for additional ReST roles.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+
+from docutils import nodes, utils
+from docutils.parsers.rst import roles
+
+from sphinx import addnodes
+from sphinx.util import ws_re, caption_ref_re
+
+
+generic_docroles = {
+    'command' : nodes.strong,
+    'dfn' : nodes.emphasis,
+    'guilabel' : nodes.strong,
+    'kbd' : nodes.literal,
+    'mailheader' : addnodes.literal_emphasis,
+    'makevar' : nodes.Text,
+    'manpage' : addnodes.literal_emphasis,
+    'mimetype' : addnodes.literal_emphasis,
+    'newsgroup' : addnodes.literal_emphasis,
+    'program' : nodes.strong,
+    'regexp' : nodes.literal,
+}
+
+for rolename, nodeclass in generic_docroles.iteritems():
+    roles.register_generic_role(rolename, nodeclass)
+
+
+def indexmarkup_role(typ, rawtext, etext, lineno, inliner, options={}, content=[]):
+    env = inliner.document.settings.env
+    if not typ:
+        typ = env.config.default_role
+    else:
+        typ = typ.lower()
+    text = utils.unescape(etext)
+    targetid = 'index-%s' % env.index_num
+    env.index_num += 1
+    indexnode = addnodes.index()
+    targetnode = nodes.target('', '', ids=[targetid])
+    inliner.document.note_explicit_target(targetnode)
+    if typ == 'envvar':
+        indexnode['entries'] = [('single', text, targetid, text),
+                                ('single', _('environment variable; %s') % text,
+                                 targetid, text)]
+        xref_nodes = xfileref_role(typ, rawtext, etext, lineno, inliner,
+                                   options, content)[0]
+        return [indexnode, targetnode] + xref_nodes, []
+    elif typ == 'pep':
+        indexnode['entries'] = [('single',
+                                 _('Python Enhancement Proposals!PEP %s') % text,
+                                 targetid, 'PEP %s' % text)]
+        try:
+            pepnum = int(text)
+        except ValueError:
+            msg = inliner.reporter.error('invalid PEP number %s' % text, line=lineno)
+            prb = inliner.problematic(rawtext, rawtext, msg)
+            return [prb], [msg]
+        ref = inliner.document.settings.pep_base_url + 'pep-%04d' % pepnum
+        sn = nodes.strong('PEP '+text, 'PEP '+text)
+        rn = nodes.reference('', '', refuri=ref)
+        rn += sn
+        return [indexnode, targetnode, rn], []
+    elif typ == 'rfc':
+        indexnode['entries'] = [('single', 'RFC; RFC %s' % text,
+                                 targetid, 'RFC %s' % text)]
+        try:
+            rfcnum = int(text)
+        except ValueError:
+            msg = inliner.reporter.error('invalid RFC number %s' % text, line=lineno)
+            prb = inliner.problematic(rawtext, rawtext, msg)
+            return [prb], [msg]
+        ref = inliner.document.settings.rfc_base_url + inliner.rfc_url % rfcnum
+        sn = nodes.strong('RFC '+text, 'RFC '+text)
+        rn = nodes.reference('', '', refuri=ref)
+        rn += sn
+        return [indexnode, targetnode, rn], []
+
+roles.register_canonical_role('envvar', indexmarkup_role)
+roles.register_local_role('pep', indexmarkup_role)
+roles.register_local_role('rfc', indexmarkup_role)
+
+
+# default is `literal`
+innernodetypes = {
+    'ref': nodes.emphasis,
+    'term': nodes.emphasis,
+    'token': nodes.strong,
+    'envvar': nodes.strong,
+    'option': addnodes.literal_emphasis,
+}
+
+def _fix_parens(typ, text, env):
+    if typ in ('func', 'meth', 'cfunc'):
+        if text.endswith('()'):
+            # remove parentheses
+            text = text[:-2]
+        if env.config.add_function_parentheses:
+            # add them back to all occurrences if configured
+            text += '()'
+    return text
+
+def xfileref_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
+    env = inliner.document.settings.env
+    if not typ:
+        typ = env.config.default_role
+    else:
+        typ = typ.lower()
+    text = utils.unescape(text)
+    # if the first character is a bang, don't cross-reference at all
+    if text[0:1] == '!':
+        text = _fix_parens(typ, text[1:], env)
+        return [innernodetypes.get(typ, nodes.literal)(
+            rawtext, text, classes=['xref'])], []
+    # we want a cross-reference, create the reference node
+    pnode = addnodes.pending_xref(rawtext, reftype=typ, refcaption=False,
+                                  modname=env.currmodule, classname=env.currclass)
+    # we may need the line number for warnings
+    pnode.line = lineno
+    # the link title may differ from the target, but by default they are the same
+    title = target = text
+    titleistarget = True
+    # look if explicit title and target are given with `foo <bar>` syntax
+    brace = text.find('<')
+    if brace != -1:
+        titleistarget = False
+        pnode['refcaption'] = True
+        m = caption_ref_re.match(text)
+        if m:
+            target = m.group(2)
+            title = m.group(1)
+        else:
+            # fallback: everything after '<' is the target
+            target = text[brace+1:]
+            title = text[:brace]
+    # special target for Python object cross-references
+    if typ in ('data', 'exc', 'func', 'class', 'const', 'attr', 'meth', 'mod', 'obj'):
+        # fix-up parentheses in link title
+        if titleistarget:
+            title = title.lstrip('.')   # only has a meaning for the target
+            target = target.lstrip('~') # only has a meaning for the title
+            title = _fix_parens(typ, title, env)
+            # if the first character is a tilde, don't display the module/class
+            # parts of the contents
+            if title[0:1] == '~':
+                title = title[1:]
+                dot = title.rfind('.')
+                if dot != -1:
+                    title = title[dot+1:]
+        # remove parentheses from the target too
+        if target.endswith('()'):
+            target = target[:-2]
+        # if the first character is a dot, search more specific namespaces first
+        # else search builtins first
+        if target[0:1] == '.':
+            target = target[1:]
+            pnode['refspecific'] = True
+    # some other special cases for the target
+    elif typ == 'option':
+        program = env.currprogram
+        if titleistarget:
+            if ' ' in title and not (title.startswith('/') or title.startswith('-')):
+                program, target = re.split(' (?=-|--|/)', title, 1)
+                program = ws_re.sub('-', program)
+                target = target.strip()
+        elif ' ' in target:
+            program, target = re.split(' (?=-|--|/)', target, 1)
+            program = ws_re.sub('-', program)
+        pnode['refprogram'] = program
+    elif typ == 'term':
+        # normalize whitespace in definition terms (if the term reference is
+        # broken over a line, a newline will be in target)
+        target = ws_re.sub(' ', target).lower()
+    elif typ == 'ref':
+        # reST label names are always lowercased
+        target = ws_re.sub('', target).lower()
+    else:
+        # remove all whitespace to avoid referencing problems
+        target = ws_re.sub('', target)
+    pnode['reftarget'] = target
+    pnode += innernodetypes.get(typ, nodes.literal)(rawtext, title, classes=['xref'])
+    return [pnode], []
+
+
+def menusel_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
+    return [nodes.emphasis(
+        rawtext, utils.unescape(text).replace('-->', u'\N{TRIANGULAR BULLET}'))], []
+
+
+_litvar_re = re.compile('{([^}]+)}')
+
+def emph_literal_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
+    text = utils.unescape(text)
+    pos = 0
+    retnode = nodes.literal(role=typ.lower())
+    for m in _litvar_re.finditer(text):
+        if m.start() > pos:
+            txt = text[pos:m.start()]
+            retnode += nodes.Text(txt, txt)
+        retnode += nodes.emphasis(m.group(1), m.group(1))
+        pos = m.end()
+    if pos < len(text):
+        retnode += nodes.Text(text[pos:], text[pos:])
+    return [retnode], []
+
+
+specific_docroles = {
+    'data': xfileref_role,
+    'exc': xfileref_role,
+    'func': xfileref_role,
+    'class': xfileref_role,
+    'const': xfileref_role,
+    'attr': xfileref_role,
+    'meth': xfileref_role,
+    'obj': xfileref_role,
+    'cfunc' : xfileref_role,
+    'cmember': xfileref_role,
+    'cdata': xfileref_role,
+    'ctype': xfileref_role,
+    'cmacro': xfileref_role,
+
+    'mod': xfileref_role,
+
+    'keyword': xfileref_role,
+    'ref': xfileref_role,
+    'token': xfileref_role,
+    'term': xfileref_role,
+    'option': xfileref_role,
+
+    'menuselection': menusel_role,
+    'file': emph_literal_role,
+    'samp': emph_literal_role,
+}
+
+for rolename, func in specific_docroles.iteritems():
+    roles.register_canonical_role(rolename, func)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/search.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,205 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.search
+    ~~~~~~~~~~~~~
+
+    Create a search index for offline search.
+
+    :copyright: 2007-2008 by Armin Ronacher.
+    :license: BSD.
+"""
+import re
+import cPickle as pickle
+from cStringIO import StringIO
+
+from docutils.nodes import Text, NodeVisitor
+
+from sphinx.util.stemmer import PorterStemmer
+from sphinx.util import jsdump, rpartition
+
+
+word_re = re.compile(r'\w+(?u)')
+
+stopwords = set("""
+a  and  are  as  at
+be  but  by
+for
+if  in  into  is  it
+near  no  not
+of  on  or
+such
+that  the  their  then  there  these  they  this  to
+was  will  with
+""".split())
+
+
+class _JavaScriptIndex(object):
+    """
+    The search index as javascript file that calls a function
+    on the documentation search object to register the index.
+    """
+
+    PREFIX = 'Search.setIndex('
+    SUFFIX = ')'
+
+    def dumps(self, data):
+        return self.PREFIX + jsdump.dumps(data) + self.SUFFIX
+
+    def loads(self, s):
+        data = s[len(self.PREFIX):-len(self.SUFFIX)]
+        if not data or not s.startswith(self.PREFIX) or not \
+           s.endswith(self.SUFFIX):
+            raise ValueError('invalid data')
+        return jsdump.loads(data)
+
+    def dump(self, data, f):
+        f.write(self.dumps(data))
+
+    def load(self, f):
+        return self.loads(f.read())
+
+
+js_index = _JavaScriptIndex()
+
+
+class Stemmer(PorterStemmer):
+    """
+    All those porter stemmer implementations look hideous.
+    make at least the stem method nicer.
+    """
+
+    def stem(self, word):
+        word = word.lower()
+        return PorterStemmer.stem(self, word, 0, len(word) - 1)
+
+
+class WordCollector(NodeVisitor):
+    """
+    A special visitor that collects words for the `IndexBuilder`.
+    """
+
+    def __init__(self, document):
+        NodeVisitor.__init__(self, document)
+        self.found_words = []
+
+    def dispatch_visit(self, node):
+        if node.__class__ is Text:
+            self.found_words.extend(word_re.findall(node.astext()))
+
+
+class IndexBuilder(object):
+    """
+    Helper class that creates a searchindex based on the doctrees
+    passed to the `feed` method.
+    """
+    formats = {
+        'jsdump':   jsdump,
+        'pickle':   pickle
+    }
+
+    def __init__(self, env):
+        self.env = env
+        self._stemmer = Stemmer()
+        # filename -> title
+        self._titles = {}
+        # stemmed word -> set(filenames)
+        self._mapping = {}
+        # desctypes -> index
+        self._desctypes = {}
+
+    def load(self, stream, format):
+        """Reconstruct from frozen data."""
+        if isinstance(format, basestring):
+            format = self.formats[format]
+        frozen = format.load(stream)
+        # if an old index is present, we treat it as not existing.
+        if not isinstance(frozen, dict):
+            raise ValueError('old format')
+        index2fn = frozen['filenames']
+        self._titles = dict(zip(index2fn, frozen['titles']))
+        self._mapping = {}
+        for k, v in frozen['terms'].iteritems():
+            if isinstance(v, int):
+                self._mapping[k] = set([index2fn[v]])
+            else:
+                self._mapping[k] = set(index2fn[i] for i in v)
+        # no need to load keywords/desctypes
+
+    def dump(self, stream, format):
+        """Dump the frozen index to a stream."""
+        if isinstance(format, basestring):
+            format = self.formats[format]
+        format.dump(self.freeze(), stream)
+
+    def get_modules(self, fn2index):
+        rv = {}
+        for name, (doc, _, _, _) in self.env.modules.iteritems():
+            rv[name] = fn2index[doc]
+        return rv
+
+    def get_descrefs(self, fn2index):
+        rv = {}
+        dt = self._desctypes
+        for fullname, (doc, desctype) in self.env.descrefs.iteritems():
+            prefix, name = rpartition(fullname, '.')
+            pdict = rv.setdefault(prefix, {})
+            try:
+                i = dt[desctype]
+            except KeyError:
+                i = len(dt)
+                dt[desctype] = i
+            pdict[name] = (fn2index[doc], i)
+        return rv
+
+    def get_terms(self, fn2index):
+        rv = {}
+        for k, v in self._mapping.iteritems():
+            if len(v) == 1:
+                fn, = v
+                rv[k] = fn2index[fn]
+            else:
+                rv[k] = [fn2index[fn] for fn in v]
+        return rv
+
+    def freeze(self):
+        """Create a usable data structure for serializing."""
+        filenames = self._titles.keys()
+        titles = self._titles.values()
+        fn2index = dict((f, i) for (i, f) in enumerate(filenames))
+        return dict(
+            filenames=filenames,
+            titles=titles,
+            terms=self.get_terms(fn2index),
+            descrefs=self.get_descrefs(fn2index),
+            modules=self.get_modules(fn2index),
+            desctypes=dict((v, k) for (k, v) in self._desctypes.items()),
+        )
+
+    def prune(self, filenames):
+        """Remove data for all filenames not in the list."""
+        new_titles = {}
+        for filename in filenames:
+            if filename in self._titles:
+                new_titles[filename] = self._titles[filename]
+        self._titles = new_titles
+        for wordnames in self._mapping.itervalues():
+            wordnames.intersection_update(filenames)
+
+    def feed(self, filename, title, doctree):
+        """Feed a doctree to the index."""
+        self._titles[filename] = title
+
+        visitor = WordCollector(doctree)
+        doctree.walk(visitor)
+
+        def add_term(word, prefix='', stem=self._stemmer.stem):
+            word = stem(word)
+            if len(word) < 3 or word in stopwords or word.isdigit():
+                return
+            self._mapping.setdefault(prefix + word, set()).add(filename)
+
+        for word in word_re.findall(title):
+            add_term(word)
+
+        for word in visitor.found_words:
+            add_term(word)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/setup_command.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.setup_command
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Setuptools/distutils commands to assist the building of sphinx
+    documentation.
+
+    :author: Sebastian Wiesner
+    :contact: basti.wiesner@gmx.net
+    :copyright: 2008 by Sebastian Wiesner.
+    :license: MIT.
+"""
+
+import sys
+import os
+from StringIO import StringIO
+from distutils.cmd import Command
+
+from sphinx.application import Sphinx
+from sphinx.util.console import darkred, nocolor
+
+
+class BuildDoc(Command):
+    """Distutils command to build Sphinx documentation."""
+
+    description = 'Build Sphinx documentation'
+    user_options = [
+        ('fresh-env', 'E', 'discard saved environment'),
+        ('all-files', 'a', 'build all files'),
+        ('source-dir=', 's', 'Source directory'),
+        ('build-dir=', None, 'Build directory'),
+        ('builder=', 'b', 'The builder to use. Defaults to "html"'),
+        ]
+    boolean_options = ['fresh-env', 'all-files']
+
+
+    def initialize_options(self):
+        self.fresh_env = self.all_files = False
+        self.source_dir = self.build_dir = None
+        self.conf_file_name = 'conf.py'
+        self.builder = 'html'
+
+    def finalize_options(self):
+        if self.source_dir is None:
+            if os.path.isdir('doc'):
+                for root, dirnames, filenames in os.walk('doc'):
+                    if 'conf.py' in filenames:
+                        self.source_dir = root
+                        self.announce('Using source directory %s' % root)
+                        break
+        self.ensure_dirname('source_dir')
+        self.source_dir = os.path.abspath(self.source_dir)
+
+        if self.build_dir is None:
+            build = self.get_finalized_command('build')
+            self.build_dir = os.path.join(build.build_base, 'sphinx')
+            self.mkpath(self.build_dir)
+        self.ensure_dirname('build_dir')
+        self.doctree_dir = os.path.join(self.build_dir, 'doctrees')
+        self.mkpath(self.doctree_dir)
+        self.builder_target_dir = os.path.join(self.build_dir, self.builder)
+        self.mkpath(self.builder_target_dir)
+
+    def run(self):
+        if not sys.stdout.isatty() or sys.platform == 'win32':
+            # Windows' poor cmd box doesn't understand ANSI sequences
+            nocolor()
+        if not self.verbose:
+            status_stream = StringIO()
+        else:
+            status_stream = sys.stdout
+        app = Sphinx(self.source_dir, self.source_dir,
+                     self.builder_target_dir, self.doctree_dir,
+                     self.builder, {}, status_stream,
+                     freshenv=self.fresh_env)
+
+        try:
+            if self.all_files:
+                app.builder.build_all()
+            else:
+                app.builder.build_update()
+        except Exception, err:
+            from docutils.utils import SystemMessage
+            if isinstance(err, SystemMessage):
+                sys.stderr, darkred('reST markup error:')
+                print >>sys.stderr, err.args[0].encode('ascii', 'backslashreplace')
+            else:
+                raise
Binary file buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/contents.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/default.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,657 @@
+/**
+ * Sphinx Doc Design
+ */
+
+body {
+    font-family: sans-serif;
+    font-size: 100%;
+    background-color: #11303d;
+    color: #000;
+    margin: 0;
+    padding: 0;
+}
+
+/* :::: LAYOUT :::: */
+
+div.document {
+    background-color: #1c4e63;
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 230px;
+}
+
+div.body {
+    background-color: white;
+    padding: 0 20px 30px 20px;
+}
+
+div.sphinxsidebarwrapper {
+    padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+    float: left;
+    width: 230px;
+    margin-left: -100%;
+    font-size: 90%;
+}
+
+div.clearer {
+    clear: both;
+}
+
+div.footer {
+    color: #fff;
+    width: 100%;
+    padding: 9px 0 9px 0;
+    text-align: center;
+    font-size: 75%;
+}
+
+div.footer a {
+    color: #fff;
+    text-decoration: underline;
+}
+
+div.related {
+    background-color: #133f52;
+    color: #fff;
+    width: 100%;
+    line-height: 30px;
+    font-size: 90%;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+div.related a {
+    color: white;
+}
+
+/* ::: TOC :::: */
+div.sphinxsidebar h3 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: white;
+    font-size: 1.4em;
+    font-weight: normal;
+    margin: 0;
+    padding: 0;
+}
+
+div.sphinxsidebar h3 a {
+    color: white;
+}
+
+div.sphinxsidebar h4 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: white;
+    font-size: 1.3em;
+    font-weight: normal;
+    margin: 5px 0 0 0;
+    padding: 0;
+}
+
+div.sphinxsidebar p {
+    color: white;
+}
+
+div.sphinxsidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+    margin: 10px;
+    padding: 0;
+    list-style: none;
+    color: white;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+    margin-left: 20px;
+    list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar a {
+    color: #98dbcc;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+/* :::: MODULE CLOUD :::: */
+div.modulecloud {
+    margin: -5px 10px 5px 10px;
+    padding: 10px;
+    line-height: 160%;
+    border: 1px solid #cbe7e5;
+    background-color: #f2fbfd;
+}
+
+div.modulecloud a {
+    padding: 0 5px 0 5px;
+}
+
+/* :::: SEARCH :::: */
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* :::: COMMON FORM STYLES :::: */
+
+div.actions {
+    padding: 5px 10px 5px 10px;
+    border-top: 1px solid #cbe7e5;
+    border-bottom: 1px solid #cbe7e5;
+    background-color: #e0f6f4;
+}
+
+form dl {
+    color: #333;
+}
+
+form dt {
+    clear: both;
+    float: left;
+    min-width: 110px;
+    margin-right: 10px;
+    padding-top: 2px;
+}
+
+input#homepage {
+    display: none;
+}
+
+div.error {
+    margin: 5px 20px 0 0;
+    padding: 5px;
+    border: 1px solid #d00;
+    font-weight: bold;
+}
+
+/* :::: INDEX PAGE :::: */
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+/* :::: INDEX STYLES :::: */
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+form.pfform {
+    margin: 10px 0 20px 0;
+}
+
+/* :::: GLOBAL STYLES :::: */
+
+.docwarning {
+    background-color: #ffe4e4;
+    padding: 10px;
+    margin: 0 -20px 0 -20px;
+    border-bottom: 1px solid #f66;
+}
+
+p.subhead {
+    font-weight: bold;
+    margin-top: 20px;
+}
+
+a {
+    color: #355f7c;
+    text-decoration: none;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: 'Trebuchet MS', sans-serif;
+    background-color: #f2f2f2;
+    font-weight: normal;
+    color: #20435c;
+    border-bottom: 1px solid #ccc;
+    margin: 20px -20px 10px -20px;
+    padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 160%; }
+div.body h3 { font-size: 140%; }
+div.body h4 { font-size: 120%; }
+div.body h5 { font-size: 110%; }
+div.body h6 { font-size: 100%; }
+
+a.headerlink {
+    color: #c60f0f;
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+    visibility: visible;
+}
+
+a.headerlink:hover {
+    background-color: #c60f0f;
+    color: white;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+    line-height: 130%;
+}
+
+div.body p.caption {
+    text-align: inherit;
+}
+
+div.body td {
+    text-align: left;
+}
+
+ul.fakelist {
+    list-style: none;
+    margin: 10px 0 10px 20px;
+    padding: 0;
+}
+
+.field-list ul {
+    padding-left: 1em;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+/* "Footnotes" heading */
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+/* Sidebars */
+
+div.sidebar {
+    margin: 0 0 0.5em 1em;
+    border: 1px solid #ddb;
+    padding: 7px 7px 0 7px;
+    background-color: #ffe;
+    width: 40%;
+    float: right;
+}
+
+p.sidebar-title {
+    font-weight: bold;
+}
+
+/* "Topics" */
+
+div.topic {
+    background-color: #eee;
+    border: 1px solid #ccc;
+    padding: 7px 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* Admonitions */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+div.admonition dl {
+    margin-bottom: 0;
+}
+
+div.admonition p.admonition-title + p {
+    display: inline;
+}
+
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+    display: inline;
+}
+
+p.admonition-title:after {
+    content: ":";
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+table.docutils {
+    border: 0;
+}
+
+table.docutils td, table.docutils th {
+    padding: 1px 8px 1px 0;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+    border: 0 !important;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+dl {
+    margin-bottom: 15px;
+    clear: both;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+.refcount {
+    color: #060;
+}
+
+dt:target,
+.highlight {
+    background-color: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+pre {
+    padding: 5px;
+    background-color: #efc;
+    color: #333;
+    border: 1px solid #ac9;
+    border-left: none;
+    border-right: none;
+    overflow: auto;
+}
+
+td.linenos pre {
+    padding: 5px 0px;
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    margin-left: 0.5em;
+}
+
+table.highlighttable td {
+    padding: 0 0.5em 0 0.5em;
+}
+
+tt {
+    background-color: #ecf0f3;
+    padding: 0 1px 0 1px;
+    font-size: 0.95em;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+}
+
+tt.descclassname {
+    background-color: transparent;
+}
+
+tt.xref, a tt {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+.footnote:target  { background-color: #ffa }
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+    background-color: transparent;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+form.comment {
+    margin: 0;
+    padding: 10px 30px 10px 30px;
+    background-color: #eee;
+}
+
+form.comment h3 {
+    background-color: #326591;
+    color: white;
+    margin: -10px -30px 10px -30px;
+    padding: 5px;
+    font-size: 1.4em;
+}
+
+form.comment input,
+form.comment textarea {
+    border: 1px solid #ccc;
+    padding: 2px;
+    font-family: sans-serif;
+    font-size: 100%;
+}
+
+form.comment input[type="text"] {
+    width: 240px;
+}
+
+form.comment textarea {
+    width: 100%;
+    height: 200px;
+    margin-bottom: 10px;
+}
+
+.system-message {
+    background-color: #fda;
+    padding: 5px;
+    border: 3px solid red;
+}
+
+img.math {
+    vertical-align: middle;
+}
+
+div.math p {
+    text-align: center;
+}
+
+span.eqno {
+    float: right;
+}
+
+img.logo {
+    border: 0;
+}
+
+/* :::: PRINT :::: */
+@media print {
+    div.document,
+    div.documentwrapper,
+    div.bodywrapper {
+        margin: 0;
+        width : 100%;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    div#comments div.new-comment-box,
+    #top-link {
+        display: none;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/doctools.js	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,232 @@
+/// XXX: make it cross browser
+
+/**
+ * make the code below compatible with browsers without
+ * an installed firebug like debugger
+ */
+if (!window.console || !console.firebug) {
+  var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
+      "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
+  window.console = {};
+  for (var i = 0; i < names.length; ++i)
+    window.console[names[i]] = function() {}
+}
+
+/**
+ * small helper function to urldecode strings
+ */
+jQuery.urldecode = function(x) {
+  return decodeURIComponent(x).replace(/\+/g, ' ');
+}
+
+/**
+ * small helper function to urlencode strings
+ */
+jQuery.urlencode = encodeURIComponent;
+
+/**
+ * This function returns the parsed url parameters of the
+ * current request. Multiple values per key are supported,
+ * it will always return arrays of strings for the value parts.
+ */
+jQuery.getQueryParameters = function(s) {
+  if (typeof s == 'undefined')
+    s = document.location.search;
+  var parts = s.substr(s.indexOf('?') + 1).split('&');
+  var result = {};
+  for (var i = 0; i < parts.length; i++) {
+    var tmp = parts[i].split('=', 2);
+    var key = jQuery.urldecode(tmp[0]);
+    var value = jQuery.urldecode(tmp[1]);
+    if (key in result)
+      result[key].push(value);
+    else
+      result[key] = [value];
+  }
+  return result;
+}
+
+/**
+ * small function to check if an array contains
+ * a given item.
+ */
+jQuery.contains = function(arr, item) {
+  for (var i = 0; i < arr.length; i++) {
+    if (arr[i] == item)
+      return true;
+  }
+  return false;
+}
+
+/**
+ * highlight a given string on a jquery object by wrapping it in
+ * span elements with the given class name.
+ */
+jQuery.fn.highlightText = function(text, className) {
+  function highlight(node) {
+    if (node.nodeType == 3) {
+      var val = node.nodeValue;
+      var pos = val.toLowerCase().indexOf(text);
+      if (pos >= 0 && !jQuery.className.has(node.parentNode, className)) {
+        var span = document.createElement("span");
+        span.className = className;
+        span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
+          document.createTextNode(val.substr(pos + text.length)),
+          node.nextSibling));
+        node.nodeValue = val.substr(0, pos);
+      }
+    }
+    else if (!jQuery(node).is("button, select, textarea")) {
+      jQuery.each(node.childNodes, function() {
+        highlight(this)
+      });
+    }
+  }
+  return this.each(function() {
+    highlight(this);
+  });
+}
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+var Documentation = {
+
+  init : function() {
+    this.fixFirefoxAnchorBug();
+    this.highlightSearchWords();
+    this.initModIndex();
+  },
+
+  /**
+   * i18n support
+   */
+  TRANSLATIONS : {},
+  PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
+  LOCALE : 'unknown',
+
+  // gettext and ngettext don't access this so that the functions
+  // can savely bound to a different name (_ = Documentation.gettext)
+  gettext : function(string) {
+    var translated = Documentation.TRANSLATIONS[string];
+    if (typeof translated == 'undefined')
+      return string;
+    return (typeof translated == 'string') ? translated : translated[0];
+  },
+
+  ngettext : function(singular, plural, n) {
+    var translated = Documentation.TRANSLATIONS[singular];
+    if (typeof translated == 'undefined')
+      return (n == 1) ? singular : plural;
+    return translated[Documentation.PLURALEXPR(n)];
+  },
+
+  addTranslations : function(catalog) {
+    for (var key in catalog.messages)
+      this.TRANSLATIONS[key] = catalog.messages[key];
+    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
+    this.LOCALE = catalog.locale;
+  },
+
+  /**
+   * add context elements like header anchor links
+   */
+  addContextElements : function() {
+    $('div[@id] > :header:first').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this headline')).
+      appendTo(this);
+    });
+    $('dt[@id]').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this definition')).
+      appendTo(this);
+    });
+  },
+
+  /**
+   * workaround a firefox stupidity
+   */
+  fixFirefoxAnchorBug : function() {
+    if (document.location.hash && $.browser.mozilla)
+      window.setTimeout(function() {
+        document.location.href += '';
+      }, 10);
+  },
+
+  /**
+   * highlight the search words provided in the url in the text
+   */
+  highlightSearchWords : function() {
+    var params = $.getQueryParameters();
+    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
+    if (terms.length) {
+      var body = $('div.body');
+      window.setTimeout(function() {
+        $.each(terms, function() {
+          body.highlightText(this.toLowerCase(), 'highlight');
+        });
+      }, 10);
+      $('<li class="highlight-link"><a href="javascript:Documentation.' +
+        'hideSearchWords()">' + _('Hide Search Matches') + '</a></li>')
+          .appendTo($('.sidebar .this-page-menu'));
+    }
+  },
+
+  /**
+   * init the modindex toggle buttons
+   */
+  initModIndex : function() {
+    var togglers = $('img.toggler').click(function() {
+      var src = $(this).attr('src');
+      var idnum = $(this).attr('id').substr(7);
+      console.log($('tr.cg-' + idnum).toggle());
+      if (src.substr(-9) == 'minus.png')
+        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
+      else
+        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
+    }).css('display', '');
+    if (DOCUMENTATION_OPTIONS.COLLAPSE_MODINDEX) {
+        togglers.click();
+    }
+  },
+
+  /**
+   * helper function to hide the search marks again
+   */
+  hideSearchWords : function() {
+    $('.sidebar .this-page-menu li.highlight-link').fadeOut(300);
+    $('span.highlight').removeClass('highlight');
+  },
+
+  /**
+   * make the url absolute
+   */
+  makeURL : function(relativeURL) {
+    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
+  },
+
+  /**
+   * get the current relative url
+   */
+  getCurrentURL : function() {
+    var path = document.location.pathname;
+    var parts = path.split(/\//);
+    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
+      if (this == '..')
+        parts.pop();
+    });
+    var url = parts.join('/');
+    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
+  }
+};
+
+// quick alias for translations
+_ = Documentation.gettext;
+
+$(document).ready(function() {
+  Documentation.init();
+});
Binary file buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/file.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/jquery.js	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,32 @@
+/*
+ * jQuery 1.2.6 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
+ */
+(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
+return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
+return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
+selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
+return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
+this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
+return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
+jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
+script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
+for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
+for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
+jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
+ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
+while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
+while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
+for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
+jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
+xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
+jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
+for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
+s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
+e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();
\ No newline at end of file
Binary file buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/minus.png has changed
Binary file buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/navigation.png has changed
Binary file buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/plus.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/rightsidebar.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,16 @@
+/**
+ * Sphinx Doc Design -- Right Side Bar Overrides
+ */
+
+
+div.sphinxsidebar {
+    float: right;
+}
+
+div.bodywrapper {
+    margin: 0 230px 0 0;
+}
+
+div.inlinecomments {
+    right: 250px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/searchtools.js	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,467 @@
+/**
+ * helper function to return a node containing the
+ * search summary for a given text. keywords is a list
+ * of stemmed words, hlwords is the list of normal, unstemmed
+ * words. the first one is used to find the occurance, the
+ * latter for highlighting it.
+ */
+
+jQuery.makeSearchSummary = function(text, keywords, hlwords) {
+  var textLower = text.toLowerCase();
+  var start = 0;
+  $.each(keywords, function() {
+    var i = textLower.indexOf(this.toLowerCase());
+    if (i > -1)
+      start = i;
+  });
+  start = Math.max(start - 120, 0);
+  var excerpt = ((start > 0) ? '...' : '') +
+  $.trim(text.substr(start, 240)) +
+  ((start + 240 - text.length) ? '...' : '');
+  var rv = $('<div class="context"></div>').text(excerpt);
+  $.each(hlwords, function() {
+    rv = rv.highlightText(this, 'highlight');
+  });
+  return rv;
+}
+
+/**
+ * Porter Stemmer
+ */
+var PorterStemmer = function() {
+
+  var step2list = {
+    ational: 'ate',
+    tional: 'tion',
+    enci: 'ence',
+    anci: 'ance',
+    izer: 'ize',
+    bli: 'ble',
+    alli: 'al',
+    entli: 'ent',
+    eli: 'e',
+    ousli: 'ous',
+    ization: 'ize',
+    ation: 'ate',
+    ator: 'ate',
+    alism: 'al',
+    iveness: 'ive',
+    fulness: 'ful',
+    ousness: 'ous',
+    aliti: 'al',
+    iviti: 'ive',
+    biliti: 'ble',
+    logi: 'log'
+  };
+
+  var step3list = {
+    icate: 'ic',
+    ative: '',
+    alize: 'al',
+    iciti: 'ic',
+    ical: 'ic',
+    ful: '',
+    ness: ''
+  };
+
+  var c = "[^aeiou]";          // consonant
+  var v = "[aeiouy]";          // vowel
+  var C = c + "[^aeiouy]*";    // consonant sequence
+  var V = v + "[aeiou]*";      // vowel sequence
+
+  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
+  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
+  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
+  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem
+
+  this.stemWord = function (w) {
+    var stem;
+    var suffix;
+    var firstch;
+    var origword = w;
+
+    if (w.length < 3)
+      return w;
+
+    var re;
+    var re2;
+    var re3;
+    var re4;
+
+    firstch = w.substr(0,1);
+    if (firstch == "y")
+      w = firstch.toUpperCase() + w.substr(1);
+
+    // Step 1a
+    re = /^(.+?)(ss|i)es$/;
+    re2 = /^(.+?)([^s])s$/;
+
+    if (re.test(w))
+      w = w.replace(re,"$1$2");
+    else if (re2.test(w))
+      w = w.replace(re2,"$1$2");
+
+    // Step 1b
+    re = /^(.+?)eed$/;
+    re2 = /^(.+?)(ed|ing)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      re = new RegExp(mgr0);
+      if (re.test(fp[1])) {
+        re = /.$/;
+        w = w.replace(re,"");
+      }
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1];
+      re2 = new RegExp(s_v);
+      if (re2.test(stem)) {
+        w = stem;
+        re2 = /(at|bl|iz)$/;
+        re3 = new RegExp("([^aeiouylsz])\\1$");
+        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+        if (re2.test(w))
+          w = w + "e";
+        else if (re3.test(w)) {
+          re = /.$/;
+          w = w.replace(re,"");
+        }
+        else if (re4.test(w))
+          w = w + "e";
+      }
+    }
+
+    // Step 1c
+    re = /^(.+?)y$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(s_v);
+      if (re.test(stem))
+        w = stem + "i";
+    }
+
+    // Step 2
+    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step2list[suffix];
+    }
+
+    // Step 3
+    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step3list[suffix];
+    }
+
+    // Step 4
+    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+    re2 = /^(.+?)(s|t)(ion)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      if (re.test(stem))
+        w = stem;
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1] + fp[2];
+      re2 = new RegExp(mgr1);
+      if (re2.test(stem))
+        w = stem;
+    }
+
+    // Step 5
+    re = /^(.+?)e$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      re2 = new RegExp(meq1);
+      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+        w = stem;
+    }
+    re = /ll$/;
+    re2 = new RegExp(mgr1);
+    if (re.test(w) && re2.test(w)) {
+      re = /.$/;
+      w = w.replace(re,"");
+    }
+
+    // and turn initial Y back to y
+    if (firstch == "y")
+      w = firstch.toLowerCase() + w.substr(1);
+    return w;
+  }
+}
+
+
+/**
+ * Search Module
+ */
+var Search = {
+
+  _index : null,
+  _queued_query : null,
+  _pulse_status : -1,
+
+  init : function() {
+      var params = $.getQueryParameters();
+      if (params.q) {
+          var query = params.q[0];
+          $('input[@name="q"]')[0].value = query;
+          this.performSearch(query);
+      }
+  },
+
+  /**
+   * Sets the index
+   */
+  setIndex : function(index) {
+    var q;
+    this._index = index;
+    if ((q = this._queued_query) !== null) {
+      this._queued_query = null;
+      Search.query(q);
+    }
+  },
+
+  hasIndex : function() {
+      return this._index !== null;
+  },
+
+  deferQuery : function(query) {
+      this._queued_query = query;
+  },
+
+  stopPulse : function() {
+      this._pulse_status = 0;
+  },
+
+  startPulse : function() {
+    if (this._pulse_status >= 0)
+        return;
+    function pulse() {
+      Search._pulse_status = (Search._pulse_status + 1) % 4;
+      var dotString = '';
+      for (var i = 0; i < Search._pulse_status; i++)
+        dotString += '.';
+      Search.dots.text(dotString);
+      if (Search._pulse_status > -1)
+        window.setTimeout(pulse, 500);
+    };
+    pulse();
+  },
+
+  /**
+   * perform a search for something
+   */
+  performSearch : function(query) {
+    // create the required interface elements
+    this.out = $('#search-results');
+    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
+    this.dots = $('<span></span>').appendTo(this.title);
+    this.status = $('<p style="display: none"></p>').appendTo(this.out);
+    this.output = $('<ul class="search"/>').appendTo(this.out);
+
+    $('#search-progress').text(_('Preparing search...'));
+    this.startPulse();
+
+    // index already loaded, the browser was quick!
+    if (this.hasIndex())
+      this.query(query);
+    else
+      this.setQuery(query);
+  },
+
+  query : function(query) {
+    // stem the searchterms and add them to the
+    // correct list
+    var stemmer = new PorterStemmer();
+    var searchterms = [];
+    var excluded = [];
+    var hlterms = [];
+    var tmp = query.split(/\s+/);
+    var object = (tmp.length == 1) ? tmp[0].toLowerCase() : null;
+    for (var i = 0; i < tmp.length; i++) {
+      // stem the word
+      var word = stemmer.stemWord(tmp[i]).toLowerCase();
+      // select the correct list
+      if (word[0] == '-') {
+        var toAppend = excluded;
+        word = word.substr(1);
+      }
+      else {
+        var toAppend = searchterms;
+        hlterms.push(tmp[i].toLowerCase());
+      }
+      // only add if not already in the list
+      if (!$.contains(toAppend, word))
+        toAppend.push(word);
+    };
+    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
+
+    console.debug('SEARCH: searching for:');
+    console.info('required: ', searchterms);
+    console.info('excluded: ', excluded);
+
+    // prepare search
+    var filenames = this._index.filenames;
+    var titles = this._index.titles;
+    var terms = this._index.terms;
+    var descrefs = this._index.descrefs;
+    var modules = this._index.modules;
+    var desctypes = this._index.desctypes;
+    var fileMap = {};
+    var files = null;
+    var objectResults = [];
+    var regularResults = [];
+    $('#search-progress').empty();
+
+    // lookup as object
+    if (object != null) {
+      for (var module in modules) {
+        if (module.indexOf(object) > -1) {
+          fn = modules[module];
+          descr = _('module, in ') + titles[fn];
+          objectResults.push([filenames[fn], module, '#module-'+module, descr]);
+        }
+      }
+      for (var prefix in descrefs) {
+        for (var name in descrefs[prefix]) {
+          if (name.toLowerCase().indexOf(object) > -1) {
+            match = descrefs[prefix][name];
+            fullname = (prefix ? prefix + '.' : '') + name;
+            descr = desctypes[match[1]] + _(', in ') + titles[match[0]];
+            objectResults.push([filenames[match[0]], fullname, '#'+fullname, descr]);
+          }
+        }
+      }
+    }
+
+    // sort results descending
+    objectResults.sort(function(a, b) {
+      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
+    });
+
+
+    // perform the search on the required terms
+    for (var i = 0; i < searchterms.length; i++) {
+      var word = searchterms[i];
+      // no match but word was a required one
+      if ((files = terms[word]) == null)
+        break;
+      if (files.length == undefined) {
+        files = [files];
+      }
+      // create the mapping
+      for (var j = 0; j < files.length; j++) {
+        var file = files[j];
+        if (file in fileMap)
+          fileMap[file].push(word);
+        else
+          fileMap[file] = [word];
+      }
+    }
+
+    // now check if the files don't contain excluded terms
+    for (var file in fileMap) {
+      var valid = true;
+
+      // check if all requirements are matched
+      if (fileMap[file].length != searchterms.length)
+        continue;
+
+      // ensure that none of the excluded terms is in the
+      // search result.
+      for (var i = 0; i < excluded.length; i++) {
+        if (terms[excluded[i]] == file ||
+            $.contains(terms[excluded[i]] || [], file)) {
+          valid = false;
+          break;
+        }
+      }
+
+      // if we have still a valid result we can add it
+      // to the result list
+      if (valid)
+        regularResults.push([filenames[file], titles[file], '', null]);
+    }
+
+    // delete unused variables in order to not waste
+    // memory until list is retrieved completely
+    delete filenames, titles, terms;
+
+    // now sort the regular results descending by title
+    regularResults.sort(function(a, b) {
+      var left = a[1].toLowerCase();
+      var right = b[1].toLowerCase();
+      return (left > right) ? -1 : ((left < right) ? 1 : 0);
+    });
+
+    // combine both
+    var results = regularResults.concat(objectResults);
+
+    // print the results
+    var resultCount = results.length;
+    function displayNextItem() {
+      // results left, load the summary and display it
+      if (results.length) {
+        var item = results.pop();
+        var listItem = $('<li style="display:none"></li>');
+        listItem.append($('<a/>').attr(
+          'href',
+          item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
+          highlightstring + item[2]).html(item[1]));
+        if (item[3]) {
+          listItem.append($('<span> (' + item[3] + ')</span>'));
+          Search.output.append(listItem);
+          listItem.slideDown(5, function() {
+            displayNextItem();
+          });
+        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
+          $.get('_sources/' + item[0] + '.txt', function(data) {
+            listItem.append($.makeSearchSummary(data, searchterms, hlterms));
+            Search.output.append(listItem);
+            listItem.slideDown(5, function() {
+              displayNextItem();
+            });
+          });
+        } else {
+          // no source available, just display title
+          Search.output.append(listItem);
+          listItem.slideDown(5, function() {
+            displayNextItem();
+          });
+        }
+      }
+      // search finished, update title and status message
+      else {
+        Search.stopPulse();
+        Search.title.text(_('Search Results'));
+        if (!resultCount)
+          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
+        else
+            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
+        Search.status.fadeIn(500);
+      }
+    }
+    displayNextItem();
+  }
+}
+
+$(document).ready(function() {
+  Search.init();
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/sphinxdoc.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,557 @@
+/**
+ * Alternate Sphinx design
+ * Originally created by Armin Ronacher for Werkzeug, adapted by Georg Brandl.
+ */
+
+body {
+    font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif;
+    font-size: 14px;
+    letter-spacing: -0.01em;
+    line-height: 150%;
+    text-align: center;
+    /*background-color: #AFC1C4; */
+    background-color: #BFD1D4;
+    color: black;
+    padding: 0;
+    border: 1px solid #aaa;
+
+    margin: 0px 80px 0px 80px;
+    min-width: 740px;
+}
+
+a {
+    color: #CA7900;
+    text-decoration: none;
+}
+
+a:hover {
+    color: #2491CF;
+}
+
+pre {
+    font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+    font-size: 0.95em;
+    letter-spacing: 0.015em;
+    padding: 0.5em;
+    border: 1px solid #ccc;
+    background-color: #f8f8f8;
+}
+
+td.linenos pre {
+    padding: 0.5em 0;
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    margin-left: 0.5em;
+}
+
+table.highlighttable td {
+    padding: 0 0.5em 0 0.5em;
+}
+
+cite, code, tt {
+    font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+    font-size: 0.95em;
+    letter-spacing: 0.01em;
+}
+
+hr {
+    border: 1px solid #abc;
+    margin: 2em;
+}
+
+tt {
+    background-color: #f2f2f2;
+    border-bottom: 1px solid #ddd;
+    color: #333;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+    border: 0;
+}
+
+tt.descclassname {
+    background-color: transparent;
+    border: 0;
+}
+
+tt.xref {
+    background-color: transparent;
+    font-weight: bold;
+    border: 0;
+}
+
+a tt {
+    background-color: transparent;
+    font-weight: bold;
+    border: 0;
+    color: #CA7900;
+}
+
+a tt:hover {
+    color: #2491CF;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+dl {
+    margin-bottom: 15px;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+.refcount {
+    color: #060;
+}
+
+dt:target,
+.highlight {
+    background-color: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+pre {
+    line-height: 120%;
+}
+
+pre a {
+    color: inherit;
+    text-decoration: underline;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+div.document {
+    background-color: white;
+    text-align: left;
+    background-image: url(contents.png);
+    background-repeat: repeat-x;
+}
+
+/*
+div.documentwrapper {
+    width: 100%;
+}
+*/
+
+div.clearer {
+    clear: both;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    background-image: url(navigation.png);
+    height: 2em;
+    list-style: none;
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 0;
+    padding-left: 10px;
+}
+
+div.related ul li {
+    margin: 0;
+    padding: 0;
+    height: 2em;
+    float: left;
+}
+
+div.related ul li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+div.related ul li a {
+    margin: 0;
+    padding: 0 5px 0 5px;
+    line-height: 1.75em;
+    color: #EE9816;
+}
+
+div.related ul li a:hover {
+    color: #3CA8E7;
+}
+
+div.body {
+    margin: 0;
+    padding: 0.5em 20px 20px 20px;
+}
+
+div.bodywrapper {
+    margin: 0 240px 0 0;
+    border-right: 1px solid #ccc;
+}
+
+div.body a {
+    text-decoration: underline;
+}
+
+div.sphinxsidebar {
+    margin: 0;
+    padding: 0.5em 15px 15px 0;
+    width: 210px;
+    float: right;
+    text-align: left;
+/*    margin-left: -100%; */
+}
+
+div.sphinxsidebar h4, div.sphinxsidebar h3 {
+    margin: 1em 0 0.5em 0;
+    font-size: 0.9em;
+    padding: 0.1em 0 0.1em 0.5em;
+    color: white;
+    border: 1px solid #86989B;
+    background-color: #AFC1C4;
+}
+
+div.sphinxsidebar h3 a {
+    color: white;
+}
+
+div.sphinxsidebar ul {
+    padding-left: 1.5em;
+    margin-top: 7px;
+    list-style: none;
+    padding: 0;
+    line-height: 130%;
+}
+
+div.sphinxsidebar ul ul {
+    list-style: square;
+    margin-left: 20px;
+}
+
+p {
+    margin: 0.8em 0 0.5em 0;
+}
+
+p.rubric {
+    font-weight: bold;
+}
+
+div.sidebar {
+    margin: 0 0 0.5em 1em;
+    border: 1px solid #ddb;
+    padding: 7px 7px 0 7px;
+    background-color: #ffe;
+    width: 40%;
+    float: right;
+}
+
+div.quotebar {
+    background-color: #f8f8f8;
+    max-width: 250px;
+    float: right;
+    padding: 2px 7px;
+    border: 1px solid #ccc;
+}
+
+p.sidebar-title {
+    font-weight: bold;
+}
+
+div.topic {
+    background-color: #f8f8f8;
+    border: 1px solid #ccc;
+    padding: 7px 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+}
+
+h1 {
+    margin: 0;
+    padding: 0.7em 0 0.3em 0;
+    font-size: 1.5em;
+    color: #11557C;
+}
+
+h2 {
+    margin: 1.3em 0 0.2em 0;
+    font-size: 1.35em;
+    padding: 0;
+}
+
+h3 {
+    margin: 1em 0 -0.3em 0;
+    font-size: 1.2em;
+}
+
+div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a {
+    color: black!important;
+}
+
+h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor {
+    display: none;
+    margin: 0 0 0 0.3em;
+    padding: 0 0.2em 0 0.2em;
+    color: #aaa!important;
+}
+
+h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor,
+h5:hover a.anchor, h6:hover a.anchor {
+    display: inline;
+}
+
+h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover,
+h5 a.anchor:hover, h6 a.anchor:hover {
+    color: #777;
+    background-color: #eee;
+}
+
+table {
+    border-collapse: collapse;
+    margin: 0 -0.5em 0 -0.5em;
+}
+
+table td, table th {
+    padding: 0.2em 0.5em 0.2em 0.5em;
+}
+
+div.footer {
+    background-color: #E3EFF1;
+    color: #86989B;
+    padding: 3px 8px 3px 0;
+    clear: both;
+    font-size: 0.8em;
+    text-align: right;
+}
+
+div.footer a {
+    color: #86989B;
+    text-decoration: underline;
+}
+
+div.pagination {
+    margin-top: 2em;
+    padding-top: 0.5em;
+    border-top: 1px solid black;
+    text-align: center;
+}
+
+div.sphinxsidebar ul.toc {
+    margin: 1em 0 1em 0;
+    padding: 0 0 0 0.5em;
+    list-style: none;
+}
+
+div.sphinxsidebar ul.toc li {
+    margin: 0.5em 0 0.5em 0;
+    font-size: 0.9em;
+    line-height: 130%;
+}
+
+div.sphinxsidebar ul.toc li p {
+    margin: 0;
+    padding: 0;
+}
+
+div.sphinxsidebar ul.toc ul {
+    margin: 0.2em 0 0.2em 0;
+    padding: 0 0 0 1.8em;
+}
+
+div.sphinxsidebar ul.toc ul li {
+    padding: 0;
+}
+
+div.admonition, div.warning {
+    font-size: 0.9em;
+    margin: 1em 0 0 0;
+    border: 1px solid #86989B;
+    background-color: #f7f7f7;
+}
+
+div.admonition p, div.warning p {
+    margin: 0.5em 1em 0.5em 1em;
+    padding: 0;
+}
+
+div.admonition pre, div.warning pre {
+    margin: 0.4em 1em 0.4em 1em;
+}
+
+div.admonition p.admonition-title,
+div.warning p.admonition-title {
+    margin: 0;
+    padding: 0.1em 0 0.1em 0.5em;
+    color: white;
+    border-bottom: 1px solid #86989B;
+    font-weight: bold;
+    background-color: #AFC1C4;
+}
+
+div.warning {
+    border: 1px solid #940000;
+}
+
+div.warning p.admonition-title {
+    background-color: #CF0000;
+    border-bottom-color: #940000;
+}
+
+div.admonition ul, div.admonition ol,
+div.warning ul, div.warning ol {
+    margin: 0.1em 0.5em 0.5em 3em;
+    padding: 0;
+}
+
+div.versioninfo {
+    margin: 1em 0 0 0;
+    border: 1px solid #ccc;
+    background-color: #DDEAF0;
+    padding: 8px;
+    line-height: 1.3em;
+    font-size: 0.9em;
+}
+
+
+a.headerlink {
+    color: #c60f0f!important;
+    font-size: 1em;
+    margin-left: 6px;
+    padding: 0 4px 0 4px;
+    text-decoration: none!important;
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+    visibility: visible;
+}
+
+a.headerlink:hover {
+    background-color: #ccc;
+    color: white!important;
+}
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+form.pfform {
+    margin: 10px 0 20px 0;
+}
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+img.math {
+    vertical-align: center;
+}
+
+div.math {
+    text-align: center;
+}
+
+span.eqno {
+    float: right;
+}
+
+img.logo {
+    border: 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/stickysidebar.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,19 @@
+/**
+ * Sphinx Doc Design -- Sticky sidebar Overrides
+ */
+
+div.sphinxsidebar {
+    top: 30px;
+    left: 0px;
+    position: fixed;
+    margin: 0;
+    float: none;
+}
+
+div.related {
+    position: fixed;
+}
+
+div.documentwrapper {
+    margin-top: 30px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/static/traditional.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,700 @@
+/**
+ * Sphinx Doc Design -- traditional python.org style
+ */
+
+body {
+    color: #000;
+    margin: 0;
+    padding: 0;
+}
+
+/* :::: LAYOUT :::: */
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 230px 0 0;
+}
+
+div.body {
+    background-color: white;
+    padding: 0 20px 30px 20px;
+}
+
+div.sphinxsidebarwrapper {
+    border: 1px solid #99ccff;
+    padding: 10px;
+    margin: 10px 15px 10px 0;
+}
+
+div.sphinxsidebar {
+    float: right;
+    margin-left: -100%;
+    width: 230px;
+}
+
+div.clearer {
+    clear: both;
+}
+
+div.footer {
+    clear: both;
+    width: 100%;
+    background-color: #99ccff;
+    padding: 9px 0 9px 0;
+    text-align: center;
+}
+
+div.related {
+    background-color: #99ccff;
+    color: #333;
+    width: 100%;
+    height: 30px;
+    line-height: 30px;
+    border-bottom: 5px solid white;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+    font-weight: bold;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+/* ::: SIDEBAR :::: */
+div.sphinxsidebar h3 {
+    margin: 0;
+}
+
+div.sphinxsidebar h4 {
+    margin: 5px 0 0 0;
+}
+
+div.sphinxsidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+    margin: 10px;
+    margin-left: 15px;
+    padding: 0;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+
+/* :::: SEARCH :::: */
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* :::: COMMON FORM STYLES :::: */
+
+div.actions {
+    border-top: 1px solid #aaa;
+    background-color: #ddd;
+    margin: 10px 0 0 -20px;
+    padding: 5px 0 5px 20px;
+}
+
+form dl {
+    color: #333;
+}
+
+form dt {
+    clear: both;
+    float: left;
+    min-width: 110px;
+    margin-right: 10px;
+    padding-top: 2px;
+}
+
+input#homepage {
+    display: none;
+}
+
+div.error {
+    margin: 5px 20px 0 0;
+    padding: 5px;
+    border: 1px solid #d00;
+    /*border: 2px solid #05171e;
+    background-color: #092835;
+    color: white;*/
+    font-weight: bold;
+}
+
+/* :::: INLINE COMMENTS :::: */
+
+div.inlinecommentswrapper {
+    float: right;
+    max-width: 40%;
+}
+
+div.commentmarker {
+    float: right;
+    background-image: url(style/comment.png);
+    background-repeat: no-repeat;
+    width: 25px;
+    height: 25px;
+    text-align: center;
+    padding-top: 3px;
+}
+
+div.nocommentmarker {
+    float: right;
+    background-image: url(style/nocomment.png);
+    background-repeat: no-repeat;
+    width: 25px;
+    height: 25px;
+}
+
+div.inlinecomments {
+    margin-left: 10px;
+    margin-bottom: 5px;
+    background-color: #eee;
+    border: 1px solid #ccc;
+    padding: 5px;
+}
+
+div.inlinecomment {
+    border-top: 1px solid #ccc;
+    padding-top: 5px;
+    margin-top: 5px;
+}
+
+.inlinecomments p {
+    margin: 5px 0 5px 0;
+}
+
+.inlinecomments .head {
+    font-weight: bold;
+}
+
+.inlinecomments .meta {
+    font-style: italic;
+}
+
+
+/* :::: COMMENTS :::: */
+
+div#comments h3 {
+    border-top: 1px solid #aaa;
+    padding: 5px 20px 5px 20px;
+    margin: 20px -20px 20px -20px;
+    background-color: #ddd;
+}
+
+/*
+div#comments {
+    background-color: #ccc;
+    margin: 40px -20px -30px -20px;
+    padding: 0 0 1px 0;
+}
+
+div#comments h4 {
+    margin: 30px 0 20px 0;
+    background-color: #aaa;
+    border-bottom: 1px solid #09232e;
+    color: #333;
+}
+
+div#comments form {
+    display: block;
+    margin: 0 0 0 20px;
+}
+
+div#comments textarea {
+    width: 98%;
+    height: 160px;
+}
+
+div#comments div.help {
+    margin: 20px 20px 10px 0;
+    background-color: #ccc;
+    color: #333;
+}
+
+div#comments div.help p {
+    margin: 0;
+    padding: 0 0 10px 0;
+}
+
+div#comments input, div#comments textarea {
+    font-family: 'Bitstream Vera Sans', 'Arial', sans-serif;
+    font-size: 13px;
+    color: black;
+    background-color: #aaa;
+    border: 1px solid #092835;
+}
+
+div#comments input[type="reset"],
+div#comments input[type="submit"] {
+    cursor: pointer;
+    font-weight: bold;
+    padding: 2px;
+    margin: 5px 5px 5px 0;
+    background-color: #666;
+    color: white;
+}
+
+div#comments div.comment {
+    margin: 10px 10px 10px 20px;
+    padding: 10px;
+    border: 1px solid #0f3646;
+    background-color: #aaa;
+    color: #333;
+}
+
+div#comments div.comment p {
+    margin: 5px 0 5px 0;
+}
+
+div#comments div.comment p.meta {
+    font-style: italic;
+    color: #444;
+    text-align: right;
+    margin: -5px 0 -5px 0;
+}
+
+div#comments div.comment h4 {
+    margin: -10px -10px 5px -10px;
+    padding: 3px;
+    font-size: 15px;
+    background-color: #888;
+    color: white;
+    border: 0;
+}
+
+div#comments div.comment pre,
+div#comments div.comment tt {
+    background-color: #ddd;
+    color: #111;
+    border: none;
+}
+
+div#comments div.comment a {
+    color: #fff;
+    text-decoration: underline;
+}
+
+div#comments div.comment blockquote {
+    margin: 10px;
+    padding: 10px;
+    border-left: 1px solid #0f3646;
+    /*border: 1px solid #0f3646;
+    background-color: #071c25;*/
+}
+
+div#comments em.important {
+    color: #d00;
+    font-weight: bold;
+    font-style: normal;
+}*/
+
+/* :::: SUGGEST CHANGES :::: */
+div#suggest-changes-box input, div#suggest-changes-box textarea {
+    border: 1px solid #ccc;
+    background-color: white;
+    color: black;
+}
+
+div#suggest-changes-box textarea {
+    width: 99%;
+    height: 400px;
+}
+
+
+/* :::: PREVIEW :::: */
+div.preview {
+    background-image: url(style/preview.png);
+    padding: 0 20px 20px 20px;
+    margin-bottom: 30px;
+}
+
+
+/* :::: INDEX PAGE :::: */
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.5em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+}
+
+/* :::: GENINDEX STYLES :::: */
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+/* :::: GLOBAL STYLES :::: */
+
+p.subhead {
+    font-weight: bold;
+    margin-top: 20px;
+}
+
+a:link:active           { color: #ff0000; }
+a:link:hover            { background-color: #bbeeff; }
+a:visited:hover         { background-color: #bbeeff; }
+a:visited               { color: #551a8b; }
+a:link                  { color: #0000bb; }
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: avantgarde, sans-serif;
+    font-weight: bold;
+}
+
+div.body h1 { font-size: 180%; }
+div.body h2 { font-size: 150%; }
+div.body h3 { font-size: 120%; }
+div.body h4 { font-size: 120%; }
+
+a.headerlink,
+a.headerlink,
+a.headerlink,
+a.headerlink,
+a.headerlink,
+a.headerlink {
+    color: #c60f0f;
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+    visibility: hidden;
+}
+
+*:hover > a.headerlink,
+*:hover > a.headerlink,
+*:hover > a.headerlink,
+*:hover > a.headerlink,
+*:hover > a.headerlink,
+*:hover > a.headerlink {
+    visibility: visible;
+}
+
+a.headerlink:hover,
+a.headerlink:hover,
+a.headerlink:hover,
+a.headerlink:hover,
+a.headerlink:hover,
+a.headerlink:hover {
+    background-color: #c60f0f;
+    color: white;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+}
+
+div.body td {
+    text-align: left;
+}
+
+ul.fakelist {
+    list-style: none;
+    margin: 10px 0 10px 20px;
+    padding: 0;
+}
+
+/* "Footnotes" heading */
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+/* "Topics" */
+
+div.topic {
+    background-color: #eee;
+    border: 1px solid #ccc;
+    padding: 0 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* Admonitions */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+div.admonition dd {
+    margin-bottom: 10px;
+}
+
+div.admonition dl {
+    margin-bottom: 0;
+}
+
+div.admonition p {
+    display: inline;
+}
+
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+    display: inline;
+}
+
+p.admonition-title:after {
+    content: ":";
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+table.docutils {
+    border: 0;
+}
+
+table.docutils td, table.docutils th {
+    padding: 0 8px 2px 0;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+    border: 0 !important;
+}
+
+dl {
+    margin-bottom: 15px;
+    clear: both;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+.refcount {
+    color: #060;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+pre {
+    font-family: monospace;
+    padding: 5px;
+    color: #00008b;
+    border-left: none;
+    border-right: none;
+}
+
+tt {
+    font-family: monospace;
+    background-color: #ecf0f3;
+    padding: 0 1px 0 1px;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+}
+
+tt.descclassname {
+    background-color: transparent;
+}
+
+tt.xref, a tt {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+.footnote:target  { background-color: #ffa }
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+    background-color: transparent;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+form.comment {
+    margin: 0;
+    padding: 10px 30px 10px 30px;
+    background-color: #eee;
+}
+
+form.comment h3 {
+    background-color: #326591;
+    color: white;
+    margin: -10px -30px 10px -30px;
+    padding: 5px;
+    font-size: 1.4em;
+}
+
+form.comment input,
+form.comment textarea {
+    border: 1px solid #ccc;
+    padding: 2px;
+    font-family: sans-serif;
+    font-size: 13px;
+}
+
+form.comment input[type="text"] {
+    width: 240px;
+}
+
+form.comment textarea {
+    width: 100%;
+    height: 200px;
+    margin-bottom: 10px;
+}
+
+/* :::: PRINT :::: */
+@media print {
+    div.documentwrapper {
+        width: 100%;
+    }
+
+    div.body {
+        margin: 0;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    div#comments div.new-comment-box,
+    #top-link {
+        display: none;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/frameset.html	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
+  "http://www.w3.org/TR/html4/frameset.dtd">
+<html>
+  <head>
+    <title>{% trans version=version|e, docstitle=docstitle|e %}Changes in Version {{ version }} &mdash; {{ docstitle }}{% endtrans %}</title>
+  </head>
+  <frameset cols="45%,*">
+    <frame name="main" src="changes.html">
+    <frame name="src" src="about:blank">
+  </frameset>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/rstsource.html	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+  "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+  <head>
+    <title>{% trans filename=filename, docstitle=docstitle|e %}{{ filename }} &mdash; {{ docstitle }}{% endtrans %}</title>
+    <style type="text/css">
+      .hl { background-color: yellow }
+    </style>
+  </head>
+  <body style="font-size: 90%">
+    <pre>
+      {{ text }}
+    </pre>
+  </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/changes/versionchanges.html	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,33 @@
+{% macro entries changes %}
+<ul>{% for entry, docname, lineno in changes %}
+<li><a href="rst/{{ docname }}.html#L{{ lineno-10 }}" target="src">{{ entry }}</a></li>
+{% endfor %}</ul>
+{% endmacro -%}
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+  "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+  <head>
+    <link rel="stylesheet" href="default.css">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>{% trans version=version|e, docstitle=docstitle|e %}Changes in Version {{ version }} &mdash; {{ docstitle }}{% endtrans %}</title>
+  </head>
+  <body>
+    <div class="document">
+      <div class="body">
+    <h1>{% trans version=version|e %}Automatically generated list of changes in version {{ version }}{% endtrans %}</h1>
+    <h2>{{ _('Library changes') }}</h2>
+    {% for modname, changes in libchanges %}
+    <h4>{{ modname }}</h4>
+    {{ entries(changes) }}
+    {% endfor %}
+    <h2>{{ _('C API changes') }}</h2>
+    {{ entries(apichanges) }}
+    <h2>{{ _('Other changes') }}</h2>
+    {% for (fn, title), changes in otherchanges %}
+    <h4>{{ title }} <span style="font-size: 50%">({{ fn }})</span></h4>
+    {{ entries(changes) }}
+    {% endfor %}
+      </div>
+    </div>
+  </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/defindex.html	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,26 @@
+{% extends "layout.html" %}
+{% set title = _('Overview') %}
+{% block body %}
+  <h1>{{ docstitle|e }}</h1>
+  <p>
+    Welcome! This is
+    {% block description %}the documentation for {{ project|e }}
+    {{ release|e }}{% if last_updated %}, last updated {{ last_updated|e }}{% endif %}{% endblock %}.
+  </p>
+  {% block tables %}
+  <p><strong>{{ _('Indices and tables:') }}</strong></p>
+  <table class="contentstable" align="center"><tr>
+    <td width="50%">
+      <p class="biglink"><a class="biglink" href="{{ pathto("contents") }}">{{ _('Complete Table of Contents') }}</a><br>
+         <span class="linkdescr">{{ _('lists all sections and subsections') }}</span></p>
+      <p class="biglink"><a class="biglink" href="{{ pathto("search") }}">{{ _('Search Page') }}</a><br>
+         <span class="linkdescr">{{ _('search this documentation') }}</span></p>
+    </td><td width="50%">
+      <p class="biglink"><a class="biglink" href="{{ pathto("modindex") }}">{{ _('Global Module Index') }}</a><br>
+         <span class="linkdescr">{{ _('quick access to all modules') }}</span></p>
+      <p class="biglink"><a class="biglink" href="{{ pathto("genindex") }}">{{ _('General Index') }}</a><br>
+         <span class="linkdescr">{{ _('all functions, classes, terms') }}</span></p>
+    </td></tr>
+  </table>
+  {% endblock %}
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex-single.html	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,46 @@
+{% extends "layout.html" %}
+{% set title = _('Index') %}
+{% block body %}
+
+   <h1 id="index">{% trans key=key %}Index &ndash; {{ key }}{% endtrans %}</h1>
+
+<table width="100%" class="indextable"><tr><td width="33%" valign="top">
+<dl>
+{%- set breakat = count // 2 %}
+{%- set numcols = 1 %}
+{%- set numitems = 0 %}
+{% for entryname, (links, subitems) in entries %}
+<dt>{%- if links -%}<a href="{{ links[0] }}">{{ entryname|e }}</a>
+  {%- for link in links[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
+  {%- else -%}
+{{ entryname|e }}
+  {%- endif -%}</dt>
+  {%- if subitems %}
+  <dd><dl>
+    {%- for subentryname, subentrylinks in subitems %}
+    <dt><a href="{{ subentrylinks[0] }}">{{ subentryname|e }}</a>
+    {%- for link in subentrylinks[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
+    </dt>
+    {%- endfor %}
+  </dl></dd>
+  {%- endif -%}
+{%- set numitems = numitems + 1 + (subitems|length) -%}
+{%- if numcols < 2 and numitems > breakat -%}
+{%- set numcols = numcols+1 -%}
+</dl></td><td width="33%" valign="top"><dl>
+{%- endif -%}
+{%- endfor %}
+</dl></td></tr></table>
+
+{% endblock %}
+
+{% block sidebarrel %}
+   <h4>Index</h4>
+   <p>{% for key, dummy in genindexentries -%}
+   <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
+     {% if not loop.last %}| {% endif %}
+   {%- endfor %}</p>
+
+   <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
+   {{ super() }}
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex-split.html	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,30 @@
+{% extends "layout.html" %}
+{% set title = _('Index') %}
+{% block body %}
+
+   <h1 id="index">{{ _('Index') }}</h1>
+
+   <p>{{ _('Index pages by letter') }}:</p>
+
+   <p>{% for key, dummy in genindexentries -%}
+   <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
+     {% if not loop.last %}| {% endif %}
+   {%- endfor %}</p>
+
+   <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong>
+                                               ({{ _('can be huge') }})</a></p>
+
+{% endblock %}
+
+{% block sidebarrel %}
+{% if split_index %}
+   <h4>Index</h4>
+   <p>{% for key, dummy in genindexentries -%}
+   <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
+     {% if not loop.last %}| {% endif %}
+   {%- endfor %}</p>
+
+   <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
+{% endif %}
+   {{ super() }}
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/genindex.html	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,57 @@
+{% extends "layout.html" %}
+{% set title = _('Index') %}
+{% block body %}
+
+   <h1 id="index">{{ _('Index') }}</h1>
+
+   {% for key, dummy in genindexentries -%}
+   <a href="#{{ key }}"><strong>{{ key }}</strong></a> {% if not loop.last %}| {% endif %}
+   {%- endfor %}
+
+   <hr />
+
+   {% for key, entries in genindexentries %}
+<h2 id="{{ key }}">{{ key }}</h2>
+<table width="100%" class="indextable"><tr><td width="33%" valign="top">
+<dl>
+{%- set breakat = genindexcounts[loop.index0] // 2 %}
+{%- set numcols = 1 %}
+{%- set numitems = 0 %}
+{% for entryname, (links, subitems) in entries %}
+<dt>{%- if links -%}<a href="{{ links[0] }}">{{ entryname|e }}</a>
+  {%- for link in links[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
+  {%- else -%}
+{{ entryname|e }}
+  {%- endif -%}</dt>
+  {%- if subitems %}
+  <dd><dl>
+    {%- for subentryname, subentrylinks in subitems %}
+    <dt><a href="{{ subentrylinks[0] }}">{{ subentryname|e }}</a>
+    {%- for link in subentrylinks[1:] %}, <a href="{{ link }}">[{{ loop.index }}]</a>{% endfor -%}
+    </dt>
+    {%- endfor %}
+  </dl></dd>
+  {%- endif -%}
+{%- set numitems = numitems + 1 + (subitems|length) -%}
+{%- if numcols < 2 and numitems > breakat -%}
+{%- set numcols = numcols+1 -%}
+</dl></td><td width="33%" valign="top"><dl>
+{%- endif -%}
+{%- endfor %}
+</dl></td></tr></table>
+{% endfor %}
+
+{% endblock %}
+
+{% block sidebarrel %}
+{% if split_index %}
+   <h4>{{ _('Index') }}</h4>
+   <p>{% for key, dummy in genindexentries -%}
+   <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
+     {% if not loop.last %}| {% endif %}
+   {%- endfor %}</p>
+
+   <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
+{% endif %}
+   {{ super() }}
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/layout.html	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,192 @@
+{%- block doctype -%}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+{%- endblock %}
+{%- set reldelim1 = reldelim1 is not defined and ' &raquo;' or reldelim1 %}
+{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
+{%- macro relbar %}
+    <div class="related">
+      <h3>{{ _('Navigation') }}</h3>
+      <ul>
+        {%- for rellink in rellinks %}
+        <li class="right" {% if loop.first %}style="margin-right: 10px"{% endif %}>
+          <a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags }}"
+             accesskey="{{ rellink[2] }}">{{ rellink[3] }}</a>
+          {%- if not loop.first %}{{ reldelim2 }}{% endif %}</li>
+        {%- endfor %}
+        {%- block rootrellink %}
+        <li><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a>{{ reldelim1 }}</li>
+        {%- endblock %}
+        {%- for parent in parents %}
+          <li><a href="{{ parent.link|e }}" accesskey="U">{{ parent.title }}</a>{{ reldelim1 }}</li>
+        {%- endfor %}
+        {%- block relbaritems %} {% endblock %}
+      </ul>
+    </div>
+{%- endmacro %}
+{%- macro sidebar %}
+      {%- if builder != 'htmlhelp' %}
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+          {%- block sidebarlogo %}
+          {%- if logo %}
+            <p class="logo"><a href="{{ pathto(master_doc) }}">
+              <img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
+            </a></p>
+          {%- endif %}
+          {%- endblock %}
+          {%- block sidebartoc %}
+          {%- if display_toc %}
+            <h3><a href="{{ pathto(master_doc) }}">{{ _('Table Of Contents') }}</a></h3>
+            {{ toc }}
+          {%- endif %}
+          {%- endblock %}
+          {%- block sidebarrel %}
+          {%- if prev %}
+            <h4>{{ _('Previous topic') }}</h4>
+            <p class="topless"><a href="{{ prev.link|e }}" title="{{ _('previous chapter') }}">{{ prev.title }}</a></p>
+          {%- endif %}
+          {%- if next %}
+            <h4>{{ _('Next topic') }}</h4>
+            <p class="topless"><a href="{{ next.link|e }}" title="{{ _('next chapter') }}">{{ next.title }}</a></p>
+          {%- endif %}
+          {%- endblock %}
+          {%- if sourcename %}
+            <h3>{{ _('This Page') }}</h3>
+            <ul class="this-page-menu">
+            {%- if builder == 'web' %}
+              <li><a href="#comments">Comments ({{ comments|length }} so far)</a></li>
+              <li><a href="{{ pathto('@edit/' + sourcename)|e }}">{{ _('Suggest Change') }}</a></li>
+              <li><a href="{{ pathto('@source/' + sourcename)|e }}">{{ _('Show Source') }}</a></li>
+            {%- elif builder == 'html' %}
+              <li><a href="{{ pathto('_sources/' + sourcename, true)|e }}">{{ _('Show Source') }}</a></li>
+            {%- endif %}
+            </ul>
+          {%- endif %}
+          {%- if customsidebar %}
+          {{ rendertemplate(customsidebar) }}
+          {%- endif %}
+          {%- block sidebarsearch %}
+          {%- if pagename != "search" %}
+          <h3>{% if builder == 'web' %}{{ _('Keyword search')}}{% else %}{{ _('Quick search') }}{% endif %}</h3>
+            <form class="search" action="{{ pathto('search') }}" method="get">
+              <input type="text" name="q" size="18" /> <input type="submit" value="{{ _('Go') }}" />
+              <input type="hidden" name="check_keywords" value="yes" />
+              <input type="hidden" name="area" value="default" />
+            </form>
+            {%- if builder == 'web' %}
+            <p style="font-size: 90%">{{ _('Enter a module, class or function name.') }}</p>
+            {%- endif %}
+          {%- endif %}
+          {%- endblock %}
+        </div>
+      </div>
+      {%- endif %}
+{%- endmacro -%}
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    {{ metatags }}
+    {%- if builder != 'htmlhelp' %}
+      {%- set titlesuffix = " &mdash; " + docstitle|e %}
+    {%- endif %}
+    <title>{{ title|striptags }}{{ titlesuffix }}</title>
+    {%- if builder == 'web' %}
+    <link rel="stylesheet" href="{{ pathto('index') }}?do=stylesheet{%
+      if in_admin_panel %}&admin=yes{% endif %}" type="text/css" />
+    {%- for link, type, title in page_links %}
+    <link rel="alternate" type="{{ type|e(true) }}" title="{{ title|e(true) }}" href="{{ link|e(true) }}" />
+    {%- endfor %}
+    {%- else %}
+    <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
+    <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
+    {%- endif %}
+    {%- if builder != 'htmlhelp' %}
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    '{{ pathto("", 1) }}',
+        VERSION:     '{{ release|e }}',
+        COLLAPSE_MODINDEX: false,
+        FILE_SUFFIX: '{{ file_suffix }}',
+        HAS_SOURCE:  {{ has_source|lower }}
+      };
+    </script>
+    {%- for scriptfile in script_files %}
+    <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
+    {%- endfor %}
+    {%- if use_opensearch %}
+    <link rel="search" type="application/opensearchdescription+xml"
+          title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
+          href="{{ pathto('_static/opensearch.xml', 1) }}"/>
+    {%- endif %}
+    {%- if favicon %}
+    <link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
+    {%- endif %}
+    {%- endif %}
+{%- block linktags %}
+    {%- if hasdoc('about') %}
+    <link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
+    {%- endif %}
+    <link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
+    <link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
+    {%- if hasdoc('copyright') %}
+    <link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
+    {%- endif %}
+    <link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}" />
+    {%- if parents %}
+    <link rel="up" title="{{ parents[-1].title|striptags }}" href="{{ parents[-1].link|e }}" />
+    {%- endif %}
+    {%- if next %}
+    <link rel="next" title="{{ next.title|striptags }}" href="{{ next.link|e }}" />
+    {%- endif %}
+    {%- if prev %}
+    <link rel="prev" title="{{ prev.title|striptags }}" href="{{ prev.link|e }}" />
+    {%- endif %}
+{%- endblock %}
+{%- block extrahead %} {% endblock %}
+  </head>
+  <body>
+
+{%- block relbar1 %}{{ relbar() }}{% endblock %}
+
+{%- block sidebar1 %} {# possible location for sidebar #} {% endblock %}
+
+{%- block document %}
+    <div class="document">
+      <div class="documentwrapper">
+      {%- if builder != 'htmlhelp' %}
+        <div class="bodywrapper">
+      {%- endif %}
+          <div class="body">
+            {% block body %} {% endblock %}
+          </div>
+      {%- if builder != 'htmlhelp' %}
+        </div>
+      {%- endif %}
+      </div>
+{%- endblock %}
+
+{%- block sidebar2 %}{{ sidebar() }}{% endblock %}
+      <div class="clearer"></div>
+    </div>
+
+{%- block relbar2 %}{{ relbar() }}{% endblock %}
+
+{%- block footer %}
+    <div class="footer">
+    {%- if hasdoc('copyright') %}
+      {% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
+    {%- else %}
+      {% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
+    {%- endif %}
+    {%- if last_updated %}
+      {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
+    {%- endif %}
+    {%- if show_sphinx %}
+      {% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
+    {%- endif %}
+    </div>
+{%- endblock %}
+  </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/modindex.html	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,62 @@
+{% extends "layout.html" %}
+{% set title = _('Global Module Index') %}
+{% block extrahead %}
+{{ super() }}
+{% if builder != 'htmlhelp' and collapse_modindex %}
+    <script type="text/javascript">
+      DOCUMENTATION_OPTIONS.COLLAPSE_MODINDEX = true;
+    </script>
+{% endif %}
+{% endblock %}
+{% block body %}
+
+   <h1 id="global-module-index">{{ _('Global Module Index') }}</h1>
+{% if builder == 'web' and freqentries %}
+   <p>{{ _('Most popular modules:') }}</p>
+   <div class="modulecloud">
+   {%- for module in freqentries %}
+     <a href="../q/{{ module.name|e }}/" style="font-size: {{ module.size }}%">{{ module.name|e }}</a>
+   {%- endfor %}
+   </div>
+{% endif %}
+{% if builder == 'web' %}
+   <form class="pfform" action="" method="get">
+     {{ _('Show modules only available on these platforms') }}:<br>
+     {% for pl in platforms -%}
+     <input type="checkbox" name="pf" value="{{ pl }}" id="pl-{{ pl }}"
+            {%- if pl in showpf %} checked="checked"{% endif %}>
+     <label for="pl-{{ pl }}">{{ pl }}</label>
+     {% endfor %}
+     <input type="hidden" name="newpf" value="true">
+     <input type="submit" value="Apply">
+   </form>
+{% endif %}
+
+   {%- for letter in letters %}
+   <a href="#cap-{{ letter }}"><strong>{{ letter }}</strong></a> {% if not loop.last %}| {% endif %}
+   {%- endfor %}
+   <hr/>
+
+   <table width="100%" class="indextable" cellspacing="0" cellpadding="2">
+   {%- for modname, collapse, cgroup, indent, fname, synops, pform, dep in modindexentries %}
+   {%- if not modname -%}
+   <tr class="pcap"><td></td><td>&nbsp;</td><td></td></tr>
+   <tr class="cap"><td></td><td><a name="cap-{{ fname }}"><strong>{{ fname }}</strong></a></td><td></td></tr>
+   {%- else -%}
+   <tr{% if indent %} class="cg-{{ cgroup }}"{% endif %}>
+     <td>{% if collapse -%}
+       <img src="{{ pathto('_static/minus.png', 1) }}" id="toggle-{{ cgroup }}"
+            class="toggler" style="display: none" alt="-" />
+         {%- endif %}</td>
+     <td>{% if indent %}&nbsp;&nbsp;&nbsp;{% endif %}
+     {% if fname %}<a href="{{ fname }}">{% endif -%}
+     <tt class="xref">{{ modname|e }}</tt>
+     {%- if fname %}</a>{% endif %}
+   {%- if pform[0] %} <em>({{ pform|join(', ') }})</em>{% endif -%}
+   </td><td>{% if dep %}<strong>{{ _('Deprecated')}}:</strong>{% endif %}
+     <em>{{ synops|e }}</em></td></tr>
+   {%- endif -%}
+   {% endfor %}
+   </table>
+
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/opensearch.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
+  <ShortName>{{ project|e }}</ShortName>
+  <Description>{% trans docstitle=docstitle|e %}Search {{ docstitle }}{% endtrans %}</Description>
+  <InputEncoding>utf-8</InputEncoding>
+  <Url type="text/html" method="get"
+       template="{{ use_opensearch }}/{{ pathto('search') }}?q={searchTerms}&amp;check_keywords=yes&amp;area=default"/>
+  <LongName>{{ docstitle|e }}</LongName>
+{% block extra %} {# Put e.g. an <Image> element here. #} {% endblock %}
+</OpenSearchDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/page.html	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,12 @@
+{% extends "layout.html" %}
+{% set page_links = [
+  (pathto('@rss/' + sourcename), 'application/rss+xml', 'Page Comments'),
+] %}
+{% block body %}
+  {% if oldurl %}
+  <div class="docwarning">
+    {% trans %}<strong>Note:</strong> You requested an out-of-date URL from this server. We've tried to redirect you to the new location of this page, but it may not be the right one.{% endtrans %}
+  </div>
+  {% endif %}
+  {{ body }}
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/templates/search.html	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,38 @@
+{% extends "layout.html" %}
+{% set title = _('Search') %}
+{% set script_files = script_files + ['_static/searchtools.js'] %}
+{% block body %}
+  <h1 id="search-documentation">{{ _('Search') }}</h1>
+  <p>
+    {% trans %}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.{% endtrans %}
+  </p>
+  <form action="" method="get">
+    <input type="text" name="q" value="" />
+    <input type="submit" value="{{ _('search') }}" />
+    <span id="search-progress" style="padding-left: 10px"></span>
+  </form>
+  {% if search_performed %}
+    <h2>{{ _('Search Results') }}</h2>
+    {% if not search_results %}
+      <p>{{ _('Your search did not match any results.') }}</p>
+    {% endif %}
+  {% endif %}
+  <div id="search-results">
+  {% if search_results %}
+    <ul>
+    {% for href, caption, context in search_results %}
+      <li><a href="{{ pathto(item.href) }}">{{ caption }}</a>
+        <div class="context">{{ context|e }}</div>
+      </li>
+    {% endfor %}
+    </ul>
+  {% endif %}
+  </div>
+{% endblock %}
+{% block footer %}
+  {{ super() }}
+  <script type="text/javascript" src="searchindex.js"></script>
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/Makefile	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,56 @@
+# Makefile for Sphinx LaTeX output
+
+ALLDOCS = $(basename $(wildcard *.tex))
+ALLPDF = $(addsuffix .pdf,$(ALLDOCS))
+ALLDVI = $(addsuffix .dvi,$(ALLDOCS))
+
+# Prefix for archive names
+ARCHIVEPRREFIX =
+
+all: $(ALLPDF)
+all-pdf: $(ALLPDF)
+all-dvi: $(ALLDVI)
+all-ps: all-dvi
+	for f in *.dvi; do dvips $$f; done
+
+zip: all-$(FMT)
+	mkdir $(ARCHIVEPREFIX)docs-$(FMT)
+	cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT)
+	zip -q -r -9 $(ARCHIVEPREFIX)docs-$(FMT).zip $(ARCHIVEPREFIX)docs-$(FMT)
+	rm -r $(ARCHIVEPREFIX)docs-$(FMT)
+
+tar: all-$(FMT)
+	mkdir $(ARCHIVEPREFIX)docs-$(FMT)
+	cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT)
+	tar cf $(ARCHIVEPREFIX)docs-$(FMT).tar $(ARCHIVEPREFIX)docs-$(FMT)
+	rm -r $(ARCHIVEPREFIX)docs-$(FMT)
+
+bz2: tar
+	bzip2 -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar
+
+# The number of LaTeX runs is quite conservative, but I don't expect it
+# to get run often, so the little extra time won't hurt.
+%.dvi: %.tex
+	latex '$<'
+	latex '$<'
+	latex '$<'
+	-makeindex -s python.ist '$(basename $<).idx'
+	-makeindex -s python.ist '$(basename mod$<).idx'
+	latex '$<'
+	latex '$<'
+
+%.pdf: %.tex
+	pdflatex '$<'
+	pdflatex '$<'
+	pdflatex '$<'
+	-makeindex -s python.ist '$(basename $<).idx'
+	-makeindex -s python.ist '$(basename mod$<).idx'
+	pdflatex '$<'
+	pdflatex '$<'
+
+clean:
+	rm -f *.pdf *.dvi *.ps
+	rm -f *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla
+
+.PHONY: all all-pdf all-dvi all-ps clean
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/fncychap.sty	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,683 @@
+%%% Copyright   Ulf A. Lindgren
+%%%
+%%% Note        Premission is granted to modify this file under
+%%%             the condition that it is saved using another
+%%%             file and package name.
+%%%
+%%% Revision    1.1 (1997)
+%%%
+%%%             Jan. 8th Modified package name base date option
+%%%             Jan. 22th Modified FmN and FmTi for error in book.cls
+%%%                  \MakeUppercase{#}->{\MakeUppercase#}
+%%%             Apr. 6th Modified Lenny option to prevent undesired 
+%%%                  skip of line.
+%%%             Nov. 8th Fixed \@chapapp for AMS
+%%%
+%%% Revision    1.2 (1998)
+%%%
+%%%             Feb. 11th Fixed appendix problem related to Bjarne
+%%%             Aug. 11th Fixed problem related to 11pt and 12pt 
+%%%                  suggested by Tomas Lundberg. THANKS!
+%%%
+%%% Revision    1.3 (2004)
+%%%             Sep. 20th problem with frontmatter, mainmatter and
+%%%                  backmatter, pointed out by Lapo Mori
+%%%
+%%% Revision    1.31 (2004)
+%%%             Sep. 21th problem with the Rejne definition streched text
+%%%                  caused ugly gaps in the vrule aligned with the title
+%%%                  text. Kindly pointed out to me by Hendri Adriaens
+%%%
+%%% Revision    1.32 (2005)
+%%%             Jun. 23th compatibility problem with the KOMA class 'scrbook.cls'
+%%%                  a remedy is a redefinition of '\@schapter' in
+%%%                  line with that used in KOMA. The problem was pointed
+%%%                  out to me by Mikkel Holm Olsen
+%%%
+%%% Revision    1.33 (2005)
+%%%             Aug. 9th misspelled ``TWELV'' corrected, the error was pointed
+%%%                  out to me by George Pearson
+%%%
+%%% Revision    1.34 (2007)
+%%%             Added an alternative to Lenny provided by Peter
+%%%             Osborne (2005-11-28)
+%%%             Corrected front, main and back matter, based on input
+%%%             from Bas van Gils (2006-04-24)
+%%%             Jul. 30th Added Bjornstrup option provided by Jean-Marc
+%%%             Francois (2007-01-05).
+%%%             Reverted to \MakeUppercase{#} see rev 1.1, solved
+%%%             problem with MakeUppercase and MakeLowercase pointed
+%%%             out by Marco Feuerstein  (2007-06-06) 
+
+
+%%% Last modified   Jul. 2007
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesPackage{fncychap}
+             [2007/07/30 v1.34
+                 LaTeX package (Revised chapters)]
+
+%%%% For conditional inclusion of color
+\newif\ifusecolor
+\usecolorfalse
+
+
+
+%%%% DEFINITION OF Chapapp variables
+\newcommand{\CNV}{\huge\bfseries}
+\newcommand{\ChNameVar}[1]{\renewcommand{\CNV}{#1}}
+
+
+%%%% DEFINITION OF TheChapter variables
+\newcommand{\CNoV}{\huge\bfseries}
+\newcommand{\ChNumVar}[1]{\renewcommand{\CNoV}{#1}}
+
+\newif\ifUCN
+\UCNfalse
+\newif\ifLCN
+\LCNfalse
+\def\ChNameLowerCase{\LCNtrue\UCNfalse}
+\def\ChNameUpperCase{\UCNtrue\LCNfalse}
+\def\ChNameAsIs{\UCNfalse\LCNfalse}
+
+%%%%% Fix for AMSBook 971008
+
+\@ifundefined{@chapapp}{\let\@chapapp\chaptername}{}
+
+
+%%%%% Fix for Bjarne and appendix 980211
+
+\newif\ifinapp
+\inappfalse
+\renewcommand\appendix{\par
+  \setcounter{chapter}{0}%
+  \setcounter{section}{0}%
+  \inapptrue%
+  \renewcommand\@chapapp{\appendixname}%
+  \renewcommand\thechapter{\@Alph\c@chapter}}
+
+%%%%% Fix for frontmatter, mainmatter, and backmatter 040920
+
+\@ifundefined{@mainmatter}{\newif\if@mainmatter \@mainmattertrue}{}
+
+%%%%%
+
+
+
+\newcommand{\FmN}[1]{%
+\ifUCN
+   {\MakeUppercase{#1}}\LCNfalse
+\else
+   \ifLCN
+      {\MakeLowercase{#1}}\UCNfalse
+   \else #1
+   \fi
+\fi}
+
+
+%%%% DEFINITION OF Title variables
+\newcommand{\CTV}{\Huge\bfseries}
+\newcommand{\ChTitleVar}[1]{\renewcommand{\CTV}{#1}}
+
+%%%% DEFINITION OF the basic rule width
+\newlength{\RW}
+\setlength{\RW}{1pt}
+\newcommand{\ChRuleWidth}[1]{\setlength{\RW}{#1}}
+
+\newif\ifUCT
+\UCTfalse
+\newif\ifLCT
+\LCTfalse
+\def\ChTitleLowerCase{\LCTtrue\UCTfalse}
+\def\ChTitleUpperCase{\UCTtrue\LCTfalse}
+\def\ChTitleAsIs{\UCTfalse\LCTfalse}
+\newcommand{\FmTi}[1]{%
+\ifUCT
+   {\MakeUppercase{#1}}\LCTfalse
+\else
+   \ifLCT
+      {\MakeLowercase{#1}}\UCTfalse
+   \else {#1}
+   \fi
+\fi}
+
+
+
+\newlength{\mylen}
+\newlength{\myhi}
+\newlength{\px}
+\newlength{\py}
+\newlength{\pyy}
+\newlength{\pxx}
+
+
+\def\mghrulefill#1{\leavevmode\leaders\hrule\@height #1\hfill\kern\z@}
+
+\newcommand{\DOCH}{%
+  \CNV\FmN{\@chapapp}\space \CNoV\thechapter
+  \par\nobreak
+  \vskip 20\p@
+  }
+\newcommand{\DOTI}[1]{%
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@
+    }
+\newcommand{\DOTIS}[1]{%
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@
+    }
+
+%%%%%% SONNY DEF
+
+\DeclareOption{Sonny}{%
+  \ChNameVar{\Large\sf}
+  \ChNumVar{\Huge}
+  \ChTitleVar{\Large\sf}
+  \ChRuleWidth{0.5pt}
+  \ChNameUpperCase
+  \renewcommand{\DOCH}{%
+    \raggedleft
+    \CNV\FmN{\@chapapp}\space \CNoV\thechapter
+    \par\nobreak
+    \vskip 40\p@}
+  \renewcommand{\DOTI}[1]{%
+    \CTV\raggedleft\mghrulefill{\RW}\par\nobreak
+    \vskip 5\p@
+    \CTV\FmTi{#1}\par\nobreak
+    \mghrulefill{\RW}\par\nobreak
+    \vskip 40\p@}
+  \renewcommand{\DOTIS}[1]{%
+    \CTV\raggedleft\mghrulefill{\RW}\par\nobreak
+    \vskip 5\p@
+    \CTV\FmTi{#1}\par\nobreak
+    \mghrulefill{\RW}\par\nobreak
+    \vskip 40\p@}
+}
+
+%%%%%% LENNY DEF
+
+\DeclareOption{Lenny}{%
+
+  \ChNameVar{\fontsize{14}{16}\usefont{OT1}{phv}{m}{n}\selectfont}
+  \ChNumVar{\fontsize{60}{62}\usefont{OT1}{ptm}{m}{n}\selectfont}
+  \ChTitleVar{\Huge\bfseries\rm}
+  \ChRuleWidth{1pt}
+  \renewcommand{\DOCH}{%
+    \settowidth{\px}{\CNV\FmN{\@chapapp}}
+    \addtolength{\px}{2pt}
+    \settoheight{\py}{\CNV\FmN{\@chapapp}}
+    \addtolength{\py}{1pt}
+
+    \settowidth{\mylen}{\CNV\FmN{\@chapapp}\space\CNoV\thechapter}
+    \addtolength{\mylen}{1pt}
+    \settowidth{\pxx}{\CNoV\thechapter}
+    \addtolength{\pxx}{-1pt}
+
+    \settoheight{\pyy}{\CNoV\thechapter}
+    \addtolength{\pyy}{-2pt}
+    \setlength{\myhi}{\pyy}
+    \addtolength{\myhi}{-1\py}
+    \par
+    \parbox[b]{\textwidth}{%
+    \rule[\py]{\RW}{\myhi}%
+    \hskip -\RW%
+    \rule[\pyy]{\px}{\RW}%
+    \hskip -\px%
+    \raggedright%
+    \CNV\FmN{\@chapapp}\space\CNoV\thechapter%
+    \hskip1pt%
+    \mghrulefill{\RW}%
+    \rule{\RW}{\pyy}\par\nobreak%
+    \vskip -\baselineskip%
+    \vskip -\pyy%
+    \hskip \mylen%
+    \mghrulefill{\RW}\par\nobreak%
+    \vskip \pyy}%
+    \vskip 20\p@}
+ 
+
+  \renewcommand{\DOTI}[1]{%
+    \raggedright
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@}
+
+  \renewcommand{\DOTIS}[1]{%
+    \raggedright
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@}
+ }
+
+%%%%%% Peter Osbornes' version of LENNY DEF
+
+\DeclareOption{PetersLenny}{%
+
+% five new lengths 
+\newlength{\bl}                           %  bottom left   : orig \space
+\setlength{\bl}{6pt}
+\newcommand{\BL}[1]{\setlength{\bl}{#1}}
+\newlength{\br}                           %  bottom right  : orig 1pt
+\setlength{\br}{1pt}
+\newcommand{\BR}[1]{\setlength{\br}{#1}}
+\newlength{\tl}                           %  top left      : orig 2pt
+\setlength{\tl}{2pt}
+\newcommand{\TL}[1]{\setlength{\tl}{#1}}
+\newlength{\trr}                           %  top right      :orig 1pt 
+\setlength{\trr}{1pt}
+\newcommand{\TR}[1]{\setlength{\trr}{#1}}
+\newlength{\blrule}                           %  top right      :orig 1pt 
+\setlength{\trr}{0pt}
+\newcommand{\BLrule}[1]{\setlength{\blrule}{#1}}
+
+
+  \ChNameVar{\fontsize{14}{16}\usefont{OT1}{phv}{m}{n}\selectfont}
+  \ChNumVar{\fontsize{60}{62}\usefont{OT1}{ptm}{m}{n}\selectfont}
+  \ChTitleVar{\Huge\bfseries\rm}
+  \ChRuleWidth{1pt}
+\renewcommand{\DOCH}{%
+
+
+%%%%%%%                                   tweaks for 1--9 and A--Z
+\ifcase\c@chapter\relax%
+\or\BL{-3pt}\TL{-4pt}\BR{0pt}\TR{-6pt}%1
+\or\BL{0pt}\TL{-4pt}\BR{2pt}\TR{-4pt}%2
+\or\BL{0pt}\TL{-4pt}\BR{2pt}\TR{-4pt}%3
+\or\BL{0pt}\TL{5pt}\BR{2pt}\TR{-4pt}%4
+\or\BL{0pt}\TL{3pt}\BR{2pt}\TR{-4pt}%5
+\or\BL{-1pt}\TL{0pt}\BR{2pt}\TR{-2pt}%6
+\or\BL{0pt}\TL{-3pt}\BR{2pt}\TR{-2pt}%7
+\or\BL{0pt}\TL{-3pt}\BR{2pt}\TR{-2pt}%8
+\or\BL{0pt}\TL{-3pt}\BR{-4pt}\TR{-2pt}%9
+\or\BL{-3pt}\TL{-3pt}\BR{2pt}\TR{-7pt}%10
+\or\BL{-6pt}\TL{-6pt}\BR{0pt}\TR{-9pt}%11
+\or\BL{-6pt}\TL{-6pt}\BR{2pt}\TR{-7pt}%12
+\or\BL{-5pt}\TL{-5pt}\BR{0pt}\TR{-9pt}%13
+\or\BL{-6pt}\TL{-6pt}\BR{0pt}\TR{-9pt}%14
+\or\BL{-3pt}\TL{-3pt}\BR{3pt}\TR{-6pt}%15
+\or\BL{-3pt}\TL{-3pt}\BR{3pt}\TR{-6pt}%16
+\or\BL{-5pt}\TL{-3pt}\BR{-8pt}\TR{-6pt}%17
+\or\BL{-5pt}\TL{-5pt}\BR{0pt}\TR{-9pt}%18
+\or\BL{-3pt}\TL{-3pt}\BR{-6pt}\TR{-9pt}%19
+\or\BL{0pt}\TL{0pt}\BR{0pt}\TR{-5pt}%20
+\fi
+
+\ifinapp\ifcase\c@chapter\relax%
+\or\BL{0pt}\TL{14pt}\BR{5pt}\TR{-19pt}%A
+\or\BL{0pt}\TL{-5pt}\BR{-3pt}\TR{-8pt}%B
+\or\BL{-3pt}\TL{-2pt}\BR{1pt}\TR{-6pt}\BLrule{0pt}%C
+\or\BL{0pt}\TL{-5pt}\BR{-3pt}\TR{-8pt}\BLrule{0pt}%D
+\or\BL{0pt}\TL{-5pt}\BR{2pt}\TR{-3pt}%E
+\or\BL{0pt}\TL{-5pt}\BR{-10pt}\TR{-1pt}%F
+\or\BL{-3pt}\TL{0pt}\BR{0pt}\TR{-7pt}%G
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%H
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%I
+\or\BL{2pt}\TL{0pt}\BR{-3pt}\TR{1pt}%J
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%K
+\or\BL{0pt}\TL{-5pt}\BR{2pt}\TR{-19pt}%L
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}%M
+\or\BL{0pt}\TL{-5pt}\BR{-2pt}\TR{-1pt}%N
+\or\BL{-3pt}\TL{-2pt}\BR{-3pt}\TR{-11pt}%O
+\or\BL{0pt}\TL{-5pt}\BR{-9pt}\TR{-3pt}%P
+\or\BL{-3pt}\TL{-2pt}\BR{-3pt}\TR{-11pt}%Q
+\or\BL{0pt}\TL{-5pt}\BR{4pt}\TR{-8pt}%R
+\or\BL{-2pt}\TL{-2pt}\BR{-2pt}\TR{-7pt}%S
+\or\BL{-3pt}\TL{0pt}\BR{-5pt}\TR{4pt}\BLrule{8pt}%T
+\or\BL{-7pt}\TL{-11pt}\BR{-5pt}\TR{-7pt}\BLrule{0pt}%U
+\or\BL{-14pt}\TL{-5pt}\BR{-14pt}\TR{-1pt}\BLrule{14pt}%V
+\or\BL{-10pt}\TL{-9pt}\BR{-13pt}\TR{-3pt}\BLrule{7pt}%W
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}\BLrule{0pt}%X
+\or\BL{-6pt}\TL{-4pt}\BR{-7pt}\TR{1pt}\BLrule{7pt}%Y
+\or\BL{0pt}\TL{-5pt}\BR{3pt}\TR{-1pt}\BLrule{0pt}%Z
+\fi\fi
+%%%%%%%
+    \settowidth{\px}{\CNV\FmN{\@chapapp}}
+    \addtolength{\px}{\tl}        %MOD change 2pt to \tl
+    \settoheight{\py}{\CNV\FmN{\@chapapp}}
+    \addtolength{\py}{1pt}
+
+    \settowidth{\mylen}{\CNV\FmN{\@chapapp}\space\CNoV\thechapter}
+    \addtolength{\mylen}{\trr}% MOD change 1pt to \tr
+    \settowidth{\pxx}{\CNoV\thechapter}
+    \addtolength{\pxx}{-1pt}
+
+    \settoheight{\pyy}{\CNoV\thechapter}
+    \addtolength{\pyy}{-2pt}
+    \setlength{\myhi}{\pyy}
+    \addtolength{\myhi}{-1\py}
+    \par
+    \parbox[b]{\textwidth}{%
+    \rule[\py]{\RW}{\myhi}%
+    \hskip -\RW%
+    \rule[\pyy]{\px}{\RW}% 
+    \hskip -\px%
+    \raggedright%
+    \CNV\FmN{\@chapapp}\rule{\blrule}{\RW}\hskip\bl\CNoV\thechapter%MOD 
+%    \CNV\FmN{\@chapapp}\space\CNoV\thechapter                     %ORIGINAL
+    \hskip\br%                           %MOD 1pt to \br
+    \mghrulefill{\RW}% 
+    \rule{\RW}{\pyy}\par\nobreak% 
+    \vskip -\baselineskip%
+    \vskip -\pyy%
+    \hskip \mylen%
+    \mghrulefill{\RW}\par\nobreak%
+    \vskip \pyy}%
+    \vskip 20\p@}
+ 
+
+  \renewcommand{\DOTI}[1]{%
+    \raggedright
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@}
+
+  \renewcommand{\DOTIS}[1]{%
+    \raggedright
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@}
+ }
+
+
+%
+
+
+%%%%%% BJORNSTRUP DEF
+
+\DeclareOption{Bjornstrup}{%
+  \usecolortrue
+  % pzc (Zapf Chancelery) is nice.  ppl (Palatino) is cool too.
+  \ChNumVar{\fontsize{76}{80}\usefont{OT1}{pzc}{m}{n}\selectfont}
+  \ChTitleVar{\raggedleft\Large\sffamily\bfseries}
+
+  \setlength{\myhi}{10pt}         % Space between grey box border and text
+  \setlength{\mylen}{\textwidth}
+  \addtolength{\mylen}{-2\myhi}
+  \renewcommand{\DOCH}{%
+    \settowidth{\py}{\CNoV\thechapter}
+    \addtolength{\py}{-10pt}      % Amount of space by which the
+%                                  % number is shifted right
+    \fboxsep=0pt%
+    \colorbox[gray]{.85}{\rule{0pt}{40pt}\parbox[b]{\textwidth}{\hfill}}%
+    \kern-\py\raise20pt%
+    \hbox{\color[gray]{.5}\CNoV\thechapter}\\%
+  }
+  
+  \renewcommand{\DOTI}[1]{%
+    \nointerlineskip\raggedright%
+    \fboxsep=\myhi%
+    \vskip-1ex%
+    \colorbox[gray]{.85}{\parbox[t]{\mylen}{\CTV\FmTi{#1}}}\par\nobreak%
+    \vskip 40\p@%
+  }
+
+  \renewcommand{\DOTIS}[1]{%
+    \fboxsep=0pt
+    \colorbox[gray]{.85}{\rule{0pt}{40pt}\parbox[b]{\textwidth}{\hfill}}\\%
+    \nointerlineskip\raggedright%
+    \fboxsep=\myhi%
+    \colorbox[gray]{.85}{\parbox[t]{\mylen}{\CTV\FmTi{#1}}}\par\nobreak%
+    \vskip 40\p@%
+  }
+}
+
+
+%%%%%%% GLENN DEF
+
+
+\DeclareOption{Glenn}{%
+  \ChNameVar{\bfseries\Large\sf}
+  \ChNumVar{\Huge}
+  \ChTitleVar{\bfseries\Large\rm}
+  \ChRuleWidth{1pt}
+  \ChNameUpperCase
+  \ChTitleUpperCase
+  \renewcommand{\DOCH}{%
+    \settoheight{\myhi}{\CTV\FmTi{Test}}
+    \setlength{\py}{\baselineskip}
+    \addtolength{\py}{\RW}
+    \addtolength{\py}{\myhi}
+    \setlength{\pyy}{\py}
+    \addtolength{\pyy}{-1\RW}
+     
+    \raggedright
+    \CNV\FmN{\@chapapp}\space\CNoV\thechapter
+    \hskip 3pt\mghrulefill{\RW}\rule[-1\pyy]{2\RW}{\py}\par\nobreak}
+
+  \renewcommand{\DOTI}[1]{%
+    \addtolength{\pyy}{-4pt}
+    \settoheight{\myhi}{\CTV\FmTi{#1}}
+    \addtolength{\myhi}{\py}
+    \addtolength{\myhi}{-1\RW}
+    \vskip -1\pyy
+    \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 2pt
+    \raggedleft\CTV\FmTi{#1}\par\nobreak
+    \vskip 80\p@}
+
+\newlength{\backskip}
+  \renewcommand{\DOTIS}[1]{%
+%    \setlength{\py}{10pt}
+%    \setlength{\pyy}{\py}
+%    \addtolength{\pyy}{\RW}
+%    \setlength{\myhi}{\baselineskip}
+%    \addtolength{\myhi}{\pyy}
+%    \mghrulefill{\RW}\rule[-1\py]{2\RW}{\pyy}\par\nobreak
+%    \addtolength{}{}
+%\vskip -1\baselineskip
+%    \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 2pt
+%    \raggedleft\CTV\FmTi{#1}\par\nobreak
+%    \vskip 60\p@}
+%% Fix suggested by Tomas Lundberg
+    \setlength{\py}{25pt}  % eller vad man vill
+    \setlength{\pyy}{\py}
+    \setlength{\backskip}{\py}
+    \addtolength{\backskip}{2pt}
+    \addtolength{\pyy}{\RW}
+    \setlength{\myhi}{\baselineskip}
+    \addtolength{\myhi}{\pyy}
+    \mghrulefill{\RW}\rule[-1\py]{2\RW}{\pyy}\par\nobreak
+    \vskip -1\backskip
+    \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 3pt %
+    \raggedleft\CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@}
+ }
+
+%%%%%%% CONNY DEF
+
+\DeclareOption{Conny}{%
+  \ChNameUpperCase
+  \ChTitleUpperCase  
+  \ChNameVar{\centering\Huge\rm\bfseries}
+  \ChNumVar{\Huge}
+  \ChTitleVar{\centering\Huge\rm}
+  \ChRuleWidth{2pt}
+
+  \renewcommand{\DOCH}{%
+    \mghrulefill{3\RW}\par\nobreak
+    \vskip -0.5\baselineskip
+    \mghrulefill{\RW}\par\nobreak
+    \CNV\FmN{\@chapapp}\space \CNoV\thechapter
+    \par\nobreak
+    \vskip -0.5\baselineskip
+   }
+  \renewcommand{\DOTI}[1]{%
+    \mghrulefill{\RW}\par\nobreak
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 60\p@
+    }
+  \renewcommand{\DOTIS}[1]{%
+    \mghrulefill{\RW}\par\nobreak
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 60\p@
+    }
+  }
+
+%%%%%%% REJNE DEF
+
+\DeclareOption{Rejne}{%
+
+  \ChNameUpperCase
+  \ChTitleUpperCase  
+  \ChNameVar{\centering\Large\rm}
+  \ChNumVar{\Huge}
+  \ChTitleVar{\centering\Huge\rm}
+  \ChRuleWidth{1pt}
+  \renewcommand{\DOCH}{%
+    \settoheight{\py}{\CNoV\thechapter}
+    \parskip=0pt plus 1pt % Set parskip to default, just in case v1.31
+    \addtolength{\py}{-1pt}
+    \CNV\FmN{\@chapapp}\par\nobreak
+    \vskip 20\p@
+    \setlength{\myhi}{2\baselineskip}
+    \setlength{\px}{\myhi}
+    \addtolength{\px}{-1\RW}
+    \rule[-1\px]{\RW}{\myhi}\mghrulefill{\RW}\hskip
+    10pt\raisebox{-0.5\py}{\CNoV\thechapter}\hskip 10pt\mghrulefill{\RW}\rule[-1\px]{\RW}{\myhi}\par\nobreak
+     \vskip -3\p@% Added -2pt vskip to correct for streched text v1.31
+    }
+  \renewcommand{\DOTI}[1]{%
+    \setlength{\mylen}{\textwidth}
+    \parskip=0pt plus 1pt % Set parskip to default, just in case v1.31
+    \addtolength{\mylen}{-2\RW}
+    {\vrule width\RW}\parbox{\mylen}{\CTV\FmTi{#1}}{\vrule width\RW}\par\nobreak%
+    \vskip -3pt\rule{\RW}{2\baselineskip}\mghrulefill{\RW}\rule{\RW}{2\baselineskip}%
+    \vskip 60\p@% Added -2pt in vskip to correct for streched text v1.31
+    }
+  \renewcommand{\DOTIS}[1]{%
+    \setlength{\py}{\fboxrule}
+    \setlength{\fboxrule}{\RW}
+    \setlength{\mylen}{\textwidth}
+    \addtolength{\mylen}{-2\RW}
+    \fbox{\parbox{\mylen}{\vskip 2\baselineskip\CTV\FmTi{#1}\par\nobreak\vskip \baselineskip}} 
+    \setlength{\fboxrule}{\py}
+    \vskip 60\p@
+    }
+  }
+
+
+%%%%%%% BJARNE DEF
+
+\DeclareOption{Bjarne}{%
+  \ChNameUpperCase
+  \ChTitleUpperCase  
+  \ChNameVar{\raggedleft\normalsize\rm}
+  \ChNumVar{\raggedleft \bfseries\Large}
+  \ChTitleVar{\raggedleft \Large\rm}
+  \ChRuleWidth{1pt}
+
+
+%% Note thechapter -> c@chapter fix appendix bug
+%% Fixed misspelled 12
+
+  \newcounter{AlphaCnt}
+  \newcounter{AlphaDecCnt}
+  \newcommand{\AlphaNo}{%
+    \ifcase\number\theAlphaCnt
+      \ifnum\c@chapter=0
+        ZERO\else{}\fi
+    \or ONE\or TWO\or THREE\or FOUR\or FIVE
+    \or SIX\or SEVEN\or EIGHT\or NINE\or TEN
+    \or ELEVEN\or TWELVE\or THIRTEEN\or FOURTEEN\or FIFTEEN
+    \or SIXTEEN\or SEVENTEEN\or EIGHTEEN\or NINETEEN\fi
+}
+
+  \newcommand{\AlphaDecNo}{%
+    \setcounter{AlphaDecCnt}{0}
+    \@whilenum\number\theAlphaCnt>0\do
+      {\addtocounter{AlphaCnt}{-10}
+       \addtocounter{AlphaDecCnt}{1}}
+     \ifnum\number\theAlphaCnt=0
+     \else
+       \addtocounter{AlphaDecCnt}{-1}
+       \addtocounter{AlphaCnt}{10}
+     \fi
+     
+     
+    \ifcase\number\theAlphaDecCnt\or TEN\or TWENTY\or THIRTY\or
+    FORTY\or FIFTY\or SIXTY\or SEVENTY\or EIGHTY\or NINETY\fi
+    }
+  \newcommand{\TheAlphaChapter}{%
+    
+    \ifinapp 
+      \thechapter
+    \else
+      \setcounter{AlphaCnt}{\c@chapter}
+      \ifnum\c@chapter<20
+        \AlphaNo
+      \else
+        \AlphaDecNo\AlphaNo
+      \fi
+    \fi
+    }  
+  \renewcommand{\DOCH}{%
+    \mghrulefill{\RW}\par\nobreak
+    \CNV\FmN{\@chapapp}\par\nobreak 
+    \CNoV\TheAlphaChapter\par\nobreak
+    \vskip -1\baselineskip\vskip 5pt\mghrulefill{\RW}\par\nobreak
+    \vskip 20\p@
+    }
+  \renewcommand{\DOTI}[1]{%
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@
+    }
+  \renewcommand{\DOTIS}[1]{%
+    \CTV\FmTi{#1}\par\nobreak
+    \vskip 40\p@
+    }
+}
+
+\DeclareOption*{%
+  \PackageWarning{fancychapter}{unknown style option}
+  }
+
+\ProcessOptions* \relax
+
+\ifusecolor
+  \RequirePackage{color} 
+\fi
+\def\@makechapterhead#1{%
+  \vspace*{50\p@}%
+  {\parindent \z@ \raggedright \normalfont
+    \ifnum \c@secnumdepth >\m@ne
+      \if@mainmatter%%%%% Fix for frontmatter, mainmatter, and backmatter 040920
+        \DOCH
+      \fi
+    \fi
+    \interlinepenalty\@M
+    \if@mainmatter%%%%% Fix for frontmatter, mainmatter, and backmatter 060424
+      \DOTI{#1}%
+    \else%
+      \DOTIS{#1}%
+    \fi
+  }}
+
+
+%%% Begin: To avoid problem with scrbook.cls (fncychap version 1.32)
+
+%%OUT:
+%\def\@schapter#1{\if@twocolumn
+%                   \@topnewpage[\@makeschapterhead{#1}]%
+%                 \else
+%                   \@makeschapterhead{#1}%
+%                   \@afterheading
+%                 \fi}
+
+%%IN:
+\def\@schapter#1{%
+\if@twocolumn%
+  \@makeschapterhead{#1}%
+\else%
+  \@makeschapterhead{#1}%
+  \@afterheading%
+\fi}
+
+%%% End: To avoid problem with scrbook.cls (fncychap version 1.32)
+
+\def\@makeschapterhead#1{%
+  \vspace*{50\p@}%
+  {\parindent \z@ \raggedright
+    \normalfont
+    \interlinepenalty\@M
+    \DOTIS{#1}
+    \vskip 40\p@
+  }}
+
+\endinput
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/howto.cls	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,66 @@
+%
+% howto.cls for Sphinx
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesClass{howto}[2008/10/18 Document class (Sphinx HOWTO)]
+
+% Pass all given class options to the parent class.
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
+\ProcessOptions\relax
+\LoadClass[twoside]{article}
+
+% Set some sane defaults for section numbering depth and TOC depth.  You can
+% reset these counters in your preamble.
+%
+\setcounter{secnumdepth}{2}
+
+% Change the title page to look a bit better, and fit in with the fncychap
+% ``Bjarne'' style a bit better.
+%
+\renewcommand{\maketitle}{
+  \rule{\textwidth}{1pt}
+  \ifsphinxpdfoutput
+    \begingroup
+    % This \def is required to deal with multi-line authors; it
+    % changes \\ to ', ' (comma-space), making it pass muster for
+    % generating document info in the PDF file.
+    \def\\{, }
+    \pdfinfo{
+      /Author (\@author)
+      /Title (\@title)
+    }
+    \endgroup
+  \fi
+  \begin{flushright}
+    \sphinxlogo%
+    {\rm\Huge\py@HeaderFamily \@title} \par
+    {\em\large\py@HeaderFamily \py@release\releaseinfo} \par
+    \vspace{25pt}
+    {\Large\py@HeaderFamily \@author} \par
+    \vspace{25pt}
+    \@date \par
+    \py@authoraddress \par
+  \end{flushright}
+  \@thanks
+  \setcounter{footnote}{0}
+  \let\thanks\relax\let\maketitle\relax
+  %\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
+}
+
+\let\py@OldTableofcontents=\tableofcontents
+\renewcommand{\tableofcontents}{
+  \begingroup
+    \parskip = 0mm
+    \py@OldTableofcontents
+  \endgroup
+  \rule{\textwidth}{1pt}
+  \vspace{12pt}
+}  
+
+\@ifundefined{fancyhf}{
+  \pagestyle{plain}}{
+  \pagestyle{normal}}		% start this way; change for
+\pagenumbering{arabic}		% ToC & chapters
+
+\thispagestyle{empty}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/manual.cls	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,103 @@
+%
+% manual.cls for Sphinx
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesClass{manual}[2008/10/18 Document class (Sphinx manual)]
+
+% Pass all given class options to the parent class.
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{report}}
+\ProcessOptions\relax
+\LoadClass[twoside,openright]{report}
+
+% Set some sane defaults for section numbering depth and TOC depth.  You can
+% reset these counters in your preamble.
+%
+\setcounter{secnumdepth}{2}
+\setcounter{tocdepth}{1}
+
+% Change the title page to look a bit better, and fit in with the fncychap
+% ``Bjarne'' style a bit better.
+%
+\renewcommand{\maketitle}{%
+  \begin{titlepage}%
+    \let\footnotesize\small
+    \let\footnoterule\relax
+    \rule{\textwidth}{1pt}%
+    \ifsphinxpdfoutput
+      \begingroup
+      % This \def is required to deal with multi-line authors; it
+      % changes \\ to ', ' (comma-space), making it pass muster for
+      % generating document info in the PDF file.
+      \def\\{, }
+      \pdfinfo{
+        /Author (\@author)
+        /Title (\@title)
+      }
+      \endgroup
+    \fi
+    \begin{flushright}%
+      \sphinxlogo%
+      {\rm\Huge\py@HeaderFamily \@title \par}%
+      {\em\LARGE\py@HeaderFamily \py@release\releaseinfo \par}
+      \vfill
+      {\LARGE\py@HeaderFamily \@author \par}
+      \vfill\vfill
+      {\large
+       \@date \par
+       \vfill
+       \py@authoraddress \par
+      }%
+    \end{flushright}%\par
+    \@thanks
+  \end{titlepage}%
+  \cleardoublepage%
+  \setcounter{footnote}{0}%
+  \let\thanks\relax\let\maketitle\relax
+  %\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
+}
+
+
+% Catch the end of the {abstract} environment, but here make sure the abstract
+% is followed by a blank page if the 'openright' option is used.
+%
+\let\py@OldEndAbstract=\endabstract
+\renewcommand{\endabstract}{
+  \if@openright
+    \ifodd\value{page}
+      \typeout{Adding blank page after the abstract.}
+      \vfil\pagebreak
+    \fi
+  \fi
+  \py@OldEndAbstract
+}
+
+% This wraps the \tableofcontents macro with all the magic to get the spacing
+% right and have the right number of pages if the 'openright' option has been
+% used.  This eliminates a fair amount of crud in the individual document files.
+%
+\let\py@OldTableofcontents=\tableofcontents
+\renewcommand{\tableofcontents}{%
+  \setcounter{page}{1}%
+  \pagebreak%
+  \pagestyle{plain}%
+  {%
+    \parskip = 0mm%
+    \py@OldTableofcontents%
+    \if@openright%
+      \ifodd\value{page}%
+        \typeout{Adding blank page after the table of contents.}%
+        \pagebreak\hspace{0pt}%
+      \fi%
+    \fi%
+    \cleardoublepage%
+  }%
+  \pagenumbering{arabic}%
+  \@ifundefined{fancyhf}{}{\pagestyle{normal}}%
+}
+
+% This is needed to get the width of the section # area wide enough in the
+% library reference.  Doing it here keeps it the same for all the manuals.
+%
+\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.6em}}
+\renewcommand*\l@subsection{\@dottedtocline{2}{4.1em}{3.5em}}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/python.ist	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,11 @@
+line_max 100
+headings_flag 1
+heading_prefix "  \\bigletter "
+
+preamble "\\begin{theindex}
+\\def\\bigletter#1{{\\Large\\sffamily#1}\\nopagebreak\\vspace{1mm}}
+
+"
+
+symhead_positive "{Symbols}"
+numhead_positive "{Numbers}"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/sphinx.sty	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,709 @@
+%
+% sphinx.sty
+%
+% Adapted from the old python.sty, mostly written by Fred Drake,
+% by Georg Brandl.
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesPackage{sphinx}[2008/05/01 LaTeX package (Sphinx markup)]
+
+\RequirePackage{textcomp}
+\RequirePackage{fancyhdr}
+\RequirePackage{fancybox}
+\RequirePackage{titlesec}
+\RequirePackage{tabulary}
+\RequirePackage{amsmath} % for \text
+\RequirePackage{makeidx}
+\RequirePackage{framed}
+\RequirePackage{color}
+\RequirePackage{fancyvrb}
+\RequirePackage{threeparttable}
+
+% Redefine these colors to your liking in the preamble.
+\definecolor{TitleColor}{rgb}{0.126,0.263,0.361}
+\definecolor{InnerLinkColor}{rgb}{0.208,0.374,0.486}
+\definecolor{OuterLinkColor}{rgb}{0.216,0.439,0.388}
+% Redefine these colors to something not white if you want to have colored
+% background and border for code examples.
+\definecolor{VerbatimColor}{rgb}{1,1,1}
+\definecolor{VerbatimBorderColor}{rgb}{1,1,1}
+
+% Uncomment these two lines to ignore the paper size and make the page 
+% size more like a typical published manual.
+%\renewcommand{\paperheight}{9in}
+%\renewcommand{\paperwidth}{8.5in}   % typical squarish manual
+%\renewcommand{\paperwidth}{7in}     % O'Reilly ``Programmming Python''
+
+% For graphicx, check if we are compiling under latex or pdflatex.
+\ifx\pdftexversion\undefined
+  \usepackage{graphicx}
+\else
+  \usepackage[pdftex]{graphicx}
+\fi
+
+% for PDF output, use colors and maximal compression
+\newif\ifsphinxpdfoutput\sphinxpdfoutputfalse
+\ifx\pdfoutput\undefined\else\ifcase\pdfoutput
+  \let\py@NormalColor\relax
+  \let\py@TitleColor\relax
+\else
+  \sphinxpdfoutputtrue
+  \input{pdfcolor}
+  \def\py@NormalColor{\color[rgb]{0.0,0.0,0.0}}
+  \def\py@TitleColor{\color{TitleColor}}
+  \pdfcompresslevel=9
+\fi\fi
+
+% XeLaTeX can do colors, too
+\ifx\XeTeXrevision\undefined\else
+  \def\py@NormalColor{\color[rgb]{0.0,0.0,0.0}}
+  \def\py@TitleColor{\color{TitleColor}}
+\fi
+
+% Increase printable page size (copied from fullpage.sty)
+\topmargin 0pt
+\advance \topmargin by -\headheight
+\advance \topmargin by -\headsep
+
+% attempt to work a little better for A4 users
+\textheight \paperheight
+\advance\textheight by -2in
+
+\oddsidemargin 0pt
+\evensidemargin 0pt
+%\evensidemargin -.25in  % for ``manual size'' documents
+\marginparwidth 0.5in
+
+\textwidth \paperwidth
+\advance\textwidth by -2in
+
+
+% Style parameters and macros used by most documents here
+\raggedbottom
+\sloppy
+\parindent = 0mm
+\parskip = 2mm
+\hbadness = 5000                % don't print trivial gripes
+
+\pagestyle{empty}               % start this way; change for
+\pagenumbering{roman}           % ToC & chapters
+
+% Use this to set the font family for headers and other decor:
+\newcommand{\py@HeaderFamily}{\sffamily\bfseries}
+
+% Redefine the 'normal' header/footer style when using "fancyhdr" package:
+\@ifundefined{fancyhf}{}{
+  % Use \pagestyle{normal} as the primary pagestyle for text.
+  \fancypagestyle{normal}{
+    \fancyhf{}
+    \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}}
+    \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}}
+    \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}}
+    \fancyhead[LE,RO]{{\py@HeaderFamily \@title, \py@release}}
+    \renewcommand{\headrulewidth}{0.4pt}
+    \renewcommand{\footrulewidth}{0.4pt}
+  }
+  % Update the plain style so we get the page number & footer line,
+  % but not a chapter or section title.  This is to keep the first
+  % page of a chapter and the blank page between chapters `clean.'
+  \fancypagestyle{plain}{
+    \fancyhf{}
+    \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}}
+    \renewcommand{\headrulewidth}{0pt}
+    \renewcommand{\footrulewidth}{0.4pt}
+  }
+}
+
+% Some custom font markup commands.
+%
+\newcommand{\strong}[1]{{\bf #1}}
+\newcommand{\code}[1]{\texttt{#1}}
+\newcommand{\bfcode}[1]{\code{\bfseries#1}}
+\newcommand{\samp}[1]{`\code{#1}'}
+\newcommand{\email}[1]{\textsf{#1}}
+
+\newcommand{\py@modulebadkey}{{--just-some-junk--}}
+
+% Redefine the Verbatim environment to allow border and background colors.
+% The original environment is still used for verbatims within tables.
+\let\OriginalVerbatim=\Verbatim
+\let\endOriginalVerbatim=\endVerbatim
+
+% Play with vspace to be able to keep the indentation.
+\newlength\distancetoright
+\newlength\leftsidespace
+\def\mycolorbox#1{%
+  \setlength\leftsidespace{\@totalleftmargin}%
+  \setlength\distancetoright{\textwidth}%
+  \advance\distancetoright -\@totalleftmargin %
+  \noindent\hspace*{\@totalleftmargin}%
+  \fcolorbox{VerbatimBorderColor}{VerbatimColor}{%
+  \begin{minipage}{\distancetoright}%
+    \smallskip%
+    \noindent\hspace*{-\leftsidespace}%
+    #1
+  \end{minipage}%
+  }%
+}
+\def\FrameCommand{\mycolorbox}
+
+\renewcommand{\Verbatim}[1][1]{%
+  % The list environement is needed to control perfectly the vertical
+  % space.
+  \list{}{%
+  \setlength\parskip{0pt}%
+  \setlength\itemsep{0ex}%
+  \setlength\topsep{0ex}%
+  \setlength\partopsep{0pt}%
+  \setlength\leftmargin{0pt}%
+  }%
+  \item\MakeFramed {\FrameRestore}%
+     \small%
+    \OriginalVerbatim[#1]%
+}
+\renewcommand{\endVerbatim}{%
+    \endOriginalVerbatim%
+  \endMakeFramed%
+  \endlist%
+}
+
+
+% Index-entry generation support.
+%
+
+% Command to generate two index entries (using subentries)
+\newcommand{\indexii}[2]{\index{#1!#2}\index{#2!#1}}
+
+% And three entries (using only one level of subentries)
+\newcommand{\indexiii}[3]{\index{#1!#2 #3}\index{#2!#3, #1}\index{#3!#1 #2}}
+
+% And four (again, using only one level of subentries)
+\newcommand{\indexiv}[4]{
+\index{#1!#2 #3 #4}
+\index{#2!#3 #4, #1}
+\index{#3!#4, #1 #2}
+\index{#4!#1 #2 #3}
+}
+
+% support for the module index
+\newif\ifpy@UseModuleIndex
+\py@UseModuleIndexfalse
+
+\newcommand{\makemodindex}{
+  \newwrite\modindexfile
+  \openout\modindexfile=mod\jobname.idx
+  \py@UseModuleIndextrue
+}
+
+\newcommand{\printmodindex}{
+  \@input@{mod\jobname.ind}
+}
+
+% Add the defining entry for a module
+\newcommand{\py@modindex}[2]{%
+  \renewcommand{\py@thismodule}{#1}
+  \ifpy@UseModuleIndex%
+    \@ifundefined{py@modplat@\py@thismodulekey}{
+      \write\modindexfile{\protect\indexentry{#1@{\texttt{#1}}|hyperpage}{\thepage}}%
+    }{\write\modindexfile{\protect\indexentry{#1@{\texttt{#1 }%
+        \emph{(\platformof{\py@thismodulekey})}}|hyperpage}{\thepage}}%
+    }
+  \fi%
+}
+
+% "Current" keys
+\newcommand{\py@thisclass}{}
+\newcommand{\py@thismodule}{}
+\newcommand{\py@thismodulekey}{}
+\newcommand{\py@thismoduletype}{}
+\newcommand{\py@emptymodule}{}
+
+% \declaremodule[key]{type}{name}
+\newcommand{\declaremodule}[3][\py@modulebadkey]{
+  \renewcommand{\py@thismoduletype}{#2}
+  \ifx\py@modulebadkey#1
+    \renewcommand{\py@thismodulekey}{#3}
+  \else
+    \renewcommand{\py@thismodulekey}{#1}
+  \fi
+  \py@modindex{#3}{}
+  %\label{module-\py@thismodulekey}
+}
+
+% Record module platforms for the Module Index
+\newif\ifpy@ModPlatformFileIsOpen \py@ModPlatformFileIsOpenfalse
+\long\def\py@writeModPlatformFile#1{%
+  \protected@write\py@ModPlatformFile%
+    {\let\label\@gobble \let\index\@gobble \let\glossary\@gobble}%
+    {\string#1}%
+}
+\newcommand{\py@ModPlatformFilename}{\jobname.pla}
+\newcommand{\platform}[1]{
+  \ifpy@ModPlatformFileIsOpen\else
+    \newwrite\py@ModPlatformFile
+    \openout\py@ModPlatformFile=\py@ModPlatformFilename
+    \py@ModPlatformFileIsOpentrue
+  \fi
+  \py@writeModPlatformFile{\py@defplatform{\py@thismodulekey}{#1}}
+}
+\newcommand{\py@defplatform}[2]{\expandafter\def\csname py@modplat@#1\endcsname{#2}}
+\newcommand{\platformof}[1]{\csname py@modplat@#1\endcsname}
+
+\InputIfFileExists{\jobname.pla}{}{}
+
+% \moduleauthor{name}{email}
+\newcommand{\moduleauthor}[2]{}
+
+% \sectionauthor{name}{email}
+\newcommand{\sectionauthor}[2]{}
+
+% Ignore module synopsis.
+\newcommand{\modulesynopsis}[1]{}
+
+% Reset "current" objects.
+\newcommand{\resetcurrentobjects}{
+  \renewcommand{\py@thisclass}{}
+  \renewcommand{\py@thismodule}{}
+  \renewcommand{\py@thismodulekey}{}
+  \renewcommand{\py@thismoduletype}{}
+}
+
+% Augment the sectioning commands used to get our own font family in place,
+% and reset some internal data items:
+\titleformat{\section}{\Large\py@HeaderFamily}%
+            {\py@TitleColor\thesection}{0.5em}{\py@TitleColor}{\py@NormalColor}
+\titleformat{\subsection}{\large\py@HeaderFamily}%
+            {\py@TitleColor\thesubsection}{0.5em}{\py@TitleColor}{\py@NormalColor}
+\titleformat{\subsubsection}{\py@HeaderFamily}%
+            {\py@TitleColor\thesubsubsection}{0.5em}{\py@TitleColor}{\py@NormalColor}
+\titleformat{\paragraph}{\large\py@HeaderFamily}%
+            {\py@TitleColor}{0em}{\py@TitleColor}{\py@NormalColor}
+
+
+% Now for a lot of semantically-loaded environments that do a ton of magical
+% things to get the right formatting and index entries for the stuff in
+% Python modules and C API.
+
+
+% {fulllineitems} is used in one place in libregex.tex, but is really for
+% internal use in this file.
+%
+\newcommand{\py@itemnewline}[1]{%
+  \@tempdima\linewidth%
+  \advance\@tempdima \leftmargin\makebox[\@tempdima][l]{#1}%
+}
+
+\newenvironment{fulllineitems}{
+  \begin{list}{}{\labelwidth \leftmargin \labelsep 0pt
+                 \rightmargin 0pt \topsep -\parskip \partopsep \parskip
+                 \itemsep -\parsep
+                 \let\makelabel=\py@itemnewline}
+}{\end{list}}
+
+% \optional is mostly for use in the arguments parameters to the various
+% {*desc} environments defined below, but may be used elsewhere.  Known to
+% be used in the debugger chapter.
+%
+% Typical usage:
+%
+%     \begin{funcdesc}{myfunc}{reqparm\optional{, optparm}}
+%                                    ^^^       ^^^
+%                          No space here       No space here
+%
+% When a function has multiple optional parameters, \optional should be
+% nested, not chained.  This is right:
+%
+%     \begin{funcdesc}{myfunc}{\optional{parm1\optional{, parm2}}}
+%
+\let\py@badkey=\@undefined
+
+\newcommand{\optional}[1]{%
+  {\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}}
+
+% This can be used when a function or method accepts an varying number 
+% of arguments, such as by using the *args syntax in the parameter list.
+\newcommand{\py@moreargs}{...}
+
+% This can be used when you don't want to document the parameters to a 
+% function or method, but simply state that it's an alias for
+% something else.
+\newcommand{\py@unspecified}{...}
+
+\newcommand{\py@varvars}[1]{{%
+    {\let\unspecified=\py@unspecified%
+      \let\moreargs=\py@moreargs%
+      \emph{#1}}}}
+
+\newlength{\py@argswidth}
+\newcommand{\py@sigparams}[1]{%
+  \parbox[t]{\py@argswidth}{\py@varvars{#1}\code{)}}}
+\newcommand{\py@sigline}[2]{%
+  \settowidth{\py@argswidth}{#1\code{(}}%
+  \addtolength{\py@argswidth}{-2\py@argswidth}%
+  \addtolength{\py@argswidth}{\textwidth}%
+  \item[#1\code{(}\py@sigparams{#2}]}
+
+% C functions ------------------------------------------------------------
+% \begin{cfuncdesc}[refcount]{type}{name}{arglist}
+% Note that the [refcount] slot should only be filled in by
+% tools/anno-api.py; it pulls the value from the refcounts database.
+\newcommand{\cfuncline}[3]{
+  \py@sigline{\code{#1 \bfcode{#2}}}{#3}%
+}
+\newenvironment{cfuncdesc}[3]{
+  \begin{fulllineitems}
+    \cfuncline{#1}{#2}{#3}
+}{\end{fulllineitems}}
+
+% C variables ------------------------------------------------------------
+% \begin{cvardesc}{type}{name}
+\newenvironment{cvardesc}[2]{
+  \begin{fulllineitems}
+    \item[\code{#1 \bfcode{#2}}]
+}{\end{fulllineitems}}
+
+% C data types -----------------------------------------------------------
+% \begin{ctypedesc}[index name]{typedef name}
+\newenvironment{ctypedesc}[2][\py@badkey]{
+  \begin{fulllineitems}
+    \item[\bfcode{#2}]
+}{\end{fulllineitems}}
+
+% C type fields ----------------------------------------------------------
+% \begin{cmemberdesc}{container type}{ctype}{membername}
+\newcommand{\cmemberline}[3]{
+  \item[\code{#2 \bfcode{#3}}]
+}
+\newenvironment{cmemberdesc}[3]{
+  \begin{fulllineitems}
+    \cmemberline{#1}{#2}{#3}
+}{\end{fulllineitems}}
+
+% Funky macros -----------------------------------------------------------
+% \begin{csimplemacrodesc}{name}
+% -- "simple" because it has no args; NOT for constant definitions!
+\newenvironment{csimplemacrodesc}[1]{
+  \begin{fulllineitems}
+    \item[\bfcode{#1}]
+}{\end{fulllineitems}}
+
+% simple functions (not methods) -----------------------------------------
+% \begin{funcdesc}{name}{args}
+\newcommand{\funcline}[2]{%
+  \py@sigline{\bfcode{#1}}{#2}}
+\newenvironment{funcdesc}[2]{
+  \begin{fulllineitems}
+    \funcline{#1}{#2}
+}{\end{fulllineitems}}
+
+% classes ----------------------------------------------------------------
+% \begin{classdesc}{name}{constructor args}
+\newcommand{\classline}[2]{
+  \py@sigline{\strong{class }\bfcode{#1}}{#2}}
+\newenvironment{classdesc}[2]{
+  % Using \renewcommand doesn't work for this, for unknown reasons:
+  \global\def\py@thisclass{#1}
+  \begin{fulllineitems}
+    \classline{#1}{#2}
+}{\end{fulllineitems}}
+
+% \begin{excclassdesc}{name}{constructor args}
+% but indexes as an exception
+\newenvironment{excclassdesc}[2]{
+  % Using \renewcommand doesn't work for this, for unknown reasons:
+  \global\def\py@thisclass{#1}
+  \begin{fulllineitems}
+    \py@sigline{\strong{exception }\bfcode{#1}}{#2}%
+}{\end{fulllineitems}}
+
+% There is no corresponding {excclassdesc*} environment.  To describe
+% a class exception without parameters, use the {excdesc} environment.
+
+
+\let\py@classbadkey=\@undefined
+
+% object method ----------------------------------------------------------
+% \begin{methoddesc}[classname]{methodname}{args}
+\newcommand{\methodline}[3][\@undefined]{
+  \py@sigline{\bfcode{#2}}{#3}}
+\newenvironment{methoddesc}[3][\@undefined]{
+  \begin{fulllineitems}
+    \ifx\@undefined#1\relax
+      \methodline{#2}{#3}
+    \else
+      \def\py@thisclass{#1}
+      \methodline{#2}{#3}
+    \fi
+}{\end{fulllineitems}}
+
+% static method ----------------------------------------------------------
+% \begin{staticmethoddesc}[classname]{methodname}{args}
+\newcommand{\staticmethodline}[3][\@undefined]{
+  \py@sigline{static \bfcode{#2}}{#3}}
+\newenvironment{staticmethoddesc}[3][\@undefined]{
+  \begin{fulllineitems}
+    \ifx\@undefined#1\relax
+      \staticmethodline{#2}{#3}
+    \else
+      \def\py@thisclass{#1}
+      \staticmethodline{#2}{#3}
+    \fi
+}{\end{fulllineitems}}
+
+% object data attribute --------------------------------------------------
+% \begin{memberdesc}[classname]{membername}
+\newcommand{\memberline}[2][\py@classbadkey]{%
+  \ifx\@undefined#1\relax
+    \item[\bfcode{#2}]
+  \else
+    \item[\bfcode{#2}]
+  \fi
+}
+\newenvironment{memberdesc}[2][\py@classbadkey]{
+  \begin{fulllineitems}
+    \ifx\@undefined#1\relax
+      \memberline{#2}
+    \else
+      \def\py@thisclass{#1}
+      \memberline{#2}
+    \fi
+}{\end{fulllineitems}}
+
+% For exceptions: --------------------------------------------------------
+% \begin{excdesc}{name}
+%  -- for constructor information, use excclassdesc instead
+\newenvironment{excdesc}[1]{
+  \begin{fulllineitems}
+    \item[\strong{exception }\bfcode{#1}]
+}{\end{fulllineitems}}
+
+% Module data or constants: ----------------------------------------------
+% \begin{datadesc}{name}
+\newcommand{\dataline}[1]{%
+  \item[\bfcode{#1}]\nopagebreak}
+\newenvironment{datadesc}[1]{
+  \begin{fulllineitems}
+    \dataline{#1}
+}{\end{fulllineitems}}
+
+% bytecode instruction ---------------------------------------------------
+% \begin{opcodedesc}{name}{var}
+% -- {var} may be {}
+\newenvironment{opcodedesc}[2]{
+  \begin{fulllineitems}
+    \item[\bfcode{#1}\quad\emph{#2}]
+}{\end{fulllineitems}}
+
+% generic description ----------------------------------------------------
+\newcommand{\descline}[1]{%
+  \item[\bfcode{#1}]\nopagebreak%
+}
+\newenvironment{describe}[1]{
+  \begin{fulllineitems}
+    \descline{#1}
+}{\end{fulllineitems}}
+
+% This version is being checked in for the historical record; it shows
+% how I've managed to get some aspects of this to work.  It will not
+% be used in practice, so a subsequent revision will change things
+% again.  This version has problems, but shows how to do something
+% that proved more tedious than I'd expected, so I don't want to lose
+% the example completely.
+%
+\newcommand{\grammartoken}[1]{\texttt{#1}}
+\newenvironment{productionlist}[1][\py@badkey]{
+  \def\optional##1{{\Large[}##1{\Large]}}
+  \def\production##1##2{\code{##1}&::=&\code{##2}\\}
+  \def\productioncont##1{& &\code{##1}\\}
+  \def\token##1{##1}
+  \let\grammartoken=\token
+  \parindent=2em
+  \indent
+  \begin{tabular}{lcl}
+}{%
+  \end{tabular}
+}
+
+% Notices / Admonitions
+%
+\newlength{\py@noticelength}
+
+\newcommand{\py@heavybox}{
+  \setlength{\fboxrule}{1pt}
+  \setlength{\fboxsep}{7pt}
+  \setlength{\py@noticelength}{\linewidth}
+  \addtolength{\py@noticelength}{-2\fboxsep}
+  \addtolength{\py@noticelength}{-2\fboxrule}
+  \setlength{\shadowsize}{3pt}
+  \Sbox
+  \minipage{\py@noticelength}
+}
+\newcommand{\py@endheavybox}{
+  \endminipage
+  \endSbox
+  \fbox{\TheSbox}
+}
+
+% Some are quite plain:
+\newcommand{\py@noticestart@note}{}
+\newcommand{\py@noticeend@note}{}
+\newcommand{\py@noticestart@hint}{}
+\newcommand{\py@noticeend@hint}{}
+\newcommand{\py@noticestart@important}{}
+\newcommand{\py@noticeend@important}{}
+\newcommand{\py@noticestart@tip}{}
+\newcommand{\py@noticeend@tip}{}
+
+% Others gets more visible distinction:
+\newcommand{\py@noticestart@warning}{\py@heavybox}
+\newcommand{\py@noticeend@warning}{\py@endheavybox}
+\newcommand{\py@noticestart@caution}{\py@heavybox}
+\newcommand{\py@noticeend@caution}{\py@endheavybox}
+\newcommand{\py@noticestart@attention}{\py@heavybox}
+\newcommand{\py@noticeend@attention}{\py@endheavybox}
+\newcommand{\py@noticestart@danger}{\py@heavybox}
+\newcommand{\py@noticeend@danger}{\py@endheavybox}
+\newcommand{\py@noticestart@error}{\py@heavybox}
+\newcommand{\py@noticeend@error}{\py@endheavybox}
+
+\newenvironment{notice}[2]{
+  \def\py@noticetype{#1}
+  \csname py@noticestart@#1\endcsname
+  \par\strong{#2}
+}{\csname py@noticeend@\py@noticetype\endcsname}
+
+% Allow the release number to be specified independently of the
+% \date{}.  This allows the date to reflect the document's date and
+% release to specify the release that is documented.
+%
+\newcommand{\py@release}{}
+\newcommand{\version}{}
+\newcommand{\shortversion}{}
+\newcommand{\releaseinfo}{}
+\newcommand{\releasename}{Release}
+\newcommand{\release}[1]{%
+  \renewcommand{\py@release}{\releasename\space\version}%
+  \renewcommand{\version}{#1}}
+\newcommand{\setshortversion}[1]{%
+  \renewcommand{\shortversion}{#1}}
+\newcommand{\setreleaseinfo}[1]{%
+  \renewcommand{\releaseinfo}{#1}}
+
+% Allow specification of the author's address separately from the
+% author's name.  This can be used to format them differently, which
+% is a good thing.
+%
+\newcommand{\py@authoraddress}{}
+\newcommand{\authoraddress}[1]{\renewcommand{\py@authoraddress}{#1}}
+
+% This sets up the fancy chapter headings that make the documents look
+% at least a little better than the usual LaTeX output.
+%
+\@ifundefined{ChTitleVar}{}{
+  \ChNameVar{\raggedleft\normalsize\py@HeaderFamily}
+  \ChNumVar{\raggedleft \bfseries\Large\py@HeaderFamily}
+  \ChTitleVar{\raggedleft \rm\Huge\py@HeaderFamily}
+  % This creates chapter heads without the leading \vspace*{}:
+  \def\@makechapterhead#1{%
+    {\parindent \z@ \raggedright \normalfont
+      \ifnum \c@secnumdepth >\m@ne
+        \DOCH
+      \fi
+      \interlinepenalty\@M
+      \DOTI{#1}
+    }
+  }
+}
+
+% Redefine description environment so that it is usable inside fulllineitems.
+%
+\renewcommand{\description}{%
+  \list{}{\labelwidth\z@%
+          \itemindent-\leftmargin%
+	  \labelsep5pt%
+          \let\makelabel=\descriptionlabel}}
+
+% Definition lists; requested by AMK for HOWTO documents.  Probably useful
+% elsewhere as well, so keep in in the general style support.
+%
+\newenvironment{definitions}{%
+  \begin{description}%
+  \def\term##1{\item[##1]\mbox{}\\*[0mm]}
+}{%
+  \end{description}%
+}
+
+% Tell TeX about pathological hyphenation cases:
+\hyphenation{Base-HTTP-Re-quest-Hand-ler}
+
+
+% The following is stuff copied from docutils' latex writer.
+%
+\newcommand{\optionlistlabel}[1]{\bf #1 \hfill}
+\newenvironment{optionlist}[1]
+{\begin{list}{}
+  {\setlength{\labelwidth}{#1}
+   \setlength{\rightmargin}{1cm}
+   \setlength{\leftmargin}{\rightmargin}
+   \addtolength{\leftmargin}{\labelwidth}
+   \addtolength{\leftmargin}{\labelsep}
+   \renewcommand{\makelabel}{\optionlistlabel}}
+}{\end{list}}
+
+\newlength{\lineblockindentation}
+\setlength{\lineblockindentation}{2.5em}
+\newenvironment{lineblock}[1]
+{\begin{list}{}
+  {\setlength{\partopsep}{\parskip}
+   \addtolength{\partopsep}{\baselineskip}
+   \topsep0pt\itemsep0.15\baselineskip\parsep0pt
+   \leftmargin#1}
+ \raggedright}
+{\end{list}}
+
+% Redefine includgraphics for avoiding images larger than the screen size
+% If the size is not specified.
+\let\py@Oldincludegraphics\includegraphics
+
+\newbox\image@box%
+\newdimen\image@width%
+\renewcommand\includegraphics[2][\@empty]{%
+  \ifx#1\@empty%
+    \setbox\image@box=\hbox{\py@Oldincludegraphics{#2}}%
+    \image@width\wd\image@box%
+    \ifdim \image@width>\linewidth%
+      \setbox\image@box=\hbox{\py@Oldincludegraphics[width=\linewidth]{#2}}%
+    \fi%
+    \box\image@box%
+  \else%
+    \py@Oldincludegraphics[#1]{#2}%
+  \fi%
+}
+
+
+% Fix the index and bibliography environments to add an entry to the Table of
+% Contents; this is much nicer than just having to jump to the end of the book
+% and flip around, especially with multiple indexes.
+%
+\let\py@OldTheindex=\theindex
+\renewcommand{\theindex}{
+  \cleardoublepage
+  \phantomsection
+  \py@OldTheindex
+  \addcontentsline{toc}{chapter}{\indexname}
+}
+
+\let\py@OldThebibliography=\thebibliography
+\renewcommand{\thebibliography}[1]{
+  \cleardoublepage
+  \phantomsection
+  \py@OldThebibliography{1}
+  \addcontentsline{toc}{chapter}{\bibname}
+}
+
+% Include hyperref last.
+\RequirePackage[colorlinks,breaklinks,
+                linkcolor=InnerLinkColor,filecolor=OuterLinkColor,
+                menucolor=OuterLinkColor,pagecolor=OuterLinkColor,
+                urlcolor=OuterLinkColor]{hyperref}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/texinputs/tabulary.sty	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,449 @@
+%%
+%% This is file `tabulary.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% tabulary.dtx  (with options: `package')
+%% DRAFT VERSION
+%%
+%% File `tabulary.dtx'.
+%% Copyright (C) 1995 1996 2003 David Carlisle
+%% This file may be distributed under the terms of the LPPL.
+%% See 00readme.txt for details.
+%%
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{tabulary}
+          [2007/10/02 v0.9 tabulary package (DPC)]
+\RequirePackage{array}
+\catcode`\Z=14
+\DeclareOption{debugshow}{\catcode`\Z=9\relax}
+\ProcessOptions
+\def\arraybackslash{\let\\=\@arraycr}
+\def\@finalstrut#1{%
+  \unskip\ifhmode\nobreak\fi\vrule\@width\z@\@height\z@\@depth\dp#1}
+\newcount\TY@count
+\def\tabulary{%
+  \let\TY@final\tabular
+  \let\endTY@final\endtabular
+  \TY@tabular}
+\def\TY@tabular#1{%
+  \edef\TY@{\@currenvir}%
+  {\ifnum0=`}\fi
+  \@ovxx\TY@linewidth
+  \@ovyy\TY@tablewidth
+  \count@\z@
+  \@tempswatrue
+  \@whilesw\if@tempswa\fi{%
+  \advance\count@\@ne
+  \expandafter\ifx\csname TY@F\the\count@\endcsname\relax
+    \@tempswafalse
+  \else
+    \expandafter\let\csname TY@SF\the\count@\expandafter\endcsname
+                     \csname TY@F\the\count@\endcsname
+    \global\expandafter\let\csname TY@F\the\count@\endcsname\relax
+    \expandafter\let\csname TY@S\the\count@\expandafter\endcsname
+                     \csname TY@\the\count@\endcsname
+  \fi}%
+    \global\TY@count\@ne
+    \TY@width\xdef{0pt}%
+    \global\TY@tablewidth\z@
+    \global\TY@linewidth#1\relax
+Z\message{^^J^^JTable^^J%
+Z        Target Width: \the\TY@linewidth^^J%
+Z        \string\tabcolsep: \the\tabcolsep\space
+Z        \string\arrayrulewidth: \the\arrayrulewidth\space
+Z        \string\doublerulesep: \the\doublerulesep^^J%
+Z        \string\tymin: \the\tymin\space
+Z        \string\tymax: \the\tymax^^J}%
+    \let\@classz\TY@classz
+    \let\verb\TX@verb
+    \toks@{}\TY@get@body}
+\let\TY@@mkpream\@mkpream
+\def\TY@mkpream{%
+    \def\@addamp{%
+      \if@firstamp \@firstampfalse \else
+      \global\advance\TY@count\@ne
+      \edef\@preamble{\@preamble &}\fi
+      \TY@width\xdef{0pt}}%
+    \def\@acol{%
+      \TY@subwidth\col@sep
+      \@addtopreamble{\hskip\col@sep}}%
+    \let\@arrayrule\TY@arrayrule
+    \let\@classvi\TY@classvi
+    \def\@classv{\save@decl
+      \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@
+      \sbox\z@{\d@llarbegin\@nextchar\d@llarend}%
+      \TY@subwidth{\wd\z@}%
+      \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}%
+      \prepnext@tok}%
+  \global\let\@mkpream\TY@@mkpream
+  \TY@@mkpream}
+\def\TY@arrayrule{%
+  \TY@subwidth\arrayrulewidth
+  \@addtopreamble \vline}
+\def\TY@classvi{\ifcase \@lastchclass
+  \@acol \or
+  \TY@subwidth\doublerulesep
+  \@addtopreamble{\hskip \doublerulesep}\or
+  \@acol \or
+  \@classvii
+  \fi}
+\def\TY@tab{%
+  \setbox\z@\hbox\bgroup
+  \let\[$\let\]$%
+  \let\equation$\let\endequation$%
+    \col@sep\tabcolsep
+    \let\d@llarbegin\begingroup\let\d@llarend\endgroup
+    \let\@mkpream\TY@mkpream
+      \def\multicolumn##1##2##3{\multispan##1\relax}%
+    \CT@start\TY@tabarray}
+\def\TY@tabarray{\@ifnextchar[{\TY@array}{\@array[t]}}
+\def\TY@array[#1]{\@array[t]}
+\def\TY@width#1{%
+  \expandafter#1\csname TY@\the\TY@count\endcsname}
+\def\TY@subwidth#1{%
+  \TY@width\dimen@
+  \advance\dimen@-#1\relax
+  \TY@width\xdef{\the\dimen@}%
+  \global\advance\TY@linewidth-#1\relax}
+\def\endtabulary{%
+  \gdef\@halignto{}%
+  \expandafter\TY@tab\the\toks@
+  \crcr\omit
+  {\xdef\TY@save@row{}%
+     \loop
+    \advance\TY@count\m@ne
+    \ifnum\TY@count>\z@
+    \xdef\TY@save@row{\TY@save@row&\omit}%
+    \repeat}\TY@save@row
+  \endarray\global\setbox1=\lastbox\setbox0=\vbox{\unvbox1
+    \unskip\global\setbox1=\lastbox}\egroup
+  \dimen@\TY@linewidth
+  \divide\dimen@\TY@count
+  \ifdim\dimen@<\tymin
+    \TY@warn{tymin too large (\the\tymin), resetting to \the\dimen@}%
+    \tymin\dimen@
+  \fi
+  \setbox\tw@=\hbox{\unhbox\@ne
+    \loop
+\@tempdima=\lastskip
+\ifdim\@tempdima>\z@
+Z   \message{ecs=\the\@tempdima^^J}%
+   \global\advance\TY@linewidth-\@tempdima
+\fi
+    \unskip
+    \setbox\tw@=\lastbox
+    \ifhbox\tw@
+Z     \message{Col \the\TY@count: Initial=\the\wd\tw@\space}%
+      \ifdim\wd\tw@>\tymax
+        \wd\tw@\tymax
+Z       \message{> max\space}%
+Z     \else
+Z       \message{ \@spaces\space}%
+      \fi
+  \TY@width\dimen@
+Z \message{\the\dimen@\space}%
+  \advance\dimen@\wd\tw@
+Z \message{Final=\the\dimen@\space}%
+   \TY@width\xdef{\the\dimen@}%
+      \ifdim\dimen@<\tymin
+Z        \message{< tymin}%
+         \global\advance\TY@linewidth-\dimen@
+         \expandafter\xdef\csname TY@F\the\TY@count\endcsname
+                                                        {\the\dimen@}%
+       \else
+      \expandafter\ifx\csname TY@F\the\TY@count\endcsname\z@
+Z        \message{***}%
+         \global\advance\TY@linewidth-\dimen@
+         \expandafter\xdef\csname TY@F\the\TY@count\endcsname
+                                                        {\the\dimen@}%
+        \else
+Z        \message{> tymin}%
+         \global\advance\TY@tablewidth\dimen@
+         \global\expandafter\let\csname TY@F\the\TY@count\endcsname
+                                                               \maxdimen
+       \fi\fi
+       \advance\TY@count\m@ne
+    \repeat}%
+    \TY@checkmin
+    \TY@checkmin
+    \TY@checkmin
+    \TY@checkmin
+    \TY@count\z@
+    \let\TY@box\TY@box@v
+  {\expandafter\TY@final\the\toks@\endTY@final}%
+  \count@\z@
+  \@tempswatrue
+  \@whilesw\if@tempswa\fi{%
+  \advance\count@\@ne
+  \expandafter\ifx\csname TY@SF\the\count@\endcsname\relax
+    \@tempswafalse
+  \else
+    \global\expandafter\let\csname TY@F\the\count@\expandafter\endcsname
+                   \csname TY@SF\the\count@\endcsname
+    \global\expandafter\let\csname TY@\the\count@\expandafter\endcsname
+                   \csname TY@S\the\count@\endcsname
+  \fi}%
+  \TY@linewidth\@ovxx
+  \TY@tablewidth\@ovyy
+    \ifnum0=`{\fi}}
+\def\TY@checkmin{%
+  \let\TY@checkmin\relax
+\ifdim\TY@tablewidth>\z@
+  \Gscale@div\TY@ratio\TY@linewidth\TY@tablewidth
+ \ifdim\TY@tablewidth <\linewidth
+   \def\TY@ratio{1}%
+ \fi
+\else
+  \TY@warn{No suitable columns!}%
+  \def\TY@ratio{1}%
+\fi
+\count@\z@
+Z \message{^^JLine Width: \the\TY@linewidth,
+Z             Natural Width: \the\TY@tablewidth,
+Z             Ratio: \TY@ratio^^J}%
+\@tempdima\z@
+\loop
+\ifnum\count@<\TY@count
+\advance\count@\@ne
+  \ifdim\csname TY@F\the\count@\endcsname>\tymin
+    \dimen@\csname TY@\the\count@\endcsname
+    \dimen@\TY@ratio\dimen@
+    \ifdim\dimen@<\tymin
+Z     \message{Column \the\count@\space ->}%
+      \global\expandafter\let\csname TY@F\the\count@\endcsname\tymin
+      \global\advance\TY@linewidth-\tymin
+      \global\advance\TY@tablewidth-\csname TY@\the\count@\endcsname
+      \let\TY@checkmin\TY@@checkmin
+    \else
+      \expandafter\xdef\csname TY@F\the\count@\endcsname{\the\dimen@}%
+      \advance\@tempdima\csname TY@F\the\count@\endcsname
+    \fi
+  \fi
+Z \dimen@\csname TY@F\the\count@\endcsname\message{\the\dimen@, }%
+\repeat
+Z \message{^^JTotal:\the\@tempdima^^J}%
+}
+\let\TY@@checkmin\TY@checkmin
+\newdimen\TY@linewidth
+\def\tyformat{\everypar{{\nobreak\hskip\z@skip}}}
+\newdimen\tymin
+\tymin=10pt
+\newdimen\tymax
+\tymax=2\textwidth
+\def\@testpach{\@chclass
+ \ifnum \@lastchclass=6 \@ne \@chnum \@ne \else
+  \ifnum \@lastchclass=7 5 \else
+   \ifnum \@lastchclass=8 \tw@ \else
+    \ifnum \@lastchclass=9 \thr@@
+   \else \z@
+   \ifnum \@lastchclass = 10 \else
+   \edef\@nextchar{\expandafter\string\@nextchar}%
+   \@chnum
+   \if \@nextchar c\z@ \else
+    \if \@nextchar l\@ne \else
+     \if \@nextchar r\tw@ \else
+   \if \@nextchar C7 \else
+    \if \@nextchar L8 \else
+     \if \@nextchar R9 \else
+     \if \@nextchar J10 \else
+   \z@ \@chclass
+   \if\@nextchar |\@ne \else
+    \if \@nextchar !6 \else
+     \if \@nextchar @7 \else
+      \if \@nextchar <8 \else
+       \if \@nextchar >9 \else
+  10
+  \@chnum
+  \if \@nextchar m\thr@@\else
+   \if \@nextchar p4 \else
+    \if \@nextchar b5 \else
+   \z@ \@chclass \z@ \@preamerr \z@ \fi \fi \fi \fi\fi \fi \fi\fi \fi
+     \fi  \fi  \fi  \fi  \fi  \fi \fi \fi \fi \fi \fi}
+\def\TY@classz{%
+  \@classx
+  \@tempcnta\count@
+  \ifx\TY@box\TY@box@v
+    \global\advance\TY@count\@ne
+  \fi
+  \let\centering c%
+  \let\raggedright\noindent
+  \let\raggedleft\indent
+  \let\arraybackslash\relax
+  \prepnext@tok
+  \ifnum\@chnum<4
+    \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@
+  \fi
+  \ifnum\@chnum=6
+    \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@
+  \fi
+  \@addtopreamble{%
+    \ifcase\@chnum
+      \hfil \d@llarbegin\insert@column\d@llarend \hfil \or
+      \kern\z@
+       \d@llarbegin \insert@column \d@llarend \hfil \or
+      \hfil\kern\z@ \d@llarbegin \insert@column \d@llarend \or
+      $\vcenter\@startpbox{\@nextchar}\insert@column \@endpbox $\or
+      \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or
+      \vbox \@startpbox{\@nextchar}\insert@column \@endpbox \or
+      \d@llarbegin \insert@column \d@llarend \or% dubious "s" case
+      \TY@box\centering\or
+      \TY@box\raggedright\or
+      \TY@box\raggedleft\or
+      \TY@box\relax
+    \fi}\prepnext@tok}
+\def\TY@box#1{%
+  \ifx\centering#1%
+      \hfil \d@llarbegin\insert@column\d@llarend \hfil \else
+  \ifx\raggedright#1%
+        \kern\z@%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+      \d@llarbegin \insert@column \d@llarend \hfil \else
+  \ifx\raggedleft#1%
+      \hfil\kern\z@ \d@llarbegin \insert@column \d@llarend \else
+  \ifx\relax#1%
+       \d@llarbegin \insert@column \d@llarend
+  \fi  \fi  \fi  \fi}
+\def\TY@box@v#1{%
+      \vtop \@startpbox{\csname TY@F\the\TY@count\endcsname}%
+              #1\arraybackslash\tyformat
+                              \insert@column\@endpbox}
+\newdimen\TY@tablewidth
+\def\Gscale@div#1#2#3{%
+  \setlength\dimen@{#3}%
+  \ifdim\dimen@=\z@
+    \PackageError{graphics}{Division by 0}\@eha
+    \dimen@#2%
+  \fi
+  \edef\@tempd{\the\dimen@}%
+  \setlength\dimen@{#2}%
+  \count@65536\relax
+  \ifdim\dimen@<\z@
+    \dimen@-\dimen@
+    \count@-\count@
+  \fi
+  \loop
+    \ifdim\dimen@<8192\p@
+      \dimen@\tw@\dimen@
+      \divide\count@\tw@
+  \repeat
+  \dimen@ii=\@tempd\relax
+  \divide\dimen@ii\count@
+  \divide\dimen@\dimen@ii
+  \edef#1{\strip@pt\dimen@}}
+\long\def\TY@get@body#1\end
+  {\toks@\expandafter{\the\toks@#1}\TY@find@end}
+\def\TY@find@end#1{%
+  \def\@tempa{#1}%
+  \ifx\@tempa\TY@\def\@tempa{\end{#1}}\expandafter\@tempa
+  \else\toks@\expandafter
+    {\the\toks@\end{#1}}\expandafter\TY@get@body\fi}
+\def\TY@warn{%
+  \PackageWarning{tabulary}}
+\catcode`\Z=11
+\AtBeginDocument{
+\@ifpackageloaded{colortbl}{%
+\expandafter\def\expandafter\@mkpream\expandafter#\expandafter1%
+  \expandafter{%
+    \expandafter\let\expandafter\CT@setup\expandafter\relax
+    \expandafter\let\expandafter\CT@color\expandafter\relax
+    \expandafter\let\expandafter\CT@do@color\expandafter\relax
+    \expandafter\let\expandafter\color\expandafter\relax
+    \expandafter\let\expandafter\CT@column@color\expandafter\relax
+    \expandafter\let\expandafter\CT@row@color\expandafter\relax
+    \@mkpream{#1}}
+\let\TY@@mkpream\@mkpream
+\def\TY@classz{%
+  \@classx
+  \@tempcnta\count@
+  \ifx\TY@box\TY@box@v
+    \global\advance\TY@count\@ne
+  \fi
+  \let\centering c%
+  \let\raggedright\noindent
+  \let\raggedleft\indent
+  \let\arraybackslash\relax
+  \prepnext@tok
+\expandafter\CT@extract\the\toks\@tempcnta\columncolor!\@nil
+  \ifnum\@chnum<4
+    \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@
+  \fi
+  \ifnum\@chnum=6
+    \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@
+  \fi
+  \@addtopreamble{%
+    \setbox\z@\hbox\bgroup\bgroup
+    \ifcase\@chnum
+      \hskip\stretch{.5}\kern\z@
+      \d@llarbegin\insert@column\d@llarend\hskip\stretch{.5}\or
+      \kern\z@%<<<<<<<<<<<<<<<<<<<<<<<<<<<
+       \d@llarbegin \insert@column \d@llarend \hfill \or
+      \hfill\kern\z@ \d@llarbegin \insert@column \d@llarend \or
+      $\vcenter\@startpbox{\@nextchar}\insert@column \@endpbox $\or
+      \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or
+      \vbox \@startpbox{\@nextchar}\insert@column \@endpbox \or
+      \d@llarbegin \insert@column \d@llarend \or% dubious s case
+      \TY@box\centering\or
+      \TY@box\raggedright\or
+      \TY@box\raggedleft\or
+      \TY@box\relax
+    \fi
+ \egroup\egroup
+\begingroup
+  \CT@setup
+  \CT@column@color
+  \CT@row@color
+  \CT@do@color
+\endgroup
+        \@tempdima\ht\z@
+        \advance\@tempdima\minrowclearance
+        \vrule\@height\@tempdima\@width\z@
+\unhbox\z@
+}\prepnext@tok}%
+    \def\TY@arrayrule{%
+      \TY@subwidth\arrayrulewidth
+      \@addtopreamble{{\CT@arc@\vline}}}%
+    \def\TY@classvi{\ifcase \@lastchclass
+      \@acol \or
+      \TY@subwidth\doublerulesep
+      \ifx\CT@drsc@\relax
+        \@addtopreamble{\hskip\doublerulesep}%
+      \else
+        \@addtopreamble{{\CT@drsc@\vrule\@width\doublerulesep}}%
+      \fi\or
+      \@acol \or
+      \@classvii
+      \fi}%
+}{%
+\let\CT@start\relax
+}
+}
+{\uccode`\*=`\ %
+\uppercase{\gdef\TX@verb{%
+  \leavevmode\null\TX@vwarn
+  {\ifnum0=`}\fi\ttfamily\let\\\ignorespaces
+  \@ifstar{\let~*\TX@vb}{\TX@vb}}}}
+\def\TX@vb#1{\def\@tempa##1#1{\toks@{##1}\edef\@tempa{\the\toks@}%
+    \expandafter\TX@v\meaning\@tempa\\ \\\ifnum0=`{\fi}}\@tempa!}
+\def\TX@v#1!{\afterassignment\TX@vfirst\let\@tempa= }
+\begingroup
+\catcode`\*=\catcode`\#
+\catcode`\#=12
+\gdef\TX@vfirst{%
+  \if\@tempa#%
+    \def\@tempb{\TX@v@#}%
+  \else
+    \let\@tempb\TX@v@
+    \if\@tempa\space~\else\@tempa\fi
+  \fi
+  \@tempb}
+\gdef\TX@v@*1 *2{%
+  \TX@v@hash*1##\relax\if*2\\\else~\expandafter\TX@v@\fi*2}
+\gdef\TX@v@hash*1##*2{*1\ifx*2\relax\else#\expandafter\TX@v@hash\fi*2}
+\endgroup
+\def\TX@vwarn{%
+  \@warning{\noexpand\verb may be unreliable inside tabularx/y}%
+  \global\let\TX@vwarn\@empty}
+\endinput
+%%
+%% End of file `tabulary.sty'.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/textwriter.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,679 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.textwriter
+    ~~~~~~~~~~~~~~~~~
+
+    Custom docutils writer for plain text.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+import textwrap
+
+from docutils import nodes, writers
+
+from sphinx import addnodes
+from sphinx.locale import admonitionlabels, versionlabels
+
+
+class TextWriter(writers.Writer):
+    supported = ('text',)
+    settings_spec = ('No options here.', '', ())
+    settings_defaults = {}
+
+    output = None
+
+    def __init__(self, builder):
+        writers.Writer.__init__(self)
+        self.builder = builder
+
+    def translate(self):
+        visitor = TextTranslator(self.document, self.builder)
+        self.document.walkabout(visitor)
+        self.output = visitor.body
+
+# monkey-patch...
+new_wordsep_re = re.compile(
+        r'(\s+|'                                  # any whitespace
+        r'(?<=\s)(?::[a-z-]+:)?`\S+|'             # interpreted text start
+        r'[^\s\w]*\w+[a-zA-Z]-(?=\w+[a-zA-Z])|'   # hyphenated words
+        r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))')   # em-dash
+textwrap.TextWrapper.wordsep_re = new_wordsep_re
+
+MAXWIDTH = 70
+STDINDENT = 3
+
+
+class TextTranslator(nodes.NodeVisitor):
+    sectionchars = '*=-~"+'
+
+    def __init__(self, document, builder):
+        nodes.NodeVisitor.__init__(self, document)
+
+        self.states = [[]]
+        self.stateindent = [0]
+        self.sectionlevel = 0
+        self.table = None
+
+    def add_text(self, text):
+        self.states[-1].append((-1, text))
+    def new_state(self, indent=STDINDENT):
+        self.states.append([])
+        self.stateindent.append(indent)
+    def end_state(self, wrap=True, end=[''], first=None):
+        content = self.states.pop()
+        maxindent = sum(self.stateindent)
+        indent = self.stateindent.pop()
+        result = []
+        toformat = []
+        def do_format():
+            if not toformat:
+                return
+            if wrap:
+                res = textwrap.wrap(''.join(toformat), width=MAXWIDTH-maxindent)
+            else:
+                res = ''.join(toformat).splitlines()
+            if end:
+                res += end
+            result.append((indent, res))
+        for itemindent, item in content:
+            if itemindent == -1:
+                toformat.append(item)
+            else:
+                do_format()
+                result.append((indent + itemindent, item))
+                toformat = []
+        do_format()
+        if first is not None and result:
+            itemindent, item = result[0]
+            if item:
+                result.insert(0, (itemindent - indent, [first + item[0]]))
+                result[1] = (itemindent, item[1:])
+        self.states[-1].extend(result)
+
+    def visit_document(self, node):
+        self.new_state(0)
+    def depart_document(self, node):
+        self.end_state()
+        self.body = '\n'.join(line and (' '*indent + line)
+                              for indent, lines in self.states[0]
+                              for line in lines)
+        # XXX header/footer?
+
+    def visit_highlightlang(self, node):
+        raise nodes.SkipNode
+
+    def visit_section(self, node):
+        self._title_char = self.sectionchars[self.sectionlevel]
+        self.sectionlevel += 1
+    def depart_section(self, node):
+        self.sectionlevel -= 1
+
+    def visit_topic(self, node):
+        self.new_state(0)
+    def depart_topic(self, node):
+        self.end_state()
+
+    visit_sidebar = visit_topic
+    depart_sidebar = depart_topic
+
+    def visit_rubric(self, node):
+        self.new_state(0)
+        self.add_text('-[ ')
+    def depart_rubric(self, node):
+        self.add_text(' ]-')
+        self.end_state()
+
+    def visit_compound(self, node):
+        pass
+    def depart_compound(self, node):
+        pass
+
+    def visit_glossary(self, node):
+        pass
+    def depart_glossary(self, node):
+        pass
+
+    def visit_title(self, node):
+        if isinstance(node.parent, nodes.Admonition):
+            self.add_text(node.astext()+': ')
+            raise nodes.SkipNode
+        self.new_state(0)
+    def depart_title(self, node):
+        if isinstance(node.parent, nodes.section):
+            char = self._title_char
+        else:
+            char = '^'
+        text = ''.join(x[1] for x in self.states.pop() if x[0] == -1)
+        self.stateindent.pop()
+        self.states[-1].append((0, ['', text, '%s' % (char * len(text)), '']))
+
+    def visit_subtitle(self, node):
+        pass
+    def depart_subtitle(self, node):
+        pass
+
+    def visit_attribution(self, node):
+        self.add_text('-- ')
+    def depart_attribution(self, node):
+        pass
+
+    def visit_module(self, node):
+        if node.has_key('platform'):
+            self.new_state(0)
+            self.add_text(_('Platform: %s') % node['platform'])
+            self.end_state()
+        raise nodes.SkipNode
+
+    def visit_desc(self, node):
+        pass
+    def depart_desc(self, node):
+        pass
+
+    def visit_desc_signature(self, node):
+        self.new_state(0)
+        if node.parent['desctype'] in ('class', 'exception'):
+            self.add_text('%s ' % node.parent['desctype'])
+    def depart_desc_signature(self, node):
+        # XXX: wrap signatures in a way that makes sense
+        self.end_state(wrap=False, end=None)
+
+    def visit_desc_name(self, node):
+        pass
+    def depart_desc_name(self, node):
+        pass
+
+    def visit_desc_addname(self, node):
+        pass
+    def depart_desc_addname(self, node):
+        pass
+
+    def visit_desc_type(self, node):
+        pass
+    def depart_desc_type(self, node):
+        pass
+
+    def visit_desc_parameterlist(self, node):
+        self.add_text('(')
+        self.first_param = 1
+    def depart_desc_parameterlist(self, node):
+        self.add_text(')')
+
+    def visit_desc_parameter(self, node):
+        if not self.first_param:
+            self.add_text(', ')
+        else:
+            self.first_param = 0
+        self.add_text(node.astext())
+        raise nodes.SkipNode
+
+    def visit_desc_optional(self, node):
+        self.add_text('[')
+    def depart_desc_optional(self, node):
+        self.add_text(']')
+
+    def visit_desc_annotation(self, node):
+        pass
+    def depart_desc_annotation(self, node):
+        pass
+
+    def visit_refcount(self, node):
+        pass
+    def depart_refcount(self, node):
+        pass
+
+    def visit_desc_content(self, node):
+        self.new_state()
+        self.add_text('\n')
+    def depart_desc_content(self, node):
+        self.end_state()
+
+    def visit_figure(self, node):
+        self.new_state()
+    def depart_figure(self, node):
+        self.end_state()
+
+    def visit_caption(self, node):
+        pass
+    def depart_caption(self, node):
+        pass
+
+    def visit_productionlist(self, node):
+        self.new_state()
+        names = []
+        for production in node:
+            names.append(production['tokenname'])
+        maxlen = max(len(name) for name in names)
+        for production in node:
+            if production['tokenname']:
+                self.add_text(production['tokenname'].ljust(maxlen) + ' ::=')
+                lastname = production['tokenname']
+            else:
+                self.add_text('%s    ' % (' '*len(lastname)))
+            self.add_text(production.astext() + '\n')
+        self.end_state(wrap=False)
+        raise nodes.SkipNode
+
+    def visit_seealso(self, node):
+        self.new_state()
+    def depart_seealso(self, node):
+        self.end_state(first='')
+
+    def visit_footnote(self, node):
+        self._footnote = node.children[0].astext().strip()
+        self.new_state(len(self._footnote) + 3)
+    def depart_footnote(self, node):
+        self.end_state(first='[%s] ' % self._footnote)
+
+    def visit_citation(self, node):
+        if len(node) and isinstance(node[0], nodes.label):
+            self._citlabel = node[0].astext()
+        else:
+            self._citlabel = ''
+        self.new_state(len(self._citlabel) + 3)
+    def depart_citation(self, node):
+        self.end_state(first='[%s] ' % self._citlabel)
+
+    def visit_label(self, node):
+        raise nodes.SkipNode
+
+    # XXX: option list could use some better styling
+
+    def visit_option_list(self, node):
+        pass
+    def depart_option_list(self, node):
+        pass
+
+    def visit_option_list_item(self, node):
+        self.new_state(0)
+    def depart_option_list_item(self, node):
+        self.end_state()
+
+    def visit_option_group(self, node):
+        self._firstoption = True
+    def depart_option_group(self, node):
+        self.add_text('     ')
+
+    def visit_option(self, node):
+        if self._firstoption:
+            self._firstoption = False
+        else:
+            self.add_text(', ')
+    def depart_option(self, node):
+        pass
+
+    def visit_option_string(self, node):
+        pass
+    def depart_option_string(self, node):
+        pass
+
+    def visit_option_argument(self, node):
+        self.add_text(node['delimiter'])
+    def depart_option_argument(self, node):
+        pass
+
+    def visit_description(self, node):
+        pass
+    def depart_description(self, node):
+        pass
+
+    def visit_tabular_col_spec(self, node):
+        raise nodes.SkipNode
+
+    def visit_colspec(self, node):
+        self.table[0].append(node['colwidth'])
+        raise nodes.SkipNode
+
+    def visit_tgroup(self, node):
+        pass
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_thead(self, node):
+        pass
+    def depart_thead(self, node):
+        pass
+
+    def visit_tbody(self, node):
+        self.table.append('sep')
+    def depart_tbody(self, node):
+        pass
+
+    def visit_row(self, node):
+        self.table.append([])
+    def depart_row(self, node):
+        pass
+
+    def visit_entry(self, node):
+        if node.has_key('morerows') or node.has_key('morecols'):
+            raise NotImplementedError('Column or row spanning cells are '
+                                      'not implemented.')
+        self.new_state(0)
+    def depart_entry(self, node):
+        text = '\n'.join('\n'.join(x[1]) for x in self.states.pop())
+        self.stateindent.pop()
+        self.table[-1].append(text)
+
+    def visit_table(self, node):
+        if self.table:
+            raise NotImplementedError('Nested tables are not supported.')
+        self.new_state(0)
+        self.table = [[]]
+    def depart_table(self, node):
+        lines = self.table[1:]
+        fmted_rows = []
+        colwidths = self.table[0]
+        realwidths = colwidths[:]
+        separator = 0
+        # don't allow paragraphs in table cells for now
+        for line in lines:
+            if line == 'sep':
+                separator = len(fmted_rows)
+            else:
+                cells = []
+                for i, cell in enumerate(line):
+                    par = textwrap.wrap(cell, width=colwidths[i])
+                    if par:
+                        maxwidth = max(map(len, par))
+                    else:
+                        maxwidth = 0
+                    realwidths[i] = max(realwidths[i], maxwidth)
+                    cells.append(par)
+                fmted_rows.append(cells)
+
+        def writesep(char='-'):
+            out = ['+']
+            for width in realwidths:
+                out.append(char * (width+2))
+                out.append('+')
+            self.add_text(''.join(out) + '\n')
+
+        def writerow(row):
+            lines = map(None, *row)
+            for line in lines:
+                out = ['|']
+                for i, cell in enumerate(line):
+                    if cell:
+                        out.append(' ' + cell.ljust(realwidths[i]+1))
+                    else:
+                        out.append(' ' * (realwidths[i] + 2))
+                    out.append('|')
+                self.add_text(''.join(out) + '\n')
+
+        for i, row in enumerate(fmted_rows):
+            if separator and i == separator:
+                writesep('=')
+            else:
+                writesep('-')
+            writerow(row)
+        writesep('-')
+        self.table = None
+        self.end_state(wrap=False)
+
+    def visit_acks(self, node):
+        self.new_state(0)
+        self.add_text(', '.join(n.astext() for n in node.children[0].children) + '.')
+        self.end_state()
+        raise nodes.SkipNode
+
+    def visit_image(self, node):
+        self.add_text(_('[image]'))
+        raise nodes.SkipNode
+
+    def visit_transition(self, node):
+        indent = sum(self.stateindent)
+        self.new_state(0)
+        self.add_text('=' * (MAXWIDTH - indent))
+        self.end_state()
+        raise nodes.SkipNode
+
+    def visit_bullet_list(self, node):
+        self._list_counter = -1
+    def depart_bullet_list(self, node):
+        pass
+
+    def visit_enumerated_list(self, node):
+        self._list_counter = 0
+    def depart_enumerated_list(self, node):
+        pass
+
+    def visit_definition_list(self, node):
+        self._list_counter = -2
+    def depart_definition_list(self, node):
+        pass
+
+    def visit_list_item(self, node):
+        if self._list_counter == -1:
+            # bullet list
+            self.new_state(2)
+        elif self._list_counter == -2:
+            # definition list
+            pass
+        else:
+            # enumerated list
+            self._list_counter += 1
+            self.new_state(len(str(self._list_counter)) + 2)
+    def depart_list_item(self, node):
+        if self._list_counter == -1:
+            self.end_state(first='* ', end=None)
+        elif self._list_counter == -2:
+            pass
+        else:
+            self.end_state(first='%s. ' % self._list_counter, end=None)
+
+    def visit_definition_list_item(self, node):
+        self._li_has_classifier = len(node) >= 2 and \
+                                  isinstance(node[1], nodes.classifier)
+    def depart_definition_list_item(self, node):
+        pass
+
+    def visit_term(self, node):
+        self.new_state(0)
+    def depart_term(self, node):
+        if not self._li_has_classifier:
+            self.end_state(end=None)
+
+    def visit_classifier(self, node):
+        self.add_text(' : ')
+    def depart_classifier(self, node):
+        self.end_state(end=None)
+
+    def visit_definition(self, node):
+        self.new_state()
+    def depart_definition(self, node):
+        self.end_state()
+
+    def visit_field_list(self, node):
+        pass
+    def depart_field_list(self, node):
+        pass
+
+    def visit_field(self, node):
+        pass
+    def depart_field(self, node):
+        pass
+
+    def visit_field_name(self, node):
+        self.new_state(0)
+    def depart_field_name(self, node):
+        self.add_text(':')
+        self.end_state(end=None)
+
+    def visit_field_body(self, node):
+        self.new_state()
+    def depart_field_body(self, node):
+        self.end_state()
+
+    def visit_centered(self, node):
+        pass
+    def depart_centered(self, node):
+        pass
+
+    def visit_admonition(self, node):
+        self.new_state(0)
+    def depart_admonition(self, node):
+        self.end_state()
+
+    def _visit_admonition(self, node):
+        self.new_state(2)
+    def _make_depart_admonition(name):
+        def depart_admonition(self, node):
+            self.end_state(first=admonitionlabels[name] + ': ')
+        return depart_admonition
+
+    visit_attention = _visit_admonition
+    depart_attention = _make_depart_admonition('attention')
+    visit_caution = _visit_admonition
+    depart_caution = _make_depart_admonition('caution')
+    visit_danger = _visit_admonition
+    depart_danger = _make_depart_admonition('danger')
+    visit_error = _visit_admonition
+    depart_error = _make_depart_admonition('error')
+    visit_hint = _visit_admonition
+    depart_hint = _make_depart_admonition('hint')
+    visit_important = _visit_admonition
+    depart_important = _make_depart_admonition('important')
+    visit_note = _visit_admonition
+    depart_note = _make_depart_admonition('note')
+    visit_tip = _visit_admonition
+    depart_tip = _make_depart_admonition('tip')
+    visit_warning = _visit_admonition
+    depart_warning = _make_depart_admonition('warning')
+
+    def visit_versionmodified(self, node):
+        self.new_state(0)
+        if node.children:
+            self.add_text(versionlabels[node['type']] % node['version'] + ': ')
+        else:
+            self.add_text(versionlabels[node['type']] % node['version'] + '.')
+    def depart_versionmodified(self, node):
+        self.end_state()
+
+    def visit_literal_block(self, node):
+        self.new_state()
+    def depart_literal_block(self, node):
+        self.end_state(wrap=False)
+
+    def visit_doctest_block(self, node):
+        self.new_state(0)
+    def depart_doctest_block(self, node):
+        self.end_state(wrap=False)
+
+    def visit_line_block(self, node):
+        self.new_state(0)
+    def depart_line_block(self, node):
+        self.end_state(wrap=False)
+
+    def visit_line(self, node):
+        pass
+    def depart_line(self, node):
+        pass
+
+    def visit_block_quote(self, node):
+        self.new_state()
+    def depart_block_quote(self, node):
+        self.end_state()
+
+    def visit_compact_paragraph(self, node):
+        pass
+    def depart_compact_paragraph(self, node):
+        pass
+
+    def visit_paragraph(self, node):
+        if not isinstance(node.parent, nodes.Admonition) or \
+               isinstance(node.parent, addnodes.seealso):
+            self.new_state(0)
+    def depart_paragraph(self, node):
+        if not isinstance(node.parent, nodes.Admonition) or \
+               isinstance(node.parent, addnodes.seealso):
+            self.end_state()
+
+    def visit_target(self, node):
+        raise nodes.SkipNode
+
+    def visit_index(self, node):
+        raise nodes.SkipNode
+
+    def visit_substitution_definition(self, node):
+        raise nodes.SkipNode
+
+    def visit_pending_xref(self, node):
+        pass
+    def depart_pending_xref(self, node):
+        pass
+
+    def visit_reference(self, node):
+        pass
+    def depart_reference(self, node):
+        pass
+
+    def visit_emphasis(self, node):
+        self.add_text('*')
+    def depart_emphasis(self, node):
+        self.add_text('*')
+
+    def visit_literal_emphasis(self, node):
+        self.add_text('*')
+    def depart_literal_emphasis(self, node):
+        self.add_text('*')
+
+    def visit_strong(self, node):
+        self.add_text('**')
+    def depart_strong(self, node):
+        self.add_text('**')
+
+    def visit_title_reference(self, node):
+        self.add_text('*')
+    def depart_title_reference(self, node):
+        self.add_text('*')
+
+    def visit_literal(self, node):
+        self.add_text('``')
+    def depart_literal(self, node):
+        self.add_text('``')
+
+    def visit_subscript(self, node):
+        self.add_text('_')
+    def depart_subscript(self, node):
+        pass
+
+    def visit_superscript(self, node):
+        self.add_text('^')
+    def depart_superscript(self, node):
+        pass
+
+    def visit_footnote_reference(self, node):
+        self.add_text('[%s]' % node.astext())
+        raise nodes.SkipNode
+
+    def visit_citation_reference(self, node):
+        self.add_text('[%s]' % node.astext())
+        raise nodes.SkipNode
+
+    def visit_Text(self, node):
+        self.add_text(node.astext())
+    def depart_Text(self, node):
+        pass
+
+    def visit_problematic(self, node):
+        self.add_text('>>')
+    def depart_problematic(self, node):
+        self.add_text('<<')
+
+    def visit_system_message(self, node):
+        self.new_state(0)
+        self.add_text('<SYSTEM MESSAGE: %s>' % node.astext())
+        self.end_state()
+        raise nodes.SkipNode
+
+    def visit_comment(self, node):
+        raise nodes.SkipNode
+
+    def visit_meta(self, node):
+        # only valid for HTML
+        raise nodes.SkipNode
+
+    def unknown_visit(self, node):
+        raise NotImplementedError('Unknown node: ' + node.__class__.__name__)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/util/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,284 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util
+    ~~~~~~~~~~~
+
+    Utility functions for Sphinx.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import os
+import re
+import sys
+import time
+import fnmatch
+import tempfile
+import traceback
+from os import path
+
+
+# Generally useful regular expressions.
+ws_re = re.compile(r'\s+')
+caption_ref_re = re.compile(r'^([^<]+?)\s*<(.+)>$')
+
+
+# SEP separates path elements in the canonical file names
+#
+# Define SEP as a manifest constant, not so much because we expect it to change
+# in the future as to avoid the suspicion that a stray "/" in the code is a
+# hangover from more *nix-oriented origins.
+SEP = "/"
+
+def os_path(canonicalpath):
+    return canonicalpath.replace(SEP, os.path.sep)
+
+
+def relative_uri(base, to):
+    """Return a relative URL from ``base`` to ``to``."""
+    b2 = base.split(SEP)
+    t2 = to.split(SEP)
+    # remove common segments
+    for x, y in zip(b2, t2):
+        if x != y:
+            break
+        b2.pop(0)
+        t2.pop(0)
+    return ('..' + SEP) * (len(b2)-1) + SEP.join(t2)
+
+
+def ensuredir(path):
+    """Ensure that a path exists."""
+    try:
+        os.makedirs(path)
+    except OSError, err:
+        if not err.errno == 17:
+            raise
+
+
+def walk(top, topdown=True, followlinks=False):
+    """
+    Backport of os.walk from 2.6, where the followlinks argument was added.
+    """
+    names = os.listdir(top)
+
+    dirs, nondirs = [], []
+    for name in names:
+        if path.isdir(path.join(top, name)):
+            dirs.append(name)
+        else:
+            nondirs.append(name)
+
+    if topdown:
+        yield top, dirs, nondirs
+    for name in dirs:
+        fullpath = path.join(top, name)
+        if followlinks or not path.islink(fullpath):
+            for x in walk(fullpath, topdown, followlinks):
+                yield x
+    if not topdown:
+        yield top, dirs, nondirs
+
+
+def get_matching_docs(dirname, suffix, exclude_docs=(), exclude_dirs=(),
+                      exclude_trees=(), exclude_dirnames=()):
+    """
+    Get all file names (without suffix) matching a suffix in a
+    directory, recursively.
+
+    Exclude docs in *exclude_docs*, exclude dirs in *exclude_dirs*,
+    prune dirs in *exclude_trees*, prune dirnames in *exclude_dirnames*.
+    """
+    pattern = '*' + suffix
+    # dirname is a normalized absolute path.
+    dirname = path.normpath(path.abspath(dirname))
+    dirlen = len(dirname) + 1    # exclude slash
+    for root, dirs, files in walk(dirname, followlinks=True):
+        if root[dirlen:] in exclude_dirs:
+            continue
+        if root[dirlen:] in exclude_trees:
+            del dirs[:]
+            continue
+        dirs.sort()
+        files.sort()
+        for prunedir in exclude_dirnames:
+            if prunedir in dirs:
+                dirs.remove(prunedir)
+        for sfile in files:
+            if not fnmatch.fnmatch(sfile, pattern):
+                continue
+            qualified_name = path.join(root[dirlen:], sfile[:-len(suffix)])
+            qualified_name = qualified_name.replace(os.path.sep, SEP)
+            if qualified_name in exclude_docs:
+                continue
+            yield qualified_name
+
+
+def mtimes_of_files(dirnames, suffix):
+    for dirname in dirnames:
+        for root, dirs, files in os.walk(dirname):
+            for sfile in files:
+                if sfile.endswith(suffix):
+                    try:
+                        yield path.getmtime(path.join(root, sfile))
+                    except EnvironmentError:
+                        pass
+
+
+def shorten_result(text='', keywords=[], maxlen=240, fuzz=60):
+    if not text:
+        text = ''
+    text_low = text.lower()
+    beg = -1
+    for k in keywords:
+        i = text_low.find(k.lower())
+        if (i > -1 and i < beg) or beg == -1:
+            beg = i
+    excerpt_beg = 0
+    if beg > fuzz:
+        for sep in ('.', ':', ';', '='):
+            eb = text.find(sep, beg - fuzz, beg - 1)
+            if eb > -1:
+                eb += 1
+                break
+        else:
+            eb = beg - fuzz
+        excerpt_beg = eb
+    if excerpt_beg < 0:
+        excerpt_beg = 0
+    msg = text[excerpt_beg:beg+maxlen]
+    if beg > fuzz:
+        msg = '... ' + msg
+    if beg < len(text)-maxlen:
+        msg = msg + ' ...'
+    return msg
+
+
+class attrdict(dict):
+    def __getattr__(self, key):
+        return self[key]
+    def __setattr__(self, key, val):
+        self[key] = val
+    def __delattr__(self, key):
+        del self[key]
+
+
+def fmt_ex(ex):
+    """Format a single line with an exception description."""
+    return traceback.format_exception_only(ex.__class__, ex)[-1].strip()
+
+
+def rpartition(s, t):
+    """Similar to str.rpartition from 2.5, but doesn't return the separator."""
+    i = s.rfind(t)
+    if i != -1:
+        return s[:i], s[i+len(t):]
+    return '', s
+
+
+def format_exception_cut_frames(x=1):
+    """
+    Format an exception with traceback, but only the last x frames.
+    """
+    typ, val, tb = sys.exc_info()
+    #res = ['Traceback (most recent call last):\n']
+    res = []
+    tbres = traceback.format_tb(tb)
+    res += tbres[-x:]
+    res += traceback.format_exception_only(typ, val)
+    return ''.join(res)
+
+
+def save_traceback():
+    """
+    Save the current exception's traceback in a temporary file.
+    """
+    exc = traceback.format_exc()
+    fd, path = tempfile.mkstemp('.log', 'sphinx-err-')
+    os.write(fd, exc)
+    os.close(fd)
+    return path
+
+
+def _translate_pattern(pat):
+    """
+    Translate a shell-style glob pattern to a regular expression.
+
+    Adapted from the fnmatch module, but enhanced so that single stars don't
+    match slashes.
+    """
+    i, n = 0, len(pat)
+    res = ''
+    while i < n:
+        c = pat[i]
+        i += 1
+        if c == '*':
+            if i < n and pat[i] == '*':
+                # double star matches slashes too
+                i += 1
+                res = res + '.*'
+            else:
+                # single star doesn't match slashes
+                res = res + '[^/]*'
+        elif c == '?':
+            # question mark doesn't match slashes too
+            res = res + '[^/]'
+        elif c == '[':
+            j = i
+            if j < n and pat[j] == '!':
+                j += 1
+            if j < n and pat[j] == ']':
+                j += 1
+            while j < n and pat[j] != ']':
+                j += 1
+            if j >= n:
+                res = res + '\\['
+            else:
+                stuff = pat[i:j].replace('\\', '\\\\')
+                i = j + 1
+                if stuff[0] == '!':
+                    # negative pattern mustn't match slashes too
+                    stuff = '^/' + stuff[1:]
+                elif stuff[0] == '^':
+                    stuff = '\\' + stuff
+                res = '%s[%s]' % (res, stuff)
+        else:
+            res += re.escape(c)
+    return res + '$'
+
+
+_pat_cache = {}
+
+def patfilter(names, pat):
+    """
+    Return the subset of the list NAMES that match PAT.
+    Adapted from fnmatch module.
+    """
+    result = []
+    if pat not in _pat_cache:
+        _pat_cache[pat] = re.compile(_translate_pattern(pat))
+    match = _pat_cache[pat].match
+    return filter(match, names)
+
+
+no_fn_re = re.compile(r'[^a-zA-Z0-9_-]')
+
+def make_filename(string):
+    return no_fn_re.sub('', string)
+
+
+def nested_parse_with_titles(state, content, node):
+    # hack around title style bookkeeping
+    surrounding_title_styles = state.memo.title_styles
+    surrounding_section_level = state.memo.section_level
+    state.memo.title_styles = []
+    state.memo.section_level = 0
+    state.nested_parse(content, 0, node, match_titles=1)
+    state.memo.title_styles = surrounding_title_styles
+    state.memo.section_level = surrounding_section_level
+
+
+def ustrftime(format, *args):
+    # strftime for unicode strings
+    return time.strftime(unicode(format).encode('utf-8'), *args).decode('utf-8')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/util/compat.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.compat
+    ~~~~~~~~~~~~~~~~~~
+
+    Stuff for docutils compatibility.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+from docutils import nodes
+
+
+# function missing in 0.5 SVN
+def make_admonition(node_class, name, arguments, options, content, lineno,
+                    content_offset, block_text, state, state_machine):
+    #if not content:
+    #    error = state_machine.reporter.error(
+    #        'The "%s" admonition is empty; content required.' % (name),
+    #        nodes.literal_block(block_text, block_text), line=lineno)
+    #    return [error]
+    text = '\n'.join(content)
+    admonition_node = node_class(text)
+    if arguments:
+        title_text = arguments[0]
+        textnodes, messages = state.inline_text(title_text, lineno)
+        admonition_node += nodes.title(title_text, '', *textnodes)
+        admonition_node += messages
+        if options.has_key('class'):
+            classes = options['class']
+        else:
+            classes = ['admonition-' + nodes.make_id(title_text)]
+        admonition_node['classes'] += classes
+    state.nested_parse(content, content_offset, admonition_node)
+    return [admonition_node]
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/util/console.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,92 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.console
+    ~~~~~~~~~~~~~~~~~~~
+
+    Format colored console output.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import os
+
+codes = {}
+
+def get_terminal_width():
+    """Borrowed from the py lib."""
+    try:
+        import os, termios, fcntl, struct
+        call = fcntl.ioctl(0, termios.TIOCGWINSZ, "\000"*8)
+        height, width = struct.unpack("hhhh", call)[:2]
+        terminal_width = width
+    except (SystemExit, KeyboardInterrupt):
+        raise
+    except:
+        # FALLBACK
+        terminal_width = int(os.environ.get('COLUMNS', 80))-1
+    return terminal_width
+
+_tw = get_terminal_width()
+
+def print_and_backspace(text, func):
+    if not codes:
+        # if no coloring, don't output fancy backspaces
+        func(text)
+    else:
+        func(text.ljust(_tw) + _tw * "\b")
+
+def color_terminal():
+    if 'COLORTERM' in os.environ:
+        return True
+    term = os.environ.get('TERM', 'dumb').lower()
+    if 'xterm' in term or 'color' in term:
+        return True
+    return False
+
+
+def nocolor():
+    codes.clear()
+
+def coloron():
+    codes.update(_orig_codes)
+
+def colorize(name, text):
+    return codes.get(name, '') + text + codes.get('reset', '')
+
+def create_color_func(name):
+    def inner(text):
+        return colorize(name, text)
+    globals()[name] = inner
+
+_attrs = {
+    'reset':     '39;49;00m',
+    'bold':      '01m',
+    'faint':     '02m',
+    'standout':  '03m',
+    'underline': '04m',
+    'blink':     '05m',
+}
+
+for _name, _value in _attrs.items():
+    codes[_name] = '\x1b[' + _value
+
+_colors = [
+    ('black',     'darkgray'),
+    ('darkred',   'red'),
+    ('darkgreen', 'green'),
+    ('brown',     'yellow'),
+    ('darkblue',  'blue'),
+    ('purple',    'fuchsia'),
+    ('turquoise', 'teal'),
+    ('lightgray', 'white'),
+]
+
+for i, (dark, light) in enumerate(_colors):
+    codes[dark] = '\x1b[%im' % (i+30)
+    codes[light] = '\x1b[%i;01m' % (i+30)
+
+_orig_codes = codes.copy()
+
+for _name in codes:
+    create_color_func(_name)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/util/jsdump.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,193 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.jsdump
+    ~~~~~~~~~~~~~~~~~~
+
+    This module implements a simple JavaScript serializer.
+    Uses the basestring encode function from simplejson.
+
+    :copyright: 2008 by Armin Ronacher, Bob Ippolito, Georg Brandl.
+    :license: BSD.
+"""
+
+import re
+
+_str_re  = re.compile(r'"(\\\\|\\"|[^"])*"')
+_int_re  = re.compile(r'\d+')
+_name_re = re.compile(r'[a-zA-Z]\w*')
+_nameonly_re = re.compile(r'[a-zA-Z]\w*$')
+
+# escape \, ", control characters and everything outside ASCII
+ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])')
+ESCAPE_DICT = {
+    '\\': '\\\\',
+    '"': '\\"',
+    '\b': '\\b',
+    '\f': '\\f',
+    '\n': '\\n',
+    '\r': '\\r',
+    '\t': '\\t',
+}
+
+ESCAPED = re.compile(r'\\u.{4}|\\.')
+
+
+def encode_string(s):
+    def replace(match):
+        s = match.group(0)
+        try:
+            return ESCAPE_DICT[s]
+        except KeyError:
+            n = ord(s)
+            if n < 0x10000:
+                return '\\u%04x' % (n,)
+            else:
+                # surrogate pair
+                n -= 0x10000
+                s1 = 0xd800 | ((n >> 10) & 0x3ff)
+                s2 = 0xdc00 | (n & 0x3ff)
+                return '\\u%04x\\u%04x' % (s1, s2)
+    return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"'
+
+def decode_string(s):
+    return ESCAPED.sub(lambda m: eval('u"'+m.group()+'"'), s)
+
+
+reswords = set("""\
+abstract   else   instanceof   switch
+boolean   enum   int   synchronized
+break   export   interface   this
+byte   extends   long   throw
+case   false   native   throws
+catch   final   new   transient
+char   finally   null   true
+class   float   package   try
+const   for   private   typeof
+continue   function   protected   var
+debugger   goto   public   void
+default   if   return   volatile
+delete   implements   short   while
+do   import   static   with
+double   in   super""".split())
+
+def dumps(obj, key=False):
+    if key:
+        if not isinstance(obj, basestring):
+            obj = str(obj)
+        if _nameonly_re.match(obj) and obj not in reswords:
+            return obj  # return it as a bare word
+        else:
+            return encode_string(obj)
+    if obj is None:
+        return 'null'
+    elif obj is True or obj is False:
+        return obj and 'true' or 'false'
+    elif isinstance(obj, (int, long, float)):
+        return str(obj)
+    elif isinstance(obj, dict):
+        return '{%s}' % ','.join('%s:%s' % (
+            dumps(key, True),
+            dumps(value)
+        ) for key, value in obj.iteritems())
+    elif isinstance(obj, (tuple, list, set)):
+        return '[%s]' % ','.join(dumps(x) for x in obj)
+    elif isinstance(obj, basestring):
+        return encode_string(obj)
+    raise TypeError(type(obj))
+
+def dump(obj, f):
+    f.write(dumps(obj))
+
+
+def loads(x):
+    """Loader that can read the JS subset the indexer produces."""
+    nothing = object()
+    i = 0
+    n = len(x)
+    stack = []
+    obj = nothing
+    key = False
+    keys = []
+    while i < n:
+        c = x[i]
+        if c == '{':
+            obj = {}
+            stack.append(obj)
+            key = True
+            keys.append(nothing)
+            i += 1
+        elif c == '[':
+            obj = []
+            stack.append(obj)
+            key = False
+            keys.append(nothing)
+            i += 1
+        elif c in '}]':
+            if key:
+                if keys[-1] is not nothing:
+                    raise ValueError("unfinished dict")
+                # empty dict
+                key = False
+            oldobj = stack.pop()
+            keys.pop()
+            if stack:
+                obj = stack[-1]
+                if isinstance(obj, dict):
+                    if keys[-1] is nothing:
+                        raise ValueError("invalid key object", oldobj)
+                    obj[keys[-1]] = oldobj
+                else:
+                    obj.append(oldobj)
+            else:
+                break
+            i += 1
+        elif c == ',':
+            if key:
+                raise ValueError("multiple keys")
+            if isinstance(obj, dict):
+                key = True
+            i += 1
+        elif c == ':':
+            if not isinstance(obj, dict):
+                raise ValueError("colon in list")
+            i += 1
+            if not key:
+                raise ValueError("multiple values")
+            key = False
+        else:
+            m = _str_re.match(x, i)
+            if m:
+                y = decode_string(m.group()[1:-1])
+            else:
+                m = _int_re.match(x, i)
+                if m:
+                    y = int(m.group())
+                else:
+                    m = _name_re.match(x, i)
+                    if m:
+                        y = m.group()
+                        if y == 'true':
+                            y = True
+                        elif y == 'false':
+                            y = False
+                        elif y == 'null':
+                            y = None
+                        elif not key:
+                            raise ValueError("bareword as value")
+                    else:
+                        raise ValueError("read error at pos %d" % i)
+            i = m.end()
+            if isinstance(obj, dict):
+                if key:
+                    keys[-1] = y
+                else:
+                    obj[keys[-1]] = y
+                    key = False
+            else:
+                obj.append(y)
+    if obj is nothing:
+        raise ValueError("nothing loaded from string")
+    return obj
+
+def load(f):
+    return loads(f.read())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/util/png.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.png
+    ~~~~~~~~~~~~~~~
+
+    PNG image manipulation helpers.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import struct
+import binascii
+
+LEN_IEND = 12
+LEN_DEPTH = 22
+
+DEPTH_CHUNK_LEN = struct.pack('!i', 10)
+DEPTH_CHUNK_START = 'tEXtDepth\x00'
+IEND_CHUNK = '\x00\x00\x00\x00IEND\xAE\x42\x60\x82'
+
+
+def read_png_depth(filename):
+    """
+    Read the special tEXt chunk indicating the depth from a PNG file.
+    """
+    result = None
+    f = open(filename, 'rb')
+    try:
+        f.seek(- (LEN_IEND + LEN_DEPTH), 2)
+        depthchunk = f.read(LEN_DEPTH)
+        if not depthchunk.startswith(DEPTH_CHUNK_LEN + DEPTH_CHUNK_START):
+            # either not a PNG file or not containing the depth chunk
+            return None
+        result = struct.unpack('!i', depthchunk[14:18])[0]
+    finally:
+        f.close()
+    return result
+
+
+def write_png_depth(filename, depth):
+    """
+    Write the special tEXt chunk indicating the depth to a PNG file.
+    The chunk is placed immediately before the special IEND chunk.
+    """
+    data = struct.pack('!i', depth)
+    f = open(filename, 'r+b')
+    try:
+        # seek to the beginning of the IEND chunk
+        f.seek(-LEN_IEND, 2)
+        # overwrite it with the depth chunk
+        f.write(DEPTH_CHUNK_LEN + DEPTH_CHUNK_START + data)
+        # calculate the checksum over chunk name and data
+        f.write(struct.pack('!i', binascii.crc32(DEPTH_CHUNK_START + data)))
+        # replace the IEND chunk
+        f.write(IEND_CHUNK)
+    finally:
+        f.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/util/smartypants.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,303 @@
+r"""
+This is based on SmartyPants.py by `Chad Miller`_.
+
+Copyright and License
+=====================
+
+SmartyPants_ license::
+
+    Copyright (c) 2003 John Gruber
+    (http://daringfireball.net/)
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are
+    met:
+
+    *   Redistributions of source code must retain the above copyright
+        notice, this list of conditions and the following disclaimer.
+
+    *   Redistributions in binary form must reproduce the above copyright
+        notice, this list of conditions and the following disclaimer in
+        the documentation and/or other materials provided with the
+        distribution.
+
+    *   Neither the name "SmartyPants" nor the names of its contributors
+        may be used to endorse or promote products derived from this
+        software without specific prior written permission.
+
+    This software is provided by the copyright holders and contributors "as
+    is" and any express or implied warranties, including, but not limited
+    to, the implied warranties of merchantability and fitness for a
+    particular purpose are disclaimed. In no event shall the copyright
+    owner or contributors be liable for any direct, indirect, incidental,
+    special, exemplary, or consequential damages (including, but not
+    limited to, procurement of substitute goods or services; loss of use,
+    data, or profits; or business interruption) however caused and on any
+    theory of liability, whether in contract, strict liability, or tort
+    (including negligence or otherwise) arising in any way out of the use
+    of this software, even if advised of the possibility of such damage.
+
+
+smartypants.py license::
+
+    smartypants.py is a derivative work of SmartyPants.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are
+    met:
+
+    *   Redistributions of source code must retain the above copyright
+        notice, this list of conditions and the following disclaimer.
+
+    *   Redistributions in binary form must reproduce the above copyright
+        notice, this list of conditions and the following disclaimer in
+        the documentation and/or other materials provided with the
+        distribution.
+
+    This software is provided by the copyright holders and contributors "as
+    is" and any express or implied warranties, including, but not limited
+    to, the implied warranties of merchantability and fitness for a
+    particular purpose are disclaimed. In no event shall the copyright
+    owner or contributors be liable for any direct, indirect, incidental,
+    special, exemplary, or consequential damages (including, but not
+    limited to, procurement of substitute goods or services; loss of use,
+    data, or profits; or business interruption) however caused and on any
+    theory of liability, whether in contract, strict liability, or tort
+    (including negligence or otherwise) arising in any way out of the use
+    of this software, even if advised of the possibility of such damage.
+
+.. _Chad Miller: http://web.chad.org/
+"""
+
+import re
+
+
+def sphinx_smarty_pants(t):
+    t = t.replace('&quot;', '"')
+    t = educateDashesOldSchool(t)
+    t = educateQuotes(t)
+    t = t.replace('"', '&quot;')
+    return t
+
+# Constants for quote education.
+
+punct_class = r"""[!"#\$\%'()*+,-.\/:;<=>?\@\[\\\]\^_`{|}~]"""
+close_class = r"""[^\ \t\r\n\[\{\(\-]"""
+dec_dashes = r"""&#8211;|&#8212;"""
+
+# Special case if the very first character is a quote
+# followed by punctuation at a non-word-break. Close the quotes by brute force:
+single_quote_start_re = re.compile(r"""^'(?=%s\\B)""" % (punct_class,))
+double_quote_start_re = re.compile(r"""^"(?=%s\\B)""" % (punct_class,))
+
+# Special case for double sets of quotes, e.g.:
+#   <p>He said, "'Quoted' words in a larger quote."</p>
+double_quote_sets_re = re.compile(r""""'(?=\w)""")
+single_quote_sets_re = re.compile(r"""'"(?=\w)""")
+
+# Special case for decade abbreviations (the '80s):
+decade_abbr_re = re.compile(r"""\b'(?=\d{2}s)""")
+
+# Get most opening double quotes:
+opening_double_quotes_regex = re.compile(r"""
+                (
+                        \s          |   # a whitespace char, or
+                        &nbsp;      |   # a non-breaking space entity, or
+                        --          |   # dashes, or
+                        &[mn]dash;  |   # named dash entities
+                        %s          |   # or decimal entities
+                        &\#x201[34];    # or hex
+                )
+                "                 # the quote
+                (?=\w)            # followed by a word character
+                """ % (dec_dashes,), re.VERBOSE)
+
+# Double closing quotes:
+closing_double_quotes_regex = re.compile(r"""
+                #(%s)?   # character that indicates the quote should be closing
+                "
+                (?=\s)
+                """ % (close_class,), re.VERBOSE)
+
+closing_double_quotes_regex_2 = re.compile(r"""
+                (%s)   # character that indicates the quote should be closing
+                "
+                """ % (close_class,), re.VERBOSE)
+
+# Get most opening single quotes:
+opening_single_quotes_regex = re.compile(r"""
+                (
+                        \s          |   # a whitespace char, or
+                        &nbsp;      |   # a non-breaking space entity, or
+                        --          |   # dashes, or
+                        &[mn]dash;  |   # named dash entities
+                        %s          |   # or decimal entities
+                        &\#x201[34];    # or hex
+                )
+                '                 # the quote
+                (?=\w)            # followed by a word character
+                """ % (dec_dashes,), re.VERBOSE)
+
+closing_single_quotes_regex = re.compile(r"""
+                (%s)
+                '
+                (?!\s | s\b | \d)
+                """ % (close_class,), re.VERBOSE)
+
+closing_single_quotes_regex_2 = re.compile(r"""
+                (%s)
+                '
+                (\s | s\b)
+                """ % (close_class,), re.VERBOSE)
+
+def educateQuotes(s):
+    """
+    Parameter:  String.
+
+    Returns:    The string, with "educated" curly quote HTML entities.
+
+    Example input:  "Isn't this fun?"
+    Example output: &#8220;Isn&#8217;t this fun?&#8221;
+    """
+
+    # Special case if the very first character is a quote
+    # followed by punctuation at a non-word-break. Close the quotes by brute force:
+    s = single_quote_start_re.sub("&#8217;", s)
+    s = double_quote_start_re.sub("&#8221;", s)
+
+    # Special case for double sets of quotes, e.g.:
+    #   <p>He said, "'Quoted' words in a larger quote."</p>
+    s = double_quote_sets_re.sub("&#8220;&#8216;", s)
+    s = single_quote_sets_re.sub("&#8216;&#8220;", s)
+
+    # Special case for decade abbreviations (the '80s):
+    s = decade_abbr_re.sub("&#8217;", s)
+
+    s = opening_single_quotes_regex.sub(r"\1&#8216;", s)
+    s = closing_single_quotes_regex.sub(r"\1&#8217;", s)
+    s = closing_single_quotes_regex_2.sub(r"\1&#8217;\2", s)
+
+    # Any remaining single quotes should be opening ones:
+    s = s.replace("'", "&#8216;")
+
+    s = opening_double_quotes_regex.sub(r"\1&#8220;", s)
+    s = closing_double_quotes_regex.sub(r"&#8221;", s)
+    s = closing_double_quotes_regex_2.sub(r"\1&#8221;", s)
+
+    # Any remaining quotes should be opening ones.
+    return s.replace('"', "&#8220;")
+
+
+def educateQuotesLatex(s, dquotes=("``", "''")):
+    """
+    Parameter:  String.
+
+    Returns:    The string, with double quotes corrected to LaTeX quotes.
+
+    Example input:  "Isn't this fun?"
+    Example output: ``Isn't this fun?'';
+    """
+
+    # Special case if the very first character is a quote
+    # followed by punctuation at a non-word-break. Close the quotes by brute force:
+    s = single_quote_start_re.sub("\x04", s)
+    s = double_quote_start_re.sub("\x02", s)
+
+    # Special case for double sets of quotes, e.g.:
+    #   <p>He said, "'Quoted' words in a larger quote."</p>
+    s = double_quote_sets_re.sub("\x01\x03", s)
+    s = single_quote_sets_re.sub("\x03\x01", s)
+
+    # Special case for decade abbreviations (the '80s):
+    s = decade_abbr_re.sub("\x04", s)
+
+    s = opening_single_quotes_regex.sub("\\1\x03", s)
+    s = closing_single_quotes_regex.sub("\\1\x04", s)
+    s = closing_single_quotes_regex_2.sub("\\1\x04\\2", s)
+
+    # Any remaining single quotes should be opening ones:
+    s = s.replace("'", "\x03")
+
+    s = opening_double_quotes_regex.sub("\\1\x01", s)
+    s = closing_double_quotes_regex.sub("\x02", s)
+    s = closing_double_quotes_regex_2.sub("\\1\x02", s)
+
+    # Any remaining quotes should be opening ones.
+    s = s.replace('"', "\x01")
+
+    # Finally, replace all helpers with quotes.
+    return s.replace("\x01", dquotes[0]).replace("\x02", dquotes[1]).\
+           replace("\x03", "`").replace("\x04", "'")
+
+
+def educateBackticks(s):
+    """
+    Parameter:  String.
+    Returns:    The string, with ``backticks'' -style double quotes
+        translated into HTML curly quote entities.
+    Example input:  ``Isn't this fun?''
+    Example output: &#8220;Isn't this fun?&#8221;
+    """
+    return s.replace("``", "&#8220;").replace("''", "&#8221;")
+
+
+def educateSingleBackticks(s):
+    """
+    Parameter:  String.
+    Returns:    The string, with `backticks' -style single quotes
+        translated into HTML curly quote entities.
+
+    Example input:  `Isn't this fun?'
+    Example output: &#8216;Isn&#8217;t this fun?&#8217;
+    """
+    return s.replace('`', "&#8216;").replace("'", "&#8217;")
+
+
+def educateDashesOldSchool(s):
+    """
+    Parameter:  String.
+
+    Returns:    The string, with each instance of "--" translated to
+        an en-dash HTML entity, and each "---" translated to
+        an em-dash HTML entity.
+    """
+    return s.replace('---', "&#8212;").replace('--', "&#8211;")
+
+
+def educateDashesOldSchoolInverted(s):
+    """
+    Parameter:  String.
+
+    Returns:    The string, with each instance of "--" translated to
+        an em-dash HTML entity, and each "---" translated to
+        an en-dash HTML entity. Two reasons why: First, unlike the
+        en- and em-dash syntax supported by
+        EducateDashesOldSchool(), it's compatible with existing
+        entries written before SmartyPants 1.1, back when "--" was
+        only used for em-dashes.  Second, em-dashes are more
+        common than en-dashes, and so it sort of makes sense that
+        the shortcut should be shorter to type. (Thanks to Aaron
+        Swartz for the idea.)
+    """
+    return s.replace('---', "&#8211;").replace('--', "&#8212;")
+
+
+
+def educateEllipses(s):
+    """
+    Parameter:  String.
+    Returns:    The string, with each instance of "..." translated to
+        an ellipsis HTML entity.
+
+    Example input:  Huh...?
+    Example output: Huh&#8230;?
+    """
+    return s.replace('...', "&#8230;").replace('. . .', "&#8230;")
+
+
+__author__ = "Chad Miller <smartypantspy@chad.org>"
+__version__ = "1.5_1.5: Sat, 13 Aug 2005 15:50:24 -0400"
+__url__ = "http://wiki.chad.org/SmartyPantsPy"
+__description__ = \
+    "Smart-quotes, smart-ellipses, and smart-dashes for weblog entries in pyblosxom"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/util/stemmer.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,343 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.stemmer
+    ~~~~~~~~~~~~~~~~~~~
+
+    Porter Stemming Algorithm
+
+    This is the Porter stemming algorithm, ported to Python from the
+    version coded up in ANSI C by the author. It may be be regarded
+    as canonical, in that it follows the algorithm presented in
+
+    Porter, 1980, An algorithm for suffix stripping, Program, Vol. 14,
+    no. 3, pp 130-137,
+
+    only differing from it at the points maked --DEPARTURE-- below.
+
+    See also http://www.tartarus.org/~martin/PorterStemmer
+
+    The algorithm as described in the paper could be exactly replicated
+    by adjusting the points of DEPARTURE, but this is barely necessary,
+    because (a) the points of DEPARTURE are definitely improvements, and
+    (b) no encoding of the Porter stemmer I have seen is anything like
+    as exact as this version, even with the points of DEPARTURE!
+
+    Release 1: January 2001
+
+    :copyright: 2001 by Vivake Gupta <v@nano.com>.
+    :license: Public Domain ("can be used free of charge for any purpose").
+"""
+
+class PorterStemmer(object):
+
+    def __init__(self):
+        """The main part of the stemming algorithm starts here.
+        b is a buffer holding a word to be stemmed. The letters are in b[k0],
+        b[k0+1] ... ending at b[k]. In fact k0 = 0 in this demo program. k is
+        readjusted downwards as the stemming progresses. Zero termination is
+        not in fact used in the algorithm.
+
+        Note that only lower case sequences are stemmed. Forcing to lower case
+        should be done before stem(...) is called.
+        """
+
+        self.b = ""  # buffer for word to be stemmed
+        self.k = 0
+        self.k0 = 0
+        self.j = 0   # j is a general offset into the string
+
+    def cons(self, i):
+        """cons(i) is TRUE <=> b[i] is a consonant."""
+        if self.b[i] == 'a' or self.b[i] == 'e' or self.b[i] == 'i' \
+            or self.b[i] == 'o' or self.b[i] == 'u':
+            return 0
+        if self.b[i] == 'y':
+            if i == self.k0:
+                return 1
+            else:
+                return (not self.cons(i - 1))
+        return 1
+
+    def m(self):
+        """m() measures the number of consonant sequences between k0 and j.
+        if c is a consonant sequence and v a vowel sequence, and <..>
+        indicates arbitrary presence,
+
+           <c><v>       gives 0
+           <c>vc<v>     gives 1
+           <c>vcvc<v>   gives 2
+           <c>vcvcvc<v> gives 3
+           ....
+        """
+        n = 0
+        i = self.k0
+        while 1:
+            if i > self.j:
+                return n
+            if not self.cons(i):
+                break
+            i = i + 1
+        i = i + 1
+        while 1:
+            while 1:
+                if i > self.j:
+                    return n
+                if self.cons(i):
+                    break
+                i = i + 1
+            i = i + 1
+            n = n + 1
+            while 1:
+                if i > self.j:
+                    return n
+                if not self.cons(i):
+                    break
+                i = i + 1
+            i = i + 1
+
+    def vowelinstem(self):
+        """vowelinstem() is TRUE <=> k0,...j contains a vowel"""
+        for i in range(self.k0, self.j + 1):
+            if not self.cons(i):
+                return 1
+        return 0
+
+    def doublec(self, j):
+        """doublec(j) is TRUE <=> j,(j-1) contain a double consonant."""
+        if j < (self.k0 + 1):
+            return 0
+        if (self.b[j] != self.b[j-1]):
+            return 0
+        return self.cons(j)
+
+    def cvc(self, i):
+        """cvc(i) is TRUE <=> i-2,i-1,i has the form consonant - vowel - consonant
+        and also if the second c is not w,x or y. this is used when trying to
+        restore an e at the end of a short  e.g.
+
+           cav(e), lov(e), hop(e), crim(e), but
+           snow, box, tray.
+        """
+        if i < (self.k0 + 2) or not self.cons(i) or self.cons(i-1) or not self.cons(i-2):
+            return 0
+        ch = self.b[i]
+        if ch == 'w' or ch == 'x' or ch == 'y':
+            return 0
+        return 1
+
+    def ends(self, s):
+        """ends(s) is TRUE <=> k0,...k ends with the string s."""
+        length = len(s)
+        if s[length - 1] != self.b[self.k]: # tiny speed-up
+            return 0
+        if length > (self.k - self.k0 + 1):
+            return 0
+        if self.b[self.k-length+1:self.k+1] != s:
+            return 0
+        self.j = self.k - length
+        return 1
+
+    def setto(self, s):
+        """setto(s) sets (j+1),...k to the characters in the string s, readjusting k."""
+        length = len(s)
+        self.b = self.b[:self.j+1] + s + self.b[self.j+length+1:]
+        self.k = self.j + length
+
+    def r(self, s):
+        """r(s) is used further down."""
+        if self.m() > 0:
+            self.setto(s)
+
+    def step1ab(self):
+        """step1ab() gets rid of plurals and -ed or -ing. e.g.
+
+           caresses  ->  caress
+           ponies    ->  poni
+           ties      ->  ti
+           caress    ->  caress
+           cats      ->  cat
+
+           feed      ->  feed
+           agreed    ->  agree
+           disabled  ->  disable
+
+           matting   ->  mat
+           mating    ->  mate
+           meeting   ->  meet
+           milling   ->  mill
+           messing   ->  mess
+
+           meetings  ->  meet
+        """
+        if self.b[self.k] == 's':
+            if self.ends("sses"):
+                self.k = self.k - 2
+            elif self.ends("ies"):
+                self.setto("i")
+            elif self.b[self.k - 1] != 's':
+                self.k = self.k - 1
+        if self.ends("eed"):
+            if self.m() > 0:
+                self.k = self.k - 1
+        elif (self.ends("ed") or self.ends("ing")) and self.vowelinstem():
+            self.k = self.j
+            if self.ends("at"):   self.setto("ate")
+            elif self.ends("bl"): self.setto("ble")
+            elif self.ends("iz"): self.setto("ize")
+            elif self.doublec(self.k):
+                self.k = self.k - 1
+                ch = self.b[self.k]
+                if ch == 'l' or ch == 's' or ch == 'z':
+                    self.k = self.k + 1
+            elif (self.m() == 1 and self.cvc(self.k)):
+                self.setto("e")
+
+    def step1c(self):
+        """step1c() turns terminal y to i when there is another vowel in the stem."""
+        if (self.ends("y") and self.vowelinstem()):
+            self.b = self.b[:self.k] + 'i' + self.b[self.k+1:]
+
+    def step2(self):
+        """step2() maps double suffices to single ones.
+        so -ization ( = -ize plus -ation) maps to -ize etc. note that the
+        string before the suffix must give m() > 0.
+        """
+        if self.b[self.k - 1] == 'a':
+            if self.ends("ational"):   self.r("ate")
+            elif self.ends("tional"):  self.r("tion")
+        elif self.b[self.k - 1] == 'c':
+            if self.ends("enci"):      self.r("ence")
+            elif self.ends("anci"):    self.r("ance")
+        elif self.b[self.k - 1] == 'e':
+            if self.ends("izer"):      self.r("ize")
+        elif self.b[self.k - 1] == 'l':
+            if self.ends("bli"):       self.r("ble") # --DEPARTURE--
+            # To match the published algorithm, replace this phrase with
+            #   if self.ends("abli"):      self.r("able")
+            elif self.ends("alli"):    self.r("al")
+            elif self.ends("entli"):   self.r("ent")
+            elif self.ends("eli"):     self.r("e")
+            elif self.ends("ousli"):   self.r("ous")
+        elif self.b[self.k - 1] == 'o':
+            if self.ends("ization"):   self.r("ize")
+            elif self.ends("ation"):   self.r("ate")
+            elif self.ends("ator"):    self.r("ate")
+        elif self.b[self.k - 1] == 's':
+            if self.ends("alism"):     self.r("al")
+            elif self.ends("iveness"): self.r("ive")
+            elif self.ends("fulness"): self.r("ful")
+            elif self.ends("ousness"): self.r("ous")
+        elif self.b[self.k - 1] == 't':
+            if self.ends("aliti"):     self.r("al")
+            elif self.ends("iviti"):   self.r("ive")
+            elif self.ends("biliti"):  self.r("ble")
+        elif self.b[self.k - 1] == 'g': # --DEPARTURE--
+            if self.ends("logi"):      self.r("log")
+        # To match the published algorithm, delete this phrase
+
+    def step3(self):
+        """step3() dels with -ic-, -full, -ness etc. similar strategy to step2."""
+        if self.b[self.k] == 'e':
+            if self.ends("icate"):     self.r("ic")
+            elif self.ends("ative"):   self.r("")
+            elif self.ends("alize"):   self.r("al")
+        elif self.b[self.k] == 'i':
+            if self.ends("iciti"):     self.r("ic")
+        elif self.b[self.k] == 'l':
+            if self.ends("ical"):      self.r("ic")
+            elif self.ends("ful"):     self.r("")
+        elif self.b[self.k] == 's':
+            if self.ends("ness"):      self.r("")
+
+    def step4(self):
+        """step4() takes off -ant, -ence etc., in context <c>vcvc<v>."""
+        if self.b[self.k - 1] == 'a':
+            if self.ends("al"): pass
+            else: return
+        elif self.b[self.k - 1] == 'c':
+            if self.ends("ance"): pass
+            elif self.ends("ence"): pass
+            else: return
+        elif self.b[self.k - 1] == 'e':
+            if self.ends("er"): pass
+            else: return
+        elif self.b[self.k - 1] == 'i':
+            if self.ends("ic"): pass
+            else: return
+        elif self.b[self.k - 1] == 'l':
+            if self.ends("able"): pass
+            elif self.ends("ible"): pass
+            else: return
+        elif self.b[self.k - 1] == 'n':
+            if self.ends("ant"): pass
+            elif self.ends("ement"): pass
+            elif self.ends("ment"): pass
+            elif self.ends("ent"): pass
+            else: return
+        elif self.b[self.k - 1] == 'o':
+            if self.ends("ion") and (self.b[self.j] == 's' \
+                or self.b[self.j] == 't'): pass
+            elif self.ends("ou"): pass
+            # takes care of -ous
+            else: return
+        elif self.b[self.k - 1] == 's':
+            if self.ends("ism"): pass
+            else: return
+        elif self.b[self.k - 1] == 't':
+            if self.ends("ate"): pass
+            elif self.ends("iti"): pass
+            else: return
+        elif self.b[self.k - 1] == 'u':
+            if self.ends("ous"): pass
+            else: return
+        elif self.b[self.k - 1] == 'v':
+            if self.ends("ive"): pass
+            else: return
+        elif self.b[self.k - 1] == 'z':
+            if self.ends("ize"): pass
+            else: return
+        else:
+            return
+        if self.m() > 1:
+            self.k = self.j
+
+    def step5(self):
+        """step5() removes a final -e if m() > 1, and changes -ll to -l if
+        m() > 1.
+        """
+        self.j = self.k
+        if self.b[self.k] == 'e':
+            a = self.m()
+            if a > 1 or (a == 1 and not self.cvc(self.k-1)):
+                self.k = self.k - 1
+        if self.b[self.k] == 'l' and self.doublec(self.k) and self.m() > 1:
+            self.k = self.k -1
+
+    def stem(self, p, i, j):
+        """In stem(p,i,j), p is a char pointer, and the string to be stemmed
+        is from p[i] to p[j] inclusive. Typically i is zero and j is the
+        offset to the last character of a string, (p[j+1] == '\0'). The
+        stemmer adjusts the characters p[i] ... p[j] and returns the new
+        end-point of the string, k. Stemming never increases word length, so
+        i <= k <= j. To turn the stemmer into a module, declare 'stem' as
+        extern, and delete the remainder of this file.
+        """
+        # copy the parameters into statics
+        self.b = p
+        self.k = j
+        self.k0 = i
+        if self.k <= self.k0 + 1:
+            return self.b # --DEPARTURE--
+
+        # With this line, strings of length 1 or 2 don't go through the
+        # stemming process, although no mention is made of this in the
+        # published algorithm. Remove the line to match the published
+        # algorithm.
+
+        self.step1ab()
+        self.step1c()
+        self.step2()
+        self.step3()
+        self.step4()
+        self.step5()
+        return self.b[self.k0:self.k+1]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/util/texescape.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.util.texescape
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    TeX escaping helper.
+
+    :copyright: 2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+tex_replacements = [
+    # map TeX special chars
+    (u'$', ur'\$'),
+    (u'%', ur'\%'),
+    (u'&', ur'\&'),
+    (u'#', ur'\#'),
+    (u'_', ur'\_'),
+    (u'{', ur'\{'),
+    (u'}', ur'\}'),
+    (u'[', ur'{[}'),
+    (u']', ur'{]}'),
+    (u'`', ur'{}`'),
+    (u'\\',ur'\textbackslash{}'),
+    (u'~', ur'\textasciitilde{}'),
+    (u'<', ur'\textless{}'),
+    (u'>', ur'\textgreater{}'),
+    (u'^', ur'\textasciicircum{}'),
+    # map special Unicode characters to TeX commands
+    (u'¶', ur'\P{}'),
+    (u'§', ur'\S{}'),
+    (u'€', ur'\texteuro{}'),
+    (u'∞', ur'\(\infty\)'),
+    (u'±', ur'\(\pm\)'),
+    (u'→', ur'\(\rightarrow\)'),
+    (u'‣', ur'\(\rightarrow\)'),
+    # used to separate -- in options
+    (u'', ur'{}'),
+    # map some special Unicode characters to similar ASCII ones
+    (u'─', ur'-'),
+    (u'⎽', ur'\_'),
+    (u'╲', ur'\textbackslash{}'),
+    (u'│', ur'|'),
+    (u'ℯ', ur'e'),
+    (u'â…ˆ', ur'i'),
+    (u'â‚', ur'1'),
+    (u'â‚‚', ur'2'),
+    # map Greek alphabet
+    (u'α', ur'\(\alpha\)'),
+    (u'β', ur'\(\beta\)'),
+    (u'γ', ur'\(\gamma\)'),
+    (u'δ', ur'\(\delta\)'),
+    (u'ε', ur'\(\epsilon\)'),
+    (u'ζ', ur'\(\zeta\)'),
+    (u'η', ur'\(\eta\)'),
+    (u'θ', ur'\(\theta\)'),
+    (u'ι', ur'\(\iota\)'),
+    (u'κ', ur'\(\kappa\)'),
+    (u'λ', ur'\(\lambda\)'),
+    (u'μ', ur'\(\mu\)'),
+    (u'ν', ur'\(\nu\)'),
+    (u'ξ', ur'\(\xi\)'),
+    (u'ο', ur'o'),
+    (u'Ï€', ur'\(\pi\)'),
+    (u'Ï', ur'\(\rho\)'),
+    (u'σ', ur'\(\sigma\)'),
+    (u'Ï„', ur'\(\tau\)'),
+    (u'Ï…', u'\\(\\upsilon\\)'),
+    (u'φ', ur'\(\phi\)'),
+    (u'χ', ur'\(\chi\)'),
+    (u'ψ', ur'\(\psi\)'),
+    (u'ω', ur'\(\omega\)'),
+    (u'Α', ur'A'),
+    (u'Î’', ur'B'),
+    (u'Γ', ur'\(\Gamma\)'),
+    (u'Δ', ur'\(\Delta\)'),
+    (u'Ε', ur'E'),
+    (u'Ζ', ur'Z'),
+    (u'Η', ur'H'),
+    (u'Θ', ur'\(\Theta\)'),
+    (u'Ι', ur'I'),
+    (u'Κ', ur'K'),
+    (u'Λ', ur'\(\Lambda\)'),
+    (u'Μ', ur'M'),
+    (u'Î', ur'N'),
+    (u'Ξ', ur'\(\Xi\)'),
+    (u'Ο', ur'O'),
+    (u'Π', ur'\(\Pi\)'),
+    (u'Ρ', ur'P'),
+    (u'Σ', ur'\(\Sigma\)'),
+    (u'Τ', ur'T'),
+    (u'Î¥', u'\\(\\Upsilon\\)'),
+    (u'Φ', ur'\(\Phi\)'),
+    (u'Χ', ur'X'),
+    (u'Ψ', ur'\(\Psi\)'),
+    (u'Ω', ur'\(\Omega\)'),
+    (u'Ω', ur'\(\Omega\)'),
+]
+
+tex_escape_map = {}
+tex_hl_escape_map = {}
+_new_cmd_chars = {ord(u'\\'): u'@', ord(u'{'): u'[', ord(u'}'): u']'}
+
+def init():
+    for a, b in tex_replacements:
+        tex_escape_map[ord(a)] = b
+
+    for a, b in tex_replacements:
+        if a in u'[]{}\\': continue
+        tex_hl_escape_map[ord(a)] = b.translate(_new_cmd_chars)
Binary file buildframework/helium/external/python/lib/common/coverage-2.85-py2.5.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/PKG-INFO	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,38 @@
+Metadata-Version: 1.0
+Name: docutils
+Version: 0.5
+Summary: Docutils -- Python Documentation Utilities
+Home-page: http://docutils.sourceforge.net/
+Author: David Goodger
+Author-email: goodger@python.org
+License: public domain, Python, BSD, GPL (see COPYING.txt)
+Description: Docutils is a modular system for processing documentation
+        into useful formats, such as HTML, XML, and LaTeX.  For
+        input Docutils supports reStructuredText, an easy-to-read,
+        what-you-see-is-what-you-get plaintext markup syntax.
+Platform: OS-independent
+Classifier: Development Status :: 3 - Alpha
+Classifier: Environment :: Console
+Classifier: Intended Audience :: End Users/Desktop
+Classifier: Intended Audience :: Other Audience
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: System Administrators
+Classifier: License :: Public Domain
+Classifier: License :: OSI Approved :: Python Software Foundation License
+Classifier: License :: OSI Approved :: BSD License
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Documentation
+Classifier: Topic :: Software Development :: Documentation
+Classifier: Topic :: Text Processing
+Classifier: Natural Language :: English
+Classifier: Natural Language :: Afrikaans
+Classifier: Natural Language :: Esperanto
+Classifier: Natural Language :: French
+Classifier: Natural Language :: German
+Classifier: Natural Language :: Italian
+Classifier: Natural Language :: Russian
+Classifier: Natural Language :: Slovak
+Classifier: Natural Language :: Spanish
+Classifier: Natural Language :: Swedish
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/SOURCES.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,482 @@
+BUGS.txt
+COPYING.txt
+FAQ.txt
+HISTORY.txt
+MANIFEST.in
+README.txt
+RELEASE-NOTES.txt
+THANKS.txt
+install.py
+setup.py
+docs/index.txt
+docs/api/cmdline-tool.txt
+docs/api/publisher.txt
+docs/api/runtime-settings.txt
+docs/dev/distributing.txt
+docs/dev/enthought-plan.txt
+docs/dev/enthought-rfp.txt
+docs/dev/hacking.txt
+docs/dev/policies.txt
+docs/dev/pysource.dtd
+docs/dev/pysource.txt
+docs/dev/release.txt
+docs/dev/repository.txt
+docs/dev/semantics.txt
+docs/dev/testing.txt
+docs/dev/todo.txt
+docs/dev/website.txt
+docs/dev/rst/alternatives.txt
+docs/dev/rst/problems.txt
+docs/howto/html-stylesheets.txt
+docs/howto/i18n.txt
+docs/howto/rst-directives.txt
+docs/howto/rst-roles.txt
+docs/howto/security.txt
+docs/peps/pep-0256.txt
+docs/peps/pep-0257.txt
+docs/peps/pep-0258.txt
+docs/peps/pep-0287.txt
+docs/ref/doctree.txt
+docs/ref/docutils.dtd
+docs/ref/soextblx.dtd
+docs/ref/transforms.txt
+docs/ref/rst/definitions.txt
+docs/ref/rst/directives.txt
+docs/ref/rst/introduction.txt
+docs/ref/rst/restructuredtext.txt
+docs/ref/rst/roles.txt
+docs/user/Makefile.docutils-update
+docs/user/config.txt
+docs/user/emacs.txt
+docs/user/latex.txt
+docs/user/links.txt
+docs/user/mailing-lists.txt
+docs/user/slide-shows.txt
+docs/user/tools.txt
+docs/user/images/big-black.png
+docs/user/images/big-white.png
+docs/user/images/default.png
+docs/user/images/happy_monkey.png
+docs/user/images/medium-black.png
+docs/user/images/medium-white.png
+docs/user/images/rsp-all.png
+docs/user/images/rsp-breaks.png
+docs/user/images/rsp-covers.png
+docs/user/images/rsp-cuts.png
+docs/user/images/rsp-empty.png
+docs/user/images/rsp-objects.png
+docs/user/images/rsp.svg
+docs/user/images/s5-files.png
+docs/user/images/s5-files.svg
+docs/user/images/small-black.png
+docs/user/images/small-white.png
+docs/user/rst/cheatsheet.txt
+docs/user/rst/demo.txt
+docs/user/rst/quickref.html
+docs/user/rst/quickstart.txt
+docs/user/rst/images/ball1.gif
+docs/user/rst/images/biohazard.png
+docs/user/rst/images/title.png
+docutils/__init__.py
+docutils/core.py
+docutils/docutils.conf
+docutils/examples.py
+docutils/frontend.py
+docutils/io.py
+docutils/nodes.py
+docutils/statemachine.py
+docutils/urischemes.py
+docutils/utils.py
+docutils/languages/__init__.py
+docutils/languages/af.py
+docutils/languages/ca.py
+docutils/languages/cs.py
+docutils/languages/de.py
+docutils/languages/en.py
+docutils/languages/eo.py
+docutils/languages/es.py
+docutils/languages/fi.py
+docutils/languages/fr.py
+docutils/languages/he.py
+docutils/languages/it.py
+docutils/languages/ja.py
+docutils/languages/nl.py
+docutils/languages/pt_br.py
+docutils/languages/ru.py
+docutils/languages/sk.py
+docutils/languages/sv.py
+docutils/languages/zh_cn.py
+docutils/languages/zh_tw.py
+docutils/parsers/__init__.py
+docutils/parsers/null.py
+docutils/parsers/rst/__init__.py
+docutils/parsers/rst/roles.py
+docutils/parsers/rst/states.py
+docutils/parsers/rst/tableparser.py
+docutils/parsers/rst/directives/__init__.py
+docutils/parsers/rst/directives/admonitions.py
+docutils/parsers/rst/directives/body.py
+docutils/parsers/rst/directives/html.py
+docutils/parsers/rst/directives/images.py
+docutils/parsers/rst/directives/misc.py
+docutils/parsers/rst/directives/parts.py
+docutils/parsers/rst/directives/references.py
+docutils/parsers/rst/directives/tables.py
+docutils/parsers/rst/include/README.txt
+docutils/parsers/rst/include/isoamsa.txt
+docutils/parsers/rst/include/isoamsb.txt
+docutils/parsers/rst/include/isoamsc.txt
+docutils/parsers/rst/include/isoamsn.txt
+docutils/parsers/rst/include/isoamso.txt
+docutils/parsers/rst/include/isoamsr.txt
+docutils/parsers/rst/include/isobox.txt
+docutils/parsers/rst/include/isocyr1.txt
+docutils/parsers/rst/include/isocyr2.txt
+docutils/parsers/rst/include/isodia.txt
+docutils/parsers/rst/include/isogrk1.txt
+docutils/parsers/rst/include/isogrk2.txt
+docutils/parsers/rst/include/isogrk3.txt
+docutils/parsers/rst/include/isogrk4-wide.txt
+docutils/parsers/rst/include/isogrk4.txt
+docutils/parsers/rst/include/isolat1.txt
+docutils/parsers/rst/include/isolat2.txt
+docutils/parsers/rst/include/isomfrk-wide.txt
+docutils/parsers/rst/include/isomfrk.txt
+docutils/parsers/rst/include/isomopf-wide.txt
+docutils/parsers/rst/include/isomopf.txt
+docutils/parsers/rst/include/isomscr-wide.txt
+docutils/parsers/rst/include/isomscr.txt
+docutils/parsers/rst/include/isonum.txt
+docutils/parsers/rst/include/isopub.txt
+docutils/parsers/rst/include/isotech.txt
+docutils/parsers/rst/include/mmlalias.txt
+docutils/parsers/rst/include/mmlextra-wide.txt
+docutils/parsers/rst/include/mmlextra.txt
+docutils/parsers/rst/include/s5defs.txt
+docutils/parsers/rst/include/xhtml1-lat1.txt
+docutils/parsers/rst/include/xhtml1-special.txt
+docutils/parsers/rst/include/xhtml1-symbol.txt
+docutils/parsers/rst/languages/__init__.py
+docutils/parsers/rst/languages/af.py
+docutils/parsers/rst/languages/ca.py
+docutils/parsers/rst/languages/cs.py
+docutils/parsers/rst/languages/de.py
+docutils/parsers/rst/languages/en.py
+docutils/parsers/rst/languages/eo.py
+docutils/parsers/rst/languages/es.py
+docutils/parsers/rst/languages/fi.py
+docutils/parsers/rst/languages/fr.py
+docutils/parsers/rst/languages/he.py
+docutils/parsers/rst/languages/it.py
+docutils/parsers/rst/languages/ja.py
+docutils/parsers/rst/languages/nl.py
+docutils/parsers/rst/languages/pt_br.py
+docutils/parsers/rst/languages/ru.py
+docutils/parsers/rst/languages/sk.py
+docutils/parsers/rst/languages/sv.py
+docutils/parsers/rst/languages/zh_cn.py
+docutils/parsers/rst/languages/zh_tw.py
+docutils/readers/__init__.py
+docutils/readers/doctree.py
+docutils/readers/pep.py
+docutils/readers/standalone.py
+docutils/readers/python/__init__.py
+docutils/readers/python/moduleparser.py
+docutils/readers/python/pynodes.py
+docutils/transforms/__init__.py
+docutils/transforms/components.py
+docutils/transforms/frontmatter.py
+docutils/transforms/misc.py
+docutils/transforms/parts.py
+docutils/transforms/peps.py
+docutils/transforms/references.py
+docutils/transforms/universal.py
+docutils/transforms/writer_aux.py
+docutils/writers/__init__.py
+docutils/writers/docutils_xml.py
+docutils/writers/null.py
+docutils/writers/pseudoxml.py
+docutils/writers/html4css1/__init__.py
+docutils/writers/html4css1/html4css1.css
+docutils/writers/html4css1/template.txt
+docutils/writers/latex2e/__init__.py
+docutils/writers/latex2e/latex2e.tex
+docutils/writers/newlatex2e/__init__.py
+docutils/writers/newlatex2e/base.tex
+docutils/writers/newlatex2e/notes.txt
+docutils/writers/newlatex2e/tests.txt
+docutils/writers/newlatex2e/unicode_map.py
+docutils/writers/pep_html/__init__.py
+docutils/writers/pep_html/pep.css
+docutils/writers/pep_html/template.txt
+docutils/writers/s5_html/__init__.py
+docutils/writers/s5_html/themes/README.txt
+docutils/writers/s5_html/themes/big-black/__base__
+docutils/writers/s5_html/themes/big-black/framing.css
+docutils/writers/s5_html/themes/big-black/pretty.css
+docutils/writers/s5_html/themes/big-white/framing.css
+docutils/writers/s5_html/themes/big-white/pretty.css
+docutils/writers/s5_html/themes/default/blank.gif
+docutils/writers/s5_html/themes/default/framing.css
+docutils/writers/s5_html/themes/default/iepngfix.htc
+docutils/writers/s5_html/themes/default/opera.css
+docutils/writers/s5_html/themes/default/outline.css
+docutils/writers/s5_html/themes/default/pretty.css
+docutils/writers/s5_html/themes/default/print.css
+docutils/writers/s5_html/themes/default/s5-core.css
+docutils/writers/s5_html/themes/default/slides.css
+docutils/writers/s5_html/themes/default/slides.js
+docutils/writers/s5_html/themes/medium-black/__base__
+docutils/writers/s5_html/themes/medium-black/pretty.css
+docutils/writers/s5_html/themes/medium-white/framing.css
+docutils/writers/s5_html/themes/medium-white/pretty.css
+docutils/writers/s5_html/themes/small-black/__base__
+docutils/writers/s5_html/themes/small-black/pretty.css
+docutils/writers/s5_html/themes/small-white/framing.css
+docutils/writers/s5_html/themes/small-white/pretty.css
+extras/optparse.py
+extras/roman.py
+extras/textwrap.py
+extras/docutils.egg-info/PKG-INFO
+extras/docutils.egg-info/SOURCES.txt
+extras/docutils.egg-info/dependency_links.txt
+extras/docutils.egg-info/top_level.txt
+licenses/docutils.conf
+licenses/gpl.txt
+licenses/python-2-1-1.txt
+licenses/python-2-2.txt
+licenses/python-2-3.txt
+test/DocutilsTestSupport.py
+test/alltests.py
+test/coverage.sh
+test/docutils.conf
+test/docutils_difflib.py
+test/package_unittest.py
+test/test_dependencies.py
+test/test_functional.py
+test/test_io.py
+test/test_language.py
+test/test_nodes.py
+test/test_pickle.py
+test/test_publisher.py
+test/test_settings.py
+test/test_statemachine.py
+test/test_traversals.py
+test/test_utils.py
+test/test_viewlist.py
+test/data/config_1.txt
+test/data/config_2.txt
+test/data/config_error_handler.txt
+test/data/config_list.txt
+test/data/config_list_2.txt
+test/data/config_old.txt
+test/data/csv_data.txt
+test/data/csv_dep.txt
+test/data/dependencies.txt
+test/data/full-template.txt
+test/data/include.txt
+test/data/raw.txt
+test/data/stylesheet.txt
+test/functional/README.txt
+test/functional/expected/compact_lists.html
+test/functional/expected/dangerous.html
+test/functional/expected/field_name_limit.html
+test/functional/expected/latex_docinfo.tex
+test/functional/expected/misc_rst_html4css1.html
+test/functional/expected/pep_html.html
+test/functional/expected/standalone_rst_html4css1.html
+test/functional/expected/standalone_rst_latex.tex
+test/functional/expected/standalone_rst_pseudoxml.txt
+test/functional/expected/standalone_rst_s5_html_1.html
+test/functional/expected/standalone_rst_s5_html_2.html
+test/functional/expected/ui/default/blank.gif
+test/functional/expected/ui/default/framing.css
+test/functional/expected/ui/default/iepngfix.htc
+test/functional/expected/ui/default/opera.css
+test/functional/expected/ui/default/outline.css
+test/functional/expected/ui/default/pretty.css
+test/functional/expected/ui/default/print.css
+test/functional/expected/ui/default/s5-core.css
+test/functional/expected/ui/default/slides.css
+test/functional/expected/ui/default/slides.js
+test/functional/expected/ui/small-black/blank.gif
+test/functional/expected/ui/small-black/framing.css
+test/functional/expected/ui/small-black/iepngfix.htc
+test/functional/expected/ui/small-black/opera.css
+test/functional/expected/ui/small-black/outline.css
+test/functional/expected/ui/small-black/pretty.css
+test/functional/expected/ui/small-black/print.css
+test/functional/expected/ui/small-black/s5-core.css
+test/functional/expected/ui/small-black/slides.css
+test/functional/expected/ui/small-black/slides.js
+test/functional/input/compact_lists.txt
+test/functional/input/dangerous.txt
+test/functional/input/field_list.txt
+test/functional/input/latex_docinfo.txt
+test/functional/input/pep_html.txt
+test/functional/input/simple.txt
+test/functional/input/standalone_rst_html4css1.txt
+test/functional/input/standalone_rst_latex.txt
+test/functional/input/standalone_rst_newlatex.txt
+test/functional/input/standalone_rst_pseudoxml.txt
+test/functional/input/standalone_rst_s5_html.txt
+test/functional/input/data/custom_roles.txt
+test/functional/input/data/errors.txt
+test/functional/input/data/header_footer.txt
+test/functional/input/data/latex.txt
+test/functional/input/data/latex2e.txt
+test/functional/input/data/list_table.txt
+test/functional/input/data/nonalphanumeric.txt
+test/functional/input/data/standard.txt
+test/functional/input/data/table_colspan.txt
+test/functional/input/data/table_complex.txt
+test/functional/input/data/table_rowspan.txt
+test/functional/input/data/unicode.txt
+test/functional/output/README.txt
+test/functional/tests/_default.py
+test/functional/tests/_standalone_rst_defaults.py
+test/functional/tests/compact_lists.py
+test/functional/tests/dangerous.py
+test/functional/tests/field_name_limit.py
+test/functional/tests/latex_docinfo.py
+test/functional/tests/misc_rst_html4css1.py
+test/functional/tests/pep_html.py
+test/functional/tests/standalone_rst_html4css1.py
+test/functional/tests/standalone_rst_latex.py
+test/functional/tests/standalone_rst_pseudoxml.py
+test/functional/tests/standalone_rst_s5_html_1.py
+test/functional/tests/standalone_rst_s5_html_2.py
+test/test_parsers/__init__.py
+test/test_parsers/test_rst/__init__.py
+test/test_parsers/test_rst/test_SimpleTableParser.py
+test/test_parsers/test_rst/test_TableParser.py
+test/test_parsers/test_rst/test_block_quotes.py
+test/test_parsers/test_rst/test_bullet_lists.py
+test/test_parsers/test_rst/test_citations.py
+test/test_parsers/test_rst/test_comments.py
+test/test_parsers/test_rst/test_definition_lists.py
+test/test_parsers/test_rst/test_doctest_blocks.py
+test/test_parsers/test_rst/test_east_asian_text.py
+test/test_parsers/test_rst/test_enumerated_lists.py
+test/test_parsers/test_rst/test_field_lists.py
+test/test_parsers/test_rst/test_footnotes.py
+test/test_parsers/test_rst/test_functions.py
+test/test_parsers/test_rst/test_inline_markup.py
+test/test_parsers/test_rst/test_interpreted.py
+test/test_parsers/test_rst/test_line_blocks.py
+test/test_parsers/test_rst/test_literal_blocks.py
+test/test_parsers/test_rst/test_option_lists.py
+test/test_parsers/test_rst/test_outdenting.py
+test/test_parsers/test_rst/test_paragraphs.py
+test/test_parsers/test_rst/test_section_headers.py
+test/test_parsers/test_rst/test_substitutions.py
+test/test_parsers/test_rst/test_tables.py
+test/test_parsers/test_rst/test_targets.py
+test/test_parsers/test_rst/test_transitions.py
+test/test_parsers/test_rst/includes/include9.txt
+test/test_parsers/test_rst/test_directives/__init__.py
+test/test_parsers/test_rst/test_directives/empty.txt
+test/test_parsers/test_rst/test_directives/include 11.txt
+test/test_parsers/test_rst/test_directives/include1.txt
+test/test_parsers/test_rst/test_directives/include10.txt
+test/test_parsers/test_rst/test_directives/include12.txt
+test/test_parsers/test_rst/test_directives/include13.txt
+test/test_parsers/test_rst/test_directives/include2.txt
+test/test_parsers/test_rst/test_directives/include3.txt
+test/test_parsers/test_rst/test_directives/include8.txt
+test/test_parsers/test_rst/test_directives/raw1.txt
+test/test_parsers/test_rst/test_directives/test_admonitions.py
+test/test_parsers/test_rst/test_directives/test_block_quotes.py
+test/test_parsers/test_rst/test_directives/test_class.py
+test/test_parsers/test_rst/test_directives/test_compound.py
+test/test_parsers/test_rst/test_directives/test_container.py
+test/test_parsers/test_rst/test_directives/test_contents.py
+test/test_parsers/test_rst/test_directives/test_date.py
+test/test_parsers/test_rst/test_directives/test_decorations.py
+test/test_parsers/test_rst/test_directives/test_default_role.py
+test/test_parsers/test_rst/test_directives/test_figures.py
+test/test_parsers/test_rst/test_directives/test_images.py
+test/test_parsers/test_rst/test_directives/test_include.py
+test/test_parsers/test_rst/test_directives/test_line_blocks.py
+test/test_parsers/test_rst/test_directives/test_meta.py
+test/test_parsers/test_rst/test_directives/test_parsed_literals.py
+test/test_parsers/test_rst/test_directives/test_raw.py
+test/test_parsers/test_rst/test_directives/test_replace.py
+test/test_parsers/test_rst/test_directives/test_role.py
+test/test_parsers/test_rst/test_directives/test_rubrics.py
+test/test_parsers/test_rst/test_directives/test_sectnum.py
+test/test_parsers/test_rst/test_directives/test_sidebars.py
+test/test_parsers/test_rst/test_directives/test_tables.py
+test/test_parsers/test_rst/test_directives/test_target_notes.py
+test/test_parsers/test_rst/test_directives/test_test_directives.py
+test/test_parsers/test_rst/test_directives/test_title.py
+test/test_parsers/test_rst/test_directives/test_topics.py
+test/test_parsers/test_rst/test_directives/test_unicode.py
+test/test_parsers/test_rst/test_directives/test_unknown.py
+test/test_parsers/test_rst/test_directives/utf-16.csv
+test/test_parsers/test_rst/test_directives/includes/include4.txt
+test/test_parsers/test_rst/test_directives/includes/include5.txt
+test/test_parsers/test_rst/test_directives/includes/more/include6.txt
+test/test_parsers/test_rst/test_directives/includes/sibling/include7.txt
+test/test_readers/__init__.py
+test/test_readers/test_pep/__init__.py
+test/test_readers/test_pep/test_inline_markup.py
+test/test_readers/test_pep/test_rfc2822.py
+test/test_readers/test_python/__init__.py
+test/test_readers/test_python/showast
+test/test_readers/test_python/showdoc
+test/test_readers/test_python/showparse
+test/test_readers/test_python/showtok
+test/test_readers/test_python/test_functions.py
+test/test_readers/test_python/test_parser.py
+test/test_readers/test_python/test_token_parser.py
+test/test_transforms/__init__.py
+test/test_transforms/test___init__.py
+test/test_transforms/test_class.py
+test/test_transforms/test_contents.py
+test/test_transforms/test_docinfo.py
+test/test_transforms/test_doctitle.py
+test/test_transforms/test_expose_internals.py
+test/test_transforms/test_filter.py
+test/test_transforms/test_footnotes.py
+test/test_transforms/test_hyperlinks.py
+test/test_transforms/test_messages.py
+test/test_transforms/test_peps.py
+test/test_transforms/test_sectnum.py
+test/test_transforms/test_strip_comments.py
+test/test_transforms/test_substitutions.py
+test/test_transforms/test_target_notes.py
+test/test_transforms/test_transitions.py
+test/test_transforms/test_writer_aux.py
+test/test_writers/__init__.py
+test/test_writers/test_docutils_xml.py
+test/test_writers/test_html4css1_misc.py
+test/test_writers/test_html4css1_parts.py
+test/test_writers/test_html4css1_template.py
+test/test_writers/test_latex2e.py
+test/test_writers/test_null.py
+test/test_writers/test_pseudoxml.py
+test/test_writers/test_s5.py
+tools/buildhtml.py
+tools/docutils.conf
+tools/quicktest.py
+tools/rst2html.py
+tools/rst2latex.py
+tools/rst2newlatex.py
+tools/rst2pseudoxml.py
+tools/rst2s5.py
+tools/rst2xml.py
+tools/rstpep2html.py
+tools/dev/README.txt
+tools/dev/create_unimap.py
+tools/dev/profile_docutils.py
+tools/dev/unicode2rstsubs.py
+tools/editors/README.txt
+tools/editors/emacs/README.txt
+tools/editors/emacs/docutils.conf
+tools/editors/emacs/rst.el
+tools/editors/emacs/tests/Makefile
+tools/editors/emacs/tests/README.txt
+tools/editors/emacs/tests/tests-adjust-section.el
+tools/editors/emacs/tests/tests-basic.el
+tools/editors/emacs/tests/tests-runner.el
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/dependency_links.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/not-zip-safe	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2html.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,23 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2html.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing HTML.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates (X)HTML documents from standalone reStructuredText '
+               'sources.  ' + default_description)
+
+publish_cmdline(writer_name='html', description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2latex.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,23 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2latex.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing LaTeX.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates LaTeX documents from standalone reStructuredText '
+               'sources.  ' + default_description)
+
+publish_cmdline(writer_name='latex', description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2newlatex.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,25 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2newlatex.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing LaTeX using
+the new LaTeX writer.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates LaTeX documents from standalone reStructuredText '
+               'sources. This writer is EXPERIMENTAL and should not be used '
+               'in a production environment. ' + default_description)
+
+publish_cmdline(writer_name='newlatex2e', description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2pseudoxml.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,23 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2pseudoxml.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing pseudo-XML.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates pseudo-XML from standalone reStructuredText '
+               'sources (for testing purposes).  ' + default_description)
+
+publish_cmdline(description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2s5.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,24 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2s5.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Chris Liechti <cliechti@gmx.net>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing HTML slides using
+the S5 template system.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates S5 (X)HTML slideshow documents from standalone '
+               'reStructuredText sources.  ' + default_description)
+
+publish_cmdline(writer_name='s5', description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rst2xml.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,23 @@
+#!C:\Python25\python.exe
+
+# $Id: rst2xml.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing Docutils XML.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates Docutils-native XML from standalone '
+               'reStructuredText sources.  ' + default_description)
+
+publish_cmdline(writer_name='xml', description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/scripts/rstpep2html.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,25 @@
+#!C:\Python25\python.exe
+
+# $Id: rstpep2html.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing HTML from PEP
+(Python Enhancement Proposal) documents.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates (X)HTML from reStructuredText-format PEP files.  '
+               + default_description)
+
+publish_cmdline(reader_name='pep', writer_name='pep_html',
+                description=description)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/EGG-INFO/top_level.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,2 @@
+docutils
+roman
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,204 @@
+# $Id: __init__.py 4801 2006-11-12 18:02:08Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This is the Docutils (Python Documentation Utilities) package.
+
+Package Structure
+=================
+
+Modules:
+
+- __init__.py: Contains component base classes, exception classes, and
+  Docutils version information.
+
+- core.py: Contains the ``Publisher`` class and ``publish_*()`` convenience
+  functions.
+
+- frontend.py: Runtime settings (command-line interface, configuration files)
+  processing, for Docutils front-ends.
+
+- io.py: Provides a uniform API for low-level input and output.
+
+- nodes.py: Docutils document tree (doctree) node class library.
+
+- statemachine.py: A finite state machine specialized for
+  regular-expression-based text filters.
+
+- urischemes.py: Contains a complete mapping of known URI addressing
+  scheme names to descriptions.
+
+- utils.py: Contains the ``Reporter`` system warning class and miscellaneous
+  utilities.
+
+Subpackages:
+
+- languages: Language-specific mappings of terms.
+
+- parsers: Syntax-specific input parser modules or packages.
+
+- readers: Context-specific input handlers which understand the data
+  source and manage a parser.
+
+- transforms: Modules used by readers and writers to modify DPS
+  doctrees.
+
+- writers: Format-specific output translators.
+"""
+
+__docformat__ = 'reStructuredText'
+
+__version__ = '0.5'
+"""``major.minor.micro`` version number.  The micro number is bumped for API
+changes, for new functionality, and for interim project releases.  The minor
+number is bumped whenever there is a significant project release.  The major
+number will be bumped when the project is feature-complete, and perhaps if
+there is a major change in the design."""
+
+__version_details__ = 'snapshot 2007-11-01, r5461'
+"""Extra version details (e.g. 'snapshot 2005-05-29, r3410', 'repository',
+'release'), modified automatically & manually."""
+
+class ApplicationError(StandardError): pass
+class DataError(ApplicationError): pass
+
+
+class SettingsSpec:
+
+    """
+    Runtime setting specification base class.
+
+    SettingsSpec subclass objects used by `docutils.frontend.OptionParser`.
+    """
+
+    settings_spec = ()
+    """Runtime settings specification.  Override in subclasses.
+
+    Defines runtime settings and associated command-line options, as used by
+    `docutils.frontend.OptionParser`.  This is a tuple of:
+
+    - Option group title (string or `None` which implies no group, just a list
+      of single options).
+
+    - Description (string or `None`).
+
+    - A sequence of option tuples.  Each consists of:
+
+      - Help text (string)
+
+      - List of option strings (e.g. ``['-Q', '--quux']``).
+
+      - Dictionary of keyword arguments sent to the OptionParser/OptionGroup
+        ``add_option`` method.
+
+        Runtime setting names are derived implicitly from long option names
+        ('--a-setting' becomes ``settings.a_setting``) or explicitly from the
+        'dest' keyword argument.
+
+        Most settings will also have a 'validator' keyword & function.  The
+        validator function validates setting values (from configuration files
+        and command-line option arguments) and converts them to appropriate
+        types.  For example, the ``docutils.frontend.validate_boolean``
+        function, **required by all boolean settings**, converts true values
+        ('1', 'on', 'yes', and 'true') to 1 and false values ('0', 'off',
+        'no', 'false', and '') to 0.  Validators need only be set once per
+        setting.  See the `docutils.frontend.validate_*` functions.
+
+        See the optparse docs for more details.
+
+    - More triples of group title, description, options, as many times as
+      needed.  Thus, `settings_spec` tuples can be simply concatenated.
+    """
+
+    settings_defaults = None
+    """A dictionary of defaults for settings not in `settings_spec` (internal
+    settings, intended to be inaccessible by command-line and config file).
+    Override in subclasses."""
+
+    settings_default_overrides = None
+    """A dictionary of auxiliary defaults, to override defaults for settings
+    defined in other components.  Override in subclasses."""
+
+    relative_path_settings = ()
+    """Settings containing filesystem paths.  Override in subclasses.
+    Settings listed here are to be interpreted relative to the current working
+    directory."""
+
+    config_section = None
+    """The name of the config file section specific to this component
+    (lowercase, no brackets).  Override in subclasses."""
+
+    config_section_dependencies = None
+    """A list of names of config file sections that are to be applied before
+    `config_section`, in order (from general to specific).  In other words,
+    the settings in `config_section` are to be overlaid on top of the settings
+    from these sections.  The "general" section is assumed implicitly.
+    Override in subclasses."""
+
+
+class TransformSpec:
+
+    """
+    Runtime transform specification base class.
+
+    TransformSpec subclass objects used by `docutils.transforms.Transformer`.
+    """
+
+    def get_transforms(self):
+        """Transforms required by this class.  Override in subclasses."""
+        if self.default_transforms != ():
+            import warnings
+            warnings.warn('default_transforms attribute deprecated.\n'
+                          'Use get_transforms() method instead.',
+                          DeprecationWarning)
+            return list(self.default_transforms)
+        return []
+
+    # Deprecated; for compatibility.
+    default_transforms = ()
+
+    unknown_reference_resolvers = ()
+    """List of functions to try to resolve unknown references.  Unknown
+    references have a 'refname' attribute which doesn't correspond to any
+    target in the document.  Called when the transforms in
+    `docutils.tranforms.references` are unable to find a correct target.  The
+    list should contain functions which will try to resolve unknown
+    references, with the following signature::
+
+        def reference_resolver(node):
+            '''Returns boolean: true if resolved, false if not.'''
+
+    If the function is able to resolve the reference, it should also remove
+    the 'refname' attribute and mark the node as resolved::
+
+        del node['refname']
+        node.resolved = 1
+
+    Each function must have a "priority" attribute which will affect the order
+    the unknown_reference_resolvers are run::
+
+        reference_resolver.priority = 100
+
+    Override in subclasses."""
+
+
+class Component(SettingsSpec, TransformSpec):
+
+    """Base class for Docutils components."""
+
+    component_type = None
+    """Name of the component type ('reader', 'parser', 'writer').  Override in
+    subclasses."""
+
+    supported = ()
+    """Names for this component.  Override in subclasses."""
+
+    def supports(self, format):
+        """
+        Is `format` supported by this component?
+
+        To be used by transforms to ask the dependent component if it supports
+        a certain input context or output format.
+        """
+        return format in self.supported
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/core.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,613 @@
+# $Id: core.py 5033 2007-03-21 19:51:22Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Calling the ``publish_*`` convenience functions (or instantiating a
+`Publisher` object) with component names will result in default
+behavior.  For custom behavior (setting component options), create
+custom component objects first, and pass *them* to
+``publish_*``/`Publisher`.  See `The Docutils Publisher`_.
+
+.. _The Docutils Publisher: http://docutils.sf.net/docs/api/publisher.html
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import pprint
+from types import StringType
+from docutils import __version__, __version_details__, SettingsSpec
+from docutils import frontend, io, utils, readers, writers
+from docutils.frontend import OptionParser
+from docutils.transforms import Transformer
+import docutils.readers.doctree
+
+
+class Publisher:
+
+    """
+    A facade encapsulating the high-level logic of a Docutils system.
+    """
+
+    def __init__(self, reader=None, parser=None, writer=None,
+                 source=None, source_class=io.FileInput,
+                 destination=None, destination_class=io.FileOutput,
+                 settings=None):
+        """
+        Initial setup.  If any of `reader`, `parser`, or `writer` are not
+        specified, the corresponding ``set_...`` method should be called with
+        a component name (`set_reader` sets the parser as well).
+        """
+
+        self.document = None
+        """The document tree (`docutils.nodes` objects)."""
+
+        self.reader = reader
+        """A `docutils.readers.Reader` instance."""
+
+        self.parser = parser
+        """A `docutils.parsers.Parser` instance."""
+
+        self.writer = writer
+        """A `docutils.writers.Writer` instance."""
+
+        for component in 'reader', 'parser', 'writer':
+            assert not isinstance(getattr(self, component), StringType), \
+                   ('passed string as "%s" parameter; use "%s_name" instead'
+                    % (getattr(self, component), component, component))
+
+        self.source = source
+        """The source of input data, a `docutils.io.Input` instance."""
+
+        self.source_class = source_class
+        """The class for dynamically created source objects."""
+
+        self.destination = destination
+        """The destination for docutils output, a `docutils.io.Output`
+        instance."""
+
+        self.destination_class = destination_class
+        """The class for dynamically created destination objects."""
+
+        self.settings = settings
+        """An object containing Docutils settings as instance attributes.
+        Set by `self.process_command_line()` or `self.get_settings()`."""
+
+    def set_reader(self, reader_name, parser, parser_name):
+        """Set `self.reader` by name."""
+        reader_class = readers.get_reader_class(reader_name)
+        self.reader = reader_class(parser, parser_name)
+        self.parser = self.reader.parser
+
+    def set_writer(self, writer_name):
+        """Set `self.writer` by name."""
+        writer_class = writers.get_writer_class(writer_name)
+        self.writer = writer_class()
+
+    def set_components(self, reader_name, parser_name, writer_name):
+        if self.reader is None:
+            self.set_reader(reader_name, self.parser, parser_name)
+        if self.parser is None:
+            if self.reader.parser is None:
+                self.reader.set_parser(parser_name)
+            self.parser = self.reader.parser
+        if self.writer is None:
+            self.set_writer(writer_name)
+
+    def setup_option_parser(self, usage=None, description=None,
+                            settings_spec=None, config_section=None,
+                            **defaults):
+        if config_section:
+            if not settings_spec:
+                settings_spec = SettingsSpec()
+            settings_spec.config_section = config_section
+            parts = config_section.split()
+            if len(parts) > 1 and parts[-1] == 'application':
+                settings_spec.config_section_dependencies = ['applications']
+        #@@@ Add self.source & self.destination to components in future?
+        option_parser = OptionParser(
+            components=(self.parser, self.reader, self.writer, settings_spec),
+            defaults=defaults, read_config_files=1,
+            usage=usage, description=description)
+        return option_parser
+
+    def get_settings(self, usage=None, description=None,
+                     settings_spec=None, config_section=None, **defaults):
+        """
+        Set and return default settings (overrides in `defaults` dict).
+
+        Set components first (`self.set_reader` & `self.set_writer`).
+        Explicitly setting `self.settings` disables command line option
+        processing from `self.publish()`.
+        """
+        option_parser = self.setup_option_parser(
+            usage, description, settings_spec, config_section, **defaults)
+        self.settings = option_parser.get_default_values()
+        return self.settings
+
+    def process_programmatic_settings(self, settings_spec,
+                                      settings_overrides,
+                                      config_section):
+        if self.settings is None:
+            defaults = (settings_overrides or {}).copy()
+            # Propagate exceptions by default when used programmatically:
+            defaults.setdefault('traceback', 1)
+            self.get_settings(settings_spec=settings_spec,
+                              config_section=config_section,
+                              **defaults)
+
+    def process_command_line(self, argv=None, usage=None, description=None,
+                             settings_spec=None, config_section=None,
+                             **defaults):
+        """
+        Pass an empty list to `argv` to avoid reading `sys.argv` (the
+        default).
+
+        Set components first (`self.set_reader` & `self.set_writer`).
+        """
+        option_parser = self.setup_option_parser(
+            usage, description, settings_spec, config_section, **defaults)
+        if argv is None:
+            argv = sys.argv[1:]
+        self.settings = option_parser.parse_args(argv)
+
+    def set_io(self, source_path=None, destination_path=None):
+        if self.source is None:
+            self.set_source(source_path=source_path)
+        if self.destination is None:
+            self.set_destination(destination_path=destination_path)
+
+    def set_source(self, source=None, source_path=None):
+        if source_path is None:
+            source_path = self.settings._source
+        else:
+            self.settings._source = source_path
+        self.source = self.source_class(
+            source=source, source_path=source_path,
+            encoding=self.settings.input_encoding)
+
+    def set_destination(self, destination=None, destination_path=None):
+        if destination_path is None:
+            destination_path = self.settings._destination
+        else:
+            self.settings._destination = destination_path
+        self.destination = self.destination_class(
+            destination=destination, destination_path=destination_path,
+            encoding=self.settings.output_encoding,
+            error_handler=self.settings.output_encoding_error_handler)
+
+    def apply_transforms(self):
+        self.document.transformer.populate_from_components(
+            (self.source, self.reader, self.reader.parser, self.writer,
+             self.destination))
+        self.document.transformer.apply_transforms()
+
+    def publish(self, argv=None, usage=None, description=None,
+                settings_spec=None, settings_overrides=None,
+                config_section=None, enable_exit_status=None):
+        """
+        Process command line options and arguments (if `self.settings` not
+        already set), run `self.reader` and then `self.writer`.  Return
+        `self.writer`'s output.
+        """
+        exit = None
+        try:
+            if self.settings is None:
+                self.process_command_line(
+                    argv, usage, description, settings_spec, config_section,
+                    **(settings_overrides or {}))
+            self.set_io()
+            self.document = self.reader.read(self.source, self.parser,
+                                             self.settings)
+            self.apply_transforms()
+            output = self.writer.write(self.document, self.destination)
+            self.writer.assemble_parts()
+        except SystemExit, error:
+            exit = 1
+            exit_status = error.code
+        except Exception, error:
+            if not self.settings:       # exception too early to report nicely
+                raise
+            if self.settings.traceback: # Propagate exceptions?
+                self.debugging_dumps()
+                raise
+            self.report_Exception(error)
+            exit = 1
+            exit_status = 1
+        self.debugging_dumps()
+        if (enable_exit_status and self.document
+            and (self.document.reporter.max_level
+                 >= self.settings.exit_status_level)):
+            sys.exit(self.document.reporter.max_level + 10)
+        elif exit:
+            sys.exit(exit_status)
+        return output
+
+    def debugging_dumps(self):
+        if not self.document:
+            return
+        if self.settings.dump_settings:
+            print >>sys.stderr, '\n::: Runtime settings:'
+            print >>sys.stderr, pprint.pformat(self.settings.__dict__)
+        if self.settings.dump_internals:
+            print >>sys.stderr, '\n::: Document internals:'
+            print >>sys.stderr, pprint.pformat(self.document.__dict__)
+        if self.settings.dump_transforms:
+            print >>sys.stderr, '\n::: Transforms applied:'
+            print >>sys.stderr, (' (priority, transform class, '
+                                 'pending node details, keyword args)')
+            print >>sys.stderr, pprint.pformat(
+                [(priority, '%s.%s' % (xclass.__module__, xclass.__name__),
+                  pending and pending.details, kwargs)
+                 for priority, xclass, pending, kwargs
+                 in self.document.transformer.applied])
+        if self.settings.dump_pseudo_xml:
+            print >>sys.stderr, '\n::: Pseudo-XML:'
+            print >>sys.stderr, self.document.pformat().encode(
+                'raw_unicode_escape')
+
+    def report_Exception(self, error):
+        if isinstance(error, utils.SystemMessage):
+            self.report_SystemMessage(error)
+        elif isinstance(error, UnicodeError):
+            self.report_UnicodeError(error)
+        else:
+            print >>sys.stderr, '%s: %s' % (error.__class__.__name__, error)
+            print >>sys.stderr, ("""\
+Exiting due to error.  Use "--traceback" to diagnose.
+Please report errors to <docutils-users@lists.sf.net>.
+Include "--traceback" output, Docutils version (%s [%s]),
+Python version (%s), your OS type & version, and the
+command line used.""" % (__version__, __version_details__,
+                         sys.version.split()[0]))
+
+    def report_SystemMessage(self, error):
+        print >>sys.stderr, ('Exiting due to level-%s (%s) system message.'
+                             % (error.level,
+                                utils.Reporter.levels[error.level]))
+
+    def report_UnicodeError(self, error):
+        sys.stderr.write(
+            '%s: %s\n'
+            '\n'
+            'The specified output encoding (%s) cannot\n'
+            'handle all of the output.\n'
+            'Try setting "--output-encoding-error-handler" to\n'
+            '\n'
+            '* "xmlcharrefreplace" (for HTML & XML output);\n'
+            % (error.__class__.__name__, error,
+               self.settings.output_encoding))
+        try:
+            data = error.object[error.start:error.end]
+            sys.stderr.write(
+                '  the output will contain "%s" and should be usable.\n'
+                '* "backslashreplace" (for other output formats, Python 2.3+);\n'
+                '  look for "%s" in the output.\n'
+                % (data.encode('ascii', 'xmlcharrefreplace'),
+                   data.encode('ascii', 'backslashreplace')))
+        except AttributeError:
+            sys.stderr.write('  the output should be usable as-is.\n')
+        sys.stderr.write(
+            '* "replace"; look for "?" in the output.\n'
+            '\n'
+            '"--output-encoding-error-handler" is currently set to "%s".\n'
+            '\n'
+            'Exiting due to error.  Use "--traceback" to diagnose.\n'
+            'If the advice above doesn\'t eliminate the error,\n'
+            'please report it to <docutils-users@lists.sf.net>.\n'
+            'Include "--traceback" output, Docutils version (%s),\n'
+            'Python version (%s), your OS type & version, and the\n'
+            'command line used.\n'
+            % (self.settings.output_encoding_error_handler,
+               __version__, sys.version.split()[0]))
+
+default_usage = '%prog [options] [<source> [<destination>]]'
+default_description = ('Reads from <source> (default is stdin) and writes to '
+                       '<destination> (default is stdout).  See '
+                       '<http://docutils.sf.net/docs/user/config.html> for '
+                       'the full reference.')
+
+def publish_cmdline(reader=None, reader_name='standalone',
+                    parser=None, parser_name='restructuredtext',
+                    writer=None, writer_name='pseudoxml',
+                    settings=None, settings_spec=None,
+                    settings_overrides=None, config_section=None,
+                    enable_exit_status=1, argv=None,
+                    usage=default_usage, description=default_description):
+    """
+    Set up & run a `Publisher` for command-line-based file I/O (input and
+    output file paths taken automatically from the command line).  Return the
+    encoded string output also.
+
+    Parameters: see `publish_programmatically` for the remainder.
+
+    - `argv`: Command-line argument list to use instead of ``sys.argv[1:]``.
+    - `usage`: Usage string, output if there's a problem parsing the command
+      line.
+    - `description`: Program description, output for the "--help" option
+      (along with command-line option descriptions).
+    """
+    pub = Publisher(reader, parser, writer, settings=settings)
+    pub.set_components(reader_name, parser_name, writer_name)
+    output = pub.publish(
+        argv, usage, description, settings_spec, settings_overrides,
+        config_section=config_section, enable_exit_status=enable_exit_status)
+    return output
+
+def publish_file(source=None, source_path=None,
+                 destination=None, destination_path=None,
+                 reader=None, reader_name='standalone',
+                 parser=None, parser_name='restructuredtext',
+                 writer=None, writer_name='pseudoxml',
+                 settings=None, settings_spec=None, settings_overrides=None,
+                 config_section=None, enable_exit_status=None):
+    """
+    Set up & run a `Publisher` for programmatic use with file-like I/O.
+    Return the encoded string output also.
+
+    Parameters: see `publish_programmatically`.
+    """
+    output, pub = publish_programmatically(
+        source_class=io.FileInput, source=source, source_path=source_path,
+        destination_class=io.FileOutput,
+        destination=destination, destination_path=destination_path,
+        reader=reader, reader_name=reader_name,
+        parser=parser, parser_name=parser_name,
+        writer=writer, writer_name=writer_name,
+        settings=settings, settings_spec=settings_spec,
+        settings_overrides=settings_overrides,
+        config_section=config_section,
+        enable_exit_status=enable_exit_status)
+    return output
+
+def publish_string(source, source_path=None, destination_path=None,
+                   reader=None, reader_name='standalone',
+                   parser=None, parser_name='restructuredtext',
+                   writer=None, writer_name='pseudoxml',
+                   settings=None, settings_spec=None,
+                   settings_overrides=None, config_section=None,
+                   enable_exit_status=None):
+    """
+    Set up & run a `Publisher` for programmatic use with string I/O.  Return
+    the encoded string or Unicode string output.
+
+    For encoded string output, be sure to set the 'output_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    output.  Here's one way::
+
+        publish_string(..., settings_overrides={'output_encoding': 'unicode'})
+
+    Similarly for Unicode string input (`source`)::
+
+        publish_string(..., settings_overrides={'input_encoding': 'unicode'})
+
+    Parameters: see `publish_programmatically`.
+    """
+    output, pub = publish_programmatically(
+        source_class=io.StringInput, source=source, source_path=source_path,
+        destination_class=io.StringOutput,
+        destination=None, destination_path=destination_path,
+        reader=reader, reader_name=reader_name,
+        parser=parser, parser_name=parser_name,
+        writer=writer, writer_name=writer_name,
+        settings=settings, settings_spec=settings_spec,
+        settings_overrides=settings_overrides,
+        config_section=config_section,
+        enable_exit_status=enable_exit_status)
+    return output
+
+def publish_parts(source, source_path=None, source_class=io.StringInput,
+                  destination_path=None,
+                  reader=None, reader_name='standalone',
+                  parser=None, parser_name='restructuredtext',
+                  writer=None, writer_name='pseudoxml',
+                  settings=None, settings_spec=None,
+                  settings_overrides=None, config_section=None,
+                  enable_exit_status=None):
+    """
+    Set up & run a `Publisher`, and return a dictionary of document parts.
+    Dictionary keys are the names of parts, and values are Unicode strings;
+    encoding is up to the client.  For programmatic use with string I/O.
+
+    For encoded string input, be sure to set the 'input_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    input.  Here's how::
+
+        publish_parts(..., settings_overrides={'input_encoding': 'unicode'})
+
+    Parameters: see `publish_programmatically`.
+    """
+    output, pub = publish_programmatically(
+        source=source, source_path=source_path, source_class=source_class,
+        destination_class=io.StringOutput,
+        destination=None, destination_path=destination_path,
+        reader=reader, reader_name=reader_name,
+        parser=parser, parser_name=parser_name,
+        writer=writer, writer_name=writer_name,
+        settings=settings, settings_spec=settings_spec,
+        settings_overrides=settings_overrides,
+        config_section=config_section,
+        enable_exit_status=enable_exit_status)
+    return pub.writer.parts
+
+def publish_doctree(source, source_path=None,
+                    source_class=io.StringInput,
+                    reader=None, reader_name='standalone',
+                    parser=None, parser_name='restructuredtext',
+                    settings=None, settings_spec=None,
+                    settings_overrides=None, config_section=None,
+                    enable_exit_status=None):
+    """
+    Set up & run a `Publisher` for programmatic use with string I/O.
+    Return the document tree.
+
+    For encoded string input, be sure to set the 'input_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    input.  Here's one way::
+
+        publish_doctree(..., settings_overrides={'input_encoding': 'unicode'})
+
+    Parameters: see `publish_programmatically`.
+    """
+    pub = Publisher(reader=reader, parser=parser, writer=None,
+                    settings=settings,
+                    source_class=source_class,
+                    destination_class=io.NullOutput)
+    pub.set_components(reader_name, parser_name, 'null')
+    pub.process_programmatic_settings(
+        settings_spec, settings_overrides, config_section)
+    pub.set_source(source, source_path)
+    pub.set_destination(None, None)
+    output = pub.publish(enable_exit_status=enable_exit_status)
+    return pub.document
+
+def publish_from_doctree(document, destination_path=None,
+                         writer=None, writer_name='pseudoxml',
+                         settings=None, settings_spec=None,
+                         settings_overrides=None, config_section=None,
+                         enable_exit_status=None):
+    """
+    Set up & run a `Publisher` to render from an existing document
+    tree data structure, for programmatic use with string I/O.  Return
+    the encoded string output.
+
+    Note that document.settings is overridden; if you want to use the settings
+    of the original `document`, pass settings=document.settings.
+
+    Also, new document.transformer and document.reporter objects are
+    generated.
+
+    For encoded string output, be sure to set the 'output_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    output.  Here's one way::
+
+        publish_from_doctree(
+            ..., settings_overrides={'output_encoding': 'unicode'})
+
+    Parameters: `document` is a `docutils.nodes.document` object, an existing
+    document tree.
+
+    Other parameters: see `publish_programmatically`.
+    """
+    reader = docutils.readers.doctree.Reader(parser_name='null')
+    pub = Publisher(reader, None, writer,
+                    source=io.DocTreeInput(document),
+                    destination_class=io.StringOutput, settings=settings)
+    if not writer and writer_name:
+        pub.set_writer(writer_name)
+    pub.process_programmatic_settings(
+        settings_spec, settings_overrides, config_section)
+    pub.set_destination(None, destination_path)
+    return pub.publish(enable_exit_status=enable_exit_status)
+
+def publish_programmatically(source_class, source, source_path,
+                             destination_class, destination, destination_path,
+                             reader, reader_name,
+                             parser, parser_name,
+                             writer, writer_name,
+                             settings, settings_spec,
+                             settings_overrides, config_section,
+                             enable_exit_status):
+    """
+    Set up & run a `Publisher` for custom programmatic use.  Return the
+    encoded string output and the Publisher object.
+
+    Applications should not need to call this function directly.  If it does
+    seem to be necessary to call this function directly, please write to the
+    Docutils-develop mailing list
+    <http://docutils.sf.net/docs/user/mailing-lists.html#docutils-develop>.
+
+    Parameters:
+
+    * `source_class` **required**: The class for dynamically created source
+      objects.  Typically `io.FileInput` or `io.StringInput`.
+
+    * `source`: Type depends on `source_class`:
+
+      - If `source_class` is `io.FileInput`: Either a file-like object
+        (must have 'read' and 'close' methods), or ``None``
+        (`source_path` is opened).  If neither `source` nor
+        `source_path` are supplied, `sys.stdin` is used.
+
+      - If `source_class` is `io.StringInput` **required**: The input
+        string, either an encoded 8-bit string (set the
+        'input_encoding' setting to the correct encoding) or a Unicode
+        string (set the 'input_encoding' setting to 'unicode').
+
+    * `source_path`: Type depends on `source_class`:
+
+      - `io.FileInput`: Path to the input file, opened if no `source`
+        supplied.
+
+      - `io.StringInput`: Optional.  Path to the file or object that produced
+        `source`.  Only used for diagnostic output.
+
+    * `destination_class` **required**: The class for dynamically created
+      destination objects.  Typically `io.FileOutput` or `io.StringOutput`.
+
+    * `destination`: Type depends on `destination_class`:
+
+      - `io.FileOutput`: Either a file-like object (must have 'write' and
+        'close' methods), or ``None`` (`destination_path` is opened).  If
+        neither `destination` nor `destination_path` are supplied,
+        `sys.stdout` is used.
+
+      - `io.StringOutput`: Not used; pass ``None``.
+
+    * `destination_path`: Type depends on `destination_class`:
+
+      - `io.FileOutput`: Path to the output file.  Opened if no `destination`
+        supplied.
+
+      - `io.StringOutput`: Path to the file or object which will receive the
+        output; optional.  Used for determining relative paths (stylesheets,
+        source links, etc.).
+
+    * `reader`: A `docutils.readers.Reader` object.
+
+    * `reader_name`: Name or alias of the Reader class to be instantiated if
+      no `reader` supplied.
+
+    * `parser`: A `docutils.parsers.Parser` object.
+
+    * `parser_name`: Name or alias of the Parser class to be instantiated if
+      no `parser` supplied.
+
+    * `writer`: A `docutils.writers.Writer` object.
+
+    * `writer_name`: Name or alias of the Writer class to be instantiated if
+      no `writer` supplied.
+
+    * `settings`: A runtime settings (`docutils.frontend.Values`) object, for
+      dotted-attribute access to runtime settings.  It's the end result of the
+      `SettingsSpec`, config file, and option processing.  If `settings` is
+      passed, it's assumed to be complete and no further setting/config/option
+      processing is done.
+
+    * `settings_spec`: A `docutils.SettingsSpec` subclass or object.  Provides
+      extra application-specific settings definitions independently of
+      components.  In other words, the application becomes a component, and
+      its settings data is processed along with that of the other components.
+      Used only if no `settings` specified.
+
+    * `settings_overrides`: A dictionary containing application-specific
+      settings defaults that override the defaults of other components.
+      Used only if no `settings` specified.
+
+    * `config_section`: A string, the name of the configuration file section
+      for this application.  Overrides the ``config_section`` attribute
+      defined by `settings_spec`.  Used only if no `settings` specified.
+
+    * `enable_exit_status`: Boolean; enable exit status at end of processing?
+    """
+    pub = Publisher(reader, parser, writer, settings=settings,
+                    source_class=source_class,
+                    destination_class=destination_class)
+    pub.set_components(reader_name, parser_name, writer_name)
+    pub.process_programmatic_settings(
+        settings_spec, settings_overrides, config_section)
+    pub.set_source(source, source_path)
+    pub.set_destination(destination, destination_path)
+    output = pub.publish(enable_exit_status=enable_exit_status)
+    return output, pub
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/examples.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,96 @@
+# $Id: examples.py 4800 2006-11-12 18:02:01Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This module contains practical examples of Docutils client code.
+
+Importing this module from client code is not recommended; its contents are
+subject to change in future Docutils releases.  Instead, it is recommended
+that you copy and paste the parts you need into your own code, modifying as
+necessary.
+"""
+
+from docutils import core, io
+
+
+def html_parts(input_string, source_path=None, destination_path=None,
+               input_encoding='unicode', doctitle=1, initial_header_level=1):
+    """
+    Given an input string, returns a dictionary of HTML document parts.
+
+    Dictionary keys are the names of parts, and values are Unicode strings;
+    encoding is up to the client.
+
+    Parameters:
+
+    - `input_string`: A multi-line text string; required.
+    - `source_path`: Path to the source file or object.  Optional, but useful
+      for diagnostic output (system messages).
+    - `destination_path`: Path to the file or object which will receive the
+      output; optional.  Used for determining relative paths (stylesheets,
+      source links, etc.).
+    - `input_encoding`: The encoding of `input_string`.  If it is an encoded
+      8-bit string, provide the correct encoding.  If it is a Unicode string,
+      use "unicode", the default.
+    - `doctitle`: Disable the promotion of a lone top-level section title to
+      document title (and subsequent section title to document subtitle
+      promotion); enabled by default.
+    - `initial_header_level`: The initial level for header elements (e.g. 1
+      for "<h1>").
+    """
+    overrides = {'input_encoding': input_encoding,
+                 'doctitle_xform': doctitle,
+                 'initial_header_level': initial_header_level}
+    parts = core.publish_parts(
+        source=input_string, source_path=source_path,
+        destination_path=destination_path,
+        writer_name='html', settings_overrides=overrides)
+    return parts
+
+def html_body(input_string, source_path=None, destination_path=None,
+              input_encoding='unicode', output_encoding='unicode',
+              doctitle=1, initial_header_level=1):
+    """
+    Given an input string, returns an HTML fragment as a string.
+
+    The return value is the contents of the <body> element.
+
+    Parameters (see `html_parts()` for the remainder):
+
+    - `output_encoding`: The desired encoding of the output.  If a Unicode
+      string is desired, use the default value of "unicode" .
+    """
+    parts = html_parts(
+        input_string=input_string, source_path=source_path,
+        destination_path=destination_path,
+        input_encoding=input_encoding, doctitle=doctitle,
+        initial_header_level=initial_header_level)
+    fragment = parts['html_body']
+    if output_encoding != 'unicode':
+        fragment = fragment.encode(output_encoding)
+    return fragment
+
+def internals(input_string, source_path=None, destination_path=None,
+              input_encoding='unicode', settings_overrides=None):
+    """
+    Return the document tree and publisher, for exploring Docutils internals.
+
+    Parameters: see `html_parts()`.
+    """
+    if settings_overrides:
+        overrides = settings_overrides.copy()
+    else:
+        overrides = {}
+    overrides['input_encoding'] = input_encoding
+    output, pub = core.publish_programmatically(
+        source_class=io.StringInput, source=input_string,
+        source_path=source_path,
+        destination_class=io.NullOutput, destination=None,
+        destination_path=destination_path,
+        reader=None, reader_name='standalone',
+        parser=None, parser_name='restructuredtext',
+        writer=None, writer_name='null',
+        settings=None, settings_spec=None, settings_overrides=overrides,
+        config_section=None, enable_exit_status=None)
+    return pub.writer.document, pub
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/frontend.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,756 @@
+# $Id: frontend.py 4913 2007-02-12 04:05:20Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Command-line and common processing for Docutils front-end tools.
+
+Exports the following classes:
+
+* `OptionParser`: Standard Docutils command-line processing.
+* `Option`: Customized version of `optparse.Option`; validation support.
+* `Values`: Runtime settings; objects are simple structs
+  (``object.attribute``).  Supports cumulative list settings (attributes).
+* `ConfigParser`: Standard Docutils config file processing.
+
+Also exports the following functions:
+
+* Option callbacks: `store_multiple`, `read_config_file`.
+* Setting validators: `validate_encoding`,
+  `validate_encoding_error_handler`,
+  `validate_encoding_and_error_handler`, `validate_boolean`,
+  `validate_threshold`, `validate_colon_separated_string_list`,
+  `validate_dependency_file`.
+* `make_paths_absolute`.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import os
+import os.path
+import sys
+import types
+import warnings
+import ConfigParser as CP
+import codecs
+import docutils
+import docutils.utils
+import docutils.nodes
+try:
+    import optparse
+    from optparse import SUPPRESS_HELP
+except ImportError:
+    import optik as optparse
+    from optik import SUPPRESS_HELP
+
+
+def store_multiple(option, opt, value, parser, *args, **kwargs):
+    """
+    Store multiple values in `parser.values`.  (Option callback.)
+
+    Store `None` for each attribute named in `args`, and store the value for
+    each key (attribute name) in `kwargs`.
+    """
+    for attribute in args:
+        setattr(parser.values, attribute, None)
+    for key, value in kwargs.items():
+        setattr(parser.values, key, value)
+
+def read_config_file(option, opt, value, parser):
+    """
+    Read a configuration file during option processing.  (Option callback.)
+    """
+    try:
+        new_settings = parser.get_config_file_settings(value)
+    except ValueError, error:
+        parser.error(error)
+    parser.values.update(new_settings, parser)
+
+def validate_encoding(setting, value, option_parser,
+                      config_parser=None, config_section=None):
+    try:
+        codecs.lookup(value)
+    except LookupError:
+        raise (LookupError('setting "%s": unknown encoding: "%s"'
+                           % (setting, value)),
+               None, sys.exc_info()[2])
+    return value
+
+def validate_encoding_error_handler(setting, value, option_parser,
+                                    config_parser=None, config_section=None):
+    try:
+        codecs.lookup_error(value)
+    except AttributeError:              # prior to Python 2.3
+        if value not in ('strict', 'ignore', 'replace', 'xmlcharrefreplace'):
+            raise (LookupError(
+                'unknown encoding error handler: "%s" (choices: '
+                '"strict", "ignore", "replace", or "xmlcharrefreplace")' % value),
+                   None, sys.exc_info()[2])
+    except LookupError:
+        raise (LookupError(
+            'unknown encoding error handler: "%s" (choices: '
+            '"strict", "ignore", "replace", "backslashreplace", '
+            '"xmlcharrefreplace", and possibly others; see documentation for '
+            'the Python ``codecs`` module)' % value),
+               None, sys.exc_info()[2])
+    return value
+
+def validate_encoding_and_error_handler(
+    setting, value, option_parser, config_parser=None, config_section=None):
+    """
+    Side-effect: if an error handler is included in the value, it is inserted
+    into the appropriate place as if it was a separate setting/option.
+    """
+    if ':' in value:
+        encoding, handler = value.split(':')
+        validate_encoding_error_handler(
+            setting + '_error_handler', handler, option_parser,
+            config_parser, config_section)
+        if config_parser:
+            config_parser.set(config_section, setting + '_error_handler',
+                              handler)
+        else:
+            setattr(option_parser.values, setting + '_error_handler', handler)
+    else:
+        encoding = value
+    validate_encoding(setting, encoding, option_parser,
+                      config_parser, config_section)
+    return encoding
+
+def validate_boolean(setting, value, option_parser,
+                     config_parser=None, config_section=None):
+    if isinstance(value, types.UnicodeType):
+        try:
+            return option_parser.booleans[value.strip().lower()]
+        except KeyError:
+            raise (LookupError('unknown boolean value: "%s"' % value),
+                   None, sys.exc_info()[2])
+    return value
+
+def validate_nonnegative_int(setting, value, option_parser,
+                             config_parser=None, config_section=None):
+    value = int(value)
+    if value < 0:
+        raise ValueError('negative value; must be positive or zero')
+    return value
+
+def validate_threshold(setting, value, option_parser,
+                       config_parser=None, config_section=None):
+    try:
+        return int(value)
+    except ValueError:
+        try:
+            return option_parser.thresholds[value.lower()]
+        except (KeyError, AttributeError):
+            raise (LookupError('unknown threshold: %r.' % value),
+                   None, sys.exc_info[2])
+
+def validate_colon_separated_string_list(
+    setting, value, option_parser, config_parser=None, config_section=None):
+    if isinstance(value, types.UnicodeType):
+        value = value.split(':')
+    else:
+        last = value.pop()
+        value.extend(last.split(':'))
+    return value
+
+def validate_url_trailing_slash(
+    setting, value, option_parser, config_parser=None, config_section=None):
+    if not value:
+        return './'
+    elif value.endswith('/'):
+        return value
+    else:
+        return value + '/'
+
+def validate_dependency_file(setting, value, option_parser,
+                             config_parser=None, config_section=None):
+    try:
+        return docutils.utils.DependencyList(value)
+    except IOError:
+        return docutils.utils.DependencyList(None)
+
+def validate_strip_class(setting, value, option_parser,
+                         config_parser=None, config_section=None):
+    if config_parser:                   # validate all values
+        class_values = value
+    else:                               # just validate the latest value
+        class_values = [value[-1]]
+    for class_value in class_values:
+        normalized = docutils.nodes.make_id(class_value)
+        if class_value != normalized:
+            raise ValueError('invalid class value %r (perhaps %r?)'
+                             % (class_value, normalized))
+    return value
+
+def make_paths_absolute(pathdict, keys, base_path=None):
+    """
+    Interpret filesystem path settings relative to the `base_path` given.
+
+    Paths are values in `pathdict` whose keys are in `keys`.  Get `keys` from
+    `OptionParser.relative_path_settings`.
+    """
+    if base_path is None:
+        base_path = os.getcwd()
+    for key in keys:
+        if pathdict.has_key(key):
+            value = pathdict[key]
+            if isinstance(value, types.ListType):
+                value = [make_one_path_absolute(base_path, path)
+                         for path in value]
+            elif value:
+                value = make_one_path_absolute(base_path, value)
+            pathdict[key] = value
+
+def make_one_path_absolute(base_path, path):
+    return os.path.abspath(os.path.join(base_path, path))
+
+
+class Values(optparse.Values):
+
+    """
+    Updates list attributes by extension rather than by replacement.
+    Works in conjunction with the `OptionParser.lists` instance attribute.
+    """
+
+    def __init__(self, *args, **kwargs):
+        optparse.Values.__init__(self, *args, **kwargs)
+        if (not hasattr(self, 'record_dependencies')
+            or self.record_dependencies is None):
+            # Set up dependency list, in case it is needed.
+            self.record_dependencies = docutils.utils.DependencyList()
+
+    def update(self, other_dict, option_parser):
+        if isinstance(other_dict, Values):
+            other_dict = other_dict.__dict__
+        other_dict = other_dict.copy()
+        for setting in option_parser.lists.keys():
+            if (hasattr(self, setting) and other_dict.has_key(setting)):
+                value = getattr(self, setting)
+                if value:
+                    value += other_dict[setting]
+                    del other_dict[setting]
+        self._update_loose(other_dict)
+
+    def copy(self):
+        """Return a shallow copy of `self`."""
+        return self.__class__(defaults=self.__dict__)
+
+
+class Option(optparse.Option):
+
+    ATTRS = optparse.Option.ATTRS + ['validator', 'overrides']
+
+    def process(self, opt, value, values, parser):
+        """
+        Call the validator function on applicable settings and
+        evaluate the 'overrides' option.
+        Extends `optparse.Option.process`.
+        """
+        result = optparse.Option.process(self, opt, value, values, parser)
+        setting = self.dest
+        if setting:
+            if self.validator:
+                value = getattr(values, setting)
+                try:
+                    new_value = self.validator(setting, value, parser)
+                except Exception, error:
+                    raise (optparse.OptionValueError(
+                        'Error in option "%s":\n    %s: %s'
+                        % (opt, error.__class__.__name__, error)),
+                           None, sys.exc_info()[2])
+                setattr(values, setting, new_value)
+            if self.overrides:
+                setattr(values, self.overrides, None)
+        return result
+
+
+class OptionParser(optparse.OptionParser, docutils.SettingsSpec):
+
+    """
+    Parser for command-line and library use.  The `settings_spec`
+    specification here and in other Docutils components are merged to build
+    the set of command-line options and runtime settings for this process.
+
+    Common settings (defined below) and component-specific settings must not
+    conflict.  Short options are reserved for common settings, and components
+    are restrict to using long options.
+    """
+
+    standard_config_files = [
+        '/etc/docutils.conf',           # system-wide
+        './docutils.conf',              # project-specific
+        '~/.docutils']                  # user-specific
+    """Docutils configuration files, using ConfigParser syntax.  Filenames
+    will be tilde-expanded later.  Later files override earlier ones."""
+
+    threshold_choices = 'info 1 warning 2 error 3 severe 4 none 5'.split()
+    """Possible inputs for for --report and --halt threshold values."""
+
+    thresholds = {'info': 1, 'warning': 2, 'error': 3, 'severe': 4, 'none': 5}
+    """Lookup table for --report and --halt threshold values."""
+
+    booleans={'1': 1, 'on': 1, 'yes': 1, 'true': 1,
+              '0': 0, 'off': 0, 'no': 0, 'false': 0, '': 0}
+    """Lookup table for boolean configuration file settings."""
+
+    if hasattr(codecs, 'backslashreplace_errors'):
+        default_error_encoding_error_handler = 'backslashreplace'
+    else:
+        default_error_encoding_error_handler = 'replace'
+
+    settings_spec = (
+        'General Docutils Options',
+        None,
+        (('Specify the document title as metadata.',
+          ['--title'], {}),
+         ('Include a "Generated by Docutils" credit and link.',
+          ['--generator', '-g'], {'action': 'store_true',
+                                  'validator': validate_boolean}),
+         ('Do not include a generator credit.',
+          ['--no-generator'], {'action': 'store_false', 'dest': 'generator'}),
+         ('Include the date at the end of the document (UTC).',
+          ['--date', '-d'], {'action': 'store_const', 'const': '%Y-%m-%d',
+                             'dest': 'datestamp'}),
+         ('Include the time & date (UTC).',
+          ['--time', '-t'], {'action': 'store_const',
+                             'const': '%Y-%m-%d %H:%M UTC',
+                             'dest': 'datestamp'}),
+         ('Do not include a datestamp of any kind.',
+          ['--no-datestamp'], {'action': 'store_const', 'const': None,
+                               'dest': 'datestamp'}),
+         ('Include a "View document source" link.',
+          ['--source-link', '-s'], {'action': 'store_true',
+                                    'validator': validate_boolean}),
+         ('Use <URL> for a source link; implies --source-link.',
+          ['--source-url'], {'metavar': '<URL>'}),
+         ('Do not include a "View document source" link.',
+          ['--no-source-link'],
+          {'action': 'callback', 'callback': store_multiple,
+           'callback_args': ('source_link', 'source_url')}),
+         ('Link from section headers to TOC entries.  (default)',
+          ['--toc-entry-backlinks'],
+          {'dest': 'toc_backlinks', 'action': 'store_const', 'const': 'entry',
+           'default': 'entry'}),
+         ('Link from section headers to the top of the TOC.',
+          ['--toc-top-backlinks'],
+          {'dest': 'toc_backlinks', 'action': 'store_const', 'const': 'top'}),
+         ('Disable backlinks to the table of contents.',
+          ['--no-toc-backlinks'],
+          {'dest': 'toc_backlinks', 'action': 'store_false'}),
+         ('Link from footnotes/citations to references. (default)',
+          ['--footnote-backlinks'],
+          {'action': 'store_true', 'default': 1,
+           'validator': validate_boolean}),
+         ('Disable backlinks from footnotes and citations.',
+          ['--no-footnote-backlinks'],
+          {'dest': 'footnote_backlinks', 'action': 'store_false'}),
+         ('Enable section numbering.  (default)',
+          ['--section-numbering'],
+          {'action': 'store_true', 'dest': 'sectnum_xform',
+           'default': 1, 'validator': validate_boolean}),
+         ('Disable section numbering.',
+          ['--no-section-numbering'],
+          {'action': 'store_false', 'dest': 'sectnum_xform'}),
+         ('Remove comment elements from the document tree.',
+          ['--strip-comments'],
+          {'action': 'store_true', 'validator': validate_boolean}),
+         ('Leave comment elements in the document tree. (default)',
+          ['--leave-comments'],
+          {'action': 'store_false', 'dest': 'strip_comments'}),
+         ('Remove all elements with classes="<class>" from the document tree. '
+          '(Multiple-use option.)',
+          ['--strip-elements-with-class'],
+          {'action': 'append', 'dest': 'strip_elements_with_classes',
+           'metavar': '<class>', 'validator': validate_strip_class}),
+         ('Remove all classes="<class>" attributes from elements in the '
+          'document tree. (Multiple-use option.)',
+          ['--strip-class'],
+          {'action': 'append', 'dest': 'strip_classes',
+           'metavar': '<class>', 'validator': validate_strip_class}),
+         ('Report system messages at or higher than <level>: "info" or "1", '
+          '"warning"/"2" (default), "error"/"3", "severe"/"4", "none"/"5"',
+          ['--report', '-r'], {'choices': threshold_choices, 'default': 2,
+                               'dest': 'report_level', 'metavar': '<level>',
+                               'validator': validate_threshold}),
+         ('Report all system messages.  (Same as "--report=1".)',
+          ['--verbose', '-v'], {'action': 'store_const', 'const': 1,
+                                'dest': 'report_level'}),
+         ('Report no system messages.  (Same as "--report=5".)',
+          ['--quiet', '-q'], {'action': 'store_const', 'const': 5,
+                              'dest': 'report_level'}),
+         ('Halt execution at system messages at or above <level>.  '
+          'Levels as in --report.  Default: 4 (severe).',
+          ['--halt'], {'choices': threshold_choices, 'dest': 'halt_level',
+                       'default': 4, 'metavar': '<level>',
+                       'validator': validate_threshold}),
+         ('Halt at the slightest problem.  Same as "--halt=info".',
+          ['--strict'], {'action': 'store_const', 'const': 'info',
+                         'dest': 'halt_level'}),
+         ('Enable a non-zero exit status for non-halting system messages at '
+          'or above <level>.  Default: 5 (disabled).',
+          ['--exit-status'], {'choices': threshold_choices,
+                              'dest': 'exit_status_level',
+                              'default': 5, 'metavar': '<level>',
+                              'validator': validate_threshold}),
+         ('Enable debug-level system messages and diagnostics.',
+          ['--debug'], {'action': 'store_true', 'validator': validate_boolean}),
+         ('Disable debug output.  (default)',
+          ['--no-debug'], {'action': 'store_false', 'dest': 'debug'}),
+         ('Send the output of system messages to <file>.',
+          ['--warnings'], {'dest': 'warning_stream', 'metavar': '<file>'}),
+         ('Enable Python tracebacks when Docutils is halted.',
+          ['--traceback'], {'action': 'store_true', 'default': None,
+                            'validator': validate_boolean}),
+         ('Disable Python tracebacks.  (default)',
+          ['--no-traceback'], {'dest': 'traceback', 'action': 'store_false'}),
+         ('Specify the encoding and optionally the '
+          'error handler of input text.  Default: <locale-dependent>:strict.',
+          ['--input-encoding', '-i'],
+          {'metavar': '<name[:handler]>',
+           'validator': validate_encoding_and_error_handler}),
+         ('Specify the error handler for undecodable characters.  '
+          'Choices: "strict" (default), "ignore", and "replace".',
+          ['--input-encoding-error-handler'],
+          {'default': 'strict', 'validator': validate_encoding_error_handler}),
+         ('Specify the text encoding and optionally the error handler for '
+          'output.  Default: UTF-8:strict.',
+          ['--output-encoding', '-o'],
+          {'metavar': '<name[:handler]>', 'default': 'utf-8',
+           'validator': validate_encoding_and_error_handler}),
+         ('Specify error handler for unencodable output characters; '
+          '"strict" (default), "ignore", "replace", '
+          '"xmlcharrefreplace", "backslashreplace" (Python 2.3+).',
+          ['--output-encoding-error-handler'],
+          {'default': 'strict', 'validator': validate_encoding_error_handler}),
+         ('Specify text encoding and error handler for error output.  '
+          'Default: ASCII:%s.'
+          % default_error_encoding_error_handler,
+          ['--error-encoding', '-e'],
+          {'metavar': '<name[:handler]>', 'default': 'ascii',
+           'validator': validate_encoding_and_error_handler}),
+         ('Specify the error handler for unencodable characters in '
+          'error output.  Default: %s.'
+          % default_error_encoding_error_handler,
+          ['--error-encoding-error-handler'],
+          {'default': default_error_encoding_error_handler,
+           'validator': validate_encoding_error_handler}),
+         ('Specify the language (as 2-letter code).  Default: en.',
+          ['--language', '-l'], {'dest': 'language_code', 'default': 'en',
+                                 'metavar': '<name>'}),
+         ('Write output file dependencies to <file>.',
+          ['--record-dependencies'],
+          {'metavar': '<file>', 'validator': validate_dependency_file,
+           'default': None}),           # default set in Values class
+         ('Read configuration settings from <file>, if it exists.',
+          ['--config'], {'metavar': '<file>', 'type': 'string',
+                         'action': 'callback', 'callback': read_config_file}),
+         ("Show this program's version number and exit.",
+          ['--version', '-V'], {'action': 'version'}),
+         ('Show this help message and exit.',
+          ['--help', '-h'], {'action': 'help'}),
+         # Typically not useful for non-programmatical use:
+         (SUPPRESS_HELP, ['--id-prefix'], {'default': ''}),
+         (SUPPRESS_HELP, ['--auto-id-prefix'], {'default': 'id'}),
+         # Hidden options, for development use only:
+         (SUPPRESS_HELP, ['--dump-settings'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--dump-internals'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--dump-transforms'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--dump-pseudo-xml'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--expose-internal-attribute'],
+          {'action': 'append', 'dest': 'expose_internals',
+           'validator': validate_colon_separated_string_list}),
+         (SUPPRESS_HELP, ['--strict-visitor'], {'action': 'store_true'}),
+         ))
+    """Runtime settings and command-line options common to all Docutils front
+    ends.  Setting specs specific to individual Docutils components are also
+    used (see `populate_from_components()`)."""
+
+    settings_defaults = {'_disable_config': None,
+                         '_source': None,
+                         '_destination': None,
+                         '_config_files': None}
+    """Defaults for settings that don't have command-line option equivalents."""
+
+    relative_path_settings = ('warning_stream',)
+
+    config_section = 'general'
+
+    version_template = ('%%prog (Docutils %s [%s])'
+                        % (docutils.__version__, docutils.__version_details__))
+    """Default version message."""
+
+    def __init__(self, components=(), defaults=None, read_config_files=None,
+                 *args, **kwargs):
+        """
+        `components` is a list of Docutils components each containing a
+        ``.settings_spec`` attribute.  `defaults` is a mapping of setting
+        default overrides.
+        """
+
+        self.lists = {}
+        """Set of list-type settings."""
+
+        self.config_files = []
+        """List of paths of applied configuration files."""
+
+        optparse.OptionParser.__init__(
+            self, option_class=Option, add_help_option=None,
+            formatter=optparse.TitledHelpFormatter(width=78),
+            *args, **kwargs)
+        if not self.version:
+            self.version = self.version_template
+        # Make an instance copy (it will be modified):
+        self.relative_path_settings = list(self.relative_path_settings)
+        self.components = (self,) + tuple(components)
+        self.populate_from_components(self.components)
+        self.set_defaults_from_dict(defaults or {})
+        if read_config_files and not self.defaults['_disable_config']:
+            try:
+                config_settings = self.get_standard_config_settings()
+            except ValueError, error:
+                self.error(error)
+            self.set_defaults_from_dict(config_settings.__dict__)
+
+    def populate_from_components(self, components):
+        """
+        For each component, first populate from the `SettingsSpec.settings_spec`
+        structure, then from the `SettingsSpec.settings_defaults` dictionary.
+        After all components have been processed, check for and populate from
+        each component's `SettingsSpec.settings_default_overrides` dictionary.
+        """
+        for component in components:
+            if component is None:
+                continue
+            settings_spec = component.settings_spec
+            self.relative_path_settings.extend(
+                component.relative_path_settings)
+            for i in range(0, len(settings_spec), 3):
+                title, description, option_spec = settings_spec[i:i+3]
+                if title:
+                    group = optparse.OptionGroup(self, title, description)
+                    self.add_option_group(group)
+                else:
+                    group = self        # single options
+                for (help_text, option_strings, kwargs) in option_spec:
+                    option = group.add_option(help=help_text, *option_strings,
+                                              **kwargs)
+                    if kwargs.get('action') == 'append':
+                        self.lists[option.dest] = 1
+                if component.settings_defaults:
+                    self.defaults.update(component.settings_defaults)
+        for component in components:
+            if component and component.settings_default_overrides:
+                self.defaults.update(component.settings_default_overrides)
+
+    def get_standard_config_files(self):
+        """Return list of config files, from environment or standard."""
+        try:
+            config_files = os.environ['DOCUTILSCONFIG'].split(os.pathsep)
+        except KeyError:
+            config_files = self.standard_config_files
+
+        # If 'HOME' is not set, expandvars() requires the 'pwd' module which is
+        # not available under certain environments, for example, within
+        # mod_python.  The publisher ends up in here, and we need to publish
+        # from within mod_python.  Therefore we need to avoid expanding when we
+        # are in those environments.
+        expand = os.path.expanduser
+        if 'HOME' not in os.environ:
+            try:
+                import pwd
+            except ImportError:
+                expand = lambda x: x
+        return [expand(f) for f in config_files if f.strip()]
+
+    def get_standard_config_settings(self):
+        settings = Values()
+        for filename in self.get_standard_config_files():
+            settings.update(self.get_config_file_settings(filename), self)
+        return settings
+
+    def get_config_file_settings(self, config_file):
+        """Returns a dictionary containing appropriate config file settings."""
+        parser = ConfigParser()
+        parser.read(config_file, self)
+        self.config_files.extend(parser._files)
+        base_path = os.path.dirname(config_file)
+        applied = {}
+        settings = Values()
+        for component in self.components:
+            if not component:
+                continue
+            for section in (tuple(component.config_section_dependencies or ())
+                            + (component.config_section,)):
+                if applied.has_key(section):
+                    continue
+                applied[section] = 1
+                settings.update(parser.get_section(section), self)
+        make_paths_absolute(
+            settings.__dict__, self.relative_path_settings, base_path)
+        return settings.__dict__
+
+    def check_values(self, values, args):
+        """Store positional arguments as runtime settings."""
+        values._source, values._destination = self.check_args(args)
+        make_paths_absolute(values.__dict__, self.relative_path_settings,
+                            os.getcwd())
+        values._config_files = self.config_files
+        return values
+
+    def check_args(self, args):
+        source = destination = None
+        if args:
+            source = args.pop(0)
+            if source == '-':           # means stdin
+                source = None
+        if args:
+            destination = args.pop(0)
+            if destination == '-':      # means stdout
+                destination = None
+        if args:
+            self.error('Maximum 2 arguments allowed.')
+        if source and source == destination:
+            self.error('Do not specify the same file for both source and '
+                       'destination.  It will clobber the source file.')
+        return source, destination
+
+    def set_defaults_from_dict(self, defaults):
+        self.defaults.update(defaults)
+
+    def get_default_values(self):
+        """Needed to get custom `Values` instances."""
+        defaults = Values(self.defaults)
+        defaults._config_files = self.config_files
+        return defaults
+
+    def get_option_by_dest(self, dest):
+        """
+        Get an option by its dest.
+
+        If you're supplying a dest which is shared by several options,
+        it is undefined which option of those is returned.
+
+        A KeyError is raised if there is no option with the supplied
+        dest.
+        """
+        for group in self.option_groups + [self]:
+            for option in group.option_list:
+                if option.dest == dest:
+                    return option
+        raise KeyError('No option with dest == %r.' % dest)
+
+
+class ConfigParser(CP.ConfigParser):
+
+    old_settings = {
+        'pep_stylesheet': ('pep_html writer', 'stylesheet'),
+        'pep_stylesheet_path': ('pep_html writer', 'stylesheet_path'),
+        'pep_template': ('pep_html writer', 'template')}
+    """{old setting: (new section, new setting)} mapping, used by
+    `handle_old_config`, to convert settings from the old [options] section."""
+
+    old_warning = """
+The "[option]" section is deprecated.  Support for old-format configuration
+files may be removed in a future Docutils release.  Please revise your
+configuration files.  See <http://docutils.sf.net/docs/user/config.html>,
+section "Old-Format Configuration Files".
+"""
+
+    not_utf8_error = """\
+Unable to read configuration file "%s": content not encoded as UTF-8.
+Skipping "%s" configuration file.
+"""
+
+    def __init__(self, *args, **kwargs):
+        CP.ConfigParser.__init__(self, *args, **kwargs)
+
+        self._files = []
+        """List of paths of configuration files read."""
+
+    def read(self, filenames, option_parser):
+        if type(filenames) in (types.StringType, types.UnicodeType):
+            filenames = [filenames]
+        for filename in filenames:
+            try:
+                # Config files must be UTF-8-encoded:
+                fp = codecs.open(filename, 'r', 'utf-8')
+            except IOError:
+                continue
+            try:
+                CP.ConfigParser.readfp(self, fp, filename)
+            except UnicodeDecodeError:
+                sys.stderr.write(self.not_utf8_error % (filename, filename))
+                fp.close()
+                continue
+            fp.close()
+            self._files.append(filename)
+            if self.has_section('options'):
+                self.handle_old_config(filename)
+            self.validate_settings(filename, option_parser)
+
+    def handle_old_config(self, filename):
+        warnings.warn_explicit(self.old_warning, ConfigDeprecationWarning,
+                               filename, 0)
+        options = self.get_section('options')
+        if not self.has_section('general'):
+            self.add_section('general')
+        for key, value in options.items():
+            if self.old_settings.has_key(key):
+                section, setting = self.old_settings[key]
+                if not self.has_section(section):
+                    self.add_section(section)
+            else:
+                section = 'general'
+                setting = key
+            if not self.has_option(section, setting):
+                self.set(section, setting, value)
+        self.remove_section('options')
+
+    def validate_settings(self, filename, option_parser):
+        """
+        Call the validator function and implement overrides on all applicable
+        settings.
+        """
+        for section in self.sections():
+            for setting in self.options(section):
+                try:
+                    option = option_parser.get_option_by_dest(setting)
+                except KeyError:
+                    continue
+                if option.validator:
+                    value = self.get(section, setting, raw=1)
+                    try:
+                        new_value = option.validator(
+                            setting, value, option_parser,
+                            config_parser=self, config_section=section)
+                    except Exception, error:
+                        raise (ValueError(
+                            'Error in config file "%s", section "[%s]":\n'
+                            '    %s: %s\n        %s = %s'
+                            % (filename, section, error.__class__.__name__,
+                               error, setting, value)), None, sys.exc_info()[2])
+                    self.set(section, setting, new_value)
+                if option.overrides:
+                    self.set(section, option.overrides, None)
+
+    def optionxform(self, optionstr):
+        """
+        Transform '-' to '_' so the cmdline form of option names can be used.
+        """
+        return optionstr.lower().replace('-', '_')
+
+    def get_section(self, section):
+        """
+        Return a given section as a dictionary (empty if the section
+        doesn't exist).
+        """
+        section_dict = {}
+        if self.has_section(section):
+            for option in self.options(section):
+                section_dict[option] = self.get(section, option, raw=1)
+        return section_dict
+
+
+class ConfigDeprecationWarning(DeprecationWarning):
+    """Warning for deprecated configuration file features."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/io.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,412 @@
+# $Id: io.py 4750 2006-09-16 21:32:29Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+I/O classes provide a uniform API for low-level input and output.  Subclasses
+will exist for a variety of input/output mechanisms.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+try:
+    import locale
+except:
+    pass
+import re
+from types import UnicodeType
+from docutils import TransformSpec
+
+
+class Input(TransformSpec):
+
+    """
+    Abstract base class for input wrappers.
+    """
+
+    component_type = 'input'
+
+    default_source_path = None
+
+    def __init__(self, source=None, source_path=None, encoding=None,
+                 error_handler='strict'):
+        self.encoding = encoding
+        """Text encoding for the input source."""
+
+        self.error_handler = error_handler
+        """Text decoding error handler."""
+
+        self.source = source
+        """The source of input data."""
+
+        self.source_path = source_path
+        """A text reference to the source."""
+
+        if not source_path:
+            self.source_path = self.default_source_path
+
+        self.successful_encoding = None
+        """The encoding that successfully decoded the source data."""
+
+    def __repr__(self):
+        return '%s: source=%r, source_path=%r' % (self.__class__, self.source,
+                                                  self.source_path)
+
+    def read(self):
+        raise NotImplementedError
+
+    def decode(self, data):
+        """
+        Decode a string, `data`, heuristically.
+        Raise UnicodeError if unsuccessful.
+
+        The client application should call ``locale.setlocale`` at the
+        beginning of processing::
+
+            locale.setlocale(locale.LC_ALL, '')
+        """
+        if self.encoding and self.encoding.lower() == 'unicode':
+            assert isinstance(data, UnicodeType), (
+                'input encoding is "unicode" '
+                'but input is not a unicode object')
+        if isinstance(data, UnicodeType):
+            # Accept unicode even if self.encoding != 'unicode'.
+            return data
+        if self.encoding:
+            # We believe the user/application when the encoding is
+            # explicitly given.
+            encodings = [self.encoding]
+        else:
+            data_encoding = self.determine_encoding_from_data(data)
+            if data_encoding:
+                # If the data declares its encoding (explicitly or via a BOM),
+                # we believe it.
+                encodings = [data_encoding]
+            else:
+                # Apply heuristics only if no encoding is explicitly given and
+                # no BOM found.  Start with UTF-8, because that only matches
+                # data that *IS* UTF-8:
+                encodings = ['utf-8']
+                try:
+                    # for Python 2.2 compatibility
+                    encodings.append(locale.nl_langinfo(locale.CODESET))
+                except:
+                    pass
+                try:
+                    encodings.append(locale.getlocale()[1])
+                except:
+                    pass
+                try:
+                    encodings.append(locale.getdefaultlocale()[1])
+                except:
+                    pass
+                # fallback encoding:
+                encodings.append('latin-1')
+        error = None
+        error_details = ''
+        for enc in encodings:
+            if not enc:
+                continue
+            try:
+                decoded = unicode(data, enc, self.error_handler)
+                self.successful_encoding = enc
+                # Return decoded, removing BOMs.
+                return decoded.replace(u'\ufeff', u'')
+            except (UnicodeError, LookupError), error:
+                pass
+        if error is not None:
+            error_details = '\n(%s: %s)' % (error.__class__.__name__, error)
+        raise UnicodeError(
+            'Unable to decode input data.  Tried the following encodings: '
+            '%s.%s'
+            % (', '.join([repr(enc) for enc in encodings if enc]),
+               error_details))
+
+    coding_slug = re.compile("coding[:=]\s*([-\w.]+)")
+    """Encoding declaration pattern."""
+
+    byte_order_marks = (('\xef\xbb\xbf', 'utf-8'),
+                        ('\xfe\xff', 'utf-16-be'),
+                        ('\xff\xfe', 'utf-16-le'),)
+    """Sequence of (start_bytes, encoding) tuples to for encoding detection.
+    The first bytes of input data are checked against the start_bytes strings.
+    A match indicates the given encoding."""
+
+    def determine_encoding_from_data(self, data):
+        """
+        Try to determine the encoding of `data` by looking *in* `data`.
+        Check for a byte order mark (BOM) or an encoding declaration.
+        """
+        # check for a byte order mark:
+        for start_bytes, encoding in self.byte_order_marks:
+            if data.startswith(start_bytes):
+                return encoding
+        # check for an encoding declaration pattern in first 2 lines of file:
+        for line in data.splitlines()[:2]:
+            match = self.coding_slug.search(line)
+            if match:
+                return match.group(1)
+        return None
+
+
+class Output(TransformSpec):
+
+    """
+    Abstract base class for output wrappers.
+    """
+
+    component_type = 'output'
+
+    default_destination_path = None
+
+    def __init__(self, destination=None, destination_path=None,
+                 encoding=None, error_handler='strict'):
+        self.encoding = encoding
+        """Text encoding for the output destination."""
+
+        self.error_handler = error_handler or 'strict'
+        """Text encoding error handler."""
+
+        self.destination = destination
+        """The destination for output data."""
+
+        self.destination_path = destination_path
+        """A text reference to the destination."""
+
+        if not destination_path:
+            self.destination_path = self.default_destination_path
+
+    def __repr__(self):
+        return ('%s: destination=%r, destination_path=%r'
+                % (self.__class__, self.destination, self.destination_path))
+
+    def write(self, data):
+        """`data` is a Unicode string, to be encoded by `self.encode`."""
+        raise NotImplementedError
+
+    def encode(self, data):
+        if self.encoding and self.encoding.lower() == 'unicode':
+            assert isinstance(data, UnicodeType), (
+                'the encoding given is "unicode" but the output is not '
+                'a Unicode string')
+            return data
+        if not isinstance(data, UnicodeType):
+            # Non-unicode (e.g. binary) output.
+            return data
+        else:
+            try:
+                return data.encode(self.encoding, self.error_handler)
+            except (LookupError, ValueError):
+                # LookupError is raised if there are unencodable chars
+                # in data and the error_handler isn't found. In old
+                # Python versions, ValueError is raised.
+                if self.error_handler == 'xmlcharrefreplace':
+                    # We are using xmlcharrefreplace with a Python
+                    # version that doesn't support it (2.1, 2.2, or
+                    # IronPython 1.0) so we emulate its behavior.
+                    return ''.join([self.xmlcharref_encode(char)
+                                    for char in data])
+                else:
+                    raise
+
+    def xmlcharref_encode(self, char):
+        """Emulate Python 2.3's 'xmlcharrefreplace' encoding error handler."""
+        try:
+            return char.encode(self.encoding, 'strict')
+        except UnicodeError:
+            return '&#%i;' % ord(char)
+
+
+class FileInput(Input):
+
+    """
+    Input for single, simple file-like objects.
+    """
+
+    def __init__(self, source=None, source_path=None,
+                 encoding=None, error_handler='strict',
+                 autoclose=1, handle_io_errors=1):
+        """
+        :Parameters:
+            - `source`: either a file-like object (which is read directly), or
+              `None` (which implies `sys.stdin` if no `source_path` given).
+            - `source_path`: a path to a file, which is opened and then read.
+            - `encoding`: the expected text encoding of the input file.
+            - `error_handler`: the encoding error handler to use.
+            - `autoclose`: close automatically after read (boolean); always
+              false if `sys.stdin` is the source.
+            - `handle_io_errors`: summarize I/O errors here, and exit?
+        """
+        Input.__init__(self, source, source_path, encoding, error_handler)
+        self.autoclose = autoclose
+        self.handle_io_errors = handle_io_errors
+        if source is None:
+            if source_path:
+                try:
+                    self.source = open(source_path)
+                except IOError, error:
+                    if not handle_io_errors:
+                        raise
+                    print >>sys.stderr, '%s: %s' % (error.__class__.__name__,
+                                                    error)
+                    print >>sys.stderr, (
+                        'Unable to open source file for reading (%r).  Exiting.'
+                        % source_path)
+                    sys.exit(1)
+            else:
+                self.source = sys.stdin
+                self.autoclose = None
+        if not source_path:
+            try:
+                self.source_path = self.source.name
+            except AttributeError:
+                pass
+
+    def read(self):
+        """
+        Read and decode a single file and return the data (Unicode string).
+        """
+        try:
+            data = self.source.read()
+        finally:
+            if self.autoclose:
+                self.close()
+        return self.decode(data)
+
+    def close(self):
+        self.source.close()
+
+
+class FileOutput(Output):
+
+    """
+    Output for single, simple file-like objects.
+    """
+
+    def __init__(self, destination=None, destination_path=None,
+                 encoding=None, error_handler='strict', autoclose=1,
+                 handle_io_errors=1):
+        """
+        :Parameters:
+            - `destination`: either a file-like object (which is written
+              directly) or `None` (which implies `sys.stdout` if no
+              `destination_path` given).
+            - `destination_path`: a path to a file, which is opened and then
+              written.
+            - `autoclose`: close automatically after write (boolean); always
+              false if `sys.stdout` is the destination.
+        """
+        Output.__init__(self, destination, destination_path,
+                        encoding, error_handler)
+        self.opened = 1
+        self.autoclose = autoclose
+        self.handle_io_errors = handle_io_errors
+        if destination is None:
+            if destination_path:
+                self.opened = None
+            else:
+                self.destination = sys.stdout
+                self.autoclose = None
+        if not destination_path:
+            try:
+                self.destination_path = self.destination.name
+            except AttributeError:
+                pass
+
+    def open(self):
+        try:
+            self.destination = open(self.destination_path, 'w')
+        except IOError, error:
+            if not self.handle_io_errors:
+                raise
+            print >>sys.stderr, '%s: %s' % (error.__class__.__name__,
+                                            error)
+            print >>sys.stderr, ('Unable to open destination file for writing '
+                                 '(%r).  Exiting.' % self.destination_path)
+            sys.exit(1)
+        self.opened = 1
+
+    def write(self, data):
+        """Encode `data`, write it to a single file, and return it."""
+        output = self.encode(data)
+        if not self.opened:
+            self.open()
+        try:
+            self.destination.write(output)
+        finally:
+            if self.autoclose:
+                self.close()
+        return output
+
+    def close(self):
+        self.destination.close()
+        self.opened = None
+
+
+class StringInput(Input):
+
+    """
+    Direct string input.
+    """
+
+    default_source_path = '<string>'
+
+    def read(self):
+        """Decode and return the source string."""
+        return self.decode(self.source)
+
+
+class StringOutput(Output):
+
+    """
+    Direct string output.
+    """
+
+    default_destination_path = '<string>'
+
+    def write(self, data):
+        """Encode `data`, store it in `self.destination`, and return it."""
+        self.destination = self.encode(data)
+        return self.destination
+
+
+class NullInput(Input):
+
+    """
+    Degenerate input: read nothing.
+    """
+
+    default_source_path = 'null input'
+
+    def read(self):
+        """Return a null string."""
+        return u''
+
+
+class NullOutput(Output):
+
+    """
+    Degenerate output: write nothing.
+    """
+
+    default_destination_path = 'null output'
+
+    def write(self, data):
+        """Do nothing ([don't even] send data to the bit bucket)."""
+        pass
+
+
+class DocTreeInput(Input):
+
+    """
+    Adapter for document tree input.
+
+    The document tree must be passed in the ``source`` parameter.
+    """
+
+    default_source_path = 'doctree input'
+
+    def read(self):
+        """Return the document tree."""
+        return self.source
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,21 @@
+# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# Internationalization details are documented in
+# <http://docutils.sf.net/docs/howto/i18n.html>.
+
+"""
+This package contains modules for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+_languages = {}
+
+def get_language(language_code):
+    if _languages.has_key(language_code):
+        return _languages[language_code]
+    module = __import__(language_code, globals(), locals())
+    _languages[language_code] = module
+    return module
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/af.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,58 @@
+# $Id: af.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Jannie Hofmeyr <jhsh@sun.ac.za>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Afrikaans-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': 'Auteur',
+      'authors': 'Auteurs',
+      'organization': 'Organisasie',
+      'address': 'Adres',
+      'contact': 'Kontak',
+      'version': 'Weergawe',
+      'revision': 'Revisie',
+      'status': 'Status',
+      'date': 'Datum',
+      'copyright': 'Kopiereg',
+      'dedication': 'Opdrag',
+      'abstract': 'Opsomming',
+      'attention': 'Aandag!',
+      'caution': 'Wees versigtig!',
+      'danger': '!GEVAAR!',
+      'error': 'Fout',
+      'hint': 'Wenk',
+      'important': 'Belangrik',
+      'note': 'Nota',
+      'tip': 'Tip', # hint and tip both have the same translation: wenk
+      'warning': 'Waarskuwing',
+      'contents': 'Inhoud'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      'auteur': 'author',
+      'auteurs': 'authors',
+      'organisasie': 'organization',
+      'adres': 'address',
+      'kontak': 'contact',
+      'weergawe': 'version',
+      'revisie': 'revision',
+      'status': 'status',
+      'datum': 'date',
+      'kopiereg': 'copyright',
+      'opdrag': 'dedication',
+      'opsomming': 'abstract'}
+"""Afrikaans (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/ca.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,60 @@
+# $Id: ca.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Ivan Vilata i Balaguer <ivan@selidor.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Catalan-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Autors',
+      'organization': u'Organitzaci\u00F3',
+      'address': u'Adre\u00E7a',
+      'contact': u'Contacte',
+      'version': u'Versi\u00F3',
+      'revision': u'Revisi\u00F3',
+      'status': u'Estat',
+      'date': u'Data',
+      'copyright': u'Copyright',
+      'dedication': u'Dedicat\u00F2ria',
+      'abstract': u'Resum',
+      'attention': u'Atenci\u00F3!',
+      'caution': u'Compte!',
+      'danger': u'PERILL!',
+      'error': u'Error',
+      'hint': u'Suggeriment',
+      'important': u'Important',
+      'note': u'Nota',
+      'tip': u'Consell',
+      'warning': u'Av\u00EDs',
+      'contents': u'Contingut'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'autors': 'authors',
+      u'organitzaci\u00F3': 'organization',
+      u'adre\u00E7a': 'address',
+      u'contacte': 'contact',
+      u'versi\u00F3': 'version',
+      u'revisi\u00F3': 'revision',
+      u'estat': 'status',
+      u'data': 'date',
+      u'copyright': 'copyright',
+      u'dedicat\u00F2ria': 'dedication',
+      u'resum': 'abstract'}
+"""Catalan (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/cs.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,60 @@
+# $Id: cs.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marek Blaha <mb@dat.cz>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Czech-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Auto\u0159i',
+      'organization': u'Organizace',
+      'address': u'Adresa',
+      'contact': u'Kontakt',
+      'version': u'Verze',
+      'revision': u'Revize',
+      'status': u'Stav',
+      'date': u'Datum',
+      'copyright': u'Copyright',
+      'dedication': u'V\u011Bnov\u00E1n\u00ED',
+      'abstract': u'Abstrakt',
+      'attention': u'Pozor!',
+      'caution': u'Opatrn\u011B!',
+      'danger': u'!NEBEZPE\u010C\u00CD!',
+      'error': u'Chyba',
+      'hint': u'Rada',
+      'important': u'D\u016Fle\u017Eit\u00E9',
+      'note': u'Pozn\u00E1mka',
+      'tip': u'Tip',
+      'warning': u'Varov\u00E1n\u00ED',
+      'contents': u'Obsah'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'auto\u0159i': 'authors',
+      u'organizace': 'organization',
+      u'adresa': 'address',
+      u'kontakt': 'contact',
+      u'verze': 'version',
+      u'revize': 'revision',
+      u'stav': 'status',
+      u'datum': 'date',
+      u'copyright': 'copyright',
+      u'v\u011Bnov\u00E1n\u00ED': 'dedication',
+      u'abstrakt': 'abstract'}
+"""Czech (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/de.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,58 @@
+# $Id: de.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Gunnar Schwant <g.schwant@gmx.de>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+German language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+    'author': 'Autor',
+    'authors': 'Autoren',
+    'organization': 'Organisation',
+    'address': 'Adresse',
+    'contact': 'Kontakt',
+    'version': 'Version',
+    'revision': 'Revision',
+    'status': 'Status',
+    'date': 'Datum',
+    'dedication': 'Widmung',
+    'copyright': 'Copyright',
+    'abstract': 'Zusammenfassung',
+    'attention': 'Achtung!',
+    'caution': 'Vorsicht!',
+    'danger': '!GEFAHR!',
+    'error': 'Fehler',
+    'hint': 'Hinweis',
+    'important': 'Wichtig',
+    'note': 'Bemerkung',
+    'tip': 'Tipp',
+    'warning': 'Warnung',
+    'contents': 'Inhalt'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+    'autor': 'author',
+    'autoren': 'authors',
+    'organisation': 'organization',
+    'adresse': 'address',
+    'kontakt': 'contact',
+    'version': 'version',
+    'revision': 'revision',
+    'status': 'status',
+    'datum': 'date',
+    'copyright': 'copyright',
+    'widmung': 'dedication',
+    'zusammenfassung': 'abstract'}
+"""German (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/en.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,60 @@
+# $Id: en.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+English-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': 'Author',
+      'authors': 'Authors',
+      'organization': 'Organization',
+      'address': 'Address',
+      'contact': 'Contact',
+      'version': 'Version',
+      'revision': 'Revision',
+      'status': 'Status',
+      'date': 'Date',
+      'copyright': 'Copyright',
+      'dedication': 'Dedication',
+      'abstract': 'Abstract',
+      'attention': 'Attention!',
+      'caution': 'Caution!',
+      'danger': '!DANGER!',
+      'error': 'Error',
+      'hint': 'Hint',
+      'important': 'Important',
+      'note': 'Note',
+      'tip': 'Tip',
+      'warning': 'Warning',
+      'contents': 'Contents'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'author': 'author',
+      'authors': 'authors',
+      'organization': 'organization',
+      'address': 'address',
+      'contact': 'contact',
+      'version': 'version',
+      'revision': 'revision',
+      'status': 'status',
+      'date': 'date',
+      'copyright': 'copyright',
+      'dedication': 'dedication',
+      'abstract': 'abstract'}
+"""English (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/eo.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,61 @@
+# $Id: eo.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marcelo Huerta San Martin <richieadler@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Esperanto-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'A\u016dtoro',
+      'authors': u'A\u016dtoroj',
+      'organization': u'Organizo',
+      'address': u'Adreso',
+      'contact': u'Kontakto',
+      'version': u'Versio',
+      'revision': u'Revido',
+      'status': u'Stato',
+      'date': u'Dato',
+      # 'copyright': u'Kopirajto',
+      'copyright': u'A\u016dtorrajto',
+      'dedication': u'Dedi\u0109o',
+      'abstract': u'Resumo',
+      'attention': u'Atentu!',
+      'caution': u'Zorgu!',
+      'danger': u'DAN\u011cERO!',
+      'error': u'Eraro',
+      'hint': u'Spuro',
+      'important': u'Grava',
+      'note': u'Noto',
+      'tip': u'Helpeto',
+      'warning': u'Averto',
+      'contents': u'Enhavo'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'a\u016dtoro': 'author',
+      'a\u016dtoroj': 'authors',
+      'organizo': 'organization',
+      'adreso': 'address',
+      'kontakto': 'contact',
+      'versio': 'version',
+      'revido': 'revision',
+      'stato': 'status',
+      'dato': 'date',
+      'a\u016dtorrajto': 'copyright',
+      'dedi\u0109o': 'dedication',
+      'resumo': 'abstract'}
+"""Esperanto (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/es.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+# $Id: es.py 4572 2006-05-25 20:48:37Z richieadler $
+# Author: Marcelo Huerta San Martín <richieadler@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Spanish-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': u'Autor',
+      'authors': u'Autores',
+      'organization': u'Organizaci\u00f3n',
+      'address': u'Direcci\u00f3n',
+      'contact': u'Contacto',
+      'version': u'Versi\u00f3n',
+      'revision': u'Revisi\u00f3n',
+      'status': u'Estado',
+      'date': u'Fecha',
+      'copyright': u'Copyright',
+      'dedication': u'Dedicatoria',
+      'abstract': u'Resumen',
+      'attention': u'\u00a1Atenci\u00f3n!',
+      'caution': u'\u00a1Precauci\u00f3n!',
+      'danger': u'\u00a1PELIGRO!',
+      'error': u'Error',
+      'hint': u'Sugerencia',
+      'important': u'Importante',
+      'note': u'Nota',
+      'tip': u'Consejo',
+      'warning': u'Advertencia',
+      'contents': u'Contenido'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'autor': 'author',
+      u'autores': 'authors',
+      u'organizaci\u00f3n': 'organization',
+      u'direcci\u00f3n': 'address',
+      u'contacto': 'contact',
+      u'versi\u00f3n': 'version',
+      u'revisi\u00f3n': 'revision',
+      u'estado': 'status',
+      u'fecha': 'date',
+      u'copyright': 'copyright',
+      u'dedicatoria': 'dedication',
+      u'resumen': 'abstract'}
+"""Spanish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/fi.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,60 @@
+# $Id: fi.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Asko Soukka <asko.soukka@iki.fi>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Finnish-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      u'author': u'Tekij\u00e4',
+      u'authors': u'Tekij\u00e4t',
+      u'organization': u'Yhteis\u00f6',
+      u'address': u'Osoite',
+      u'contact': u'Yhteystiedot',
+      u'version': u'Versio',
+      u'revision': u'Vedos',
+      u'status': u'Tila',
+      u'date': u'P\u00e4iv\u00e4ys',
+      u'copyright': u'Tekij\u00e4noikeudet',
+      u'dedication': u'Omistuskirjoitus',
+      u'abstract': u'Tiivistelm\u00e4',
+      u'attention': u'Huomio!',
+      u'caution': u'Varo!',
+      u'danger': u'!VAARA!',
+      u'error': u'Virhe',
+      u'hint': u'Vihje',
+      u'important': u'T\u00e4rke\u00e4\u00e4',
+      u'note': u'Huomautus',
+      u'tip': u'Neuvo',
+      u'warning': u'Varoitus',
+      u'contents': u'Sis\u00e4llys'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'tekij\u00e4': u'author',
+      u'tekij\u00e4t': u'authors',
+      u'yhteis\u00f6': u'organization',
+      u'osoite': u'address',
+      u'yhteystiedot': u'contact',
+      u'versio': u'version',
+      u'vedos': u'revision',
+      u'tila': u'status',
+      u'p\u00e4iv\u00e4ys': u'date',
+      u'tekij\u00e4noikeudet': u'copyright',
+      u'omistuskirjoitus': u'dedication',
+      u'tiivistelm\u00e4': u'abstract'}
+"""Finnish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/fr.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,58 @@
+# $Id: fr.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Stefane Fermigier <sf@fermigier.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+French-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      u'author': u'Auteur',
+      u'authors': u'Auteurs',
+      u'organization': u'Organisation',
+      u'address': u'Adresse',
+      u'contact': u'Contact',
+      u'version': u'Version',
+      u'revision': u'R\u00e9vision',
+      u'status': u'Statut',
+      u'date': u'Date',
+      u'copyright': u'Copyright',
+      u'dedication': u'D\u00e9dicace',
+      u'abstract': u'R\u00e9sum\u00e9',
+      u'attention': u'Attention!',
+      u'caution': u'Avertissement!',
+      u'danger': u'!DANGER!',
+      u'error': u'Erreur',
+      u'hint': u'Indication',
+      u'important': u'Important',
+      u'note': u'Note',
+      u'tip': u'Astuce',
+      u'warning': u'Avis',
+      u'contents': u'Sommaire'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'auteur': u'author',
+      u'auteurs': u'authors',
+      u'organisation': u'organization',
+      u'adresse': u'address',
+      u'contact': u'contact',
+      u'version': u'version',
+      u'r\u00e9vision': u'revision',
+      u'statut': u'status',
+      u'date': u'date',
+      u'copyright': u'copyright',
+      u'd\u00e9dicace': u'dedication',
+      u'r\u00e9sum\u00e9': u'abstract'}
+"""French (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/he.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,60 @@
+# Author: Meir Kriheli
+# Id: $Id: he.py 4837 2006-12-26 09:59:41Z sfcben $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Hebrew-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'\u05de\u05d7\u05d1\u05e8',
+      'authors': u'\u05de\u05d7\u05d1\u05e8\u05d9',
+      'organization': u'\u05d0\u05e8\u05d2\u05d5\u05df',
+      'address': u'\u05db\u05ea\u05d5\u05d1\u05ea',
+      'contact':  u'\u05d0\u05d9\u05e9 \u05e7\u05e9\u05e8',
+      'version': u'\u05d2\u05e8\u05e1\u05d4',
+      'revision': u'\u05de\u05d4\u05d3\u05d5\u05e8\u05d4',
+      'status': u'\u05e1\u05d8\u05d8\u05d5\u05e1',
+      'date': u'\u05ea\u05d0\u05e8\u05d9\u05da',
+      'copyright': u'\u05d6\u05db\u05d5\u05d9\u05d5\u05ea \u05e9\u05de\u05d5\u05e8\u05d5\u05ea',
+      'dedication': u'\u05d4\u05e7\u05d3\u05e9\u05d4',
+      'abstract': u'\u05ea\u05e7\u05e6\u05d9\u05e8',
+      'attention': u'\u05ea\u05e9\u05d5\u05de\u05ea \u05dc\u05d1',
+      'caution': u'\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea',
+      'danger': u'\u05e1\u05db\u05e0\u05d4',
+      'error': u'\u05e9\u05d2\u05d9\u05d0\u05d4' ,
+      'hint': u'\u05e8\u05de\u05d6',
+      'important': u'\u05d7\u05e9\u05d5\u05d1',
+      'note': u'\u05d4\u05e2\u05e8\u05d4',
+      'tip': u'\u05d8\u05d9\u05e4',
+      'warning': u'\u05d0\u05d6\u05d4\u05e8\u05d4',
+      'contents': u'\u05ea\u05d5\u05db\u05df'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'\u05de\u05d7\u05d1\u05e8': 'author',
+      u'\u05de\u05d7\u05d1\u05e8\u05d9': 'authors',
+      u'\u05d0\u05e8\u05d2\u05d5\u05df': 'organization',
+      u'\u05db\u05ea\u05d5\u05d1\u05ea': 'address',
+      u'\u05d0\u05d9\u05e9 \u05e7\u05e9\u05e8': 'contact',
+      u'\u05d2\u05e8\u05e1\u05d4': 'version',
+      u'\u05de\u05d4\u05d3\u05d5\u05e8\u05d4': 'revision',
+      u'\u05e1\u05d8\u05d8\u05d5\u05e1': 'status',
+      u'\u05ea\u05d0\u05e8\u05d9\u05da': 'date',
+      u'\u05d6\u05db\u05d5\u05d9\u05d5\u05ea \u05e9\u05de\u05d5\u05e8\u05d5\u05ea': 'copyright',
+      u'\u05d4\u05e7\u05d3\u05e9\u05d4': 'dedication',
+      u'\u05ea\u05e7\u05e6\u05d9\u05e8': 'abstract'}
+"""Hebrew to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/it.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,58 @@
+# $Id: it.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Nicola Larosa <docutils@tekNico.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Italian-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': 'Autore',
+      'authors': 'Autori',
+      'organization': 'Organizzazione',
+      'address': 'Indirizzo',
+      'contact': 'Contatti',
+      'version': 'Versione',
+      'revision': 'Revisione',
+      'status': 'Status',
+      'date': 'Data',
+      'copyright': 'Copyright',
+      'dedication': 'Dedica',
+      'abstract': 'Riassunto',
+      'attention': 'Attenzione!',
+      'caution': 'Cautela!',
+      'danger': '!PERICOLO!',
+      'error': 'Errore',
+      'hint': 'Suggerimento',
+      'important': 'Importante',
+      'note': 'Nota',
+      'tip': 'Consiglio',
+      'warning': 'Avvertenza',
+      'contents': 'Indice'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      'autore': 'author',
+      'autori': 'authors',
+      'organizzazione': 'organization',
+      'indirizzo': 'address',
+      'contatto': 'contact',
+      'versione': 'version',
+      'revisione': 'revision',
+      'status': 'status',
+      'data': 'date',
+      'copyright': 'copyright',
+      'dedica': 'dedication',
+      'riassunto': 'abstract'}
+"""Italian (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/ja.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+# $Id: ja.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Hisashi Morita <hisashim@kt.rim.or.jp>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Japanese-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'著者',
+      'authors': u'著者',
+      'organization': u'組織',
+      'address': u'ä½æ‰€',
+      'contact': u'連絡先',
+      'version': u'ãƒãƒ¼ã‚¸ãƒ§ãƒ³',
+      'revision': u'リビジョン',
+      'status': u'ステータス',
+      'date': u'日付',
+      'copyright': u'著作権',
+      'dedication': u'献辞',
+      'abstract': u'概è¦',
+      'attention': u'注目!',
+      'caution': u'注æ„!',
+      'danger': u'!å±é™º!',
+      'error': u'エラー',
+      'hint': u'ヒント',
+      'important': u'é‡è¦',
+      'note': u'備考',
+      'tip': u'通報',
+      'warning': u'警告',
+      'contents': u'目次'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'著者': 'author',
+      u' n/a': 'authors',
+      u'組織': 'organization',
+      u'ä½æ‰€': 'address',
+      u'連絡先': 'contact',
+      u'ãƒãƒ¼ã‚¸ãƒ§ãƒ³': 'version',
+      u'リビジョン': 'revision',
+      u'ステータス': 'status',
+      u'日付': 'date',
+      u'著作権': 'copyright',
+      u'献辞': 'dedication',
+      u'概è¦': 'abstract'}
+"""Japanese (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/nl.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,60 @@
+# $Id: nl.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Martijn Pieters <mjpieters@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Dutch-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': 'Auteur',
+      'authors': 'Auteurs',
+      'organization': 'Organisatie',
+      'address': 'Adres',
+      'contact': 'Contact',
+      'version': 'Versie',
+      'revision': 'Revisie',
+      'status': 'Status',
+      'date': 'Datum',
+      'copyright': 'Copyright',
+      'dedication': 'Toewijding',
+      'abstract': 'Samenvatting',
+      'attention': 'Attentie!',
+      'caution': 'Let op!',
+      'danger': '!GEVAAR!',
+      'error': 'Fout',
+      'hint': 'Hint',
+      'important': 'Belangrijk',
+      'note': 'Opmerking',
+      'tip': 'Tip',
+      'warning': 'Waarschuwing',
+      'contents': 'Inhoud'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'auteur': 'author',
+      'auteurs': 'authors',
+      'organisatie': 'organization',
+      'adres': 'address',
+      'contact': 'contact',
+      'versie': 'version',
+      'revisie': 'revision',
+      'status': 'status',
+      'datum': 'date',
+      'copyright': 'copyright',
+      'toewijding': 'dedication',
+      'samenvatting': 'abstract'}
+"""Dutch (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/pt_br.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,60 @@
+# $Id: pt_br.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Brazilian Portuguese-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Autores',
+      'organization': u'Organiza\u00E7\u00E3o',
+      'address': u'Endere\u00E7o',
+      'contact': u'Contato',
+      'version': u'Vers\u00E3o',
+      'revision': u'Revis\u00E3o',
+      'status': u'Estado',
+      'date': u'Data',
+      'copyright': u'Copyright',
+      'dedication': u'Dedicat\u00F3ria',
+      'abstract': u'Resumo',
+      'attention': u'Atten\u00E7\u00E3o!',
+      'caution': u'Cuidado!',
+      'danger': u'PERIGO!',
+      'error': u'Erro',
+      'hint': u'Sugest\u00E3o',
+      'important': u'Importante',
+      'note': u'Nota',
+      'tip': u'Dica',
+      'warning': u'Aviso',
+      'contents': u'Sum\u00E1rio'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'autores': 'authors',
+      u'organiza\u00E7\u00E3o': 'organization',
+      u'endere\u00E7o': 'address',
+      u'contato': 'contact',
+      u'vers\u00E3o': 'version',
+      u'revis\u00E3o': 'revision',
+      u'estado': 'status',
+      u'data': 'date',
+      u'copyright': 'copyright',
+      u'dedicat\u00F3ria': 'dedication',
+      u'resumo': 'abstract'}
+"""Brazilian Portuguese (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/ru.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,66 @@
+# $Id: ru.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Roman Suzi <rnd@onego.ru>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Russian-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      u'abstract': u'\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f',
+      u'address': u'\u0410\u0434\u0440\u0435\u0441',
+      u'attention': u'\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435!',
+      u'author': u'\u0410\u0432\u0442\u043e\u0440',
+      u'authors': u'\u0410\u0432\u0442\u043e\u0440\u044b',
+      u'caution': u'\u041e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e!',
+      u'contact': u'\u041a\u043e\u043d\u0442\u0430\u043a\u0442',
+      u'contents':
+      u'\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435',
+      u'copyright': u'\u041f\u0440\u0430\u0432\u0430 '
+      u'\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f',
+      u'danger': u'\u041e\u041f\u0410\u0421\u041d\u041e!',
+      u'date': u'\u0414\u0430\u0442\u0430',
+      u'dedication':
+      u'\u041f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0438\u0435',
+      u'error': u'\u041e\u0448\u0438\u0431\u043a\u0430',
+      u'hint': u'\u0421\u043e\u0432\u0435\u0442',
+      u'important': u'\u0412\u0430\u0436\u043d\u043e',
+      u'note': u'\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435',
+      u'organization':
+      u'\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f',
+      u'revision': u'\u0420\u0435\u0434\u0430\u043a\u0446\u0438\u044f',
+      u'status': u'\u0421\u0442\u0430\u0442\u0443\u0441',
+      u'tip': u'\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430',
+      u'version': u'\u0412\u0435\u0440\u0441\u0438\u044f',
+      u'warning': u'\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436'
+      u'\u0434\u0435\u043d\u0438\u0435'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f': u'abstract',
+      u'\u0430\u0434\u0440\u0435\u0441': u'address',
+      u'\u0430\u0432\u0442\u043e\u0440': u'author',
+      u'\u0430\u0432\u0442\u043e\u0440\u044b': u'authors',
+      u'\u043a\u043e\u043d\u0442\u0430\u043a\u0442': u'contact',
+      u'\u043f\u0440\u0430\u0432\u0430 \u043a\u043e\u043f\u0438\u0440\u043e'
+      u'\u0432\u0430\u043d\u0438\u044f': u'copyright',
+      u'\u0434\u0430\u0442\u0430': u'date',
+      u'\u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0438\u0435':
+      u'dedication',
+      u'\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f':
+      u'organization',
+      u'\u0440\u0435\u0434\u0430\u043a\u0446\u0438\u044f': u'revision',
+      u'\u0441\u0442\u0430\u0442\u0443\u0441': u'status',
+      u'\u0432\u0435\u0440\u0441\u0438\u044f': u'version'}
+"""Russian (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators =  [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/sk.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,58 @@
+# $Id: sk.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Miroslav Vasko <zemiak@zoznam.sk>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Slovak-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': u'Autor',
+      'authors': u'Autori',
+      'organization': u'Organiz\u00E1cia',
+      'address': u'Adresa',
+      'contact': u'Kontakt',
+      'version': u'Verzia',
+      'revision': u'Rev\u00EDzia',
+      'status': u'Stav',
+      'date': u'D\u00E1tum',
+      'copyright': u'Copyright',
+      'dedication': u'Venovanie',
+      'abstract': u'Abstraktne',
+      'attention': u'Pozor!',
+      'caution': u'Opatrne!',
+      'danger': u'!NEBEZPE\u010cENSTVO!',
+      'error': u'Chyba',
+      'hint': u'Rada',
+      'important': u'D\u00F4le\u017Eit\u00E9',
+      'note': u'Pozn\u00E1mka',
+      'tip': u'Tip',
+      'warning': u'Varovanie',
+      'contents': u'Obsah'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'autor': 'author',
+      u'autori': 'authors',
+      u'organiz\u00E1cia': 'organization',
+      u'adresa': 'address',
+      u'kontakt': 'contact',
+      u'verzia': 'version',
+      u'rev\u00EDzia': 'revision',
+      u'stav': 'status',
+      u'd\u00E1tum': 'date',
+      u'copyright': 'copyright',
+      u'venovanie': 'dedication',
+      u'abstraktne': 'abstract'}
+"""Slovak (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/sv.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,59 @@
+# $Id: sv.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Adam Chodorowski <chodorowski@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Swedish language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+    'author':       u'F\u00f6rfattare',
+    'authors':      u'F\u00f6rfattare',
+    'organization': u'Organisation',
+    'address':      u'Adress',
+    'contact':      u'Kontakt',
+    'version':      u'Version',
+    'revision':     u'Revision',
+    'status':       u'Status',
+    'date':         u'Datum',
+    'copyright':    u'Copyright',
+    'dedication':   u'Dedikation',
+    'abstract':     u'Sammanfattning',
+    'attention':    u'Observera!',
+    'caution':      u'Varning!',
+    'danger':       u'FARA!',
+    'error':        u'Fel',
+    'hint':         u'V\u00e4gledning',
+    'important':    u'Viktigt',
+    'note':         u'Notera',
+    'tip':          u'Tips',
+    'warning':      u'Varning',
+    'contents':     u'Inneh\u00e5ll' }
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+    # 'Author' and 'Authors' identical in Swedish; assume the plural:
+    u'f\u00f6rfattare': 'authors',
+    u' n/a':            'author',
+    u'organisation':    'organization',
+    u'adress':          'address',
+    u'kontakt':         'contact',
+    u'version':         'version',
+    u'revision':        'revision',
+    u'status':          'status',
+    u'datum':           'date',
+    u'copyright':       'copyright',
+    u'dedikation':      'dedication', 
+    u'sammanfattning':  'abstract' }
+"""Swedish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/zh_cn.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+# $Id: zh_cn.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Pan Junyong <panjy@zopechina.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Simplified Chinese language mappings for language-dependent features
+of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'作者',
+      'authors': u'作者群',
+      'organization': u'组织',
+      'address': u'地å€',
+      'contact': u'è”ç³»',
+      'version': u'版本',
+      'revision': u'修订',
+      'status': u'状æ€',
+      'date': u'日期',
+      'copyright': u'版æƒ',
+      'dedication': u'献辞',
+      'abstract': u'摘è¦',
+      'attention': u'注æ„',
+      'caution': u'å°å¿ƒ',
+      'danger': u'å±é™©',
+      'error': u'错误',
+      'hint': u'æ示',
+      'important': u'é‡è¦',
+      'note': u'注解',
+      'tip': u'技巧',
+      'warning': u'警告',
+      'contents': u'目录',
+} 
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'作者': 'author',
+      u'作者群': 'authors',
+      u'组织': 'organization',
+      u'地å€': 'address',
+      u'è”ç³»': 'contact',
+      u'版本': 'version',
+      u'修订': 'revision',
+      u'状æ€': 'status',
+      u'时间': 'date',
+      u'版æƒ': 'copyright',
+      u'献辞': 'dedication',
+      u'摘è¦': 'abstract'}
+"""Simplified Chinese to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',',
+                     u'\uff1b', # 'ï¼›'
+                     u'\uff0c', # ','
+                     u'\u3001', # 'ã€'
+                    ]
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/languages/zh_tw.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+# $Id: zh_tw.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Joe YS Jaw <joeysj@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Traditional Chinese language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'\u4f5c\u8005', # '作者' <-- Chinese word
+      'authors': u'\u4f5c\u8005\u7fa4', # '作者群',
+      'organization': u'\u7d44\u7e54', # '組織',
+      'address': u'\u5730\u5740', # '地å€',
+      'contact': u'\u9023\u7d61', # '連絡',
+      'version': u'\u7248\u672c', # '版本',
+      'revision': u'\u4fee\u8a02', # '修訂',
+      'status': u'\u72c0\u614b', # '狀態',
+      'date': u'\u65e5\u671f', # '日期',
+      'copyright': u'\u7248\u6b0a', # '版權',
+      'dedication': u'\u984c\u737b', # 'é¡Œç»',
+      'abstract': u'\u6458\u8981', # '摘è¦',
+      'attention': u'\u6ce8\u610f\uff01', # '注æ„ï¼',
+      'caution': u'\u5c0f\u5fc3\uff01', # 'å°å¿ƒï¼',
+      'danger': u'\uff01\u5371\u96aa\uff01', # 'ï¼å±éšªï¼',
+      'error': u'\u932f\u8aa4', # '錯誤',
+      'hint': u'\u63d0\u793a', # 'æ示',
+      'important': u'\u91cd\u8981', # '注æ„ï¼',
+      'note': u'\u8a3b\u91cb', # '註釋',
+      'tip': u'\u79d8\u8a23', # '秘訣',
+      'warning': u'\u8b66\u544a', # '警告',
+      'contents': u'\u76ee\u9304' # '目錄'
+} 
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'author (translation required)': 'author',
+      'authors (translation required)': 'authors',
+      'organization (translation required)': 'organization',
+      'address (translation required)': 'address',
+      'contact (translation required)': 'contact',
+      'version (translation required)': 'version',
+      'revision (translation required)': 'revision',
+      'status (translation required)': 'status',
+      'date (translation required)': 'date',
+      'copyright (translation required)': 'copyright',
+      'dedication (translation required)': 'dedication',
+      'abstract (translation required)': 'abstract'}
+"""Traditional Chinese to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',',
+                     u'\uff1b', # 'ï¼›'
+                     u'\uff0c', # ','
+                     u'\u3001', # 'ã€'
+                    ]
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/nodes.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1801 @@
+# $Id: nodes.py 5033 2007-03-21 19:51:22Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Docutils document tree element class library.
+
+Classes in CamelCase are abstract base classes or auxiliary classes. The one
+exception is `Text`, for a text (PCDATA) node; uppercase is used to
+differentiate from element classes.  Classes in lower_case_with_underscores
+are element classes, matching the XML element generic identifiers in the DTD_.
+
+The position of each node (the level at which it can occur) is significant and
+is represented by abstract base classes (`Root`, `Structural`, `Body`,
+`Inline`, etc.).  Certain transformations will be easier because we can use
+``isinstance(node, base_class)`` to determine the position of the node in the
+hierarchy.
+
+.. _DTD: http://docutils.sourceforge.net/docs/ref/docutils.dtd
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import re
+import warnings
+from types import IntType, SliceType, StringType, UnicodeType, \
+     TupleType, ListType, ClassType, TypeType
+from UserString import UserString
+
+
+# ==============================
+#  Functional Node Base Classes
+# ==============================
+
+class Node:
+
+    """Abstract base class of nodes in a document tree."""
+
+    parent = None
+    """Back-reference to the Node immediately containing this Node."""
+
+    document = None
+    """The `document` node at the root of the tree containing this Node."""
+
+    source = None
+    """Path or description of the input source which generated this Node."""
+
+    line = None
+    """The line number (1-based) of the beginning of this Node in `source`."""
+
+    def __nonzero__(self):
+        """
+        Node instances are always true, even if they're empty.  A node is more
+        than a simple container.  Its boolean "truth" does not depend on
+        having one or more subnodes in the doctree.
+
+        Use `len()` to check node length.  Use `None` to represent a boolean
+        false value.
+        """
+        return 1
+
+    def __str__(self):
+        return self.__unicode__().encode('raw_unicode_escape')
+
+    def __unicode__(self):
+        # Override in subclass.
+        raise NotImplementedError
+
+    def asdom(self, dom=None):
+        """Return a DOM **fragment** representation of this Node."""
+        if dom is None:
+            import xml.dom.minidom as dom
+        domroot = dom.Document()
+        return self._dom_node(domroot)
+
+    def pformat(self, indent='    ', level=0):
+        """
+        Return an indented pseudo-XML representation, for test purposes.
+
+        Override in subclasses.
+        """
+        raise NotImplementedError
+
+    def copy(self):
+        """Return a copy of self."""
+        raise NotImplementedError
+
+    def deepcopy(self):
+        """Return a deep copy of self (also copying children)."""
+        raise NotImplementedError
+
+    def setup_child(self, child):
+        child.parent = self
+        if self.document:
+            child.document = self.document
+            if child.source is None:
+                child.source = self.document.current_source
+            if child.line is None:
+                child.line = self.document.current_line
+
+    def walk(self, visitor):
+        """
+        Traverse a tree of `Node` objects, calling the
+        `dispatch_visit()` method of `visitor` when entering each
+        node.  (The `walkabout()` method is similar, except it also
+        calls the `dispatch_departure()` method before exiting each
+        node.)
+
+        This tree traversal supports limited in-place tree
+        modifications.  Replacing one node with one or more nodes is
+        OK, as is removing an element.  However, if the node removed
+        or replaced occurs after the current node, the old node will
+        still be traversed, and any new nodes will not.
+
+        Within ``visit`` methods (and ``depart`` methods for
+        `walkabout()`), `TreePruningException` subclasses may be raised
+        (`SkipChildren`, `SkipSiblings`, `SkipNode`, `SkipDeparture`).
+
+        Parameter `visitor`: A `NodeVisitor` object, containing a
+        ``visit`` implementation for each `Node` subclass encountered.
+
+        Return true if we should stop the traversal.
+        """
+        stop = 0
+        visitor.document.reporter.debug(
+            'docutils.nodes.Node.walk calling dispatch_visit for %s'
+            % self.__class__.__name__)
+        try:
+            try:
+                visitor.dispatch_visit(self)
+            except (SkipChildren, SkipNode):
+                return stop
+            except SkipDeparture:           # not applicable; ignore
+                pass
+            children = self.children
+            try:
+                for child in children[:]:
+                    if child.walk(visitor):
+                        stop = 1
+                        break
+            except SkipSiblings:
+                pass
+        except StopTraversal:
+            stop = 1
+        return stop
+
+    def walkabout(self, visitor):
+        """
+        Perform a tree traversal similarly to `Node.walk()` (which
+        see), except also call the `dispatch_departure()` method
+        before exiting each node.
+
+        Parameter `visitor`: A `NodeVisitor` object, containing a
+        ``visit`` and ``depart`` implementation for each `Node`
+        subclass encountered.
+
+        Return true if we should stop the traversal.
+        """
+        call_depart = 1
+        stop = 0
+        visitor.document.reporter.debug(
+            'docutils.nodes.Node.walkabout calling dispatch_visit for %s'
+            % self.__class__.__name__)
+        try:
+            try:
+                visitor.dispatch_visit(self)
+            except SkipNode:
+                return stop
+            except SkipDeparture:
+                call_depart = 0
+            children = self.children
+            try:
+                for child in children[:]:
+                    if child.walkabout(visitor):
+                        stop = 1
+                        break
+            except SkipSiblings:
+                pass
+        except SkipChildren:
+            pass
+        except StopTraversal:
+            stop = 1
+        if call_depart:
+            visitor.document.reporter.debug(
+                'docutils.nodes.Node.walkabout calling dispatch_departure '
+                'for %s' % self.__class__.__name__)
+            visitor.dispatch_departure(self)
+        return stop
+
+    def traverse(self, condition=None,
+                 include_self=1, descend=1, siblings=0, ascend=0):
+        """
+        Return an iterable containing
+
+        * self (if include_self is true)
+        * all descendants in tree traversal order (if descend is true)
+        * all siblings (if siblings is true) and their descendants (if
+          also descend is true)
+        * the siblings of the parent (if ascend is true) and their
+          descendants (if also descend is true), and so on
+
+        If `condition` is not None, the iterable contains only nodes
+        for which ``condition(node)`` is true.  If `condition` is a
+        node class ``cls``, it is equivalent to a function consisting
+        of ``return isinstance(node, cls)``.
+
+        If ascend is true, assume siblings to be true as well.
+
+        For example, given the following tree::
+
+            <paragraph>
+                <emphasis>      <--- emphasis.traverse() and
+                    <strong>    <--- strong.traverse() are called.
+                        Foo
+                    Bar
+                <reference name="Baz" refid="baz">
+                    Baz
+
+        Then list(emphasis.traverse()) equals ::
+
+            [<emphasis>, <strong>, <#text: Foo>, <#text: Bar>]
+
+        and list(strong.traverse(ascend=1)) equals ::
+
+            [<strong>, <#text: Foo>, <#text: Bar>, <reference>, <#text: Baz>]
+        """
+        r = []
+        if ascend:
+            siblings=1
+        # Check if `condition` is a class (check for TypeType for Python
+        # implementations that use only new-style classes, like PyPy).
+        if isinstance(condition, (ClassType, TypeType)):
+            node_class = condition
+            def condition(node, node_class=node_class):
+                return isinstance(node, node_class)
+        if include_self and (condition is None or condition(self)):
+            r.append(self)
+        if descend and len(self.children):
+            for child in self:
+                r.extend(child.traverse(
+                    include_self=1, descend=1, siblings=0, ascend=0,
+                    condition=condition))
+        if siblings or ascend:
+            node = self
+            while node.parent:
+                index = node.parent.index(node)
+                for sibling in node.parent[index+1:]:
+                    r.extend(sibling.traverse(include_self=1, descend=descend,
+                                              siblings=0, ascend=0,
+                                              condition=condition))
+                if not ascend:
+                    break
+                else:
+                    node = node.parent
+        return r
+
+    def next_node(self, condition=None,
+                  include_self=0, descend=1, siblings=0, ascend=0):
+        """
+        Return the first node in the iterable returned by traverse(),
+        or None if the iterable is empty.
+
+        Parameter list is the same as of traverse.  Note that
+        include_self defaults to 0, though.
+        """
+        iterable = self.traverse(condition=condition,
+                                 include_self=include_self, descend=descend,
+                                 siblings=siblings, ascend=ascend)
+        try:
+            return iterable[0]
+        except IndexError:
+            return None
+
+class Text(Node, UserString):
+
+    """
+    Instances are terminal nodes (leaves) containing text only; no child
+    nodes or attributes.  Initialize by passing a string to the constructor.
+    Access the text itself with the `astext` method.
+    """
+
+    tagname = '#text'
+
+    children = ()
+    """Text nodes have no children, and cannot have children."""
+
+    def __init__(self, data, rawsource=''):
+        UserString.__init__(self, data)
+
+        self.rawsource = rawsource
+        """The raw text from which this element was constructed."""
+
+    def __repr__(self):
+        data = repr(self.data)
+        if len(data) > 70:
+            data = repr(self.data[:64] + ' ...')
+        return '<%s: %s>' % (self.tagname, data)
+
+    def __len__(self):
+        return len(self.data)
+
+    def shortrepr(self):
+        data = repr(self.data)
+        if len(data) > 20:
+            data = repr(self.data[:16] + ' ...')
+        return '<%s: %s>' % (self.tagname, data)
+
+    def _dom_node(self, domroot):
+        return domroot.createTextNode(self.data)
+
+    def astext(self):
+        return self.data
+
+    def __unicode__(self):
+        return self.data
+
+    def copy(self):
+        return self.__class__(self.data)
+
+    def deepcopy(self):
+        return self.copy()
+
+    def pformat(self, indent='    ', level=0):
+        result = []
+        indent = indent * level
+        for line in self.data.splitlines():
+            result.append(indent + line + '\n')
+        return ''.join(result)
+
+
+class Element(Node):
+
+    """
+    `Element` is the superclass to all specific elements.
+
+    Elements contain attributes and child nodes.  Elements emulate
+    dictionaries for attributes, indexing by attribute name (a string).  To
+    set the attribute 'att' to 'value', do::
+
+        element['att'] = 'value'
+
+    There are two special attributes: 'ids' and 'names'.  Both are
+    lists of unique identifiers, and names serve as human interfaces
+    to IDs.  Names are case- and whitespace-normalized (see the
+    fully_normalize_name() function), and IDs conform to the regular
+    expression ``[a-z](-?[a-z0-9]+)*`` (see the make_id() function).
+
+    Elements also emulate lists for child nodes (element nodes and/or text
+    nodes), indexing by integer.  To get the first child node, use::
+
+        element[0]
+
+    Elements may be constructed using the ``+=`` operator.  To add one new
+    child node to element, do::
+
+        element += node
+
+    This is equivalent to ``element.append(node)``.
+
+    To add a list of multiple child nodes at once, use the same ``+=``
+    operator::
+
+        element += [node1, node2]
+
+    This is equivalent to ``element.extend([node1, node2])``.
+    """
+
+    list_attributes = ('ids', 'classes', 'names', 'dupnames', 'backrefs')
+    """List attributes, automatically initialized to empty lists for
+    all nodes."""
+
+    tagname = None
+    """The element generic identifier. If None, it is set as an instance
+    attribute to the name of the class."""
+
+    child_text_separator = '\n\n'
+    """Separator for child nodes, used by `astext()` method."""
+
+    def __init__(self, rawsource='', *children, **attributes):
+        self.rawsource = rawsource
+        """The raw text from which this element was constructed."""
+
+        self.children = []
+        """List of child nodes (elements and/or `Text`)."""
+
+        self.extend(children)           # maintain parent info
+
+        self.attributes = {}
+        """Dictionary of attribute {name: value}."""
+
+        # Initialize list attributes.
+        for att in self.list_attributes:
+            self.attributes[att] = []
+
+        for att, value in attributes.items():
+            att = att.lower()
+            if att in self.list_attributes:
+                # mutable list; make a copy for this node
+                self.attributes[att] = value[:]
+            else:
+                self.attributes[att] = value
+
+        if self.tagname is None:
+            self.tagname = self.__class__.__name__
+
+    def _dom_node(self, domroot):
+        element = domroot.createElement(self.tagname)
+        for attribute, value in self.attlist():
+            if isinstance(value, ListType):
+                value = ' '.join([serial_escape('%s' % v) for v in value])
+            element.setAttribute(attribute, '%s' % value)
+        for child in self.children:
+            element.appendChild(child._dom_node(domroot))
+        return element
+
+    def __repr__(self):
+        data = ''
+        for c in self.children:
+            data += c.shortrepr()
+            if len(data) > 60:
+                data = data[:56] + ' ...'
+                break
+        if self['names']:
+            return '<%s "%s": %s>' % (self.__class__.__name__,
+                                      '; '.join(self['names']), data)
+        else:
+            return '<%s: %s>' % (self.__class__.__name__, data)
+
+    def shortrepr(self):
+        if self['names']:
+            return '<%s "%s"...>' % (self.__class__.__name__,
+                                     '; '.join(self['names']))
+        else:
+            return '<%s...>' % self.tagname
+
+    def __unicode__(self):
+        if self.children:
+            return u'%s%s%s' % (self.starttag(),
+                                ''.join([unicode(c) for c in self.children]),
+                                self.endtag())
+        else:
+            return self.emptytag()
+
+    def starttag(self):
+        parts = [self.tagname]
+        for name, value in self.attlist():
+            if value is None:           # boolean attribute
+                parts.append(name)
+            elif isinstance(value, ListType):
+                values = [serial_escape('%s' % v) for v in value]
+                parts.append('%s="%s"' % (name, ' '.join(values)))
+            else:
+                parts.append('%s="%s"' % (name, value))
+        return '<%s>' % ' '.join(parts)
+
+    def endtag(self):
+        return '</%s>' % self.tagname
+
+    def emptytag(self):
+        return u'<%s/>' % ' '.join([self.tagname] +
+                                    ['%s="%s"' % (n, v)
+                                     for n, v in self.attlist()])
+
+    def __len__(self):
+        return len(self.children)
+
+    def __getitem__(self, key):
+        if isinstance(key, UnicodeType) or isinstance(key, StringType):
+            return self.attributes[key]
+        elif isinstance(key, IntType):
+            return self.children[key]
+        elif isinstance(key, SliceType):
+            assert key.step in (None, 1), 'cannot handle slice with stride'
+            return self.children[key.start:key.stop]
+        else:
+            raise TypeError, ('element index must be an integer, a slice, or '
+                              'an attribute name string')
+
+    def __setitem__(self, key, item):
+        if isinstance(key, UnicodeType) or isinstance(key, StringType):
+            self.attributes[str(key)] = item
+        elif isinstance(key, IntType):
+            self.setup_child(item)
+            self.children[key] = item
+        elif isinstance(key, SliceType):
+            assert key.step in (None, 1), 'cannot handle slice with stride'
+            for node in item:
+                self.setup_child(node)
+            self.children[key.start:key.stop] = item
+        else:
+            raise TypeError, ('element index must be an integer, a slice, or '
+                              'an attribute name string')
+
+    def __delitem__(self, key):
+        if isinstance(key, UnicodeType) or isinstance(key, StringType):
+            del self.attributes[key]
+        elif isinstance(key, IntType):
+            del self.children[key]
+        elif isinstance(key, SliceType):
+            assert key.step in (None, 1), 'cannot handle slice with stride'
+            del self.children[key.start:key.stop]
+        else:
+            raise TypeError, ('element index must be an integer, a simple '
+                              'slice, or an attribute name string')
+
+    def __add__(self, other):
+        return self.children + other
+
+    def __radd__(self, other):
+        return other + self.children
+
+    def __iadd__(self, other):
+        """Append a node or a list of nodes to `self.children`."""
+        if isinstance(other, Node):
+            self.append(other)
+        elif other is not None:
+            self.extend(other)
+        return self
+
+    def astext(self):
+        return self.child_text_separator.join(
+              [child.astext() for child in self.children])
+
+    def non_default_attributes(self):
+        atts = {}
+        for key, value in self.attributes.items():
+            if self.is_not_default(key):
+                atts[key] = value
+        return atts
+
+    def attlist(self):
+        attlist = self.non_default_attributes().items()
+        attlist.sort()
+        return attlist
+
+    def get(self, key, failobj=None):
+        return self.attributes.get(key, failobj)
+
+    def hasattr(self, attr):
+        return self.attributes.has_key(attr)
+
+    def delattr(self, attr):
+        if self.attributes.has_key(attr):
+            del self.attributes[attr]
+
+    def setdefault(self, key, failobj=None):
+        return self.attributes.setdefault(key, failobj)
+
+    has_key = hasattr
+
+    def append(self, item):
+        self.setup_child(item)
+        self.children.append(item)
+
+    def extend(self, item):
+        for node in item:
+            self.append(node)
+
+    def insert(self, index, item):
+        if isinstance(item, Node):
+            self.setup_child(item)
+            self.children.insert(index, item)
+        elif item is not None:
+            self[index:index] = item
+
+    def pop(self, i=-1):
+        return self.children.pop(i)
+
+    def remove(self, item):
+        self.children.remove(item)
+
+    def index(self, item):
+        return self.children.index(item)
+
+    def is_not_default(self, key):
+        if self[key] == [] and key in self.list_attributes:
+            return 0
+        else:
+            return 1
+
+    def update_basic_atts(self, dict):
+        """
+        Update basic attributes ('ids', 'names', 'classes',
+        'dupnames', but not 'source') from node or dictionary `dict`.
+        """
+        if isinstance(dict, Node):
+            dict = dict.attributes
+        for att in ('ids', 'classes', 'names', 'dupnames'):
+            for value in dict.get(att, []):
+                if not value in self[att]:
+                    self[att].append(value)
+
+    def clear(self):
+        self.children = []
+
+    def replace(self, old, new):
+        """Replace one child `Node` with another child or children."""
+        index = self.index(old)
+        if isinstance(new, Node):
+            self.setup_child(new)
+            self[index] = new
+        elif new is not None:
+            self[index:index+1] = new
+
+    def replace_self(self, new):
+        """
+        Replace `self` node with `new`, where `new` is a node or a
+        list of nodes.
+        """
+        update = new
+        if not isinstance(new, Node):
+            # `new` is a list; update first child.
+            try:
+                update = new[0]
+            except IndexError:
+                update = None
+        if isinstance(update, Element):
+            update.update_basic_atts(self)
+        else:
+            # `update` is a Text node or `new` is an empty list.
+            # Assert that we aren't losing any attributes.
+            for att in ('ids', 'names', 'classes', 'dupnames'):
+                assert not self[att], \
+                       'Losing "%s" attribute: %s' % (att, self[att])
+        self.parent.replace(self, new)
+
+    def first_child_matching_class(self, childclass, start=0, end=sys.maxint):
+        """
+        Return the index of the first child whose class exactly matches.
+
+        Parameters:
+
+        - `childclass`: A `Node` subclass to search for, or a tuple of `Node`
+          classes. If a tuple, any of the classes may match.
+        - `start`: Initial index to check.
+        - `end`: Initial index to *not* check.
+        """
+        if not isinstance(childclass, TupleType):
+            childclass = (childclass,)
+        for index in range(start, min(len(self), end)):
+            for c in childclass:
+                if isinstance(self[index], c):
+                    return index
+        return None
+
+    def first_child_not_matching_class(self, childclass, start=0,
+                                       end=sys.maxint):
+        """
+        Return the index of the first child whose class does *not* match.
+
+        Parameters:
+
+        - `childclass`: A `Node` subclass to skip, or a tuple of `Node`
+          classes. If a tuple, none of the classes may match.
+        - `start`: Initial index to check.
+        - `end`: Initial index to *not* check.
+        """
+        if not isinstance(childclass, TupleType):
+            childclass = (childclass,)
+        for index in range(start, min(len(self), end)):
+            for c in childclass:
+                if isinstance(self.children[index], c):
+                    break
+            else:
+                return index
+        return None
+
+    def pformat(self, indent='    ', level=0):
+        return ''.join(['%s%s\n' % (indent * level, self.starttag())] +
+                       [child.pformat(indent, level+1)
+                        for child in self.children])
+
+    def copy(self):
+        return self.__class__(**self.attributes)
+
+    def deepcopy(self):
+        copy = self.copy()
+        copy.extend([child.deepcopy() for child in self.children])
+        return copy
+
+    def set_class(self, name):
+        """Add a new class to the "classes" attribute."""
+        warnings.warn('docutils.nodes.Element.set_class deprecated; '
+                      "append to Element['classes'] list attribute directly",
+                      DeprecationWarning, stacklevel=2)
+        assert ' ' not in name
+        self['classes'].append(name.lower())
+
+    def note_referenced_by(self, name=None, id=None):
+        """Note that this Element has been referenced by its name
+        `name` or id `id`."""
+        self.referenced = 1
+        # Element.expect_referenced_by_* dictionaries map names or ids
+        # to nodes whose ``referenced`` attribute is set to true as
+        # soon as this node is referenced by the given name or id.
+        # Needed for target propagation.
+        by_name = getattr(self, 'expect_referenced_by_name', {}).get(name)
+        by_id = getattr(self, 'expect_referenced_by_id', {}).get(id)
+        if by_name:
+            assert name is not None
+            by_name.referenced = 1
+        if by_id:
+            assert id is not None
+            by_id.referenced = 1
+
+
+class TextElement(Element):
+
+    """
+    An element which directly contains text.
+
+    Its children are all `Text` or `Inline` subclass nodes.  You can
+    check whether an element's context is inline simply by checking whether
+    its immediate parent is a `TextElement` instance (including subclasses).
+    This is handy for nodes like `image` that can appear both inline and as
+    standalone body elements.
+
+    If passing children to `__init__()`, make sure to set `text` to
+    ``''`` or some other suitable value.
+    """
+
+    child_text_separator = ''
+    """Separator for child nodes, used by `astext()` method."""
+
+    def __init__(self, rawsource='', text='', *children, **attributes):
+        if text != '':
+            textnode = Text(text)
+            Element.__init__(self, rawsource, textnode, *children,
+                              **attributes)
+        else:
+            Element.__init__(self, rawsource, *children, **attributes)
+
+
+class FixedTextElement(TextElement):
+
+    """An element which directly contains preformatted text."""
+
+    def __init__(self, rawsource='', text='', *children, **attributes):
+        TextElement.__init__(self, rawsource, text, *children, **attributes)
+        self.attributes['xml:space'] = 'preserve'
+
+
+# ========
+#  Mixins
+# ========
+
+class Resolvable:
+
+    resolved = 0
+
+
+class BackLinkable:
+
+    def add_backref(self, refid):
+        self['backrefs'].append(refid)
+
+
+# ====================
+#  Element Categories
+# ====================
+
+class Root: pass
+
+class Titular: pass
+
+class PreBibliographic:
+    """Category of Node which may occur before Bibliographic Nodes."""
+
+class Bibliographic: pass
+
+class Decorative(PreBibliographic): pass
+
+class Structural: pass
+
+class Body: pass
+
+class General(Body): pass
+
+class Sequential(Body):
+    """List-like elements."""
+
+class Admonition(Body): pass
+
+class Special(Body):
+    """Special internal body elements."""
+
+class Invisible(PreBibliographic):
+    """Internal elements that don't appear in output."""
+
+class Part: pass
+
+class Inline: pass
+
+class Referential(Resolvable): pass
+
+
+class Targetable(Resolvable):
+
+    referenced = 0
+
+    indirect_reference_name = None
+    """Holds the whitespace_normalized_name (contains mixed case) of a target.
+    Required for MoinMoin/reST compatibility."""
+
+
+class Labeled:
+    """Contains a `label` as its first element."""
+
+
+# ==============
+#  Root Element
+# ==============
+
+class document(Root, Structural, Element):
+
+    """
+    The document root element.
+
+    Do not instantiate this class directly; use
+    `docutils.utils.new_document()` instead.
+    """
+
+    def __init__(self, settings, reporter, *args, **kwargs):
+        Element.__init__(self, *args, **kwargs)
+
+        self.current_source = None
+        """Path to or description of the input source being processed."""
+
+        self.current_line = None
+        """Line number (1-based) of `current_source`."""
+
+        self.settings = settings
+        """Runtime settings data record."""
+
+        self.reporter = reporter
+        """System message generator."""
+
+        self.indirect_targets = []
+        """List of indirect target nodes."""
+
+        self.substitution_defs = {}
+        """Mapping of substitution names to substitution_definition nodes."""
+
+        self.substitution_names = {}
+        """Mapping of case-normalized substitution names to case-sensitive
+        names."""
+
+        self.refnames = {}
+        """Mapping of names to lists of referencing nodes."""
+
+        self.refids = {}
+        """Mapping of ids to lists of referencing nodes."""
+
+        self.nameids = {}
+        """Mapping of names to unique id's."""
+
+        self.nametypes = {}
+        """Mapping of names to hyperlink type (boolean: True => explicit,
+        False => implicit."""
+
+        self.ids = {}
+        """Mapping of ids to nodes."""
+
+        self.footnote_refs = {}
+        """Mapping of footnote labels to lists of footnote_reference nodes."""
+
+        self.citation_refs = {}
+        """Mapping of citation labels to lists of citation_reference nodes."""
+
+        self.autofootnotes = []
+        """List of auto-numbered footnote nodes."""
+
+        self.autofootnote_refs = []
+        """List of auto-numbered footnote_reference nodes."""
+
+        self.symbol_footnotes = []
+        """List of symbol footnote nodes."""
+
+        self.symbol_footnote_refs = []
+        """List of symbol footnote_reference nodes."""
+
+        self.footnotes = []
+        """List of manually-numbered footnote nodes."""
+
+        self.citations = []
+        """List of citation nodes."""
+
+        self.autofootnote_start = 1
+        """Initial auto-numbered footnote number."""
+
+        self.symbol_footnote_start = 0
+        """Initial symbol footnote symbol index."""
+
+        self.id_start = 1
+        """Initial ID number."""
+
+        self.parse_messages = []
+        """System messages generated while parsing."""
+
+        self.transform_messages = []
+        """System messages generated while applying transforms."""
+
+        import docutils.transforms
+        self.transformer = docutils.transforms.Transformer(self)
+        """Storage for transforms to be applied to this document."""
+
+        self.decoration = None
+        """Document's `decoration` node."""
+
+        self.document = self
+
+    def __getstate__(self):
+        """
+        Return dict with unpicklable references removed.
+        """
+        state = self.__dict__.copy()
+        state['reporter'] = None
+        state['transformer'] = None
+        return state
+
+    def asdom(self, dom=None):
+        """Return a DOM representation of this document."""
+        if dom is None:
+            import xml.dom.minidom as dom
+        domroot = dom.Document()
+        domroot.appendChild(self._dom_node(domroot))
+        return domroot
+
+    def set_id(self, node, msgnode=None):
+        for id in node['ids']:
+            if self.ids.has_key(id) and self.ids[id] is not node:
+                msg = self.reporter.severe('Duplicate ID: "%s".' % id)
+                if msgnode != None:
+                    msgnode += msg
+        if not node['ids']:
+            for name in node['names']:
+                id = self.settings.id_prefix + make_id(name)
+                if id and not self.ids.has_key(id):
+                    break
+            else:
+                id = ''
+                while not id or self.ids.has_key(id):
+                    id = (self.settings.id_prefix +
+                          self.settings.auto_id_prefix + str(self.id_start))
+                    self.id_start += 1
+            node['ids'].append(id)
+        self.ids[id] = node
+        return id
+
+    def set_name_id_map(self, node, id, msgnode=None, explicit=None):
+        """
+        `self.nameids` maps names to IDs, while `self.nametypes` maps names to
+        booleans representing hyperlink type (True==explicit,
+        False==implicit).  This method updates the mappings.
+
+        The following state transition table shows how `self.nameids` ("ids")
+        and `self.nametypes` ("types") change with new input (a call to this
+        method), and what actions are performed ("implicit"-type system
+        messages are INFO/1, and "explicit"-type system messages are ERROR/3):
+
+        ====  =====  ========  ========  =======  ====  =====  =====
+         Old State    Input          Action        New State   Notes
+        -----------  --------  -----------------  -----------  -----
+        ids   types  new type  sys.msg.  dupname  ids   types
+        ====  =====  ========  ========  =======  ====  =====  =====
+        -     -      explicit  -         -        new   True
+        -     -      implicit  -         -        new   False
+        None  False  explicit  -         -        new   True
+        old   False  explicit  implicit  old      new   True
+        None  True   explicit  explicit  new      None  True
+        old   True   explicit  explicit  new,old  None  True   [#]_
+        None  False  implicit  implicit  new      None  False
+        old   False  implicit  implicit  new,old  None  False
+        None  True   implicit  implicit  new      None  True
+        old   True   implicit  implicit  new      old   True
+        ====  =====  ========  ========  =======  ====  =====  =====
+
+        .. [#] Do not clear the name-to-id map or invalidate the old target if
+           both old and new targets are external and refer to identical URIs.
+           The new target is invalidated regardless.
+        """
+        for name in node['names']:
+            if self.nameids.has_key(name):
+                self.set_duplicate_name_id(node, id, name, msgnode, explicit)
+            else:
+                self.nameids[name] = id
+                self.nametypes[name] = explicit
+
+    def set_duplicate_name_id(self, node, id, name, msgnode, explicit):
+        old_id = self.nameids[name]
+        old_explicit = self.nametypes[name]
+        self.nametypes[name] = old_explicit or explicit
+        if explicit:
+            if old_explicit:
+                level = 2
+                if old_id is not None:
+                    old_node = self.ids[old_id]
+                    if node.has_key('refuri'):
+                        refuri = node['refuri']
+                        if old_node['names'] \
+                               and old_node.has_key('refuri') \
+                               and old_node['refuri'] == refuri:
+                            level = 1   # just inform if refuri's identical
+                    if level > 1:
+                        dupname(old_node, name)
+                        self.nameids[name] = None
+                msg = self.reporter.system_message(
+                    level, 'Duplicate explicit target name: "%s".' % name,
+                    backrefs=[id], base_node=node)
+                if msgnode != None:
+                    msgnode += msg
+                dupname(node, name)
+            else:
+                self.nameids[name] = id
+                if old_id is not None:
+                    old_node = self.ids[old_id]
+                    dupname(old_node, name)
+        else:
+            if old_id is not None and not old_explicit:
+                self.nameids[name] = None
+                old_node = self.ids[old_id]
+                dupname(old_node, name)
+            dupname(node, name)
+        if not explicit or (not old_explicit and old_id is not None):
+            msg = self.reporter.info(
+                'Duplicate implicit target name: "%s".' % name,
+                backrefs=[id], base_node=node)
+            if msgnode != None:
+                msgnode += msg
+
+    def has_name(self, name):
+        return self.nameids.has_key(name)
+
+    # "note" here is an imperative verb: "take note of".
+    def note_implicit_target(self, target, msgnode=None):
+        id = self.set_id(target, msgnode)
+        self.set_name_id_map(target, id, msgnode, explicit=None)
+
+    def note_explicit_target(self, target, msgnode=None):
+        id = self.set_id(target, msgnode)
+        self.set_name_id_map(target, id, msgnode, explicit=1)
+
+    def note_refname(self, node):
+        self.refnames.setdefault(node['refname'], []).append(node)
+
+    def note_refid(self, node):
+        self.refids.setdefault(node['refid'], []).append(node)
+
+    def note_indirect_target(self, target):
+        self.indirect_targets.append(target)
+        if target['names']:
+            self.note_refname(target)
+
+    def note_anonymous_target(self, target):
+        self.set_id(target)
+
+    def note_autofootnote(self, footnote):
+        self.set_id(footnote)
+        self.autofootnotes.append(footnote)
+
+    def note_autofootnote_ref(self, ref):
+        self.set_id(ref)
+        self.autofootnote_refs.append(ref)
+
+    def note_symbol_footnote(self, footnote):
+        self.set_id(footnote)
+        self.symbol_footnotes.append(footnote)
+
+    def note_symbol_footnote_ref(self, ref):
+        self.set_id(ref)
+        self.symbol_footnote_refs.append(ref)
+
+    def note_footnote(self, footnote):
+        self.set_id(footnote)
+        self.footnotes.append(footnote)
+
+    def note_footnote_ref(self, ref):
+        self.set_id(ref)
+        self.footnote_refs.setdefault(ref['refname'], []).append(ref)
+        self.note_refname(ref)
+
+    def note_citation(self, citation):
+        self.citations.append(citation)
+
+    def note_citation_ref(self, ref):
+        self.set_id(ref)
+        self.citation_refs.setdefault(ref['refname'], []).append(ref)
+        self.note_refname(ref)
+
+    def note_substitution_def(self, subdef, def_name, msgnode=None):
+        name = whitespace_normalize_name(def_name)
+        if self.substitution_defs.has_key(name):
+            msg = self.reporter.error(
+                  'Duplicate substitution definition name: "%s".' % name,
+                  base_node=subdef)
+            if msgnode != None:
+                msgnode += msg
+            oldnode = self.substitution_defs[name]
+            dupname(oldnode, name)
+        # keep only the last definition:
+        self.substitution_defs[name] = subdef
+        # case-insensitive mapping:
+        self.substitution_names[fully_normalize_name(name)] = name
+
+    def note_substitution_ref(self, subref, refname):
+        subref['refname'] = whitespace_normalize_name(refname)
+
+    def note_pending(self, pending, priority=None):
+        self.transformer.add_pending(pending, priority)
+
+    def note_parse_message(self, message):
+        self.parse_messages.append(message)
+
+    def note_transform_message(self, message):
+        self.transform_messages.append(message)
+
+    def note_source(self, source, offset):
+        self.current_source = source
+        if offset is None:
+            self.current_line = offset
+        else:
+            self.current_line = offset + 1
+
+    def copy(self):
+        return self.__class__(self.settings, self.reporter,
+                              **self.attributes)
+
+    def get_decoration(self):
+        if not self.decoration:
+            self.decoration = decoration()
+            index = self.first_child_not_matching_class(Titular)
+            if index is None:
+                self.append(self.decoration)
+            else:
+                self.insert(index, self.decoration)
+        return self.decoration
+
+
+# ================
+#  Title Elements
+# ================
+
+class title(Titular, PreBibliographic, TextElement): pass
+class subtitle(Titular, PreBibliographic, TextElement): pass
+class rubric(Titular, TextElement): pass
+
+
+# ========================
+#  Bibliographic Elements
+# ========================
+
+class docinfo(Bibliographic, Element): pass
+class author(Bibliographic, TextElement): pass
+class authors(Bibliographic, Element): pass
+class organization(Bibliographic, TextElement): pass
+class address(Bibliographic, FixedTextElement): pass
+class contact(Bibliographic, TextElement): pass
+class version(Bibliographic, TextElement): pass
+class revision(Bibliographic, TextElement): pass
+class status(Bibliographic, TextElement): pass
+class date(Bibliographic, TextElement): pass
+class copyright(Bibliographic, TextElement): pass
+
+
+# =====================
+#  Decorative Elements
+# =====================
+
+class decoration(Decorative, Element):
+
+    def get_header(self):
+        if not len(self.children) or not isinstance(self.children[0], header):
+            self.insert(0, header())
+        return self.children[0]
+
+    def get_footer(self):
+        if not len(self.children) or not isinstance(self.children[-1], footer):
+            self.append(footer())
+        return self.children[-1]
+
+
+class header(Decorative, Element): pass
+class footer(Decorative, Element): pass
+
+
+# =====================
+#  Structural Elements
+# =====================
+
+class section(Structural, Element): pass
+
+
+class topic(Structural, Element):
+
+    """
+    Topics are terminal, "leaf" mini-sections, like block quotes with titles,
+    or textual figures.  A topic is just like a section, except that it has no
+    subsections, and it doesn't have to conform to section placement rules.
+
+    Topics are allowed wherever body elements (list, table, etc.) are allowed,
+    but only at the top level of a section or document.  Topics cannot nest
+    inside topics, sidebars, or body elements; you can't have a topic inside a
+    table, list, block quote, etc.
+    """
+
+
+class sidebar(Structural, Element):
+
+    """
+    Sidebars are like miniature, parallel documents that occur inside other
+    documents, providing related or reference material.  A sidebar is
+    typically offset by a border and "floats" to the side of the page; the
+    document's main text may flow around it.  Sidebars can also be likened to
+    super-footnotes; their content is outside of the flow of the document's
+    main text.
+
+    Sidebars are allowed wherever body elements (list, table, etc.) are
+    allowed, but only at the top level of a section or document.  Sidebars
+    cannot nest inside sidebars, topics, or body elements; you can't have a
+    sidebar inside a table, list, block quote, etc.
+    """
+
+
+class transition(Structural, Element): pass
+
+
+# ===============
+#  Body Elements
+# ===============
+
+class paragraph(General, TextElement): pass
+class compound(General, Element): pass
+class container(General, Element): pass
+class bullet_list(Sequential, Element): pass
+class enumerated_list(Sequential, Element): pass
+class list_item(Part, Element): pass
+class definition_list(Sequential, Element): pass
+class definition_list_item(Part, Element): pass
+class term(Part, TextElement): pass
+class classifier(Part, TextElement): pass
+class definition(Part, Element): pass
+class field_list(Sequential, Element): pass
+class field(Part, Element): pass
+class field_name(Part, TextElement): pass
+class field_body(Part, Element): pass
+
+
+class option(Part, Element):
+
+    child_text_separator = ''
+
+
+class option_argument(Part, TextElement):
+
+    def astext(self):
+        return self.get('delimiter', ' ') + TextElement.astext(self)
+
+
+class option_group(Part, Element):
+
+    child_text_separator = ', '
+
+
+class option_list(Sequential, Element): pass
+
+
+class option_list_item(Part, Element):
+
+    child_text_separator = '  '
+
+
+class option_string(Part, TextElement): pass
+class description(Part, Element): pass
+class literal_block(General, FixedTextElement): pass
+class doctest_block(General, FixedTextElement): pass
+class line_block(General, Element): pass
+
+
+class line(Part, TextElement):
+
+    indent = None
+
+
+class block_quote(General, Element): pass
+class attribution(Part, TextElement): pass
+class attention(Admonition, Element): pass
+class caution(Admonition, Element): pass
+class danger(Admonition, Element): pass
+class error(Admonition, Element): pass
+class important(Admonition, Element): pass
+class note(Admonition, Element): pass
+class tip(Admonition, Element): pass
+class hint(Admonition, Element): pass
+class warning(Admonition, Element): pass
+class admonition(Admonition, Element): pass
+class comment(Special, Invisible, FixedTextElement): pass
+class substitution_definition(Special, Invisible, TextElement): pass
+class target(Special, Invisible, Inline, TextElement, Targetable): pass
+class footnote(General, BackLinkable, Element, Labeled, Targetable): pass
+class citation(General, BackLinkable, Element, Labeled, Targetable): pass
+class label(Part, TextElement): pass
+class figure(General, Element): pass
+class caption(Part, TextElement): pass
+class legend(Part, Element): pass
+class table(General, Element): pass
+class tgroup(Part, Element): pass
+class colspec(Part, Element): pass
+class thead(Part, Element): pass
+class tbody(Part, Element): pass
+class row(Part, Element): pass
+class entry(Part, Element): pass
+
+
+class system_message(Special, BackLinkable, PreBibliographic, Element):
+
+    """
+    System message element.
+
+    Do not instantiate this class directly; use
+    ``document.reporter.info/warning/error/severe()`` instead.
+    """
+
+    def __init__(self, message=None, *children, **attributes):
+        if message:
+            p = paragraph('', message)
+            children = (p,) + children
+        try:
+            Element.__init__(self, '', *children, **attributes)
+        except:
+            print 'system_message: children=%r' % (children,)
+            raise
+
+    def astext(self):
+        line = self.get('line', '')
+        return u'%s:%s: (%s/%s) %s' % (self['source'], line, self['type'],
+                                       self['level'], Element.astext(self))
+
+
+class pending(Special, Invisible, Element):
+
+    """
+    The "pending" element is used to encapsulate a pending operation: the
+    operation (transform), the point at which to apply it, and any data it
+    requires.  Only the pending operation's location within the document is
+    stored in the public document tree (by the "pending" object itself); the
+    operation and its data are stored in the "pending" object's internal
+    instance attributes.
+
+    For example, say you want a table of contents in your reStructuredText
+    document.  The easiest way to specify where to put it is from within the
+    document, with a directive::
+
+        .. contents::
+
+    But the "contents" directive can't do its work until the entire document
+    has been parsed and possibly transformed to some extent.  So the directive
+    code leaves a placeholder behind that will trigger the second phase of its
+    processing, something like this::
+
+        <pending ...public attributes...> + internal attributes
+
+    Use `document.note_pending()` so that the
+    `docutils.transforms.Transformer` stage of processing can run all pending
+    transforms.
+    """
+
+    def __init__(self, transform, details=None,
+                 rawsource='', *children, **attributes):
+        Element.__init__(self, rawsource, *children, **attributes)
+
+        self.transform = transform
+        """The `docutils.transforms.Transform` class implementing the pending
+        operation."""
+
+        self.details = details or {}
+        """Detail data (dictionary) required by the pending operation."""
+
+    def pformat(self, indent='    ', level=0):
+        internals = [
+              '.. internal attributes:',
+              '     .transform: %s.%s' % (self.transform.__module__,
+                                          self.transform.__name__),
+              '     .details:']
+        details = self.details.items()
+        details.sort()
+        for key, value in details:
+            if isinstance(value, Node):
+                internals.append('%7s%s:' % ('', key))
+                internals.extend(['%9s%s' % ('', line)
+                                  for line in value.pformat().splitlines()])
+            elif value and isinstance(value, ListType) \
+                  and isinstance(value[0], Node):
+                internals.append('%7s%s:' % ('', key))
+                for v in value:
+                    internals.extend(['%9s%s' % ('', line)
+                                      for line in v.pformat().splitlines()])
+            else:
+                internals.append('%7s%s: %r' % ('', key, value))
+        return (Element.pformat(self, indent, level)
+                + ''.join([('    %s%s\n' % (indent * level, line))
+                           for line in internals]))
+
+    def copy(self):
+        return self.__class__(self.transform, self.details, self.rawsource,
+                              **self.attributes)
+
+
+class raw(Special, Inline, PreBibliographic, FixedTextElement):
+
+    """
+    Raw data that is to be passed untouched to the Writer.
+    """
+
+    pass
+
+
+# =================
+#  Inline Elements
+# =================
+
+class emphasis(Inline, TextElement): pass
+class strong(Inline, TextElement): pass
+class literal(Inline, TextElement): pass
+class reference(General, Inline, Referential, TextElement): pass
+class footnote_reference(Inline, Referential, TextElement): pass
+class citation_reference(Inline, Referential, TextElement): pass
+class substitution_reference(Inline, TextElement): pass
+class title_reference(Inline, TextElement): pass
+class abbreviation(Inline, TextElement): pass
+class acronym(Inline, TextElement): pass
+class superscript(Inline, TextElement): pass
+class subscript(Inline, TextElement): pass
+
+
+class image(General, Inline, Element):
+
+    def astext(self):
+        return self.get('alt', '')
+
+
+class inline(Inline, TextElement): pass
+class problematic(Inline, TextElement): pass
+class generated(Inline, TextElement): pass
+
+
+# ========================================
+#  Auxiliary Classes, Functions, and Data
+# ========================================
+
+node_class_names = """
+    Text
+    abbreviation acronym address admonition attention attribution author
+        authors
+    block_quote bullet_list
+    caption caution citation citation_reference classifier colspec comment
+        compound contact container copyright
+    danger date decoration definition definition_list definition_list_item
+        description docinfo doctest_block document
+    emphasis entry enumerated_list error
+    field field_body field_list field_name figure footer
+        footnote footnote_reference
+    generated
+    header hint
+    image important inline
+    label legend line line_block list_item literal literal_block
+    note
+    option option_argument option_group option_list option_list_item
+        option_string organization
+    paragraph pending problematic
+    raw reference revision row rubric
+    section sidebar status strong subscript substitution_definition
+        substitution_reference subtitle superscript system_message
+    table target tbody term tgroup thead tip title title_reference topic
+        transition
+    version
+    warning""".split()
+"""A list of names of all concrete Node subclasses."""
+
+
+class NodeVisitor:
+
+    """
+    "Visitor" pattern [GoF95]_ abstract superclass implementation for
+    document tree traversals.
+
+    Each node class has corresponding methods, doing nothing by
+    default; override individual methods for specific and useful
+    behaviour.  The `dispatch_visit()` method is called by
+    `Node.walk()` upon entering a node.  `Node.walkabout()` also calls
+    the `dispatch_departure()` method before exiting a node.
+
+    The dispatch methods call "``visit_`` + node class name" or
+    "``depart_`` + node class name", resp.
+
+    This is a base class for visitors whose ``visit_...`` & ``depart_...``
+    methods should be implemented for *all* node types encountered (such as
+    for `docutils.writers.Writer` subclasses).  Unimplemented methods will
+    raise exceptions.
+
+    For sparse traversals, where only certain node types are of interest,
+    subclass `SparseNodeVisitor` instead.  When (mostly or entirely) uniform
+    processing is desired, subclass `GenericNodeVisitor`.
+
+    .. [GoF95] Gamma, Helm, Johnson, Vlissides. *Design Patterns: Elements of
+       Reusable Object-Oriented Software*. Addison-Wesley, Reading, MA, USA,
+       1995.
+    """
+
+    optional = ()
+    """
+    Tuple containing node class names (as strings).
+
+    No exception will be raised if writers do not implement visit
+    or departure functions for these node classes.
+
+    Used to ensure transitional compatibility with existing 3rd-party writers.
+    """
+
+    def __init__(self, document):
+        self.document = document
+
+    def dispatch_visit(self, node):
+        """
+        Call self."``visit_`` + node class name" with `node` as
+        parameter.  If the ``visit_...`` method does not exist, call
+        self.unknown_visit.
+        """
+        node_name = node.__class__.__name__
+        method = getattr(self, 'visit_' + node_name, self.unknown_visit)
+        self.document.reporter.debug(
+            'docutils.nodes.NodeVisitor.dispatch_visit calling %s for %s'
+            % (method.__name__, node_name))
+        return method(node)
+
+    def dispatch_departure(self, node):
+        """
+        Call self."``depart_`` + node class name" with `node` as
+        parameter.  If the ``depart_...`` method does not exist, call
+        self.unknown_departure.
+        """
+        node_name = node.__class__.__name__
+        method = getattr(self, 'depart_' + node_name, self.unknown_departure)
+        self.document.reporter.debug(
+            'docutils.nodes.NodeVisitor.dispatch_departure calling %s for %s'
+            % (method.__name__, node_name))
+        return method(node)
+
+    def unknown_visit(self, node):
+        """
+        Called when entering unknown `Node` types.
+
+        Raise an exception unless overridden.
+        """
+        if  (node.document.settings.strict_visitor
+             or node.__class__.__name__ not in self.optional):
+            raise NotImplementedError(
+                '%s visiting unknown node type: %s'
+                % (self.__class__, node.__class__.__name__))
+
+    def unknown_departure(self, node):
+        """
+        Called before exiting unknown `Node` types.
+
+        Raise exception unless overridden.
+        """
+        if  (node.document.settings.strict_visitor
+             or node.__class__.__name__ not in self.optional):
+            raise NotImplementedError(
+                '%s departing unknown node type: %s'
+                % (self.__class__, node.__class__.__name__))
+
+
+class SparseNodeVisitor(NodeVisitor):
+
+    """
+    Base class for sparse traversals, where only certain node types are of
+    interest.  When ``visit_...`` & ``depart_...`` methods should be
+    implemented for *all* node types (such as for `docutils.writers.Writer`
+    subclasses), subclass `NodeVisitor` instead.
+    """
+
+
+class GenericNodeVisitor(NodeVisitor):
+
+    """
+    Generic "Visitor" abstract superclass, for simple traversals.
+
+    Unless overridden, each ``visit_...`` method calls `default_visit()`, and
+    each ``depart_...`` method (when using `Node.walkabout()`) calls
+    `default_departure()`. `default_visit()` (and `default_departure()`) must
+    be overridden in subclasses.
+
+    Define fully generic visitors by overriding `default_visit()` (and
+    `default_departure()`) only. Define semi-generic visitors by overriding
+    individual ``visit_...()`` (and ``depart_...()``) methods also.
+
+    `NodeVisitor.unknown_visit()` (`NodeVisitor.unknown_departure()`) should
+    be overridden for default behavior.
+    """
+
+    def default_visit(self, node):
+        """Override for generic, uniform traversals."""
+        raise NotImplementedError
+
+    def default_departure(self, node):
+        """Override for generic, uniform traversals."""
+        raise NotImplementedError
+
+def _call_default_visit(self, node):
+    self.default_visit(node)
+
+def _call_default_departure(self, node):
+    self.default_departure(node)
+
+def _nop(self, node):
+    pass
+
+def _add_node_class_names(names):
+    """Save typing with dynamic assignments:"""
+    for _name in names:
+        setattr(GenericNodeVisitor, "visit_" + _name, _call_default_visit)
+        setattr(GenericNodeVisitor, "depart_" + _name, _call_default_departure)
+        setattr(SparseNodeVisitor, 'visit_' + _name, _nop)
+        setattr(SparseNodeVisitor, 'depart_' + _name, _nop)
+
+_add_node_class_names(node_class_names)
+
+
+class TreeCopyVisitor(GenericNodeVisitor):
+
+    """
+    Make a complete copy of a tree or branch, including element attributes.
+    """
+
+    def __init__(self, document):
+        GenericNodeVisitor.__init__(self, document)
+        self.parent_stack = []
+        self.parent = []
+
+    def get_tree_copy(self):
+        return self.parent[0]
+
+    def default_visit(self, node):
+        """Copy the current node, and make it the new acting parent."""
+        newnode = node.copy()
+        self.parent.append(newnode)
+        self.parent_stack.append(self.parent)
+        self.parent = newnode
+
+    def default_departure(self, node):
+        """Restore the previous acting parent."""
+        self.parent = self.parent_stack.pop()
+
+
+class TreePruningException(Exception):
+
+    """
+    Base class for `NodeVisitor`-related tree pruning exceptions.
+
+    Raise subclasses from within ``visit_...`` or ``depart_...`` methods
+    called from `Node.walk()` and `Node.walkabout()` tree traversals to prune
+    the tree traversed.
+    """
+
+    pass
+
+
+class SkipChildren(TreePruningException):
+
+    """
+    Do not visit any children of the current node.  The current node's
+    siblings and ``depart_...`` method are not affected.
+    """
+
+    pass
+
+
+class SkipSiblings(TreePruningException):
+
+    """
+    Do not visit any more siblings (to the right) of the current node.  The
+    current node's children and its ``depart_...`` method are not affected.
+    """
+
+    pass
+
+
+class SkipNode(TreePruningException):
+
+    """
+    Do not visit the current node's children, and do not call the current
+    node's ``depart_...`` method.
+    """
+
+    pass
+
+
+class SkipDeparture(TreePruningException):
+
+    """
+    Do not call the current node's ``depart_...`` method.  The current node's
+    children and siblings are not affected.
+    """
+
+    pass
+
+
+class NodeFound(TreePruningException):
+
+    """
+    Raise to indicate that the target of a search has been found.  This
+    exception must be caught by the client; it is not caught by the traversal
+    code.
+    """
+
+    pass
+
+
+class StopTraversal(TreePruningException):
+
+    """
+    Stop the traversal alltogether.  The current node's ``depart_...`` method
+    is not affected.  The parent nodes ``depart_...`` methods are also called
+    as usual.  No other nodes are visited.  This is an alternative to
+    NodeFound that does not cause exception handling to trickle up to the
+    caller.
+    """
+
+    pass
+
+
+def make_id(string):
+    """
+    Convert `string` into an identifier and return it.
+
+    Docutils identifiers will conform to the regular expression
+    ``[a-z](-?[a-z0-9]+)*``.  For CSS compatibility, identifiers (the "class"
+    and "id" attributes) should have no underscores, colons, or periods.
+    Hyphens may be used.
+
+    - The `HTML 4.01 spec`_ defines identifiers based on SGML tokens:
+
+          ID and NAME tokens must begin with a letter ([A-Za-z]) and may be
+          followed by any number of letters, digits ([0-9]), hyphens ("-"),
+          underscores ("_"), colons (":"), and periods (".").
+
+    - However the `CSS1 spec`_ defines identifiers based on the "name" token,
+      a tighter interpretation ("flex" tokenizer notation; "latin1" and
+      "escape" 8-bit characters have been replaced with entities)::
+
+          unicode     \\[0-9a-f]{1,4}
+          latin1      [&iexcl;-&yuml;]
+          escape      {unicode}|\\[ -~&iexcl;-&yuml;]
+          nmchar      [-a-z0-9]|{latin1}|{escape}
+          name        {nmchar}+
+
+    The CSS1 "nmchar" rule does not include underscores ("_"), colons (":"),
+    or periods ("."), therefore "class" and "id" attributes should not contain
+    these characters. They should be replaced with hyphens ("-"). Combined
+    with HTML's requirements (the first character must be a letter; no
+    "unicode", "latin1", or "escape" characters), this results in the
+    ``[a-z](-?[a-z0-9]+)*`` pattern.
+
+    .. _HTML 4.01 spec: http://www.w3.org/TR/html401
+    .. _CSS1 spec: http://www.w3.org/TR/REC-CSS1
+    """
+    id = _non_id_chars.sub('-', ' '.join(string.lower().split()))
+    id = _non_id_at_ends.sub('', id)
+    return str(id)
+
+_non_id_chars = re.compile('[^a-z0-9]+')
+_non_id_at_ends = re.compile('^[-0-9]+|-+$')
+
+def dupname(node, name):
+    node['dupnames'].append(name)
+    node['names'].remove(name)
+    # Assume that this method is referenced, even though it isn't; we
+    # don't want to throw unnecessary system_messages.
+    node.referenced = 1
+
+def fully_normalize_name(name):
+    """Return a case- and whitespace-normalized name."""
+    return ' '.join(name.lower().split())
+
+def whitespace_normalize_name(name):
+    """Return a whitespace-normalized name."""
+    return ' '.join(name.split())
+
+def serial_escape(value):
+    """Escape string values that are elements of a list, for serialization."""
+    return value.replace('\\', r'\\').replace(' ', r'\ ')
+
+# 
+#
+# Local Variables:
+# indent-tabs-mode: nil
+# sentence-end-double-space: t
+# fill-column: 78
+# End:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,47 @@
+# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains Docutils parser modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import Component
+
+
+class Parser(Component):
+
+    component_type = 'parser'
+    config_section = 'parsers'
+
+    def parse(self, inputstring, document):
+        """Override to parse `inputstring` into document tree `document`."""
+        raise NotImplementedError('subclass must override this method')
+
+    def setup_parse(self, inputstring, document):
+        """Initial parse setup.  Call at start of `self.parse()`."""
+        self.inputstring = inputstring
+        self.document = document
+        document.reporter.attach_observer(document.note_parse_message)
+
+    def finish_parse(self):
+        """Finalize parse details.  Call at end of `self.parse()`."""
+        self.document.reporter.detach_observer(
+            self.document.note_parse_message)
+
+
+_parser_aliases = {
+      'restructuredtext': 'rst',
+      'rest': 'rst',
+      'restx': 'rst',
+      'rtxt': 'rst',}
+
+def get_parser_class(parser_name):
+    """Return the Parser class from the `parser_name` module."""
+    parser_name = parser_name.lower()
+    if _parser_aliases.has_key(parser_name):
+        parser_name = _parser_aliases[parser_name]
+    module = __import__(parser_name, globals(), locals())
+    return module.Parser
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/null.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,20 @@
+# $Id: null.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Martin Blais <blais@furius.ca>
+# Copyright: This module has been placed in the public domain.
+
+"""A do-nothing parser."""
+
+from docutils import parsers
+
+
+class Parser(parsers.Parser):
+
+    """A do-nothing parser."""
+
+    supported = ('null',)
+
+    config_section = 'null parser'
+    config_section_dependencies = ('parsers',)
+
+    def parse(self, inputstring, document):
+        pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,367 @@
+# $Id: __init__.py 4802 2006-11-12 18:02:17Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This is ``docutils.parsers.rst`` package. It exports a single class, `Parser`,
+the reStructuredText parser.
+
+
+Usage
+=====
+
+1. Create a parser::
+
+       parser = docutils.parsers.rst.Parser()
+
+   Several optional arguments may be passed to modify the parser's behavior.
+   Please see `Customizing the Parser`_ below for details.
+
+2. Gather input (a multi-line string), by reading a file or the standard
+   input::
+
+       input = sys.stdin.read()
+
+3. Create a new empty `docutils.nodes.document` tree::
+
+       document = docutils.utils.new_document(source, settings)
+
+   See `docutils.utils.new_document()` for parameter details.
+
+4. Run the parser, populating the document tree::
+
+       parser.parse(input, document)
+
+
+Parser Overview
+===============
+
+The reStructuredText parser is implemented as a state machine, examining its
+input one line at a time. To understand how the parser works, please first
+become familiar with the `docutils.statemachine` module, then see the
+`states` module.
+
+
+Customizing the Parser
+----------------------
+
+Anything that isn't already customizable is that way simply because that type
+of customizability hasn't been implemented yet.  Patches welcome!
+
+When instantiating an object of the `Parser` class, two parameters may be
+passed: ``rfc2822`` and ``inliner``.  Pass ``rfc2822=1`` to enable an initial
+RFC-2822 style header block, parsed as a "field_list" element (with "class"
+attribute set to "rfc2822").  Currently this is the only body-level element
+which is customizable without subclassing.  (Tip: subclass `Parser` and change
+its "state_classes" and "initial_state" attributes to refer to new classes.
+Contact the author if you need more details.)
+
+The ``inliner`` parameter takes an instance of `states.Inliner` or a subclass.
+It handles inline markup recognition.  A common extension is the addition of
+further implicit hyperlinks, like "RFC 2822".  This can be done by subclassing
+`states.Inliner`, adding a new method for the implicit markup, and adding a
+``(pattern, method)`` pair to the "implicit_dispatch" attribute of the
+subclass.  See `states.Inliner.implicit_inline()` for details.  Explicit
+inline markup can be customized in a `states.Inliner` subclass via the
+``patterns.initial`` and ``dispatch`` attributes (and new methods as
+appropriate).
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import docutils.parsers
+import docutils.statemachine
+from docutils.parsers.rst import states
+from docutils import frontend, nodes
+
+
+class Parser(docutils.parsers.Parser):
+
+    """The reStructuredText parser."""
+
+    supported = ('restructuredtext', 'rst', 'rest', 'restx', 'rtxt', 'rstx')
+    """Aliases this parser supports."""
+
+    settings_spec = (
+        'reStructuredText Parser Options',
+        None,
+        (('Recognize and link to standalone PEP references (like "PEP 258").',
+          ['--pep-references'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Base URL for PEP references '
+          '(default "http://www.python.org/dev/peps/").',
+          ['--pep-base-url'],
+          {'metavar': '<URL>', 'default': 'http://www.python.org/dev/peps/',
+           'validator': frontend.validate_url_trailing_slash}),
+         ('Template for PEP file part of URL. (default "pep-%04d")',
+          ['--pep-file-url-template'],
+          {'metavar': '<URL>', 'default': 'pep-%04d'}),
+         ('Recognize and link to standalone RFC references (like "RFC 822").',
+          ['--rfc-references'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Base URL for RFC references (default "http://www.faqs.org/rfcs/").',
+          ['--rfc-base-url'],
+          {'metavar': '<URL>', 'default': 'http://www.faqs.org/rfcs/',
+           'validator': frontend.validate_url_trailing_slash}),
+         ('Set number of spaces for tab expansion (default 8).',
+          ['--tab-width'],
+          {'metavar': '<width>', 'type': 'int', 'default': 8,
+           'validator': frontend.validate_nonnegative_int}),
+         ('Remove spaces before footnote references.',
+          ['--trim-footnote-reference-space'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Leave spaces before footnote references.',
+          ['--leave-footnote-reference-space'],
+          {'action': 'store_false', 'dest': 'trim_footnote_reference_space'}),
+         ('Disable directives that insert the contents of external file '
+          '("include" & "raw"); replaced with a "warning" system message.',
+          ['--no-file-insertion'],
+          {'action': 'store_false', 'default': 1,
+           'dest': 'file_insertion_enabled',
+           'validator': frontend.validate_boolean}),
+         ('Enable directives that insert the contents of external file '
+          '("include" & "raw").  Enabled by default.',
+          ['--file-insertion-enabled'],
+          {'action': 'store_true'}),
+         ('Disable the "raw" directives; replaced with a "warning" '
+          'system message.',
+          ['--no-raw'],
+          {'action': 'store_false', 'default': 1, 'dest': 'raw_enabled',
+           'validator': frontend.validate_boolean}),
+         ('Enable the "raw" directive.  Enabled by default.',
+          ['--raw-enabled'],
+          {'action': 'store_true'}),))
+
+    config_section = 'restructuredtext parser'
+    config_section_dependencies = ('parsers',)
+
+    def __init__(self, rfc2822=None, inliner=None):
+        if rfc2822:
+            self.initial_state = 'RFC2822Body'
+        else:
+            self.initial_state = 'Body'
+        self.state_classes = states.state_classes
+        self.inliner = inliner
+
+    def parse(self, inputstring, document):
+        """Parse `inputstring` and populate `document`, a document tree."""
+        self.setup_parse(inputstring, document)
+        self.statemachine = states.RSTStateMachine(
+              state_classes=self.state_classes,
+              initial_state=self.initial_state,
+              debug=document.reporter.debug_flag)
+        inputlines = docutils.statemachine.string2lines(
+              inputstring, tab_width=document.settings.tab_width,
+              convert_whitespace=1)
+        self.statemachine.run(inputlines, document, inliner=self.inliner)
+        self.finish_parse()
+
+
+class DirectiveError(Exception):
+
+    """
+    Store a message and a system message level.
+
+    To be thrown from inside directive code.
+
+    Do not instantiate directly -- use `Directive.directive_error()`
+    instead!
+    """
+
+    def __init__(self, level, message):
+        """
+        Initialize with message `message`.  `level` is a system message level.
+        """
+        Exception.__init__(self)
+        self.level = level
+        self.message = message
+
+
+class Directive:
+
+    """
+    Base class for reStructuredText directives.
+
+    The following attributes may be set by subclasses.  They are
+    interpreted by the directive parser (which runs the directive
+    class):
+
+    - `required_arguments`: The number of required arguments (default:
+      0).
+
+    - `optional_arguments`: The number of optional arguments (default:
+      0).
+
+    - `final_argument_whitespace`: A boolean, indicating if the final
+      argument may contain whitespace (default: False).
+
+    - `option_spec`: A dictionary, mapping known option names to
+      conversion functions such as `int` or `float` (default: {}, no
+      options).  Several conversion functions are defined in the
+      directives/__init__.py module.
+
+      Option conversion functions take a single parameter, the option
+      argument (a string or ``None``), validate it and/or convert it
+      to the appropriate form.  Conversion functions may raise
+      `ValueError` and `TypeError` exceptions.
+
+    - `has_content`: A boolean; True if content is allowed.  Client
+      code must handle the case where content is required but not
+      supplied (an empty content list will be supplied).
+
+    Arguments are normally single whitespace-separated words.  The
+    final argument may contain whitespace and/or newlines if
+    `final_argument_whitespace` is True.
+
+    If the form of the arguments is more complex, specify only one
+    argument (either required or optional) and set
+    `final_argument_whitespace` to True; the client code must do any
+    context-sensitive parsing.
+
+    When a directive implementation is being run, the directive class
+    is instantiated, and the `run()` method is executed.  During
+    instantiation, the following instance variables are set:
+
+    - ``name`` is the directive type or name (string).
+
+    - ``arguments`` is the list of positional arguments (strings).
+
+    - ``options`` is a dictionary mapping option names (strings) to
+      values (type depends on option conversion functions; see
+      `option_spec` above).
+
+    - ``content`` is a list of strings, the directive content line by line.
+
+    - ``lineno`` is the line number of the first line of the directive.
+
+    - ``content_offset`` is the line offset of the first line of the content from
+      the beginning of the current input.  Used when initiating a nested parse.
+
+    - ``block_text`` is a string containing the entire directive.
+
+    - ``state`` is the state which called the directive function.
+
+    - ``state_machine`` is the state machine which controls the state which called
+      the directive function.
+
+    Directive functions return a list of nodes which will be inserted
+    into the document tree at the point where the directive was
+    encountered.  This can be an empty list if there is nothing to
+    insert.
+
+    For ordinary directives, the list must contain body elements or
+    structural elements.  Some directives are intended specifically
+    for substitution definitions, and must return a list of `Text`
+    nodes and/or inline elements (suitable for inline insertion, in
+    place of the substitution reference).  Such directives must verify
+    substitution definition context, typically using code like this::
+
+        if not isinstance(state, states.SubstitutionDef):
+            error = state_machine.reporter.error(
+                'Invalid context: the "%s" directive can only be used '
+                'within a substitution definition.' % (name),
+                nodes.literal_block(block_text, block_text), line=lineno)
+            return [error]
+    """
+
+    # There is a "Creating reStructuredText Directives" how-to at
+    # <http://docutils.sf.net/docs/howto/rst-directives.html>.  If you
+    # update this docstring, please update the how-to as well.
+
+    required_arguments = 0
+    """Number of required directive arguments."""
+
+    optional_arguments = 0
+    """Number of optional arguments after the required arguments."""
+
+    final_argument_whitespace = False
+    """May the final argument contain whitespace?"""
+
+    option_spec = None
+    """Mapping of option names to validator functions."""
+
+    has_content = False
+    """May the directive have content?"""
+
+    def __init__(self, name, arguments, options, content, lineno,
+                 content_offset, block_text, state, state_machine):
+        self.name = name
+        self.arguments = arguments
+        self.options = options
+        self.content = content
+        self.lineno = lineno
+        self.content_offset = content_offset
+        self.block_text = block_text
+        self.state = state
+        self.state_machine = state_machine
+
+    def run(self):
+        raise NotImplementedError('Must override run() is subclass.')
+
+    # Directive errors:
+
+    def directive_error(self, level, message):
+        """
+        Return a DirectiveError suitable for being thrown as an exception.
+
+        Call "raise self.directive_error(level, message)" from within
+        a directive implementation to return one single system message
+        at level `level`, which automatically gets the directive block
+        and the line number added.
+
+        You'd often use self.error(message) instead, which will
+        generate an ERROR-level directive error.
+        """
+        return DirectiveError(level, message)
+
+    def debug(self, message):
+        return self.directive_error(0, message)
+
+    def info(self, message):
+        return self.directive_error(1, message)
+
+    def warning(self, message):
+        return self.directive_error(2, message)
+
+    def error(self, message):
+        return self.directive_error(3, message)
+
+    def severe(self, message):
+        return self.directive_error(4, message)
+
+    # Convenience methods:
+
+    def assert_has_content(self):
+        """
+        Throw an ERROR-level DirectiveError if the directive doesn't
+        have contents.
+        """
+        if not self.content:
+            raise self.error('Content block expected for the "%s" directive; '
+                             'none found.' % self.name)
+
+
+def convert_directive_function(directive_fn):
+    """
+    Define & return a directive class generated from `directive_fn`.
+
+    `directive_fn` uses the old-style, functional interface.
+    """
+
+    class FunctionalDirective(Directive):
+
+        option_spec = getattr(directive_fn, 'options', None)
+        has_content = getattr(directive_fn, 'content', False)
+        _argument_spec = getattr(directive_fn, 'arguments', (0, 0, False))
+        required_arguments, optional_arguments, final_argument_whitespace \
+            = _argument_spec
+
+        def run(self):
+            return directive_fn(
+                self.name, self.arguments, self.options, self.content,
+                self.lineno, self.content_offset, self.block_text,
+                self.state, self.state_machine)
+
+    # Return new-style directive.
+    return FunctionalDirective
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,367 @@
+# $Id: __init__.py 4667 2006-07-12 21:40:56Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains directive implementation modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+import codecs
+from docutils import nodes
+from docutils.parsers.rst.languages import en as _fallback_language_module
+
+
+_directive_registry = {
+      'attention': ('admonitions', 'Attention'),
+      'caution': ('admonitions', 'Caution'),
+      'danger': ('admonitions', 'Danger'),
+      'error': ('admonitions', 'Error'),
+      'important': ('admonitions', 'Important'),
+      'note': ('admonitions', 'Note'),
+      'tip': ('admonitions', 'Tip'),
+      'hint': ('admonitions', 'Hint'),
+      'warning': ('admonitions', 'Warning'),
+      'admonition': ('admonitions', 'Admonition'),
+      'sidebar': ('body', 'Sidebar'),
+      'topic': ('body', 'Topic'),
+      'line-block': ('body', 'LineBlock'),
+      'parsed-literal': ('body', 'ParsedLiteral'),
+      'rubric': ('body', 'Rubric'),
+      'epigraph': ('body', 'Epigraph'),
+      'highlights': ('body', 'Highlights'),
+      'pull-quote': ('body', 'PullQuote'),
+      'compound': ('body', 'Compound'),
+      'container': ('body', 'Container'),
+      #'questions': ('body', 'question_list'),
+      'table': ('tables', 'RSTTable'),
+      'csv-table': ('tables', 'CSVTable'),
+      'list-table': ('tables', 'ListTable'),
+      'image': ('images', 'Image'),
+      'figure': ('images', 'Figure'),
+      'contents': ('parts', 'Contents'),
+      'sectnum': ('parts', 'Sectnum'),
+      'header': ('parts', 'Header'),
+      'footer': ('parts', 'Footer'),
+      #'footnotes': ('parts', 'footnotes'),
+      #'citations': ('parts', 'citations'),
+      'target-notes': ('references', 'TargetNotes'),
+      'meta': ('html', 'Meta'),
+      #'imagemap': ('html', 'imagemap'),
+      'raw': ('misc', 'Raw'),
+      'include': ('misc', 'Include'),
+      'replace': ('misc', 'Replace'),
+      'unicode': ('misc', 'Unicode'),
+      'class': ('misc', 'Class'),
+      'role': ('misc', 'Role'),
+      'default-role': ('misc', 'DefaultRole'),
+      'title': ('misc', 'Title'),
+      'date': ('misc', 'Date'),
+      'restructuredtext-test-directive': ('misc', 'TestDirective'),}
+"""Mapping of directive name to (module name, class name).  The
+directive name is canonical & must be lowercase.  Language-dependent
+names are defined in the ``language`` subpackage."""
+
+_directives = {}
+"""Cache of imported directives."""
+
+def directive(directive_name, language_module, document):
+    """
+    Locate and return a directive function from its language-dependent name.
+    If not found in the current language, check English.  Return None if the
+    named directive cannot be found.
+    """
+    normname = directive_name.lower()
+    messages = []
+    msg_text = []
+    if _directives.has_key(normname):
+        return _directives[normname], messages
+    canonicalname = None
+    try:
+        canonicalname = language_module.directives[normname]
+    except AttributeError, error:
+        msg_text.append('Problem retrieving directive entry from language '
+                        'module %r: %s.' % (language_module, error))
+    except KeyError:
+        msg_text.append('No directive entry for "%s" in module "%s".'
+                        % (directive_name, language_module.__name__))
+    if not canonicalname:
+        try:
+            canonicalname = _fallback_language_module.directives[normname]
+            msg_text.append('Using English fallback for directive "%s".'
+                            % directive_name)
+        except KeyError:
+            msg_text.append('Trying "%s" as canonical directive name.'
+                            % directive_name)
+            # The canonical name should be an English name, but just in case:
+            canonicalname = normname
+    if msg_text:
+        message = document.reporter.info(
+            '\n'.join(msg_text), line=document.current_line)
+        messages.append(message)
+    try:
+        modulename, classname = _directive_registry[canonicalname]
+    except KeyError:
+        # Error handling done by caller.
+        return None, messages
+    try:
+        module = __import__(modulename, globals(), locals())
+    except ImportError, detail:
+        messages.append(document.reporter.error(
+            'Error importing directive module "%s" (directive "%s"):\n%s'
+            % (modulename, directive_name, detail),
+            line=document.current_line))
+        return None, messages
+    try:
+        directive = getattr(module, classname)
+        _directives[normname] = directive
+    except AttributeError:
+        messages.append(document.reporter.error(
+            'No directive class "%s" in module "%s" (directive "%s").'
+            % (classname, modulename, directive_name),
+            line=document.current_line))
+        return None, messages
+    return directive, messages
+
+def register_directive(name, directive):
+    """
+    Register a nonstandard application-defined directive function.
+    Language lookups are not needed for such functions.
+    """
+    _directives[name] = directive
+
+def flag(argument):
+    """
+    Check for a valid flag option (no argument) and return ``None``.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if an argument is found.
+    """
+    if argument and argument.strip():
+        raise ValueError('no argument is allowed; "%s" supplied' % argument)
+    else:
+        return None
+
+def unchanged_required(argument):
+    """
+    Return the argument text, unchanged.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    else:
+        return argument  # unchanged!
+
+def unchanged(argument):
+    """
+    Return the argument text, unchanged.
+    (Directive option conversion function.)
+
+    No argument implies empty string ("").
+    """
+    if argument is None:
+        return u''
+    else:
+        return argument  # unchanged!
+
+def path(argument):
+    """
+    Return the path argument unwrapped (with newlines removed).
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    else:
+        path = ''.join([s.strip() for s in argument.splitlines()])
+        return path
+
+def uri(argument):
+    """
+    Return the URI argument with whitespace removed.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    else:
+        uri = ''.join(argument.split())
+        return uri
+
+def nonnegative_int(argument):
+    """
+    Check for a nonnegative integer argument; raise ``ValueError`` if not.
+    (Directive option conversion function.)
+    """
+    value = int(argument)
+    if value < 0:
+        raise ValueError('negative value; must be positive or zero')
+    return value
+
+length_units = ['em', 'ex', 'px', 'in', 'cm', 'mm', 'pt', 'pc']
+
+def get_measure(argument, units):
+    """
+    Check for a positive argument of one of the units and return a
+    normalized string of the form "<value><unit>" (without space in
+    between).
+    
+    To be called from directive option conversion functions.
+    """
+    match = re.match(r'^([0-9.]+) *(%s)$' % '|'.join(units), argument)
+    try:
+        assert match is not None
+        float(match.group(1))
+    except (AssertionError, ValueError):
+        raise ValueError(
+            'not a positive measure of one of the following units:\n%s'
+            % ' '.join(['"%s"' % i for i in units]))
+    return match.group(1) + match.group(2)
+
+def length_or_unitless(argument):
+    return get_measure(argument, length_units + [''])
+
+def length_or_percentage_or_unitless(argument):
+    return get_measure(argument, length_units + ['%', ''])
+
+def class_option(argument):
+    """
+    Convert the argument into a list of ID-compatible strings and return it.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    names = argument.split()
+    class_names = []
+    for name in names:
+        class_name = nodes.make_id(name)
+        if not class_name:
+            raise ValueError('cannot make "%s" into a class name' % name)
+        class_names.append(class_name)
+    return class_names
+
+unicode_pattern = re.compile(
+    r'(?:0x|x|\\x|U\+?|\\u)([0-9a-f]+)$|&#x([0-9a-f]+);$', re.IGNORECASE)
+
+def unicode_code(code):
+    r"""
+    Convert a Unicode character code to a Unicode character.
+    (Directive option conversion function.)
+
+    Codes may be decimal numbers, hexadecimal numbers (prefixed by ``0x``,
+    ``x``, ``\x``, ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style
+    numeric character entities (e.g. ``&#x262E;``).  Other text remains as-is.
+
+    Raise ValueError for illegal Unicode code values.
+    """
+    try:
+        if code.isdigit():                  # decimal number
+            return unichr(int(code))
+        else:
+            match = unicode_pattern.match(code)
+            if match:                       # hex number
+                value = match.group(1) or match.group(2)
+                return unichr(int(value, 16))
+            else:                           # other text
+                return code
+    except OverflowError, detail:
+        raise ValueError('code too large (%s)' % detail)
+
+def single_char_or_unicode(argument):
+    """
+    A single character is returned as-is.  Unicode characters codes are
+    converted as in `unicode_code`.  (Directive option conversion function.)
+    """
+    char = unicode_code(argument)
+    if len(char) > 1:
+        raise ValueError('%r invalid; must be a single character or '
+                         'a Unicode code' % char)
+    return char
+
+def single_char_or_whitespace_or_unicode(argument):
+    """
+    As with `single_char_or_unicode`, but "tab" and "space" are also supported.
+    (Directive option conversion function.)
+    """
+    if argument == 'tab':
+        char = '\t'
+    elif argument == 'space':
+        char = ' '
+    else:
+        char = single_char_or_unicode(argument)
+    return char
+
+def positive_int(argument):
+    """
+    Converts the argument into an integer.  Raises ValueError for negative,
+    zero, or non-integer values.  (Directive option conversion function.)
+    """
+    value = int(argument)
+    if value < 1:
+        raise ValueError('negative or zero value; must be positive')
+    return value
+
+def positive_int_list(argument):
+    """
+    Converts a space- or comma-separated list of values into a Python list
+    of integers.
+    (Directive option conversion function.)
+
+    Raises ValueError for non-positive-integer values.
+    """
+    if ',' in argument:
+        entries = argument.split(',')
+    else:
+        entries = argument.split()
+    return [positive_int(entry) for entry in entries]
+
+def encoding(argument):
+    """
+    Verfies the encoding argument by lookup.
+    (Directive option conversion function.)
+
+    Raises ValueError for unknown encodings.
+    """
+    try:
+        codecs.lookup(argument)
+    except LookupError:
+        raise ValueError('unknown encoding: "%s"' % argument)
+    return argument
+
+def choice(argument, values):
+    """
+    Directive option utility function, supplied to enable options whose
+    argument must be a member of a finite set of possible values (must be
+    lower case).  A custom conversion function must be written to use it.  For
+    example::
+
+        from docutils.parsers.rst import directives
+
+        def yesno(argument):
+            return directives.choice(argument, ('yes', 'no'))
+
+    Raise ``ValueError`` if no argument is found or if the argument's value is
+    not valid (not an entry in the supplied list).
+    """
+    try:
+        value = argument.lower().strip()
+    except AttributeError:
+        raise ValueError('must supply an argument; choose from %s'
+                         % format_values(values))
+    if value in values:
+        return value
+    else:
+        raise ValueError('"%s" unknown; choose from %s'
+                         % (argument, format_values(values)))
+
+def format_values(values):
+    return '%s, or "%s"' % (', '.join(['"%s"' % s for s in values[:-1]]),
+                            values[-1])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/admonitions.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,97 @@
+# $Id: admonitions.py 4667 2006-07-12 21:40:56Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Admonition directives.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import states, directives
+from docutils import nodes
+
+
+class BaseAdmonition(Directive):
+
+    required_arguments = 0
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {}
+    has_content = True
+
+    node_class = None
+    """Subclasses must set this to the appropriate admonition node class."""
+
+    def run(self):
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        admonition_node = self.node_class(text)
+        if self.arguments:
+            title_text = self.arguments[0]
+            textnodes, messages = self.state.inline_text(title_text,
+                                                         self.lineno)
+            admonition_node += nodes.title(title_text, '', *textnodes)
+            admonition_node += messages
+            if self.options.has_key('class'):
+                classes = self.options['class']
+            else:
+                classes = ['admonition-' + nodes.make_id(title_text)]
+            admonition_node['classes'] += classes
+        self.state.nested_parse(self.content, self.content_offset,
+                                admonition_node)
+        return [admonition_node]
+
+
+class Admonition(BaseAdmonition):
+
+    required_arguments = 1
+    option_spec = {'class': directives.class_option}
+    node_class = nodes.admonition
+
+
+class Attention(BaseAdmonition):
+
+    node_class = nodes.attention
+
+
+class Caution(BaseAdmonition):
+
+    node_class = nodes.caution
+
+
+class Danger(BaseAdmonition):
+
+    node_class = nodes.danger
+
+
+class Error(BaseAdmonition):
+
+    node_class = nodes.error
+
+
+class Hint(BaseAdmonition):
+
+    node_class = nodes.hint
+
+
+class Important(BaseAdmonition):
+
+    node_class = nodes.important
+
+
+class Note(BaseAdmonition):
+
+    node_class = nodes.note
+
+
+class Tip(BaseAdmonition):
+
+    node_class = nodes.tip
+
+
+class Warning(BaseAdmonition):
+
+    node_class = nodes.warning
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/body.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,192 @@
+# $Id: body.py 4667 2006-07-12 21:40:56Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for additional body elements.
+
+See `docutils.parsers.rst.directives` for API details.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+from docutils import nodes
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.roles import set_classes
+
+
+class BasePseudoSection(Directive):
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'class': directives.class_option}
+    has_content = True
+
+    node_class = None
+    """Node class to be used (must be set in subclasses)."""
+
+    def run(self):
+        if not (self.state_machine.match_titles
+                or isinstance(self.state_machine.node, nodes.sidebar)):
+            raise self.error('The "%s" directive may not be used within '
+                             'topics or body elements.' % self.name)
+        self.assert_has_content()
+        title_text = self.arguments[0]
+        textnodes, messages = self.state.inline_text(title_text, self.lineno)
+        titles = [nodes.title(title_text, '', *textnodes)]
+        # Sidebar uses this code.
+        if self.options.has_key('subtitle'):
+            textnodes, more_messages = self.state.inline_text(
+                self.options['subtitle'], self.lineno)
+            titles.append(nodes.subtitle(self.options['subtitle'], '',
+                                         *textnodes))
+            messages.extend(more_messages)
+        text = '\n'.join(self.content)
+        node = self.node_class(text, *(titles + messages))
+        node['classes'] += self.options.get('class', [])
+        if text:
+            self.state.nested_parse(self.content, self.content_offset, node)
+        return [node]
+
+
+class Topic(BasePseudoSection):
+
+    node_class = nodes.topic
+
+
+class Sidebar(BasePseudoSection):
+
+    node_class = nodes.sidebar
+
+    option_spec = BasePseudoSection.option_spec.copy()
+    option_spec['subtitle'] = directives.unchanged_required
+
+    def run(self):
+        if isinstance(self.state_machine.node, nodes.sidebar):
+            raise self.error('The "%s" directive may not be used within a '
+                             'sidebar element.' % self.name)
+        return BasePseudoSection.run(self)
+
+
+class LineBlock(Directive):
+
+    option_spec = {'class': directives.class_option}
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        block = nodes.line_block(classes=self.options.get('class', []))
+        node_list = [block]
+        for line_text in self.content:
+            text_nodes, messages = self.state.inline_text(
+                line_text.strip(), self.lineno + self.content_offset)
+            line = nodes.line(line_text, '', *text_nodes)
+            if line_text.strip():
+                line.indent = len(line_text) - len(line_text.lstrip())
+            block += line
+            node_list.extend(messages)
+            self.content_offset += 1
+        self.state.nest_line_block_lines(block)
+        return node_list
+
+
+class ParsedLiteral(Directive):
+
+    option_spec = {'class': directives.class_option}
+    has_content = True
+
+    def run(self):
+        set_classes(self.options)
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        text_nodes, messages = self.state.inline_text(text, self.lineno)
+        node = nodes.literal_block(text, '', *text_nodes, **self.options)
+        node.line = self.content_offset + 1
+        return [node] + messages
+
+
+class Rubric(Directive):
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'class': directives.class_option}
+
+    def run(self):
+        set_classes(self.options)
+        rubric_text = self.arguments[0]
+        textnodes, messages = self.state.inline_text(rubric_text, self.lineno)
+        rubric = nodes.rubric(rubric_text, '', *textnodes, **self.options)
+        return [rubric] + messages
+
+
+class BlockQuote(Directive):
+
+    has_content = True
+    classes = []
+
+    def run(self):
+        self.assert_has_content()
+        elements = self.state.block_quote(self.content, self.content_offset)
+        for element in elements:
+            if isinstance(element, nodes.block_quote):
+                element['classes'] += self.classes
+        return elements
+
+
+class Epigraph(BlockQuote):
+
+    classes = ['epigraph']
+
+
+class Highlights(BlockQuote):
+
+    classes = ['highlights']
+
+
+class PullQuote(BlockQuote):
+
+    classes = ['pull-quote']
+
+
+class Compound(Directive):
+
+    option_spec = {'class': directives.class_option}
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        node = nodes.compound(text)
+        node['classes'] += self.options.get('class', [])
+        self.state.nested_parse(self.content, self.content_offset, node)
+        return [node]
+
+
+class Container(Directive):
+
+    required_arguments = 0
+    optional_arguments = 1
+    final_argument_whitespace = True
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        try:
+            if self.arguments:
+                classes = directives.class_option(self.arguments[0])
+            else:
+                classes = []
+        except ValueError:
+            raise self.error(
+                'Invalid class attribute value for "%s" directive: "%s".'
+                % (self.name, self.arguments[0]))
+        node = nodes.container(text)
+        node['classes'].extend(classes)
+        self.state.nested_parse(self.content, self.content_offset, node)
+        return [node]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/html.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,88 @@
+# $Id: html.py 4667 2006-07-12 21:40:56Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for typically HTML-specific constructs.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+from docutils import nodes, utils
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import states
+from docutils.transforms import components
+
+
+class MetaBody(states.SpecializedBody):
+
+    class meta(nodes.Special, nodes.PreBibliographic, nodes.Element):
+        """HTML-specific "meta" element."""
+        pass
+
+    def field_marker(self, match, context, next_state):
+        """Meta element."""
+        node, blank_finish = self.parsemeta(match)
+        self.parent += node
+        return [], next_state, []
+
+    def parsemeta(self, match):
+        name = self.parse_field_marker(match)
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        node = self.meta()
+        pending = nodes.pending(components.Filter,
+                                {'component': 'writer',
+                                 'format': 'html',
+                                 'nodes': [node]})
+        node['content'] = ' '.join(indented)
+        if not indented:
+            line = self.state_machine.line
+            msg = self.reporter.info(
+                  'No content for meta tag "%s".' % name,
+                  nodes.literal_block(line, line),
+                  line=self.state_machine.abs_line_number())
+            return msg, blank_finish
+        tokens = name.split()
+        try:
+            attname, val = utils.extract_name_value(tokens[0])[0]
+            node[attname.lower()] = val
+        except utils.NameValueError:
+            node['name'] = tokens[0]
+        for token in tokens[1:]:
+            try:
+                attname, val = utils.extract_name_value(token)[0]
+                node[attname.lower()] = val
+            except utils.NameValueError, detail:
+                line = self.state_machine.line
+                msg = self.reporter.error(
+                      'Error parsing meta tag attribute "%s": %s.'
+                      % (token, detail), nodes.literal_block(line, line),
+                      line=self.state_machine.abs_line_number())
+                return msg, blank_finish
+        self.document.note_pending(pending)
+        return pending, blank_finish
+
+
+class Meta(Directive):
+
+    has_content = True
+
+    SMkwargs = {'state_classes': (MetaBody,)}
+
+    def run(self):
+        self.assert_has_content()
+        node = nodes.Element()
+        new_line_offset, blank_finish = self.state.nested_list_parse(
+            self.content, self.content_offset, node,
+            initial_state='MetaBody', blank_finish=1,
+            state_machine_kwargs=self.SMkwargs)
+        if (new_line_offset - self.content_offset) != len(self.content):
+            # incomplete parse of block?
+            error = self.state_machine.reporter.error(
+                'Invalid meta directive.',
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            node += error
+        return node.children
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/images.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,160 @@
+# $Id: images.py 4667 2006-07-12 21:40:56Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for figures and simple images.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+from docutils import nodes, utils
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives, states
+from docutils.nodes import fully_normalize_name, whitespace_normalize_name
+from docutils.parsers.rst.roles import set_classes
+
+try:
+    import Image as PIL                        # PIL
+except ImportError:
+    PIL = None
+
+
+class Image(Directive):
+
+    align_h_values = ('left', 'center', 'right')
+    align_v_values = ('top', 'middle', 'bottom')
+    align_values = align_v_values + align_h_values
+
+    def align(argument):
+        # This is not callable as self.align.  We cannot make it a
+        # staticmethod because we're saving an unbound method in
+        # option_spec below.
+        return directives.choice(argument, Image.align_values)
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'alt': directives.unchanged,
+                   'height': directives.length_or_unitless,
+                   'width': directives.length_or_percentage_or_unitless,
+                   'scale': directives.nonnegative_int,
+                   'align': align,
+                   'target': directives.unchanged_required,
+                   'class': directives.class_option}
+
+    def run(self):
+        if self.options.has_key('align'):
+            if isinstance(self.state, states.SubstitutionDef):
+                # Check for align_v_values.
+                if self.options['align'] not in self.align_v_values:
+                    raise self.error(
+                        'Error in "%s" directive: "%s" is not a valid value '
+                        'for the "align" option within a substitution '
+                        'definition.  Valid values for "align" are: "%s".'
+                        % (self.name, self.options['align'],
+                           '", "'.join(self.align_v_values)))
+            elif self.options['align'] not in self.align_h_values:
+                raise self.error(
+                    'Error in "%s" directive: "%s" is not a valid value for '
+                    'the "align" option.  Valid values for "align" are: "%s".'
+                    % (self.name, self.options['align'],
+                       '", "'.join(self.align_h_values)))
+        messages = []
+        reference = directives.uri(self.arguments[0])
+        self.options['uri'] = reference
+        reference_node = None
+        if self.options.has_key('target'):
+            block = states.escape2null(
+                self.options['target']).splitlines()
+            block = [line for line in block]
+            target_type, data = self.state.parse_target(
+                block, self.block_text, self.lineno)
+            if target_type == 'refuri':
+                reference_node = nodes.reference(refuri=data)
+            elif target_type == 'refname':
+                reference_node = nodes.reference(
+                    refname=fully_normalize_name(data),
+                    name=whitespace_normalize_name(data))
+                reference_node.indirect_reference_name = data
+                self.state.document.note_refname(reference_node)
+            else:                           # malformed target
+                messages.append(data)       # data is a system message
+            del self.options['target']
+        set_classes(self.options)
+        image_node = nodes.image(self.block_text, **self.options)
+        if reference_node:
+            reference_node += image_node
+            return messages + [reference_node]
+        else:
+            return messages + [image_node]
+
+
+class Figure(Image):
+
+    def align(argument):
+        return directives.choice(argument, Figure.align_h_values)
+
+    def figwidth_value(argument):
+        if argument.lower() == 'image':
+            return 'image'
+        else:
+            return directives.nonnegative_int(argument)
+
+    option_spec = Image.option_spec.copy()
+    option_spec['figwidth'] = figwidth_value
+    option_spec['figclass'] = directives.class_option
+    option_spec['align'] = align
+    has_content = True
+
+    def run(self):
+        figwidth = self.options.get('figwidth')
+        if figwidth:
+            del self.options['figwidth']
+        figclasses = self.options.get('figclass')
+        if figclasses:
+            del self.options['figclass']
+        align = self.options.get('align')
+        if align:
+            del self.options['align']
+        (image_node,) = Image.run(self)
+        if isinstance(image_node, nodes.system_message):
+            return [image_node]
+        figure_node = nodes.figure('', image_node)
+        if figwidth == 'image':
+            if PIL and self.state.document.settings.file_insertion_enabled:
+                # PIL doesn't like Unicode paths:
+                try:
+                    i = PIL.open(str(image_node['uri']))
+                except (IOError, UnicodeError):
+                    pass
+                else:
+                    self.state.document.settings.record_dependencies.add(
+                        image_node['uri'])
+                    figure_node['width'] = i.size[0]
+        elif figwidth is not None:
+            figure_node['width'] = figwidth
+        if figclasses:
+            figure_node['classes'] += figclasses
+        if align:
+            figure_node['align'] = align
+        if self.content:
+            node = nodes.Element()          # anonymous container for parsing
+            self.state.nested_parse(self.content, self.content_offset, node)
+            first_node = node[0]
+            if isinstance(first_node, nodes.paragraph):
+                caption = nodes.caption(first_node.rawsource, '',
+                                        *first_node.children)
+                figure_node += caption
+            elif not (isinstance(first_node, nodes.comment)
+                      and len(first_node) == 0):
+                error = self.state_machine.reporter.error(
+                      'Figure caption must be a paragraph or empty comment.',
+                      nodes.literal_block(self.block_text, self.block_text),
+                      line=self.lineno)
+                return [figure_node, error]
+            if len(node) > 1:
+                figure_node += nodes.legend('', *node[1:])
+        return [figure_node]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/misc.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,462 @@
+# $Id: misc.py 5015 2007-03-12 20:25:40Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Dethe Elza
+# Copyright: This module has been placed in the public domain.
+
+"""Miscellaneous directives."""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os.path
+import re
+import time
+from docutils import io, nodes, statemachine, utils
+from docutils.parsers.rst import Directive, convert_directive_function
+from docutils.parsers.rst import directives, roles, states
+from docutils.transforms import misc
+
+
+class Include(Directive):
+
+    """
+    Include content read from a separate source file.
+
+    Content may be parsed by the parser, or included as a literal
+    block.  The encoding of the included file can be specified.  Only
+    a part of the given file argument may be included by specifying
+    text to match before and/or after the text to be used.
+    """
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'literal': directives.flag,
+                   'encoding': directives.encoding,
+                   'start-after': directives.unchanged_required,
+                   'end-before': directives.unchanged_required}
+
+    standard_include_path = os.path.join(os.path.dirname(states.__file__),
+                                         'include')
+
+    def run(self):
+        """Include a reST file as part of the content of this reST file."""
+        if not self.state.document.settings.file_insertion_enabled:
+            raise self.warning('"%s" directive disabled.' % self.name)
+        source = self.state_machine.input_lines.source(
+            self.lineno - self.state_machine.input_offset - 1)
+        source_dir = os.path.dirname(os.path.abspath(source))
+        path = directives.path(self.arguments[0])
+        if path.startswith('<') and path.endswith('>'):
+            path = os.path.join(self.standard_include_path, path[1:-1])
+        path = os.path.normpath(os.path.join(source_dir, path))
+        path = utils.relative_path(None, path)
+        encoding = self.options.get(
+            'encoding', self.state.document.settings.input_encoding)
+        try:
+            self.state.document.settings.record_dependencies.add(path)
+            include_file = io.FileInput(
+                source_path=path, encoding=encoding,
+                error_handler=(self.state.document.settings.\
+                               input_encoding_error_handler),
+                handle_io_errors=None)
+        except IOError, error:
+            raise self.severe('Problems with "%s" directive path:\n%s: %s.'
+                              % (self.name, error.__class__.__name__, error))
+        try:
+            include_text = include_file.read()
+        except UnicodeError, error:
+            raise self.severe(
+                'Problem with "%s" directive:\n%s: %s'
+                % (self.name, error.__class__.__name__, error))
+        # start-after/end-before: no restrictions on newlines in match-text,
+        # and no restrictions on matching inside lines vs. line boundaries
+        after_text = self.options.get('start-after', None)
+        if after_text:
+            # skip content in include_text before *and incl.* a matching text
+            after_index = include_text.find(after_text)
+            if after_index < 0:
+                raise self.severe('Problem with "start-after" option of "%s" '
+                                  'directive:\nText not found.' % self.name)
+            include_text = include_text[after_index + len(after_text):]
+        before_text = self.options.get('end-before', None)
+        if before_text:
+            # skip content in include_text after *and incl.* a matching text
+            before_index = include_text.find(before_text)
+            if before_index < 0:
+                raise self.severe('Problem with "end-before" option of "%s" '
+                                  'directive:\nText not found.' % self.name)
+            include_text = include_text[:before_index]
+        if self.options.has_key('literal'):
+            literal_block = nodes.literal_block(include_text, include_text,
+                                                source=path)
+            literal_block.line = 1
+            return [literal_block]
+        else:
+            include_lines = statemachine.string2lines(include_text,
+                                                      convert_whitespace=1)
+            self.state_machine.insert_input(include_lines, path)
+            return []
+
+
+class Raw(Directive):
+
+    """
+    Pass through content unchanged
+
+    Content is included in output based on type argument
+
+    Content may be included inline (content section of directive) or
+    imported from a file or url.
+    """
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'file': directives.path,
+                   'url': directives.uri,
+                   'encoding': directives.encoding}
+    has_content = True
+
+    def run(self):
+        if (not self.state.document.settings.raw_enabled
+            or (not self.state.document.settings.file_insertion_enabled
+                and (self.options.has_key('file')
+                     or self.options.has_key('url')))):
+            raise self.warning('"%s" directive disabled.' % self.name)
+        attributes = {'format': ' '.join(self.arguments[0].lower().split())}
+        encoding = self.options.get(
+            'encoding', self.state.document.settings.input_encoding)
+        if self.content:
+            if self.options.has_key('file') or self.options.has_key('url'):
+                raise self.error(
+                    '"%s" directive may not both specify an external file '
+                    'and have content.' % self.name)
+            text = '\n'.join(self.content)
+        elif self.options.has_key('file'):
+            if self.options.has_key('url'):
+                raise self.error(
+                    'The "file" and "url" options may not be simultaneously '
+                    'specified for the "%s" directive.' % self.name)
+            source_dir = os.path.dirname(
+                os.path.abspath(self.state.document.current_source))
+            path = os.path.normpath(os.path.join(source_dir,
+                                                 self.options['file']))
+            path = utils.relative_path(None, path)
+            try:
+                self.state.document.settings.record_dependencies.add(path)
+                raw_file = io.FileInput(
+                    source_path=path, encoding=encoding,
+                    error_handler=(self.state.document.settings.\
+                                   input_encoding_error_handler),
+                    handle_io_errors=None)
+            except IOError, error:
+                raise self.severe('Problems with "%s" directive path:\n%s.'
+                                  % (self.name, error))
+            try:
+                text = raw_file.read()
+            except UnicodeError, error:
+                raise self.severe(
+                    'Problem with "%s" directive:\n%s: %s'
+                    % (self.name, error.__class__.__name__, error))
+            attributes['source'] = path
+        elif self.options.has_key('url'):
+            source = self.options['url']
+            # Do not import urllib2 at the top of the module because
+            # it may fail due to broken SSL dependencies, and it takes
+            # about 0.15 seconds to load.
+            import urllib2
+            try:
+                raw_text = urllib2.urlopen(source).read()
+            except (urllib2.URLError, IOError, OSError), error:
+                raise self.severe(
+                    'Problems with "%s" directive URL "%s":\n%s.'
+                    % (self.name, self.options['url'], error))
+            raw_file = io.StringInput(
+                source=raw_text, source_path=source, encoding=encoding,
+                error_handler=(self.state.document.settings.\
+                               input_encoding_error_handler))
+            try:
+                text = raw_file.read()
+            except UnicodeError, error:
+                raise self.severe(
+                    'Problem with "%s" directive:\n%s: %s'
+                    % (self.name, error.__class__.__name__, error))
+            attributes['source'] = source
+        else:
+            # This will always fail because there is no content.
+            self.assert_has_content()
+        raw_node = nodes.raw('', text, **attributes)
+        return [raw_node]
+
+
+class Replace(Directive):
+
+    has_content = True
+
+    def run(self):
+        if not isinstance(self.state, states.SubstitutionDef):
+            raise self.error(
+                'Invalid context: the "%s" directive can only be used within '
+                'a substitution definition.' % self.name)
+        self.assert_has_content()
+        text = '\n'.join(self.content)
+        element = nodes.Element(text)
+        self.state.nested_parse(self.content, self.content_offset,
+                                element)
+        if ( len(element) != 1
+             or not isinstance(element[0], nodes.paragraph)):
+            messages = []
+            for node in element:
+                if isinstance(node, nodes.system_message):
+                    node['backrefs'] = []
+                    messages.append(node)
+            error = self.state_machine.reporter.error(
+                'Error in "%s" directive: may contain a single paragraph '
+                'only.' % (self.name), line=self.lineno)
+            messages.append(error)
+            return messages
+        else:
+            return element[0].children
+
+
+class Unicode(Directive):
+
+    r"""
+    Convert Unicode character codes (numbers) to characters.  Codes may be
+    decimal numbers, hexadecimal numbers (prefixed by ``0x``, ``x``, ``\x``,
+    ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style numeric character
+    entities (e.g. ``&#x262E;``).  Text following ".." is a comment and is
+    ignored.  Spaces are ignored, and any other text remains as-is.
+    """
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    option_spec = {'trim': directives.flag,
+                   'ltrim': directives.flag,
+                   'rtrim': directives.flag}
+
+    comment_pattern = re.compile(r'( |\n|^)\.\. ')
+
+    def run(self):
+        if not isinstance(self.state, states.SubstitutionDef):
+            raise self.error(
+                'Invalid context: the "%s" directive can only be used within '
+                'a substitution definition.' % self.name)
+        substitution_definition = self.state_machine.node
+        if self.options.has_key('trim'):
+            substitution_definition.attributes['ltrim'] = 1
+            substitution_definition.attributes['rtrim'] = 1
+        if self.options.has_key('ltrim'):
+            substitution_definition.attributes['ltrim'] = 1
+        if self.options.has_key('rtrim'):
+            substitution_definition.attributes['rtrim'] = 1
+        codes = self.comment_pattern.split(self.arguments[0])[0].split()
+        element = nodes.Element()
+        for code in codes:
+            try:
+                decoded = directives.unicode_code(code)
+            except ValueError, err:
+                raise self.error(
+                    'Invalid character code: %s\n%s: %s'
+                    % (code, err.__class__.__name__, err))
+            element += nodes.Text(decoded)
+        return element.children
+
+
+class Class(Directive):
+
+    """
+    Set a "class" attribute on the directive content or the next element.
+    When applied to the next element, a "pending" element is inserted, and a
+    transform does the work later.
+    """
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+    has_content = True
+
+    def run(self):
+        try:
+            class_value = directives.class_option(self.arguments[0])
+        except ValueError:
+            raise self.error(
+                'Invalid class attribute value for "%s" directive: "%s".'
+                % (self.name, self.arguments[0]))
+        node_list = []
+        if self.content:
+            container = nodes.Element()
+            self.state.nested_parse(self.content, self.content_offset,
+                                    container)
+            for node in container:
+                node['classes'].extend(class_value)
+            node_list.extend(container.children)
+        else:
+            pending = nodes.pending(
+                misc.ClassAttribute,
+                {'class': class_value, 'directive': self.name},
+                self.block_text)
+            self.state_machine.document.note_pending(pending)
+            node_list.append(pending)
+        return node_list
+
+
+class Role(Directive):
+
+    has_content = True
+
+    argument_pattern = re.compile(r'(%s)\s*(\(\s*(%s)\s*\)\s*)?$'
+                                  % ((states.Inliner.simplename,) * 2))
+
+    def run(self):
+        """Dynamically create and register a custom interpreted text role."""
+        if self.content_offset > self.lineno or not self.content:
+            raise self.error('"%s" directive requires arguments on the first '
+                             'line.' % self.name)
+        args = self.content[0]
+        match = self.argument_pattern.match(args)
+        if not match:
+            raise self.error('"%s" directive arguments not valid role names: '
+                             '"%s".' % (self.name, args))
+        new_role_name = match.group(1)
+        base_role_name = match.group(3)
+        messages = []
+        if base_role_name:
+            base_role, messages = roles.role(
+                base_role_name, self.state_machine.language, self.lineno,
+                self.state.reporter)
+            if base_role is None:
+                error = self.state.reporter.error(
+                    'Unknown interpreted text role "%s".' % base_role_name,
+                    nodes.literal_block(self.block_text, self.block_text),
+                    line=self.lineno)
+                return messages + [error]
+        else:
+            base_role = roles.generic_custom_role
+        assert not hasattr(base_role, 'arguments'), (
+            'Supplemental directive arguments for "%s" directive not '
+            'supported (specified by "%r" role).' % (self.name, base_role))
+        try:
+            converted_role = convert_directive_function(base_role)
+            (arguments, options, content, content_offset) = (
+                self.state.parse_directive_block(
+                self.content[1:], self.content_offset, converted_role,
+                option_presets={}))
+        except states.MarkupError, detail:
+            error = self.state_machine.reporter.error(
+                'Error in "%s" directive:\n%s.' % (self.name, detail),
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            return messages + [error]
+        if not options.has_key('class'):
+            try:
+                options['class'] = directives.class_option(new_role_name)
+            except ValueError, detail:
+                error = self.state_machine.reporter.error(
+                    'Invalid argument for "%s" directive:\n%s.'
+                    % (self.name, detail), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                return messages + [error]
+        role = roles.CustomRole(new_role_name, base_role, options, content)
+        roles.register_local_role(new_role_name, role)
+        return messages
+
+
+class DefaultRole(Directive):
+
+    """Set the default interpreted text role."""
+
+    required_arguments = 0
+    optional_arguments = 1
+    final_argument_whitespace = False
+
+    def run(self):
+        if not self.arguments:
+            if roles._roles.has_key(''):
+                # restore the "default" default role
+                del roles._roles['']
+            return []
+        role_name = self.arguments[0]
+        role, messages = roles.role(role_name, self.state_machine.language,
+                                    self.lineno, self.state.reporter)
+        if role is None:
+            error = self.state.reporter.error(
+                'Unknown interpreted text role "%s".' % role_name,
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            return messages + [error]
+        roles._roles[''] = role
+        # @@@ should this be local to the document, not the parser?
+        return messages
+
+
+class Title(Directive):
+
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = True
+
+    def run(self):
+        self.state_machine.document['title'] = self.arguments[0]
+        return []
+
+
+class Date(Directive):
+
+    has_content = True
+
+    def run(self):
+        if not isinstance(self.state, states.SubstitutionDef):
+            raise self.error(
+                'Invalid context: the "%s" directive can only be used within '
+                'a substitution definition.' % self.name)
+        format = '\n'.join(self.content) or '%Y-%m-%d'
+        text = time.strftime(format)
+        return [nodes.Text(text)]
+
+
+class TestDirective(Directive):
+
+    """This directive is useful only for testing purposes."""
+
+    required_arguments = 0
+    optional_arguments = 1
+    final_argument_whitespace = True
+    option_spec = {'option': directives.unchanged_required}
+    has_content = True
+
+    def run(self):
+        if self.content:
+            text = '\n'.join(self.content)
+            info = self.state_machine.reporter.info(
+                'Directive processed. Type="%s", arguments=%r, options=%r, '
+                'content:' % (self.name, self.arguments, self.options),
+                nodes.literal_block(text, text), line=self.lineno)
+        else:
+            info = self.state_machine.reporter.info(
+                'Directive processed. Type="%s", arguments=%r, options=%r, '
+                'content: None' % (self.name, self.arguments, self.options),
+                line=self.lineno)
+        return [info]
+
+# Old-style, functional definition:
+#
+# def directive_test_function(name, arguments, options, content, lineno,
+#                             content_offset, block_text, state, state_machine):
+#     """This directive is useful only for testing purposes."""
+#     if content:
+#         text = '\n'.join(content)
+#         info = state_machine.reporter.info(
+#             'Directive processed. Type="%s", arguments=%r, options=%r, '
+#             'content:' % (name, arguments, options),
+#             nodes.literal_block(text, text), line=lineno)
+#     else:
+#         info = state_machine.reporter.info(
+#             'Directive processed. Type="%s", arguments=%r, options=%r, '
+#             'content: None' % (name, arguments, options), line=lineno)
+#     return [info]
+#
+# directive_test_function.arguments = (0, 1, 1)
+# directive_test_function.options = {'option': directives.unchanged_required}
+# directive_test_function.content = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/parts.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,123 @@
+# $Id: parts.py 4667 2006-07-12 21:40:56Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Dmitry Jemerov
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for document parts.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes, languages
+from docutils.transforms import parts
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives
+
+
+class Contents(Directive):
+
+    """
+    Table of contents.
+
+    The table of contents is generated in two passes: initial parse and
+    transform.  During the initial parse, a 'pending' element is generated
+    which acts as a placeholder, storing the TOC title and any options
+    internally.  At a later stage in the processing, the 'pending' element is
+    replaced by a 'topic' element, a title and the table of contents proper.
+    """
+
+    backlinks_values = ('top', 'entry', 'none')
+
+    def backlinks(arg):
+        value = directives.choice(arg, Contents.backlinks_values)
+        if value == 'none':
+            return None
+        else:
+            return value
+
+    required_arguments = 0
+    optional_arguments = 1
+    final_argument_whitespace = True
+    option_spec = {'depth': directives.nonnegative_int,
+                   'local': directives.flag,
+                   'backlinks': backlinks,
+                   'class': directives.class_option}
+    
+    def run(self):
+        if not (self.state_machine.match_titles
+                or isinstance(self.state_machine.node, nodes.sidebar)):
+            raise self.error('The "%s" directive may not be used within '
+                             'topics or body elements.' % self.name)
+        document = self.state_machine.document
+        language = languages.get_language(document.settings.language_code)
+        if self.arguments:
+            title_text = self.arguments[0]
+            text_nodes, messages = self.state.inline_text(title_text,
+                                                          self.lineno)
+            title = nodes.title(title_text, '', *text_nodes)
+        else:
+            messages = []
+            if self.options.has_key('local'):
+                title = None
+            else:
+                title = nodes.title('', language.labels['contents'])
+        topic = nodes.topic(classes=['contents'])
+        topic['classes'] += self.options.get('class', [])
+        if self.options.has_key('local'):
+            topic['classes'].append('local')
+        if title:
+            name = title.astext()
+            topic += title
+        else:
+            name = language.labels['contents']
+        name = nodes.fully_normalize_name(name)
+        if not document.has_name(name):
+            topic['names'].append(name)
+        document.note_implicit_target(topic)
+        pending = nodes.pending(parts.Contents, rawsource=self.block_text)
+        pending.details.update(self.options)
+        document.note_pending(pending)
+        topic += pending
+        return [topic] + messages
+
+
+class Sectnum(Directive):
+
+    """Automatic section numbering."""
+
+    option_spec = {'depth': int,
+                   'start': int,
+                   'prefix': directives.unchanged_required,
+                   'suffix': directives.unchanged_required}
+
+    def run(self):
+        pending = nodes.pending(parts.SectNum)
+        pending.details.update(self.options)
+        self.state_machine.document.note_pending(pending)
+        return [pending]
+
+
+class Header(Directive):
+
+    """Contents of document header."""
+
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        header = self.state_machine.document.get_decoration().get_header()
+        self.state.nested_parse(self.content, self.content_offset, header)
+        return []
+
+
+class Footer(Directive):
+
+    """Contents of document footer."""
+
+    has_content = True
+
+    def run(self):
+        self.assert_has_content()
+        footer = self.state_machine.document.get_decoration().get_footer()
+        self.state.nested_parse(self.content, self.content_offset, footer)
+        return []
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/references.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,28 @@
+# $Id: references.py 4667 2006-07-12 21:40:56Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Dmitry Jemerov
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for references and targets.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes
+from docutils.transforms import references
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives
+
+
+class TargetNotes(Directive):
+
+    """Target footnote generation."""
+
+    option_spec = {'class': directives.class_option}
+
+    def run(self):
+        pending = nodes.pending(references.TargetNotes)
+        pending.details.update(self.options)
+        self.state_machine.document.note_pending(pending)
+        nodelist = [pending]
+        return nodelist
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/tables.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,444 @@
+# $Id: tables.py 4667 2006-07-12 21:40:56Z wiemann $
+# Authors: David Goodger <goodger@python.org>; David Priest
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for table elements.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os.path
+from docutils import io, nodes, statemachine, utils
+from docutils.utils import SystemMessagePropagation
+from docutils.parsers.rst import Directive
+from docutils.parsers.rst import directives
+
+try:
+    import csv                          # new in Python 2.3
+except ImportError:
+    csv = None
+
+
+class Table(Directive):
+
+    """
+    Generic table base class.
+    """
+
+    required_arguments = 0
+    optional_arguments = 1
+    final_argument_whitespace = True
+    option_spec = {'class': directives.class_option}
+    has_content = True
+
+    def make_title(self):
+        if self.arguments:
+            title_text = self.arguments[0]
+            text_nodes, messages = self.state.inline_text(title_text,
+                                                          self.lineno)
+            title = nodes.title(title_text, '', *text_nodes)
+        else:
+            title = None
+            messages = []
+        return title, messages
+
+    def process_header_option(self):
+        source = self.state_machine.get_source(self.lineno - 1)
+        table_head = []
+        max_header_cols = 0
+        if self.options.has_key('header'):   # separate table header in option
+            rows, max_header_cols = self.parse_csv_data_into_rows(
+                self.options['header'].split('\n'), self.HeaderDialect(),
+                source)
+            table_head.extend(rows)
+        return table_head, max_header_cols
+
+    def check_table_dimensions(self, rows, header_rows, stub_columns):
+        if len(rows) < header_rows:
+            error = self.state_machine.reporter.error(
+                '%s header row(s) specified but only %s row(s) of data '
+                'supplied ("%s" directive).'
+                % (header_rows, len(rows), self.name), nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+        if len(rows) == header_rows > 0:
+            error = self.state_machine.reporter.error(
+                'Insufficient data supplied (%s row(s)); no data remaining '
+                'for table body, required by "%s" directive.'
+                % (len(rows), self.name), nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+        for row in rows:
+            if len(row) < stub_columns:
+                error = self.state_machine.reporter.error(
+                    '%s stub column(s) specified but only %s columns(s) of '
+                    'data supplied ("%s" directive).' %
+                    (stub_columns, len(row), self.name), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+            if len(row) == stub_columns > 0:
+                error = self.state_machine.reporter.error(
+                    'Insufficient data supplied (%s columns(s)); no data remaining '
+                    'for table body, required by "%s" directive.'
+                    % (len(row), self.name), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+
+    def get_column_widths(self, max_cols):
+        if self.options.has_key('widths'):
+            col_widths = self.options['widths']
+            if len(col_widths) != max_cols:
+                error = self.state_machine.reporter.error(
+                    '"%s" widths do not match the number of columns in table '
+                    '(%s).' % (self.name, max_cols), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+        elif max_cols:
+            col_widths = [100 // max_cols] * max_cols
+        else:
+            error = self.state_machine.reporter.error(
+                'No table data detected in CSV file.', nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+        return col_widths
+
+    def extend_short_rows_with_empty_cells(self, columns, parts):
+        for part in parts:
+            for row in part:
+                if len(row) < columns:
+                    row.extend([(0, 0, 0, [])] * (columns - len(row)))
+
+
+class RSTTable(Table):
+
+    def run(self):
+        if not self.content:
+            warning = self.state_machine.reporter.warning(
+                'Content block expected for the "%s" directive; none found.'
+                % self.name, nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            return [warning]
+        title, messages = self.make_title()
+        node = nodes.Element()          # anonymous container for parsing
+        self.state.nested_parse(self.content, self.content_offset, node)
+        if len(node) != 1 or not isinstance(node[0], nodes.table):
+            error = self.state_machine.reporter.error(
+                'Error parsing content block for the "%s" directive: exactly '
+                'one table expected.' % self.name, nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            return [error]
+        table_node = node[0]
+        table_node['classes'] += self.options.get('class', [])
+        if title:
+            table_node.insert(0, title)
+        return [table_node] + messages
+
+
+class CSVTable(Table):
+
+    option_spec = {'header-rows': directives.nonnegative_int,
+                   'stub-columns': directives.nonnegative_int,
+                   'header': directives.unchanged,
+                   'widths': directives.positive_int_list,
+                   'file': directives.path,
+                   'url': directives.uri,
+                   'encoding': directives.encoding,
+                   'class': directives.class_option,
+                   # field delimiter char
+                   'delim': directives.single_char_or_whitespace_or_unicode,
+                   # treat whitespace after delimiter as significant
+                   'keepspace': directives.flag,
+                   # text field quote/unquote char:
+                   'quote': directives.single_char_or_unicode,
+                   # char used to escape delim & quote as-needed:
+                   'escape': directives.single_char_or_unicode,}
+
+    if csv:
+
+        class DocutilsDialect(csv.Dialect):
+
+            """CSV dialect for `csv_table` directive."""
+
+            delimiter = ','
+            quotechar = '"'
+            doublequote = True
+            skipinitialspace = True
+            lineterminator = '\n'
+            quoting = csv.QUOTE_MINIMAL
+
+            def __init__(self, options):
+                if options.has_key('delim'):
+                    self.delimiter = str(options['delim'])
+                if options.has_key('keepspace'):
+                    self.skipinitialspace = False
+                if options.has_key('quote'):
+                    self.quotechar = str(options['quote'])
+                if options.has_key('escape'):
+                    self.doublequote = False
+                    self.escapechar = str(options['escape'])
+                csv.Dialect.__init__(self)
+
+
+        class HeaderDialect(csv.Dialect):
+
+            """CSV dialect to use for the "header" option data."""
+
+            delimiter = ','
+            quotechar = '"'
+            escapechar = '\\'
+            doublequote = False
+            skipinitialspace = True
+            lineterminator = '\n'
+            quoting = csv.QUOTE_MINIMAL
+
+    def check_requirements(self):
+        if not csv:
+            error = self.state_machine.reporter.error(
+                'The "%s" directive is not compatible with this version of '
+                'Python (%s).  Requires the "csv" module, new in Python 2.3.'
+                % (self.name, sys.version.split()[0]), nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+
+    def run(self):
+        try:
+            if (not self.state.document.settings.file_insertion_enabled
+                and (self.options.has_key('file')
+                     or self.options.has_key('url'))):
+                warning = self.state_machine.reporter.warning(
+                    'File and URL access deactivated; ignoring "%s" '
+                    'directive.' % self.name, nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                return [warning]
+            self.check_requirements()
+            title, messages = self.make_title()
+            csv_data, source = self.get_csv_data()
+            table_head, max_header_cols = self.process_header_option()
+            rows, max_cols = self.parse_csv_data_into_rows(
+                csv_data, self.DocutilsDialect(self.options), source)
+            max_cols = max(max_cols, max_header_cols)
+            header_rows = self.options.get('header-rows', 0)
+            stub_columns = self.options.get('stub-columns', 0)
+            self.check_table_dimensions(rows, header_rows, stub_columns)
+            table_head.extend(rows[:header_rows])
+            table_body = rows[header_rows:]
+            col_widths = self.get_column_widths(max_cols)
+            self.extend_short_rows_with_empty_cells(max_cols,
+                                                    (table_head, table_body))
+        except SystemMessagePropagation, detail:
+            return [detail.args[0]]
+        except csv.Error, detail:
+            error = self.state_machine.reporter.error(
+                'Error with CSV data in "%s" directive:\n%s'
+                % (self.name, detail), nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            return [error]
+        table = (col_widths, table_head, table_body)
+        table_node = self.state.build_table(table, self.content_offset,
+                                            stub_columns)
+        table_node['classes'] += self.options.get('class', [])
+        if title:
+            table_node.insert(0, title)
+        return [table_node] + messages
+
+    def get_csv_data(self):
+        """
+        Get CSV data from the directive content, from an external
+        file, or from a URL reference.
+        """
+        encoding = self.options.get(
+            'encoding', self.state.document.settings.input_encoding)
+        if self.content:
+            # CSV data is from directive content.
+            if self.options.has_key('file') or self.options.has_key('url'):
+                error = self.state_machine.reporter.error(
+                    '"%s" directive may not both specify an external file and'
+                    ' have content.' % self.name, nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+            source = self.content.source(0)
+            csv_data = self.content
+        elif self.options.has_key('file'):
+            # CSV data is from an external file.
+            if self.options.has_key('url'):
+                error = self.state_machine.reporter.error(
+                      'The "file" and "url" options may not be simultaneously'
+                      ' specified for the "%s" directive.' % self.name,
+                      nodes.literal_block(self.block_text, self.block_text),
+                      line=self.lineno)
+                raise SystemMessagePropagation(error)
+            source_dir = os.path.dirname(
+                os.path.abspath(self.state.document.current_source))
+            source = os.path.normpath(os.path.join(source_dir,
+                                                   self.options['file']))
+            source = utils.relative_path(None, source)
+            try:
+                self.state.document.settings.record_dependencies.add(source)
+                csv_file = io.FileInput(
+                    source_path=source, encoding=encoding,
+                    error_handler=(self.state.document.settings.\
+                                   input_encoding_error_handler),
+                    handle_io_errors=None)
+                csv_data = csv_file.read().splitlines()
+            except IOError, error:
+                severe = self.state_machine.reporter.severe(
+                    'Problems with "%s" directive path:\n%s.'
+                    % (self.name, error), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(severe)
+        elif self.options.has_key('url'):
+            # CSV data is from a URL.
+            # Do not import urllib2 at the top of the module because
+            # it may fail due to broken SSL dependencies, and it takes
+            # about 0.15 seconds to load.
+            import urllib2
+            source = self.options['url']
+            try:
+                csv_text = urllib2.urlopen(source).read()
+            except (urllib2.URLError, IOError, OSError, ValueError), error:
+                severe = self.state_machine.reporter.severe(
+                      'Problems with "%s" directive URL "%s":\n%s.'
+                      % (self.name, self.options['url'], error),
+                      nodes.literal_block(self.block_text, self.block_text),
+                      line=self.lineno)
+                raise SystemMessagePropagation(severe)
+            csv_file = io.StringInput(
+                source=csv_text, source_path=source, encoding=encoding,
+                error_handler=(self.state.document.settings.\
+                               input_encoding_error_handler))
+            csv_data = csv_file.read().splitlines()
+        else:
+            error = self.state_machine.reporter.warning(
+                'The "%s" directive requires content; none supplied.'
+                % self.name, nodes.literal_block(
+                self.block_text, self.block_text), line=self.lineno)
+            raise SystemMessagePropagation(error)
+        return csv_data, source
+
+    def parse_csv_data_into_rows(self, csv_data, dialect, source):
+        # csv.py doesn't do Unicode; encode temporarily as UTF-8
+        csv_reader = csv.reader([(line.encode('utf-8') + '\n')
+                                for line in csv_data],
+                                dialect=dialect)
+        rows = []
+        max_cols = 0
+        for row in csv_reader:
+            row_data = []
+            for cell in row:
+                # decode UTF-8 back to Unicode
+                cell_text = unicode(cell, 'utf-8')
+                cell_data = (0, 0, 0, statemachine.StringList(
+                    cell_text.splitlines(), source=source))
+                row_data.append(cell_data)
+            rows.append(row_data)
+            max_cols = max(max_cols, len(row))
+        return rows, max_cols
+
+
+class ListTable(Table):
+
+    """
+    Implement tables whose data is encoded as a uniform two-level bullet list.
+    For further ideas, see
+    http://docutils.sf.net/docs/dev/rst/alternatives.html#list-driven-tables
+    """ 
+
+    option_spec = {'header-rows': directives.nonnegative_int,
+                   'stub-columns': directives.nonnegative_int,
+                   'widths': directives.positive_int_list,
+                   'class': directives.class_option}
+
+    def run(self):
+        if not self.content:
+            error = self.state_machine.reporter.error(
+                'The "%s" directive is empty; content required.' % self.name,
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            return [error]
+        title, messages = self.make_title()
+        node = nodes.Element()          # anonymous container for parsing
+        self.state.nested_parse(self.content, self.content_offset, node)
+        try:
+            num_cols, col_widths = self.check_list_content(node)
+            table_data = [[item.children for item in row_list[0]]
+                          for row_list in node[0]]
+            header_rows = self.options.get('header-rows', 0)
+            stub_columns = self.options.get('stub-columns', 0)
+            self.check_table_dimensions(table_data, header_rows, stub_columns)
+        except SystemMessagePropagation, detail:
+            return [detail.args[0]]
+        table_node = self.build_table_from_list(table_data, col_widths,
+                                                header_rows, stub_columns)
+        table_node['classes'] += self.options.get('class', [])
+        if title:
+            table_node.insert(0, title)
+        return [table_node] + messages
+
+    def check_list_content(self, node):
+        if len(node) != 1 or not isinstance(node[0], nodes.bullet_list):
+            error = self.state_machine.reporter.error(
+                'Error parsing content block for the "%s" directive: '
+                'exactly one bullet list expected.' % self.name,
+                nodes.literal_block(self.block_text, self.block_text),
+                line=self.lineno)
+            raise SystemMessagePropagation(error)
+        list_node = node[0]
+        # Check for a uniform two-level bullet list:
+        for item_index in range(len(list_node)):
+            item = list_node[item_index]
+            if len(item) != 1 or not isinstance(item[0], nodes.bullet_list):
+                error = self.state_machine.reporter.error(
+                    'Error parsing content block for the "%s" directive: '
+                    'two-level bullet list expected, but row %s does not '
+                    'contain a second-level bullet list.'
+                    % (self.name, item_index + 1), nodes.literal_block(
+                    self.block_text, self.block_text), line=self.lineno)
+                raise SystemMessagePropagation(error)
+            elif item_index:
+                # ATTN pychecker users: num_cols is guaranteed to be set in the
+                # "else" clause below for item_index==0, before this branch is
+                # triggered.
+                if len(item[0]) != num_cols:
+                    error = self.state_machine.reporter.error(
+                        'Error parsing content block for the "%s" directive: '
+                        'uniform two-level bullet list expected, but row %s '
+                        'does not contain the same number of items as row 1 '
+                        '(%s vs %s).'
+                        % (self.name, item_index + 1, len(item[0]), num_cols),
+                        nodes.literal_block(self.block_text, self.block_text),
+                        line=self.lineno)
+                    raise SystemMessagePropagation(error)
+            else:
+                num_cols = len(item[0])
+        col_widths = self.get_column_widths(num_cols)
+        return num_cols, col_widths
+
+    def build_table_from_list(self, table_data, col_widths, header_rows, stub_columns):
+        table = nodes.table()
+        tgroup = nodes.tgroup(cols=len(col_widths))
+        table += tgroup
+        for col_width in col_widths:
+            colspec = nodes.colspec(colwidth=col_width)
+            if stub_columns:
+                colspec.attributes['stub'] = 1
+                stub_columns -= 1
+            tgroup += colspec
+        rows = []
+        for row in table_data:
+            row_node = nodes.row()
+            for cell in row:
+                entry = nodes.entry()
+                entry += cell
+                row_node += entry
+            rows.append(row_node)
+        if header_rows:
+            thead = nodes.thead()
+            thead.extend(rows[:header_rows])
+            tgroup += thead
+        tbody = nodes.tbody()
+        tbody.extend(rows[header_rows:])
+        tgroup += tbody
+        return table
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/README.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,17 @@
+============================================
+ ``docutils/parsers/rst/include`` Directory
+============================================
+
+This directory contains standard data files intended for inclusion in
+reStructuredText documents.  To access these files, use the "include"
+directive with the special syntax for standard "include" data files,
+angle brackets around the file name::
+
+    .. include:: <isonum.txt>
+
+See the documentation for the `"include" directive`__ and
+`reStructuredText Standard Substitution Definition Sets`__ for
+details.
+
+__ http://docutils.sf.net/docs/ref/rst/directives.html#include
+__ http://docutils.sf.net/docs/ref/rst/substitutions.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsa.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,162 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |angzarr|  unicode:: U+0237C .. RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+.. |cirmid|   unicode:: U+02AEF .. VERTICAL LINE WITH CIRCLE ABOVE
+.. |cudarrl|  unicode:: U+02938 .. RIGHT-SIDE ARC CLOCKWISE ARROW
+.. |cudarrr|  unicode:: U+02935 .. ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+.. |cularr|   unicode:: U+021B6 .. ANTICLOCKWISE TOP SEMICIRCLE ARROW
+.. |cularrp|  unicode:: U+0293D .. TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+.. |curarr|   unicode:: U+021B7 .. CLOCKWISE TOP SEMICIRCLE ARROW
+.. |curarrm|  unicode:: U+0293C .. TOP ARC CLOCKWISE ARROW WITH MINUS
+.. |Darr|     unicode:: U+021A1 .. DOWNWARDS TWO HEADED ARROW
+.. |dArr|     unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |darr2|    unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
+.. |ddarr|    unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
+.. |DDotrahd| unicode:: U+02911 .. RIGHTWARDS ARROW WITH DOTTED STEM
+.. |dfisht|   unicode:: U+0297F .. DOWN FISH TAIL
+.. |dHar|     unicode:: U+02965 .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+.. |dharl|    unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
+.. |dharr|    unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+.. |dlarr|    unicode:: U+02199 .. SOUTH WEST ARROW
+.. |drarr|    unicode:: U+02198 .. SOUTH EAST ARROW
+.. |duarr|    unicode:: U+021F5 .. DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+.. |duhar|    unicode:: U+0296F .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+.. |dzigrarr| unicode:: U+027FF .. LONG RIGHTWARDS SQUIGGLE ARROW
+.. |erarr|    unicode:: U+02971 .. EQUALS SIGN ABOVE RIGHTWARDS ARROW
+.. |hArr|     unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |harr|     unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |harrcir|  unicode:: U+02948 .. LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+.. |harrw|    unicode:: U+021AD .. LEFT RIGHT WAVE ARROW
+.. |hoarr|    unicode:: U+021FF .. LEFT RIGHT OPEN-HEADED ARROW
+.. |imof|     unicode:: U+022B7 .. IMAGE OF
+.. |lAarr|    unicode:: U+021DA .. LEFTWARDS TRIPLE ARROW
+.. |Larr|     unicode:: U+0219E .. LEFTWARDS TWO HEADED ARROW
+.. |larr2|    unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
+.. |larrbfs|  unicode:: U+0291F .. LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+.. |larrfs|   unicode:: U+0291D .. LEFTWARDS ARROW TO BLACK DIAMOND
+.. |larrhk|   unicode:: U+021A9 .. LEFTWARDS ARROW WITH HOOK
+.. |larrlp|   unicode:: U+021AB .. LEFTWARDS ARROW WITH LOOP
+.. |larrpl|   unicode:: U+02939 .. LEFT-SIDE ARC ANTICLOCKWISE ARROW
+.. |larrsim|  unicode:: U+02973 .. LEFTWARDS ARROW ABOVE TILDE OPERATOR
+.. |larrtl|   unicode:: U+021A2 .. LEFTWARDS ARROW WITH TAIL
+.. |lAtail|   unicode:: U+0291B .. LEFTWARDS DOUBLE ARROW-TAIL
+.. |latail|   unicode:: U+02919 .. LEFTWARDS ARROW-TAIL
+.. |lBarr|    unicode:: U+0290E .. LEFTWARDS TRIPLE DASH ARROW
+.. |lbarr|    unicode:: U+0290C .. LEFTWARDS DOUBLE DASH ARROW
+.. |ldca|     unicode:: U+02936 .. ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+.. |ldrdhar|  unicode:: U+02967 .. LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+.. |ldrushar| unicode:: U+0294B .. LEFT BARB DOWN RIGHT BARB UP HARPOON
+.. |ldsh|     unicode:: U+021B2 .. DOWNWARDS ARROW WITH TIP LEFTWARDS
+.. |lfisht|   unicode:: U+0297C .. LEFT FISH TAIL
+.. |lHar|     unicode:: U+02962 .. LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+.. |lhard|    unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
+.. |lharu|    unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
+.. |lharul|   unicode:: U+0296A .. LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+.. |llarr|    unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
+.. |llhard|   unicode:: U+0296B .. LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+.. |loarr|    unicode:: U+021FD .. LEFTWARDS OPEN-HEADED ARROW
+.. |lrarr|    unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |lrarr2|   unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |lrhar|    unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |lrhar2|   unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |lrhard|   unicode:: U+0296D .. RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+.. |lsh|      unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+.. |lurdshar| unicode:: U+0294A .. LEFT BARB UP RIGHT BARB DOWN HARPOON
+.. |luruhar|  unicode:: U+02966 .. LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+.. |Map|      unicode:: U+02905 .. RIGHTWARDS TWO-HEADED ARROW FROM BAR
+.. |map|      unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
+.. |midcir|   unicode:: U+02AF0 .. VERTICAL LINE WITH CIRCLE BELOW
+.. |mumap|    unicode:: U+022B8 .. MULTIMAP
+.. |nearhk|   unicode:: U+02924 .. NORTH EAST ARROW WITH HOOK
+.. |neArr|    unicode:: U+021D7 .. NORTH EAST DOUBLE ARROW
+.. |nearr|    unicode:: U+02197 .. NORTH EAST ARROW
+.. |nesear|   unicode:: U+02928 .. NORTH EAST ARROW AND SOUTH EAST ARROW
+.. |nhArr|    unicode:: U+021CE .. LEFT RIGHT DOUBLE ARROW WITH STROKE
+.. |nharr|    unicode:: U+021AE .. LEFT RIGHT ARROW WITH STROKE
+.. |nlArr|    unicode:: U+021CD .. LEFTWARDS DOUBLE ARROW WITH STROKE
+.. |nlarr|    unicode:: U+0219A .. LEFTWARDS ARROW WITH STROKE
+.. |nrArr|    unicode:: U+021CF .. RIGHTWARDS DOUBLE ARROW WITH STROKE
+.. |nrarr|    unicode:: U+0219B .. RIGHTWARDS ARROW WITH STROKE
+.. |nrarrc|   unicode:: U+02933 U+00338 .. WAVE ARROW POINTING DIRECTLY RIGHT with slash
+.. |nrarrw|   unicode:: U+0219D U+00338 .. RIGHTWARDS WAVE ARROW with slash
+.. |nvHarr|   unicode:: U+02904 .. LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+.. |nvlArr|   unicode:: U+02902 .. LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+.. |nvrArr|   unicode:: U+02903 .. RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+.. |nwarhk|   unicode:: U+02923 .. NORTH WEST ARROW WITH HOOK
+.. |nwArr|    unicode:: U+021D6 .. NORTH WEST DOUBLE ARROW
+.. |nwarr|    unicode:: U+02196 .. NORTH WEST ARROW
+.. |nwnear|   unicode:: U+02927 .. NORTH WEST ARROW AND NORTH EAST ARROW
+.. |olarr|    unicode:: U+021BA .. ANTICLOCKWISE OPEN CIRCLE ARROW
+.. |orarr|    unicode:: U+021BB .. CLOCKWISE OPEN CIRCLE ARROW
+.. |origof|   unicode:: U+022B6 .. ORIGINAL OF
+.. |rAarr|    unicode:: U+021DB .. RIGHTWARDS TRIPLE ARROW
+.. |Rarr|     unicode:: U+021A0 .. RIGHTWARDS TWO HEADED ARROW
+.. |rarr2|    unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
+.. |rarrap|   unicode:: U+02975 .. RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+.. |rarrbfs|  unicode:: U+02920 .. RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+.. |rarrc|    unicode:: U+02933 .. WAVE ARROW POINTING DIRECTLY RIGHT
+.. |rarrfs|   unicode:: U+0291E .. RIGHTWARDS ARROW TO BLACK DIAMOND
+.. |rarrhk|   unicode:: U+021AA .. RIGHTWARDS ARROW WITH HOOK
+.. |rarrlp|   unicode:: U+021AC .. RIGHTWARDS ARROW WITH LOOP
+.. |rarrpl|   unicode:: U+02945 .. RIGHTWARDS ARROW WITH PLUS BELOW
+.. |rarrsim|  unicode:: U+02974 .. RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+.. |Rarrtl|   unicode:: U+02916 .. RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+.. |rarrtl|   unicode:: U+021A3 .. RIGHTWARDS ARROW WITH TAIL
+.. |rarrw|    unicode:: U+0219D .. RIGHTWARDS WAVE ARROW
+.. |rAtail|   unicode:: U+0291C .. RIGHTWARDS DOUBLE ARROW-TAIL
+.. |ratail|   unicode:: U+0291A .. RIGHTWARDS ARROW-TAIL
+.. |RBarr|    unicode:: U+02910 .. RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+.. |rBarr|    unicode:: U+0290F .. RIGHTWARDS TRIPLE DASH ARROW
+.. |rbarr|    unicode:: U+0290D .. RIGHTWARDS DOUBLE DASH ARROW
+.. |rdca|     unicode:: U+02937 .. ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+.. |rdldhar|  unicode:: U+02969 .. RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+.. |rdsh|     unicode:: U+021B3 .. DOWNWARDS ARROW WITH TIP RIGHTWARDS
+.. |rfisht|   unicode:: U+0297D .. RIGHT FISH TAIL
+.. |rHar|     unicode:: U+02964 .. RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+.. |rhard|    unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+.. |rharu|    unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
+.. |rharul|   unicode:: U+0296C .. RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+.. |rlarr|    unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rlarr2|   unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rlhar|    unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |rlhar2|   unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |roarr|    unicode:: U+021FE .. RIGHTWARDS OPEN-HEADED ARROW
+.. |rrarr|    unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
+.. |rsh|      unicode:: U+021B1 .. UPWARDS ARROW WITH TIP RIGHTWARDS
+.. |ruluhar|  unicode:: U+02968 .. RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+.. |searhk|   unicode:: U+02925 .. SOUTH EAST ARROW WITH HOOK
+.. |seArr|    unicode:: U+021D8 .. SOUTH EAST DOUBLE ARROW
+.. |searr|    unicode:: U+02198 .. SOUTH EAST ARROW
+.. |seswar|   unicode:: U+02929 .. SOUTH EAST ARROW AND SOUTH WEST ARROW
+.. |simrarr|  unicode:: U+02972 .. TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+.. |slarr|    unicode:: U+02190 .. LEFTWARDS ARROW
+.. |srarr|    unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |swarhk|   unicode:: U+02926 .. SOUTH WEST ARROW WITH HOOK
+.. |swArr|    unicode:: U+021D9 .. SOUTH WEST DOUBLE ARROW
+.. |swarr|    unicode:: U+02199 .. SOUTH WEST ARROW
+.. |swnwar|   unicode:: U+0292A .. SOUTH WEST ARROW AND NORTH WEST ARROW
+.. |Uarr|     unicode:: U+0219F .. UPWARDS TWO HEADED ARROW
+.. |uArr|     unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |uarr2|    unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
+.. |Uarrocir| unicode:: U+02949 .. UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+.. |udarr|    unicode:: U+021C5 .. UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+.. |udhar|    unicode:: U+0296E .. UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+.. |ufisht|   unicode:: U+0297E .. UP FISH TAIL
+.. |uHar|     unicode:: U+02963 .. UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+.. |uharl|    unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
+.. |uharr|    unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
+.. |uuarr|    unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
+.. |vArr|     unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
+.. |varr|     unicode:: U+02195 .. UP DOWN ARROW
+.. |xhArr|    unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
+.. |xharr|    unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
+.. |xlArr|    unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
+.. |xlarr|    unicode:: U+027F5 .. LONG LEFTWARDS ARROW
+.. |xmap|     unicode:: U+027FC .. LONG RIGHTWARDS ARROW FROM BAR
+.. |xrArr|    unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
+.. |xrarr|    unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
+.. |zigrarr|  unicode:: U+021DD .. RIGHTWARDS SQUIGGLE ARROW
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsb.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,126 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |ac|       unicode:: U+0223E .. INVERTED LAZY S
+.. |acE|      unicode:: U+0223E U+00333 .. INVERTED LAZY S with double underline
+.. |amalg|    unicode:: U+02A3F .. AMALGAMATION OR COPRODUCT
+.. |barvee|   unicode:: U+022BD .. NOR
+.. |Barwed|   unicode:: U+02306 .. PERSPECTIVE
+.. |barwed|   unicode:: U+02305 .. PROJECTIVE
+.. |bsolb|    unicode:: U+029C5 .. SQUARED FALLING DIAGONAL SLASH
+.. |Cap|      unicode:: U+022D2 .. DOUBLE INTERSECTION
+.. |capand|   unicode:: U+02A44 .. INTERSECTION WITH LOGICAL AND
+.. |capbrcup| unicode:: U+02A49 .. INTERSECTION ABOVE BAR ABOVE UNION
+.. |capcap|   unicode:: U+02A4B .. INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+.. |capcup|   unicode:: U+02A47 .. INTERSECTION ABOVE UNION
+.. |capdot|   unicode:: U+02A40 .. INTERSECTION WITH DOT
+.. |caps|     unicode:: U+02229 U+0FE00 .. INTERSECTION with serifs
+.. |ccaps|    unicode:: U+02A4D .. CLOSED INTERSECTION WITH SERIFS
+.. |ccups|    unicode:: U+02A4C .. CLOSED UNION WITH SERIFS
+.. |ccupssm|  unicode:: U+02A50 .. CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+.. |coprod|   unicode:: U+02210 .. N-ARY COPRODUCT
+.. |Cup|      unicode:: U+022D3 .. DOUBLE UNION
+.. |cupbrcap| unicode:: U+02A48 .. UNION ABOVE BAR ABOVE INTERSECTION
+.. |cupcap|   unicode:: U+02A46 .. UNION ABOVE INTERSECTION
+.. |cupcup|   unicode:: U+02A4A .. UNION BESIDE AND JOINED WITH UNION
+.. |cupdot|   unicode:: U+0228D .. MULTISET MULTIPLICATION
+.. |cupor|    unicode:: U+02A45 .. UNION WITH LOGICAL OR
+.. |cups|     unicode:: U+0222A U+0FE00 .. UNION with serifs
+.. |cuvee|    unicode:: U+022CE .. CURLY LOGICAL OR
+.. |cuwed|    unicode:: U+022CF .. CURLY LOGICAL AND
+.. |Dagger|   unicode:: U+02021 .. DOUBLE DAGGER
+.. |dagger|   unicode:: U+02020 .. DAGGER
+.. |diam|     unicode:: U+022C4 .. DIAMOND OPERATOR
+.. |divonx|   unicode:: U+022C7 .. DIVISION TIMES
+.. |eplus|    unicode:: U+02A71 .. EQUALS SIGN ABOVE PLUS SIGN
+.. |hercon|   unicode:: U+022B9 .. HERMITIAN CONJUGATE MATRIX
+.. |intcal|   unicode:: U+022BA .. INTERCALATE
+.. |iprod|    unicode:: U+02A3C .. INTERIOR PRODUCT
+.. |loplus|   unicode:: U+02A2D .. PLUS SIGN IN LEFT HALF CIRCLE
+.. |lotimes|  unicode:: U+02A34 .. MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+.. |lthree|   unicode:: U+022CB .. LEFT SEMIDIRECT PRODUCT
+.. |ltimes|   unicode:: U+022C9 .. LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+.. |midast|   unicode:: U+0002A .. ASTERISK
+.. |minusb|   unicode:: U+0229F .. SQUARED MINUS
+.. |minusd|   unicode:: U+02238 .. DOT MINUS
+.. |minusdu|  unicode:: U+02A2A .. MINUS SIGN WITH DOT BELOW
+.. |ncap|     unicode:: U+02A43 .. INTERSECTION WITH OVERBAR
+.. |ncup|     unicode:: U+02A42 .. UNION WITH OVERBAR
+.. |oast|     unicode:: U+0229B .. CIRCLED ASTERISK OPERATOR
+.. |ocir|     unicode:: U+0229A .. CIRCLED RING OPERATOR
+.. |odash|    unicode:: U+0229D .. CIRCLED DASH
+.. |odiv|     unicode:: U+02A38 .. CIRCLED DIVISION SIGN
+.. |odot|     unicode:: U+02299 .. CIRCLED DOT OPERATOR
+.. |odsold|   unicode:: U+029BC .. CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+.. |ofcir|    unicode:: U+029BF .. CIRCLED BULLET
+.. |ogt|      unicode:: U+029C1 .. CIRCLED GREATER-THAN
+.. |ohbar|    unicode:: U+029B5 .. CIRCLE WITH HORIZONTAL BAR
+.. |olcir|    unicode:: U+029BE .. CIRCLED WHITE BULLET
+.. |olt|      unicode:: U+029C0 .. CIRCLED LESS-THAN
+.. |omid|     unicode:: U+029B6 .. CIRCLED VERTICAL BAR
+.. |ominus|   unicode:: U+02296 .. CIRCLED MINUS
+.. |opar|     unicode:: U+029B7 .. CIRCLED PARALLEL
+.. |operp|    unicode:: U+029B9 .. CIRCLED PERPENDICULAR
+.. |oplus|    unicode:: U+02295 .. CIRCLED PLUS
+.. |osol|     unicode:: U+02298 .. CIRCLED DIVISION SLASH
+.. |Otimes|   unicode:: U+02A37 .. MULTIPLICATION SIGN IN DOUBLE CIRCLE
+.. |otimes|   unicode:: U+02297 .. CIRCLED TIMES
+.. |otimesas| unicode:: U+02A36 .. CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+.. |ovbar|    unicode:: U+0233D .. APL FUNCTIONAL SYMBOL CIRCLE STILE
+.. |plusacir| unicode:: U+02A23 .. PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+.. |plusb|    unicode:: U+0229E .. SQUARED PLUS
+.. |pluscir|  unicode:: U+02A22 .. PLUS SIGN WITH SMALL CIRCLE ABOVE
+.. |plusdo|   unicode:: U+02214 .. DOT PLUS
+.. |plusdu|   unicode:: U+02A25 .. PLUS SIGN WITH DOT BELOW
+.. |pluse|    unicode:: U+02A72 .. PLUS SIGN ABOVE EQUALS SIGN
+.. |plussim|  unicode:: U+02A26 .. PLUS SIGN WITH TILDE BELOW
+.. |plustwo|  unicode:: U+02A27 .. PLUS SIGN WITH SUBSCRIPT TWO
+.. |prod|     unicode:: U+0220F .. N-ARY PRODUCT
+.. |race|     unicode:: U+029DA .. LEFT DOUBLE WIGGLY FENCE
+.. |roplus|   unicode:: U+02A2E .. PLUS SIGN IN RIGHT HALF CIRCLE
+.. |rotimes|  unicode:: U+02A35 .. MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+.. |rthree|   unicode:: U+022CC .. RIGHT SEMIDIRECT PRODUCT
+.. |rtimes|   unicode:: U+022CA .. RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+.. |sdot|     unicode:: U+022C5 .. DOT OPERATOR
+.. |sdotb|    unicode:: U+022A1 .. SQUARED DOT OPERATOR
+.. |setmn|    unicode:: U+02216 .. SET MINUS
+.. |simplus|  unicode:: U+02A24 .. PLUS SIGN WITH TILDE ABOVE
+.. |smashp|   unicode:: U+02A33 .. SMASH PRODUCT
+.. |solb|     unicode:: U+029C4 .. SQUARED RISING DIAGONAL SLASH
+.. |sqcap|    unicode:: U+02293 .. SQUARE CAP
+.. |sqcaps|   unicode:: U+02293 U+0FE00 .. SQUARE CAP with serifs
+.. |sqcup|    unicode:: U+02294 .. SQUARE CUP
+.. |sqcups|   unicode:: U+02294 U+0FE00 .. SQUARE CUP with serifs
+.. |ssetmn|   unicode:: U+02216 .. SET MINUS
+.. |sstarf|   unicode:: U+022C6 .. STAR OPERATOR
+.. |subdot|   unicode:: U+02ABD .. SUBSET WITH DOT
+.. |sum|      unicode:: U+02211 .. N-ARY SUMMATION
+.. |supdot|   unicode:: U+02ABE .. SUPERSET WITH DOT
+.. |timesb|   unicode:: U+022A0 .. SQUARED TIMES
+.. |timesbar| unicode:: U+02A31 .. MULTIPLICATION SIGN WITH UNDERBAR
+.. |timesd|   unicode:: U+02A30 .. MULTIPLICATION SIGN WITH DOT ABOVE
+.. |top|      unicode:: U+022A4 .. DOWN TACK
+.. |tridot|   unicode:: U+025EC .. WHITE UP-POINTING TRIANGLE WITH DOT
+.. |triminus| unicode:: U+02A3A .. MINUS SIGN IN TRIANGLE
+.. |triplus|  unicode:: U+02A39 .. PLUS SIGN IN TRIANGLE
+.. |trisb|    unicode:: U+029CD .. TRIANGLE WITH SERIFS AT BOTTOM
+.. |tritime|  unicode:: U+02A3B .. MULTIPLICATION SIGN IN TRIANGLE
+.. |uplus|    unicode:: U+0228E .. MULTISET UNION
+.. |veebar|   unicode:: U+022BB .. XOR
+.. |wedbar|   unicode:: U+02A5F .. LOGICAL AND WITH UNDERBAR
+.. |wreath|   unicode:: U+02240 .. WREATH PRODUCT
+.. |xcap|     unicode:: U+022C2 .. N-ARY INTERSECTION
+.. |xcirc|    unicode:: U+025EF .. LARGE CIRCLE
+.. |xcup|     unicode:: U+022C3 .. N-ARY UNION
+.. |xdtri|    unicode:: U+025BD .. WHITE DOWN-POINTING TRIANGLE
+.. |xodot|    unicode:: U+02A00 .. N-ARY CIRCLED DOT OPERATOR
+.. |xoplus|   unicode:: U+02A01 .. N-ARY CIRCLED PLUS OPERATOR
+.. |xotime|   unicode:: U+02A02 .. N-ARY CIRCLED TIMES OPERATOR
+.. |xsqcup|   unicode:: U+02A06 .. N-ARY SQUARE UNION OPERATOR
+.. |xuplus|   unicode:: U+02A04 .. N-ARY UNION OPERATOR WITH PLUS
+.. |xutri|    unicode:: U+025B3 .. WHITE UP-POINTING TRIANGLE
+.. |xvee|     unicode:: U+022C1 .. N-ARY LOGICAL OR
+.. |xwedge|   unicode:: U+022C0 .. N-ARY LOGICAL AND
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsc.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,29 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |dlcorn|  unicode:: U+0231E .. BOTTOM LEFT CORNER
+.. |drcorn|  unicode:: U+0231F .. BOTTOM RIGHT CORNER
+.. |gtlPar|  unicode:: U+02995 .. DOUBLE LEFT ARC GREATER-THAN BRACKET
+.. |langd|   unicode:: U+02991 .. LEFT ANGLE BRACKET WITH DOT
+.. |lbrke|   unicode:: U+0298B .. LEFT SQUARE BRACKET WITH UNDERBAR
+.. |lbrksld| unicode:: U+0298F .. LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+.. |lbrkslu| unicode:: U+0298D .. LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+.. |lceil|   unicode:: U+02308 .. LEFT CEILING
+.. |lfloor|  unicode:: U+0230A .. LEFT FLOOR
+.. |lmoust|  unicode:: U+023B0 .. UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+.. |lpargt|  unicode:: U+029A0 .. SPHERICAL ANGLE OPENING LEFT
+.. |lparlt|  unicode:: U+02993 .. LEFT ARC LESS-THAN BRACKET
+.. |ltrPar|  unicode:: U+02996 .. DOUBLE RIGHT ARC LESS-THAN BRACKET
+.. |rangd|   unicode:: U+02992 .. RIGHT ANGLE BRACKET WITH DOT
+.. |rbrke|   unicode:: U+0298C .. RIGHT SQUARE BRACKET WITH UNDERBAR
+.. |rbrksld| unicode:: U+0298E .. RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+.. |rbrkslu| unicode:: U+02990 .. RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+.. |rceil|   unicode:: U+02309 .. RIGHT CEILING
+.. |rfloor|  unicode:: U+0230B .. RIGHT FLOOR
+.. |rmoust|  unicode:: U+023B1 .. UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+.. |rpargt|  unicode:: U+02994 .. RIGHT ARC GREATER-THAN BRACKET
+.. |ulcorn|  unicode:: U+0231C .. TOP LEFT CORNER
+.. |urcorn|  unicode:: U+0231D .. TOP RIGHT CORNER
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsn.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,96 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |gnap|     unicode:: U+02A8A .. GREATER-THAN AND NOT APPROXIMATE
+.. |gnE|      unicode:: U+02269 .. GREATER-THAN BUT NOT EQUAL TO
+.. |gne|      unicode:: U+02A88 .. GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |gnsim|    unicode:: U+022E7 .. GREATER-THAN BUT NOT EQUIVALENT TO
+.. |gvnE|     unicode:: U+02269 U+0FE00 .. GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |lnap|     unicode:: U+02A89 .. LESS-THAN AND NOT APPROXIMATE
+.. |lnE|      unicode:: U+02268 .. LESS-THAN BUT NOT EQUAL TO
+.. |lne|      unicode:: U+02A87 .. LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |lnsim|    unicode:: U+022E6 .. LESS-THAN BUT NOT EQUIVALENT TO
+.. |lvnE|     unicode:: U+02268 U+0FE00 .. LESS-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |nap|      unicode:: U+02249 .. NOT ALMOST EQUAL TO
+.. |napE|     unicode:: U+02A70 U+00338 .. APPROXIMATELY EQUAL OR EQUAL TO with slash
+.. |napid|    unicode:: U+0224B U+00338 .. TRIPLE TILDE with slash
+.. |ncong|    unicode:: U+02247 .. NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+.. |ncongdot| unicode:: U+02A6D U+00338 .. CONGRUENT WITH DOT ABOVE with slash
+.. |nequiv|   unicode:: U+02262 .. NOT IDENTICAL TO
+.. |ngE|      unicode:: U+02267 U+00338 .. GREATER-THAN OVER EQUAL TO with slash
+.. |nge|      unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
+.. |nges|     unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
+.. |nGg|      unicode:: U+022D9 U+00338 .. VERY MUCH GREATER-THAN with slash
+.. |ngsim|    unicode:: U+02275 .. NEITHER GREATER-THAN NOR EQUIVALENT TO
+.. |nGt|      unicode:: U+0226B U+020D2 .. MUCH GREATER THAN with vertical line
+.. |ngt|      unicode:: U+0226F .. NOT GREATER-THAN
+.. |nGtv|     unicode:: U+0226B U+00338 .. MUCH GREATER THAN with slash
+.. |nlE|      unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
+.. |nle|      unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
+.. |nles|     unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
+.. |nLl|      unicode:: U+022D8 U+00338 .. VERY MUCH LESS-THAN with slash
+.. |nlsim|    unicode:: U+02274 .. NEITHER LESS-THAN NOR EQUIVALENT TO
+.. |nLt|      unicode:: U+0226A U+020D2 .. MUCH LESS THAN with vertical line
+.. |nlt|      unicode:: U+0226E .. NOT LESS-THAN
+.. |nltri|    unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
+.. |nltrie|   unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
+.. |nLtv|     unicode:: U+0226A U+00338 .. MUCH LESS THAN with slash
+.. |nmid|     unicode:: U+02224 .. DOES NOT DIVIDE
+.. |npar|     unicode:: U+02226 .. NOT PARALLEL TO
+.. |npr|      unicode:: U+02280 .. DOES NOT PRECEDE
+.. |nprcue|   unicode:: U+022E0 .. DOES NOT PRECEDE OR EQUAL
+.. |npre|     unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nrtri|    unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
+.. |nrtrie|   unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+.. |nsc|      unicode:: U+02281 .. DOES NOT SUCCEED
+.. |nsccue|   unicode:: U+022E1 .. DOES NOT SUCCEED OR EQUAL
+.. |nsce|     unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nsim|     unicode:: U+02241 .. NOT TILDE
+.. |nsime|    unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
+.. |nsmid|    unicode:: U+02224 .. DOES NOT DIVIDE
+.. |nspar|    unicode:: U+02226 .. NOT PARALLEL TO
+.. |nsqsube|  unicode:: U+022E2 .. NOT SQUARE IMAGE OF OR EQUAL TO
+.. |nsqsupe|  unicode:: U+022E3 .. NOT SQUARE ORIGINAL OF OR EQUAL TO
+.. |nsub|     unicode:: U+02284 .. NOT A SUBSET OF
+.. |nsubE|    unicode:: U+02AC5 U+00338 .. SUBSET OF ABOVE EQUALS SIGN with slash
+.. |nsube|    unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
+.. |nsup|     unicode:: U+02285 .. NOT A SUPERSET OF
+.. |nsupE|    unicode:: U+02AC6 U+00338 .. SUPERSET OF ABOVE EQUALS SIGN with slash
+.. |nsupe|    unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
+.. |ntgl|     unicode:: U+02279 .. NEITHER GREATER-THAN NOR LESS-THAN
+.. |ntlg|     unicode:: U+02278 .. NEITHER LESS-THAN NOR GREATER-THAN
+.. |nvap|     unicode:: U+0224D U+020D2 .. EQUIVALENT TO with vertical line
+.. |nVDash|   unicode:: U+022AF .. NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+.. |nVdash|   unicode:: U+022AE .. DOES NOT FORCE
+.. |nvDash|   unicode:: U+022AD .. NOT TRUE
+.. |nvdash|   unicode:: U+022AC .. DOES NOT PROVE
+.. |nvge|     unicode:: U+02265 U+020D2 .. GREATER-THAN OR EQUAL TO with vertical line
+.. |nvgt|     unicode:: U+0003E U+020D2 .. GREATER-THAN SIGN with vertical line
+.. |nvle|     unicode:: U+02264 U+020D2 .. LESS-THAN OR EQUAL TO with vertical line
+.. |nvlt|     unicode:: U+0003C U+020D2 .. LESS-THAN SIGN with vertical line
+.. |nvltrie|  unicode:: U+022B4 U+020D2 .. NORMAL SUBGROUP OF OR EQUAL TO with vertical line
+.. |nvrtrie|  unicode:: U+022B5 U+020D2 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO with vertical line
+.. |nvsim|    unicode:: U+0223C U+020D2 .. TILDE OPERATOR with vertical line
+.. |parsim|   unicode:: U+02AF3 .. PARALLEL WITH TILDE OPERATOR
+.. |prnap|    unicode:: U+02AB9 .. PRECEDES ABOVE NOT ALMOST EQUAL TO
+.. |prnE|     unicode:: U+02AB5 .. PRECEDES ABOVE NOT EQUAL TO
+.. |prnsim|   unicode:: U+022E8 .. PRECEDES BUT NOT EQUIVALENT TO
+.. |rnmid|    unicode:: U+02AEE .. DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+.. |scnap|    unicode:: U+02ABA .. SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+.. |scnE|     unicode:: U+02AB6 .. SUCCEEDS ABOVE NOT EQUAL TO
+.. |scnsim|   unicode:: U+022E9 .. SUCCEEDS BUT NOT EQUIVALENT TO
+.. |simne|    unicode:: U+02246 .. APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+.. |solbar|   unicode:: U+0233F .. APL FUNCTIONAL SYMBOL SLASH BAR
+.. |subnE|    unicode:: U+02ACB .. SUBSET OF ABOVE NOT EQUAL TO
+.. |subne|    unicode:: U+0228A .. SUBSET OF WITH NOT EQUAL TO
+.. |supnE|    unicode:: U+02ACC .. SUPERSET OF ABOVE NOT EQUAL TO
+.. |supne|    unicode:: U+0228B .. SUPERSET OF WITH NOT EQUAL TO
+.. |vnsub|    unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
+.. |vnsup|    unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
+.. |vsubnE|   unicode:: U+02ACB U+0FE00 .. SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |vsubne|   unicode:: U+0228A U+0FE00 .. SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+.. |vsupnE|   unicode:: U+02ACC U+0FE00 .. SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |vsupne|   unicode:: U+0228B U+0FE00 .. SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamso.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,62 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |ang|      unicode:: U+02220 .. ANGLE
+.. |ange|     unicode:: U+029A4 .. ANGLE WITH UNDERBAR
+.. |angmsd|   unicode:: U+02221 .. MEASURED ANGLE
+.. |angmsdaa| unicode:: U+029A8 .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+.. |angmsdab| unicode:: U+029A9 .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+.. |angmsdac| unicode:: U+029AA .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+.. |angmsdad| unicode:: U+029AB .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+.. |angmsdae| unicode:: U+029AC .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+.. |angmsdaf| unicode:: U+029AD .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+.. |angmsdag| unicode:: U+029AE .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+.. |angmsdah| unicode:: U+029AF .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+.. |angrtvb|  unicode:: U+022BE .. RIGHT ANGLE WITH ARC
+.. |angrtvbd| unicode:: U+0299D .. MEASURED RIGHT ANGLE WITH DOT
+.. |bbrk|     unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
+.. |bbrktbrk| unicode:: U+023B6 .. BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+.. |bemptyv|  unicode:: U+029B0 .. REVERSED EMPTY SET
+.. |beth|     unicode:: U+02136 .. BET SYMBOL
+.. |boxbox|   unicode:: U+029C9 .. TWO JOINED SQUARES
+.. |bprime|   unicode:: U+02035 .. REVERSED PRIME
+.. |bsemi|    unicode:: U+0204F .. REVERSED SEMICOLON
+.. |cemptyv|  unicode:: U+029B2 .. EMPTY SET WITH SMALL CIRCLE ABOVE
+.. |cirE|     unicode:: U+029C3 .. CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+.. |cirscir|  unicode:: U+029C2 .. CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+.. |comp|     unicode:: U+02201 .. COMPLEMENT
+.. |daleth|   unicode:: U+02138 .. DALET SYMBOL
+.. |demptyv|  unicode:: U+029B1 .. EMPTY SET WITH OVERBAR
+.. |ell|      unicode:: U+02113 .. SCRIPT SMALL L
+.. |empty|    unicode:: U+02205 .. EMPTY SET
+.. |emptyv|   unicode:: U+02205 .. EMPTY SET
+.. |gimel|    unicode:: U+02137 .. GIMEL SYMBOL
+.. |iiota|    unicode:: U+02129 .. TURNED GREEK SMALL LETTER IOTA
+.. |image|    unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |imath|    unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
+.. |inodot|   unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
+.. |jmath|    unicode:: U+0006A .. LATIN SMALL LETTER J
+.. |jnodot|   unicode:: U+0006A .. LATIN SMALL LETTER J
+.. |laemptyv| unicode:: U+029B4 .. EMPTY SET WITH LEFT ARROW ABOVE
+.. |lltri|    unicode:: U+025FA .. LOWER LEFT TRIANGLE
+.. |lrtri|    unicode:: U+022BF .. RIGHT TRIANGLE
+.. |mho|      unicode:: U+02127 .. INVERTED OHM SIGN
+.. |nang|     unicode:: U+02220 U+020D2 .. ANGLE with vertical line
+.. |nexist|   unicode:: U+02204 .. THERE DOES NOT EXIST
+.. |oS|       unicode:: U+024C8 .. CIRCLED LATIN CAPITAL LETTER S
+.. |planck|   unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |plankv|   unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |raemptyv| unicode:: U+029B3 .. EMPTY SET WITH RIGHT ARROW ABOVE
+.. |range|    unicode:: U+029A5 .. REVERSED ANGLE WITH UNDERBAR
+.. |real|     unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |sbsol|    unicode:: U+0FE68 .. SMALL REVERSE SOLIDUS
+.. |tbrk|     unicode:: U+023B4 .. TOP SQUARE BRACKET
+.. |trpezium| unicode:: U+0FFFD .. REPLACEMENT CHARACTER
+.. |ultri|    unicode:: U+025F8 .. UPPER LEFT TRIANGLE
+.. |urtri|    unicode:: U+025F9 .. UPPER RIGHT TRIANGLE
+.. |vprime|   unicode:: U+02032 .. PRIME
+.. |vzigzag|  unicode:: U+0299A .. VERTICAL ZIGZAG LINE
+.. |weierp|   unicode:: U+02118 .. SCRIPT CAPITAL P
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isoamsr.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,191 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |apE|      unicode:: U+02A70 .. APPROXIMATELY EQUAL OR EQUAL TO
+.. |ape|      unicode:: U+0224A .. ALMOST EQUAL OR EQUAL TO
+.. |apid|     unicode:: U+0224B .. TRIPLE TILDE
+.. |asymp|    unicode:: U+02248 .. ALMOST EQUAL TO
+.. |Barv|     unicode:: U+02AE7 .. SHORT DOWN TACK WITH OVERBAR
+.. |bcong|    unicode:: U+0224C .. ALL EQUAL TO
+.. |bepsi|    unicode:: U+003F6 .. GREEK REVERSED LUNATE EPSILON SYMBOL
+.. |bowtie|   unicode:: U+022C8 .. BOWTIE
+.. |bsim|     unicode:: U+0223D .. REVERSED TILDE
+.. |bsime|    unicode:: U+022CD .. REVERSED TILDE EQUALS
+.. |bsolhsub| unicode:: U+0005C U+02282 .. REVERSE SOLIDUS, SUBSET OF
+.. |bump|     unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
+.. |bumpE|    unicode:: U+02AAE .. EQUALS SIGN WITH BUMPY ABOVE
+.. |bumpe|    unicode:: U+0224F .. DIFFERENCE BETWEEN
+.. |cire|     unicode:: U+02257 .. RING EQUAL TO
+.. |Colon|    unicode:: U+02237 .. PROPORTION
+.. |Colone|   unicode:: U+02A74 .. DOUBLE COLON EQUAL
+.. |colone|   unicode:: U+02254 .. COLON EQUALS
+.. |congdot|  unicode:: U+02A6D .. CONGRUENT WITH DOT ABOVE
+.. |csub|     unicode:: U+02ACF .. CLOSED SUBSET
+.. |csube|    unicode:: U+02AD1 .. CLOSED SUBSET OR EQUAL TO
+.. |csup|     unicode:: U+02AD0 .. CLOSED SUPERSET
+.. |csupe|    unicode:: U+02AD2 .. CLOSED SUPERSET OR EQUAL TO
+.. |cuepr|    unicode:: U+022DE .. EQUAL TO OR PRECEDES
+.. |cuesc|    unicode:: U+022DF .. EQUAL TO OR SUCCEEDS
+.. |cupre|    unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |Dashv|    unicode:: U+02AE4 .. VERTICAL BAR DOUBLE LEFT TURNSTILE
+.. |dashv|    unicode:: U+022A3 .. LEFT TACK
+.. |easter|   unicode:: U+02A6E .. EQUALS WITH ASTERISK
+.. |ecir|     unicode:: U+02256 .. RING IN EQUAL TO
+.. |ecolon|   unicode:: U+02255 .. EQUALS COLON
+.. |eDDot|    unicode:: U+02A77 .. EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+.. |eDot|     unicode:: U+02251 .. GEOMETRICALLY EQUAL TO
+.. |efDot|    unicode:: U+02252 .. APPROXIMATELY EQUAL TO OR THE IMAGE OF
+.. |eg|       unicode:: U+02A9A .. DOUBLE-LINE EQUAL TO OR GREATER-THAN
+.. |egs|      unicode:: U+02A96 .. SLANTED EQUAL TO OR GREATER-THAN
+.. |egsdot|   unicode:: U+02A98 .. SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+.. |el|       unicode:: U+02A99 .. DOUBLE-LINE EQUAL TO OR LESS-THAN
+.. |els|      unicode:: U+02A95 .. SLANTED EQUAL TO OR LESS-THAN
+.. |elsdot|   unicode:: U+02A97 .. SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+.. |equest|   unicode:: U+0225F .. QUESTIONED EQUAL TO
+.. |equivDD|  unicode:: U+02A78 .. EQUIVALENT WITH FOUR DOTS ABOVE
+.. |erDot|    unicode:: U+02253 .. IMAGE OF OR APPROXIMATELY EQUAL TO
+.. |esdot|    unicode:: U+02250 .. APPROACHES THE LIMIT
+.. |Esim|     unicode:: U+02A73 .. EQUALS SIGN ABOVE TILDE OPERATOR
+.. |esim|     unicode:: U+02242 .. MINUS TILDE
+.. |fork|     unicode:: U+022D4 .. PITCHFORK
+.. |forkv|    unicode:: U+02AD9 .. ELEMENT OF OPENING DOWNWARDS
+.. |frown|    unicode:: U+02322 .. FROWN
+.. |gap|      unicode:: U+02A86 .. GREATER-THAN OR APPROXIMATE
+.. |gE|       unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
+.. |gEl|      unicode:: U+02A8C .. GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+.. |gel|      unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
+.. |ges|      unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
+.. |gescc|    unicode:: U+02AA9 .. GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+.. |gesdot|   unicode:: U+02A80 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+.. |gesdoto|  unicode:: U+02A82 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+.. |gesdotol| unicode:: U+02A84 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+.. |gesl|     unicode:: U+022DB U+0FE00 .. GREATER-THAN slanted EQUAL TO OR LESS-THAN
+.. |gesles|   unicode:: U+02A94 .. GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+.. |Gg|       unicode:: U+022D9 .. VERY MUCH GREATER-THAN
+.. |gl|       unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
+.. |gla|      unicode:: U+02AA5 .. GREATER-THAN BESIDE LESS-THAN
+.. |glE|      unicode:: U+02A92 .. GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+.. |glj|      unicode:: U+02AA4 .. GREATER-THAN OVERLAPPING LESS-THAN
+.. |gsdot|    unicode:: U+022D7 .. GREATER-THAN WITH DOT
+.. |gsim|     unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
+.. |gsime|    unicode:: U+02A8E .. GREATER-THAN ABOVE SIMILAR OR EQUAL
+.. |gsiml|    unicode:: U+02A90 .. GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+.. |Gt|       unicode:: U+0226B .. MUCH GREATER-THAN
+.. |gtcc|     unicode:: U+02AA7 .. GREATER-THAN CLOSED BY CURVE
+.. |gtcir|    unicode:: U+02A7A .. GREATER-THAN WITH CIRCLE INSIDE
+.. |gtdot|    unicode:: U+022D7 .. GREATER-THAN WITH DOT
+.. |gtquest|  unicode:: U+02A7C .. GREATER-THAN WITH QUESTION MARK ABOVE
+.. |gtrarr|   unicode:: U+02978 .. GREATER-THAN ABOVE RIGHTWARDS ARROW
+.. |homtht|   unicode:: U+0223B .. HOMOTHETIC
+.. |lap|      unicode:: U+02A85 .. LESS-THAN OR APPROXIMATE
+.. |lat|      unicode:: U+02AAB .. LARGER THAN
+.. |late|     unicode:: U+02AAD .. LARGER THAN OR EQUAL TO
+.. |lates|    unicode:: U+02AAD U+0FE00 .. LARGER THAN OR slanted EQUAL
+.. |ldot|     unicode:: U+022D6 .. LESS-THAN WITH DOT
+.. |lE|       unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
+.. |lEg|      unicode:: U+02A8B .. LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+.. |leg|      unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
+.. |les|      unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
+.. |lescc|    unicode:: U+02AA8 .. LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+.. |lesdot|   unicode:: U+02A7F .. LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+.. |lesdoto|  unicode:: U+02A81 .. LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+.. |lesdotor| unicode:: U+02A83 .. LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+.. |lesg|     unicode:: U+022DA U+0FE00 .. LESS-THAN slanted EQUAL TO OR GREATER-THAN
+.. |lesges|   unicode:: U+02A93 .. LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+.. |lg|       unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
+.. |lgE|      unicode:: U+02A91 .. LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+.. |Ll|       unicode:: U+022D8 .. VERY MUCH LESS-THAN
+.. |lsim|     unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
+.. |lsime|    unicode:: U+02A8D .. LESS-THAN ABOVE SIMILAR OR EQUAL
+.. |lsimg|    unicode:: U+02A8F .. LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+.. |Lt|       unicode:: U+0226A .. MUCH LESS-THAN
+.. |ltcc|     unicode:: U+02AA6 .. LESS-THAN CLOSED BY CURVE
+.. |ltcir|    unicode:: U+02A79 .. LESS-THAN WITH CIRCLE INSIDE
+.. |ltdot|    unicode:: U+022D6 .. LESS-THAN WITH DOT
+.. |ltlarr|   unicode:: U+02976 .. LESS-THAN ABOVE LEFTWARDS ARROW
+.. |ltquest|  unicode:: U+02A7B .. LESS-THAN WITH QUESTION MARK ABOVE
+.. |ltrie|    unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
+.. |mcomma|   unicode:: U+02A29 .. MINUS SIGN WITH COMMA ABOVE
+.. |mDDot|    unicode:: U+0223A .. GEOMETRIC PROPORTION
+.. |mid|      unicode:: U+02223 .. DIVIDES
+.. |mlcp|     unicode:: U+02ADB .. TRANSVERSAL INTERSECTION
+.. |models|   unicode:: U+022A7 .. MODELS
+.. |mstpos|   unicode:: U+0223E .. INVERTED LAZY S
+.. |Pr|       unicode:: U+02ABB .. DOUBLE PRECEDES
+.. |pr|       unicode:: U+0227A .. PRECEDES
+.. |prap|     unicode:: U+02AB7 .. PRECEDES ABOVE ALMOST EQUAL TO
+.. |prcue|    unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |prE|      unicode:: U+02AB3 .. PRECEDES ABOVE EQUALS SIGN
+.. |pre|      unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+.. |prsim|    unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
+.. |prurel|   unicode:: U+022B0 .. PRECEDES UNDER RELATION
+.. |ratio|    unicode:: U+02236 .. RATIO
+.. |rtrie|    unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+.. |rtriltri| unicode:: U+029CE .. RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+.. |samalg|   unicode:: U+02210 .. N-ARY COPRODUCT
+.. |Sc|       unicode:: U+02ABC .. DOUBLE SUCCEEDS
+.. |sc|       unicode:: U+0227B .. SUCCEEDS
+.. |scap|     unicode:: U+02AB8 .. SUCCEEDS ABOVE ALMOST EQUAL TO
+.. |sccue|    unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
+.. |scE|      unicode:: U+02AB4 .. SUCCEEDS ABOVE EQUALS SIGN
+.. |sce|      unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+.. |scsim|    unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
+.. |sdote|    unicode:: U+02A66 .. EQUALS SIGN WITH DOT BELOW
+.. |sfrown|   unicode:: U+02322 .. FROWN
+.. |simg|     unicode:: U+02A9E .. SIMILAR OR GREATER-THAN
+.. |simgE|    unicode:: U+02AA0 .. SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+.. |siml|     unicode:: U+02A9D .. SIMILAR OR LESS-THAN
+.. |simlE|    unicode:: U+02A9F .. SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+.. |smid|     unicode:: U+02223 .. DIVIDES
+.. |smile|    unicode:: U+02323 .. SMILE
+.. |smt|      unicode:: U+02AAA .. SMALLER THAN
+.. |smte|     unicode:: U+02AAC .. SMALLER THAN OR EQUAL TO
+.. |smtes|    unicode:: U+02AAC U+0FE00 .. SMALLER THAN OR slanted EQUAL
+.. |spar|     unicode:: U+02225 .. PARALLEL TO
+.. |sqsub|    unicode:: U+0228F .. SQUARE IMAGE OF
+.. |sqsube|   unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
+.. |sqsup|    unicode:: U+02290 .. SQUARE ORIGINAL OF
+.. |sqsupe|   unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
+.. |ssmile|   unicode:: U+02323 .. SMILE
+.. |Sub|      unicode:: U+022D0 .. DOUBLE SUBSET
+.. |subE|     unicode:: U+02AC5 .. SUBSET OF ABOVE EQUALS SIGN
+.. |subedot|  unicode:: U+02AC3 .. SUBSET OF OR EQUAL TO WITH DOT ABOVE
+.. |submult|  unicode:: U+02AC1 .. SUBSET WITH MULTIPLICATION SIGN BELOW
+.. |subplus|  unicode:: U+02ABF .. SUBSET WITH PLUS SIGN BELOW
+.. |subrarr|  unicode:: U+02979 .. SUBSET ABOVE RIGHTWARDS ARROW
+.. |subsim|   unicode:: U+02AC7 .. SUBSET OF ABOVE TILDE OPERATOR
+.. |subsub|   unicode:: U+02AD5 .. SUBSET ABOVE SUBSET
+.. |subsup|   unicode:: U+02AD3 .. SUBSET ABOVE SUPERSET
+.. |Sup|      unicode:: U+022D1 .. DOUBLE SUPERSET
+.. |supdsub|  unicode:: U+02AD8 .. SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+.. |supE|     unicode:: U+02AC6 .. SUPERSET OF ABOVE EQUALS SIGN
+.. |supedot|  unicode:: U+02AC4 .. SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+.. |suphsol|  unicode:: U+02283 U+0002F .. SUPERSET OF, SOLIDUS
+.. |suphsub|  unicode:: U+02AD7 .. SUPERSET BESIDE SUBSET
+.. |suplarr|  unicode:: U+0297B .. SUPERSET ABOVE LEFTWARDS ARROW
+.. |supmult|  unicode:: U+02AC2 .. SUPERSET WITH MULTIPLICATION SIGN BELOW
+.. |supplus|  unicode:: U+02AC0 .. SUPERSET WITH PLUS SIGN BELOW
+.. |supsim|   unicode:: U+02AC8 .. SUPERSET OF ABOVE TILDE OPERATOR
+.. |supsub|   unicode:: U+02AD4 .. SUPERSET ABOVE SUBSET
+.. |supsup|   unicode:: U+02AD6 .. SUPERSET ABOVE SUPERSET
+.. |thkap|    unicode:: U+02248 .. ALMOST EQUAL TO
+.. |thksim|   unicode:: U+0223C .. TILDE OPERATOR
+.. |topfork|  unicode:: U+02ADA .. PITCHFORK WITH TEE TOP
+.. |trie|     unicode:: U+0225C .. DELTA EQUAL TO
+.. |twixt|    unicode:: U+0226C .. BETWEEN
+.. |Vbar|     unicode:: U+02AEB .. DOUBLE UP TACK
+.. |vBar|     unicode:: U+02AE8 .. SHORT UP TACK WITH UNDERBAR
+.. |vBarv|    unicode:: U+02AE9 .. SHORT UP TACK ABOVE SHORT DOWN TACK
+.. |VDash|    unicode:: U+022AB .. DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+.. |Vdash|    unicode:: U+022A9 .. FORCES
+.. |vDash|    unicode:: U+022A8 .. TRUE
+.. |vdash|    unicode:: U+022A2 .. RIGHT TACK
+.. |Vdashl|   unicode:: U+02AE6 .. LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+.. |veebar|   unicode:: U+022BB .. XOR
+.. |vltri|    unicode:: U+022B2 .. NORMAL SUBGROUP OF
+.. |vprop|    unicode:: U+0221D .. PROPORTIONAL TO
+.. |vrtri|    unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
+.. |Vvdash|   unicode:: U+022AA .. TRIPLE VERTICAL BAR RIGHT TURNSTILE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isobox.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,46 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |boxDL| unicode:: U+02557 .. BOX DRAWINGS DOUBLE DOWN AND LEFT
+.. |boxDl| unicode:: U+02556 .. BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+.. |boxdL| unicode:: U+02555 .. BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+.. |boxdl| unicode:: U+02510 .. BOX DRAWINGS LIGHT DOWN AND LEFT
+.. |boxDR| unicode:: U+02554 .. BOX DRAWINGS DOUBLE DOWN AND RIGHT
+.. |boxDr| unicode:: U+02553 .. BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+.. |boxdR| unicode:: U+02552 .. BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+.. |boxdr| unicode:: U+0250C .. BOX DRAWINGS LIGHT DOWN AND RIGHT
+.. |boxH|  unicode:: U+02550 .. BOX DRAWINGS DOUBLE HORIZONTAL
+.. |boxh|  unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
+.. |boxHD| unicode:: U+02566 .. BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+.. |boxHd| unicode:: U+02564 .. BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+.. |boxhD| unicode:: U+02565 .. BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+.. |boxhd| unicode:: U+0252C .. BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+.. |boxHU| unicode:: U+02569 .. BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+.. |boxHu| unicode:: U+02567 .. BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+.. |boxhU| unicode:: U+02568 .. BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+.. |boxhu| unicode:: U+02534 .. BOX DRAWINGS LIGHT UP AND HORIZONTAL
+.. |boxUL| unicode:: U+0255D .. BOX DRAWINGS DOUBLE UP AND LEFT
+.. |boxUl| unicode:: U+0255C .. BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+.. |boxuL| unicode:: U+0255B .. BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+.. |boxul| unicode:: U+02518 .. BOX DRAWINGS LIGHT UP AND LEFT
+.. |boxUR| unicode:: U+0255A .. BOX DRAWINGS DOUBLE UP AND RIGHT
+.. |boxUr| unicode:: U+02559 .. BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+.. |boxuR| unicode:: U+02558 .. BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+.. |boxur| unicode:: U+02514 .. BOX DRAWINGS LIGHT UP AND RIGHT
+.. |boxV|  unicode:: U+02551 .. BOX DRAWINGS DOUBLE VERTICAL
+.. |boxv|  unicode:: U+02502 .. BOX DRAWINGS LIGHT VERTICAL
+.. |boxVH| unicode:: U+0256C .. BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+.. |boxVh| unicode:: U+0256B .. BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+.. |boxvH| unicode:: U+0256A .. BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+.. |boxvh| unicode:: U+0253C .. BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+.. |boxVL| unicode:: U+02563 .. BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+.. |boxVl| unicode:: U+02562 .. BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+.. |boxvL| unicode:: U+02561 .. BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+.. |boxvl| unicode:: U+02524 .. BOX DRAWINGS LIGHT VERTICAL AND LEFT
+.. |boxVR| unicode:: U+02560 .. BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+.. |boxVr| unicode:: U+0255F .. BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+.. |boxvR| unicode:: U+0255E .. BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+.. |boxvr| unicode:: U+0251C .. BOX DRAWINGS LIGHT VERTICAL AND RIGHT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isocyr1.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,73 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Acy|    unicode:: U+00410 .. CYRILLIC CAPITAL LETTER A
+.. |acy|    unicode:: U+00430 .. CYRILLIC SMALL LETTER A
+.. |Bcy|    unicode:: U+00411 .. CYRILLIC CAPITAL LETTER BE
+.. |bcy|    unicode:: U+00431 .. CYRILLIC SMALL LETTER BE
+.. |CHcy|   unicode:: U+00427 .. CYRILLIC CAPITAL LETTER CHE
+.. |chcy|   unicode:: U+00447 .. CYRILLIC SMALL LETTER CHE
+.. |Dcy|    unicode:: U+00414 .. CYRILLIC CAPITAL LETTER DE
+.. |dcy|    unicode:: U+00434 .. CYRILLIC SMALL LETTER DE
+.. |Ecy|    unicode:: U+0042D .. CYRILLIC CAPITAL LETTER E
+.. |ecy|    unicode:: U+0044D .. CYRILLIC SMALL LETTER E
+.. |Fcy|    unicode:: U+00424 .. CYRILLIC CAPITAL LETTER EF
+.. |fcy|    unicode:: U+00444 .. CYRILLIC SMALL LETTER EF
+.. |Gcy|    unicode:: U+00413 .. CYRILLIC CAPITAL LETTER GHE
+.. |gcy|    unicode:: U+00433 .. CYRILLIC SMALL LETTER GHE
+.. |HARDcy| unicode:: U+0042A .. CYRILLIC CAPITAL LETTER HARD SIGN
+.. |hardcy| unicode:: U+0044A .. CYRILLIC SMALL LETTER HARD SIGN
+.. |Icy|    unicode:: U+00418 .. CYRILLIC CAPITAL LETTER I
+.. |icy|    unicode:: U+00438 .. CYRILLIC SMALL LETTER I
+.. |IEcy|   unicode:: U+00415 .. CYRILLIC CAPITAL LETTER IE
+.. |iecy|   unicode:: U+00435 .. CYRILLIC SMALL LETTER IE
+.. |IOcy|   unicode:: U+00401 .. CYRILLIC CAPITAL LETTER IO
+.. |iocy|   unicode:: U+00451 .. CYRILLIC SMALL LETTER IO
+.. |Jcy|    unicode:: U+00419 .. CYRILLIC CAPITAL LETTER SHORT I
+.. |jcy|    unicode:: U+00439 .. CYRILLIC SMALL LETTER SHORT I
+.. |Kcy|    unicode:: U+0041A .. CYRILLIC CAPITAL LETTER KA
+.. |kcy|    unicode:: U+0043A .. CYRILLIC SMALL LETTER KA
+.. |KHcy|   unicode:: U+00425 .. CYRILLIC CAPITAL LETTER HA
+.. |khcy|   unicode:: U+00445 .. CYRILLIC SMALL LETTER HA
+.. |Lcy|    unicode:: U+0041B .. CYRILLIC CAPITAL LETTER EL
+.. |lcy|    unicode:: U+0043B .. CYRILLIC SMALL LETTER EL
+.. |Mcy|    unicode:: U+0041C .. CYRILLIC CAPITAL LETTER EM
+.. |mcy|    unicode:: U+0043C .. CYRILLIC SMALL LETTER EM
+.. |Ncy|    unicode:: U+0041D .. CYRILLIC CAPITAL LETTER EN
+.. |ncy|    unicode:: U+0043D .. CYRILLIC SMALL LETTER EN
+.. |numero| unicode:: U+02116 .. NUMERO SIGN
+.. |Ocy|    unicode:: U+0041E .. CYRILLIC CAPITAL LETTER O
+.. |ocy|    unicode:: U+0043E .. CYRILLIC SMALL LETTER O
+.. |Pcy|    unicode:: U+0041F .. CYRILLIC CAPITAL LETTER PE
+.. |pcy|    unicode:: U+0043F .. CYRILLIC SMALL LETTER PE
+.. |Rcy|    unicode:: U+00420 .. CYRILLIC CAPITAL LETTER ER
+.. |rcy|    unicode:: U+00440 .. CYRILLIC SMALL LETTER ER
+.. |Scy|    unicode:: U+00421 .. CYRILLIC CAPITAL LETTER ES
+.. |scy|    unicode:: U+00441 .. CYRILLIC SMALL LETTER ES
+.. |SHCHcy| unicode:: U+00429 .. CYRILLIC CAPITAL LETTER SHCHA
+.. |shchcy| unicode:: U+00449 .. CYRILLIC SMALL LETTER SHCHA
+.. |SHcy|   unicode:: U+00428 .. CYRILLIC CAPITAL LETTER SHA
+.. |shcy|   unicode:: U+00448 .. CYRILLIC SMALL LETTER SHA
+.. |SOFTcy| unicode:: U+0042C .. CYRILLIC CAPITAL LETTER SOFT SIGN
+.. |softcy| unicode:: U+0044C .. CYRILLIC SMALL LETTER SOFT SIGN
+.. |Tcy|    unicode:: U+00422 .. CYRILLIC CAPITAL LETTER TE
+.. |tcy|    unicode:: U+00442 .. CYRILLIC SMALL LETTER TE
+.. |TScy|   unicode:: U+00426 .. CYRILLIC CAPITAL LETTER TSE
+.. |tscy|   unicode:: U+00446 .. CYRILLIC SMALL LETTER TSE
+.. |Ucy|    unicode:: U+00423 .. CYRILLIC CAPITAL LETTER U
+.. |ucy|    unicode:: U+00443 .. CYRILLIC SMALL LETTER U
+.. |Vcy|    unicode:: U+00412 .. CYRILLIC CAPITAL LETTER VE
+.. |vcy|    unicode:: U+00432 .. CYRILLIC SMALL LETTER VE
+.. |YAcy|   unicode:: U+0042F .. CYRILLIC CAPITAL LETTER YA
+.. |yacy|   unicode:: U+0044F .. CYRILLIC SMALL LETTER YA
+.. |Ycy|    unicode:: U+0042B .. CYRILLIC CAPITAL LETTER YERU
+.. |ycy|    unicode:: U+0044B .. CYRILLIC SMALL LETTER YERU
+.. |YUcy|   unicode:: U+0042E .. CYRILLIC CAPITAL LETTER YU
+.. |yucy|   unicode:: U+0044E .. CYRILLIC SMALL LETTER YU
+.. |Zcy|    unicode:: U+00417 .. CYRILLIC CAPITAL LETTER ZE
+.. |zcy|    unicode:: U+00437 .. CYRILLIC SMALL LETTER ZE
+.. |ZHcy|   unicode:: U+00416 .. CYRILLIC CAPITAL LETTER ZHE
+.. |zhcy|   unicode:: U+00436 .. CYRILLIC SMALL LETTER ZHE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isocyr2.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,32 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |DJcy|   unicode:: U+00402 .. CYRILLIC CAPITAL LETTER DJE
+.. |djcy|   unicode:: U+00452 .. CYRILLIC SMALL LETTER DJE
+.. |DScy|   unicode:: U+00405 .. CYRILLIC CAPITAL LETTER DZE
+.. |dscy|   unicode:: U+00455 .. CYRILLIC SMALL LETTER DZE
+.. |DZcy|   unicode:: U+0040F .. CYRILLIC CAPITAL LETTER DZHE
+.. |dzcy|   unicode:: U+0045F .. CYRILLIC SMALL LETTER DZHE
+.. |GJcy|   unicode:: U+00403 .. CYRILLIC CAPITAL LETTER GJE
+.. |gjcy|   unicode:: U+00453 .. CYRILLIC SMALL LETTER GJE
+.. |Iukcy|  unicode:: U+00406 .. CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+.. |iukcy|  unicode:: U+00456 .. CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+.. |Jsercy| unicode:: U+00408 .. CYRILLIC CAPITAL LETTER JE
+.. |jsercy| unicode:: U+00458 .. CYRILLIC SMALL LETTER JE
+.. |Jukcy|  unicode:: U+00404 .. CYRILLIC CAPITAL LETTER UKRAINIAN IE
+.. |jukcy|  unicode:: U+00454 .. CYRILLIC SMALL LETTER UKRAINIAN IE
+.. |KJcy|   unicode:: U+0040C .. CYRILLIC CAPITAL LETTER KJE
+.. |kjcy|   unicode:: U+0045C .. CYRILLIC SMALL LETTER KJE
+.. |LJcy|   unicode:: U+00409 .. CYRILLIC CAPITAL LETTER LJE
+.. |ljcy|   unicode:: U+00459 .. CYRILLIC SMALL LETTER LJE
+.. |NJcy|   unicode:: U+0040A .. CYRILLIC CAPITAL LETTER NJE
+.. |njcy|   unicode:: U+0045A .. CYRILLIC SMALL LETTER NJE
+.. |TSHcy|  unicode:: U+0040B .. CYRILLIC CAPITAL LETTER TSHE
+.. |tshcy|  unicode:: U+0045B .. CYRILLIC SMALL LETTER TSHE
+.. |Ubrcy|  unicode:: U+0040E .. CYRILLIC CAPITAL LETTER SHORT U
+.. |ubrcy|  unicode:: U+0045E .. CYRILLIC SMALL LETTER SHORT U
+.. |YIcy|   unicode:: U+00407 .. CYRILLIC CAPITAL LETTER YI
+.. |yicy|   unicode:: U+00457 .. CYRILLIC SMALL LETTER YI
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isodia.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,20 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |acute| unicode:: U+000B4 .. ACUTE ACCENT
+.. |breve| unicode:: U+002D8 .. BREVE
+.. |caron| unicode:: U+002C7 .. CARON
+.. |cedil| unicode:: U+000B8 .. CEDILLA
+.. |circ|  unicode:: U+002C6 .. MODIFIER LETTER CIRCUMFLEX ACCENT
+.. |dblac| unicode:: U+002DD .. DOUBLE ACUTE ACCENT
+.. |die|   unicode:: U+000A8 .. DIAERESIS
+.. |dot|   unicode:: U+002D9 .. DOT ABOVE
+.. |grave| unicode:: U+00060 .. GRAVE ACCENT
+.. |macr|  unicode:: U+000AF .. MACRON
+.. |ogon|  unicode:: U+002DB .. OGONEK
+.. |ring|  unicode:: U+002DA .. RING ABOVE
+.. |tilde| unicode:: U+002DC .. SMALL TILDE
+.. |uml|   unicode:: U+000A8 .. DIAERESIS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk1.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,55 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Agr|  unicode:: U+00391 .. GREEK CAPITAL LETTER ALPHA
+.. |agr|  unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
+.. |Bgr|  unicode:: U+00392 .. GREEK CAPITAL LETTER BETA
+.. |bgr|  unicode:: U+003B2 .. GREEK SMALL LETTER BETA
+.. |Dgr|  unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
+.. |dgr|  unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
+.. |EEgr| unicode:: U+00397 .. GREEK CAPITAL LETTER ETA
+.. |eegr| unicode:: U+003B7 .. GREEK SMALL LETTER ETA
+.. |Egr|  unicode:: U+00395 .. GREEK CAPITAL LETTER EPSILON
+.. |egr|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |Ggr|  unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
+.. |ggr|  unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
+.. |Igr|  unicode:: U+00399 .. GREEK CAPITAL LETTER IOTA
+.. |igr|  unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
+.. |Kgr|  unicode:: U+0039A .. GREEK CAPITAL LETTER KAPPA
+.. |kgr|  unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
+.. |KHgr| unicode:: U+003A7 .. GREEK CAPITAL LETTER CHI
+.. |khgr| unicode:: U+003C7 .. GREEK SMALL LETTER CHI
+.. |Lgr|  unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
+.. |lgr|  unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
+.. |Mgr|  unicode:: U+0039C .. GREEK CAPITAL LETTER MU
+.. |mgr|  unicode:: U+003BC .. GREEK SMALL LETTER MU
+.. |Ngr|  unicode:: U+0039D .. GREEK CAPITAL LETTER NU
+.. |ngr|  unicode:: U+003BD .. GREEK SMALL LETTER NU
+.. |Ogr|  unicode:: U+0039F .. GREEK CAPITAL LETTER OMICRON
+.. |ogr|  unicode:: U+003BF .. GREEK SMALL LETTER OMICRON
+.. |OHgr| unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
+.. |ohgr| unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
+.. |Pgr|  unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
+.. |pgr|  unicode:: U+003C0 .. GREEK SMALL LETTER PI
+.. |PHgr| unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
+.. |phgr| unicode:: U+003C6 .. GREEK SMALL LETTER PHI
+.. |PSgr| unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
+.. |psgr| unicode:: U+003C8 .. GREEK SMALL LETTER PSI
+.. |Rgr|  unicode:: U+003A1 .. GREEK CAPITAL LETTER RHO
+.. |rgr|  unicode:: U+003C1 .. GREEK SMALL LETTER RHO
+.. |sfgr| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |Sgr|  unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
+.. |sgr|  unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
+.. |Tgr|  unicode:: U+003A4 .. GREEK CAPITAL LETTER TAU
+.. |tgr|  unicode:: U+003C4 .. GREEK SMALL LETTER TAU
+.. |THgr| unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
+.. |thgr| unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |Ugr|  unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |ugr|  unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |Xgr|  unicode:: U+0039E .. GREEK CAPITAL LETTER XI
+.. |xgr|  unicode:: U+003BE .. GREEK SMALL LETTER XI
+.. |Zgr|  unicode:: U+00396 .. GREEK CAPITAL LETTER ZETA
+.. |zgr|  unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk2.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,26 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aacgr|  unicode:: U+00386 .. GREEK CAPITAL LETTER ALPHA WITH TONOS
+.. |aacgr|  unicode:: U+003AC .. GREEK SMALL LETTER ALPHA WITH TONOS
+.. |Eacgr|  unicode:: U+00388 .. GREEK CAPITAL LETTER EPSILON WITH TONOS
+.. |eacgr|  unicode:: U+003AD .. GREEK SMALL LETTER EPSILON WITH TONOS
+.. |EEacgr| unicode:: U+00389 .. GREEK CAPITAL LETTER ETA WITH TONOS
+.. |eeacgr| unicode:: U+003AE .. GREEK SMALL LETTER ETA WITH TONOS
+.. |Iacgr|  unicode:: U+0038A .. GREEK CAPITAL LETTER IOTA WITH TONOS
+.. |iacgr|  unicode:: U+003AF .. GREEK SMALL LETTER IOTA WITH TONOS
+.. |idiagr| unicode:: U+00390 .. GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+.. |Idigr|  unicode:: U+003AA .. GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+.. |idigr|  unicode:: U+003CA .. GREEK SMALL LETTER IOTA WITH DIALYTIKA
+.. |Oacgr|  unicode:: U+0038C .. GREEK CAPITAL LETTER OMICRON WITH TONOS
+.. |oacgr|  unicode:: U+003CC .. GREEK SMALL LETTER OMICRON WITH TONOS
+.. |OHacgr| unicode:: U+0038F .. GREEK CAPITAL LETTER OMEGA WITH TONOS
+.. |ohacgr| unicode:: U+003CE .. GREEK SMALL LETTER OMEGA WITH TONOS
+.. |Uacgr|  unicode:: U+0038E .. GREEK CAPITAL LETTER UPSILON WITH TONOS
+.. |uacgr|  unicode:: U+003CD .. GREEK SMALL LETTER UPSILON WITH TONOS
+.. |udiagr| unicode:: U+003B0 .. GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+.. |Udigr|  unicode:: U+003AB .. GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+.. |udigr|  unicode:: U+003CB .. GREEK SMALL LETTER UPSILON WITH DIALYTIKA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk3.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,52 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |alpha|  unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
+.. |beta|   unicode:: U+003B2 .. GREEK SMALL LETTER BETA
+.. |chi|    unicode:: U+003C7 .. GREEK SMALL LETTER CHI
+.. |Delta|  unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
+.. |delta|  unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
+.. |epsi|   unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
+.. |epsis|  unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
+.. |epsiv|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |eta|    unicode:: U+003B7 .. GREEK SMALL LETTER ETA
+.. |Gamma|  unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
+.. |gamma|  unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
+.. |Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
+.. |gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
+.. |iota|   unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
+.. |kappa|  unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
+.. |kappav| unicode:: U+003F0 .. GREEK KAPPA SYMBOL
+.. |Lambda| unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
+.. |lambda| unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
+.. |mu|     unicode:: U+003BC .. GREEK SMALL LETTER MU
+.. |nu|     unicode:: U+003BD .. GREEK SMALL LETTER NU
+.. |Omega|  unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
+.. |omega|  unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
+.. |Phi|    unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
+.. |phi|    unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |phis|   unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |phiv|   unicode:: U+003C6 .. GREEK SMALL LETTER PHI
+.. |Pi|     unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
+.. |pi|     unicode:: U+003C0 .. GREEK SMALL LETTER PI
+.. |piv|    unicode:: U+003D6 .. GREEK PI SYMBOL
+.. |Psi|    unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
+.. |psi|    unicode:: U+003C8 .. GREEK SMALL LETTER PSI
+.. |rho|    unicode:: U+003C1 .. GREEK SMALL LETTER RHO
+.. |rhov|   unicode:: U+003F1 .. GREEK RHO SYMBOL
+.. |Sigma|  unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
+.. |sigma|  unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
+.. |sigmav| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |tau|    unicode:: U+003C4 .. GREEK SMALL LETTER TAU
+.. |Theta|  unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
+.. |theta|  unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |thetas| unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |thetav| unicode:: U+003D1 .. GREEK THETA SYMBOL
+.. |Upsi|   unicode:: U+003D2 .. GREEK UPSILON WITH HOOK SYMBOL
+.. |upsi|   unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |Xi|     unicode:: U+0039E .. GREEK CAPITAL LETTER XI
+.. |xi|     unicode:: U+003BE .. GREEK SMALL LETTER XI
+.. |zeta|   unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk4-wide.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,49 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |b.alpha|  unicode:: U+1D6C2 .. MATHEMATICAL BOLD SMALL ALPHA
+.. |b.beta|   unicode:: U+1D6C3 .. MATHEMATICAL BOLD SMALL BETA
+.. |b.chi|    unicode:: U+1D6D8 .. MATHEMATICAL BOLD SMALL CHI
+.. |b.Delta|  unicode:: U+1D6AB .. MATHEMATICAL BOLD CAPITAL DELTA
+.. |b.delta|  unicode:: U+1D6C5 .. MATHEMATICAL BOLD SMALL DELTA
+.. |b.epsi|   unicode:: U+1D6C6 .. MATHEMATICAL BOLD SMALL EPSILON
+.. |b.epsiv|  unicode:: U+1D6DC .. MATHEMATICAL BOLD EPSILON SYMBOL
+.. |b.eta|    unicode:: U+1D6C8 .. MATHEMATICAL BOLD SMALL ETA
+.. |b.Gamma|  unicode:: U+1D6AA .. MATHEMATICAL BOLD CAPITAL GAMMA
+.. |b.gamma|  unicode:: U+1D6C4 .. MATHEMATICAL BOLD SMALL GAMMA
+.. |b.Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
+.. |b.gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
+.. |b.iota|   unicode:: U+1D6CA .. MATHEMATICAL BOLD SMALL IOTA
+.. |b.kappa|  unicode:: U+1D6CB .. MATHEMATICAL BOLD SMALL KAPPA
+.. |b.kappav| unicode:: U+1D6DE .. MATHEMATICAL BOLD KAPPA SYMBOL
+.. |b.Lambda| unicode:: U+1D6B2 .. MATHEMATICAL BOLD CAPITAL LAMDA
+.. |b.lambda| unicode:: U+1D6CC .. MATHEMATICAL BOLD SMALL LAMDA
+.. |b.mu|     unicode:: U+1D6CD .. MATHEMATICAL BOLD SMALL MU
+.. |b.nu|     unicode:: U+1D6CE .. MATHEMATICAL BOLD SMALL NU
+.. |b.Omega|  unicode:: U+1D6C0 .. MATHEMATICAL BOLD CAPITAL OMEGA
+.. |b.omega|  unicode:: U+1D6DA .. MATHEMATICAL BOLD SMALL OMEGA
+.. |b.Phi|    unicode:: U+1D6BD .. MATHEMATICAL BOLD CAPITAL PHI
+.. |b.phi|    unicode:: U+1D6D7 .. MATHEMATICAL BOLD SMALL PHI
+.. |b.phiv|   unicode:: U+1D6DF .. MATHEMATICAL BOLD PHI SYMBOL
+.. |b.Pi|     unicode:: U+1D6B7 .. MATHEMATICAL BOLD CAPITAL PI
+.. |b.pi|     unicode:: U+1D6D1 .. MATHEMATICAL BOLD SMALL PI
+.. |b.piv|    unicode:: U+1D6E1 .. MATHEMATICAL BOLD PI SYMBOL
+.. |b.Psi|    unicode:: U+1D6BF .. MATHEMATICAL BOLD CAPITAL PSI
+.. |b.psi|    unicode:: U+1D6D9 .. MATHEMATICAL BOLD SMALL PSI
+.. |b.rho|    unicode:: U+1D6D2 .. MATHEMATICAL BOLD SMALL RHO
+.. |b.rhov|   unicode:: U+1D6E0 .. MATHEMATICAL BOLD RHO SYMBOL
+.. |b.Sigma|  unicode:: U+1D6BA .. MATHEMATICAL BOLD CAPITAL SIGMA
+.. |b.sigma|  unicode:: U+1D6D4 .. MATHEMATICAL BOLD SMALL SIGMA
+.. |b.sigmav| unicode:: U+1D6D3 .. MATHEMATICAL BOLD SMALL FINAL SIGMA
+.. |b.tau|    unicode:: U+1D6D5 .. MATHEMATICAL BOLD SMALL TAU
+.. |b.Theta|  unicode:: U+1D6AF .. MATHEMATICAL BOLD CAPITAL THETA
+.. |b.thetas| unicode:: U+1D6C9 .. MATHEMATICAL BOLD SMALL THETA
+.. |b.thetav| unicode:: U+1D6DD .. MATHEMATICAL BOLD THETA SYMBOL
+.. |b.Upsi|   unicode:: U+1D6BC .. MATHEMATICAL BOLD CAPITAL UPSILON
+.. |b.upsi|   unicode:: U+1D6D6 .. MATHEMATICAL BOLD SMALL UPSILON
+.. |b.Xi|     unicode:: U+1D6B5 .. MATHEMATICAL BOLD CAPITAL XI
+.. |b.xi|     unicode:: U+1D6CF .. MATHEMATICAL BOLD SMALL XI
+.. |b.zeta|   unicode:: U+1D6C7 .. MATHEMATICAL BOLD SMALL ZETA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isogrk4.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,8 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |b.Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
+.. |b.gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isolat1.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,68 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aacute| unicode:: U+000C1 .. LATIN CAPITAL LETTER A WITH ACUTE
+.. |aacute| unicode:: U+000E1 .. LATIN SMALL LETTER A WITH ACUTE
+.. |Acirc|  unicode:: U+000C2 .. LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+.. |acirc|  unicode:: U+000E2 .. LATIN SMALL LETTER A WITH CIRCUMFLEX
+.. |AElig|  unicode:: U+000C6 .. LATIN CAPITAL LETTER AE
+.. |aelig|  unicode:: U+000E6 .. LATIN SMALL LETTER AE
+.. |Agrave| unicode:: U+000C0 .. LATIN CAPITAL LETTER A WITH GRAVE
+.. |agrave| unicode:: U+000E0 .. LATIN SMALL LETTER A WITH GRAVE
+.. |Aring|  unicode:: U+000C5 .. LATIN CAPITAL LETTER A WITH RING ABOVE
+.. |aring|  unicode:: U+000E5 .. LATIN SMALL LETTER A WITH RING ABOVE
+.. |Atilde| unicode:: U+000C3 .. LATIN CAPITAL LETTER A WITH TILDE
+.. |atilde| unicode:: U+000E3 .. LATIN SMALL LETTER A WITH TILDE
+.. |Auml|   unicode:: U+000C4 .. LATIN CAPITAL LETTER A WITH DIAERESIS
+.. |auml|   unicode:: U+000E4 .. LATIN SMALL LETTER A WITH DIAERESIS
+.. |Ccedil| unicode:: U+000C7 .. LATIN CAPITAL LETTER C WITH CEDILLA
+.. |ccedil| unicode:: U+000E7 .. LATIN SMALL LETTER C WITH CEDILLA
+.. |Eacute| unicode:: U+000C9 .. LATIN CAPITAL LETTER E WITH ACUTE
+.. |eacute| unicode:: U+000E9 .. LATIN SMALL LETTER E WITH ACUTE
+.. |Ecirc|  unicode:: U+000CA .. LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+.. |ecirc|  unicode:: U+000EA .. LATIN SMALL LETTER E WITH CIRCUMFLEX
+.. |Egrave| unicode:: U+000C8 .. LATIN CAPITAL LETTER E WITH GRAVE
+.. |egrave| unicode:: U+000E8 .. LATIN SMALL LETTER E WITH GRAVE
+.. |ETH|    unicode:: U+000D0 .. LATIN CAPITAL LETTER ETH
+.. |eth|    unicode:: U+000F0 .. LATIN SMALL LETTER ETH
+.. |Euml|   unicode:: U+000CB .. LATIN CAPITAL LETTER E WITH DIAERESIS
+.. |euml|   unicode:: U+000EB .. LATIN SMALL LETTER E WITH DIAERESIS
+.. |Iacute| unicode:: U+000CD .. LATIN CAPITAL LETTER I WITH ACUTE
+.. |iacute| unicode:: U+000ED .. LATIN SMALL LETTER I WITH ACUTE
+.. |Icirc|  unicode:: U+000CE .. LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+.. |icirc|  unicode:: U+000EE .. LATIN SMALL LETTER I WITH CIRCUMFLEX
+.. |Igrave| unicode:: U+000CC .. LATIN CAPITAL LETTER I WITH GRAVE
+.. |igrave| unicode:: U+000EC .. LATIN SMALL LETTER I WITH GRAVE
+.. |Iuml|   unicode:: U+000CF .. LATIN CAPITAL LETTER I WITH DIAERESIS
+.. |iuml|   unicode:: U+000EF .. LATIN SMALL LETTER I WITH DIAERESIS
+.. |Ntilde| unicode:: U+000D1 .. LATIN CAPITAL LETTER N WITH TILDE
+.. |ntilde| unicode:: U+000F1 .. LATIN SMALL LETTER N WITH TILDE
+.. |Oacute| unicode:: U+000D3 .. LATIN CAPITAL LETTER O WITH ACUTE
+.. |oacute| unicode:: U+000F3 .. LATIN SMALL LETTER O WITH ACUTE
+.. |Ocirc|  unicode:: U+000D4 .. LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+.. |ocirc|  unicode:: U+000F4 .. LATIN SMALL LETTER O WITH CIRCUMFLEX
+.. |Ograve| unicode:: U+000D2 .. LATIN CAPITAL LETTER O WITH GRAVE
+.. |ograve| unicode:: U+000F2 .. LATIN SMALL LETTER O WITH GRAVE
+.. |Oslash| unicode:: U+000D8 .. LATIN CAPITAL LETTER O WITH STROKE
+.. |oslash| unicode:: U+000F8 .. LATIN SMALL LETTER O WITH STROKE
+.. |Otilde| unicode:: U+000D5 .. LATIN CAPITAL LETTER O WITH TILDE
+.. |otilde| unicode:: U+000F5 .. LATIN SMALL LETTER O WITH TILDE
+.. |Ouml|   unicode:: U+000D6 .. LATIN CAPITAL LETTER O WITH DIAERESIS
+.. |ouml|   unicode:: U+000F6 .. LATIN SMALL LETTER O WITH DIAERESIS
+.. |szlig|  unicode:: U+000DF .. LATIN SMALL LETTER SHARP S
+.. |THORN|  unicode:: U+000DE .. LATIN CAPITAL LETTER THORN
+.. |thorn|  unicode:: U+000FE .. LATIN SMALL LETTER THORN
+.. |Uacute| unicode:: U+000DA .. LATIN CAPITAL LETTER U WITH ACUTE
+.. |uacute| unicode:: U+000FA .. LATIN SMALL LETTER U WITH ACUTE
+.. |Ucirc|  unicode:: U+000DB .. LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+.. |ucirc|  unicode:: U+000FB .. LATIN SMALL LETTER U WITH CIRCUMFLEX
+.. |Ugrave| unicode:: U+000D9 .. LATIN CAPITAL LETTER U WITH GRAVE
+.. |ugrave| unicode:: U+000F9 .. LATIN SMALL LETTER U WITH GRAVE
+.. |Uuml|   unicode:: U+000DC .. LATIN CAPITAL LETTER U WITH DIAERESIS
+.. |uuml|   unicode:: U+000FC .. LATIN SMALL LETTER U WITH DIAERESIS
+.. |Yacute| unicode:: U+000DD .. LATIN CAPITAL LETTER Y WITH ACUTE
+.. |yacute| unicode:: U+000FD .. LATIN SMALL LETTER Y WITH ACUTE
+.. |yuml|   unicode:: U+000FF .. LATIN SMALL LETTER Y WITH DIAERESIS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isolat2.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,128 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Abreve| unicode:: U+00102 .. LATIN CAPITAL LETTER A WITH BREVE
+.. |abreve| unicode:: U+00103 .. LATIN SMALL LETTER A WITH BREVE
+.. |Amacr|  unicode:: U+00100 .. LATIN CAPITAL LETTER A WITH MACRON
+.. |amacr|  unicode:: U+00101 .. LATIN SMALL LETTER A WITH MACRON
+.. |Aogon|  unicode:: U+00104 .. LATIN CAPITAL LETTER A WITH OGONEK
+.. |aogon|  unicode:: U+00105 .. LATIN SMALL LETTER A WITH OGONEK
+.. |Cacute| unicode:: U+00106 .. LATIN CAPITAL LETTER C WITH ACUTE
+.. |cacute| unicode:: U+00107 .. LATIN SMALL LETTER C WITH ACUTE
+.. |Ccaron| unicode:: U+0010C .. LATIN CAPITAL LETTER C WITH CARON
+.. |ccaron| unicode:: U+0010D .. LATIN SMALL LETTER C WITH CARON
+.. |Ccirc|  unicode:: U+00108 .. LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+.. |ccirc|  unicode:: U+00109 .. LATIN SMALL LETTER C WITH CIRCUMFLEX
+.. |Cdot|   unicode:: U+0010A .. LATIN CAPITAL LETTER C WITH DOT ABOVE
+.. |cdot|   unicode:: U+0010B .. LATIN SMALL LETTER C WITH DOT ABOVE
+.. |Dcaron| unicode:: U+0010E .. LATIN CAPITAL LETTER D WITH CARON
+.. |dcaron| unicode:: U+0010F .. LATIN SMALL LETTER D WITH CARON
+.. |Dstrok| unicode:: U+00110 .. LATIN CAPITAL LETTER D WITH STROKE
+.. |dstrok| unicode:: U+00111 .. LATIN SMALL LETTER D WITH STROKE
+.. |Ecaron| unicode:: U+0011A .. LATIN CAPITAL LETTER E WITH CARON
+.. |ecaron| unicode:: U+0011B .. LATIN SMALL LETTER E WITH CARON
+.. |Edot|   unicode:: U+00116 .. LATIN CAPITAL LETTER E WITH DOT ABOVE
+.. |edot|   unicode:: U+00117 .. LATIN SMALL LETTER E WITH DOT ABOVE
+.. |Emacr|  unicode:: U+00112 .. LATIN CAPITAL LETTER E WITH MACRON
+.. |emacr|  unicode:: U+00113 .. LATIN SMALL LETTER E WITH MACRON
+.. |ENG|    unicode:: U+0014A .. LATIN CAPITAL LETTER ENG
+.. |eng|    unicode:: U+0014B .. LATIN SMALL LETTER ENG
+.. |Eogon|  unicode:: U+00118 .. LATIN CAPITAL LETTER E WITH OGONEK
+.. |eogon|  unicode:: U+00119 .. LATIN SMALL LETTER E WITH OGONEK
+.. |gacute| unicode:: U+001F5 .. LATIN SMALL LETTER G WITH ACUTE
+.. |Gbreve| unicode:: U+0011E .. LATIN CAPITAL LETTER G WITH BREVE
+.. |gbreve| unicode:: U+0011F .. LATIN SMALL LETTER G WITH BREVE
+.. |Gcedil| unicode:: U+00122 .. LATIN CAPITAL LETTER G WITH CEDILLA
+.. |gcedil| unicode:: U+00123 .. LATIN SMALL LETTER G WITH CEDILLA
+.. |Gcirc|  unicode:: U+0011C .. LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+.. |gcirc|  unicode:: U+0011D .. LATIN SMALL LETTER G WITH CIRCUMFLEX
+.. |Gdot|   unicode:: U+00120 .. LATIN CAPITAL LETTER G WITH DOT ABOVE
+.. |gdot|   unicode:: U+00121 .. LATIN SMALL LETTER G WITH DOT ABOVE
+.. |Hcirc|  unicode:: U+00124 .. LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+.. |hcirc|  unicode:: U+00125 .. LATIN SMALL LETTER H WITH CIRCUMFLEX
+.. |Hstrok| unicode:: U+00126 .. LATIN CAPITAL LETTER H WITH STROKE
+.. |hstrok| unicode:: U+00127 .. LATIN SMALL LETTER H WITH STROKE
+.. |Idot|   unicode:: U+00130 .. LATIN CAPITAL LETTER I WITH DOT ABOVE
+.. |IJlig|  unicode:: U+00132 .. LATIN CAPITAL LIGATURE IJ
+.. |ijlig|  unicode:: U+00133 .. LATIN SMALL LIGATURE IJ
+.. |Imacr|  unicode:: U+0012A .. LATIN CAPITAL LETTER I WITH MACRON
+.. |imacr|  unicode:: U+0012B .. LATIN SMALL LETTER I WITH MACRON
+.. |inodot| unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
+.. |Iogon|  unicode:: U+0012E .. LATIN CAPITAL LETTER I WITH OGONEK
+.. |iogon|  unicode:: U+0012F .. LATIN SMALL LETTER I WITH OGONEK
+.. |Itilde| unicode:: U+00128 .. LATIN CAPITAL LETTER I WITH TILDE
+.. |itilde| unicode:: U+00129 .. LATIN SMALL LETTER I WITH TILDE
+.. |Jcirc|  unicode:: U+00134 .. LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+.. |jcirc|  unicode:: U+00135 .. LATIN SMALL LETTER J WITH CIRCUMFLEX
+.. |Kcedil| unicode:: U+00136 .. LATIN CAPITAL LETTER K WITH CEDILLA
+.. |kcedil| unicode:: U+00137 .. LATIN SMALL LETTER K WITH CEDILLA
+.. |kgreen| unicode:: U+00138 .. LATIN SMALL LETTER KRA
+.. |Lacute| unicode:: U+00139 .. LATIN CAPITAL LETTER L WITH ACUTE
+.. |lacute| unicode:: U+0013A .. LATIN SMALL LETTER L WITH ACUTE
+.. |Lcaron| unicode:: U+0013D .. LATIN CAPITAL LETTER L WITH CARON
+.. |lcaron| unicode:: U+0013E .. LATIN SMALL LETTER L WITH CARON
+.. |Lcedil| unicode:: U+0013B .. LATIN CAPITAL LETTER L WITH CEDILLA
+.. |lcedil| unicode:: U+0013C .. LATIN SMALL LETTER L WITH CEDILLA
+.. |Lmidot| unicode:: U+0013F .. LATIN CAPITAL LETTER L WITH MIDDLE DOT
+.. |lmidot| unicode:: U+00140 .. LATIN SMALL LETTER L WITH MIDDLE DOT
+.. |Lstrok| unicode:: U+00141 .. LATIN CAPITAL LETTER L WITH STROKE
+.. |lstrok| unicode:: U+00142 .. LATIN SMALL LETTER L WITH STROKE
+.. |Nacute| unicode:: U+00143 .. LATIN CAPITAL LETTER N WITH ACUTE
+.. |nacute| unicode:: U+00144 .. LATIN SMALL LETTER N WITH ACUTE
+.. |napos|  unicode:: U+00149 .. LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+.. |Ncaron| unicode:: U+00147 .. LATIN CAPITAL LETTER N WITH CARON
+.. |ncaron| unicode:: U+00148 .. LATIN SMALL LETTER N WITH CARON
+.. |Ncedil| unicode:: U+00145 .. LATIN CAPITAL LETTER N WITH CEDILLA
+.. |ncedil| unicode:: U+00146 .. LATIN SMALL LETTER N WITH CEDILLA
+.. |Odblac| unicode:: U+00150 .. LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+.. |odblac| unicode:: U+00151 .. LATIN SMALL LETTER O WITH DOUBLE ACUTE
+.. |OElig|  unicode:: U+00152 .. LATIN CAPITAL LIGATURE OE
+.. |oelig|  unicode:: U+00153 .. LATIN SMALL LIGATURE OE
+.. |Omacr|  unicode:: U+0014C .. LATIN CAPITAL LETTER O WITH MACRON
+.. |omacr|  unicode:: U+0014D .. LATIN SMALL LETTER O WITH MACRON
+.. |Racute| unicode:: U+00154 .. LATIN CAPITAL LETTER R WITH ACUTE
+.. |racute| unicode:: U+00155 .. LATIN SMALL LETTER R WITH ACUTE
+.. |Rcaron| unicode:: U+00158 .. LATIN CAPITAL LETTER R WITH CARON
+.. |rcaron| unicode:: U+00159 .. LATIN SMALL LETTER R WITH CARON
+.. |Rcedil| unicode:: U+00156 .. LATIN CAPITAL LETTER R WITH CEDILLA
+.. |rcedil| unicode:: U+00157 .. LATIN SMALL LETTER R WITH CEDILLA
+.. |Sacute| unicode:: U+0015A .. LATIN CAPITAL LETTER S WITH ACUTE
+.. |sacute| unicode:: U+0015B .. LATIN SMALL LETTER S WITH ACUTE
+.. |Scaron| unicode:: U+00160 .. LATIN CAPITAL LETTER S WITH CARON
+.. |scaron| unicode:: U+00161 .. LATIN SMALL LETTER S WITH CARON
+.. |Scedil| unicode:: U+0015E .. LATIN CAPITAL LETTER S WITH CEDILLA
+.. |scedil| unicode:: U+0015F .. LATIN SMALL LETTER S WITH CEDILLA
+.. |Scirc|  unicode:: U+0015C .. LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+.. |scirc|  unicode:: U+0015D .. LATIN SMALL LETTER S WITH CIRCUMFLEX
+.. |Tcaron| unicode:: U+00164 .. LATIN CAPITAL LETTER T WITH CARON
+.. |tcaron| unicode:: U+00165 .. LATIN SMALL LETTER T WITH CARON
+.. |Tcedil| unicode:: U+00162 .. LATIN CAPITAL LETTER T WITH CEDILLA
+.. |tcedil| unicode:: U+00163 .. LATIN SMALL LETTER T WITH CEDILLA
+.. |Tstrok| unicode:: U+00166 .. LATIN CAPITAL LETTER T WITH STROKE
+.. |tstrok| unicode:: U+00167 .. LATIN SMALL LETTER T WITH STROKE
+.. |Ubreve| unicode:: U+0016C .. LATIN CAPITAL LETTER U WITH BREVE
+.. |ubreve| unicode:: U+0016D .. LATIN SMALL LETTER U WITH BREVE
+.. |Udblac| unicode:: U+00170 .. LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+.. |udblac| unicode:: U+00171 .. LATIN SMALL LETTER U WITH DOUBLE ACUTE
+.. |Umacr|  unicode:: U+0016A .. LATIN CAPITAL LETTER U WITH MACRON
+.. |umacr|  unicode:: U+0016B .. LATIN SMALL LETTER U WITH MACRON
+.. |Uogon|  unicode:: U+00172 .. LATIN CAPITAL LETTER U WITH OGONEK
+.. |uogon|  unicode:: U+00173 .. LATIN SMALL LETTER U WITH OGONEK
+.. |Uring|  unicode:: U+0016E .. LATIN CAPITAL LETTER U WITH RING ABOVE
+.. |uring|  unicode:: U+0016F .. LATIN SMALL LETTER U WITH RING ABOVE
+.. |Utilde| unicode:: U+00168 .. LATIN CAPITAL LETTER U WITH TILDE
+.. |utilde| unicode:: U+00169 .. LATIN SMALL LETTER U WITH TILDE
+.. |Wcirc|  unicode:: U+00174 .. LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+.. |wcirc|  unicode:: U+00175 .. LATIN SMALL LETTER W WITH CIRCUMFLEX
+.. |Ycirc|  unicode:: U+00176 .. LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+.. |ycirc|  unicode:: U+00177 .. LATIN SMALL LETTER Y WITH CIRCUMFLEX
+.. |Yuml|   unicode:: U+00178 .. LATIN CAPITAL LETTER Y WITH DIAERESIS
+.. |Zacute| unicode:: U+00179 .. LATIN CAPITAL LETTER Z WITH ACUTE
+.. |zacute| unicode:: U+0017A .. LATIN SMALL LETTER Z WITH ACUTE
+.. |Zcaron| unicode:: U+0017D .. LATIN CAPITAL LETTER Z WITH CARON
+.. |zcaron| unicode:: U+0017E .. LATIN SMALL LETTER Z WITH CARON
+.. |Zdot|   unicode:: U+0017B .. LATIN CAPITAL LETTER Z WITH DOT ABOVE
+.. |zdot|   unicode:: U+0017C .. LATIN SMALL LETTER Z WITH DOT ABOVE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomfrk-wide.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,58 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Afr| unicode:: U+1D504 .. MATHEMATICAL FRAKTUR CAPITAL A
+.. |afr| unicode:: U+1D51E .. MATHEMATICAL FRAKTUR SMALL A
+.. |Bfr| unicode:: U+1D505 .. MATHEMATICAL FRAKTUR CAPITAL B
+.. |bfr| unicode:: U+1D51F .. MATHEMATICAL FRAKTUR SMALL B
+.. |Cfr| unicode:: U+0212D .. BLACK-LETTER CAPITAL C
+.. |cfr| unicode:: U+1D520 .. MATHEMATICAL FRAKTUR SMALL C
+.. |Dfr| unicode:: U+1D507 .. MATHEMATICAL FRAKTUR CAPITAL D
+.. |dfr| unicode:: U+1D521 .. MATHEMATICAL FRAKTUR SMALL D
+.. |Efr| unicode:: U+1D508 .. MATHEMATICAL FRAKTUR CAPITAL E
+.. |efr| unicode:: U+1D522 .. MATHEMATICAL FRAKTUR SMALL E
+.. |Ffr| unicode:: U+1D509 .. MATHEMATICAL FRAKTUR CAPITAL F
+.. |ffr| unicode:: U+1D523 .. MATHEMATICAL FRAKTUR SMALL F
+.. |Gfr| unicode:: U+1D50A .. MATHEMATICAL FRAKTUR CAPITAL G
+.. |gfr| unicode:: U+1D524 .. MATHEMATICAL FRAKTUR SMALL G
+.. |Hfr| unicode:: U+0210C .. BLACK-LETTER CAPITAL H
+.. |hfr| unicode:: U+1D525 .. MATHEMATICAL FRAKTUR SMALL H
+.. |Ifr| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |ifr| unicode:: U+1D526 .. MATHEMATICAL FRAKTUR SMALL I
+.. |Jfr| unicode:: U+1D50D .. MATHEMATICAL FRAKTUR CAPITAL J
+.. |jfr| unicode:: U+1D527 .. MATHEMATICAL FRAKTUR SMALL J
+.. |Kfr| unicode:: U+1D50E .. MATHEMATICAL FRAKTUR CAPITAL K
+.. |kfr| unicode:: U+1D528 .. MATHEMATICAL FRAKTUR SMALL K
+.. |Lfr| unicode:: U+1D50F .. MATHEMATICAL FRAKTUR CAPITAL L
+.. |lfr| unicode:: U+1D529 .. MATHEMATICAL FRAKTUR SMALL L
+.. |Mfr| unicode:: U+1D510 .. MATHEMATICAL FRAKTUR CAPITAL M
+.. |mfr| unicode:: U+1D52A .. MATHEMATICAL FRAKTUR SMALL M
+.. |Nfr| unicode:: U+1D511 .. MATHEMATICAL FRAKTUR CAPITAL N
+.. |nfr| unicode:: U+1D52B .. MATHEMATICAL FRAKTUR SMALL N
+.. |Ofr| unicode:: U+1D512 .. MATHEMATICAL FRAKTUR CAPITAL O
+.. |ofr| unicode:: U+1D52C .. MATHEMATICAL FRAKTUR SMALL O
+.. |Pfr| unicode:: U+1D513 .. MATHEMATICAL FRAKTUR CAPITAL P
+.. |pfr| unicode:: U+1D52D .. MATHEMATICAL FRAKTUR SMALL P
+.. |Qfr| unicode:: U+1D514 .. MATHEMATICAL FRAKTUR CAPITAL Q
+.. |qfr| unicode:: U+1D52E .. MATHEMATICAL FRAKTUR SMALL Q
+.. |Rfr| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |rfr| unicode:: U+1D52F .. MATHEMATICAL FRAKTUR SMALL R
+.. |Sfr| unicode:: U+1D516 .. MATHEMATICAL FRAKTUR CAPITAL S
+.. |sfr| unicode:: U+1D530 .. MATHEMATICAL FRAKTUR SMALL S
+.. |Tfr| unicode:: U+1D517 .. MATHEMATICAL FRAKTUR CAPITAL T
+.. |tfr| unicode:: U+1D531 .. MATHEMATICAL FRAKTUR SMALL T
+.. |Ufr| unicode:: U+1D518 .. MATHEMATICAL FRAKTUR CAPITAL U
+.. |ufr| unicode:: U+1D532 .. MATHEMATICAL FRAKTUR SMALL U
+.. |Vfr| unicode:: U+1D519 .. MATHEMATICAL FRAKTUR CAPITAL V
+.. |vfr| unicode:: U+1D533 .. MATHEMATICAL FRAKTUR SMALL V
+.. |Wfr| unicode:: U+1D51A .. MATHEMATICAL FRAKTUR CAPITAL W
+.. |wfr| unicode:: U+1D534 .. MATHEMATICAL FRAKTUR SMALL W
+.. |Xfr| unicode:: U+1D51B .. MATHEMATICAL FRAKTUR CAPITAL X
+.. |xfr| unicode:: U+1D535 .. MATHEMATICAL FRAKTUR SMALL X
+.. |Yfr| unicode:: U+1D51C .. MATHEMATICAL FRAKTUR CAPITAL Y
+.. |yfr| unicode:: U+1D536 .. MATHEMATICAL FRAKTUR SMALL Y
+.. |Zfr| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
+.. |zfr| unicode:: U+1D537 .. MATHEMATICAL FRAKTUR SMALL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomfrk.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,11 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Cfr| unicode:: U+0212D .. BLACK-LETTER CAPITAL C
+.. |Hfr| unicode:: U+0210C .. BLACK-LETTER CAPITAL H
+.. |Ifr| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |Rfr| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |Zfr| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomopf-wide.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,32 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aopf| unicode:: U+1D538 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL A
+.. |Bopf| unicode:: U+1D539 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+.. |Copf| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
+.. |Dopf| unicode:: U+1D53B .. MATHEMATICAL DOUBLE-STRUCK CAPITAL D
+.. |Eopf| unicode:: U+1D53C .. MATHEMATICAL DOUBLE-STRUCK CAPITAL E
+.. |Fopf| unicode:: U+1D53D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL F
+.. |Gopf| unicode:: U+1D53E .. MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+.. |Hopf| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
+.. |Iopf| unicode:: U+1D540 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL I
+.. |Jopf| unicode:: U+1D541 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL J
+.. |Kopf| unicode:: U+1D542 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL K
+.. |Lopf| unicode:: U+1D543 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL L
+.. |Mopf| unicode:: U+1D544 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+.. |Nopf| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
+.. |Oopf| unicode:: U+1D546 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+.. |Popf| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
+.. |Qopf| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
+.. |Ropf| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
+.. |Sopf| unicode:: U+1D54A .. MATHEMATICAL DOUBLE-STRUCK CAPITAL S
+.. |Topf| unicode:: U+1D54B .. MATHEMATICAL DOUBLE-STRUCK CAPITAL T
+.. |Uopf| unicode:: U+1D54C .. MATHEMATICAL DOUBLE-STRUCK CAPITAL U
+.. |Vopf| unicode:: U+1D54D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL V
+.. |Wopf| unicode:: U+1D54E .. MATHEMATICAL DOUBLE-STRUCK CAPITAL W
+.. |Xopf| unicode:: U+1D54F .. MATHEMATICAL DOUBLE-STRUCK CAPITAL X
+.. |Yopf| unicode:: U+1D550 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+.. |Zopf| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomopf.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,13 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Copf| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
+.. |Hopf| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
+.. |Nopf| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
+.. |Popf| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
+.. |Qopf| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
+.. |Ropf| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
+.. |Zopf| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomscr-wide.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,58 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Ascr| unicode:: U+1D49C .. MATHEMATICAL SCRIPT CAPITAL A
+.. |ascr| unicode:: U+1D4B6 .. MATHEMATICAL SCRIPT SMALL A
+.. |Bscr| unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |bscr| unicode:: U+1D4B7 .. MATHEMATICAL SCRIPT SMALL B
+.. |Cscr| unicode:: U+1D49E .. MATHEMATICAL SCRIPT CAPITAL C
+.. |cscr| unicode:: U+1D4B8 .. MATHEMATICAL SCRIPT SMALL C
+.. |Dscr| unicode:: U+1D49F .. MATHEMATICAL SCRIPT CAPITAL D
+.. |dscr| unicode:: U+1D4B9 .. MATHEMATICAL SCRIPT SMALL D
+.. |Escr| unicode:: U+02130 .. SCRIPT CAPITAL E
+.. |escr| unicode:: U+0212F .. SCRIPT SMALL E
+.. |Fscr| unicode:: U+02131 .. SCRIPT CAPITAL F
+.. |fscr| unicode:: U+1D4BB .. MATHEMATICAL SCRIPT SMALL F
+.. |Gscr| unicode:: U+1D4A2 .. MATHEMATICAL SCRIPT CAPITAL G
+.. |gscr| unicode:: U+0210A .. SCRIPT SMALL G
+.. |Hscr| unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |hscr| unicode:: U+1D4BD .. MATHEMATICAL SCRIPT SMALL H
+.. |Iscr| unicode:: U+02110 .. SCRIPT CAPITAL I
+.. |iscr| unicode:: U+1D4BE .. MATHEMATICAL SCRIPT SMALL I
+.. |Jscr| unicode:: U+1D4A5 .. MATHEMATICAL SCRIPT CAPITAL J
+.. |jscr| unicode:: U+1D4BF .. MATHEMATICAL SCRIPT SMALL J
+.. |Kscr| unicode:: U+1D4A6 .. MATHEMATICAL SCRIPT CAPITAL K
+.. |kscr| unicode:: U+1D4C0 .. MATHEMATICAL SCRIPT SMALL K
+.. |Lscr| unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |lscr| unicode:: U+1D4C1 .. MATHEMATICAL SCRIPT SMALL L
+.. |Mscr| unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |mscr| unicode:: U+1D4C2 .. MATHEMATICAL SCRIPT SMALL M
+.. |Nscr| unicode:: U+1D4A9 .. MATHEMATICAL SCRIPT CAPITAL N
+.. |nscr| unicode:: U+1D4C3 .. MATHEMATICAL SCRIPT SMALL N
+.. |Oscr| unicode:: U+1D4AA .. MATHEMATICAL SCRIPT CAPITAL O
+.. |oscr| unicode:: U+02134 .. SCRIPT SMALL O
+.. |Pscr| unicode:: U+1D4AB .. MATHEMATICAL SCRIPT CAPITAL P
+.. |pscr| unicode:: U+1D4C5 .. MATHEMATICAL SCRIPT SMALL P
+.. |Qscr| unicode:: U+1D4AC .. MATHEMATICAL SCRIPT CAPITAL Q
+.. |qscr| unicode:: U+1D4C6 .. MATHEMATICAL SCRIPT SMALL Q
+.. |Rscr| unicode:: U+0211B .. SCRIPT CAPITAL R
+.. |rscr| unicode:: U+1D4C7 .. MATHEMATICAL SCRIPT SMALL R
+.. |Sscr| unicode:: U+1D4AE .. MATHEMATICAL SCRIPT CAPITAL S
+.. |sscr| unicode:: U+1D4C8 .. MATHEMATICAL SCRIPT SMALL S
+.. |Tscr| unicode:: U+1D4AF .. MATHEMATICAL SCRIPT CAPITAL T
+.. |tscr| unicode:: U+1D4C9 .. MATHEMATICAL SCRIPT SMALL T
+.. |Uscr| unicode:: U+1D4B0 .. MATHEMATICAL SCRIPT CAPITAL U
+.. |uscr| unicode:: U+1D4CA .. MATHEMATICAL SCRIPT SMALL U
+.. |Vscr| unicode:: U+1D4B1 .. MATHEMATICAL SCRIPT CAPITAL V
+.. |vscr| unicode:: U+1D4CB .. MATHEMATICAL SCRIPT SMALL V
+.. |Wscr| unicode:: U+1D4B2 .. MATHEMATICAL SCRIPT CAPITAL W
+.. |wscr| unicode:: U+1D4CC .. MATHEMATICAL SCRIPT SMALL W
+.. |Xscr| unicode:: U+1D4B3 .. MATHEMATICAL SCRIPT CAPITAL X
+.. |xscr| unicode:: U+1D4CD .. MATHEMATICAL SCRIPT SMALL X
+.. |Yscr| unicode:: U+1D4B4 .. MATHEMATICAL SCRIPT CAPITAL Y
+.. |yscr| unicode:: U+1D4CE .. MATHEMATICAL SCRIPT SMALL Y
+.. |Zscr| unicode:: U+1D4B5 .. MATHEMATICAL SCRIPT CAPITAL Z
+.. |zscr| unicode:: U+1D4CF .. MATHEMATICAL SCRIPT SMALL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isomscr.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,17 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Bscr| unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |Escr| unicode:: U+02130 .. SCRIPT CAPITAL E
+.. |escr| unicode:: U+0212F .. SCRIPT SMALL E
+.. |Fscr| unicode:: U+02131 .. SCRIPT CAPITAL F
+.. |gscr| unicode:: U+0210A .. SCRIPT SMALL G
+.. |Hscr| unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |Iscr| unicode:: U+02110 .. SCRIPT CAPITAL I
+.. |Lscr| unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |Mscr| unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |oscr| unicode:: U+02134 .. SCRIPT SMALL O
+.. |Rscr| unicode:: U+0211B .. SCRIPT CAPITAL R
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isonum.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,82 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |amp|    unicode:: U+00026 .. AMPERSAND
+.. |apos|   unicode:: U+00027 .. APOSTROPHE
+.. |ast|    unicode:: U+0002A .. ASTERISK
+.. |brvbar| unicode:: U+000A6 .. BROKEN BAR
+.. |bsol|   unicode:: U+0005C .. REVERSE SOLIDUS
+.. |cent|   unicode:: U+000A2 .. CENT SIGN
+.. |colon|  unicode:: U+0003A .. COLON
+.. |comma|  unicode:: U+0002C .. COMMA
+.. |commat| unicode:: U+00040 .. COMMERCIAL AT
+.. |copy|   unicode:: U+000A9 .. COPYRIGHT SIGN
+.. |curren| unicode:: U+000A4 .. CURRENCY SIGN
+.. |darr|   unicode:: U+02193 .. DOWNWARDS ARROW
+.. |deg|    unicode:: U+000B0 .. DEGREE SIGN
+.. |divide| unicode:: U+000F7 .. DIVISION SIGN
+.. |dollar| unicode:: U+00024 .. DOLLAR SIGN
+.. |equals| unicode:: U+0003D .. EQUALS SIGN
+.. |excl|   unicode:: U+00021 .. EXCLAMATION MARK
+.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF
+.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER
+.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTH
+.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS
+.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHS
+.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHS
+.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHS
+.. |gt|     unicode:: U+0003E .. GREATER-THAN SIGN
+.. |half|   unicode:: U+000BD .. VULGAR FRACTION ONE HALF
+.. |horbar| unicode:: U+02015 .. HORIZONTAL BAR
+.. |hyphen| unicode:: U+02010 .. HYPHEN
+.. |iexcl|  unicode:: U+000A1 .. INVERTED EXCLAMATION MARK
+.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK
+.. |laquo|  unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |larr|   unicode:: U+02190 .. LEFTWARDS ARROW
+.. |lcub|   unicode:: U+0007B .. LEFT CURLY BRACKET
+.. |ldquo|  unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
+.. |lowbar| unicode:: U+0005F .. LOW LINE
+.. |lpar|   unicode:: U+00028 .. LEFT PARENTHESIS
+.. |lsqb|   unicode:: U+0005B .. LEFT SQUARE BRACKET
+.. |lsquo|  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
+.. |lt|     unicode:: U+0003C .. LESS-THAN SIGN
+.. |micro|  unicode:: U+000B5 .. MICRO SIGN
+.. |middot| unicode:: U+000B7 .. MIDDLE DOT
+.. |nbsp|   unicode:: U+000A0 .. NO-BREAK SPACE
+.. |not|    unicode:: U+000AC .. NOT SIGN
+.. |num|    unicode:: U+00023 .. NUMBER SIGN
+.. |ohm|    unicode:: U+02126 .. OHM SIGN
+.. |ordf|   unicode:: U+000AA .. FEMININE ORDINAL INDICATOR
+.. |ordm|   unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR
+.. |para|   unicode:: U+000B6 .. PILCROW SIGN
+.. |percnt| unicode:: U+00025 .. PERCENT SIGN
+.. |period| unicode:: U+0002E .. FULL STOP
+.. |plus|   unicode:: U+0002B .. PLUS SIGN
+.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |pound|  unicode:: U+000A3 .. POUND SIGN
+.. |quest|  unicode:: U+0003F .. QUESTION MARK
+.. |quot|   unicode:: U+00022 .. QUOTATION MARK
+.. |raquo|  unicode:: U+000BB .. RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |rarr|   unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |rcub|   unicode:: U+0007D .. RIGHT CURLY BRACKET
+.. |rdquo|  unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |reg|    unicode:: U+000AE .. REGISTERED SIGN
+.. |rpar|   unicode:: U+00029 .. RIGHT PARENTHESIS
+.. |rsqb|   unicode:: U+0005D .. RIGHT SQUARE BRACKET
+.. |rsquo|  unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |sect|   unicode:: U+000A7 .. SECTION SIGN
+.. |semi|   unicode:: U+0003B .. SEMICOLON
+.. |shy|    unicode:: U+000AD .. SOFT HYPHEN
+.. |sol|    unicode:: U+0002F .. SOLIDUS
+.. |sung|   unicode:: U+0266A .. EIGHTH NOTE
+.. |sup1|   unicode:: U+000B9 .. SUPERSCRIPT ONE
+.. |sup2|   unicode:: U+000B2 .. SUPERSCRIPT TWO
+.. |sup3|   unicode:: U+000B3 .. SUPERSCRIPT THREE
+.. |times|  unicode:: U+000D7 .. MULTIPLICATION SIGN
+.. |trade|  unicode:: U+02122 .. TRADE MARK SIGN
+.. |uarr|   unicode:: U+02191 .. UPWARDS ARROW
+.. |verbar| unicode:: U+0007C .. VERTICAL LINE
+.. |yen|    unicode:: U+000A5 .. YEN SIGN
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isopub.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,90 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |blank|  unicode:: U+02423 .. OPEN BOX
+.. |blk12|  unicode:: U+02592 .. MEDIUM SHADE
+.. |blk14|  unicode:: U+02591 .. LIGHT SHADE
+.. |blk34|  unicode:: U+02593 .. DARK SHADE
+.. |block|  unicode:: U+02588 .. FULL BLOCK
+.. |bull|   unicode:: U+02022 .. BULLET
+.. |caret|  unicode:: U+02041 .. CARET INSERTION POINT
+.. |check|  unicode:: U+02713 .. CHECK MARK
+.. |cir|    unicode:: U+025CB .. WHITE CIRCLE
+.. |clubs|  unicode:: U+02663 .. BLACK CLUB SUIT
+.. |copysr| unicode:: U+02117 .. SOUND RECORDING COPYRIGHT
+.. |cross|  unicode:: U+02717 .. BALLOT X
+.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER
+.. |dagger| unicode:: U+02020 .. DAGGER
+.. |dash|   unicode:: U+02010 .. HYPHEN
+.. |diams|  unicode:: U+02666 .. BLACK DIAMOND SUIT
+.. |dlcrop| unicode:: U+0230D .. BOTTOM LEFT CROP
+.. |drcrop| unicode:: U+0230C .. BOTTOM RIGHT CROP
+.. |dtri|   unicode:: U+025BF .. WHITE DOWN-POINTING SMALL TRIANGLE
+.. |dtrif|  unicode:: U+025BE .. BLACK DOWN-POINTING SMALL TRIANGLE
+.. |emsp|   unicode:: U+02003 .. EM SPACE
+.. |emsp13| unicode:: U+02004 .. THREE-PER-EM SPACE
+.. |emsp14| unicode:: U+02005 .. FOUR-PER-EM SPACE
+.. |ensp|   unicode:: U+02002 .. EN SPACE
+.. |female| unicode:: U+02640 .. FEMALE SIGN
+.. |ffilig| unicode:: U+0FB03 .. LATIN SMALL LIGATURE FFI
+.. |fflig|  unicode:: U+0FB00 .. LATIN SMALL LIGATURE FF
+.. |ffllig| unicode:: U+0FB04 .. LATIN SMALL LIGATURE FFL
+.. |filig|  unicode:: U+0FB01 .. LATIN SMALL LIGATURE FI
+.. |flat|   unicode:: U+0266D .. MUSIC FLAT SIGN
+.. |fllig|  unicode:: U+0FB02 .. LATIN SMALL LIGATURE FL
+.. |frac13| unicode:: U+02153 .. VULGAR FRACTION ONE THIRD
+.. |frac15| unicode:: U+02155 .. VULGAR FRACTION ONE FIFTH
+.. |frac16| unicode:: U+02159 .. VULGAR FRACTION ONE SIXTH
+.. |frac23| unicode:: U+02154 .. VULGAR FRACTION TWO THIRDS
+.. |frac25| unicode:: U+02156 .. VULGAR FRACTION TWO FIFTHS
+.. |frac35| unicode:: U+02157 .. VULGAR FRACTION THREE FIFTHS
+.. |frac45| unicode:: U+02158 .. VULGAR FRACTION FOUR FIFTHS
+.. |frac56| unicode:: U+0215A .. VULGAR FRACTION FIVE SIXTHS
+.. |hairsp| unicode:: U+0200A .. HAIR SPACE
+.. |hearts| unicode:: U+02665 .. BLACK HEART SUIT
+.. |hellip| unicode:: U+02026 .. HORIZONTAL ELLIPSIS
+.. |hybull| unicode:: U+02043 .. HYPHEN BULLET
+.. |incare| unicode:: U+02105 .. CARE OF
+.. |ldquor| unicode:: U+0201E .. DOUBLE LOW-9 QUOTATION MARK
+.. |lhblk|  unicode:: U+02584 .. LOWER HALF BLOCK
+.. |loz|    unicode:: U+025CA .. LOZENGE
+.. |lozf|   unicode:: U+029EB .. BLACK LOZENGE
+.. |lsquor| unicode:: U+0201A .. SINGLE LOW-9 QUOTATION MARK
+.. |ltri|   unicode:: U+025C3 .. WHITE LEFT-POINTING SMALL TRIANGLE
+.. |ltrif|  unicode:: U+025C2 .. BLACK LEFT-POINTING SMALL TRIANGLE
+.. |male|   unicode:: U+02642 .. MALE SIGN
+.. |malt|   unicode:: U+02720 .. MALTESE CROSS
+.. |marker| unicode:: U+025AE .. BLACK VERTICAL RECTANGLE
+.. |mdash|  unicode:: U+02014 .. EM DASH
+.. |mldr|   unicode:: U+02026 .. HORIZONTAL ELLIPSIS
+.. |natur|  unicode:: U+0266E .. MUSIC NATURAL SIGN
+.. |ndash|  unicode:: U+02013 .. EN DASH
+.. |nldr|   unicode:: U+02025 .. TWO DOT LEADER
+.. |numsp|  unicode:: U+02007 .. FIGURE SPACE
+.. |phone|  unicode:: U+0260E .. BLACK TELEPHONE
+.. |puncsp| unicode:: U+02008 .. PUNCTUATION SPACE
+.. |rdquor| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |rect|   unicode:: U+025AD .. WHITE RECTANGLE
+.. |rsquor| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |rtri|   unicode:: U+025B9 .. WHITE RIGHT-POINTING SMALL TRIANGLE
+.. |rtrif|  unicode:: U+025B8 .. BLACK RIGHT-POINTING SMALL TRIANGLE
+.. |rx|     unicode:: U+0211E .. PRESCRIPTION TAKE
+.. |sext|   unicode:: U+02736 .. SIX POINTED BLACK STAR
+.. |sharp|  unicode:: U+0266F .. MUSIC SHARP SIGN
+.. |spades| unicode:: U+02660 .. BLACK SPADE SUIT
+.. |squ|    unicode:: U+025A1 .. WHITE SQUARE
+.. |squf|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |star|   unicode:: U+02606 .. WHITE STAR
+.. |starf|  unicode:: U+02605 .. BLACK STAR
+.. |target| unicode:: U+02316 .. POSITION INDICATOR
+.. |telrec| unicode:: U+02315 .. TELEPHONE RECORDER
+.. |thinsp| unicode:: U+02009 .. THIN SPACE
+.. |uhblk|  unicode:: U+02580 .. UPPER HALF BLOCK
+.. |ulcrop| unicode:: U+0230F .. TOP LEFT CROP
+.. |urcrop| unicode:: U+0230E .. TOP RIGHT CROP
+.. |utri|   unicode:: U+025B5 .. WHITE UP-POINTING SMALL TRIANGLE
+.. |utrif|  unicode:: U+025B4 .. BLACK UP-POINTING SMALL TRIANGLE
+.. |vellip| unicode:: U+022EE .. VERTICAL ELLIPSIS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/isotech.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,168 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |acd|      unicode:: U+0223F .. SINE WAVE
+.. |aleph|    unicode:: U+02135 .. ALEF SYMBOL
+.. |And|      unicode:: U+02A53 .. DOUBLE LOGICAL AND
+.. |and|      unicode:: U+02227 .. LOGICAL AND
+.. |andand|   unicode:: U+02A55 .. TWO INTERSECTING LOGICAL AND
+.. |andd|     unicode:: U+02A5C .. LOGICAL AND WITH HORIZONTAL DASH
+.. |andslope| unicode:: U+02A58 .. SLOPING LARGE AND
+.. |andv|     unicode:: U+02A5A .. LOGICAL AND WITH MIDDLE STEM
+.. |ang90|    unicode:: U+0221F .. RIGHT ANGLE
+.. |angrt|    unicode:: U+0221F .. RIGHT ANGLE
+.. |angsph|   unicode:: U+02222 .. SPHERICAL ANGLE
+.. |angst|    unicode:: U+0212B .. ANGSTROM SIGN
+.. |ap|       unicode:: U+02248 .. ALMOST EQUAL TO
+.. |apacir|   unicode:: U+02A6F .. ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+.. |awconint| unicode:: U+02233 .. ANTICLOCKWISE CONTOUR INTEGRAL
+.. |awint|    unicode:: U+02A11 .. ANTICLOCKWISE INTEGRATION
+.. |becaus|   unicode:: U+02235 .. BECAUSE
+.. |bernou|   unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |bne|      unicode:: U+0003D U+020E5 .. EQUALS SIGN with reverse slash
+.. |bnequiv|  unicode:: U+02261 U+020E5 .. IDENTICAL TO with reverse slash
+.. |bNot|     unicode:: U+02AED .. REVERSED DOUBLE STROKE NOT SIGN
+.. |bnot|     unicode:: U+02310 .. REVERSED NOT SIGN
+.. |bottom|   unicode:: U+022A5 .. UP TACK
+.. |cap|      unicode:: U+02229 .. INTERSECTION
+.. |Cconint|  unicode:: U+02230 .. VOLUME INTEGRAL
+.. |cirfnint| unicode:: U+02A10 .. CIRCULATION FUNCTION
+.. |compfn|   unicode:: U+02218 .. RING OPERATOR
+.. |cong|     unicode:: U+02245 .. APPROXIMATELY EQUAL TO
+.. |Conint|   unicode:: U+0222F .. SURFACE INTEGRAL
+.. |conint|   unicode:: U+0222E .. CONTOUR INTEGRAL
+.. |ctdot|    unicode:: U+022EF .. MIDLINE HORIZONTAL ELLIPSIS
+.. |cup|      unicode:: U+0222A .. UNION
+.. |cwconint| unicode:: U+02232 .. CLOCKWISE CONTOUR INTEGRAL
+.. |cwint|    unicode:: U+02231 .. CLOCKWISE INTEGRAL
+.. |cylcty|   unicode:: U+0232D .. CYLINDRICITY
+.. |disin|    unicode:: U+022F2 .. ELEMENT OF WITH LONG HORIZONTAL STROKE
+.. |Dot|      unicode:: U+000A8 .. DIAERESIS
+.. |DotDot|   unicode:: U+020DC .. COMBINING FOUR DOTS ABOVE
+.. |dsol|     unicode:: U+029F6 .. SOLIDUS WITH OVERBAR
+.. |dtdot|    unicode:: U+022F1 .. DOWN RIGHT DIAGONAL ELLIPSIS
+.. |dwangle|  unicode:: U+029A6 .. OBLIQUE ANGLE OPENING UP
+.. |elinters| unicode:: U+0FFFD .. REPLACEMENT CHARACTER
+.. |epar|     unicode:: U+022D5 .. EQUAL AND PARALLEL TO
+.. |eparsl|   unicode:: U+029E3 .. EQUALS SIGN AND SLANTED PARALLEL
+.. |equiv|    unicode:: U+02261 .. IDENTICAL TO
+.. |eqvparsl| unicode:: U+029E5 .. IDENTICAL TO AND SLANTED PARALLEL
+.. |exist|    unicode:: U+02203 .. THERE EXISTS
+.. |fltns|    unicode:: U+025B1 .. WHITE PARALLELOGRAM
+.. |fnof|     unicode:: U+00192 .. LATIN SMALL LETTER F WITH HOOK
+.. |forall|   unicode:: U+02200 .. FOR ALL
+.. |fpartint| unicode:: U+02A0D .. FINITE PART INTEGRAL
+.. |ge|       unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |hamilt|   unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |iff|      unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |iinfin|   unicode:: U+029DC .. INCOMPLETE INFINITY
+.. |imped|    unicode:: U+001B5 .. LATIN CAPITAL LETTER Z WITH STROKE
+.. |infin|    unicode:: U+0221E .. INFINITY
+.. |infintie| unicode:: U+029DD .. TIE OVER INFINITY
+.. |Int|      unicode:: U+0222C .. DOUBLE INTEGRAL
+.. |int|      unicode:: U+0222B .. INTEGRAL
+.. |intlarhk| unicode:: U+02A17 .. INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+.. |isin|     unicode:: U+02208 .. ELEMENT OF
+.. |isindot|  unicode:: U+022F5 .. ELEMENT OF WITH DOT ABOVE
+.. |isinE|    unicode:: U+022F9 .. ELEMENT OF WITH TWO HORIZONTAL STROKES
+.. |isins|    unicode:: U+022F4 .. SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+.. |isinsv|   unicode:: U+022F3 .. ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+.. |isinv|    unicode:: U+02208 .. ELEMENT OF
+.. |lagran|   unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |Lang|     unicode:: U+0300A .. LEFT DOUBLE ANGLE BRACKET
+.. |lang|     unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |lArr|     unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |lbbrk|    unicode:: U+03014 .. LEFT TORTOISE SHELL BRACKET
+.. |le|       unicode:: U+02264 .. LESS-THAN OR EQUAL TO
+.. |loang|    unicode:: U+03018 .. LEFT WHITE TORTOISE SHELL BRACKET
+.. |lobrk|    unicode:: U+0301A .. LEFT WHITE SQUARE BRACKET
+.. |lopar|    unicode:: U+02985 .. LEFT WHITE PARENTHESIS
+.. |lowast|   unicode:: U+02217 .. ASTERISK OPERATOR
+.. |minus|    unicode:: U+02212 .. MINUS SIGN
+.. |mnplus|   unicode:: U+02213 .. MINUS-OR-PLUS SIGN
+.. |nabla|    unicode:: U+02207 .. NABLA
+.. |ne|       unicode:: U+02260 .. NOT EQUAL TO
+.. |nedot|    unicode:: U+02250 U+00338 .. APPROACHES THE LIMIT with slash
+.. |nhpar|    unicode:: U+02AF2 .. PARALLEL WITH HORIZONTAL STROKE
+.. |ni|       unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |nis|      unicode:: U+022FC .. SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+.. |nisd|     unicode:: U+022FA .. CONTAINS WITH LONG HORIZONTAL STROKE
+.. |niv|      unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |Not|      unicode:: U+02AEC .. DOUBLE STROKE NOT SIGN
+.. |notin|    unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |notindot| unicode:: U+022F5 U+00338 .. ELEMENT OF WITH DOT ABOVE with slash
+.. |notinE|   unicode:: U+022F9 U+00338 .. ELEMENT OF WITH TWO HORIZONTAL STROKES with slash
+.. |notinva|  unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |notinvb|  unicode:: U+022F7 .. SMALL ELEMENT OF WITH OVERBAR
+.. |notinvc|  unicode:: U+022F6 .. ELEMENT OF WITH OVERBAR
+.. |notni|    unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
+.. |notniva|  unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
+.. |notnivb|  unicode:: U+022FE .. SMALL CONTAINS WITH OVERBAR
+.. |notnivc|  unicode:: U+022FD .. CONTAINS WITH OVERBAR
+.. |nparsl|   unicode:: U+02AFD U+020E5 .. DOUBLE SOLIDUS OPERATOR with reverse slash
+.. |npart|    unicode:: U+02202 U+00338 .. PARTIAL DIFFERENTIAL with slash
+.. |npolint|  unicode:: U+02A14 .. LINE INTEGRATION NOT INCLUDING THE POLE
+.. |nvinfin|  unicode:: U+029DE .. INFINITY NEGATED WITH VERTICAL BAR
+.. |olcross|  unicode:: U+029BB .. CIRCLE WITH SUPERIMPOSED X
+.. |Or|       unicode:: U+02A54 .. DOUBLE LOGICAL OR
+.. |or|       unicode:: U+02228 .. LOGICAL OR
+.. |ord|      unicode:: U+02A5D .. LOGICAL OR WITH HORIZONTAL DASH
+.. |order|    unicode:: U+02134 .. SCRIPT SMALL O
+.. |oror|     unicode:: U+02A56 .. TWO INTERSECTING LOGICAL OR
+.. |orslope|  unicode:: U+02A57 .. SLOPING LARGE OR
+.. |orv|      unicode:: U+02A5B .. LOGICAL OR WITH MIDDLE STEM
+.. |par|      unicode:: U+02225 .. PARALLEL TO
+.. |parsl|    unicode:: U+02AFD .. DOUBLE SOLIDUS OPERATOR
+.. |part|     unicode:: U+02202 .. PARTIAL DIFFERENTIAL
+.. |permil|   unicode:: U+02030 .. PER MILLE SIGN
+.. |perp|     unicode:: U+022A5 .. UP TACK
+.. |pertenk|  unicode:: U+02031 .. PER TEN THOUSAND SIGN
+.. |phmmat|   unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |pointint| unicode:: U+02A15 .. INTEGRAL AROUND A POINT OPERATOR
+.. |Prime|    unicode:: U+02033 .. DOUBLE PRIME
+.. |prime|    unicode:: U+02032 .. PRIME
+.. |profalar| unicode:: U+0232E .. ALL AROUND-PROFILE
+.. |profline| unicode:: U+02312 .. ARC
+.. |profsurf| unicode:: U+02313 .. SEGMENT
+.. |prop|     unicode:: U+0221D .. PROPORTIONAL TO
+.. |qint|     unicode:: U+02A0C .. QUADRUPLE INTEGRAL OPERATOR
+.. |qprime|   unicode:: U+02057 .. QUADRUPLE PRIME
+.. |quatint|  unicode:: U+02A16 .. QUATERNION INTEGRAL OPERATOR
+.. |radic|    unicode:: U+0221A .. SQUARE ROOT
+.. |Rang|     unicode:: U+0300B .. RIGHT DOUBLE ANGLE BRACKET
+.. |rang|     unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |rArr|     unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |rbbrk|    unicode:: U+03015 .. RIGHT TORTOISE SHELL BRACKET
+.. |roang|    unicode:: U+03019 .. RIGHT WHITE TORTOISE SHELL BRACKET
+.. |robrk|    unicode:: U+0301B .. RIGHT WHITE SQUARE BRACKET
+.. |ropar|    unicode:: U+02986 .. RIGHT WHITE PARENTHESIS
+.. |rppolint| unicode:: U+02A12 .. LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+.. |scpolint| unicode:: U+02A13 .. LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+.. |sim|      unicode:: U+0223C .. TILDE OPERATOR
+.. |simdot|   unicode:: U+02A6A .. TILDE OPERATOR WITH DOT ABOVE
+.. |sime|     unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
+.. |smeparsl| unicode:: U+029E4 .. EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+.. |square|   unicode:: U+025A1 .. WHITE SQUARE
+.. |squarf|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |strns|    unicode:: U+000AF .. MACRON
+.. |sub|      unicode:: U+02282 .. SUBSET OF
+.. |sube|     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |sup|      unicode:: U+02283 .. SUPERSET OF
+.. |supe|     unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |tdot|     unicode:: U+020DB .. COMBINING THREE DOTS ABOVE
+.. |there4|   unicode:: U+02234 .. THEREFORE
+.. |tint|     unicode:: U+0222D .. TRIPLE INTEGRAL
+.. |top|      unicode:: U+022A4 .. DOWN TACK
+.. |topbot|   unicode:: U+02336 .. APL FUNCTIONAL SYMBOL I-BEAM
+.. |topcir|   unicode:: U+02AF1 .. DOWN TACK WITH CIRCLE BELOW
+.. |tprime|   unicode:: U+02034 .. TRIPLE PRIME
+.. |utdot|    unicode:: U+022F0 .. UP RIGHT DIAGONAL ELLIPSIS
+.. |uwangle|  unicode:: U+029A7 .. OBLIQUE ANGLE OPENING DOWN
+.. |vangrt|   unicode:: U+0299C .. RIGHT ANGLE VARIANT WITH SQUARE
+.. |veeeq|    unicode:: U+0225A .. EQUIANGULAR TO
+.. |Verbar|   unicode:: U+02016 .. DOUBLE VERTICAL LINE
+.. |wedgeq|   unicode:: U+02259 .. ESTIMATES
+.. |xnis|     unicode:: U+022FB .. CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlalias.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,554 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |angle|                           unicode:: U+02220 .. ANGLE
+.. |ApplyFunction|                   unicode:: U+02061 .. FUNCTION APPLICATION
+.. |approx|                          unicode:: U+02248 .. ALMOST EQUAL TO
+.. |approxeq|                        unicode:: U+0224A .. ALMOST EQUAL OR EQUAL TO
+.. |Assign|                          unicode:: U+02254 .. COLON EQUALS
+.. |backcong|                        unicode:: U+0224C .. ALL EQUAL TO
+.. |backepsilon|                     unicode:: U+003F6 .. GREEK REVERSED LUNATE EPSILON SYMBOL
+.. |backprime|                       unicode:: U+02035 .. REVERSED PRIME
+.. |backsim|                         unicode:: U+0223D .. REVERSED TILDE
+.. |backsimeq|                       unicode:: U+022CD .. REVERSED TILDE EQUALS
+.. |Backslash|                       unicode:: U+02216 .. SET MINUS
+.. |barwedge|                        unicode:: U+02305 .. PROJECTIVE
+.. |Because|                         unicode:: U+02235 .. BECAUSE
+.. |because|                         unicode:: U+02235 .. BECAUSE
+.. |Bernoullis|                      unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |between|                         unicode:: U+0226C .. BETWEEN
+.. |bigcap|                          unicode:: U+022C2 .. N-ARY INTERSECTION
+.. |bigcirc|                         unicode:: U+025EF .. LARGE CIRCLE
+.. |bigcup|                          unicode:: U+022C3 .. N-ARY UNION
+.. |bigodot|                         unicode:: U+02A00 .. N-ARY CIRCLED DOT OPERATOR
+.. |bigoplus|                        unicode:: U+02A01 .. N-ARY CIRCLED PLUS OPERATOR
+.. |bigotimes|                       unicode:: U+02A02 .. N-ARY CIRCLED TIMES OPERATOR
+.. |bigsqcup|                        unicode:: U+02A06 .. N-ARY SQUARE UNION OPERATOR
+.. |bigstar|                         unicode:: U+02605 .. BLACK STAR
+.. |bigtriangledown|                 unicode:: U+025BD .. WHITE DOWN-POINTING TRIANGLE
+.. |bigtriangleup|                   unicode:: U+025B3 .. WHITE UP-POINTING TRIANGLE
+.. |biguplus|                        unicode:: U+02A04 .. N-ARY UNION OPERATOR WITH PLUS
+.. |bigvee|                          unicode:: U+022C1 .. N-ARY LOGICAL OR
+.. |bigwedge|                        unicode:: U+022C0 .. N-ARY LOGICAL AND
+.. |bkarow|                          unicode:: U+0290D .. RIGHTWARDS DOUBLE DASH ARROW
+.. |blacklozenge|                    unicode:: U+029EB .. BLACK LOZENGE
+.. |blacksquare|                     unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |blacktriangle|                   unicode:: U+025B4 .. BLACK UP-POINTING SMALL TRIANGLE
+.. |blacktriangledown|               unicode:: U+025BE .. BLACK DOWN-POINTING SMALL TRIANGLE
+.. |blacktriangleleft|               unicode:: U+025C2 .. BLACK LEFT-POINTING SMALL TRIANGLE
+.. |blacktriangleright|              unicode:: U+025B8 .. BLACK RIGHT-POINTING SMALL TRIANGLE
+.. |bot|                             unicode:: U+022A5 .. UP TACK
+.. |boxminus|                        unicode:: U+0229F .. SQUARED MINUS
+.. |boxplus|                         unicode:: U+0229E .. SQUARED PLUS
+.. |boxtimes|                        unicode:: U+022A0 .. SQUARED TIMES
+.. |Breve|                           unicode:: U+002D8 .. BREVE
+.. |bullet|                          unicode:: U+02022 .. BULLET
+.. |Bumpeq|                          unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
+.. |bumpeq|                          unicode:: U+0224F .. DIFFERENCE BETWEEN
+.. |CapitalDifferentialD|            unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
+.. |Cayleys|                         unicode:: U+0212D .. BLACK-LETTER CAPITAL C
+.. |Cedilla|                         unicode:: U+000B8 .. CEDILLA
+.. |CenterDot|                       unicode:: U+000B7 .. MIDDLE DOT
+.. |centerdot|                       unicode:: U+000B7 .. MIDDLE DOT
+.. |checkmark|                       unicode:: U+02713 .. CHECK MARK
+.. |circeq|                          unicode:: U+02257 .. RING EQUAL TO
+.. |circlearrowleft|                 unicode:: U+021BA .. ANTICLOCKWISE OPEN CIRCLE ARROW
+.. |circlearrowright|                unicode:: U+021BB .. CLOCKWISE OPEN CIRCLE ARROW
+.. |circledast|                      unicode:: U+0229B .. CIRCLED ASTERISK OPERATOR
+.. |circledcirc|                     unicode:: U+0229A .. CIRCLED RING OPERATOR
+.. |circleddash|                     unicode:: U+0229D .. CIRCLED DASH
+.. |CircleDot|                       unicode:: U+02299 .. CIRCLED DOT OPERATOR
+.. |circledR|                        unicode:: U+000AE .. REGISTERED SIGN
+.. |circledS|                        unicode:: U+024C8 .. CIRCLED LATIN CAPITAL LETTER S
+.. |CircleMinus|                     unicode:: U+02296 .. CIRCLED MINUS
+.. |CirclePlus|                      unicode:: U+02295 .. CIRCLED PLUS
+.. |CircleTimes|                     unicode:: U+02297 .. CIRCLED TIMES
+.. |ClockwiseContourIntegral|        unicode:: U+02232 .. CLOCKWISE CONTOUR INTEGRAL
+.. |CloseCurlyDoubleQuote|           unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |CloseCurlyQuote|                 unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |clubsuit|                        unicode:: U+02663 .. BLACK CLUB SUIT
+.. |coloneq|                         unicode:: U+02254 .. COLON EQUALS
+.. |complement|                      unicode:: U+02201 .. COMPLEMENT
+.. |complexes|                       unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
+.. |Congruent|                       unicode:: U+02261 .. IDENTICAL TO
+.. |ContourIntegral|                 unicode:: U+0222E .. CONTOUR INTEGRAL
+.. |Coproduct|                       unicode:: U+02210 .. N-ARY COPRODUCT
+.. |CounterClockwiseContourIntegral| unicode:: U+02233 .. ANTICLOCKWISE CONTOUR INTEGRAL
+.. |CupCap|                          unicode:: U+0224D .. EQUIVALENT TO
+.. |curlyeqprec|                     unicode:: U+022DE .. EQUAL TO OR PRECEDES
+.. |curlyeqsucc|                     unicode:: U+022DF .. EQUAL TO OR SUCCEEDS
+.. |curlyvee|                        unicode:: U+022CE .. CURLY LOGICAL OR
+.. |curlywedge|                      unicode:: U+022CF .. CURLY LOGICAL AND
+.. |curvearrowleft|                  unicode:: U+021B6 .. ANTICLOCKWISE TOP SEMICIRCLE ARROW
+.. |curvearrowright|                 unicode:: U+021B7 .. CLOCKWISE TOP SEMICIRCLE ARROW
+.. |dbkarow|                         unicode:: U+0290F .. RIGHTWARDS TRIPLE DASH ARROW
+.. |ddagger|                         unicode:: U+02021 .. DOUBLE DAGGER
+.. |ddotseq|                         unicode:: U+02A77 .. EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+.. |Del|                             unicode:: U+02207 .. NABLA
+.. |DiacriticalAcute|                unicode:: U+000B4 .. ACUTE ACCENT
+.. |DiacriticalDot|                  unicode:: U+002D9 .. DOT ABOVE
+.. |DiacriticalDoubleAcute|          unicode:: U+002DD .. DOUBLE ACUTE ACCENT
+.. |DiacriticalGrave|                unicode:: U+00060 .. GRAVE ACCENT
+.. |DiacriticalTilde|                unicode:: U+002DC .. SMALL TILDE
+.. |Diamond|                         unicode:: U+022C4 .. DIAMOND OPERATOR
+.. |diamond|                         unicode:: U+022C4 .. DIAMOND OPERATOR
+.. |diamondsuit|                     unicode:: U+02666 .. BLACK DIAMOND SUIT
+.. |DifferentialD|                   unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
+.. |digamma|                         unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
+.. |div|                             unicode:: U+000F7 .. DIVISION SIGN
+.. |divideontimes|                   unicode:: U+022C7 .. DIVISION TIMES
+.. |doteq|                           unicode:: U+02250 .. APPROACHES THE LIMIT
+.. |doteqdot|                        unicode:: U+02251 .. GEOMETRICALLY EQUAL TO
+.. |DotEqual|                        unicode:: U+02250 .. APPROACHES THE LIMIT
+.. |dotminus|                        unicode:: U+02238 .. DOT MINUS
+.. |dotplus|                         unicode:: U+02214 .. DOT PLUS
+.. |dotsquare|                       unicode:: U+022A1 .. SQUARED DOT OPERATOR
+.. |doublebarwedge|                  unicode:: U+02306 .. PERSPECTIVE
+.. |DoubleContourIntegral|           unicode:: U+0222F .. SURFACE INTEGRAL
+.. |DoubleDot|                       unicode:: U+000A8 .. DIAERESIS
+.. |DoubleDownArrow|                 unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |DoubleLeftArrow|                 unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |DoubleLeftRightArrow|            unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |DoubleLeftTee|                   unicode:: U+02AE4 .. VERTICAL BAR DOUBLE LEFT TURNSTILE
+.. |DoubleLongLeftArrow|             unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
+.. |DoubleLongLeftRightArrow|        unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
+.. |DoubleLongRightArrow|            unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
+.. |DoubleRightArrow|                unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |DoubleRightTee|                  unicode:: U+022A8 .. TRUE
+.. |DoubleUpArrow|                   unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |DoubleUpDownArrow|               unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
+.. |DoubleVerticalBar|               unicode:: U+02225 .. PARALLEL TO
+.. |DownArrow|                       unicode:: U+02193 .. DOWNWARDS ARROW
+.. |Downarrow|                       unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |downarrow|                       unicode:: U+02193 .. DOWNWARDS ARROW
+.. |DownArrowUpArrow|                unicode:: U+021F5 .. DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+.. |downdownarrows|                  unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
+.. |downharpoonleft|                 unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
+.. |downharpoonright|                unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+.. |DownLeftVector|                  unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
+.. |DownRightVector|                 unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+.. |DownTee|                         unicode:: U+022A4 .. DOWN TACK
+.. |DownTeeArrow|                    unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
+.. |drbkarow|                        unicode:: U+02910 .. RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+.. |Element|                         unicode:: U+02208 .. ELEMENT OF
+.. |emptyset|                        unicode:: U+02205 .. EMPTY SET
+.. |eqcirc|                          unicode:: U+02256 .. RING IN EQUAL TO
+.. |eqcolon|                         unicode:: U+02255 .. EQUALS COLON
+.. |eqsim|                           unicode:: U+02242 .. MINUS TILDE
+.. |eqslantgtr|                      unicode:: U+02A96 .. SLANTED EQUAL TO OR GREATER-THAN
+.. |eqslantless|                     unicode:: U+02A95 .. SLANTED EQUAL TO OR LESS-THAN
+.. |EqualTilde|                      unicode:: U+02242 .. MINUS TILDE
+.. |Equilibrium|                     unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |Exists|                          unicode:: U+02203 .. THERE EXISTS
+.. |expectation|                     unicode:: U+02130 .. SCRIPT CAPITAL E
+.. |ExponentialE|                    unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |exponentiale|                    unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |fallingdotseq|                   unicode:: U+02252 .. APPROXIMATELY EQUAL TO OR THE IMAGE OF
+.. |ForAll|                          unicode:: U+02200 .. FOR ALL
+.. |Fouriertrf|                      unicode:: U+02131 .. SCRIPT CAPITAL F
+.. |geq|                             unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |geqq|                            unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
+.. |geqslant|                        unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
+.. |gg|                              unicode:: U+0226B .. MUCH GREATER-THAN
+.. |ggg|                             unicode:: U+022D9 .. VERY MUCH GREATER-THAN
+.. |gnapprox|                        unicode:: U+02A8A .. GREATER-THAN AND NOT APPROXIMATE
+.. |gneq|                            unicode:: U+02A88 .. GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |gneqq|                           unicode:: U+02269 .. GREATER-THAN BUT NOT EQUAL TO
+.. |GreaterEqual|                    unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |GreaterEqualLess|                unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
+.. |GreaterFullEqual|                unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
+.. |GreaterLess|                     unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
+.. |GreaterSlantEqual|               unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
+.. |GreaterTilde|                    unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
+.. |gtrapprox|                       unicode:: U+02A86 .. GREATER-THAN OR APPROXIMATE
+.. |gtrdot|                          unicode:: U+022D7 .. GREATER-THAN WITH DOT
+.. |gtreqless|                       unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
+.. |gtreqqless|                      unicode:: U+02A8C .. GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+.. |gtrless|                         unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
+.. |gtrsim|                          unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
+.. |gvertneqq|                       unicode:: U+02269 U+0FE00 .. GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |Hacek|                           unicode:: U+002C7 .. CARON
+.. |hbar|                            unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |heartsuit|                       unicode:: U+02665 .. BLACK HEART SUIT
+.. |HilbertSpace|                    unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |hksearow|                        unicode:: U+02925 .. SOUTH EAST ARROW WITH HOOK
+.. |hkswarow|                        unicode:: U+02926 .. SOUTH WEST ARROW WITH HOOK
+.. |hookleftarrow|                   unicode:: U+021A9 .. LEFTWARDS ARROW WITH HOOK
+.. |hookrightarrow|                  unicode:: U+021AA .. RIGHTWARDS ARROW WITH HOOK
+.. |hslash|                          unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |HumpDownHump|                    unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
+.. |HumpEqual|                       unicode:: U+0224F .. DIFFERENCE BETWEEN
+.. |iiiint|                          unicode:: U+02A0C .. QUADRUPLE INTEGRAL OPERATOR
+.. |iiint|                           unicode:: U+0222D .. TRIPLE INTEGRAL
+.. |Im|                              unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |ImaginaryI|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
+.. |imagline|                        unicode:: U+02110 .. SCRIPT CAPITAL I
+.. |imagpart|                        unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |Implies|                         unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |in|                              unicode:: U+02208 .. ELEMENT OF
+.. |integers|                        unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
+.. |Integral|                        unicode:: U+0222B .. INTEGRAL
+.. |intercal|                        unicode:: U+022BA .. INTERCALATE
+.. |Intersection|                    unicode:: U+022C2 .. N-ARY INTERSECTION
+.. |intprod|                         unicode:: U+02A3C .. INTERIOR PRODUCT
+.. |InvisibleComma|                  unicode:: U+02063 .. INVISIBLE SEPARATOR
+.. |InvisibleTimes|                  unicode:: U+02062 .. INVISIBLE TIMES
+.. |langle|                          unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |Laplacetrf|                      unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |lbrace|                          unicode:: U+0007B .. LEFT CURLY BRACKET
+.. |lbrack|                          unicode:: U+0005B .. LEFT SQUARE BRACKET
+.. |LeftAngleBracket|                unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |LeftArrow|                       unicode:: U+02190 .. LEFTWARDS ARROW
+.. |Leftarrow|                       unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |leftarrow|                       unicode:: U+02190 .. LEFTWARDS ARROW
+.. |LeftArrowBar|                    unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
+.. |LeftArrowRightArrow|             unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |leftarrowtail|                   unicode:: U+021A2 .. LEFTWARDS ARROW WITH TAIL
+.. |LeftCeiling|                     unicode:: U+02308 .. LEFT CEILING
+.. |LeftDoubleBracket|               unicode:: U+0301A .. LEFT WHITE SQUARE BRACKET
+.. |LeftDownVector|                  unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
+.. |LeftFloor|                       unicode:: U+0230A .. LEFT FLOOR
+.. |leftharpoondown|                 unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
+.. |leftharpoonup|                   unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
+.. |leftleftarrows|                  unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
+.. |LeftRightArrow|                  unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |Leftrightarrow|                  unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |leftrightarrow|                  unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |leftrightarrows|                 unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |leftrightharpoons|               unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |leftrightsquigarrow|             unicode:: U+021AD .. LEFT RIGHT WAVE ARROW
+.. |LeftTee|                         unicode:: U+022A3 .. LEFT TACK
+.. |LeftTeeArrow|                    unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
+.. |leftthreetimes|                  unicode:: U+022CB .. LEFT SEMIDIRECT PRODUCT
+.. |LeftTriangle|                    unicode:: U+022B2 .. NORMAL SUBGROUP OF
+.. |LeftTriangleEqual|               unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
+.. |LeftUpVector|                    unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
+.. |LeftVector|                      unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
+.. |leq|                             unicode:: U+02264 .. LESS-THAN OR EQUAL TO
+.. |leqq|                            unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
+.. |leqslant|                        unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
+.. |lessapprox|                      unicode:: U+02A85 .. LESS-THAN OR APPROXIMATE
+.. |lessdot|                         unicode:: U+022D6 .. LESS-THAN WITH DOT
+.. |lesseqgtr|                       unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
+.. |lesseqqgtr|                      unicode:: U+02A8B .. LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+.. |LessEqualGreater|                unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
+.. |LessFullEqual|                   unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
+.. |LessGreater|                     unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
+.. |lessgtr|                         unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
+.. |lesssim|                         unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
+.. |LessSlantEqual|                  unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
+.. |LessTilde|                       unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
+.. |ll|                              unicode:: U+0226A .. MUCH LESS-THAN
+.. |llcorner|                        unicode:: U+0231E .. BOTTOM LEFT CORNER
+.. |Lleftarrow|                      unicode:: U+021DA .. LEFTWARDS TRIPLE ARROW
+.. |lmoustache|                      unicode:: U+023B0 .. UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+.. |lnapprox|                        unicode:: U+02A89 .. LESS-THAN AND NOT APPROXIMATE
+.. |lneq|                            unicode:: U+02A87 .. LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |lneqq|                           unicode:: U+02268 .. LESS-THAN BUT NOT EQUAL TO
+.. |LongLeftArrow|                   unicode:: U+027F5 .. LONG LEFTWARDS ARROW
+.. |Longleftarrow|                   unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
+.. |longleftarrow|                   unicode:: U+027F5 .. LONG LEFTWARDS ARROW
+.. |LongLeftRightArrow|              unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
+.. |Longleftrightarrow|              unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
+.. |longleftrightarrow|              unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
+.. |longmapsto|                      unicode:: U+027FC .. LONG RIGHTWARDS ARROW FROM BAR
+.. |LongRightArrow|                  unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
+.. |Longrightarrow|                  unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
+.. |longrightarrow|                  unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
+.. |looparrowleft|                   unicode:: U+021AB .. LEFTWARDS ARROW WITH LOOP
+.. |looparrowright|                  unicode:: U+021AC .. RIGHTWARDS ARROW WITH LOOP
+.. |LowerLeftArrow|                  unicode:: U+02199 .. SOUTH WEST ARROW
+.. |LowerRightArrow|                 unicode:: U+02198 .. SOUTH EAST ARROW
+.. |lozenge|                         unicode:: U+025CA .. LOZENGE
+.. |lrcorner|                        unicode:: U+0231F .. BOTTOM RIGHT CORNER
+.. |Lsh|                             unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+.. |lvertneqq|                       unicode:: U+02268 U+0FE00 .. LESS-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |maltese|                         unicode:: U+02720 .. MALTESE CROSS
+.. |mapsto|                          unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
+.. |measuredangle|                   unicode:: U+02221 .. MEASURED ANGLE
+.. |Mellintrf|                       unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |MinusPlus|                       unicode:: U+02213 .. MINUS-OR-PLUS SIGN
+.. |mp|                              unicode:: U+02213 .. MINUS-OR-PLUS SIGN
+.. |multimap|                        unicode:: U+022B8 .. MULTIMAP
+.. |napprox|                         unicode:: U+02249 .. NOT ALMOST EQUAL TO
+.. |natural|                         unicode:: U+0266E .. MUSIC NATURAL SIGN
+.. |naturals|                        unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
+.. |nearrow|                         unicode:: U+02197 .. NORTH EAST ARROW
+.. |NegativeMediumSpace|             unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NegativeThickSpace|              unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NegativeThinSpace|               unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NegativeVeryThinSpace|           unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NestedGreaterGreater|            unicode:: U+0226B .. MUCH GREATER-THAN
+.. |NestedLessLess|                  unicode:: U+0226A .. MUCH LESS-THAN
+.. |nexists|                         unicode:: U+02204 .. THERE DOES NOT EXIST
+.. |ngeq|                            unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
+.. |ngeqq|                           unicode:: U+02267 U+00338 .. GREATER-THAN OVER EQUAL TO with slash
+.. |ngeqslant|                       unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
+.. |ngtr|                            unicode:: U+0226F .. NOT GREATER-THAN
+.. |nLeftarrow|                      unicode:: U+021CD .. LEFTWARDS DOUBLE ARROW WITH STROKE
+.. |nleftarrow|                      unicode:: U+0219A .. LEFTWARDS ARROW WITH STROKE
+.. |nLeftrightarrow|                 unicode:: U+021CE .. LEFT RIGHT DOUBLE ARROW WITH STROKE
+.. |nleftrightarrow|                 unicode:: U+021AE .. LEFT RIGHT ARROW WITH STROKE
+.. |nleq|                            unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
+.. |nleqq|                           unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
+.. |nleqslant|                       unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
+.. |nless|                           unicode:: U+0226E .. NOT LESS-THAN
+.. |NonBreakingSpace|                unicode:: U+000A0 .. NO-BREAK SPACE
+.. |NotCongruent|                    unicode:: U+02262 .. NOT IDENTICAL TO
+.. |NotDoubleVerticalBar|            unicode:: U+02226 .. NOT PARALLEL TO
+.. |NotElement|                      unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |NotEqual|                        unicode:: U+02260 .. NOT EQUAL TO
+.. |NotEqualTilde|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
+.. |NotExists|                       unicode:: U+02204 .. THERE DOES NOT EXIST
+.. |NotGreater|                      unicode:: U+0226F .. NOT GREATER-THAN
+.. |NotGreaterEqual|                 unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
+.. |NotGreaterFullEqual|             unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
+.. |NotGreaterGreater|               unicode:: U+0226B U+00338 .. MUCH GREATER THAN with slash
+.. |NotGreaterLess|                  unicode:: U+02279 .. NEITHER GREATER-THAN NOR LESS-THAN
+.. |NotGreaterSlantEqual|            unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
+.. |NotGreaterTilde|                 unicode:: U+02275 .. NEITHER GREATER-THAN NOR EQUIVALENT TO
+.. |NotHumpDownHump|                 unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
+.. |NotLeftTriangle|                 unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
+.. |NotLeftTriangleEqual|            unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
+.. |NotLess|                         unicode:: U+0226E .. NOT LESS-THAN
+.. |NotLessEqual|                    unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
+.. |NotLessGreater|                  unicode:: U+02278 .. NEITHER LESS-THAN NOR GREATER-THAN
+.. |NotLessLess|                     unicode:: U+0226A U+00338 .. MUCH LESS THAN with slash
+.. |NotLessSlantEqual|               unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
+.. |NotLessTilde|                    unicode:: U+02274 .. NEITHER LESS-THAN NOR EQUIVALENT TO
+.. |NotPrecedes|                     unicode:: U+02280 .. DOES NOT PRECEDE
+.. |NotPrecedesEqual|                unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |NotPrecedesSlantEqual|           unicode:: U+022E0 .. DOES NOT PRECEDE OR EQUAL
+.. |NotReverseElement|               unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
+.. |NotRightTriangle|                unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
+.. |NotRightTriangleEqual|           unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+.. |NotSquareSubsetEqual|            unicode:: U+022E2 .. NOT SQUARE IMAGE OF OR EQUAL TO
+.. |NotSquareSupersetEqual|          unicode:: U+022E3 .. NOT SQUARE ORIGINAL OF OR EQUAL TO
+.. |NotSubset|                       unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
+.. |NotSubsetEqual|                  unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
+.. |NotSucceeds|                     unicode:: U+02281 .. DOES NOT SUCCEED
+.. |NotSucceedsEqual|                unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |NotSucceedsSlantEqual|           unicode:: U+022E1 .. DOES NOT SUCCEED OR EQUAL
+.. |NotSuperset|                     unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
+.. |NotSupersetEqual|                unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
+.. |NotTilde|                        unicode:: U+02241 .. NOT TILDE
+.. |NotTildeEqual|                   unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
+.. |NotTildeFullEqual|               unicode:: U+02247 .. NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+.. |NotTildeTilde|                   unicode:: U+02249 .. NOT ALMOST EQUAL TO
+.. |NotVerticalBar|                  unicode:: U+02224 .. DOES NOT DIVIDE
+.. |nparallel|                       unicode:: U+02226 .. NOT PARALLEL TO
+.. |nprec|                           unicode:: U+02280 .. DOES NOT PRECEDE
+.. |npreceq|                         unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nRightarrow|                     unicode:: U+021CF .. RIGHTWARDS DOUBLE ARROW WITH STROKE
+.. |nrightarrow|                     unicode:: U+0219B .. RIGHTWARDS ARROW WITH STROKE
+.. |nshortmid|                       unicode:: U+02224 .. DOES NOT DIVIDE
+.. |nshortparallel|                  unicode:: U+02226 .. NOT PARALLEL TO
+.. |nsimeq|                          unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
+.. |nsubset|                         unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
+.. |nsubseteq|                       unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
+.. |nsubseteqq|                      unicode:: U+02AC5 U+00338 .. SUBSET OF ABOVE EQUALS SIGN with slash
+.. |nsucc|                           unicode:: U+02281 .. DOES NOT SUCCEED
+.. |nsucceq|                         unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nsupset|                         unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
+.. |nsupseteq|                       unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
+.. |nsupseteqq|                      unicode:: U+02AC6 U+00338 .. SUPERSET OF ABOVE EQUALS SIGN with slash
+.. |ntriangleleft|                   unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
+.. |ntrianglelefteq|                 unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
+.. |ntriangleright|                  unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
+.. |ntrianglerighteq|                unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+.. |nwarrow|                         unicode:: U+02196 .. NORTH WEST ARROW
+.. |oint|                            unicode:: U+0222E .. CONTOUR INTEGRAL
+.. |OpenCurlyDoubleQuote|            unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
+.. |OpenCurlyQuote|                  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
+.. |orderof|                         unicode:: U+02134 .. SCRIPT SMALL O
+.. |parallel|                        unicode:: U+02225 .. PARALLEL TO
+.. |PartialD|                        unicode:: U+02202 .. PARTIAL DIFFERENTIAL
+.. |pitchfork|                       unicode:: U+022D4 .. PITCHFORK
+.. |PlusMinus|                       unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |pm|                              unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |Poincareplane|                   unicode:: U+0210C .. BLACK-LETTER CAPITAL H
+.. |prec|                            unicode:: U+0227A .. PRECEDES
+.. |precapprox|                      unicode:: U+02AB7 .. PRECEDES ABOVE ALMOST EQUAL TO
+.. |preccurlyeq|                     unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |Precedes|                        unicode:: U+0227A .. PRECEDES
+.. |PrecedesEqual|                   unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+.. |PrecedesSlantEqual|              unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |PrecedesTilde|                   unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
+.. |preceq|                          unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+.. |precnapprox|                     unicode:: U+02AB9 .. PRECEDES ABOVE NOT ALMOST EQUAL TO
+.. |precneqq|                        unicode:: U+02AB5 .. PRECEDES ABOVE NOT EQUAL TO
+.. |precnsim|                        unicode:: U+022E8 .. PRECEDES BUT NOT EQUIVALENT TO
+.. |precsim|                         unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
+.. |primes|                          unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
+.. |Proportion|                      unicode:: U+02237 .. PROPORTION
+.. |Proportional|                    unicode:: U+0221D .. PROPORTIONAL TO
+.. |propto|                          unicode:: U+0221D .. PROPORTIONAL TO
+.. |quaternions|                     unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
+.. |questeq|                         unicode:: U+0225F .. QUESTIONED EQUAL TO
+.. |rangle|                          unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |rationals|                       unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
+.. |rbrace|                          unicode:: U+0007D .. RIGHT CURLY BRACKET
+.. |rbrack|                          unicode:: U+0005D .. RIGHT SQUARE BRACKET
+.. |Re|                              unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |realine|                         unicode:: U+0211B .. SCRIPT CAPITAL R
+.. |realpart|                        unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |reals|                           unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
+.. |ReverseElement|                  unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |ReverseEquilibrium|              unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |ReverseUpEquilibrium|            unicode:: U+0296F .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+.. |RightAngleBracket|               unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |RightArrow|                      unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |Rightarrow|                      unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |rightarrow|                      unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |RightArrowBar|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
+.. |RightArrowLeftArrow|             unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rightarrowtail|                  unicode:: U+021A3 .. RIGHTWARDS ARROW WITH TAIL
+.. |RightCeiling|                    unicode:: U+02309 .. RIGHT CEILING
+.. |RightDoubleBracket|              unicode:: U+0301B .. RIGHT WHITE SQUARE BRACKET
+.. |RightDownVector|                 unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+.. |RightFloor|                      unicode:: U+0230B .. RIGHT FLOOR
+.. |rightharpoondown|                unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+.. |rightharpoonup|                  unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
+.. |rightleftarrows|                 unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rightleftharpoons|               unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |rightrightarrows|                unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
+.. |rightsquigarrow|                 unicode:: U+0219D .. RIGHTWARDS WAVE ARROW
+.. |RightTee|                        unicode:: U+022A2 .. RIGHT TACK
+.. |RightTeeArrow|                   unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
+.. |rightthreetimes|                 unicode:: U+022CC .. RIGHT SEMIDIRECT PRODUCT
+.. |RightTriangle|                   unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
+.. |RightTriangleEqual|              unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+.. |RightUpVector|                   unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
+.. |RightVector|                     unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
+.. |risingdotseq|                    unicode:: U+02253 .. IMAGE OF OR APPROXIMATELY EQUAL TO
+.. |rmoustache|                      unicode:: U+023B1 .. UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+.. |Rrightarrow|                     unicode:: U+021DB .. RIGHTWARDS TRIPLE ARROW
+.. |Rsh|                             unicode:: U+021B1 .. UPWARDS ARROW WITH TIP RIGHTWARDS
+.. |searrow|                         unicode:: U+02198 .. SOUTH EAST ARROW
+.. |setminus|                        unicode:: U+02216 .. SET MINUS
+.. |ShortDownArrow|                  unicode:: U+02193 .. DOWNWARDS ARROW
+.. |ShortLeftArrow|                  unicode:: U+02190 .. LEFTWARDS ARROW
+.. |shortmid|                        unicode:: U+02223 .. DIVIDES
+.. |shortparallel|                   unicode:: U+02225 .. PARALLEL TO
+.. |ShortRightArrow|                 unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |ShortUpArrow|                    unicode:: U+02191 .. UPWARDS ARROW
+.. |simeq|                           unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
+.. |SmallCircle|                     unicode:: U+02218 .. RING OPERATOR
+.. |smallsetminus|                   unicode:: U+02216 .. SET MINUS
+.. |spadesuit|                       unicode:: U+02660 .. BLACK SPADE SUIT
+.. |Sqrt|                            unicode:: U+0221A .. SQUARE ROOT
+.. |sqsubset|                        unicode:: U+0228F .. SQUARE IMAGE OF
+.. |sqsubseteq|                      unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
+.. |sqsupset|                        unicode:: U+02290 .. SQUARE ORIGINAL OF
+.. |sqsupseteq|                      unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
+.. |Square|                          unicode:: U+025A1 .. WHITE SQUARE
+.. |SquareIntersection|              unicode:: U+02293 .. SQUARE CAP
+.. |SquareSubset|                    unicode:: U+0228F .. SQUARE IMAGE OF
+.. |SquareSubsetEqual|               unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
+.. |SquareSuperset|                  unicode:: U+02290 .. SQUARE ORIGINAL OF
+.. |SquareSupersetEqual|             unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
+.. |SquareUnion|                     unicode:: U+02294 .. SQUARE CUP
+.. |Star|                            unicode:: U+022C6 .. STAR OPERATOR
+.. |straightepsilon|                 unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
+.. |straightphi|                     unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |Subset|                          unicode:: U+022D0 .. DOUBLE SUBSET
+.. |subset|                          unicode:: U+02282 .. SUBSET OF
+.. |subseteq|                        unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |subseteqq|                       unicode:: U+02AC5 .. SUBSET OF ABOVE EQUALS SIGN
+.. |SubsetEqual|                     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |subsetneq|                       unicode:: U+0228A .. SUBSET OF WITH NOT EQUAL TO
+.. |subsetneqq|                      unicode:: U+02ACB .. SUBSET OF ABOVE NOT EQUAL TO
+.. |succ|                            unicode:: U+0227B .. SUCCEEDS
+.. |succapprox|                      unicode:: U+02AB8 .. SUCCEEDS ABOVE ALMOST EQUAL TO
+.. |succcurlyeq|                     unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
+.. |Succeeds|                        unicode:: U+0227B .. SUCCEEDS
+.. |SucceedsEqual|                   unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+.. |SucceedsSlantEqual|              unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
+.. |SucceedsTilde|                   unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
+.. |succeq|                          unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+.. |succnapprox|                     unicode:: U+02ABA .. SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+.. |succneqq|                        unicode:: U+02AB6 .. SUCCEEDS ABOVE NOT EQUAL TO
+.. |succnsim|                        unicode:: U+022E9 .. SUCCEEDS BUT NOT EQUIVALENT TO
+.. |succsim|                         unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
+.. |SuchThat|                        unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |Sum|                             unicode:: U+02211 .. N-ARY SUMMATION
+.. |Superset|                        unicode:: U+02283 .. SUPERSET OF
+.. |SupersetEqual|                   unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |Supset|                          unicode:: U+022D1 .. DOUBLE SUPERSET
+.. |supset|                          unicode:: U+02283 .. SUPERSET OF
+.. |supseteq|                        unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |supseteqq|                       unicode:: U+02AC6 .. SUPERSET OF ABOVE EQUALS SIGN
+.. |supsetneq|                       unicode:: U+0228B .. SUPERSET OF WITH NOT EQUAL TO
+.. |supsetneqq|                      unicode:: U+02ACC .. SUPERSET OF ABOVE NOT EQUAL TO
+.. |swarrow|                         unicode:: U+02199 .. SOUTH WEST ARROW
+.. |Therefore|                       unicode:: U+02234 .. THEREFORE
+.. |therefore|                       unicode:: U+02234 .. THEREFORE
+.. |thickapprox|                     unicode:: U+02248 .. ALMOST EQUAL TO
+.. |thicksim|                        unicode:: U+0223C .. TILDE OPERATOR
+.. |ThinSpace|                       unicode:: U+02009 .. THIN SPACE
+.. |Tilde|                           unicode:: U+0223C .. TILDE OPERATOR
+.. |TildeEqual|                      unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
+.. |TildeFullEqual|                  unicode:: U+02245 .. APPROXIMATELY EQUAL TO
+.. |TildeTilde|                      unicode:: U+02248 .. ALMOST EQUAL TO
+.. |toea|                            unicode:: U+02928 .. NORTH EAST ARROW AND SOUTH EAST ARROW
+.. |tosa|                            unicode:: U+02929 .. SOUTH EAST ARROW AND SOUTH WEST ARROW
+.. |triangle|                        unicode:: U+025B5 .. WHITE UP-POINTING SMALL TRIANGLE
+.. |triangledown|                    unicode:: U+025BF .. WHITE DOWN-POINTING SMALL TRIANGLE
+.. |triangleleft|                    unicode:: U+025C3 .. WHITE LEFT-POINTING SMALL TRIANGLE
+.. |trianglelefteq|                  unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
+.. |triangleq|                       unicode:: U+0225C .. DELTA EQUAL TO
+.. |triangleright|                   unicode:: U+025B9 .. WHITE RIGHT-POINTING SMALL TRIANGLE
+.. |trianglerighteq|                 unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+.. |TripleDot|                       unicode:: U+020DB .. COMBINING THREE DOTS ABOVE
+.. |twoheadleftarrow|                unicode:: U+0219E .. LEFTWARDS TWO HEADED ARROW
+.. |twoheadrightarrow|               unicode:: U+021A0 .. RIGHTWARDS TWO HEADED ARROW
+.. |ulcorner|                        unicode:: U+0231C .. TOP LEFT CORNER
+.. |Union|                           unicode:: U+022C3 .. N-ARY UNION
+.. |UnionPlus|                       unicode:: U+0228E .. MULTISET UNION
+.. |UpArrow|                         unicode:: U+02191 .. UPWARDS ARROW
+.. |Uparrow|                         unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |uparrow|                         unicode:: U+02191 .. UPWARDS ARROW
+.. |UpArrowDownArrow|                unicode:: U+021C5 .. UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+.. |UpDownArrow|                     unicode:: U+02195 .. UP DOWN ARROW
+.. |Updownarrow|                     unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
+.. |updownarrow|                     unicode:: U+02195 .. UP DOWN ARROW
+.. |UpEquilibrium|                   unicode:: U+0296E .. UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+.. |upharpoonleft|                   unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
+.. |upharpoonright|                  unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
+.. |UpperLeftArrow|                  unicode:: U+02196 .. NORTH WEST ARROW
+.. |UpperRightArrow|                 unicode:: U+02197 .. NORTH EAST ARROW
+.. |upsilon|                         unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |UpTee|                           unicode:: U+022A5 .. UP TACK
+.. |UpTeeArrow|                      unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
+.. |upuparrows|                      unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
+.. |urcorner|                        unicode:: U+0231D .. TOP RIGHT CORNER
+.. |varepsilon|                      unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |varkappa|                        unicode:: U+003F0 .. GREEK KAPPA SYMBOL
+.. |varnothing|                      unicode:: U+02205 .. EMPTY SET
+.. |varphi|                          unicode:: U+003C6 .. GREEK SMALL LETTER PHI
+.. |varpi|                           unicode:: U+003D6 .. GREEK PI SYMBOL
+.. |varpropto|                       unicode:: U+0221D .. PROPORTIONAL TO
+.. |varrho|                          unicode:: U+003F1 .. GREEK RHO SYMBOL
+.. |varsigma|                        unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |varsubsetneq|                    unicode:: U+0228A U+0FE00 .. SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+.. |varsubsetneqq|                   unicode:: U+02ACB U+0FE00 .. SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |varsupsetneq|                    unicode:: U+0228B U+0FE00 .. SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+.. |varsupsetneqq|                   unicode:: U+02ACC U+0FE00 .. SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |vartheta|                        unicode:: U+003D1 .. GREEK THETA SYMBOL
+.. |vartriangleleft|                 unicode:: U+022B2 .. NORMAL SUBGROUP OF
+.. |vartriangleright|                unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
+.. |Vee|                             unicode:: U+022C1 .. N-ARY LOGICAL OR
+.. |vee|                             unicode:: U+02228 .. LOGICAL OR
+.. |Vert|                            unicode:: U+02016 .. DOUBLE VERTICAL LINE
+.. |vert|                            unicode:: U+0007C .. VERTICAL LINE
+.. |VerticalBar|                     unicode:: U+02223 .. DIVIDES
+.. |VerticalTilde|                   unicode:: U+02240 .. WREATH PRODUCT
+.. |VeryThinSpace|                   unicode:: U+0200A .. HAIR SPACE
+.. |Wedge|                           unicode:: U+022C0 .. N-ARY LOGICAL AND
+.. |wedge|                           unicode:: U+02227 .. LOGICAL AND
+.. |wp|                              unicode:: U+02118 .. SCRIPT CAPITAL P
+.. |wr|                              unicode:: U+02240 .. WREATH PRODUCT
+.. |zeetrf|                          unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlextra-wide.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,113 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |af|                      unicode:: U+02061 .. FUNCTION APPLICATION
+.. |aopf|                    unicode:: U+1D552 .. MATHEMATICAL DOUBLE-STRUCK SMALL A
+.. |asympeq|                 unicode:: U+0224D .. EQUIVALENT TO
+.. |bopf|                    unicode:: U+1D553 .. MATHEMATICAL DOUBLE-STRUCK SMALL B
+.. |copf|                    unicode:: U+1D554 .. MATHEMATICAL DOUBLE-STRUCK SMALL C
+.. |Cross|                   unicode:: U+02A2F .. VECTOR OR CROSS PRODUCT
+.. |DD|                      unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
+.. |dd|                      unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
+.. |dopf|                    unicode:: U+1D555 .. MATHEMATICAL DOUBLE-STRUCK SMALL D
+.. |DownArrowBar|            unicode:: U+02913 .. DOWNWARDS ARROW TO BAR
+.. |DownBreve|               unicode:: U+00311 .. COMBINING INVERTED BREVE
+.. |DownLeftRightVector|     unicode:: U+02950 .. LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+.. |DownLeftTeeVector|       unicode:: U+0295E .. LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownLeftVectorBar|       unicode:: U+02956 .. LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |DownRightTeeVector|      unicode:: U+0295F .. RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownRightVectorBar|      unicode:: U+02957 .. RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |ee|                      unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |EmptySmallSquare|        unicode:: U+025FB .. WHITE MEDIUM SQUARE
+.. |EmptyVerySmallSquare|    unicode:: U+025AB .. WHITE SMALL SQUARE
+.. |eopf|                    unicode:: U+1D556 .. MATHEMATICAL DOUBLE-STRUCK SMALL E
+.. |Equal|                   unicode:: U+02A75 .. TWO CONSECUTIVE EQUALS SIGNS
+.. |FilledSmallSquare|       unicode:: U+025FC .. BLACK MEDIUM SQUARE
+.. |FilledVerySmallSquare|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |fopf|                    unicode:: U+1D557 .. MATHEMATICAL DOUBLE-STRUCK SMALL F
+.. |gopf|                    unicode:: U+1D558 .. MATHEMATICAL DOUBLE-STRUCK SMALL G
+.. |GreaterGreater|          unicode:: U+02AA2 .. DOUBLE NESTED GREATER-THAN
+.. |Hat|                     unicode:: U+0005E .. CIRCUMFLEX ACCENT
+.. |hopf|                    unicode:: U+1D559 .. MATHEMATICAL DOUBLE-STRUCK SMALL H
+.. |HorizontalLine|          unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
+.. |ic|                      unicode:: U+02063 .. INVISIBLE SEPARATOR
+.. |ii|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
+.. |iopf|                    unicode:: U+1D55A .. MATHEMATICAL DOUBLE-STRUCK SMALL I
+.. |it|                      unicode:: U+02062 .. INVISIBLE TIMES
+.. |jopf|                    unicode:: U+1D55B .. MATHEMATICAL DOUBLE-STRUCK SMALL J
+.. |kopf|                    unicode:: U+1D55C .. MATHEMATICAL DOUBLE-STRUCK SMALL K
+.. |larrb|                   unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
+.. |LeftDownTeeVector|       unicode:: U+02961 .. DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftDownVectorBar|       unicode:: U+02959 .. DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftRightVector|         unicode:: U+0294E .. LEFT BARB UP RIGHT BARB UP HARPOON
+.. |LeftTeeVector|           unicode:: U+0295A .. LEFTWARDS HARPOON WITH BARB UP FROM BAR
+.. |LeftTriangleBar|         unicode:: U+029CF .. LEFT TRIANGLE BESIDE VERTICAL BAR
+.. |LeftUpDownVector|        unicode:: U+02951 .. UP BARB LEFT DOWN BARB LEFT HARPOON
+.. |LeftUpTeeVector|         unicode:: U+02960 .. UPWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftUpVectorBar|         unicode:: U+02958 .. UPWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftVectorBar|           unicode:: U+02952 .. LEFTWARDS HARPOON WITH BARB UP TO BAR
+.. |LessLess|                unicode:: U+02AA1 .. DOUBLE NESTED LESS-THAN
+.. |lopf|                    unicode:: U+1D55D .. MATHEMATICAL DOUBLE-STRUCK SMALL L
+.. |mapstodown|              unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
+.. |mapstoleft|              unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
+.. |mapstoup|                unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
+.. |MediumSpace|             unicode:: U+0205F .. MEDIUM MATHEMATICAL SPACE
+.. |mopf|                    unicode:: U+1D55E .. MATHEMATICAL DOUBLE-STRUCK SMALL M
+.. |nbump|                   unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
+.. |nbumpe|                  unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |nesim|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
+.. |NewLine|                 unicode:: U+0000A .. LINE FEED (LF)
+.. |NoBreak|                 unicode:: U+02060 .. WORD JOINER
+.. |nopf|                    unicode:: U+1D55F .. MATHEMATICAL DOUBLE-STRUCK SMALL N
+.. |NotCupCap|               unicode:: U+0226D .. NOT EQUIVALENT TO
+.. |NotHumpEqual|            unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |NotLeftTriangleBar|      unicode:: U+029CF U+00338 .. LEFT TRIANGLE BESIDE VERTICAL BAR with slash
+.. |NotNestedGreaterGreater| unicode:: U+02AA2 U+00338 .. DOUBLE NESTED GREATER-THAN with slash
+.. |NotNestedLessLess|       unicode:: U+02AA1 U+00338 .. DOUBLE NESTED LESS-THAN with slash
+.. |NotRightTriangleBar|     unicode:: U+029D0 U+00338 .. VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
+.. |NotSquareSubset|         unicode:: U+0228F U+00338 .. SQUARE IMAGE OF with slash
+.. |NotSquareSuperset|       unicode:: U+02290 U+00338 .. SQUARE ORIGINAL OF with slash
+.. |NotSucceedsTilde|        unicode:: U+0227F U+00338 .. SUCCEEDS OR EQUIVALENT TO with slash
+.. |oopf|                    unicode:: U+1D560 .. MATHEMATICAL DOUBLE-STRUCK SMALL O
+.. |OverBar|                 unicode:: U+000AF .. MACRON
+.. |OverBrace|               unicode:: U+0FE37 .. PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+.. |OverBracket|             unicode:: U+023B4 .. TOP SQUARE BRACKET
+.. |OverParenthesis|         unicode:: U+0FE35 .. PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+.. |planckh|                 unicode:: U+0210E .. PLANCK CONSTANT
+.. |popf|                    unicode:: U+1D561 .. MATHEMATICAL DOUBLE-STRUCK SMALL P
+.. |Product|                 unicode:: U+0220F .. N-ARY PRODUCT
+.. |qopf|                    unicode:: U+1D562 .. MATHEMATICAL DOUBLE-STRUCK SMALL Q
+.. |rarrb|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
+.. |RightDownTeeVector|      unicode:: U+0295D .. DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightDownVectorBar|      unicode:: U+02955 .. DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightTeeVector|          unicode:: U+0295B .. RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+.. |RightTriangleBar|        unicode:: U+029D0 .. VERTICAL BAR BESIDE RIGHT TRIANGLE
+.. |RightUpDownVector|       unicode:: U+0294F .. UP BARB RIGHT DOWN BARB RIGHT HARPOON
+.. |RightUpTeeVector|        unicode:: U+0295C .. UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightUpVectorBar|        unicode:: U+02954 .. UPWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightVectorBar|          unicode:: U+02953 .. RIGHTWARDS HARPOON WITH BARB UP TO BAR
+.. |ropf|                    unicode:: U+1D563 .. MATHEMATICAL DOUBLE-STRUCK SMALL R
+.. |RoundImplies|            unicode:: U+02970 .. RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+.. |RuleDelayed|             unicode:: U+029F4 .. RULE-DELAYED
+.. |sopf|                    unicode:: U+1D564 .. MATHEMATICAL DOUBLE-STRUCK SMALL S
+.. |Tab|                     unicode:: U+00009 .. CHARACTER TABULATION
+.. |ThickSpace|              unicode:: U+02009 U+0200A U+0200A .. space of width 5/18 em
+.. |topf|                    unicode:: U+1D565 .. MATHEMATICAL DOUBLE-STRUCK SMALL T
+.. |UnderBar|                unicode:: U+00332 .. COMBINING LOW LINE
+.. |UnderBrace|              unicode:: U+0FE38 .. PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+.. |UnderBracket|            unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
+.. |UnderParenthesis|        unicode:: U+0FE36 .. PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+.. |uopf|                    unicode:: U+1D566 .. MATHEMATICAL DOUBLE-STRUCK SMALL U
+.. |UpArrowBar|              unicode:: U+02912 .. UPWARDS ARROW TO BAR
+.. |Upsilon|                 unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |VerticalLine|            unicode:: U+0007C .. VERTICAL LINE
+.. |VerticalSeparator|       unicode:: U+02758 .. LIGHT VERTICAL BAR
+.. |vopf|                    unicode:: U+1D567 .. MATHEMATICAL DOUBLE-STRUCK SMALL V
+.. |wopf|                    unicode:: U+1D568 .. MATHEMATICAL DOUBLE-STRUCK SMALL W
+.. |xopf|                    unicode:: U+1D569 .. MATHEMATICAL DOUBLE-STRUCK SMALL X
+.. |yopf|                    unicode:: U+1D56A .. MATHEMATICAL DOUBLE-STRUCK SMALL Y
+.. |ZeroWidthSpace|          unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |zopf|                    unicode:: U+1D56B .. MATHEMATICAL DOUBLE-STRUCK SMALL Z
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/mmlextra.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,87 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |af|                      unicode:: U+02061 .. FUNCTION APPLICATION
+.. |asympeq|                 unicode:: U+0224D .. EQUIVALENT TO
+.. |Cross|                   unicode:: U+02A2F .. VECTOR OR CROSS PRODUCT
+.. |DD|                      unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
+.. |dd|                      unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
+.. |DownArrowBar|            unicode:: U+02913 .. DOWNWARDS ARROW TO BAR
+.. |DownBreve|               unicode:: U+00311 .. COMBINING INVERTED BREVE
+.. |DownLeftRightVector|     unicode:: U+02950 .. LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+.. |DownLeftTeeVector|       unicode:: U+0295E .. LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownLeftVectorBar|       unicode:: U+02956 .. LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |DownRightTeeVector|      unicode:: U+0295F .. RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownRightVectorBar|      unicode:: U+02957 .. RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |ee|                      unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |EmptySmallSquare|        unicode:: U+025FB .. WHITE MEDIUM SQUARE
+.. |EmptyVerySmallSquare|    unicode:: U+025AB .. WHITE SMALL SQUARE
+.. |Equal|                   unicode:: U+02A75 .. TWO CONSECUTIVE EQUALS SIGNS
+.. |FilledSmallSquare|       unicode:: U+025FC .. BLACK MEDIUM SQUARE
+.. |FilledVerySmallSquare|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |GreaterGreater|          unicode:: U+02AA2 .. DOUBLE NESTED GREATER-THAN
+.. |Hat|                     unicode:: U+0005E .. CIRCUMFLEX ACCENT
+.. |HorizontalLine|          unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
+.. |ic|                      unicode:: U+02063 .. INVISIBLE SEPARATOR
+.. |ii|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
+.. |it|                      unicode:: U+02062 .. INVISIBLE TIMES
+.. |larrb|                   unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
+.. |LeftDownTeeVector|       unicode:: U+02961 .. DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftDownVectorBar|       unicode:: U+02959 .. DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftRightVector|         unicode:: U+0294E .. LEFT BARB UP RIGHT BARB UP HARPOON
+.. |LeftTeeVector|           unicode:: U+0295A .. LEFTWARDS HARPOON WITH BARB UP FROM BAR
+.. |LeftTriangleBar|         unicode:: U+029CF .. LEFT TRIANGLE BESIDE VERTICAL BAR
+.. |LeftUpDownVector|        unicode:: U+02951 .. UP BARB LEFT DOWN BARB LEFT HARPOON
+.. |LeftUpTeeVector|         unicode:: U+02960 .. UPWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftUpVectorBar|         unicode:: U+02958 .. UPWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftVectorBar|           unicode:: U+02952 .. LEFTWARDS HARPOON WITH BARB UP TO BAR
+.. |LessLess|                unicode:: U+02AA1 .. DOUBLE NESTED LESS-THAN
+.. |mapstodown|              unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
+.. |mapstoleft|              unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
+.. |mapstoup|                unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
+.. |MediumSpace|             unicode:: U+0205F .. MEDIUM MATHEMATICAL SPACE
+.. |nbump|                   unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
+.. |nbumpe|                  unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |nesim|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
+.. |NewLine|                 unicode:: U+0000A .. LINE FEED (LF)
+.. |NoBreak|                 unicode:: U+02060 .. WORD JOINER
+.. |NotCupCap|               unicode:: U+0226D .. NOT EQUIVALENT TO
+.. |NotHumpEqual|            unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |NotLeftTriangleBar|      unicode:: U+029CF U+00338 .. LEFT TRIANGLE BESIDE VERTICAL BAR with slash
+.. |NotNestedGreaterGreater| unicode:: U+02AA2 U+00338 .. DOUBLE NESTED GREATER-THAN with slash
+.. |NotNestedLessLess|       unicode:: U+02AA1 U+00338 .. DOUBLE NESTED LESS-THAN with slash
+.. |NotRightTriangleBar|     unicode:: U+029D0 U+00338 .. VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
+.. |NotSquareSubset|         unicode:: U+0228F U+00338 .. SQUARE IMAGE OF with slash
+.. |NotSquareSuperset|       unicode:: U+02290 U+00338 .. SQUARE ORIGINAL OF with slash
+.. |NotSucceedsTilde|        unicode:: U+0227F U+00338 .. SUCCEEDS OR EQUIVALENT TO with slash
+.. |OverBar|                 unicode:: U+000AF .. MACRON
+.. |OverBrace|               unicode:: U+0FE37 .. PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+.. |OverBracket|             unicode:: U+023B4 .. TOP SQUARE BRACKET
+.. |OverParenthesis|         unicode:: U+0FE35 .. PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+.. |planckh|                 unicode:: U+0210E .. PLANCK CONSTANT
+.. |Product|                 unicode:: U+0220F .. N-ARY PRODUCT
+.. |rarrb|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
+.. |RightDownTeeVector|      unicode:: U+0295D .. DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightDownVectorBar|      unicode:: U+02955 .. DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightTeeVector|          unicode:: U+0295B .. RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+.. |RightTriangleBar|        unicode:: U+029D0 .. VERTICAL BAR BESIDE RIGHT TRIANGLE
+.. |RightUpDownVector|       unicode:: U+0294F .. UP BARB RIGHT DOWN BARB RIGHT HARPOON
+.. |RightUpTeeVector|        unicode:: U+0295C .. UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightUpVectorBar|        unicode:: U+02954 .. UPWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightVectorBar|          unicode:: U+02953 .. RIGHTWARDS HARPOON WITH BARB UP TO BAR
+.. |RoundImplies|            unicode:: U+02970 .. RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+.. |RuleDelayed|             unicode:: U+029F4 .. RULE-DELAYED
+.. |Tab|                     unicode:: U+00009 .. CHARACTER TABULATION
+.. |ThickSpace|              unicode:: U+02009 U+0200A U+0200A .. space of width 5/18 em
+.. |UnderBar|                unicode:: U+00332 .. COMBINING LOW LINE
+.. |UnderBrace|              unicode:: U+0FE38 .. PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+.. |UnderBracket|            unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
+.. |UnderParenthesis|        unicode:: U+0FE36 .. PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+.. |UpArrowBar|              unicode:: U+02912 .. UPWARDS ARROW TO BAR
+.. |Upsilon|                 unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |VerticalLine|            unicode:: U+0007C .. VERTICAL LINE
+.. |VerticalSeparator|       unicode:: U+02758 .. LIGHT VERTICAL BAR
+.. |ZeroWidthSpace|          unicode:: U+0200B .. ZERO WIDTH SPACE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/s5defs.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,68 @@
+.. Definitions of interpreted text roles (classes) for S5/HTML data.
+.. This data file has been placed in the public domain.
+
+.. Colours
+   =======
+
+.. role:: black
+.. role:: gray
+.. role:: silver
+.. role:: white
+
+.. role:: maroon
+.. role:: red
+.. role:: magenta
+.. role:: fuchsia
+.. role:: pink
+.. role:: orange
+.. role:: yellow
+.. role:: lime
+.. role:: green
+.. role:: olive
+.. role:: teal
+.. role:: cyan
+.. role:: aqua
+.. role:: blue
+.. role:: navy
+.. role:: purple
+
+
+.. Text Sizes
+   ==========
+
+.. role:: huge
+.. role:: big
+.. role:: small
+.. role:: tiny
+
+
+.. Display in Slides (Presentation Mode) Only
+   ==========================================
+
+.. role:: slide
+   :class: slide-display
+
+
+.. Display in Outline Mode Only
+   ============================
+
+.. role:: outline
+
+
+.. Display in Print Only
+   =====================
+
+.. role:: print
+
+
+.. Display in Handout Mode Only
+   ============================
+
+.. role:: handout
+
+
+.. Incremental Display
+   ===================
+
+.. role:: incremental
+.. default-role:: incremental
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-lat1.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,102 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aacute| unicode:: U+000C1 .. LATIN CAPITAL LETTER A WITH ACUTE
+.. |aacute| unicode:: U+000E1 .. LATIN SMALL LETTER A WITH ACUTE
+.. |Acirc|  unicode:: U+000C2 .. LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+.. |acirc|  unicode:: U+000E2 .. LATIN SMALL LETTER A WITH CIRCUMFLEX
+.. |acute|  unicode:: U+000B4 .. ACUTE ACCENT
+.. |AElig|  unicode:: U+000C6 .. LATIN CAPITAL LETTER AE
+.. |aelig|  unicode:: U+000E6 .. LATIN SMALL LETTER AE
+.. |Agrave| unicode:: U+000C0 .. LATIN CAPITAL LETTER A WITH GRAVE
+.. |agrave| unicode:: U+000E0 .. LATIN SMALL LETTER A WITH GRAVE
+.. |Aring|  unicode:: U+000C5 .. LATIN CAPITAL LETTER A WITH RING ABOVE
+.. |aring|  unicode:: U+000E5 .. LATIN SMALL LETTER A WITH RING ABOVE
+.. |Atilde| unicode:: U+000C3 .. LATIN CAPITAL LETTER A WITH TILDE
+.. |atilde| unicode:: U+000E3 .. LATIN SMALL LETTER A WITH TILDE
+.. |Auml|   unicode:: U+000C4 .. LATIN CAPITAL LETTER A WITH DIAERESIS
+.. |auml|   unicode:: U+000E4 .. LATIN SMALL LETTER A WITH DIAERESIS
+.. |brvbar| unicode:: U+000A6 .. BROKEN BAR
+.. |Ccedil| unicode:: U+000C7 .. LATIN CAPITAL LETTER C WITH CEDILLA
+.. |ccedil| unicode:: U+000E7 .. LATIN SMALL LETTER C WITH CEDILLA
+.. |cedil|  unicode:: U+000B8 .. CEDILLA
+.. |cent|   unicode:: U+000A2 .. CENT SIGN
+.. |copy|   unicode:: U+000A9 .. COPYRIGHT SIGN
+.. |curren| unicode:: U+000A4 .. CURRENCY SIGN
+.. |deg|    unicode:: U+000B0 .. DEGREE SIGN
+.. |divide| unicode:: U+000F7 .. DIVISION SIGN
+.. |Eacute| unicode:: U+000C9 .. LATIN CAPITAL LETTER E WITH ACUTE
+.. |eacute| unicode:: U+000E9 .. LATIN SMALL LETTER E WITH ACUTE
+.. |Ecirc|  unicode:: U+000CA .. LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+.. |ecirc|  unicode:: U+000EA .. LATIN SMALL LETTER E WITH CIRCUMFLEX
+.. |Egrave| unicode:: U+000C8 .. LATIN CAPITAL LETTER E WITH GRAVE
+.. |egrave| unicode:: U+000E8 .. LATIN SMALL LETTER E WITH GRAVE
+.. |ETH|    unicode:: U+000D0 .. LATIN CAPITAL LETTER ETH
+.. |eth|    unicode:: U+000F0 .. LATIN SMALL LETTER ETH
+.. |Euml|   unicode:: U+000CB .. LATIN CAPITAL LETTER E WITH DIAERESIS
+.. |euml|   unicode:: U+000EB .. LATIN SMALL LETTER E WITH DIAERESIS
+.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF
+.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER
+.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS
+.. |Iacute| unicode:: U+000CD .. LATIN CAPITAL LETTER I WITH ACUTE
+.. |iacute| unicode:: U+000ED .. LATIN SMALL LETTER I WITH ACUTE
+.. |Icirc|  unicode:: U+000CE .. LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+.. |icirc|  unicode:: U+000EE .. LATIN SMALL LETTER I WITH CIRCUMFLEX
+.. |iexcl|  unicode:: U+000A1 .. INVERTED EXCLAMATION MARK
+.. |Igrave| unicode:: U+000CC .. LATIN CAPITAL LETTER I WITH GRAVE
+.. |igrave| unicode:: U+000EC .. LATIN SMALL LETTER I WITH GRAVE
+.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK
+.. |Iuml|   unicode:: U+000CF .. LATIN CAPITAL LETTER I WITH DIAERESIS
+.. |iuml|   unicode:: U+000EF .. LATIN SMALL LETTER I WITH DIAERESIS
+.. |laquo|  unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |macr|   unicode:: U+000AF .. MACRON
+.. |micro|  unicode:: U+000B5 .. MICRO SIGN
+.. |middot| unicode:: U+000B7 .. MIDDLE DOT
+.. |nbsp|   unicode:: U+000A0 .. NO-BREAK SPACE
+.. |not|    unicode:: U+000AC .. NOT SIGN
+.. |Ntilde| unicode:: U+000D1 .. LATIN CAPITAL LETTER N WITH TILDE
+.. |ntilde| unicode:: U+000F1 .. LATIN SMALL LETTER N WITH TILDE
+.. |Oacute| unicode:: U+000D3 .. LATIN CAPITAL LETTER O WITH ACUTE
+.. |oacute| unicode:: U+000F3 .. LATIN SMALL LETTER O WITH ACUTE
+.. |Ocirc|  unicode:: U+000D4 .. LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+.. |ocirc|  unicode:: U+000F4 .. LATIN SMALL LETTER O WITH CIRCUMFLEX
+.. |Ograve| unicode:: U+000D2 .. LATIN CAPITAL LETTER O WITH GRAVE
+.. |ograve| unicode:: U+000F2 .. LATIN SMALL LETTER O WITH GRAVE
+.. |ordf|   unicode:: U+000AA .. FEMININE ORDINAL INDICATOR
+.. |ordm|   unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR
+.. |Oslash| unicode:: U+000D8 .. LATIN CAPITAL LETTER O WITH STROKE
+.. |oslash| unicode:: U+000F8 .. LATIN SMALL LETTER O WITH STROKE
+.. |Otilde| unicode:: U+000D5 .. LATIN CAPITAL LETTER O WITH TILDE
+.. |otilde| unicode:: U+000F5 .. LATIN SMALL LETTER O WITH TILDE
+.. |Ouml|   unicode:: U+000D6 .. LATIN CAPITAL LETTER O WITH DIAERESIS
+.. |ouml|   unicode:: U+000F6 .. LATIN SMALL LETTER O WITH DIAERESIS
+.. |para|   unicode:: U+000B6 .. PILCROW SIGN
+.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |pound|  unicode:: U+000A3 .. POUND SIGN
+.. |raquo|  unicode:: U+000BB .. RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |reg|    unicode:: U+000AE .. REGISTERED SIGN
+.. |sect|   unicode:: U+000A7 .. SECTION SIGN
+.. |shy|    unicode:: U+000AD .. SOFT HYPHEN
+.. |sup1|   unicode:: U+000B9 .. SUPERSCRIPT ONE
+.. |sup2|   unicode:: U+000B2 .. SUPERSCRIPT TWO
+.. |sup3|   unicode:: U+000B3 .. SUPERSCRIPT THREE
+.. |szlig|  unicode:: U+000DF .. LATIN SMALL LETTER SHARP S
+.. |THORN|  unicode:: U+000DE .. LATIN CAPITAL LETTER THORN
+.. |thorn|  unicode:: U+000FE .. LATIN SMALL LETTER THORN
+.. |times|  unicode:: U+000D7 .. MULTIPLICATION SIGN
+.. |Uacute| unicode:: U+000DA .. LATIN CAPITAL LETTER U WITH ACUTE
+.. |uacute| unicode:: U+000FA .. LATIN SMALL LETTER U WITH ACUTE
+.. |Ucirc|  unicode:: U+000DB .. LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+.. |ucirc|  unicode:: U+000FB .. LATIN SMALL LETTER U WITH CIRCUMFLEX
+.. |Ugrave| unicode:: U+000D9 .. LATIN CAPITAL LETTER U WITH GRAVE
+.. |ugrave| unicode:: U+000F9 .. LATIN SMALL LETTER U WITH GRAVE
+.. |uml|    unicode:: U+000A8 .. DIAERESIS
+.. |Uuml|   unicode:: U+000DC .. LATIN CAPITAL LETTER U WITH DIAERESIS
+.. |uuml|   unicode:: U+000FC .. LATIN SMALL LETTER U WITH DIAERESIS
+.. |Yacute| unicode:: U+000DD .. LATIN CAPITAL LETTER Y WITH ACUTE
+.. |yacute| unicode:: U+000FD .. LATIN SMALL LETTER Y WITH ACUTE
+.. |yen|    unicode:: U+000A5 .. YEN SIGN
+.. |yuml|   unicode:: U+000FF .. LATIN SMALL LETTER Y WITH DIAERESIS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-special.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,37 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |bdquo|  unicode:: U+0201E .. DOUBLE LOW-9 QUOTATION MARK
+.. |circ|   unicode:: U+002C6 .. MODIFIER LETTER CIRCUMFLEX ACCENT
+.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER
+.. |dagger| unicode:: U+02020 .. DAGGER
+.. |emsp|   unicode:: U+02003 .. EM SPACE
+.. |ensp|   unicode:: U+02002 .. EN SPACE
+.. |euro|   unicode:: U+020AC .. EURO SIGN
+.. |gt|     unicode:: U+0003E .. GREATER-THAN SIGN
+.. |ldquo|  unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
+.. |lrm|    unicode:: U+0200E .. LEFT-TO-RIGHT MARK
+.. |lsaquo| unicode:: U+02039 .. SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+.. |lsquo|  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
+.. |lt|     unicode:: U+0003C .. LESS-THAN SIGN
+.. |mdash|  unicode:: U+02014 .. EM DASH
+.. |ndash|  unicode:: U+02013 .. EN DASH
+.. |OElig|  unicode:: U+00152 .. LATIN CAPITAL LIGATURE OE
+.. |oelig|  unicode:: U+00153 .. LATIN SMALL LIGATURE OE
+.. |permil| unicode:: U+02030 .. PER MILLE SIGN
+.. |quot|   unicode:: U+00022 .. QUOTATION MARK
+.. |rdquo|  unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |rlm|    unicode:: U+0200F .. RIGHT-TO-LEFT MARK
+.. |rsaquo| unicode:: U+0203A .. SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+.. |rsquo|  unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |sbquo|  unicode:: U+0201A .. SINGLE LOW-9 QUOTATION MARK
+.. |Scaron| unicode:: U+00160 .. LATIN CAPITAL LETTER S WITH CARON
+.. |scaron| unicode:: U+00161 .. LATIN SMALL LETTER S WITH CARON
+.. |thinsp| unicode:: U+02009 .. THIN SPACE
+.. |tilde|  unicode:: U+002DC .. SMALL TILDE
+.. |Yuml|   unicode:: U+00178 .. LATIN CAPITAL LETTER Y WITH DIAERESIS
+.. |zwj|    unicode:: U+0200D .. ZERO WIDTH JOINER
+.. |zwnj|   unicode:: U+0200C .. ZERO WIDTH NON-JOINER
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/include/xhtml1-symbol.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,130 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |alefsym|  unicode:: U+02135 .. ALEF SYMBOL
+.. |Alpha|    unicode:: U+00391 .. GREEK CAPITAL LETTER ALPHA
+.. |alpha|    unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
+.. |and|      unicode:: U+02227 .. LOGICAL AND
+.. |ang|      unicode:: U+02220 .. ANGLE
+.. |asymp|    unicode:: U+02248 .. ALMOST EQUAL TO
+.. |Beta|     unicode:: U+00392 .. GREEK CAPITAL LETTER BETA
+.. |beta|     unicode:: U+003B2 .. GREEK SMALL LETTER BETA
+.. |bull|     unicode:: U+02022 .. BULLET
+.. |cap|      unicode:: U+02229 .. INTERSECTION
+.. |Chi|      unicode:: U+003A7 .. GREEK CAPITAL LETTER CHI
+.. |chi|      unicode:: U+003C7 .. GREEK SMALL LETTER CHI
+.. |clubs|    unicode:: U+02663 .. BLACK CLUB SUIT
+.. |cong|     unicode:: U+02245 .. APPROXIMATELY EQUAL TO
+.. |crarr|    unicode:: U+021B5 .. DOWNWARDS ARROW WITH CORNER LEFTWARDS
+.. |cup|      unicode:: U+0222A .. UNION
+.. |dArr|     unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |darr|     unicode:: U+02193 .. DOWNWARDS ARROW
+.. |Delta|    unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
+.. |delta|    unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
+.. |diams|    unicode:: U+02666 .. BLACK DIAMOND SUIT
+.. |empty|    unicode:: U+02205 .. EMPTY SET
+.. |Epsilon|  unicode:: U+00395 .. GREEK CAPITAL LETTER EPSILON
+.. |epsilon|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |equiv|    unicode:: U+02261 .. IDENTICAL TO
+.. |Eta|      unicode:: U+00397 .. GREEK CAPITAL LETTER ETA
+.. |eta|      unicode:: U+003B7 .. GREEK SMALL LETTER ETA
+.. |exist|    unicode:: U+02203 .. THERE EXISTS
+.. |fnof|     unicode:: U+00192 .. LATIN SMALL LETTER F WITH HOOK
+.. |forall|   unicode:: U+02200 .. FOR ALL
+.. |frasl|    unicode:: U+02044 .. FRACTION SLASH
+.. |Gamma|    unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
+.. |gamma|    unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
+.. |ge|       unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |hArr|     unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |harr|     unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |hearts|   unicode:: U+02665 .. BLACK HEART SUIT
+.. |hellip|   unicode:: U+02026 .. HORIZONTAL ELLIPSIS
+.. |image|    unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |infin|    unicode:: U+0221E .. INFINITY
+.. |int|      unicode:: U+0222B .. INTEGRAL
+.. |Iota|     unicode:: U+00399 .. GREEK CAPITAL LETTER IOTA
+.. |iota|     unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
+.. |isin|     unicode:: U+02208 .. ELEMENT OF
+.. |Kappa|    unicode:: U+0039A .. GREEK CAPITAL LETTER KAPPA
+.. |kappa|    unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
+.. |Lambda|   unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
+.. |lambda|   unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
+.. |lang|     unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |lArr|     unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |larr|     unicode:: U+02190 .. LEFTWARDS ARROW
+.. |lceil|    unicode:: U+02308 .. LEFT CEILING
+.. |le|       unicode:: U+02264 .. LESS-THAN OR EQUAL TO
+.. |lfloor|   unicode:: U+0230A .. LEFT FLOOR
+.. |lowast|   unicode:: U+02217 .. ASTERISK OPERATOR
+.. |loz|      unicode:: U+025CA .. LOZENGE
+.. |minus|    unicode:: U+02212 .. MINUS SIGN
+.. |Mu|       unicode:: U+0039C .. GREEK CAPITAL LETTER MU
+.. |mu|       unicode:: U+003BC .. GREEK SMALL LETTER MU
+.. |nabla|    unicode:: U+02207 .. NABLA
+.. |ne|       unicode:: U+02260 .. NOT EQUAL TO
+.. |ni|       unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |notin|    unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |nsub|     unicode:: U+02284 .. NOT A SUBSET OF
+.. |Nu|       unicode:: U+0039D .. GREEK CAPITAL LETTER NU
+.. |nu|       unicode:: U+003BD .. GREEK SMALL LETTER NU
+.. |oline|    unicode:: U+0203E .. OVERLINE
+.. |Omega|    unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
+.. |omega|    unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
+.. |Omicron|  unicode:: U+0039F .. GREEK CAPITAL LETTER OMICRON
+.. |omicron|  unicode:: U+003BF .. GREEK SMALL LETTER OMICRON
+.. |oplus|    unicode:: U+02295 .. CIRCLED PLUS
+.. |or|       unicode:: U+02228 .. LOGICAL OR
+.. |otimes|   unicode:: U+02297 .. CIRCLED TIMES
+.. |part|     unicode:: U+02202 .. PARTIAL DIFFERENTIAL
+.. |perp|     unicode:: U+022A5 .. UP TACK
+.. |Phi|      unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
+.. |phi|      unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |Pi|       unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
+.. |pi|       unicode:: U+003C0 .. GREEK SMALL LETTER PI
+.. |piv|      unicode:: U+003D6 .. GREEK PI SYMBOL
+.. |Prime|    unicode:: U+02033 .. DOUBLE PRIME
+.. |prime|    unicode:: U+02032 .. PRIME
+.. |prod|     unicode:: U+0220F .. N-ARY PRODUCT
+.. |prop|     unicode:: U+0221D .. PROPORTIONAL TO
+.. |Psi|      unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
+.. |psi|      unicode:: U+003C8 .. GREEK SMALL LETTER PSI
+.. |radic|    unicode:: U+0221A .. SQUARE ROOT
+.. |rang|     unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |rArr|     unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |rarr|     unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |rceil|    unicode:: U+02309 .. RIGHT CEILING
+.. |real|     unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |rfloor|   unicode:: U+0230B .. RIGHT FLOOR
+.. |Rho|      unicode:: U+003A1 .. GREEK CAPITAL LETTER RHO
+.. |rho|      unicode:: U+003C1 .. GREEK SMALL LETTER RHO
+.. |sdot|     unicode:: U+022C5 .. DOT OPERATOR
+.. |Sigma|    unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
+.. |sigma|    unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
+.. |sigmaf|   unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |sim|      unicode:: U+0223C .. TILDE OPERATOR
+.. |spades|   unicode:: U+02660 .. BLACK SPADE SUIT
+.. |sub|      unicode:: U+02282 .. SUBSET OF
+.. |sube|     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |sum|      unicode:: U+02211 .. N-ARY SUMMATION
+.. |sup|      unicode:: U+02283 .. SUPERSET OF
+.. |supe|     unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |Tau|      unicode:: U+003A4 .. GREEK CAPITAL LETTER TAU
+.. |tau|      unicode:: U+003C4 .. GREEK SMALL LETTER TAU
+.. |there4|   unicode:: U+02234 .. THEREFORE
+.. |Theta|    unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
+.. |theta|    unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |thetasym| unicode:: U+003D1 .. GREEK THETA SYMBOL
+.. |trade|    unicode:: U+02122 .. TRADE MARK SIGN
+.. |uArr|     unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |uarr|     unicode:: U+02191 .. UPWARDS ARROW
+.. |upsih|    unicode:: U+003D2 .. GREEK UPSILON WITH HOOK SYMBOL
+.. |Upsilon|  unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |upsilon|  unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |weierp|   unicode:: U+02118 .. SCRIPT CAPITAL P
+.. |Xi|       unicode:: U+0039E .. GREEK CAPITAL LETTER XI
+.. |xi|       unicode:: U+003BE .. GREEK SMALL LETTER XI
+.. |Zeta|     unicode:: U+00396 .. GREEK CAPITAL LETTER ZETA
+.. |zeta|     unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,25 @@
+# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# Internationalization details are documented in
+# <http://docutils.sf.net/docs/howto/i18n.html>.
+
+"""
+This package contains modules for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+_languages = {}
+
+def get_language(language_code):
+    if _languages.has_key(language_code):
+        return _languages[language_code]
+    try:
+        module = __import__(language_code, globals(), locals())
+    except ImportError:
+        return None
+    _languages[language_code] = module
+    return module
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/af.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,102 @@
+# $Id: af.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Jannie Hofmeyr <jhsh@sun.ac.za>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Afrikaans-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      'aandag': 'attention',
+      'versigtig': 'caution',
+      'gevaar': 'danger',
+      'fout': 'error',
+      'wenk': 'hint',
+      'belangrik': 'important',
+      'nota': 'note',
+      'tip': 'tip', # hint and tip both have the same translation: wenk
+      'waarskuwing': 'warning',
+      'vermaning': 'admonition',
+      'kantstreep': 'sidebar',
+      'onderwerp': 'topic',
+      'lynblok': 'line-block',
+      'parsed-literal (translation required)': 'parsed-literal',
+      'rubriek': 'rubric',
+      'epigraaf': 'epigraph',
+      'hoogtepunte': 'highlights',
+      'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'vrae': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'table (translation required)': 'table',
+      'csv-table (translation required)': 'csv-table',
+      'list-table (translation required)': 'list-table',
+      'meta': 'meta',
+      #'beeldkaart': 'imagemap',
+      'beeld': 'image',
+      'figuur': 'figure',
+      'insluiting': 'include',
+      'rou': 'raw',
+      'vervang': 'replace',
+      'unicode': 'unicode', # should this be translated? unikode
+      'datum': 'date',
+      'klas': 'class',
+      'role (translation required)': 'role',
+      'default-role (translation required)': 'default-role',
+      'title (translation required)': 'title',
+      'inhoud': 'contents',
+      'sectnum': 'sectnum',
+      'section-numbering': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'voetnote': 'footnotes',
+      #'aanhalings': 'citations',
+      'teikennotas': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Afrikaans name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    'afkorting': 'abbreviation',
+    'ab': 'abbreviation',
+    'akroniem': 'acronym',
+    'ac': 'acronym',
+    'indeks': 'index',
+    'i': 'index',
+    'voetskrif': 'subscript',
+    'sub': 'subscript',
+    'boskrif': 'superscript',
+    'sup': 'superscript',
+    'titelverwysing': 'title-reference',
+    'titel': 'title-reference',
+    't': 'title-reference',
+    'pep-verwysing': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-verwysing': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'nadruk': 'emphasis',
+    'sterk': 'strong',
+    'literal (translation required)': 'literal',
+    'benoemde verwysing': 'named-reference',
+    'anonieme verwysing': 'anonymous-reference',
+    'voetnootverwysing': 'footnote-reference',
+    'aanhalingverwysing': 'citation-reference',
+    'vervangingsverwysing': 'substitution-reference',
+    'teiken': 'target',
+    'uri-verwysing': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'rou': 'raw',}
+"""Mapping of Afrikaans role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ca.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,121 @@
+# $Id: ca.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Ivan Vilata i Balaguer <ivan@selidor.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Catalan-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'atenci\u00F3': 'attention',
+      u'compte': 'caution',
+      u'perill': 'danger',
+      u'error': 'error',
+      u'suggeriment': 'hint',
+      u'important': 'important',
+      u'nota': 'note',
+      u'consell': 'tip',
+      u'av\u00EDs': 'warning',
+      u'advertiment': 'admonition',
+      u'nota-al-marge': 'sidebar',
+      u'nota-marge': 'sidebar',
+      u'tema': 'topic',
+      u'bloc-de-l\u00EDnies': 'line-block',
+      u'bloc-l\u00EDnies': 'line-block',
+      u'literal-analitzat': 'parsed-literal',
+      u'r\u00FAbrica': 'rubric',
+      u'ep\u00EDgraf': 'epigraph',
+      u'sumari': 'highlights',
+      u'cita-destacada': 'pull-quote',
+      u'compost': 'compound',
+      u'container (translation required)': 'container',
+      #'questions': 'questions',
+      u'taula': 'table',
+      u'taula-csv': 'csv-table',
+      u'taula-llista': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'meta': 'meta',
+      #'imagemap': 'imagemap',
+      u'imatge': 'image',
+      u'figura': 'figure',
+      u'inclou': 'include',
+      u'incloure': 'include',
+      u'cru': 'raw',
+      u'reempla\u00E7a': 'replace',
+      u'reempla\u00E7ar': 'replace',
+      u'unicode': 'unicode',
+      u'data': 'date',
+      u'classe': 'class',
+      u'rol': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'contingut': 'contents',
+      u'numsec': 'sectnum',
+      u'numeraci\u00F3-de-seccions': 'sectnum',
+      u'numeraci\u00F3-seccions': 'sectnum',
+      u'cap\u00E7alera': 'header',
+      u'peu-de-p\u00E0gina': 'footer',
+      u'peu-p\u00E0gina': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'notes-amb-destinacions': 'target-notes',
+      u'notes-destinacions': 'target-notes',
+      u'directiva-de-prova-de-restructuredtext': 'restructuredtext-test-directive'}
+"""Catalan name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'abreviatura': 'abbreviation',
+    u'abreviaci\u00F3': 'abbreviation',
+    u'abrev': 'abbreviation',
+    u'ab': 'abbreviation',
+    u'acr\u00F2nim': 'acronym',
+    u'ac': 'acronym',
+    u'\u00EDndex': 'index',
+    u'i': 'index',
+    u'sub\u00EDndex': 'subscript',
+    u'sub': 'subscript',
+    u'super\u00EDndex': 'superscript',
+    u'sup': 'superscript',
+    u'refer\u00E8ncia-a-t\u00EDtol': 'title-reference',
+    u'refer\u00E8ncia-t\u00EDtol': 'title-reference',
+    u't\u00EDtol': 'title-reference',
+    u't': 'title-reference',
+    u'refer\u00E8ncia-a-pep': 'pep-reference',
+    u'refer\u00E8ncia-pep': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'refer\u00E8ncia-a-rfc': 'rfc-reference',
+    u'refer\u00E8ncia-rfc': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'\u00E8mfasi': 'emphasis',
+    u'destacat': 'strong',
+    u'literal': 'literal',
+    u'refer\u00E8ncia-amb-nom': 'named-reference',
+    u'refer\u00E8ncia-nom': 'named-reference',
+    u'refer\u00E8ncia-an\u00F2nima': 'anonymous-reference',
+    u'refer\u00E8ncia-a-nota-al-peu': 'footnote-reference',
+    u'refer\u00E8ncia-nota-al-peu': 'footnote-reference',
+    u'refer\u00E8ncia-a-cita': 'citation-reference',
+    u'refer\u00E8ncia-cita': 'citation-reference',
+    u'refer\u00E8ncia-a-substituci\u00F3': 'substitution-reference',
+    u'refer\u00E8ncia-substituci\u00F3': 'substitution-reference',
+    u'destinaci\u00F3': 'target',
+    u'refer\u00E8ncia-a-uri': 'uri-reference',
+    u'refer\u00E8ncia-uri': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'cru': 'raw',}
+"""Mapping of Catalan role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/cs.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,104 @@
+# $Id: cs.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marek Blaha <mb@dat.cz>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Czech-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'pozor': 'attention',
+      u'caution (translation required)': 'caution', # jak rozlisit caution a warning?
+      u'nebezpe\u010D\u00ED': 'danger',
+      u'chyba': 'error',
+      u'rada': 'hint',
+      u'd\u016Fle\u017Eit\u00E9': 'important',
+      u'pozn\u00E1mka': 'note',
+      u'tip (translation required)': 'tip',
+      u'varov\u00E1n\u00ED': 'warning',
+      u'admonition (translation required)': 'admonition',
+      u'sidebar (translation required)': 'sidebar',
+      u't\u00E9ma': 'topic',
+      u'line-block (translation required)': 'line-block',
+      u'parsed-literal (translation required)': 'parsed-literal',
+      u'odd\u00EDl': 'rubric',
+      u'moto': 'epigraph',
+      u'highlights (translation required)': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'meta (translation required)': 'meta',
+      #'imagemap': 'imagemap',
+      u'image (translation required)': 'image',   # obrazek
+      u'figure (translation required)': 'figure', # a tady?
+      u'include (translation required)': 'include',
+      u'raw (translation required)': 'raw',
+      u'replace (translation required)': 'replace',
+      u'unicode (translation required)': 'unicode',
+      u'datum': 'date',
+      u't\u0159\u00EDda': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'obsah': 'contents',
+      u'sectnum (translation required)': 'sectnum',
+      u'section-numbering (translation required)': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'target-notes (translation required)': 'target-notes',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Czech name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'abbreviation (translation required)': 'abbreviation',
+    u'ab (translation required)': 'abbreviation',
+    u'acronym (translation required)': 'acronym',
+    u'ac (translation required)': 'acronym',
+    u'index (translation required)': 'index',
+    u'i (translation required)': 'index',
+    u'subscript (translation required)': 'subscript',
+    u'sub (translation required)': 'subscript',
+    u'superscript (translation required)': 'superscript',
+    u'sup (translation required)': 'superscript',
+    u'title-reference (translation required)': 'title-reference',
+    u'title (translation required)': 'title-reference',
+    u't (translation required)': 'title-reference',
+    u'pep-reference (translation required)': 'pep-reference',
+    u'pep (translation required)': 'pep-reference',
+    u'rfc-reference (translation required)': 'rfc-reference',
+    u'rfc (translation required)': 'rfc-reference',
+    u'emphasis (translation required)': 'emphasis',
+    u'strong (translation required)': 'strong',
+    u'literal (translation required)': 'literal',
+    u'named-reference (translation required)': 'named-reference',
+    u'anonymous-reference (translation required)': 'anonymous-reference',
+    u'footnote-reference (translation required)': 'footnote-reference',
+    u'citation-reference (translation required)': 'citation-reference',
+    u'substitution-reference (translation required)': 'substitution-reference',
+    u'target (translation required)': 'target',
+    u'uri-reference (translation required)': 'uri-reference',
+    u'uri (translation required)': 'uri-reference',
+    u'url (translation required)': 'uri-reference',
+    u'raw (translation required)': 'raw',}
+"""Mapping of Czech role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/de.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,96 @@
+# $Id: de.py 5174 2007-05-31 00:01:52Z wiemann $
+# Authors: Engelbert Gruber <grubert@users.sourceforge.net>;
+#          Lea Wiemann <LeWiemann@gmail.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+German-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      'achtung': 'attention',
+      'vorsicht': 'caution',
+      'gefahr': 'danger',
+      'fehler': 'error',
+      'hinweis': 'hint',
+      'wichtig': 'important',
+      'notiz': 'note',
+      'tipp': 'tip',
+      'warnung': 'warning',
+      'ermahnung': 'admonition',
+      'kasten': 'sidebar',
+      'seitenkasten': 'sidebar',
+      'thema': 'topic',
+      'zeilen-block': 'line-block',
+      'parsed-literal (translation required)': 'parsed-literal',
+      'rubrik': 'rubric',
+      'epigraph': 'epigraph',
+      'highlights (translation required)': 'highlights',
+      'pull-quote (translation required)': 'pull-quote', # kasten too ?
+      'zusammengesetzt': 'compound',
+      'verbund': 'compound',
+      u'container (translation required)': 'container',
+      #'fragen': 'questions',
+      'tabelle': 'table',
+      'csv-tabelle': 'csv-table',
+      'list-table (translation required)': 'list-table',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'bild': 'image',
+      'abbildung': 'figure',
+      u'unver\xe4ndert': 'raw',
+      u'roh': 'raw',
+      u'einf\xfcgen': 'include',
+      'ersetzung': 'replace',
+      'ersetzen': 'replace',
+      'ersetze': 'replace',
+      'unicode': 'unicode',
+      'datum': 'date',
+      'klasse': 'class',
+      'rolle': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      'inhalt': 'contents',
+      'kapitel-nummerierung': 'sectnum',
+      'abschnitts-nummerierung': 'sectnum',
+      u'linkziel-fu\xdfnoten': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'fu\xdfnoten': 'footnotes',
+      #'zitate': 'citations',
+      }
+"""German name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abk\xfcrzung': 'abbreviation',
+      'akronym': 'acronym',
+      'index': 'index',
+      'tiefgestellt': 'subscript',
+      'hochgestellt': 'superscript',
+      'titel-referenz': 'title-reference',
+      'pep-referenz': 'pep-reference',
+      'rfc-referenz': 'rfc-reference',
+      'betonung': 'emphasis',
+      'fett': 'strong',
+      u'w\xf6rtlich': 'literal',
+      'benannte-referenz': 'named-reference',
+      'unbenannte-referenz': 'anonymous-reference',
+      u'fu\xdfnoten-referenz': 'footnote-reference',
+      'zitat-referenz': 'citation-reference',
+      'ersetzungs-referenz': 'substitution-reference',
+      'ziel': 'target',
+      'uri-referenz': 'uri-reference',
+      u'unver\xe4ndert': 'raw',
+      u'roh': 'raw',}
+"""Mapping of German role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/en.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,104 @@
+# $Id: en.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+English-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      'attention': 'attention',
+      'caution': 'caution',
+      'danger': 'danger',
+      'error': 'error',
+      'hint': 'hint',
+      'important': 'important',
+      'note': 'note',
+      'tip': 'tip',
+      'warning': 'warning',
+      'admonition': 'admonition',
+      'sidebar': 'sidebar',
+      'topic': 'topic',
+      'line-block': 'line-block',
+      'parsed-literal': 'parsed-literal',
+      'rubric': 'rubric',
+      'epigraph': 'epigraph',
+      'highlights': 'highlights',
+      'pull-quote': 'pull-quote',
+      'compound': 'compound',
+      'container': 'container',
+      #'questions': 'questions',
+      'table': 'table',
+      'csv-table': 'csv-table',
+      'list-table': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'image': 'image',
+      'figure': 'figure',
+      'include': 'include',
+      'raw': 'raw',
+      'replace': 'replace',
+      'unicode': 'unicode',
+      'date': 'date',
+      'class': 'class',
+      'role': 'role',
+      'default-role': 'default-role',
+      'title': 'title',
+      'contents': 'contents',
+      'sectnum': 'sectnum',
+      'section-numbering': 'sectnum',
+      'header': 'header',
+      'footer': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      'target-notes': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""English name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'abbreviation': 'abbreviation',
+    'ab': 'abbreviation',
+    'acronym': 'acronym',
+    'ac': 'acronym',
+    'index': 'index',
+    'i': 'index',
+    'subscript': 'subscript',
+    'sub': 'subscript',
+    'superscript': 'superscript',
+    'sup': 'superscript',
+    'title-reference': 'title-reference',
+    'title': 'title-reference',
+    't': 'title-reference',
+    'pep-reference': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-reference': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'emphasis': 'emphasis',
+    'strong': 'strong',
+    'literal': 'literal',
+    'named-reference': 'named-reference',
+    'anonymous-reference': 'anonymous-reference',
+    'footnote-reference': 'footnote-reference',
+    'citation-reference': 'citation-reference',
+    'substitution-reference': 'substitution-reference',
+    'target': 'target',
+    'uri-reference': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'raw': 'raw',}
+"""Mapping of English role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/eo.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,114 @@
+# $Id: eo.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marcelo Huerta San Martin <richieadler@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Esperanto-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'atentu': 'attention',
+      u'zorgu': 'caution',
+      u'dangxero': 'danger',
+      u'dan\u011dero': 'danger',
+      u'eraro': 'error',
+      u'spuro': 'hint',
+      u'grava': 'important',
+      u'noto': 'note',
+      u'helpeto': 'tip',
+      u'averto': 'warning',
+      u'admono': 'admonition',
+      u'flankteksto': 'sidebar',
+      u'temo': 'topic',
+      u'linea-bloko': 'line-block',
+      u'analizota-literalo': 'parsed-literal',
+      u'rubriko': 'rubric',
+      u'epigrafo': 'epigraph',
+      u'elstarajxoj': 'highlights',
+      u'elstara\u0135oj': 'highlights',
+      u'ekstera-citajxo': 'pull-quote',
+      u'ekstera-cita\u0135o': 'pull-quote',
+      u'kombinajxo': 'compound',
+      u'kombina\u0135o': 'compound',
+      u'tekstingo': 'container',
+      u'enhavilo': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'tabelo': 'table',
+      u'tabelo-vdk': 'csv-table', # "valoroj disigitaj per komoj"
+      u'tabelo-csv': 'csv-table',
+      u'tabelo-lista': 'list-table',
+      u'meta': 'meta',
+      #'imagemap': 'imagemap',
+      u'bildo': 'image',
+      u'figuro': 'figure',
+      u'inkludi': 'include',
+      u'senanaliza': 'raw',
+      u'anstatauxi': 'replace',
+      u'anstata\u016di': 'replace',
+      u'unicode': 'unicode',
+      u'dato': 'date',
+      u'klaso': 'class',
+      u'rolo': 'role',
+      u'preterlasita-rolo': 'default-role',
+      u'titolo': 'title',
+      u'enhavo': 'contents',
+      u'seknum': 'sectnum',
+      u'sekcia-numerado': 'sectnum',
+      u'kapsekcio': 'header',
+      u'piedsekcio': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'celaj-notoj': 'target-notes',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Esperanto name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'mallongigo': 'abbreviation',
+    u'mall': 'abbreviation',
+    u'komenclitero': 'acronym',
+    u'kl': 'acronym',
+    u'indekso': 'index',
+    u'i': 'index',
+    u'subskribo': 'subscript',
+    u'sub': 'subscript',
+    u'supraskribo': 'superscript',
+    u'sup': 'superscript',
+    u'titola-referenco': 'title-reference',
+    u'titolo': 'title-reference',
+    u't': 'title-reference',
+    u'pep-referenco': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'rfc-referenco': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'emfazo': 'emphasis',
+    u'forta': 'strong',
+    u'litera': 'literal',
+    u'nomita-referenco': 'named-reference',
+    u'nenomita-referenco': 'anonymous-reference',
+    u'piednota-referenco': 'footnote-reference',
+    u'citajxo-referenco': 'citation-reference',
+    u'cita\u0135o-referenco': 'citation-reference',
+    u'anstatauxa-referenco': 'substitution-reference',
+    u'anstata\u016da-referenco': 'substitution-reference',
+    u'celo': 'target',
+    u'uri-referenco': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'senanaliza': 'raw',
+}
+"""Mapping of Esperanto role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/es.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,121 @@
+# -*- coding: utf-8 -*-
+# $Id: es.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Marcelo Huerta San Martín <richieadler@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Spanish-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'atenci\u00f3n': 'attention',
+      u'atencion': 'attention',
+      u'precauci\u00f3n': 'caution',
+      u'precaucion': 'caution',
+      u'peligro': 'danger',
+      u'error': 'error',
+      u'sugerencia': 'hint',
+      u'importante': 'important',
+      u'nota': 'note',
+      u'consejo': 'tip',
+      u'advertencia': 'warning',
+      u'exhortacion': 'admonition',
+      u'exhortaci\u00f3n': 'admonition',
+      u'nota-al-margen': 'sidebar',
+      u'tema': 'topic',
+      u'bloque-de-lineas': 'line-block',
+      u'bloque-de-l\u00edneas': 'line-block',
+      u'literal-evaluado': 'parsed-literal',
+      u'firma': 'rubric',
+      u'ep\u00edgrafe': 'epigraph',
+      u'epigrafe': 'epigraph',
+      u'destacado': 'highlights',
+      u'cita-destacada': 'pull-quote',
+      u'combinacion': 'compound',
+      u'combinaci\u00f3n': 'compound',
+      u'contenedor': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'tabla': 'table',
+      u'tabla-vsc': 'csv-table',
+      u'tabla-csv': 'csv-table',
+      u'tabla-lista': 'list-table',
+      u'meta': 'meta',
+      #'imagemap': 'imagemap',
+      u'imagen': 'image',
+      u'figura': 'figure',
+      u'incluir': 'include',
+      u'sin-analisis': 'raw',
+      u'sin-an\u00e1lisis': 'raw',
+      u'reemplazar': 'replace',
+      u'unicode': 'unicode',
+      u'fecha': 'date',
+      u'clase': 'class',
+      u'rol': 'role',
+      u'rol-por-omision': 'default-role',
+      u'rol-por-omisi\u00f3n': 'default-role',
+      u'titulo': 'title',
+      u't\u00edtulo': 'title',
+      u'contenido': 'contents',
+      u'numseccion': 'sectnum',
+      u'numsecci\u00f3n': 'sectnum',
+      u'numeracion-seccion': 'sectnum',
+      u'numeraci\u00f3n-secci\u00f3n': 'sectnum',
+      u'notas-destino': 'target-notes',
+      u'cabecera': 'header',
+      u'pie': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Spanish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    u'abreviatura': 'abbreviation',
+    u'ab': 'abbreviation',
+    u'acronimo': 'acronym',
+    u'acronimo': 'acronym',
+    u'ac': 'acronym',
+    u'indice': 'index',
+    u'i': 'index',
+    u'subindice': 'subscript',
+    u'sub\u00edndice': 'subscript',
+    u'superindice': 'superscript',
+    u'super\u00edndice': 'superscript',
+    u'referencia-titulo': 'title-reference',
+    u'titulo': 'title-reference',
+    u't': 'title-reference',
+    u'referencia-pep': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'referencia-rfc': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'enfasis': 'emphasis',
+    u'\u00e9nfasis': 'emphasis',
+    u'destacado': 'strong',
+    u'literal': 'literal',              # "literal" is also a word in Spanish :-)
+    u'referencia-con-nombre': 'named-reference',
+    u'referencia-anonima': 'anonymous-reference',
+    u'referencia-an\u00f3nima': 'anonymous-reference',
+    u'referencia-nota-al-pie': 'footnote-reference',
+    u'referencia-cita': 'citation-reference',
+    u'referencia-sustitucion': 'substitution-reference',
+    u'referencia-sustituci\u00f3n': 'substitution-reference',
+    u'destino': 'target',
+    u'referencia-uri': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'sin-analisis': 'raw',
+    u'sin-an\u00e1lisis': 'raw',
+}
+"""Mapping of Spanish role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/fi.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,93 @@
+# $Id: fi.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Asko Soukka <asko.soukka@iki.fi>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Finnish-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'huomio': u'attention',
+      u'varo': u'caution',
+      u'vaara': u'danger',
+      u'virhe': u'error',
+      u'vihje': u'hint',
+      u't\u00e4rke\u00e4\u00e4': u'important',
+      u'huomautus': u'note',
+      u'neuvo': u'tip',
+      u'varoitus': u'warning',
+      u'kehotus': u'admonition',
+      u'sivupalkki': u'sidebar',
+      u'aihe': u'topic',
+      u'rivi': u'line-block',
+      u'tasalevyinen': u'parsed-literal',
+      u'ohje': u'rubric',
+      u'epigraafi': u'epigraph',
+      u'kohokohdat': u'highlights',
+      u'lainaus': u'pull-quote',
+      u'taulukko': u'table',
+      u'csv-taulukko': u'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #u'kysymykset': u'questions',
+      u'meta': u'meta',
+      #u'kuvakartta': u'imagemap',
+      u'kuva': u'image',
+      u'kaavio': u'figure',
+      u'sis\u00e4llyt\u00e4': u'include',
+      u'raaka': u'raw',
+      u'korvaa': u'replace',
+      u'unicode': u'unicode',
+      u'p\u00e4iv\u00e4ys': u'date',
+      u'luokka': u'class',
+      u'rooli': u'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'sis\u00e4llys': u'contents',
+      u'kappale': u'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'alaviitteet': u'footnotes',
+      #u'viitaukset': u'citations',
+      u'target-notes (translation required)': u'target-notes'}
+"""Finnish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'lyhennys': u'abbreviation',
+    u'akronyymi': u'acronym',
+    u'kirjainsana': u'acronym',
+    u'hakemisto': u'index',
+    u'luettelo': u'index',
+    u'alaindeksi': u'subscript',
+    u'indeksi': u'subscript',
+    u'yl\u00e4indeksi': u'superscript',
+    u'title-reference (translation required)': u'title-reference',
+    u'title (translation required)': u'title-reference',
+    u'pep-reference (translation required)': u'pep-reference',
+    u'rfc-reference (translation required)': u'rfc-reference',
+    u'korostus': u'emphasis',
+    u'vahvistus': u'strong',
+    u'tasalevyinen': u'literal',
+    u'named-reference (translation required)': u'named-reference',
+    u'anonymous-reference (translation required)': u'anonymous-reference',
+    u'footnote-reference (translation required)': u'footnote-reference',
+    u'citation-reference (translation required)': u'citation-reference',
+    u'substitution-reference (translation required)': u'substitution-reference',
+    u'kohde': u'target',
+    u'uri-reference (translation required)': u'uri-reference',
+    u'raw (translation required)': 'raw',}
+"""Mapping of Finnish role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/fr.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,99 @@
+# $Id: fr.py 4564 2006-05-21 20:44:42Z wiemann $
+# Authors: David Goodger <goodger@python.org>; William Dode
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+French-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'attention': 'attention',
+      u'pr\u00E9caution': 'caution',
+      u'danger': 'danger',
+      u'erreur': 'error',
+      u'conseil': 'hint',
+      u'important': 'important',
+      u'note': 'note',
+      u'astuce': 'tip',
+      u'avertissement': 'warning',
+      u'admonition': 'admonition',
+      u'encadr\u00E9': 'sidebar',
+      u'sujet': 'topic',
+      u'bloc-textuel': 'line-block',
+      u'bloc-interpr\u00E9t\u00E9': 'parsed-literal',
+      u'code-interpr\u00E9t\u00E9': 'parsed-literal',
+      u'intertitre': 'rubric',
+      u'exergue': 'epigraph',
+      u'\u00E9pigraphe': 'epigraph',
+      u'chapeau': 'highlights',
+      u'accroche': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #u'questions': 'questions',
+      #u'qr': 'questions',
+      #u'faq': 'questions',
+      u'tableau': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'm\u00E9ta': 'meta',
+      #u'imagemap (translation required)': 'imagemap',
+      u'image': 'image',
+      u'figure': 'figure',
+      u'inclure': 'include',
+      u'brut': 'raw',
+      u'remplacer': 'replace',
+      u'remplace': 'replace',
+      u'unicode': 'unicode',
+      u'date': 'date',
+      u'classe': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'titre (translation required)': 'title',
+      u'sommaire': 'contents',
+      u'table-des-mati\u00E8res': 'contents',
+      u'sectnum': 'sectnum',
+      u'section-num\u00E9rot\u00E9e': 'sectnum',
+      u'liens': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'footnotes (translation required)': 'footnotes',
+      #u'citations (translation required)': 'citations',
+      }
+"""French name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abr\u00E9viation': 'abbreviation',
+      u'acronyme': 'acronym',
+      u'sigle': 'acronym',
+      u'index': 'index',
+      u'indice': 'subscript',
+      u'ind': 'subscript',
+      u'exposant': 'superscript',
+      u'exp': 'superscript',
+      u'titre-r\u00E9f\u00E9rence': 'title-reference',
+      u'titre': 'title-reference',
+      u'pep-r\u00E9f\u00E9rence': 'pep-reference',
+      u'rfc-r\u00E9f\u00E9rence': 'rfc-reference',
+      u'emphase': 'emphasis',
+      u'fort': 'strong',
+      u'litt\u00E9ral': 'literal',
+      u'nomm\u00E9e-r\u00E9f\u00E9rence': 'named-reference',
+      u'anonyme-r\u00E9f\u00E9rence': 'anonymous-reference',
+      u'note-r\u00E9f\u00E9rence': 'footnote-reference',
+      u'citation-r\u00E9f\u00E9rence': 'citation-reference',
+      u'substitution-r\u00E9f\u00E9rence': 'substitution-reference',
+      u'lien': 'target',
+      u'uri-r\u00E9f\u00E9rence': 'uri-reference',
+      u'brut': 'raw',}
+"""Mapping of French role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/he.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,104 @@
+# Author: Meir Kriheli
+# Id: $Id: he.py 4837 2006-12-26 09:59:41Z sfcben $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+English-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'\u05ea\u05e9\u05d5\u05de\u05ea \u05dc\u05d1': 'attention',
+      u'\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea': 'caution',
+      u'\u05e1\u05db\u05e0\u05d4': 'danger',
+      u'\u05e9\u05d2\u05d9\u05d0\u05d4' : 'error',
+      u'\u05e8\u05de\u05d6': 'hint',
+      u'\u05d7\u05e9\u05d5\u05d1': 'important',
+      u'\u05d4\u05e2\u05e8\u05d4': 'note',
+      u'\u05d8\u05d9\u05e4': 'tip',
+      u'\u05d0\u05d6\u05d4\u05e8\u05d4': 'warning',
+      'admonition': 'admonition',
+      'sidebar': 'sidebar',
+      'topic': 'topic',
+      'line-block': 'line-block',
+      'parsed-literal': 'parsed-literal',
+      'rubric': 'rubric',
+      'epigraph': 'epigraph',
+      'highlights': 'highlights',
+      'pull-quote': 'pull-quote',
+      'compound': 'compound',
+      'container': 'container',
+      #'questions': 'questions',
+      'table': 'table',
+      'csv-table': 'csv-table',
+      'list-table': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      u'\u05ea\u05de\u05d5\u05e0\u05d4': 'image',
+      'figure': 'figure',
+      'include': 'include',
+      'raw': 'raw',
+      'replace': 'replace',
+      'unicode': 'unicode',
+      'date': 'date',
+       u'\u05e1\u05d2\u05e0\u05d5\u05df': 'class',
+      'role': 'role',
+      'default-role': 'default-role',
+      'title': 'title',
+      u'\u05ea\u05d5\u05db\u05df': 'contents',
+      'sectnum': 'sectnum',
+      'section-numbering': 'sectnum',
+      'header': 'header',
+      'footer': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      'target-notes': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""English name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'abbreviation': 'abbreviation',
+    'ab': 'abbreviation',
+    'acronym': 'acronym',
+    'ac': 'acronym',
+    'index': 'index',
+    'i': 'index',
+    u'\u05ea\u05d7\u05ea\u05d9': 'subscript',
+    'sub': 'subscript',
+    u'\u05e2\u05d9\u05dc\u05d9': 'superscript',
+    'sup': 'superscript',
+    'title-reference': 'title-reference',
+    'title': 'title-reference',
+    't': 'title-reference',
+    'pep-reference': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-reference': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'emphasis': 'emphasis',
+    'strong': 'strong',
+    'literal': 'literal',
+    'named-reference': 'named-reference',
+    'anonymous-reference': 'anonymous-reference',
+    'footnote-reference': 'footnote-reference',
+    'citation-reference': 'citation-reference',
+    'substitution-reference': 'substitution-reference',
+    'target': 'target',
+    'uri-reference': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'raw': 'raw',}
+"""Mapping of English role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/it.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,93 @@
+# $Id: it.py 4564 2006-05-21 20:44:42Z wiemann $
+# Authors: Nicola Larosa <docutils@tekNico.net>;
+#          Lele Gaifax <lele@seldati.it>
+# Copyright: This module has been placed in the public domain.
+
+# Beware: the italian translation of the reStructuredText documentation
+# at http://docit.bice.dyndns.org/static/ReST, in particular
+# http://docit.bice.dyndns.org/static/ReST/ref/rst/directives.html, needs
+# to be synced with the content of this file.
+
+"""
+Italian-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      'attenzione': 'attention',
+      'cautela': 'caution',
+      'pericolo': 'danger',
+      'errore': 'error',
+      'suggerimento': 'hint',
+      'importante': 'important',
+      'nota': 'note',
+      'consiglio': 'tip',
+      'avvertenza': 'warning',
+      'ammonizione': 'admonition',
+      'riquadro': 'sidebar',
+      'argomento': 'topic',
+      'blocco-di-righe': 'line-block',
+      'blocco-interpretato': 'parsed-literal',
+      'rubrica': 'rubric',
+      'epigrafe': 'epigraph',
+      'punti-salienti': 'highlights',
+      'estratto-evidenziato': 'pull-quote',
+      'composito': 'compound',
+      u'container (translation required)': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'tabella': 'table',
+      'tabella-csv': 'csv-table',
+      'tabella-elenco': 'list-table',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'immagine': 'image',
+      'figura': 'figure',
+      'includi': 'include',
+      'grezzo': 'raw',
+      'sostituisci': 'replace',
+      'unicode': 'unicode',
+      'data': 'date',
+      'classe': 'class',
+      'ruolo': 'role',
+      'ruolo-predefinito': 'default-role',
+      'titolo': 'title',
+      'indice': 'contents',
+      'contenuti': 'contents',
+      'seznum': 'sectnum',
+      'sezioni-autonumerate': 'sectnum',
+      'annota-riferimenti-esterni': 'target-notes',
+      'intestazione': 'header',
+      'piede-pagina': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Italian name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      'abbreviazione': 'abbreviation',
+      'acronimo': 'acronym',
+      'indice': 'index',
+      'deponente': 'subscript',
+      'esponente': 'superscript',
+      'riferimento-titolo': 'title-reference',
+      'riferimento-pep': 'pep-reference',
+      'riferimento-rfc': 'rfc-reference',
+      'enfasi': 'emphasis',
+      'forte': 'strong',
+      'letterale': 'literal',
+      'riferimento-con-nome': 'named-reference',
+      'riferimento-anonimo': 'anonymous-reference',
+      'riferimento-nota': 'footnote-reference',
+      'riferimento-citazione': 'citation-reference',
+      'riferimento-sostituzione': 'substitution-reference',
+      'destinazione': 'target',
+      'riferimento-uri': 'uri-reference',
+      'grezzo': 'raw',}
+"""Mapping of Italian role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ja.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,115 @@
+# -*- coding: utf-8 -*-
+# $Id: ja.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Japanese-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+# Corrections to these translations are welcome!
+# é–“é•ã„ãŒã‚ã‚Œã°ã€ã©ã†ãžæ­£ã—ã„翻訳を教ãˆã¦ä¸‹ã•ã„。
+
+directives = {
+    # language-dependent: fixed
+    u'注目': 'attention',
+    u'注æ„': 'caution',
+    u'å±é™º': 'danger',
+    u'エラー': 'error',
+    u'ヒント': 'hint',
+    u'é‡è¦': 'important',
+    u'備考': 'note',
+    u'通報': 'tip',
+    u'警告': 'warning',
+    u'戒告': 'admonition',
+    u'サイドãƒãƒ¼': 'sidebar',
+    u'トピック': 'topic',
+    u'ラインブロック': 'line-block',
+    u'パーズドリテラル': 'parsed-literal',
+    u'ルブリック': 'rubric',
+    u'エピグラフ': 'epigraph',
+    u'題言': 'epigraph',
+    u'ãƒã‚¤ãƒ©ã‚¤ãƒˆ': 'highlights',
+    u'見所': 'highlights',
+    u'プルクオート': 'pull-quote',
+    u'åˆæˆ': 'compound',
+    u'コンテナー': 'container',
+    u'容器': 'container',
+    u'表': 'table',
+    u'csv表': 'csv-table',
+    u'リスト表': 'list-table',
+    #u'質å•': 'questions',
+    #u'å•ç­”': 'questions',
+    #u'faq': 'questions',
+    u'メタ': 'meta',
+    #u'イメージマプ': 'imagemap',
+    u'イメージ': 'image',
+    u'ç”»åƒ': 'image',
+    u'フィグア': 'figure',
+    u'図版': 'figure',
+    u'インクルード': 'include',
+    u'å«ã‚€': 'include',
+    u'組ã¿è¾¼ã¿': 'include',
+    u'生': 'raw',
+    u'原': 'raw',
+    u'æ›ãˆã‚‹': 'replace',
+    u'å–ã‚Šæ›ãˆã‚‹': 'replace',
+    u'掛ã‘替ãˆã‚‹': 'replace',
+    u'ユニコード': 'unicode',
+    u'日付': 'date',
+    u'クラス': 'class',
+    u'ロール': 'role',
+    u'å½¹': 'role',
+    u'ディフォルトロール': 'default-role',
+    u'既定役': 'default-role',
+    u'タイトル': 'title',
+    u'é¡Œ': 'title',                    # é¡Œå 件å
+    u'目次': 'contents',
+    u'節数': 'sectnum',
+    u'ヘッダ': 'header',
+    u'フッタ': 'footer',
+    #u'脚注': 'footnotes',             # 脚註?
+    #u'サイテーション': 'citations',   # 出典 引証 引用
+    u'ターゲットノート': 'target-notes', # 的注 的脚注
+    }
+"""Japanese name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'ç•¥': 'abbreviation',
+    u'頭字語': 'acronym',
+    u'インデックス': 'index',
+    u'索引': 'index',
+    u'添字': 'subscript',
+    u'下付': 'subscript',
+    u'下': 'subscript',
+    u'上付': 'superscript',
+    u'上': 'superscript',
+    u'é¡Œå‚ç…§': 'title-reference',
+    u'pepå‚ç…§': 'pep-reference',
+    u'rfcå‚ç…§': 'rfc-reference',
+    u'強調': 'emphasis',
+    u'å¼·ã„': 'strong',
+    u'リテラル': 'literal',
+    u'整形済ã¿': 'literal',
+    u'å付å‚ç…§': 'named-reference',
+    u'ç„¡åå‚ç…§': 'anonymous-reference',
+    u'脚注å‚ç…§': 'footnote-reference',
+    u'出典å‚ç…§': 'citation-reference',
+    u'代入å‚ç…§': 'substitution-reference',
+    u'çš„': 'target',
+    u'uriå‚ç…§': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'生': 'raw',}
+"""Mapping of Japanese role names to canonical role names for interpreted
+text."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/nl.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,108 @@
+# $Id: nl.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Martijn Pieters <mjpieters@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Dutch-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      'attentie': 'attention',
+      'let-op': 'caution',
+      'gevaar': 'danger',
+      'fout': 'error',
+      'hint': 'hint',
+      'belangrijk': 'important',
+      'opmerking': 'note',
+      'tip': 'tip',
+      'waarschuwing': 'warning',
+      'aanmaning': 'admonition',
+      'katern': 'sidebar',
+      'onderwerp': 'topic',
+      'lijn-blok': 'line-block',
+      'letterlijk-ontleed': 'parsed-literal',
+      'rubriek': 'rubric',
+      'opschrift': 'epigraph',
+      'hoogtepunten': 'highlights',
+      'pull-quote': 'pull-quote', # Dutch printers use the english term
+      'samenstelling': 'compound',
+      'verbinding': 'compound',
+      u'container (translation required)': 'container',
+      #'vragen': 'questions',
+      'tabel': 'table',
+      'csv-tabel': 'csv-table',
+      'lijst-tabel': 'list-table',
+      #'veelgestelde-vragen': 'questions',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'beeld': 'image',
+      'figuur': 'figure',
+      'opnemen': 'include',
+      'onbewerkt': 'raw',
+      'vervang': 'replace',
+      'vervanging': 'replace',
+      'unicode': 'unicode',
+      'datum': 'date',
+      'klasse': 'class',
+      'rol': 'role',
+      u'default-role (translation required)': 'default-role',
+      'title (translation required)': 'title',
+      'inhoud': 'contents',
+      'sectnum': 'sectnum',
+      'sectie-nummering': 'sectnum',
+      'hoofdstuk-nummering': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'voetnoten': 'footnotes',
+      #'citaten': 'citations',
+      'verwijzing-voetnoten': 'target-notes',
+      'restructuredtext-test-instructie': 'restructuredtext-test-directive'}
+"""Dutch name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'afkorting': 'abbreviation',
+    # 'ab': 'abbreviation',
+    'acroniem': 'acronym',
+    'ac': 'acronym',
+    'index': 'index',
+    'i': 'index',
+    'inferieur': 'subscript',
+    'inf': 'subscript',
+    'superieur': 'superscript',
+    'sup': 'superscript',
+    'titel-referentie': 'title-reference',
+    'titel': 'title-reference',
+    't': 'title-reference',
+    'pep-referentie': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-referentie': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'nadruk': 'emphasis',
+    'extra': 'strong',
+    'extra-nadruk': 'strong',
+    'vet': 'strong',
+    'letterlijk': 'literal',
+    'benoemde-referentie': 'named-reference',
+    'anonieme-referentie': 'anonymous-reference',
+    'voetnoot-referentie': 'footnote-reference',
+    'citaat-referentie': 'citation-reference',
+    'substitie-reference': 'substitution-reference',
+    'verwijzing': 'target',
+    'uri-referentie': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'onbewerkt': 'raw',}
+"""Mapping of Dutch role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/pt_br.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,104 @@
+# $Id: pt_br.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Brazilian Portuguese-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'aten\u00E7\u00E3o': 'attention',
+      'cuidado': 'caution',
+      'perigo': 'danger',
+      'erro': 'error',
+      u'sugest\u00E3o': 'hint',
+      'importante': 'important',
+      'nota': 'note',
+      'dica': 'tip',
+      'aviso': 'warning',
+      u'exorta\u00E7\u00E3o': 'admonition',
+      'barra-lateral': 'sidebar',
+      u't\u00F3pico': 'topic',
+      'bloco-de-linhas': 'line-block',
+      'literal-interpretado': 'parsed-literal',
+      'rubrica': 'rubric',
+      u'ep\u00EDgrafo': 'epigraph',
+      'destaques': 'highlights',
+      u'cita\u00E7\u00E3o-destacada': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'perguntas': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'imagem': 'image',
+      'figura': 'figure',
+      u'inclus\u00E3o': 'include',
+      'cru': 'raw',
+      u'substitui\u00E7\u00E3o': 'replace',
+      'unicode': 'unicode',
+      'data': 'date',
+      'classe': 'class',
+      'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'\u00EDndice': 'contents',
+      'numsec': 'sectnum',
+      u'numera\u00E7\u00E3o-de-se\u00E7\u00F5es': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'notas-de-rorap\u00E9': 'footnotes',
+      #u'cita\u00E7\u00F5es': 'citations',
+      u'links-no-rodap\u00E9': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Brazilian Portuguese name to registered (in directives/__init__.py)
+directive name mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'abbrevia\u00E7\u00E3o': 'abbreviation',
+    'ab': 'abbreviation',
+    u'acr\u00F4nimo': 'acronym',
+    'ac': 'acronym',
+    u'\u00EDndice-remissivo': 'index',
+    'i': 'index',
+    'subscrito': 'subscript',
+    'sub': 'subscript',
+    'sobrescrito': 'superscript',
+    'sob': 'superscript',
+    u'refer\u00EAncia-a-t\u00EDtulo': 'title-reference',
+    u't\u00EDtulo': 'title-reference',
+    't': 'title-reference',
+    u'refer\u00EAncia-a-pep': 'pep-reference',
+    'pep': 'pep-reference',
+    u'refer\u00EAncia-a-rfc': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    u'\u00EAnfase': 'emphasis',
+    'forte': 'strong',
+    'literal': 'literal',               # translation required?
+    u'refer\u00EAncia-por-nome': 'named-reference',
+    u'refer\u00EAncia-an\u00F4nima': 'anonymous-reference',
+    u'refer\u00EAncia-a-nota-de-rodap\u00E9': 'footnote-reference',
+    u'refer\u00EAncia-a-cita\u00E7\u00E3o': 'citation-reference',
+    u'refer\u00EAncia-a-substitui\u00E7\u00E3o': 'substitution-reference',
+    'alvo': 'target',
+    u'refer\u00EAncia-a-uri': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'cru': 'raw',}
+"""Mapping of Brazilian Portuguese role names to canonical role names
+for interpreted text."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/ru.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,103 @@
+# $Id: ru.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Roman Suzi <rnd@onego.ru>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Russian-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+directives = {
+ u'\u0431\u043b\u043e\u043a-\u0441\u0442\u0440\u043e\u043a': u'line-block',
+ u'meta': u'meta',
+ u'\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439-\u043b\u0438\u0442\u0435\u0440\u0430\u043b':
+ u'parsed-literal',
+ u'\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f-\u0446\u0438\u0442\u0430\u0442\u0430':
+ u'pull-quote',
+ u'compound (translation required)': 'compound',
+ u'container (translation required)': 'container',
+ u'table (translation required)': 'table',
+ u'csv-table (translation required)': 'csv-table',
+ u'list-table (translation required)': 'list-table',
+ u'\u0441\u044b\u0440\u043e\u0439': u'raw',
+ u'\u0437\u0430\u043c\u0435\u043d\u0430': u'replace',
+ u'\u0442\u0435\u0441\u0442\u043e\u0432\u0430\u044f-\u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430-restructuredtext':
+ u'restructuredtext-test-directive',
+ u'\u0446\u0435\u043b\u0435\u0432\u044b\u0435-\u0441\u043d\u043e\u0441\u043a\u0438': 
+ u'target-notes',
+ u'unicode': u'unicode',
+ u'\u0434\u0430\u0442\u0430': u'date',
+ u'\u0431\u043e\u043a\u043e\u0432\u0430\u044f-\u043f\u043e\u043b\u043e\u0441\u0430':
+ u'sidebar',
+ u'\u0432\u0430\u0436\u043d\u043e': u'important',
+ u'\u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c': u'include',
+ u'\u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435': u'attention',
+ u'\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435': u'highlights',
+ u'\u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435': u'admonition',
+ u'\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435':
+ u'image',
+ u'\u043a\u043b\u0430\u0441\u0441': u'class',
+ u'role (translation required)': 'role',
+ u'default-role (translation required)': 'default-role',
+ u'title (translation required)': 'title',
+ u'\u043d\u043e\u043c\u0435\u0440-\u0440\u0430\u0437\u0434\u0435\u043b\u0430':
+ u'sectnum',
+ u'\u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f-\u0440\u0430\u0437'
+ u'\u0434\u0435\u043b\u043e\u0432': u'sectnum',
+ u'\u043e\u043f\u0430\u0441\u043d\u043e': u'danger',
+ u'\u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e': u'caution',
+ u'\u043e\u0448\u0438\u0431\u043a\u0430': u'error',
+ u'\u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430': u'tip',
+ u'\u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d'
+ u'\u0438\u0435': u'warning',
+ u'\u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435': u'note',
+ u'\u0440\u0438\u0441\u0443\u043d\u043e\u043a': u'figure',
+ u'\u0440\u0443\u0431\u0440\u0438\u043a\u0430': u'rubric',
+ u'\u0441\u043e\u0432\u0435\u0442': u'hint',
+ u'\u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435': u'contents',
+ u'\u0442\u0435\u043c\u0430': u'topic',
+ u'\u044d\u043f\u0438\u0433\u0440\u0430\u0444': u'epigraph',
+ u'header (translation required)': 'header',
+ u'footer (translation required)': 'footer',}
+"""Russian name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+ u'\u0430\u043a\u0440\u043e\u043d\u0438\u043c': 'acronym',
+ u'\u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0430\u044f-\u0441\u0441\u044b\u043b\u043a\u0430':
+  'anonymous-reference',
+ u'\u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e': 'literal',
+ u'\u0432\u0435\u0440\u0445\u043d\u0438\u0439-\u0438\u043d\u0434\u0435\u043a\u0441':
+  'superscript',
+ u'\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435': 'emphasis',
+ u'\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u0430\u044f-\u0441\u0441\u044b\u043b\u043a\u0430':
+  'named-reference',
+ u'\u0438\u043d\u0434\u0435\u043a\u0441': 'index',
+ u'\u043d\u0438\u0436\u043d\u0438\u0439-\u0438\u043d\u0434\u0435\u043a\u0441':
+  'subscript',
+ u'\u0441\u0438\u043b\u044c\u043d\u043e\u0435-\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435':
+  'strong',
+ u'\u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435':
+  'abbreviation',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u0437\u0430\u043c\u0435\u043d\u0430':
+  'substitution-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-pep': 'pep-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-rfc': 'rfc-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-uri': 'uri-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-\u0437\u0430\u0433\u043b\u0430\u0432\u0438\u0435':
+  'title-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-\u0441\u043d\u043e\u0441\u043a\u0443':
+  'footnote-reference',
+ u'\u0446\u0438\u0442\u0430\u0442\u043d\u0430\u044f-\u0441\u0441\u044b\u043b\u043a\u0430':
+  'citation-reference',
+ u'\u0446\u0435\u043b\u044c': 'target',
+ u'raw (translation required)': 'raw',}
+"""Mapping of Russian role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/sk.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,91 @@
+# $Id: sk.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Miroslav Vasko <zemiak@zoznam.sk>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Slovak-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'pozor': 'attention',
+      u'opatrne': 'caution',
+      u'nebezpe\xe8enstvo': 'danger',
+      u'chyba': 'error',
+      u'rada': 'hint',
+      u'd\xf4le\x9eit\xe9': 'important',
+      u'pozn\xe1mka': 'note',
+      u'tip (translation required)': 'tip',
+      u'varovanie': 'warning',
+      u'admonition (translation required)': 'admonition',
+      u'sidebar (translation required)': 'sidebar',
+      u't\xe9ma': 'topic',
+      u'blok-riadkov': 'line-block',
+      u'parsed-literal': 'parsed-literal',
+      u'rubric (translation required)': 'rubric',
+      u'epigraph (translation required)': 'epigraph',
+      u'highlights (translation required)': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #u'questions': 'questions',
+      #u'qa': 'questions',
+      #u'faq': 'questions',
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'meta': 'meta',
+      #u'imagemap': 'imagemap',
+      u'obr\xe1zok': 'image',
+      u'tvar': 'figure',
+      u'vlo\x9ei\x9d': 'include',
+      u'raw (translation required)': 'raw',
+      u'nahradi\x9d': 'replace',
+      u'unicode': 'unicode',
+      u'd\u00E1tum': 'date',
+      u'class (translation required)': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'obsah': 'contents',
+      u'\xe8as\x9d': 'sectnum',
+      u'\xe8as\x9d-\xe8\xedslovanie': 'sectnum',
+      u'cie\xbeov\xe9-pozn\xe1mky': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'footnotes': 'footnotes',
+      #u'citations': 'citations',
+      }
+"""Slovak name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abbreviation (translation required)': 'abbreviation',
+      u'acronym (translation required)': 'acronym',
+      u'index (translation required)': 'index',
+      u'subscript (translation required)': 'subscript',
+      u'superscript (translation required)': 'superscript',
+      u'title-reference (translation required)': 'title-reference',
+      u'pep-reference (translation required)': 'pep-reference',
+      u'rfc-reference (translation required)': 'rfc-reference',
+      u'emphasis (translation required)': 'emphasis',
+      u'strong (translation required)': 'strong',
+      u'literal (translation required)': 'literal',
+      u'named-reference (translation required)': 'named-reference',
+      u'anonymous-reference (translation required)': 'anonymous-reference',
+      u'footnote-reference (translation required)': 'footnote-reference',
+      u'citation-reference (translation required)': 'citation-reference',
+      u'substitution-reference (translation required)': 'substitution-reference',
+      u'target (translation required)': 'target',
+      u'uri-reference (translation required)': 'uri-reference',
+      u'raw (translation required)': 'raw',}
+"""Mapping of Slovak role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/sv.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,90 @@
+# $Id: sv.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Adam Chodorowski <chodorowski@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Swedish language mappings for language-dependent features of reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'observera': 'attention',
+      u'caution (translation required)': 'caution',
+      u'fara': 'danger',
+      u'fel': 'error',
+      u'v\u00e4gledning': 'hint',
+      u'viktigt': 'important',
+      u'notera': 'note',
+      u'tips': 'tip',
+      u'varning': 'warning',
+      u'admonition (translation required)': 'admonition',
+      u'sidebar (translation required)': 'sidebar',
+      u'\u00e4mne': 'topic',
+      u'line-block (translation required)': 'line-block',
+      u'parsed-literal (translation required)': 'parsed-literal',
+      u'mellanrubrik': 'rubric',
+      u'epigraph (translation required)': 'epigraph',
+      u'highlights (translation required)': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      # u'fr\u00e5gor': 'questions',
+      # NOTE: A bit long, but recommended by http://www.nada.kth.se/dataterm/:
+      # u'fr\u00e5gor-och-svar': 'questions',
+      # u'vanliga-fr\u00e5gor': 'questions',  
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'meta': 'meta',
+      # u'bildkarta': 'imagemap',   # FIXME: Translation might be too literal.
+      u'bild': 'image',
+      u'figur': 'figure',
+      u'inkludera': 'include',   
+      u'r\u00e5': 'raw',            # FIXME: Translation might be too literal.
+      u'ers\u00e4tt': 'replace', 
+      u'unicode': 'unicode',
+      u'datum': 'date',
+      u'class (translation required)': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'inneh\u00e5ll': 'contents',
+      u'sektionsnumrering': 'sectnum',
+      u'target-notes (translation required)': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      # u'fotnoter': 'footnotes',
+      # u'citeringar': 'citations',
+      }
+"""Swedish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abbreviation (translation required)': 'abbreviation',
+      u'acronym (translation required)': 'acronym',
+      u'index (translation required)': 'index',
+      u'subscript (translation required)': 'subscript',
+      u'superscript (translation required)': 'superscript',
+      u'title-reference (translation required)': 'title-reference',
+      u'pep-reference (translation required)': 'pep-reference',
+      u'rfc-reference (translation required)': 'rfc-reference',
+      u'emphasis (translation required)': 'emphasis',
+      u'strong (translation required)': 'strong',
+      u'literal (translation required)': 'literal',
+      u'named-reference (translation required)': 'named-reference',
+      u'anonymous-reference (translation required)': 'anonymous-reference',
+      u'footnote-reference (translation required)': 'footnote-reference',
+      u'citation-reference (translation required)': 'citation-reference',
+      u'substitution-reference (translation required)': 'substitution-reference',
+      u'target (translation required)': 'target',
+      u'uri-reference (translation required)': 'uri-reference',
+      u'r\u00e5': 'raw',}
+"""Mapping of Swedish role names to canonical role names for interpreted text.
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/zh_cn.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+# $Id: zh_cn.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Panjunyong <panjy@zopechina.com>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Simplified Chinese language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'注æ„': 'attention',
+      u'å°å¿ƒ': 'caution',
+      u'å±é™©': 'danger',
+      u'错误': 'error',
+      u'æ示': 'hint',
+      u'é‡è¦': 'important',
+      u'注解': 'note',
+      u'技巧': 'tip',
+      u'警告': 'warning',
+      u'å¿ å‘Š': 'admonition',
+      u'侧框': 'sidebar',
+      u'主题': 'topic',
+      u'line-block (translation required)': 'line-block',
+      u'parsed-literal (translation required)': 'parsed-literal',
+      u'醒目': 'rubric',
+      u'é“­æ–‡': 'epigraph',
+      u'è¦ç‚¹': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'å¤åˆ': 'compound',
+      u'容器': 'container',
+      #u'questions (translation required)': 'questions',
+      u'表格': 'table',
+      u'csv表格': 'csv-table',
+      u'列表表格': 'list-table',
+      #u'qa (translation required)': 'questions',
+      #u'faq (translation required)': 'questions',
+      u'元数æ®': 'meta',
+      #u'imagemap (translation required)': 'imagemap',
+      u'图片': 'image',
+      u'图例': 'figure',
+      u'包å«': 'include',
+      u'原文': 'raw',
+      u'代替': 'replace',
+      u'统一ç ': 'unicode',
+      u'日期': 'date',
+      u'类型': 'class',
+      u'角色': 'role',
+      u'默认角色': 'default-role',
+      u'标题': 'title',
+      u'目录': 'contents',
+      u'章节åºå·': 'sectnum',
+      u'题头': 'header',
+      u'页脚': 'footer',
+      #u'footnotes (translation required)': 'footnotes',
+      #u'citations (translation required)': 'citations',
+      u'target-notes (translation required)': 'target-notes',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Simplified Chinese name to registered (in directives/__init__.py)
+directive name mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'缩写': 'abbreviation',
+    u'简称': 'acronym',
+    u'index (translation required)': 'index',
+    u'i (translation required)': 'index',
+    u'下标': 'subscript',
+    u'上标': 'superscript',
+    u'title-reference (translation required)': 'title-reference',
+    u'title (translation required)': 'title-reference',
+    u't (translation required)': 'title-reference',
+    u'pep-reference (translation required)': 'pep-reference',
+    u'pep (translation required)': 'pep-reference',
+    u'rfc-reference (translation required)': 'rfc-reference',
+    u'rfc (translation required)': 'rfc-reference',
+    u'强调': 'emphasis',
+    u'加粗': 'strong',
+    u'å­—é¢': 'literal',
+    u'named-reference (translation required)': 'named-reference',
+    u'anonymous-reference (translation required)': 'anonymous-reference',
+    u'footnote-reference (translation required)': 'footnote-reference',
+    u'citation-reference (translation required)': 'citation-reference',
+    u'substitution-reference (translation required)': 'substitution-reference',
+    u'target (translation required)': 'target',
+    u'uri-reference (translation required)': 'uri-reference',
+    u'uri (translation required)': 'uri-reference',
+    u'url (translation required)': 'uri-reference',
+    u'raw (translation required)': 'raw',}
+"""Mapping of Simplified Chinese role names to canonical role names
+for interpreted text."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/languages/zh_tw.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,105 @@
+# -*- coding: utf-8 -*-
+# $Id: zh_tw.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Traditional Chinese language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      'attention (translation required)': 'attention',
+      'caution (translation required)': 'caution',
+      'danger (translation required)': 'danger',
+      'error (translation required)': 'error',
+      'hint (translation required)': 'hint',
+      'important (translation required)': 'important',
+      'note (translation required)': 'note',
+      'tip (translation required)': 'tip',
+      'warning (translation required)': 'warning',
+      'admonition (translation required)': 'admonition',
+      'sidebar (translation required)': 'sidebar',
+      'topic (translation required)': 'topic',
+      'line-block (translation required)': 'line-block',
+      'parsed-literal (translation required)': 'parsed-literal',
+      'rubric (translation required)': 'rubric',
+      'epigraph (translation required)': 'epigraph',
+      'highlights (translation required)': 'highlights',
+      'pull-quote (translation required)': 'pull-quote',
+      'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'questions (translation required)': 'questions',
+      'table (translation required)': 'table',
+      'csv-table (translation required)': 'csv-table',
+      'list-table (translation required)': 'list-table',
+      #'qa (translation required)': 'questions',
+      #'faq (translation required)': 'questions',
+      'meta (translation required)': 'meta',
+      #'imagemap (translation required)': 'imagemap',
+      'image (translation required)': 'image',
+      'figure (translation required)': 'figure',
+      'include (translation required)': 'include',
+      'raw (translation required)': 'raw',
+      'replace (translation required)': 'replace',
+      'unicode (translation required)': 'unicode',
+      u'日期': 'date',
+      'class (translation required)': 'class',
+      'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      'contents (translation required)': 'contents',
+      'sectnum (translation required)': 'sectnum',
+      'section-numbering (translation required)': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'footnotes (translation required)': 'footnotes',
+      #'citations (translation required)': 'citations',
+      'target-notes (translation required)': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Traditional Chinese name to registered (in directives/__init__.py)
+directive name mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'abbreviation (translation required)': 'abbreviation',
+    'ab (translation required)': 'abbreviation',
+    'acronym (translation required)': 'acronym',
+    'ac (translation required)': 'acronym',
+    'index (translation required)': 'index',
+    'i (translation required)': 'index',
+    'subscript (translation required)': 'subscript',
+    'sub (translation required)': 'subscript',
+    'superscript (translation required)': 'superscript',
+    'sup (translation required)': 'superscript',
+    'title-reference (translation required)': 'title-reference',
+    'title (translation required)': 'title-reference',
+    't (translation required)': 'title-reference',
+    'pep-reference (translation required)': 'pep-reference',
+    'pep (translation required)': 'pep-reference',
+    'rfc-reference (translation required)': 'rfc-reference',
+    'rfc (translation required)': 'rfc-reference',
+    'emphasis (translation required)': 'emphasis',
+    'strong (translation required)': 'strong',
+    'literal (translation required)': 'literal',
+    'named-reference (translation required)': 'named-reference',
+    'anonymous-reference (translation required)': 'anonymous-reference',
+    'footnote-reference (translation required)': 'footnote-reference',
+    'citation-reference (translation required)': 'citation-reference',
+    'substitution-reference (translation required)': 'substitution-reference',
+    'target (translation required)': 'target',
+    'uri-reference (translation required)': 'uri-reference',
+    'uri (translation required)': 'uri-reference',
+    'url (translation required)': 'uri-reference',
+    'raw (translation required)': 'raw',}
+"""Mapping of Traditional Chinese role names to canonical role names for
+interpreted text."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/roles.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,346 @@
+# $Id: roles.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Edward Loper <edloper@gradient.cis.upenn.edu>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This module defines standard interpreted text role functions, a registry for
+interpreted text roles, and an API for adding to and retrieving from the
+registry.
+
+The interface for interpreted role functions is as follows::
+
+    def role_fn(name, rawtext, text, lineno, inliner,
+                options={}, content=[]):
+        code...
+
+    # Set function attributes for customization:
+    role_fn.options = ...
+    role_fn.content = ...
+
+Parameters:
+
+- ``name`` is the local name of the interpreted text role, the role name
+  actually used in the document.
+
+- ``rawtext`` is a string containing the entire interpreted text construct.
+  Return it as a ``problematic`` node linked to a system message if there is a
+  problem.
+
+- ``text`` is the interpreted text content, with backslash escapes converted
+  to nulls (``\x00``).
+
+- ``lineno`` is the line number where the interpreted text beings.
+
+- ``inliner`` is the Inliner object that called the role function.
+  It defines the following useful attributes: ``reporter``,
+  ``problematic``, ``memo``, ``parent``, ``document``.
+
+- ``options``: A dictionary of directive options for customization, to be
+  interpreted by the role function.  Used for additional attributes for the
+  generated elements and other functionality.
+
+- ``content``: A list of strings, the directive content for customization
+  ("role" directive).  To be interpreted by the role function.
+
+Function attributes for customization, interpreted by the "role" directive:
+
+- ``options``: A dictionary, mapping known option names to conversion
+  functions such as `int` or `float`.  ``None`` or an empty dict implies no
+  options to parse.  Several directive option conversion functions are defined
+  in the `directives` module.
+
+  All role functions implicitly support the "class" option, unless disabled
+  with an explicit ``{'class': None}``.
+
+- ``content``: A boolean; true if content is allowed.  Client code must handle
+  the case where content is required but not supplied (an empty content list
+  will be supplied).
+
+Note that unlike directives, the "arguments" function attribute is not
+supported for role customization.  Directive arguments are handled by the
+"role" directive itself.
+
+Interpreted role functions return a tuple of two values:
+
+- A list of nodes which will be inserted into the document tree at the
+  point where the interpreted role was encountered (can be an empty
+  list).
+
+- A list of system messages, which will be inserted into the document tree
+  immediately after the end of the current inline block (can also be empty).
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes, utils
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.languages import en as _fallback_language_module
+
+DEFAULT_INTERPRETED_ROLE = 'title-reference'
+"""
+The canonical name of the default interpreted role.  This role is used
+when no role is specified for a piece of interpreted text.
+"""
+
+_role_registry = {}
+"""Mapping of canonical role names to role functions.  Language-dependent role
+names are defined in the ``language`` subpackage."""
+
+_roles = {}
+"""Mapping of local or language-dependent interpreted text role names to role
+functions."""
+
+def role(role_name, language_module, lineno, reporter):
+    """
+    Locate and return a role function from its language-dependent name, along
+    with a list of system messages.  If the role is not found in the current
+    language, check English.  Return a 2-tuple: role function (``None`` if the
+    named role cannot be found) and a list of system messages.
+    """
+    normname = role_name.lower()
+    messages = []
+    msg_text = []
+
+    if _roles.has_key(normname):
+        return _roles[normname], messages
+
+    if role_name:
+        canonicalname = None
+        try:
+            canonicalname = language_module.roles[normname]
+        except AttributeError, error:
+            msg_text.append('Problem retrieving role entry from language '
+                            'module %r: %s.' % (language_module, error))
+        except KeyError:
+            msg_text.append('No role entry for "%s" in module "%s".'
+                            % (role_name, language_module.__name__))
+    else:
+        canonicalname = DEFAULT_INTERPRETED_ROLE
+
+    # If we didn't find it, try English as a fallback.
+    if not canonicalname:
+        try:
+            canonicalname = _fallback_language_module.roles[normname]
+            msg_text.append('Using English fallback for role "%s".'
+                            % role_name)
+        except KeyError:
+            msg_text.append('Trying "%s" as canonical role name.'
+                            % role_name)
+            # The canonical name should be an English name, but just in case:
+            canonicalname = normname
+
+    # Collect any messages that we generated.
+    if msg_text:
+        message = reporter.info('\n'.join(msg_text), line=lineno)
+        messages.append(message)
+
+    # Look the role up in the registry, and return it.
+    if _role_registry.has_key(canonicalname):
+        role_fn = _role_registry[canonicalname]
+        register_local_role(normname, role_fn)
+        return role_fn, messages
+    else:
+        return None, messages # Error message will be generated by caller.
+
+def register_canonical_role(name, role_fn):
+    """
+    Register an interpreted text role by its canonical name.
+
+    :Parameters:
+      - `name`: The canonical name of the interpreted role.
+      - `role_fn`: The role function.  See the module docstring.
+    """
+    set_implicit_options(role_fn)
+    _role_registry[name] = role_fn
+
+def register_local_role(name, role_fn):
+    """
+    Register an interpreted text role by its local or language-dependent name.
+
+    :Parameters:
+      - `name`: The local or language-dependent name of the interpreted role.
+      - `role_fn`: The role function.  See the module docstring.
+    """
+    set_implicit_options(role_fn)
+    _roles[name] = role_fn
+
+def set_implicit_options(role_fn):
+    """
+    Add customization options to role functions, unless explicitly set or
+    disabled.
+    """
+    if not hasattr(role_fn, 'options') or role_fn.options is None:
+        role_fn.options = {'class': directives.class_option}
+    elif not role_fn.options.has_key('class'):
+        role_fn.options['class'] = directives.class_option
+
+def register_generic_role(canonical_name, node_class):
+    """For roles which simply wrap a given `node_class` around the text."""
+    role = GenericRole(canonical_name, node_class)
+    register_canonical_role(canonical_name, role)
+
+
+class GenericRole:
+
+    """
+    Generic interpreted text role, where the interpreted text is simply
+    wrapped with the provided node class.
+    """
+
+    def __init__(self, role_name, node_class):
+        self.name = role_name
+        self.node_class = node_class
+
+    def __call__(self, role, rawtext, text, lineno, inliner,
+                 options={}, content=[]):
+        set_classes(options)
+        return [self.node_class(rawtext, utils.unescape(text), **options)], []
+
+
+class CustomRole:
+
+    """
+    Wrapper for custom interpreted text roles.
+    """
+
+    def __init__(self, role_name, base_role, options={}, content=[]):
+        self.name = role_name
+        self.base_role = base_role
+        self.options = None
+        if hasattr(base_role, 'options'):
+            self.options = base_role.options
+        self.content = None
+        if hasattr(base_role, 'content'):
+            self.content = base_role.content
+        self.supplied_options = options
+        self.supplied_content = content
+
+    def __call__(self, role, rawtext, text, lineno, inliner,
+                 options={}, content=[]):
+        opts = self.supplied_options.copy()
+        opts.update(options)
+        cont = list(self.supplied_content)
+        if cont and content:
+            cont += '\n'
+        cont.extend(content)
+        return self.base_role(role, rawtext, text, lineno, inliner,
+                              options=opts, content=cont)
+
+
+def generic_custom_role(role, rawtext, text, lineno, inliner,
+                        options={}, content=[]):
+    """"""
+    # Once nested inline markup is implemented, this and other methods should
+    # recursively call inliner.nested_parse().
+    set_classes(options)
+    return [nodes.inline(rawtext, utils.unescape(text), **options)], []
+
+generic_custom_role.options = {'class': directives.class_option}
+
+
+######################################################################
+# Define and register the standard roles:
+######################################################################
+
+register_generic_role('abbreviation', nodes.abbreviation)
+register_generic_role('acronym', nodes.acronym)
+register_generic_role('emphasis', nodes.emphasis)
+register_generic_role('literal', nodes.literal)
+register_generic_role('strong', nodes.strong)
+register_generic_role('subscript', nodes.subscript)
+register_generic_role('superscript', nodes.superscript)
+register_generic_role('title-reference', nodes.title_reference)
+
+def pep_reference_role(role, rawtext, text, lineno, inliner,
+                       options={}, content=[]):
+    try:
+        pepnum = int(text)
+        if pepnum < 0 or pepnum > 9999:
+            raise ValueError
+    except ValueError:
+        msg = inliner.reporter.error(
+            'PEP number must be a number from 0 to 9999; "%s" is invalid.'
+            % text, line=lineno)
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+    # Base URL mainly used by inliner.pep_reference; so this is correct:
+    ref = (inliner.document.settings.pep_base_url
+           + inliner.document.settings.pep_file_url_template % pepnum)
+    set_classes(options)
+    return [nodes.reference(rawtext, 'PEP ' + utils.unescape(text), refuri=ref,
+                            **options)], []
+
+register_canonical_role('pep-reference', pep_reference_role)
+
+def rfc_reference_role(role, rawtext, text, lineno, inliner,
+                       options={}, content=[]):
+    try:
+        rfcnum = int(text)
+        if rfcnum <= 0:
+            raise ValueError
+    except ValueError:
+        msg = inliner.reporter.error(
+            'RFC number must be a number greater than or equal to 1; '
+            '"%s" is invalid.' % text, line=lineno)
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+    # Base URL mainly used by inliner.rfc_reference, so this is correct:
+    ref = inliner.document.settings.rfc_base_url + inliner.rfc_url % rfcnum
+    set_classes(options)
+    node = nodes.reference(rawtext, 'RFC ' + utils.unescape(text), refuri=ref,
+                           **options)
+    return [node], []
+
+register_canonical_role('rfc-reference', rfc_reference_role)
+
+def raw_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
+    if not options.has_key('format'):
+        msg = inliner.reporter.error(
+            'No format (Writer name) is associated with this role: "%s".\n'
+            'The "raw" role cannot be used directly.\n'
+            'Instead, use the "role" directive to create a new role with '
+            'an associated format.' % role, line=lineno)
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+    set_classes(options)
+    node = nodes.raw(rawtext, utils.unescape(text, 1), **options)
+    return [node], []
+
+raw_role.options = {'format': directives.unchanged}
+
+register_canonical_role('raw', raw_role)
+
+
+######################################################################
+# Register roles that are currently unimplemented.
+######################################################################
+
+def unimplemented_role(role, rawtext, text, lineno, inliner, attributes={}):
+    msg = inliner.reporter.error(
+        'Interpreted text role "%s" not implemented.' % role, line=lineno)
+    prb = inliner.problematic(rawtext, rawtext, msg)
+    return [prb], [msg]
+
+register_canonical_role('index', unimplemented_role)
+register_canonical_role('named-reference', unimplemented_role)
+register_canonical_role('anonymous-reference', unimplemented_role)
+register_canonical_role('uri-reference', unimplemented_role)
+register_canonical_role('footnote-reference', unimplemented_role)
+register_canonical_role('citation-reference', unimplemented_role)
+register_canonical_role('substitution-reference', unimplemented_role)
+register_canonical_role('target', unimplemented_role)
+
+# This should remain unimplemented, for testing purposes:
+register_canonical_role('restructuredtext-unimplemented-role',
+                        unimplemented_role)
+
+
+def set_classes(options):
+    """
+    Auxiliary function to set options['classes'] and delete
+    options['class'].
+    """
+    if options.has_key('class'):
+        assert not options.has_key('classes')
+        options['classes'] = options['class']
+        del options['class']
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/states.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,2988 @@
+# $Id: states.py 4824 2006-12-09 00:59:23Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This is the ``docutils.parsers.restructuredtext.states`` module, the core of
+the reStructuredText parser.  It defines the following:
+
+:Classes:
+    - `RSTStateMachine`: reStructuredText parser's entry point.
+    - `NestedStateMachine`: recursive StateMachine.
+    - `RSTState`: reStructuredText State superclass.
+    - `Inliner`: For parsing inline markup.
+    - `Body`: Generic classifier of the first line of a block.
+    - `SpecializedBody`: Superclass for compound element members.
+    - `BulletList`: Second and subsequent bullet_list list_items
+    - `DefinitionList`: Second+ definition_list_items.
+    - `EnumeratedList`: Second+ enumerated_list list_items.
+    - `FieldList`: Second+ fields.
+    - `OptionList`: Second+ option_list_items.
+    - `RFC2822List`: Second+ RFC2822-style fields.
+    - `ExtensionOptions`: Parses directive option fields.
+    - `Explicit`: Second+ explicit markup constructs.
+    - `SubstitutionDef`: For embedded directives in substitution definitions.
+    - `Text`: Classifier of second line of a text block.
+    - `SpecializedText`: Superclass for continuation lines of Text-variants.
+    - `Definition`: Second line of potential definition_list_item.
+    - `Line`: Second line of overlined section title or transition marker.
+    - `Struct`: An auxiliary collection class.
+
+:Exception classes:
+    - `MarkupError`
+    - `ParserError`
+    - `MarkupMismatch`
+
+:Functions:
+    - `escape2null()`: Return a string, escape-backslashes converted to nulls.
+    - `unescape()`: Return a string, nulls removed or restored to backslashes.
+
+:Attributes:
+    - `state_classes`: set of State classes used with `RSTStateMachine`.
+
+Parser Overview
+===============
+
+The reStructuredText parser is implemented as a recursive state machine,
+examining its input one line at a time.  To understand how the parser works,
+please first become familiar with the `docutils.statemachine` module.  In the
+description below, references are made to classes defined in this module;
+please see the individual classes for details.
+
+Parsing proceeds as follows:
+
+1. The state machine examines each line of input, checking each of the
+   transition patterns of the state `Body`, in order, looking for a match.
+   The implicit transitions (blank lines and indentation) are checked before
+   any others.  The 'text' transition is a catch-all (matches anything).
+
+2. The method associated with the matched transition pattern is called.
+
+   A. Some transition methods are self-contained, appending elements to the
+      document tree (`Body.doctest` parses a doctest block).  The parser's
+      current line index is advanced to the end of the element, and parsing
+      continues with step 1.
+
+   B. Other transition methods trigger the creation of a nested state machine,
+      whose job is to parse a compound construct ('indent' does a block quote,
+      'bullet' does a bullet list, 'overline' does a section [first checking
+      for a valid section header], etc.).
+
+      - In the case of lists and explicit markup, a one-off state machine is
+        created and run to parse contents of the first item.
+
+      - A new state machine is created and its initial state is set to the
+        appropriate specialized state (`BulletList` in the case of the
+        'bullet' transition; see `SpecializedBody` for more detail).  This
+        state machine is run to parse the compound element (or series of
+        explicit markup elements), and returns as soon as a non-member element
+        is encountered.  For example, the `BulletList` state machine ends as
+        soon as it encounters an element which is not a list item of that
+        bullet list.  The optional omission of inter-element blank lines is
+        enabled by this nested state machine.
+
+      - The current line index is advanced to the end of the elements parsed,
+        and parsing continues with step 1.
+
+   C. The result of the 'text' transition depends on the next line of text.
+      The current state is changed to `Text`, under which the second line is
+      examined.  If the second line is:
+
+      - Indented: The element is a definition list item, and parsing proceeds
+        similarly to step 2.B, using the `DefinitionList` state.
+
+      - A line of uniform punctuation characters: The element is a section
+        header; again, parsing proceeds as in step 2.B, and `Body` is still
+        used.
+
+      - Anything else: The element is a paragraph, which is examined for
+        inline markup and appended to the parent element.  Processing
+        continues with step 1.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import re
+import roman
+from types import TupleType, FunctionType, MethodType
+from docutils import nodes, statemachine, utils, urischemes
+from docutils import ApplicationError, DataError
+from docutils.statemachine import StateMachineWS, StateWS
+from docutils.nodes import fully_normalize_name as normalize_name
+from docutils.nodes import whitespace_normalize_name
+from docutils.utils import escape2null, unescape, column_width
+import docutils.parsers.rst
+from docutils.parsers.rst import directives, languages, tableparser, roles
+from docutils.parsers.rst.languages import en as _fallback_language_module
+
+
+class MarkupError(DataError): pass
+class UnknownInterpretedRoleError(DataError): pass
+class InterpretedRoleNotImplementedError(DataError): pass
+class ParserError(ApplicationError): pass
+class MarkupMismatch(Exception): pass
+
+
+class Struct:
+
+    """Stores data attributes for dotted-attribute access."""
+
+    def __init__(self, **keywordargs):
+        self.__dict__.update(keywordargs)
+
+
+class RSTStateMachine(StateMachineWS):
+
+    """
+    reStructuredText's master StateMachine.
+
+    The entry point to reStructuredText parsing is the `run()` method.
+    """
+
+    def run(self, input_lines, document, input_offset=0, match_titles=1,
+            inliner=None):
+        """
+        Parse `input_lines` and modify the `document` node in place.
+
+        Extend `StateMachineWS.run()`: set up parse-global data and
+        run the StateMachine.
+        """
+        self.language = languages.get_language(
+            document.settings.language_code)
+        self.match_titles = match_titles
+        if inliner is None:
+            inliner = Inliner()
+        inliner.init_customizations(document.settings)
+        self.memo = Struct(document=document,
+                           reporter=document.reporter,
+                           language=self.language,
+                           title_styles=[],
+                           section_level=0,
+                           section_bubble_up_kludge=0,
+                           inliner=inliner)
+        self.document = document
+        self.attach_observer(document.note_source)
+        self.reporter = self.memo.reporter
+        self.node = document
+        results = StateMachineWS.run(self, input_lines, input_offset,
+                                     input_source=document['source'])
+        assert results == [], 'RSTStateMachine.run() results should be empty!'
+        self.node = self.memo = None    # remove unneeded references
+
+
+class NestedStateMachine(StateMachineWS):
+
+    """
+    StateMachine run from within other StateMachine runs, to parse nested
+    document structures.
+    """
+
+    def run(self, input_lines, input_offset, memo, node, match_titles=1):
+        """
+        Parse `input_lines` and populate a `docutils.nodes.document` instance.
+
+        Extend `StateMachineWS.run()`: set up document-wide data.
+        """
+        self.match_titles = match_titles
+        self.memo = memo
+        self.document = memo.document
+        self.attach_observer(self.document.note_source)
+        self.reporter = memo.reporter
+        self.language = memo.language
+        self.node = node
+        results = StateMachineWS.run(self, input_lines, input_offset)
+        assert results == [], ('NestedStateMachine.run() results should be '
+                               'empty!')
+        return results
+
+
+class RSTState(StateWS):
+
+    """
+    reStructuredText State superclass.
+
+    Contains methods used by all State subclasses.
+    """
+
+    nested_sm = NestedStateMachine
+
+    def __init__(self, state_machine, debug=0):
+        self.nested_sm_kwargs = {'state_classes': state_classes,
+                                 'initial_state': 'Body'}
+        StateWS.__init__(self, state_machine, debug)
+
+    def runtime_init(self):
+        StateWS.runtime_init(self)
+        memo = self.state_machine.memo
+        self.memo = memo
+        self.reporter = memo.reporter
+        self.inliner = memo.inliner
+        self.document = memo.document
+        self.parent = self.state_machine.node
+
+    def goto_line(self, abs_line_offset):
+        """
+        Jump to input line `abs_line_offset`, ignoring jumps past the end.
+        """
+        try:
+            self.state_machine.goto_line(abs_line_offset)
+        except EOFError:
+            pass
+
+    def no_match(self, context, transitions):
+        """
+        Override `StateWS.no_match` to generate a system message.
+
+        This code should never be run.
+        """
+        self.reporter.severe(
+            'Internal error: no transition pattern match.  State: "%s"; '
+            'transitions: %s; context: %s; current line: %r.'
+            % (self.__class__.__name__, transitions, context,
+               self.state_machine.line),
+            line=self.state_machine.abs_line_number())
+        return context, None, []
+
+    def bof(self, context):
+        """Called at beginning of file."""
+        return [], []
+
+    def nested_parse(self, block, input_offset, node, match_titles=0,
+                     state_machine_class=None, state_machine_kwargs=None):
+        """
+        Create a new StateMachine rooted at `node` and run it over the input
+        `block`.
+        """
+        if state_machine_class is None:
+            state_machine_class = self.nested_sm
+        if state_machine_kwargs is None:
+            state_machine_kwargs = self.nested_sm_kwargs
+        block_length = len(block)
+        state_machine = state_machine_class(debug=self.debug,
+                                            **state_machine_kwargs)
+        state_machine.run(block, input_offset, memo=self.memo,
+                          node=node, match_titles=match_titles)
+        state_machine.unlink()
+        new_offset = state_machine.abs_line_offset()
+        # No `block.parent` implies disconnected -- lines aren't in sync:
+        if block.parent and (len(block) - block_length) != 0:
+            # Adjustment for block if modified in nested parse:
+            self.state_machine.next_line(len(block) - block_length)
+        return new_offset
+
+    def nested_list_parse(self, block, input_offset, node, initial_state,
+                          blank_finish,
+                          blank_finish_state=None,
+                          extra_settings={},
+                          match_titles=0,
+                          state_machine_class=None,
+                          state_machine_kwargs=None):
+        """
+        Create a new StateMachine rooted at `node` and run it over the input
+        `block`. Also keep track of optional intermediate blank lines and the
+        required final one.
+        """
+        if state_machine_class is None:
+            state_machine_class = self.nested_sm
+        if state_machine_kwargs is None:
+            state_machine_kwargs = self.nested_sm_kwargs.copy()
+        state_machine_kwargs['initial_state'] = initial_state
+        state_machine = state_machine_class(debug=self.debug,
+                                            **state_machine_kwargs)
+        if blank_finish_state is None:
+            blank_finish_state = initial_state
+        state_machine.states[blank_finish_state].blank_finish = blank_finish
+        for key, value in extra_settings.items():
+            setattr(state_machine.states[initial_state], key, value)
+        state_machine.run(block, input_offset, memo=self.memo,
+                          node=node, match_titles=match_titles)
+        blank_finish = state_machine.states[blank_finish_state].blank_finish
+        state_machine.unlink()
+        return state_machine.abs_line_offset(), blank_finish
+
+    def section(self, title, source, style, lineno, messages):
+        """Check for a valid subsection and create one if it checks out."""
+        if self.check_subsection(source, style, lineno):
+            self.new_subsection(title, lineno, messages)
+
+    def check_subsection(self, source, style, lineno):
+        """
+        Check for a valid subsection header.  Return 1 (true) or None (false).
+
+        When a new section is reached that isn't a subsection of the current
+        section, back up the line count (use ``previous_line(-x)``), then
+        ``raise EOFError``.  The current StateMachine will finish, then the
+        calling StateMachine can re-examine the title.  This will work its way
+        back up the calling chain until the correct section level isreached.
+
+        @@@ Alternative: Evaluate the title, store the title info & level, and
+        back up the chain until that level is reached.  Store in memo? Or
+        return in results?
+
+        :Exception: `EOFError` when a sibling or supersection encountered.
+        """
+        memo = self.memo
+        title_styles = memo.title_styles
+        mylevel = memo.section_level
+        try:                            # check for existing title style
+            level = title_styles.index(style) + 1
+        except ValueError:              # new title style
+            if len(title_styles) == memo.section_level: # new subsection
+                title_styles.append(style)
+                return 1
+            else:                       # not at lowest level
+                self.parent += self.title_inconsistent(source, lineno)
+                return None
+        if level <= mylevel:            # sibling or supersection
+            memo.section_level = level   # bubble up to parent section
+            if len(style) == 2:
+                memo.section_bubble_up_kludge = 1
+            # back up 2 lines for underline title, 3 for overline title
+            self.state_machine.previous_line(len(style) + 1)
+            raise EOFError              # let parent section re-evaluate
+        if level == mylevel + 1:        # immediate subsection
+            return 1
+        else:                           # invalid subsection
+            self.parent += self.title_inconsistent(source, lineno)
+            return None
+
+    def title_inconsistent(self, sourcetext, lineno):
+        error = self.reporter.severe(
+            'Title level inconsistent:', nodes.literal_block('', sourcetext),
+            line=lineno)
+        return error
+
+    def new_subsection(self, title, lineno, messages):
+        """Append new subsection to document tree. On return, check level."""
+        memo = self.memo
+        mylevel = memo.section_level
+        memo.section_level += 1
+        section_node = nodes.section()
+        self.parent += section_node
+        textnodes, title_messages = self.inline_text(title, lineno)
+        titlenode = nodes.title(title, '', *textnodes)
+        name = normalize_name(titlenode.astext())
+        section_node['names'].append(name)
+        section_node += titlenode
+        section_node += messages
+        section_node += title_messages
+        self.document.note_implicit_target(section_node, section_node)
+        offset = self.state_machine.line_offset + 1
+        absoffset = self.state_machine.abs_line_offset() + 1
+        newabsoffset = self.nested_parse(
+              self.state_machine.input_lines[offset:], input_offset=absoffset,
+              node=section_node, match_titles=1)
+        self.goto_line(newabsoffset)
+        if memo.section_level <= mylevel: # can't handle next section?
+            raise EOFError              # bubble up to supersection
+        # reset section_level; next pass will detect it properly
+        memo.section_level = mylevel
+
+    def paragraph(self, lines, lineno):
+        """
+        Return a list (paragraph & messages) & a boolean: literal_block next?
+        """
+        data = '\n'.join(lines).rstrip()
+        if re.search(r'(?<!\\)(\\\\)*::$', data):
+            if len(data) == 2:
+                return [], 1
+            elif data[-3] in ' \n':
+                text = data[:-3].rstrip()
+            else:
+                text = data[:-1]
+            literalnext = 1
+        else:
+            text = data
+            literalnext = 0
+        textnodes, messages = self.inline_text(text, lineno)
+        p = nodes.paragraph(data, '', *textnodes)
+        p.line = lineno
+        return [p] + messages, literalnext
+
+    def inline_text(self, text, lineno):
+        """
+        Return 2 lists: nodes (text and inline elements), and system_messages.
+        """
+        return self.inliner.parse(text, lineno, self.memo, self.parent)
+
+    def unindent_warning(self, node_name):
+        return self.reporter.warning(
+            '%s ends without a blank line; unexpected unindent.' % node_name,
+            line=(self.state_machine.abs_line_number() + 1))
+
+
+def build_regexp(definition, compile=1):
+    """
+    Build, compile and return a regular expression based on `definition`.
+
+    :Parameter: `definition`: a 4-tuple (group name, prefix, suffix, parts),
+        where "parts" is a list of regular expressions and/or regular
+        expression definitions to be joined into an or-group.
+    """
+    name, prefix, suffix, parts = definition
+    part_strings = []
+    for part in parts:
+        if type(part) is TupleType:
+            part_strings.append(build_regexp(part, None))
+        else:
+            part_strings.append(part)
+    or_group = '|'.join(part_strings)
+    regexp = '%(prefix)s(?P<%(name)s>%(or_group)s)%(suffix)s' % locals()
+    if compile:
+        return re.compile(regexp, re.UNICODE)
+    else:
+        return regexp
+
+
+class Inliner:
+
+    """
+    Parse inline markup; call the `parse()` method.
+    """
+
+    def __init__(self):
+        self.implicit_dispatch = [(self.patterns.uri, self.standalone_uri),]
+        """List of (pattern, bound method) tuples, used by
+        `self.implicit_inline`."""
+
+    def init_customizations(self, settings):
+        """Setting-based customizations; run when parsing begins."""
+        if settings.pep_references:
+            self.implicit_dispatch.append((self.patterns.pep,
+                                           self.pep_reference))
+        if settings.rfc_references:
+            self.implicit_dispatch.append((self.patterns.rfc,
+                                           self.rfc_reference))
+
+    def parse(self, text, lineno, memo, parent):
+        # Needs to be refactored for nested inline markup.
+        # Add nested_parse() method?
+        """
+        Return 2 lists: nodes (text and inline elements), and system_messages.
+
+        Using `self.patterns.initial`, a pattern which matches start-strings
+        (emphasis, strong, interpreted, phrase reference, literal,
+        substitution reference, and inline target) and complete constructs
+        (simple reference, footnote reference), search for a candidate.  When
+        one is found, check for validity (e.g., not a quoted '*' character).
+        If valid, search for the corresponding end string if applicable, and
+        check it for validity.  If not found or invalid, generate a warning
+        and ignore the start-string.  Implicit inline markup (e.g. standalone
+        URIs) is found last.
+        """
+        self.reporter = memo.reporter
+        self.document = memo.document
+        self.language = memo.language
+        self.parent = parent
+        pattern_search = self.patterns.initial.search
+        dispatch = self.dispatch
+        remaining = escape2null(text)
+        processed = []
+        unprocessed = []
+        messages = []
+        while remaining:
+            match = pattern_search(remaining)
+            if match:
+                groups = match.groupdict()
+                method = dispatch[groups['start'] or groups['backquote']
+                                  or groups['refend'] or groups['fnend']]
+                before, inlines, remaining, sysmessages = method(self, match,
+                                                                 lineno)
+                unprocessed.append(before)
+                messages += sysmessages
+                if inlines:
+                    processed += self.implicit_inline(''.join(unprocessed),
+                                                      lineno)
+                    processed += inlines
+                    unprocessed = []
+            else:
+                break
+        remaining = ''.join(unprocessed) + remaining
+        if remaining:
+            processed += self.implicit_inline(remaining, lineno)
+        return processed, messages
+
+    openers = '\'"([{<'
+    closers = '\'")]}>'
+    start_string_prefix = (r'((?<=^)|(?<=[-/: \n%s]))' % re.escape(openers))
+    end_string_suffix = (r'((?=$)|(?=[-/:.,;!? \n\x00%s]))'
+                         % re.escape(closers))
+    non_whitespace_before = r'(?<![ \n])'
+    non_whitespace_escape_before = r'(?<![ \n\x00])'
+    non_whitespace_after = r'(?![ \n])'
+    # Alphanumerics with isolated internal [-._] chars (i.e. not 2 together):
+    simplename = r'(?:(?!_)\w)+(?:[-._](?:(?!_)\w)+)*'
+    # Valid URI characters (see RFC 2396 & RFC 2732);
+    # final \x00 allows backslash escapes in URIs:
+    uric = r"""[-_.!~*'()[\];/:@&=+$,%a-zA-Z0-9\x00]"""
+    # Delimiter indicating the end of a URI (not part of the URI):
+    uri_end_delim = r"""[>]"""
+    # Last URI character; same as uric but no punctuation:
+    urilast = r"""[_~*/=+a-zA-Z0-9]"""
+    # End of a URI (either 'urilast' or 'uric followed by a
+    # uri_end_delim'):
+    uri_end = r"""(?:%(urilast)s|%(uric)s(?=%(uri_end_delim)s))""" % locals()
+    emailc = r"""[-_!~*'{|}/#?^`&=+$%a-zA-Z0-9\x00]"""
+    email_pattern = r"""
+          %(emailc)s+(?:\.%(emailc)s+)*   # name
+          (?<!\x00)@                      # at
+          %(emailc)s+(?:\.%(emailc)s*)*   # host
+          %(uri_end)s                     # final URI char
+          """
+    parts = ('initial_inline', start_string_prefix, '',
+             [('start', '', non_whitespace_after,  # simple start-strings
+               [r'\*\*',                # strong
+                r'\*(?!\*)',            # emphasis but not strong
+                r'``',                  # literal
+                r'_`',                  # inline internal target
+                r'\|(?!\|)']            # substitution reference
+               ),
+              ('whole', '', end_string_suffix, # whole constructs
+               [# reference name & end-string
+                r'(?P<refname>%s)(?P<refend>__?)' % simplename,
+                ('footnotelabel', r'\[', r'(?P<fnend>\]_)',
+                 [r'[0-9]+',               # manually numbered
+                  r'\#(%s)?' % simplename, # auto-numbered (w/ label?)
+                  r'\*',                   # auto-symbol
+                  r'(?P<citationlabel>%s)' % simplename] # citation reference
+                 )
+                ]
+               ),
+              ('backquote',             # interpreted text or phrase reference
+               '(?P<role>(:%s:)?)' % simplename, # optional role
+               non_whitespace_after,
+               ['`(?!`)']               # but not literal
+               )
+              ]
+             )
+    patterns = Struct(
+          initial=build_regexp(parts),
+          emphasis=re.compile(non_whitespace_escape_before
+                              + r'(\*)' + end_string_suffix),
+          strong=re.compile(non_whitespace_escape_before
+                            + r'(\*\*)' + end_string_suffix),
+          interpreted_or_phrase_ref=re.compile(
+              r"""
+              %(non_whitespace_escape_before)s
+              (
+                `
+                (?P<suffix>
+                  (?P<role>:%(simplename)s:)?
+                  (?P<refend>__?)?
+                )
+              )
+              %(end_string_suffix)s
+              """ % locals(), re.VERBOSE | re.UNICODE),
+          embedded_uri=re.compile(
+              r"""
+              (
+                (?:[ \n]+|^)            # spaces or beginning of line/string
+                <                       # open bracket
+                %(non_whitespace_after)s
+                ([^<>\x00]+)            # anything but angle brackets & nulls
+                %(non_whitespace_before)s
+                >                       # close bracket w/o whitespace before
+              )
+              $                         # end of string
+              """ % locals(), re.VERBOSE),
+          literal=re.compile(non_whitespace_before + '(``)'
+                             + end_string_suffix),
+          target=re.compile(non_whitespace_escape_before
+                            + r'(`)' + end_string_suffix),
+          substitution_ref=re.compile(non_whitespace_escape_before
+                                      + r'(\|_{0,2})'
+                                      + end_string_suffix),
+          email=re.compile(email_pattern % locals() + '$', re.VERBOSE),
+          uri=re.compile(
+                (r"""
+                %(start_string_prefix)s
+                (?P<whole>
+                  (?P<absolute>           # absolute URI
+                    (?P<scheme>             # scheme (http, ftp, mailto)
+                      [a-zA-Z][a-zA-Z0-9.+-]*
+                    )
+                    :
+                    (
+                      (                       # either:
+                        (//?)?                  # hierarchical URI
+                        %(uric)s*               # URI characters
+                        %(uri_end)s             # final URI char
+                      )
+                      (                       # optional query
+                        \?%(uric)s*
+                        %(uri_end)s
+                      )?
+                      (                       # optional fragment
+                        \#%(uric)s*
+                        %(uri_end)s
+                      )?
+                    )
+                  )
+                |                       # *OR*
+                  (?P<email>              # email address
+                    """ + email_pattern + r"""
+                  )
+                )
+                %(end_string_suffix)s
+                """) % locals(), re.VERBOSE),
+          pep=re.compile(
+                r"""
+                %(start_string_prefix)s
+                (
+                  (pep-(?P<pepnum1>\d+)(.txt)?) # reference to source file
+                |
+                  (PEP\s+(?P<pepnum2>\d+))      # reference by name
+                )
+                %(end_string_suffix)s""" % locals(), re.VERBOSE),
+          rfc=re.compile(
+                r"""
+                %(start_string_prefix)s
+                (RFC(-|\s+)?(?P<rfcnum>\d+))
+                %(end_string_suffix)s""" % locals(), re.VERBOSE))
+
+    def quoted_start(self, match):
+        """Return 1 if inline markup start-string is 'quoted', 0 if not."""
+        string = match.string
+        start = match.start()
+        end = match.end()
+        if start == 0:                  # start-string at beginning of text
+            return 0
+        prestart = string[start - 1]
+        try:
+            poststart = string[end]
+            if self.openers.index(prestart) \
+                  == self.closers.index(poststart):   # quoted
+                return 1
+        except IndexError:              # start-string at end of text
+            return 1
+        except ValueError:              # not quoted
+            pass
+        return 0
+
+    def inline_obj(self, match, lineno, end_pattern, nodeclass,
+                   restore_backslashes=0):
+        string = match.string
+        matchstart = match.start('start')
+        matchend = match.end('start')
+        if self.quoted_start(match):
+            return (string[:matchend], [], string[matchend:], [], '')
+        endmatch = end_pattern.search(string[matchend:])
+        if endmatch and endmatch.start(1):  # 1 or more chars
+            text = unescape(endmatch.string[:endmatch.start(1)],
+                            restore_backslashes)
+            textend = matchend + endmatch.end(1)
+            rawsource = unescape(string[matchstart:textend], 1)
+            return (string[:matchstart], [nodeclass(rawsource, text)],
+                    string[textend:], [], endmatch.group(1))
+        msg = self.reporter.warning(
+              'Inline %s start-string without end-string.'
+              % nodeclass.__name__, line=lineno)
+        text = unescape(string[matchstart:matchend], 1)
+        rawsource = unescape(string[matchstart:matchend], 1)
+        prb = self.problematic(text, rawsource, msg)
+        return string[:matchstart], [prb], string[matchend:], [msg], ''
+
+    def problematic(self, text, rawsource, message):
+        msgid = self.document.set_id(message, self.parent)
+        problematic = nodes.problematic(rawsource, text, refid=msgid)
+        prbid = self.document.set_id(problematic)
+        message.add_backref(prbid)
+        return problematic
+
+    def emphasis(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.emphasis, nodes.emphasis)
+        return before, inlines, remaining, sysmessages
+
+    def strong(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.strong, nodes.strong)
+        return before, inlines, remaining, sysmessages
+
+    def interpreted_or_phrase_ref(self, match, lineno):
+        end_pattern = self.patterns.interpreted_or_phrase_ref
+        string = match.string
+        matchstart = match.start('backquote')
+        matchend = match.end('backquote')
+        rolestart = match.start('role')
+        role = match.group('role')
+        position = ''
+        if role:
+            role = role[1:-1]
+            position = 'prefix'
+        elif self.quoted_start(match):
+            return (string[:matchend], [], string[matchend:], [])
+        endmatch = end_pattern.search(string[matchend:])
+        if endmatch and endmatch.start(1):  # 1 or more chars
+            textend = matchend + endmatch.end()
+            if endmatch.group('role'):
+                if role:
+                    msg = self.reporter.warning(
+                        'Multiple roles in interpreted text (both '
+                        'prefix and suffix present; only one allowed).',
+                        line=lineno)
+                    text = unescape(string[rolestart:textend], 1)
+                    prb = self.problematic(text, text, msg)
+                    return string[:rolestart], [prb], string[textend:], [msg]
+                role = endmatch.group('suffix')[1:-1]
+                position = 'suffix'
+            escaped = endmatch.string[:endmatch.start(1)]
+            rawsource = unescape(string[matchstart:textend], 1)
+            if rawsource[-1:] == '_':
+                if role:
+                    msg = self.reporter.warning(
+                          'Mismatch: both interpreted text role %s and '
+                          'reference suffix.' % position, line=lineno)
+                    text = unescape(string[rolestart:textend], 1)
+                    prb = self.problematic(text, text, msg)
+                    return string[:rolestart], [prb], string[textend:], [msg]
+                return self.phrase_ref(string[:matchstart], string[textend:],
+                                       rawsource, escaped, unescape(escaped))
+            else:
+                rawsource = unescape(string[rolestart:textend], 1)
+                nodelist, messages = self.interpreted(rawsource, escaped, role,
+                                                      lineno)
+                return (string[:rolestart], nodelist,
+                        string[textend:], messages)
+        msg = self.reporter.warning(
+              'Inline interpreted text or phrase reference start-string '
+              'without end-string.', line=lineno)
+        text = unescape(string[matchstart:matchend], 1)
+        prb = self.problematic(text, text, msg)
+        return string[:matchstart], [prb], string[matchend:], [msg]
+
+    def phrase_ref(self, before, after, rawsource, escaped, text):
+        match = self.patterns.embedded_uri.search(escaped)
+        if match:
+            text = unescape(escaped[:match.start(0)])
+            uri_text = match.group(2)
+            uri = ''.join(uri_text.split())
+            uri = self.adjust_uri(uri)
+            if uri:
+                target = nodes.target(match.group(1), refuri=uri)
+            else:
+                raise ApplicationError('problem with URI: %r' % uri_text)
+            if not text:
+                text = uri
+        else:
+            target = None
+        refname = normalize_name(text)
+        reference = nodes.reference(rawsource, text,
+                                    name=whitespace_normalize_name(text))
+        node_list = [reference]
+        if rawsource[-2:] == '__':
+            if target:
+                reference['refuri'] = uri
+            else:
+                reference['anonymous'] = 1
+        else:
+            if target:
+                reference['refuri'] = uri
+                target['names'].append(refname)
+                self.document.note_explicit_target(target, self.parent)
+                node_list.append(target)
+            else:
+                reference['refname'] = refname
+                self.document.note_refname(reference)
+        return before, node_list, after, []
+
+    def adjust_uri(self, uri):
+        match = self.patterns.email.match(uri)
+        if match:
+            return 'mailto:' + uri
+        else:
+            return uri
+
+    def interpreted(self, rawsource, text, role, lineno):
+        role_fn, messages = roles.role(role, self.language, lineno,
+                                       self.reporter)
+        if role_fn:
+            nodes, messages2 = role_fn(role, rawsource, text, lineno, self)
+            return nodes, messages + messages2
+        else:
+            msg = self.reporter.error(
+                'Unknown interpreted text role "%s".' % role,
+                line=lineno)
+            return ([self.problematic(rawsource, rawsource, msg)],
+                    messages + [msg])
+
+    def literal(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.literal, nodes.literal,
+              restore_backslashes=1)
+        return before, inlines, remaining, sysmessages
+
+    def inline_internal_target(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.target, nodes.target)
+        if inlines and isinstance(inlines[0], nodes.target):
+            assert len(inlines) == 1
+            target = inlines[0]
+            name = normalize_name(target.astext())
+            target['names'].append(name)
+            self.document.note_explicit_target(target, self.parent)
+        return before, inlines, remaining, sysmessages
+
+    def substitution_reference(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.substitution_ref,
+              nodes.substitution_reference)
+        if len(inlines) == 1:
+            subref_node = inlines[0]
+            if isinstance(subref_node, nodes.substitution_reference):
+                subref_text = subref_node.astext()
+                self.document.note_substitution_ref(subref_node, subref_text)
+                if endstring[-1:] == '_':
+                    reference_node = nodes.reference(
+                        '|%s%s' % (subref_text, endstring), '')
+                    if endstring[-2:] == '__':
+                        reference_node['anonymous'] = 1
+                    else:
+                        reference_node['refname'] = normalize_name(subref_text)
+                        self.document.note_refname(reference_node)
+                    reference_node += subref_node
+                    inlines = [reference_node]
+        return before, inlines, remaining, sysmessages
+
+    def footnote_reference(self, match, lineno):
+        """
+        Handles `nodes.footnote_reference` and `nodes.citation_reference`
+        elements.
+        """
+        label = match.group('footnotelabel')
+        refname = normalize_name(label)
+        string = match.string
+        before = string[:match.start('whole')]
+        remaining = string[match.end('whole'):]
+        if match.group('citationlabel'):
+            refnode = nodes.citation_reference('[%s]_' % label,
+                                               refname=refname)
+            refnode += nodes.Text(label)
+            self.document.note_citation_ref(refnode)
+        else:
+            refnode = nodes.footnote_reference('[%s]_' % label)
+            if refname[0] == '#':
+                refname = refname[1:]
+                refnode['auto'] = 1
+                self.document.note_autofootnote_ref(refnode)
+            elif refname == '*':
+                refname = ''
+                refnode['auto'] = '*'
+                self.document.note_symbol_footnote_ref(
+                      refnode)
+            else:
+                refnode += nodes.Text(label)
+            if refname:
+                refnode['refname'] = refname
+                self.document.note_footnote_ref(refnode)
+            if utils.get_trim_footnote_ref_space(self.document.settings):
+                before = before.rstrip()
+        return (before, [refnode], remaining, [])
+
+    def reference(self, match, lineno, anonymous=None):
+        referencename = match.group('refname')
+        refname = normalize_name(referencename)
+        referencenode = nodes.reference(
+            referencename + match.group('refend'), referencename,
+            name=whitespace_normalize_name(referencename))
+        if anonymous:
+            referencenode['anonymous'] = 1
+        else:
+            referencenode['refname'] = refname
+            self.document.note_refname(referencenode)
+        string = match.string
+        matchstart = match.start('whole')
+        matchend = match.end('whole')
+        return (string[:matchstart], [referencenode], string[matchend:], [])
+
+    def anonymous_reference(self, match, lineno):
+        return self.reference(match, lineno, anonymous=1)
+
+    def standalone_uri(self, match, lineno):
+        if not match.group('scheme') or urischemes.schemes.has_key(
+              match.group('scheme').lower()):
+            if match.group('email'):
+                addscheme = 'mailto:'
+            else:
+                addscheme = ''
+            text = match.group('whole')
+            unescaped = unescape(text, 0)
+            return [nodes.reference(unescape(text, 1), unescaped,
+                                    refuri=addscheme + unescaped)]
+        else:                   # not a valid scheme
+            raise MarkupMismatch
+
+    def pep_reference(self, match, lineno):
+        text = match.group(0)
+        if text.startswith('pep-'):
+            pepnum = int(match.group('pepnum1'))
+        elif text.startswith('PEP'):
+            pepnum = int(match.group('pepnum2'))
+        else:
+            raise MarkupMismatch
+        ref = (self.document.settings.pep_base_url
+               + self.document.settings.pep_file_url_template % pepnum)
+        unescaped = unescape(text, 0)
+        return [nodes.reference(unescape(text, 1), unescaped, refuri=ref)]
+
+    rfc_url = 'rfc%d.html'
+
+    def rfc_reference(self, match, lineno):
+        text = match.group(0)
+        if text.startswith('RFC'):
+            rfcnum = int(match.group('rfcnum'))
+            ref = self.document.settings.rfc_base_url + self.rfc_url % rfcnum
+        else:
+            raise MarkupMismatch
+        unescaped = unescape(text, 0)
+        return [nodes.reference(unescape(text, 1), unescaped, refuri=ref)]
+
+    def implicit_inline(self, text, lineno):
+        """
+        Check each of the patterns in `self.implicit_dispatch` for a match,
+        and dispatch to the stored method for the pattern.  Recursively check
+        the text before and after the match.  Return a list of `nodes.Text`
+        and inline element nodes.
+        """
+        if not text:
+            return []
+        for pattern, method in self.implicit_dispatch:
+            match = pattern.search(text)
+            if match:
+                try:
+                    # Must recurse on strings before *and* after the match;
+                    # there may be multiple patterns.
+                    return (self.implicit_inline(text[:match.start()], lineno)
+                            + method(match, lineno) +
+                            self.implicit_inline(text[match.end():], lineno))
+                except MarkupMismatch:
+                    pass
+        return [nodes.Text(unescape(text), rawsource=unescape(text, 1))]
+
+    dispatch = {'*': emphasis,
+                '**': strong,
+                '`': interpreted_or_phrase_ref,
+                '``': literal,
+                '_`': inline_internal_target,
+                ']_': footnote_reference,
+                '|': substitution_reference,
+                '_': reference,
+                '__': anonymous_reference}
+
+
+def _loweralpha_to_int(s, _zero=(ord('a')-1)):
+    return ord(s) - _zero
+
+def _upperalpha_to_int(s, _zero=(ord('A')-1)):
+    return ord(s) - _zero
+
+def _lowerroman_to_int(s):
+    return roman.fromRoman(s.upper())
+
+
+class Body(RSTState):
+
+    """
+    Generic classifier of the first line of a block.
+    """
+
+    double_width_pad_char = tableparser.TableParser.double_width_pad_char
+    """Padding character for East Asian double-width text."""
+
+    enum = Struct()
+    """Enumerated list parsing information."""
+
+    enum.formatinfo = {
+          'parens': Struct(prefix='(', suffix=')', start=1, end=-1),
+          'rparen': Struct(prefix='', suffix=')', start=0, end=-1),
+          'period': Struct(prefix='', suffix='.', start=0, end=-1)}
+    enum.formats = enum.formatinfo.keys()
+    enum.sequences = ['arabic', 'loweralpha', 'upperalpha',
+                      'lowerroman', 'upperroman'] # ORDERED!
+    enum.sequencepats = {'arabic': '[0-9]+',
+                         'loweralpha': '[a-z]',
+                         'upperalpha': '[A-Z]',
+                         'lowerroman': '[ivxlcdm]+',
+                         'upperroman': '[IVXLCDM]+',}
+    enum.converters = {'arabic': int,
+                       'loweralpha': _loweralpha_to_int,
+                       'upperalpha': _upperalpha_to_int,
+                       'lowerroman': _lowerroman_to_int,
+                       'upperroman': roman.fromRoman}
+
+    enum.sequenceregexps = {}
+    for sequence in enum.sequences:
+        enum.sequenceregexps[sequence] = re.compile(
+              enum.sequencepats[sequence] + '$')
+
+    grid_table_top_pat = re.compile(r'\+-[-+]+-\+ *$')
+    """Matches the top (& bottom) of a full table)."""
+
+    simple_table_top_pat = re.compile('=+( +=+)+ *$')
+    """Matches the top of a simple table."""
+
+    simple_table_border_pat = re.compile('=+[ =]*$')
+    """Matches the bottom & header bottom of a simple table."""
+
+    pats = {}
+    """Fragments of patterns used by transitions."""
+
+    pats['nonalphanum7bit'] = '[!-/:-@[-`{-~]'
+    pats['alpha'] = '[a-zA-Z]'
+    pats['alphanum'] = '[a-zA-Z0-9]'
+    pats['alphanumplus'] = '[a-zA-Z0-9_-]'
+    pats['enum'] = ('(%(arabic)s|%(loweralpha)s|%(upperalpha)s|%(lowerroman)s'
+                    '|%(upperroman)s|#)' % enum.sequencepats)
+    pats['optname'] = '%(alphanum)s%(alphanumplus)s*' % pats
+    # @@@ Loosen up the pattern?  Allow Unicode?
+    pats['optarg'] = '(%(alpha)s%(alphanumplus)s*|<[^<>]+>)' % pats
+    pats['shortopt'] = r'(-|\+)%(alphanum)s( ?%(optarg)s)?' % pats
+    pats['longopt'] = r'(--|/)%(optname)s([ =]%(optarg)s)?' % pats
+    pats['option'] = r'(%(shortopt)s|%(longopt)s)' % pats
+
+    for format in enum.formats:
+        pats[format] = '(?P<%s>%s%s%s)' % (
+              format, re.escape(enum.formatinfo[format].prefix),
+              pats['enum'], re.escape(enum.formatinfo[format].suffix))
+
+    patterns = {
+          'bullet': ur'[-+*\u2022\u2023\u2043]( +|$)',
+          'enumerator': r'(%(parens)s|%(rparen)s|%(period)s)( +|$)' % pats,
+          'field_marker': r':(?![: ])([^:\\]|\\.)*(?<! ):( +|$)',
+          'option_marker': r'%(option)s(, %(option)s)*(  +| ?$)' % pats,
+          'doctest': r'>>>( +|$)',
+          'line_block': r'\|( +|$)',
+          'grid_table_top': grid_table_top_pat,
+          'simple_table_top': simple_table_top_pat,
+          'explicit_markup': r'\.\.( +|$)',
+          'anonymous': r'__( +|$)',
+          'line': r'(%(nonalphanum7bit)s)\1* *$' % pats,
+          'text': r''}
+    initial_transitions = (
+          'bullet',
+          'enumerator',
+          'field_marker',
+          'option_marker',
+          'doctest',
+          'line_block',
+          'grid_table_top',
+          'simple_table_top',
+          'explicit_markup',
+          'anonymous',
+          'line',
+          'text')
+
+    def indent(self, match, context, next_state):
+        """Block quote."""
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_indented()
+        elements = self.block_quote(indented, line_offset)
+        self.parent += elements
+        if not blank_finish:
+            self.parent += self.unindent_warning('Block quote')
+        return context, next_state, []
+
+    def block_quote(self, indented, line_offset):
+        elements = []
+        while indented:
+            (blockquote_lines,
+             attribution_lines,
+             attribution_offset,
+             indented,
+             new_line_offset) = self.split_attribution(indented, line_offset)
+            blockquote = nodes.block_quote()
+            self.nested_parse(blockquote_lines, line_offset, blockquote)
+            elements.append(blockquote)
+            if attribution_lines:
+                attribution, messages = self.parse_attribution(
+                    attribution_lines, attribution_offset)
+                blockquote += attribution
+                elements += messages
+            line_offset = new_line_offset
+            while indented and not indented[0]:
+                indented = indented[1:]
+                line_offset += 1
+        return elements
+
+    # U+2014 is an em-dash:
+    attribution_pattern = re.compile(ur'(---?(?!-)|\u2014) *(?=[^ \n])')
+
+    def split_attribution(self, indented, line_offset):
+        """
+        Check for a block quote attribution and split it off:
+
+        * First line after a blank line must begin with a dash ("--", "---",
+          em-dash; matches `self.attribution_pattern`).
+        * Every line after that must have consistent indentation.
+        * Attributions must be preceded by block quote content.
+
+        Return a tuple of: (block quote content lines, content offset,
+        attribution lines, attribution offset, remaining indented lines).
+        """
+        blank = None
+        nonblank_seen = False
+        for i in range(len(indented)):
+            line = indented[i].rstrip()
+            if line:
+                if nonblank_seen and blank == i - 1: # last line blank
+                    match = self.attribution_pattern.match(line)
+                    if match:
+                        attribution_end, indent = self.check_attribution(
+                            indented, i)
+                        if attribution_end:
+                            a_lines = indented[i:attribution_end]
+                            a_lines.trim_left(match.end(), end=1)
+                            a_lines.trim_left(indent, start=1)
+                            return (indented[:i], a_lines,
+                                    i, indented[attribution_end:],
+                                    line_offset + attribution_end)
+                nonblank_seen = True
+            else:
+                blank = i
+        else:
+            return (indented, None, None, None, None)
+
+    def check_attribution(self, indented, attribution_start):
+        """
+        Check attribution shape.
+        Return the index past the end of the attribution, and the indent.
+        """
+        indent = None
+        i = attribution_start + 1
+        for i in range(attribution_start + 1, len(indented)):
+            line = indented[i].rstrip()
+            if not line:
+                break
+            if indent is None:
+                indent = len(line) - len(line.lstrip())
+            elif len(line) - len(line.lstrip()) != indent:
+                return None, None       # bad shape; not an attribution
+        else:
+            # return index of line after last attribution line:
+            i += 1
+        return i, (indent or 0)
+
+    def parse_attribution(self, indented, line_offset):
+        text = '\n'.join(indented).rstrip()
+        lineno = self.state_machine.abs_line_number() + line_offset
+        textnodes, messages = self.inline_text(text, lineno)
+        node = nodes.attribution(text, '', *textnodes)
+        node.line = lineno
+        return node, messages
+
+    def bullet(self, match, context, next_state):
+        """Bullet list item."""
+        bulletlist = nodes.bullet_list()
+        self.parent += bulletlist
+        bulletlist['bullet'] = match.string[0]
+        i, blank_finish = self.list_item(match.end())
+        bulletlist += i
+        offset = self.state_machine.line_offset + 1   # next line
+        new_line_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=bulletlist, initial_state='BulletList',
+              blank_finish=blank_finish)
+        self.goto_line(new_line_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Bullet list')
+        return [], next_state, []
+
+    def list_item(self, indent):
+        if self.state_machine.line[indent:]:
+            indented, line_offset, blank_finish = (
+                self.state_machine.get_known_indented(indent))
+        else:
+            indented, indent, line_offset, blank_finish = (
+                self.state_machine.get_first_known_indented(indent))
+        listitem = nodes.list_item('\n'.join(indented))
+        if indented:
+            self.nested_parse(indented, input_offset=line_offset,
+                              node=listitem)
+        return listitem, blank_finish
+
+    def enumerator(self, match, context, next_state):
+        """Enumerated List Item"""
+        format, sequence, text, ordinal = self.parse_enumerator(match)
+        if not self.is_enumerated_list_item(ordinal, sequence, format):
+            raise statemachine.TransitionCorrection('text')
+        enumlist = nodes.enumerated_list()
+        self.parent += enumlist
+        if sequence == '#':
+            enumlist['enumtype'] = 'arabic'
+        else:
+            enumlist['enumtype'] = sequence
+        enumlist['prefix'] = self.enum.formatinfo[format].prefix
+        enumlist['suffix'] = self.enum.formatinfo[format].suffix
+        if ordinal != 1:
+            enumlist['start'] = ordinal
+            msg = self.reporter.info(
+                'Enumerated list start value not ordinal-1: "%s" (ordinal %s)'
+                % (text, ordinal), line=self.state_machine.abs_line_number())
+            self.parent += msg
+        listitem, blank_finish = self.list_item(match.end())
+        enumlist += listitem
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=enumlist, initial_state='EnumeratedList',
+              blank_finish=blank_finish,
+              extra_settings={'lastordinal': ordinal,
+                              'format': format,
+                              'auto': sequence == '#'})
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Enumerated list')
+        return [], next_state, []
+
+    def parse_enumerator(self, match, expected_sequence=None):
+        """
+        Analyze an enumerator and return the results.
+
+        :Return:
+            - the enumerator format ('period', 'parens', or 'rparen'),
+            - the sequence used ('arabic', 'loweralpha', 'upperroman', etc.),
+            - the text of the enumerator, stripped of formatting, and
+            - the ordinal value of the enumerator ('a' -> 1, 'ii' -> 2, etc.;
+              ``None`` is returned for invalid enumerator text).
+
+        The enumerator format has already been determined by the regular
+        expression match. If `expected_sequence` is given, that sequence is
+        tried first. If not, we check for Roman numeral 1. This way,
+        single-character Roman numerals (which are also alphabetical) can be
+        matched. If no sequence has been matched, all sequences are checked in
+        order.
+        """
+        groupdict = match.groupdict()
+        sequence = ''
+        for format in self.enum.formats:
+            if groupdict[format]:       # was this the format matched?
+                break                   # yes; keep `format`
+        else:                           # shouldn't happen
+            raise ParserError('enumerator format not matched')
+        text = groupdict[format][self.enum.formatinfo[format].start
+                                 :self.enum.formatinfo[format].end]
+        if text == '#':
+            sequence = '#'
+        elif expected_sequence:
+            try:
+                if self.enum.sequenceregexps[expected_sequence].match(text):
+                    sequence = expected_sequence
+            except KeyError:            # shouldn't happen
+                raise ParserError('unknown enumerator sequence: %s'
+                                  % sequence)
+        elif text == 'i':
+            sequence = 'lowerroman'
+        elif text == 'I':
+            sequence = 'upperroman'
+        if not sequence:
+            for sequence in self.enum.sequences:
+                if self.enum.sequenceregexps[sequence].match(text):
+                    break
+            else:                       # shouldn't happen
+                raise ParserError('enumerator sequence not matched')
+        if sequence == '#':
+            ordinal = 1
+        else:
+            try:
+                ordinal = self.enum.converters[sequence](text)
+            except roman.InvalidRomanNumeralError:
+                ordinal = None
+        return format, sequence, text, ordinal
+
+    def is_enumerated_list_item(self, ordinal, sequence, format):
+        """
+        Check validity based on the ordinal value and the second line.
+
+        Return true iff the ordinal is valid and the second line is blank,
+        indented, or starts with the next enumerator or an auto-enumerator.
+        """
+        if ordinal is None:
+            return None
+        try:
+            next_line = self.state_machine.next_line()
+        except EOFError:              # end of input lines
+            self.state_machine.previous_line()
+            return 1
+        else:
+            self.state_machine.previous_line()
+        if not next_line[:1].strip():   # blank or indented
+            return 1
+        result = self.make_enumerator(ordinal + 1, sequence, format)
+        if result:
+            next_enumerator, auto_enumerator = result
+            try:
+                if ( next_line.startswith(next_enumerator) or
+                     next_line.startswith(auto_enumerator) ):
+                    return 1
+            except TypeError:
+                pass
+        return None
+
+    def make_enumerator(self, ordinal, sequence, format):
+        """
+        Construct and return the next enumerated list item marker, and an
+        auto-enumerator ("#" instead of the regular enumerator).
+
+        Return ``None`` for invalid (out of range) ordinals.
+        """ #"
+        if sequence == '#':
+            enumerator = '#'
+        elif sequence == 'arabic':
+            enumerator = str(ordinal)
+        else:
+            if sequence.endswith('alpha'):
+                if ordinal > 26:
+                    return None
+                enumerator = chr(ordinal + ord('a') - 1)
+            elif sequence.endswith('roman'):
+                try:
+                    enumerator = roman.toRoman(ordinal)
+                except roman.RomanError:
+                    return None
+            else:                       # shouldn't happen
+                raise ParserError('unknown enumerator sequence: "%s"'
+                                  % sequence)
+            if sequence.startswith('lower'):
+                enumerator = enumerator.lower()
+            elif sequence.startswith('upper'):
+                enumerator = enumerator.upper()
+            else:                       # shouldn't happen
+                raise ParserError('unknown enumerator sequence: "%s"'
+                                  % sequence)
+        formatinfo = self.enum.formatinfo[format]
+        next_enumerator = (formatinfo.prefix + enumerator + formatinfo.suffix
+                           + ' ')
+        auto_enumerator = formatinfo.prefix + '#' + formatinfo.suffix + ' '
+        return next_enumerator, auto_enumerator
+
+    def field_marker(self, match, context, next_state):
+        """Field list item."""
+        field_list = nodes.field_list()
+        self.parent += field_list
+        field, blank_finish = self.field(match)
+        field_list += field
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=field_list, initial_state='FieldList',
+              blank_finish=blank_finish)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Field list')
+        return [], next_state, []
+
+    def field(self, match):
+        name = self.parse_field_marker(match)
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        field_node = nodes.field()
+        field_node.line = lineno
+        name_nodes, name_messages = self.inline_text(name, lineno)
+        field_node += nodes.field_name(name, '', *name_nodes)
+        field_body = nodes.field_body('\n'.join(indented), *name_messages)
+        field_node += field_body
+        if indented:
+            self.parse_field_body(indented, line_offset, field_body)
+        return field_node, blank_finish
+
+    def parse_field_marker(self, match):
+        """Extract & return field name from a field marker match."""
+        field = match.group()[1:]        # strip off leading ':'
+        field = field[:field.rfind(':')] # strip off trailing ':' etc.
+        return field
+
+    def parse_field_body(self, indented, offset, node):
+        self.nested_parse(indented, input_offset=offset, node=node)
+
+    def option_marker(self, match, context, next_state):
+        """Option list item."""
+        optionlist = nodes.option_list()
+        try:
+            listitem, blank_finish = self.option_list_item(match)
+        except MarkupError, (message, lineno):
+            # This shouldn't happen; pattern won't match.
+            msg = self.reporter.error(
+                'Invalid option list marker: %s' % message, line=lineno)
+            self.parent += msg
+            indented, indent, line_offset, blank_finish = \
+                  self.state_machine.get_first_known_indented(match.end())
+            elements = self.block_quote(indented, line_offset)
+            self.parent += elements
+            if not blank_finish:
+                self.parent += self.unindent_warning('Option list')
+            return [], next_state, []
+        self.parent += optionlist
+        optionlist += listitem
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=optionlist, initial_state='OptionList',
+              blank_finish=blank_finish)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Option list')
+        return [], next_state, []
+
+    def option_list_item(self, match):
+        offset = self.state_machine.abs_line_offset()
+        options = self.parse_option_marker(match)
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        if not indented:                # not an option list item
+            self.goto_line(offset)
+            raise statemachine.TransitionCorrection('text')
+        option_group = nodes.option_group('', *options)
+        description = nodes.description('\n'.join(indented))
+        option_list_item = nodes.option_list_item('', option_group,
+                                                  description)
+        if indented:
+            self.nested_parse(indented, input_offset=line_offset,
+                              node=description)
+        return option_list_item, blank_finish
+
+    def parse_option_marker(self, match):
+        """
+        Return a list of `node.option` and `node.option_argument` objects,
+        parsed from an option marker match.
+
+        :Exception: `MarkupError` for invalid option markers.
+        """
+        optlist = []
+        optionstrings = match.group().rstrip().split(', ')
+        for optionstring in optionstrings:
+            tokens = optionstring.split()
+            delimiter = ' '
+            firstopt = tokens[0].split('=')
+            if len(firstopt) > 1:
+                # "--opt=value" form
+                tokens[:1] = firstopt
+                delimiter = '='
+            elif (len(tokens[0]) > 2
+                  and ((tokens[0].startswith('-')
+                        and not tokens[0].startswith('--'))
+                       or tokens[0].startswith('+'))):
+                # "-ovalue" form
+                tokens[:1] = [tokens[0][:2], tokens[0][2:]]
+                delimiter = ''
+            if len(tokens) > 1 and (tokens[1].startswith('<')
+                                    and tokens[-1].endswith('>')):
+                # "-o <value1 value2>" form; join all values into one token
+                tokens[1:] = [' '.join(tokens[1:])]
+            if 0 < len(tokens) <= 2:
+                option = nodes.option(optionstring)
+                option += nodes.option_string(tokens[0], tokens[0])
+                if len(tokens) > 1:
+                    option += nodes.option_argument(tokens[1], tokens[1],
+                                                    delimiter=delimiter)
+                optlist.append(option)
+            else:
+                raise MarkupError(
+                    'wrong number of option tokens (=%s), should be 1 or 2: '
+                    '"%s"' % (len(tokens), optionstring),
+                    self.state_machine.abs_line_number() + 1)
+        return optlist
+
+    def doctest(self, match, context, next_state):
+        data = '\n'.join(self.state_machine.get_text_block())
+        self.parent += nodes.doctest_block(data, data)
+        return [], next_state, []
+
+    def line_block(self, match, context, next_state):
+        """First line of a line block."""
+        block = nodes.line_block()
+        self.parent += block
+        lineno = self.state_machine.abs_line_number()
+        line, messages, blank_finish = self.line_block_line(match, lineno)
+        block += line
+        self.parent += messages
+        if not blank_finish:
+            offset = self.state_machine.line_offset + 1   # next line
+            new_line_offset, blank_finish = self.nested_list_parse(
+                  self.state_machine.input_lines[offset:],
+                  input_offset=self.state_machine.abs_line_offset() + 1,
+                  node=block, initial_state='LineBlock',
+                  blank_finish=0)
+            self.goto_line(new_line_offset)
+        if not blank_finish:
+            self.parent += self.reporter.warning(
+                'Line block ends without a blank line.',
+                line=(self.state_machine.abs_line_number() + 1))
+        if len(block):
+            if block[0].indent is None:
+                block[0].indent = 0
+            self.nest_line_block_lines(block)
+        return [], next_state, []
+
+    def line_block_line(self, match, lineno):
+        """Return one line element of a line_block."""
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end(),
+                                                          until_blank=1)
+        text = u'\n'.join(indented)
+        text_nodes, messages = self.inline_text(text, lineno)
+        line = nodes.line(text, '', *text_nodes)
+        if match.string.rstrip() != '|': # not empty
+            line.indent = len(match.group(1)) - 1
+        return line, messages, blank_finish
+
+    def nest_line_block_lines(self, block):
+        for index in range(1, len(block)):
+            if block[index].indent is None:
+                block[index].indent = block[index - 1].indent
+        self.nest_line_block_segment(block)
+
+    def nest_line_block_segment(self, block):
+        indents = [item.indent for item in block]
+        least = min(indents)
+        new_items = []
+        new_block = nodes.line_block()
+        for item in block:
+            if item.indent > least:
+                new_block.append(item)
+            else:
+                if len(new_block):
+                    self.nest_line_block_segment(new_block)
+                    new_items.append(new_block)
+                    new_block = nodes.line_block()
+                new_items.append(item)
+        if len(new_block):
+            self.nest_line_block_segment(new_block)
+            new_items.append(new_block)
+        block[:] = new_items
+
+    def grid_table_top(self, match, context, next_state):
+        """Top border of a full table."""
+        return self.table_top(match, context, next_state,
+                              self.isolate_grid_table,
+                              tableparser.GridTableParser)
+
+    def simple_table_top(self, match, context, next_state):
+        """Top border of a simple table."""
+        return self.table_top(match, context, next_state,
+                              self.isolate_simple_table,
+                              tableparser.SimpleTableParser)
+
+    def table_top(self, match, context, next_state,
+                  isolate_function, parser_class):
+        """Top border of a generic table."""
+        nodelist, blank_finish = self.table(isolate_function, parser_class)
+        self.parent += nodelist
+        if not blank_finish:
+            msg = self.reporter.warning(
+                'Blank line required after table.',
+                line=self.state_machine.abs_line_number() + 1)
+            self.parent += msg
+        return [], next_state, []
+
+    def table(self, isolate_function, parser_class):
+        """Parse a table."""
+        block, messages, blank_finish = isolate_function()
+        if block:
+            try:
+                parser = parser_class()
+                tabledata = parser.parse(block)
+                tableline = (self.state_machine.abs_line_number() - len(block)
+                             + 1)
+                table = self.build_table(tabledata, tableline)
+                nodelist = [table] + messages
+            except tableparser.TableMarkupError, detail:
+                nodelist = self.malformed_table(
+                    block, ' '.join(detail.args)) + messages
+        else:
+            nodelist = messages
+        return nodelist, blank_finish
+
+    def isolate_grid_table(self):
+        messages = []
+        blank_finish = 1
+        try:
+            block = self.state_machine.get_text_block(flush_left=1)
+        except statemachine.UnexpectedIndentationError, instance:
+            block, source, lineno = instance.args
+            messages.append(self.reporter.error('Unexpected indentation.',
+                                                source=source, line=lineno))
+            blank_finish = 0
+        block.disconnect()
+        # for East Asian chars:
+        block.pad_double_width(self.double_width_pad_char)
+        width = len(block[0].strip())
+        for i in range(len(block)):
+            block[i] = block[i].strip()
+            if block[i][0] not in '+|': # check left edge
+                blank_finish = 0
+                self.state_machine.previous_line(len(block) - i)
+                del block[i:]
+                break
+        if not self.grid_table_top_pat.match(block[-1]): # find bottom
+            blank_finish = 0
+            # from second-last to third line of table:
+            for i in range(len(block) - 2, 1, -1):
+                if self.grid_table_top_pat.match(block[i]):
+                    self.state_machine.previous_line(len(block) - i + 1)
+                    del block[i+1:]
+                    break
+            else:
+                messages.extend(self.malformed_table(block))
+                return [], messages, blank_finish
+        for i in range(len(block)):     # check right edge
+            if len(block[i]) != width or block[i][-1] not in '+|':
+                messages.extend(self.malformed_table(block))
+                return [], messages, blank_finish
+        return block, messages, blank_finish
+
+    def isolate_simple_table(self):
+        start = self.state_machine.line_offset
+        lines = self.state_machine.input_lines
+        limit = len(lines) - 1
+        toplen = len(lines[start].strip())
+        pattern_match = self.simple_table_border_pat.match
+        found = 0
+        found_at = None
+        i = start + 1
+        while i <= limit:
+            line = lines[i]
+            match = pattern_match(line)
+            if match:
+                if len(line.strip()) != toplen:
+                    self.state_machine.next_line(i - start)
+                    messages = self.malformed_table(
+                        lines[start:i+1], 'Bottom/header table border does '
+                        'not match top border.')
+                    return [], messages, i == limit or not lines[i+1].strip()
+                found += 1
+                found_at = i
+                if found == 2 or i == limit or not lines[i+1].strip():
+                    end = i
+                    break
+            i += 1
+        else:                           # reached end of input_lines
+            if found:
+                extra = ' or no blank line after table bottom'
+                self.state_machine.next_line(found_at - start)
+                block = lines[start:found_at+1]
+            else:
+                extra = ''
+                self.state_machine.next_line(i - start - 1)
+                block = lines[start:]
+            messages = self.malformed_table(
+                block, 'No bottom table border found%s.' % extra)
+            return [], messages, not extra
+        self.state_machine.next_line(end - start)
+        block = lines[start:end+1]
+        # for East Asian chars:
+        block.pad_double_width(self.double_width_pad_char)
+        return block, [], end == limit or not lines[end+1].strip()
+
+    def malformed_table(self, block, detail=''):
+        block.replace(self.double_width_pad_char, '')
+        data = '\n'.join(block)
+        message = 'Malformed table.'
+        lineno = self.state_machine.abs_line_number() - len(block) + 1
+        if detail:
+            message += '\n' + detail
+        error = self.reporter.error(message, nodes.literal_block(data, data),
+                                    line=lineno)
+        return [error]
+
+    def build_table(self, tabledata, tableline, stub_columns=0):
+        colwidths, headrows, bodyrows = tabledata
+        table = nodes.table()
+        tgroup = nodes.tgroup(cols=len(colwidths))
+        table += tgroup
+        for colwidth in colwidths:
+            colspec = nodes.colspec(colwidth=colwidth)
+            if stub_columns:
+                colspec.attributes['stub'] = 1
+                stub_columns -= 1
+            tgroup += colspec
+        if headrows:
+            thead = nodes.thead()
+            tgroup += thead
+            for row in headrows:
+                thead += self.build_table_row(row, tableline)
+        tbody = nodes.tbody()
+        tgroup += tbody
+        for row in bodyrows:
+            tbody += self.build_table_row(row, tableline)
+        return table
+
+    def build_table_row(self, rowdata, tableline):
+        row = nodes.row()
+        for cell in rowdata:
+            if cell is None:
+                continue
+            morerows, morecols, offset, cellblock = cell
+            attributes = {}
+            if morerows:
+                attributes['morerows'] = morerows
+            if morecols:
+                attributes['morecols'] = morecols
+            entry = nodes.entry(**attributes)
+            row += entry
+            if ''.join(cellblock):
+                self.nested_parse(cellblock, input_offset=tableline+offset,
+                                  node=entry)
+        return row
+
+
+    explicit = Struct()
+    """Patterns and constants used for explicit markup recognition."""
+
+    explicit.patterns = Struct(
+          target=re.compile(r"""
+                            (
+                              _               # anonymous target
+                            |               # *OR*
+                              (?!_)           # no underscore at the beginning
+                              (?P<quote>`?)   # optional open quote
+                              (?![ `])        # first char. not space or
+                                              # backquote
+                              (?P<name>       # reference name
+                                .+?
+                              )
+                              %(non_whitespace_escape_before)s
+                              (?P=quote)      # close quote if open quote used
+                            )
+                            (?<!(?<!\x00):) # no unescaped colon at end
+                            %(non_whitespace_escape_before)s
+                            [ ]?            # optional space
+                            :               # end of reference name
+                            ([ ]+|$)        # followed by whitespace
+                            """ % vars(Inliner), re.VERBOSE),
+          reference=re.compile(r"""
+                               (
+                                 (?P<simple>%(simplename)s)_
+                               |                  # *OR*
+                                 `                  # open backquote
+                                 (?![ ])            # not space
+                                 (?P<phrase>.+?)    # hyperlink phrase
+                                 %(non_whitespace_escape_before)s
+                                 `_                 # close backquote,
+                                                    # reference mark
+                               )
+                               $                  # end of string
+                               """ % vars(Inliner), re.VERBOSE | re.UNICODE),
+          substitution=re.compile(r"""
+                                  (
+                                    (?![ ])          # first char. not space
+                                    (?P<name>.+?)    # substitution text
+                                    %(non_whitespace_escape_before)s
+                                    \|               # close delimiter
+                                  )
+                                  ([ ]+|$)           # followed by whitespace
+                                  """ % vars(Inliner), re.VERBOSE),)
+
+    def footnote(self, match):
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        label = match.group(1)
+        name = normalize_name(label)
+        footnote = nodes.footnote('\n'.join(indented))
+        footnote.line = lineno
+        if name[0] == '#':              # auto-numbered
+            name = name[1:]             # autonumber label
+            footnote['auto'] = 1
+            if name:
+                footnote['names'].append(name)
+            self.document.note_autofootnote(footnote)
+        elif name == '*':               # auto-symbol
+            name = ''
+            footnote['auto'] = '*'
+            self.document.note_symbol_footnote(footnote)
+        else:                           # manually numbered
+            footnote += nodes.label('', label)
+            footnote['names'].append(name)
+            self.document.note_footnote(footnote)
+        if name:
+            self.document.note_explicit_target(footnote, footnote)
+        else:
+            self.document.set_id(footnote, footnote)
+        if indented:
+            self.nested_parse(indented, input_offset=offset, node=footnote)
+        return [footnote], blank_finish
+
+    def citation(self, match):
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        label = match.group(1)
+        name = normalize_name(label)
+        citation = nodes.citation('\n'.join(indented))
+        citation.line = lineno
+        citation += nodes.label('', label)
+        citation['names'].append(name)
+        self.document.note_citation(citation)
+        self.document.note_explicit_target(citation, citation)
+        if indented:
+            self.nested_parse(indented, input_offset=offset, node=citation)
+        return [citation], blank_finish
+
+    def hyperlink_target(self, match):
+        pattern = self.explicit.patterns.target
+        lineno = self.state_machine.abs_line_number()
+        block, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(
+              match.end(), until_blank=1, strip_indent=0)
+        blocktext = match.string[:match.end()] + '\n'.join(block)
+        block = [escape2null(line) for line in block]
+        escaped = block[0]
+        blockindex = 0
+        while 1:
+            targetmatch = pattern.match(escaped)
+            if targetmatch:
+                break
+            blockindex += 1
+            try:
+                escaped += block[blockindex]
+            except IndexError:
+                raise MarkupError('malformed hyperlink target.', lineno)
+        del block[:blockindex]
+        block[0] = (block[0] + ' ')[targetmatch.end()-len(escaped)-1:].strip()
+        target = self.make_target(block, blocktext, lineno,
+                                  targetmatch.group('name'))
+        return [target], blank_finish
+
+    def make_target(self, block, block_text, lineno, target_name):
+        target_type, data = self.parse_target(block, block_text, lineno)
+        if target_type == 'refname':
+            target = nodes.target(block_text, '', refname=normalize_name(data))
+            target.indirect_reference_name = data
+            self.add_target(target_name, '', target, lineno)
+            self.document.note_indirect_target(target)
+            return target
+        elif target_type == 'refuri':
+            target = nodes.target(block_text, '')
+            self.add_target(target_name, data, target, lineno)
+            return target
+        else:
+            return data
+
+    def parse_target(self, block, block_text, lineno):
+        """
+        Determine the type of reference of a target.
+
+        :Return: A 2-tuple, one of:
+
+            - 'refname' and the indirect reference name
+            - 'refuri' and the URI
+            - 'malformed' and a system_message node
+        """
+        if block and block[-1].strip()[-1:] == '_': # possible indirect target
+            reference = ' '.join([line.strip() for line in block])
+            refname = self.is_reference(reference)
+            if refname:
+                return 'refname', refname
+        reference = ''.join([''.join(line.split()) for line in block])
+        return 'refuri', unescape(reference)
+
+    def is_reference(self, reference):
+        match = self.explicit.patterns.reference.match(
+            whitespace_normalize_name(reference))
+        if not match:
+            return None
+        return unescape(match.group('simple') or match.group('phrase'))
+
+    def add_target(self, targetname, refuri, target, lineno):
+        target.line = lineno
+        if targetname:
+            name = normalize_name(unescape(targetname))
+            target['names'].append(name)
+            if refuri:
+                uri = self.inliner.adjust_uri(refuri)
+                if uri:
+                    target['refuri'] = uri
+                else:
+                    raise ApplicationError('problem with URI: %r' % refuri)
+            self.document.note_explicit_target(target, self.parent)
+        else:                       # anonymous target
+            if refuri:
+                target['refuri'] = refuri
+            target['anonymous'] = 1
+            self.document.note_anonymous_target(target)
+
+    def substitution_def(self, match):
+        pattern = self.explicit.patterns.substitution
+        lineno = self.state_machine.abs_line_number()
+        block, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end(),
+                                                          strip_indent=0)
+        blocktext = (match.string[:match.end()] + '\n'.join(block))
+        block.disconnect()
+        escaped = escape2null(block[0].rstrip())
+        blockindex = 0
+        while 1:
+            subdefmatch = pattern.match(escaped)
+            if subdefmatch:
+                break
+            blockindex += 1
+            try:
+                escaped = escaped + ' ' + escape2null(block[blockindex].strip())
+            except IndexError:
+                raise MarkupError('malformed substitution definition.',
+                                  lineno)
+        del block[:blockindex]          # strip out the substitution marker
+        block[0] = (block[0].strip() + ' ')[subdefmatch.end()-len(escaped)-1:-1]
+        if not block[0]:
+            del block[0]
+            offset += 1
+        while block and not block[-1].strip():
+            block.pop()
+        subname = subdefmatch.group('name')
+        substitution_node = nodes.substitution_definition(blocktext)
+        substitution_node.line = lineno
+        if not block:
+            msg = self.reporter.warning(
+                'Substitution definition "%s" missing contents.' % subname,
+                nodes.literal_block(blocktext, blocktext), line=lineno)
+            return [msg], blank_finish
+        block[0] = block[0].strip()
+        substitution_node['names'].append(
+            nodes.whitespace_normalize_name(subname))
+        new_abs_offset, blank_finish = self.nested_list_parse(
+              block, input_offset=offset, node=substitution_node,
+              initial_state='SubstitutionDef', blank_finish=blank_finish)
+        i = 0
+        for node in substitution_node[:]:
+            if not (isinstance(node, nodes.Inline) or
+                    isinstance(node, nodes.Text)):
+                self.parent += substitution_node[i]
+                del substitution_node[i]
+            else:
+                i += 1
+        for node in substitution_node.traverse(nodes.Element):
+            if self.disallowed_inside_substitution_definitions(node):
+                pformat = nodes.literal_block('', node.pformat().rstrip())
+                msg = self.reporter.error(
+                    'Substitution definition contains illegal element:',
+                    pformat, nodes.literal_block(blocktext, blocktext),
+                    line=lineno)
+                return [msg], blank_finish
+        if len(substitution_node) == 0:
+            msg = self.reporter.warning(
+                  'Substitution definition "%s" empty or invalid.'
+                  % subname,
+                  nodes.literal_block(blocktext, blocktext), line=lineno)
+            return [msg], blank_finish
+        self.document.note_substitution_def(
+            substitution_node, subname, self.parent)
+        return [substitution_node], blank_finish
+
+    def disallowed_inside_substitution_definitions(self, node):
+        if (node['ids'] or
+            isinstance(node, nodes.reference) and node.get('anonymous') or
+            isinstance(node, nodes.footnote_reference) and node.get('auto')):
+            return 1
+        else:
+            return 0
+
+    def directive(self, match, **option_presets):
+        """Returns a 2-tuple: list of nodes, and a "blank finish" boolean."""
+        type_name = match.group(1)
+        directive_class, messages = directives.directive(
+            type_name, self.memo.language, self.document)
+        self.parent += messages
+        if directive_class:
+            return self.run_directive(
+                directive_class, match, type_name, option_presets)
+        else:
+            return self.unknown_directive(type_name)
+
+    def run_directive(self, directive, match, type_name, option_presets):
+        """
+        Parse a directive then run its directive function.
+
+        Parameters:
+
+        - `directive`: The class implementing the directive.  Must be
+          a subclass of `rst.Directive`.
+
+        - `match`: A regular expression match object which matched the first
+          line of the directive.
+
+        - `type_name`: The directive name, as used in the source text.
+
+        - `option_presets`: A dictionary of preset options, defaults for the
+          directive options.  Currently, only an "alt" option is passed by
+          substitution definitions (value: the substitution name), which may
+          be used by an embedded image directive.
+
+        Returns a 2-tuple: list of nodes, and a "blank finish" boolean.
+        """
+        if isinstance(directive, (FunctionType, MethodType)):
+            from docutils.parsers.rst import convert_directive_function
+            directive = convert_directive_function(directive)
+        lineno = self.state_machine.abs_line_number()
+        initial_line_offset = self.state_machine.line_offset
+        indented, indent, line_offset, blank_finish \
+                  = self.state_machine.get_first_known_indented(match.end(),
+                                                                strip_top=0)
+        block_text = '\n'.join(self.state_machine.input_lines[
+            initial_line_offset : self.state_machine.line_offset + 1])
+        try:
+            arguments, options, content, content_offset = (
+                self.parse_directive_block(indented, line_offset,
+                                           directive, option_presets))
+        except MarkupError, detail:
+            error = self.reporter.error(
+                'Error in "%s" directive:\n%s.' % (type_name,
+                                                   ' '.join(detail.args)),
+                nodes.literal_block(block_text, block_text), line=lineno)
+            return [error], blank_finish
+        directive_instance = directive(
+            type_name, arguments, options, content, lineno,
+            content_offset, block_text, self, self.state_machine)
+        try:
+            result = directive_instance.run()
+        except docutils.parsers.rst.DirectiveError, directive_error:
+            msg_node = self.reporter.system_message(directive_error.level,
+                                                    directive_error.message)
+            msg_node += nodes.literal_block(block_text, block_text)
+            msg_node['line'] = lineno
+            result = [msg_node]
+        assert isinstance(result, list), \
+               'Directive "%s" must return a list of nodes.' % type_name
+        for i in range(len(result)):
+            assert isinstance(result[i], nodes.Node), \
+                   ('Directive "%s" returned non-Node object (index %s): %r'
+                    % (type_name, i, result[i]))
+        return (result,
+                blank_finish or self.state_machine.is_next_line_blank())
+
+    def parse_directive_block(self, indented, line_offset, directive,
+                              option_presets):
+        option_spec = directive.option_spec
+        has_content = directive.has_content
+        if indented and not indented[0].strip():
+            indented.trim_start()
+            line_offset += 1
+        while indented and not indented[-1].strip():
+            indented.trim_end()
+        if indented and (directive.required_arguments
+                         or directive.optional_arguments
+                         or option_spec):
+            for i in range(len(indented)):
+                if not indented[i].strip():
+                    break
+            else:
+                i += 1
+            arg_block = indented[:i]
+            content = indented[i+1:]
+            content_offset = line_offset + i + 1
+        else:
+            content = indented
+            content_offset = line_offset
+            arg_block = []
+        while content and not content[0].strip():
+            content.trim_start()
+            content_offset += 1
+        if option_spec:
+            options, arg_block = self.parse_directive_options(
+                option_presets, option_spec, arg_block)
+            if arg_block and not (directive.required_arguments
+                                  or directive.optional_arguments):
+                raise MarkupError('no arguments permitted; blank line '
+                                  'required before content block')
+        else:
+            options = {}
+        if directive.required_arguments or directive.optional_arguments:
+            arguments = self.parse_directive_arguments(
+                directive, arg_block)
+        else:
+            arguments = []
+        if content and not has_content:
+            raise MarkupError('no content permitted')
+        return (arguments, options, content, content_offset)
+
+    def parse_directive_options(self, option_presets, option_spec, arg_block):
+        options = option_presets.copy()
+        for i in range(len(arg_block)):
+            if arg_block[i][:1] == ':':
+                opt_block = arg_block[i:]
+                arg_block = arg_block[:i]
+                break
+        else:
+            opt_block = []
+        if opt_block:
+            success, data = self.parse_extension_options(option_spec,
+                                                         opt_block)
+            if success:                 # data is a dict of options
+                options.update(data)
+            else:                       # data is an error string
+                raise MarkupError(data)
+        return options, arg_block
+
+    def parse_directive_arguments(self, directive, arg_block):
+        required = directive.required_arguments
+        optional = directive.optional_arguments
+        arg_text = '\n'.join(arg_block)
+        arguments = arg_text.split()
+        if len(arguments) < required:
+            raise MarkupError('%s argument(s) required, %s supplied'
+                              % (required, len(arguments)))
+        elif len(arguments) > required + optional:
+            if directive.final_argument_whitespace:
+                arguments = arg_text.split(None, required + optional - 1)
+            else:
+                raise MarkupError(
+                    'maximum %s argument(s) allowed, %s supplied'
+                    % (required + optional, len(arguments)))
+        return arguments
+
+    def parse_extension_options(self, option_spec, datalines):
+        """
+        Parse `datalines` for a field list containing extension options
+        matching `option_spec`.
+
+        :Parameters:
+            - `option_spec`: a mapping of option name to conversion
+              function, which should raise an exception on bad input.
+            - `datalines`: a list of input strings.
+
+        :Return:
+            - Success value, 1 or 0.
+            - An option dictionary on success, an error string on failure.
+        """
+        node = nodes.field_list()
+        newline_offset, blank_finish = self.nested_list_parse(
+              datalines, 0, node, initial_state='ExtensionOptions',
+              blank_finish=1)
+        if newline_offset != len(datalines): # incomplete parse of block
+            return 0, 'invalid option block'
+        try:
+            options = utils.extract_extension_options(node, option_spec)
+        except KeyError, detail:
+            return 0, ('unknown option: "%s"' % detail.args[0])
+        except (ValueError, TypeError), detail:
+            return 0, ('invalid option value: %s' % ' '.join(detail.args))
+        except utils.ExtensionOptionError, detail:
+            return 0, ('invalid option data: %s' % ' '.join(detail.args))
+        if blank_finish:
+            return 1, options
+        else:
+            return 0, 'option data incompletely parsed'
+
+    def unknown_directive(self, type_name):
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(0, strip_indent=0)
+        text = '\n'.join(indented)
+        error = self.reporter.error(
+              'Unknown directive type "%s".' % type_name,
+              nodes.literal_block(text, text), line=lineno)
+        return [error], blank_finish
+
+    def comment(self, match):
+        if not match.string[match.end():].strip() \
+              and self.state_machine.is_next_line_blank(): # an empty comment?
+            return [nodes.comment()], 1 # "A tiny but practical wart."
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        while indented and not indented[-1].strip():
+            indented.trim_end()
+        text = '\n'.join(indented)
+        return [nodes.comment(text, text)], blank_finish
+
+    explicit.constructs = [
+          (footnote,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      \[
+                      (                 # footnote label:
+                          [0-9]+          # manually numbered footnote
+                        |               # *OR*
+                          \#              # anonymous auto-numbered footnote
+                        |               # *OR*
+                          \#%s            # auto-number ed?) footnote label
+                        |               # *OR*
+                          \*              # auto-symbol footnote
+                      )
+                      \]
+                      ([ ]+|$)          # whitespace or end of line
+                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE)),
+          (citation,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      \[(%s)\]          # citation label
+                      ([ ]+|$)          # whitespace or end of line
+                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE)),
+          (hyperlink_target,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      _                 # target indicator
+                      (?![ ]|$)         # first char. not space or EOL
+                      """, re.VERBOSE)),
+          (substitution_def,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      \|                # substitution indicator
+                      (?![ ]|$)         # first char. not space or EOL
+                      """, re.VERBOSE)),
+          (directive,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      (%s)              # directive name
+                      [ ]?              # optional space
+                      ::                # directive delimiter
+                      ([ ]+|$)          # whitespace or end of line
+                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE))]
+
+    def explicit_markup(self, match, context, next_state):
+        """Footnotes, hyperlink targets, directives, comments."""
+        nodelist, blank_finish = self.explicit_construct(match)
+        self.parent += nodelist
+        self.explicit_list(blank_finish)
+        return [], next_state, []
+
+    def explicit_construct(self, match):
+        """Determine which explicit construct this is, parse & return it."""
+        errors = []
+        for method, pattern in self.explicit.constructs:
+            expmatch = pattern.match(match.string)
+            if expmatch:
+                try:
+                    return method(self, expmatch)
+                except MarkupError, (message, lineno): # never reached?
+                    errors.append(self.reporter.warning(message, line=lineno))
+                    break
+        nodelist, blank_finish = self.comment(match)
+        return nodelist + errors, blank_finish
+
+    def explicit_list(self, blank_finish):
+        """
+        Create a nested state machine for a series of explicit markup
+        constructs (including anonymous hyperlink targets).
+        """
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=self.parent, initial_state='Explicit',
+              blank_finish=blank_finish,
+              match_titles=self.state_machine.match_titles)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Explicit markup')
+
+    def anonymous(self, match, context, next_state):
+        """Anonymous hyperlink targets."""
+        nodelist, blank_finish = self.anonymous_target(match)
+        self.parent += nodelist
+        self.explicit_list(blank_finish)
+        return [], next_state, []
+
+    def anonymous_target(self, match):
+        lineno = self.state_machine.abs_line_number()
+        block, indent, offset, blank_finish \
+              = self.state_machine.get_first_known_indented(match.end(),
+                                                            until_blank=1)
+        blocktext = match.string[:match.end()] + '\n'.join(block)
+        block = [escape2null(line) for line in block]
+        target = self.make_target(block, blocktext, lineno, '')
+        return [target], blank_finish
+
+    def line(self, match, context, next_state):
+        """Section title overline or transition marker."""
+        if self.state_machine.match_titles:
+            return [match.string], 'Line', []
+        elif match.string.strip() == '::':
+            raise statemachine.TransitionCorrection('text')
+        elif len(match.string.strip()) < 4:
+            msg = self.reporter.info(
+                'Unexpected possible title overline or transition.\n'
+                "Treating it as ordinary text because it's so short.",
+                line=self.state_machine.abs_line_number())
+            self.parent += msg
+            raise statemachine.TransitionCorrection('text')
+        else:
+            blocktext = self.state_machine.line
+            msg = self.reporter.severe(
+                  'Unexpected section title or transition.',
+                  nodes.literal_block(blocktext, blocktext),
+                  line=self.state_machine.abs_line_number())
+            self.parent += msg
+            return [], next_state, []
+
+    def text(self, match, context, next_state):
+        """Titles, definition lists, paragraphs."""
+        return [match.string], 'Text', []
+
+
+class RFC2822Body(Body):
+
+    """
+    RFC2822 headers are only valid as the first constructs in documents.  As
+    soon as anything else appears, the `Body` state should take over.
+    """
+
+    patterns = Body.patterns.copy()     # can't modify the original
+    patterns['rfc2822'] = r'[!-9;-~]+:( +|$)'
+    initial_transitions = [(name, 'Body')
+                           for name in Body.initial_transitions]
+    initial_transitions.insert(-1, ('rfc2822', 'Body')) # just before 'text'
+
+    def rfc2822(self, match, context, next_state):
+        """RFC2822-style field list item."""
+        fieldlist = nodes.field_list(classes=['rfc2822'])
+        self.parent += fieldlist
+        field, blank_finish = self.rfc2822_field(match)
+        fieldlist += field
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=fieldlist, initial_state='RFC2822List',
+              blank_finish=blank_finish)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning(
+                  'RFC2822-style field list')
+        return [], next_state, []
+
+    def rfc2822_field(self, match):
+        name = match.string[:match.string.find(':')]
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end(),
+                                                          until_blank=1)
+        fieldnode = nodes.field()
+        fieldnode += nodes.field_name(name, name)
+        fieldbody = nodes.field_body('\n'.join(indented))
+        fieldnode += fieldbody
+        if indented:
+            self.nested_parse(indented, input_offset=line_offset,
+                              node=fieldbody)
+        return fieldnode, blank_finish
+
+
+class SpecializedBody(Body):
+
+    """
+    Superclass for second and subsequent compound element members.  Compound
+    elements are lists and list-like constructs.
+
+    All transition methods are disabled (redefined as `invalid_input`).
+    Override individual methods in subclasses to re-enable.
+
+    For example, once an initial bullet list item, say, is recognized, the
+    `BulletList` subclass takes over, with a "bullet_list" node as its
+    container.  Upon encountering the initial bullet list item, `Body.bullet`
+    calls its ``self.nested_list_parse`` (`RSTState.nested_list_parse`), which
+    starts up a nested parsing session with `BulletList` as the initial state.
+    Only the ``bullet`` transition method is enabled in `BulletList`; as long
+    as only bullet list items are encountered, they are parsed and inserted
+    into the container.  The first construct which is *not* a bullet list item
+    triggers the `invalid_input` method, which ends the nested parse and
+    closes the container.  `BulletList` needs to recognize input that is
+    invalid in the context of a bullet list, which means everything *other
+    than* bullet list items, so it inherits the transition list created in
+    `Body`.
+    """
+
+    def invalid_input(self, match=None, context=None, next_state=None):
+        """Not a compound element member. Abort this state machine."""
+        self.state_machine.previous_line() # back up so parent SM can reassess
+        raise EOFError
+
+    indent = invalid_input
+    bullet = invalid_input
+    enumerator = invalid_input
+    field_marker = invalid_input
+    option_marker = invalid_input
+    doctest = invalid_input
+    line_block = invalid_input
+    grid_table_top = invalid_input
+    simple_table_top = invalid_input
+    explicit_markup = invalid_input
+    anonymous = invalid_input
+    line = invalid_input
+    text = invalid_input
+
+
+class BulletList(SpecializedBody):
+
+    """Second and subsequent bullet_list list_items."""
+
+    def bullet(self, match, context, next_state):
+        """Bullet list item."""
+        if match.string[0] != self.parent['bullet']:
+            # different bullet: new list
+            self.invalid_input()
+        listitem, blank_finish = self.list_item(match.end())
+        self.parent += listitem
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class DefinitionList(SpecializedBody):
+
+    """Second and subsequent definition_list_items."""
+
+    def text(self, match, context, next_state):
+        """Definition lists."""
+        return [match.string], 'Definition', []
+
+
+class EnumeratedList(SpecializedBody):
+
+    """Second and subsequent enumerated_list list_items."""
+
+    def enumerator(self, match, context, next_state):
+        """Enumerated list item."""
+        format, sequence, text, ordinal = self.parse_enumerator(
+              match, self.parent['enumtype'])
+        if ( format != self.format
+             or (sequence != '#' and (sequence != self.parent['enumtype']
+                                      or self.auto
+                                      or ordinal != (self.lastordinal + 1)))
+             or not self.is_enumerated_list_item(ordinal, sequence, format)):
+            # different enumeration: new list
+            self.invalid_input()
+        if sequence == '#':
+            self.auto = 1
+        listitem, blank_finish = self.list_item(match.end())
+        self.parent += listitem
+        self.blank_finish = blank_finish
+        self.lastordinal = ordinal
+        return [], next_state, []
+
+
+class FieldList(SpecializedBody):
+
+    """Second and subsequent field_list fields."""
+
+    def field_marker(self, match, context, next_state):
+        """Field list field."""
+        field, blank_finish = self.field(match)
+        self.parent += field
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class OptionList(SpecializedBody):
+
+    """Second and subsequent option_list option_list_items."""
+
+    def option_marker(self, match, context, next_state):
+        """Option list item."""
+        try:
+            option_list_item, blank_finish = self.option_list_item(match)
+        except MarkupError, (message, lineno):
+            self.invalid_input()
+        self.parent += option_list_item
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class RFC2822List(SpecializedBody, RFC2822Body):
+
+    """Second and subsequent RFC2822-style field_list fields."""
+
+    patterns = RFC2822Body.patterns
+    initial_transitions = RFC2822Body.initial_transitions
+
+    def rfc2822(self, match, context, next_state):
+        """RFC2822-style field list item."""
+        field, blank_finish = self.rfc2822_field(match)
+        self.parent += field
+        self.blank_finish = blank_finish
+        return [], 'RFC2822List', []
+
+    blank = SpecializedBody.invalid_input
+
+
+class ExtensionOptions(FieldList):
+
+    """
+    Parse field_list fields for extension options.
+
+    No nested parsing is done (including inline markup parsing).
+    """
+
+    def parse_field_body(self, indented, offset, node):
+        """Override `Body.parse_field_body` for simpler parsing."""
+        lines = []
+        for line in list(indented) + ['']:
+            if line.strip():
+                lines.append(line)
+            elif lines:
+                text = '\n'.join(lines)
+                node += nodes.paragraph(text, text)
+                lines = []
+
+
+class LineBlock(SpecializedBody):
+
+    """Second and subsequent lines of a line_block."""
+
+    blank = SpecializedBody.invalid_input
+
+    def line_block(self, match, context, next_state):
+        """New line of line block."""
+        lineno = self.state_machine.abs_line_number()
+        line, messages, blank_finish = self.line_block_line(match, lineno)
+        self.parent += line
+        self.parent.parent += messages
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class Explicit(SpecializedBody):
+
+    """Second and subsequent explicit markup construct."""
+
+    def explicit_markup(self, match, context, next_state):
+        """Footnotes, hyperlink targets, directives, comments."""
+        nodelist, blank_finish = self.explicit_construct(match)
+        self.parent += nodelist
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+    def anonymous(self, match, context, next_state):
+        """Anonymous hyperlink targets."""
+        nodelist, blank_finish = self.anonymous_target(match)
+        self.parent += nodelist
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+    blank = SpecializedBody.invalid_input
+
+
+class SubstitutionDef(Body):
+
+    """
+    Parser for the contents of a substitution_definition element.
+    """
+
+    patterns = {
+          'embedded_directive': re.compile(r'(%s)::( +|$)'
+                                           % Inliner.simplename, re.UNICODE),
+          'text': r''}
+    initial_transitions = ['embedded_directive', 'text']
+
+    def embedded_directive(self, match, context, next_state):
+        nodelist, blank_finish = self.directive(match,
+                                                alt=self.parent['names'][0])
+        self.parent += nodelist
+        if not self.state_machine.at_eof():
+            self.blank_finish = blank_finish
+        raise EOFError
+
+    def text(self, match, context, next_state):
+        if not self.state_machine.at_eof():
+            self.blank_finish = self.state_machine.is_next_line_blank()
+        raise EOFError
+
+
+class Text(RSTState):
+
+    """
+    Classifier of second line of a text block.
+
+    Could be a paragraph, a definition list item, or a title.
+    """
+
+    patterns = {'underline': Body.patterns['line'],
+                'text': r''}
+    initial_transitions = [('underline', 'Body'), ('text', 'Body')]
+
+    def blank(self, match, context, next_state):
+        """End of paragraph."""
+        paragraph, literalnext = self.paragraph(
+              context, self.state_machine.abs_line_number() - 1)
+        self.parent += paragraph
+        if literalnext:
+            self.parent += self.literal_block()
+        return [], 'Body', []
+
+    def eof(self, context):
+        if context:
+            self.blank(None, context, None)
+        return []
+
+    def indent(self, match, context, next_state):
+        """Definition list item."""
+        definitionlist = nodes.definition_list()
+        definitionlistitem, blank_finish = self.definition_list_item(context)
+        definitionlist += definitionlistitem
+        self.parent += definitionlist
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=definitionlist, initial_state='DefinitionList',
+              blank_finish=blank_finish, blank_finish_state='Definition')
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Definition list')
+        return [], 'Body', []
+
+    def underline(self, match, context, next_state):
+        """Section title."""
+        lineno = self.state_machine.abs_line_number()
+        title = context[0].rstrip()
+        underline = match.string.rstrip()
+        source = title + '\n' + underline
+        messages = []
+        if column_width(title) > len(underline):
+            if len(underline) < 4:
+                if self.state_machine.match_titles:
+                    msg = self.reporter.info(
+                        'Possible title underline, too short for the title.\n'
+                        "Treating it as ordinary text because it's so short.",
+                        line=lineno)
+                    self.parent += msg
+                raise statemachine.TransitionCorrection('text')
+            else:
+                blocktext = context[0] + '\n' + self.state_machine.line
+                msg = self.reporter.warning(
+                    'Title underline too short.',
+                    nodes.literal_block(blocktext, blocktext), line=lineno)
+                messages.append(msg)
+        if not self.state_machine.match_titles:
+            blocktext = context[0] + '\n' + self.state_machine.line
+            msg = self.reporter.severe(
+                'Unexpected section title.',
+                nodes.literal_block(blocktext, blocktext), line=lineno)
+            self.parent += messages
+            self.parent += msg
+            return [], next_state, []
+        style = underline[0]
+        context[:] = []
+        self.section(title, source, style, lineno - 1, messages)
+        return [], next_state, []
+
+    def text(self, match, context, next_state):
+        """Paragraph."""
+        startline = self.state_machine.abs_line_number() - 1
+        msg = None
+        try:
+            block = self.state_machine.get_text_block(flush_left=1)
+        except statemachine.UnexpectedIndentationError, instance:
+            block, source, lineno = instance.args
+            msg = self.reporter.error('Unexpected indentation.',
+                                      source=source, line=lineno)
+        lines = context + list(block)
+        paragraph, literalnext = self.paragraph(lines, startline)
+        self.parent += paragraph
+        self.parent += msg
+        if literalnext:
+            try:
+                self.state_machine.next_line()
+            except EOFError:
+                pass
+            self.parent += self.literal_block()
+        return [], next_state, []
+
+    def literal_block(self):
+        """Return a list of nodes."""
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_indented()
+        while indented and not indented[-1].strip():
+            indented.trim_end()
+        if not indented:
+            return self.quoted_literal_block()
+        data = '\n'.join(indented)
+        literal_block = nodes.literal_block(data, data)
+        literal_block.line = offset + 1
+        nodelist = [literal_block]
+        if not blank_finish:
+            nodelist.append(self.unindent_warning('Literal block'))
+        return nodelist
+
+    def quoted_literal_block(self):
+        abs_line_offset = self.state_machine.abs_line_offset()
+        offset = self.state_machine.line_offset
+        parent_node = nodes.Element()
+        new_abs_offset = self.nested_parse(
+            self.state_machine.input_lines[offset:],
+            input_offset=abs_line_offset, node=parent_node, match_titles=0,
+            state_machine_kwargs={'state_classes': (QuotedLiteralBlock,),
+                                  'initial_state': 'QuotedLiteralBlock'})
+        self.goto_line(new_abs_offset)
+        return parent_node.children
+
+    def definition_list_item(self, termline):
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_indented()
+        definitionlistitem = nodes.definition_list_item(
+            '\n'.join(termline + list(indented)))
+        lineno = self.state_machine.abs_line_number() - 1
+        definitionlistitem.line = lineno
+        termlist, messages = self.term(termline, lineno)
+        definitionlistitem += termlist
+        definition = nodes.definition('', *messages)
+        definitionlistitem += definition
+        if termline[0][-2:] == '::':
+            definition += self.reporter.info(
+                  'Blank line missing before literal block (after the "::")? '
+                  'Interpreted as a definition list item.', line=line_offset+1)
+        self.nested_parse(indented, input_offset=line_offset, node=definition)
+        return definitionlistitem, blank_finish
+
+    classifier_delimiter = re.compile(' +: +')
+
+    def term(self, lines, lineno):
+        """Return a definition_list's term and optional classifiers."""
+        assert len(lines) == 1
+        text_nodes, messages = self.inline_text(lines[0], lineno)
+        term_node = nodes.term()
+        node_list = [term_node]
+        for i in range(len(text_nodes)):
+            node = text_nodes[i]
+            if isinstance(node, nodes.Text):
+                parts = self.classifier_delimiter.split(node.rawsource)
+                if len(parts) == 1:
+                    node_list[-1] += node
+                else:
+                    
+                    node_list[-1] += nodes.Text(parts[0].rstrip())
+                    for part in parts[1:]:
+                        classifier_node = nodes.classifier('', part)
+                        node_list.append(classifier_node)
+            else:
+                node_list[-1] += node
+        return node_list, messages
+
+
+class SpecializedText(Text):
+
+    """
+    Superclass for second and subsequent lines of Text-variants.
+
+    All transition methods are disabled. Override individual methods in
+    subclasses to re-enable.
+    """
+
+    def eof(self, context):
+        """Incomplete construct."""
+        return []
+
+    def invalid_input(self, match=None, context=None, next_state=None):
+        """Not a compound element member. Abort this state machine."""
+        raise EOFError
+
+    blank = invalid_input
+    indent = invalid_input
+    underline = invalid_input
+    text = invalid_input
+
+
+class Definition(SpecializedText):
+
+    """Second line of potential definition_list_item."""
+
+    def eof(self, context):
+        """Not a definition."""
+        self.state_machine.previous_line(2) # so parent SM can reassess
+        return []
+
+    def indent(self, match, context, next_state):
+        """Definition list item."""
+        definitionlistitem, blank_finish = self.definition_list_item(context)
+        self.parent += definitionlistitem
+        self.blank_finish = blank_finish
+        return [], 'DefinitionList', []
+
+
+class Line(SpecializedText):
+
+    """
+    Second line of over- & underlined section title or transition marker.
+    """
+
+    eofcheck = 1                        # @@@ ???
+    """Set to 0 while parsing sections, so that we don't catch the EOF."""
+
+    def eof(self, context):
+        """Transition marker at end of section or document."""
+        marker = context[0].strip()
+        if self.memo.section_bubble_up_kludge:
+            self.memo.section_bubble_up_kludge = 0
+        elif len(marker) < 4:
+            self.state_correction(context)
+        if self.eofcheck:               # ignore EOFError with sections
+            lineno = self.state_machine.abs_line_number() - 1
+            transition = nodes.transition(rawsource=context[0])
+            transition.line = lineno
+            self.parent += transition
+        self.eofcheck = 1
+        return []
+
+    def blank(self, match, context, next_state):
+        """Transition marker."""
+        lineno = self.state_machine.abs_line_number() - 1
+        marker = context[0].strip()
+        if len(marker) < 4:
+            self.state_correction(context)
+        transition = nodes.transition(rawsource=marker)
+        transition.line = lineno
+        self.parent += transition
+        return [], 'Body', []
+
+    def text(self, match, context, next_state):
+        """Potential over- & underlined title."""
+        lineno = self.state_machine.abs_line_number() - 1
+        overline = context[0]
+        title = match.string
+        underline = ''
+        try:
+            underline = self.state_machine.next_line()
+        except EOFError:
+            blocktext = overline + '\n' + title
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.severe(
+                    'Incomplete section title.',
+                    nodes.literal_block(blocktext, blocktext), line=lineno)
+                self.parent += msg
+                return [], 'Body', []
+        source = '%s\n%s\n%s' % (overline, title, underline)
+        overline = overline.rstrip()
+        underline = underline.rstrip()
+        if not self.transitions['underline'][0].match(underline):
+            blocktext = overline + '\n' + title + '\n' + underline
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.severe(
+                    'Missing matching underline for section title overline.',
+                    nodes.literal_block(source, source), line=lineno)
+                self.parent += msg
+                return [], 'Body', []
+        elif overline != underline:
+            blocktext = overline + '\n' + title + '\n' + underline
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.severe(
+                      'Title overline & underline mismatch.',
+                      nodes.literal_block(source, source), line=lineno)
+                self.parent += msg
+                return [], 'Body', []
+        title = title.rstrip()
+        messages = []
+        if column_width(title) > len(overline):
+            blocktext = overline + '\n' + title + '\n' + underline
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.warning(
+                      'Title overline too short.',
+                      nodes.literal_block(source, source), line=lineno)
+                messages.append(msg)
+        style = (overline[0], underline[0])
+        self.eofcheck = 0               # @@@ not sure this is correct
+        self.section(title.lstrip(), source, style, lineno + 1, messages)
+        self.eofcheck = 1
+        return [], 'Body', []
+
+    indent = text                       # indented title
+
+    def underline(self, match, context, next_state):
+        overline = context[0]
+        blocktext = overline + '\n' + self.state_machine.line
+        lineno = self.state_machine.abs_line_number() - 1
+        if len(overline.rstrip()) < 4:
+            self.short_overline(context, blocktext, lineno, 1)
+        msg = self.reporter.error(
+              'Invalid section title or transition marker.',
+              nodes.literal_block(blocktext, blocktext), line=lineno)
+        self.parent += msg
+        return [], 'Body', []
+
+    def short_overline(self, context, blocktext, lineno, lines=1):
+        msg = self.reporter.info(
+            'Possible incomplete section title.\nTreating the overline as '
+            "ordinary text because it's so short.", line=lineno)
+        self.parent += msg
+        self.state_correction(context, lines)
+
+    def state_correction(self, context, lines=1):
+        self.state_machine.previous_line(lines)
+        context[:] = []
+        raise statemachine.StateCorrection('Body', 'text')
+
+
+class QuotedLiteralBlock(RSTState):
+
+    """
+    Nested parse handler for quoted (unindented) literal blocks.
+
+    Special-purpose.  Not for inclusion in `state_classes`.
+    """
+
+    patterns = {'initial_quoted': r'(%(nonalphanum7bit)s)' % Body.pats,
+                'text': r''}
+    initial_transitions = ('initial_quoted', 'text')
+
+    def __init__(self, state_machine, debug=0):
+        RSTState.__init__(self, state_machine, debug)
+        self.messages = []
+        self.initial_lineno = None
+
+    def blank(self, match, context, next_state):
+        if context:
+            raise EOFError
+        else:
+            return context, next_state, []
+
+    def eof(self, context):
+        if context:
+            text = '\n'.join(context)
+            literal_block = nodes.literal_block(text, text)
+            literal_block.line = self.initial_lineno
+            self.parent += literal_block
+        else:
+            self.parent += self.reporter.warning(
+                'Literal block expected; none found.',
+                line=self.state_machine.abs_line_number())
+            self.state_machine.previous_line()
+        self.parent += self.messages
+        return []
+
+    def indent(self, match, context, next_state):
+        assert context, ('QuotedLiteralBlock.indent: context should not '
+                         'be empty!')
+        self.messages.append(
+            self.reporter.error('Unexpected indentation.',
+                                line=self.state_machine.abs_line_number()))
+        self.state_machine.previous_line()
+        raise EOFError
+
+    def initial_quoted(self, match, context, next_state):
+        """Match arbitrary quote character on the first line only."""
+        self.remove_transition('initial_quoted')
+        quote = match.string[0]
+        pattern = re.compile(re.escape(quote))
+        # New transition matches consistent quotes only:
+        self.add_transition('quoted',
+                            (pattern, self.quoted, self.__class__.__name__))
+        self.initial_lineno = self.state_machine.abs_line_number()
+        return [match.string], next_state, []
+
+    def quoted(self, match, context, next_state):
+        """Match consistent quotes on subsequent lines."""
+        context.append(match.string)
+        return context, next_state, []
+
+    def text(self, match, context, next_state):
+        if context:
+            self.messages.append(
+                self.reporter.error('Inconsistent literal block quoting.',
+                                    line=self.state_machine.abs_line_number()))
+            self.state_machine.previous_line()
+        raise EOFError
+
+
+state_classes = (Body, BulletList, DefinitionList, EnumeratedList, FieldList,
+                 OptionList, LineBlock, ExtensionOptions, Explicit, Text,
+                 Definition, Line, SubstitutionDef, RFC2822Body, RFC2822List)
+"""Standard set of State classes used to start `RSTStateMachine`."""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/tableparser.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,525 @@
+# $Id: tableparser.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This module defines table parser classes,which parse plaintext-graphic tables
+and produce a well-formed data structure suitable for building a CALS table.
+
+:Classes:
+    - `GridTableParser`: Parse fully-formed tables represented with a grid.
+    - `SimpleTableParser`: Parse simple tables, delimited by top & bottom
+      borders.
+
+:Exception class: `TableMarkupError`
+
+:Function:
+    `update_dict_of_lists()`: Merge two dictionaries containing list values.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import re
+import sys
+from docutils import DataError
+
+
+class TableMarkupError(DataError): pass
+
+
+class TableParser:
+
+    """
+    Abstract superclass for the common parts of the syntax-specific parsers.
+    """
+
+    head_body_separator_pat = None
+    """Matches the row separator between head rows and body rows."""
+
+    double_width_pad_char = '\x00'
+    """Padding character for East Asian double-width text."""
+
+    def parse(self, block):
+        """
+        Analyze the text `block` and return a table data structure.
+
+        Given a plaintext-graphic table in `block` (list of lines of text; no
+        whitespace padding), parse the table, construct and return the data
+        necessary to construct a CALS table or equivalent.
+
+        Raise `TableMarkupError` if there is any problem with the markup.
+        """
+        self.setup(block)
+        self.find_head_body_sep()
+        self.parse_table()
+        structure = self.structure_from_cells()
+        return structure
+
+    def find_head_body_sep(self):
+        """Look for a head/body row separator line; store the line index."""
+        for i in range(len(self.block)):
+            line = self.block[i]
+            if self.head_body_separator_pat.match(line):
+                if self.head_body_sep:
+                    raise TableMarkupError(
+                        'Multiple head/body row separators in table (at line '
+                        'offset %s and %s); only one allowed.'
+                        % (self.head_body_sep, i))
+                else:
+                    self.head_body_sep = i
+                    self.block[i] = line.replace('=', '-')
+        if self.head_body_sep == 0 or self.head_body_sep == (len(self.block)
+                                                             - 1):
+            raise TableMarkupError('The head/body row separator may not be '
+                                   'the first or last line of the table.')
+
+
+class GridTableParser(TableParser):
+
+    """
+    Parse a grid table using `parse()`.
+
+    Here's an example of a grid table::
+
+        +------------------------+------------+----------+----------+
+        | Header row, column 1   | Header 2   | Header 3 | Header 4 |
+        +========================+============+==========+==========+
+        | body row 1, column 1   | column 2   | column 3 | column 4 |
+        +------------------------+------------+----------+----------+
+        | body row 2             | Cells may span columns.          |
+        +------------------------+------------+---------------------+
+        | body row 3             | Cells may  | - Table cells       |
+        +------------------------+ span rows. | - contain           |
+        | body row 4             |            | - body elements.    |
+        +------------------------+------------+---------------------+
+
+    Intersections use '+', row separators use '-' (except for one optional
+    head/body row separator, which uses '='), and column separators use '|'.
+
+    Passing the above table to the `parse()` method will result in the
+    following data structure::
+
+        ([24, 12, 10, 10],
+         [[(0, 0, 1, ['Header row, column 1']),
+           (0, 0, 1, ['Header 2']),
+           (0, 0, 1, ['Header 3']),
+           (0, 0, 1, ['Header 4'])]],
+         [[(0, 0, 3, ['body row 1, column 1']),
+           (0, 0, 3, ['column 2']),
+           (0, 0, 3, ['column 3']),
+           (0, 0, 3, ['column 4'])],
+          [(0, 0, 5, ['body row 2']),
+           (0, 2, 5, ['Cells may span columns.']),
+           None,
+           None],
+          [(0, 0, 7, ['body row 3']),
+           (1, 0, 7, ['Cells may', 'span rows.', '']),
+           (1, 1, 7, ['- Table cells', '- contain', '- body elements.']),
+           None],
+          [(0, 0, 9, ['body row 4']), None, None, None]])
+
+    The first item is a list containing column widths (colspecs). The second
+    item is a list of head rows, and the third is a list of body rows. Each
+    row contains a list of cells. Each cell is either None (for a cell unused
+    because of another cell's span), or a tuple. A cell tuple contains four
+    items: the number of extra rows used by the cell in a vertical span
+    (morerows); the number of extra columns used by the cell in a horizontal
+    span (morecols); the line offset of the first line of the cell contents;
+    and the cell contents, a list of lines of text.
+    """
+
+    head_body_separator_pat = re.compile(r'\+=[=+]+=\+ *$')
+
+    def setup(self, block):
+        self.block = block[:]           # make a copy; it may be modified
+        self.block.disconnect()         # don't propagate changes to parent
+        self.bottom = len(block) - 1
+        self.right = len(block[0]) - 1
+        self.head_body_sep = None
+        self.done = [-1] * len(block[0])
+        self.cells = []
+        self.rowseps = {0: [0]}
+        self.colseps = {0: [0]}
+
+    def parse_table(self):
+        """
+        Start with a queue of upper-left corners, containing the upper-left
+        corner of the table itself. Trace out one rectangular cell, remember
+        it, and add its upper-right and lower-left corners to the queue of
+        potential upper-left corners of further cells. Process the queue in
+        top-to-bottom order, keeping track of how much of each text column has
+        been seen.
+
+        We'll end up knowing all the row and column boundaries, cell positions
+        and their dimensions.
+        """
+        corners = [(0, 0)]
+        while corners:
+            top, left = corners.pop(0)
+            if top == self.bottom or left == self.right \
+                  or top <= self.done[left]:
+                continue
+            result = self.scan_cell(top, left)
+            if not result:
+                continue
+            bottom, right, rowseps, colseps = result
+            update_dict_of_lists(self.rowseps, rowseps)
+            update_dict_of_lists(self.colseps, colseps)
+            self.mark_done(top, left, bottom, right)
+            cellblock = self.block.get_2D_block(top + 1, left + 1,
+                                                bottom, right)
+            cellblock.disconnect()      # lines in cell can't sync with parent
+            cellblock.replace(self.double_width_pad_char, '')
+            self.cells.append((top, left, bottom, right, cellblock))
+            corners.extend([(top, right), (bottom, left)])
+            corners.sort()
+        if not self.check_parse_complete():
+            raise TableMarkupError('Malformed table; parse incomplete.')
+
+    def mark_done(self, top, left, bottom, right):
+        """For keeping track of how much of each text column has been seen."""
+        before = top - 1
+        after = bottom - 1
+        for col in range(left, right):
+            assert self.done[col] == before
+            self.done[col] = after
+
+    def check_parse_complete(self):
+        """Each text column should have been completely seen."""
+        last = self.bottom - 1
+        for col in range(self.right):
+            if self.done[col] != last:
+                return None
+        return 1
+
+    def scan_cell(self, top, left):
+        """Starting at the top-left corner, start tracing out a cell."""
+        assert self.block[top][left] == '+'
+        result = self.scan_right(top, left)
+        return result
+
+    def scan_right(self, top, left):
+        """
+        Look for the top-right corner of the cell, and make note of all column
+        boundaries ('+').
+        """
+        colseps = {}
+        line = self.block[top]
+        for i in range(left + 1, self.right + 1):
+            if line[i] == '+':
+                colseps[i] = [top]
+                result = self.scan_down(top, left, i)
+                if result:
+                    bottom, rowseps, newcolseps = result
+                    update_dict_of_lists(colseps, newcolseps)
+                    return bottom, i, rowseps, colseps
+            elif line[i] != '-':
+                return None
+        return None
+
+    def scan_down(self, top, left, right):
+        """
+        Look for the bottom-right corner of the cell, making note of all row
+        boundaries.
+        """
+        rowseps = {}
+        for i in range(top + 1, self.bottom + 1):
+            if self.block[i][right] == '+':
+                rowseps[i] = [right]
+                result = self.scan_left(top, left, i, right)
+                if result:
+                    newrowseps, colseps = result
+                    update_dict_of_lists(rowseps, newrowseps)
+                    return i, rowseps, colseps
+            elif self.block[i][right] != '|':
+                return None
+        return None
+
+    def scan_left(self, top, left, bottom, right):
+        """
+        Noting column boundaries, look for the bottom-left corner of the cell.
+        It must line up with the starting point.
+        """
+        colseps = {}
+        line = self.block[bottom]
+        for i in range(right - 1, left, -1):
+            if line[i] == '+':
+                colseps[i] = [bottom]
+            elif line[i] != '-':
+                return None
+        if line[left] != '+':
+            return None
+        result = self.scan_up(top, left, bottom, right)
+        if result is not None:
+            rowseps = result
+            return rowseps, colseps
+        return None
+
+    def scan_up(self, top, left, bottom, right):
+        """
+        Noting row boundaries, see if we can return to the starting point.
+        """
+        rowseps = {}
+        for i in range(bottom - 1, top, -1):
+            if self.block[i][left] == '+':
+                rowseps[i] = [left]
+            elif self.block[i][left] != '|':
+                return None
+        return rowseps
+
+    def structure_from_cells(self):
+        """
+        From the data collected by `scan_cell()`, convert to the final data
+        structure.
+        """
+        rowseps = self.rowseps.keys()   # list of row boundaries
+        rowseps.sort()
+        rowindex = {}
+        for i in range(len(rowseps)):
+            rowindex[rowseps[i]] = i    # row boundary -> row number mapping
+        colseps = self.colseps.keys()   # list of column boundaries
+        colseps.sort()
+        colindex = {}
+        for i in range(len(colseps)):
+            colindex[colseps[i]] = i    # column boundary -> col number map
+        colspecs = [(colseps[i] - colseps[i - 1] - 1)
+                    for i in range(1, len(colseps))] # list of column widths
+        # prepare an empty table with the correct number of rows & columns
+        onerow = [None for i in range(len(colseps) - 1)]
+        rows = [onerow[:] for i in range(len(rowseps) - 1)]
+        # keep track of # of cells remaining; should reduce to zero
+        remaining = (len(rowseps) - 1) * (len(colseps) - 1)
+        for top, left, bottom, right, block in self.cells:
+            rownum = rowindex[top]
+            colnum = colindex[left]
+            assert rows[rownum][colnum] is None, (
+                  'Cell (row %s, column %s) already used.'
+                  % (rownum + 1, colnum + 1))
+            morerows = rowindex[bottom] - rownum - 1
+            morecols = colindex[right] - colnum - 1
+            remaining -= (morerows + 1) * (morecols + 1)
+            # write the cell into the table
+            rows[rownum][colnum] = (morerows, morecols, top + 1, block)
+        assert remaining == 0, 'Unused cells remaining.'
+        if self.head_body_sep:          # separate head rows from body rows
+            numheadrows = rowindex[self.head_body_sep]
+            headrows = rows[:numheadrows]
+            bodyrows = rows[numheadrows:]
+        else:
+            headrows = []
+            bodyrows = rows
+        return (colspecs, headrows, bodyrows)
+
+
+class SimpleTableParser(TableParser):
+
+    """
+    Parse a simple table using `parse()`.
+
+    Here's an example of a simple table::
+
+        =====  =====
+        col 1  col 2
+        =====  =====
+        1      Second column of row 1.
+        2      Second column of row 2.
+               Second line of paragraph.
+        3      - Second column of row 3.
+
+               - Second item in bullet
+                 list (row 3, column 2).
+        4 is a span
+        ------------
+        5
+        =====  =====
+
+    Top and bottom borders use '=', column span underlines use '-', column
+    separation is indicated with spaces.
+
+    Passing the above table to the `parse()` method will result in the
+    following data structure, whose interpretation is the same as for
+    `GridTableParser`::
+
+        ([5, 25],
+         [[(0, 0, 1, ['col 1']),
+           (0, 0, 1, ['col 2'])]],
+         [[(0, 0, 3, ['1']),
+           (0, 0, 3, ['Second column of row 1.'])],
+          [(0, 0, 4, ['2']),
+           (0, 0, 4, ['Second column of row 2.',
+                      'Second line of paragraph.'])],
+          [(0, 0, 6, ['3']),
+           (0, 0, 6, ['- Second column of row 3.',
+                      '',
+                      '- Second item in bullet',
+                      '  list (row 3, column 2).'])],
+          [(0, 1, 10, ['4 is a span'])],
+          [(0, 0, 12, ['5']),
+           (0, 0, 12, [''])]])
+    """
+
+    head_body_separator_pat = re.compile('=[ =]*$')
+    span_pat = re.compile('-[ -]*$')
+
+    def setup(self, block):
+        self.block = block[:]           # make a copy; it will be modified
+        self.block.disconnect()         # don't propagate changes to parent
+        # Convert top & bottom borders to column span underlines:
+        self.block[0] = self.block[0].replace('=', '-')
+        self.block[-1] = self.block[-1].replace('=', '-')
+        self.head_body_sep = None
+        self.columns = []
+        self.border_end = None
+        self.table = []
+        self.done = [-1] * len(block[0])
+        self.rowseps = {0: [0]}
+        self.colseps = {0: [0]}
+
+    def parse_table(self):
+        """
+        First determine the column boundaries from the top border, then
+        process rows.  Each row may consist of multiple lines; accumulate
+        lines until a row is complete.  Call `self.parse_row` to finish the
+        job.
+        """
+        # Top border must fully describe all table columns.
+        self.columns = self.parse_columns(self.block[0], 0)
+        self.border_end = self.columns[-1][1]
+        firststart, firstend = self.columns[0]
+        offset = 1                      # skip top border
+        start = 1
+        text_found = None
+        while offset < len(self.block):
+            line = self.block[offset]
+            if self.span_pat.match(line):
+                # Column span underline or border; row is complete.
+                self.parse_row(self.block[start:offset], start,
+                               (line.rstrip(), offset))
+                start = offset + 1
+                text_found = None
+            elif line[firststart:firstend].strip():
+                # First column not blank, therefore it's a new row.
+                if text_found and offset != start:
+                    self.parse_row(self.block[start:offset], start)
+                start = offset
+                text_found = 1
+            elif not text_found:
+                start = offset + 1
+            offset += 1
+
+    def parse_columns(self, line, offset):
+        """
+        Given a column span underline, return a list of (begin, end) pairs.
+        """
+        cols = []
+        end = 0
+        while 1:
+            begin = line.find('-', end)
+            end = line.find(' ', begin)
+            if begin < 0:
+                break
+            if end < 0:
+                end = len(line)
+            cols.append((begin, end))
+        if self.columns:
+            if cols[-1][1] != self.border_end:
+                raise TableMarkupError('Column span incomplete at line '
+                                       'offset %s.' % offset)
+            # Allow for an unbounded rightmost column:
+            cols[-1] = (cols[-1][0], self.columns[-1][1])
+        return cols
+
+    def init_row(self, colspec, offset):
+        i = 0
+        cells = []
+        for start, end in colspec:
+            morecols = 0
+            try:
+                assert start == self.columns[i][0]
+                while end != self.columns[i][1]:
+                    i += 1
+                    morecols += 1
+            except (AssertionError, IndexError):
+                raise TableMarkupError('Column span alignment problem at '
+                                       'line offset %s.' % (offset + 1))
+            cells.append([0, morecols, offset, []])
+            i += 1
+        return cells
+
+    def parse_row(self, lines, start, spanline=None):
+        """
+        Given the text `lines` of a row, parse it and append to `self.table`.
+
+        The row is parsed according to the current column spec (either
+        `spanline` if provided or `self.columns`).  For each column, extract
+        text from each line, and check for text in column margins.  Finally,
+        adjust for insigificant whitespace.
+        """
+        if not (lines or spanline):
+            # No new row, just blank lines.
+            return
+        if spanline:
+            columns = self.parse_columns(*spanline)
+            span_offset = spanline[1]
+        else:
+            columns = self.columns[:]
+            span_offset = start
+        self.check_columns(lines, start, columns)
+        row = self.init_row(columns, start)
+        for i in range(len(columns)):
+            start, end = columns[i]
+            cellblock = lines.get_2D_block(0, start, len(lines), end)
+            cellblock.disconnect()      # lines in cell can't sync with parent
+            cellblock.replace(self.double_width_pad_char, '')
+            row[i][3] = cellblock
+        self.table.append(row)
+
+    def check_columns(self, lines, first_line, columns):
+        """
+        Check for text in column margins and text overflow in the last column.
+        Raise TableMarkupError if anything but whitespace is in column margins.
+        Adjust the end value for the last column if there is text overflow.
+        """
+        # "Infinite" value for a dummy last column's beginning, used to
+        # check for text overflow:
+        columns.append((sys.maxint, None))
+        lastcol = len(columns) - 2
+        for i in range(len(columns) - 1):
+            start, end = columns[i]
+            nextstart = columns[i+1][0]
+            offset = 0
+            for line in lines:
+                if i == lastcol and line[end:].strip():
+                    text = line[start:].rstrip()
+                    new_end = start + len(text)
+                    columns[i] = (start, new_end)
+                    main_start, main_end = self.columns[-1]
+                    if new_end > main_end:
+                        self.columns[-1] = (main_start, new_end)
+                elif line[end:nextstart].strip():
+                    raise TableMarkupError('Text in column margin at line '
+                                           'offset %s.' % (first_line + offset))
+                offset += 1
+        columns.pop()
+
+    def structure_from_cells(self):
+        colspecs = [end - start for start, end in self.columns]
+        first_body_row = 0
+        if self.head_body_sep:
+            for i in range(len(self.table)):
+                if self.table[i][0][2] > self.head_body_sep:
+                    first_body_row = i
+                    break
+        return (colspecs, self.table[:first_body_row],
+                self.table[first_body_row:])
+
+
+def update_dict_of_lists(master, newdata):
+    """
+    Extend the list values of `master` with those from `newdata`.
+
+    Both parameters must be dictionaries containing list values.
+    """
+    for key, values in newdata.items():
+        master.setdefault(key, []).extend(values)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/readers/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,107 @@
+# $Id: __init__.py 4974 2007-03-01 18:06:52Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains Docutils Reader modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils import utils, parsers, Component
+from docutils.transforms import universal
+
+
+class Reader(Component):
+
+    """
+    Abstract base class for docutils Readers.
+
+    Each reader module or package must export a subclass also called 'Reader'.
+
+    The two steps of a Reader's responsibility are `scan()` and
+    `parse()`.  Call `read()` to process a document.
+    """
+
+    component_type = 'reader'
+    config_section = 'readers'
+
+    def get_transforms(self):
+        return Component.get_transforms(self) + [
+            universal.Decorations,
+            universal.ExposeInternals,
+            universal.StripComments,]
+
+    def __init__(self, parser=None, parser_name=None):
+        """
+        Initialize the Reader instance.
+
+        Several instance attributes are defined with dummy initial values.
+        Subclasses may use these attributes as they wish.
+        """
+
+        self.parser = parser
+        """A `parsers.Parser` instance shared by all doctrees.  May be left
+        unspecified if the document source determines the parser."""
+
+        if parser is None and parser_name:
+            self.set_parser(parser_name)
+
+        self.source = None
+        """`docutils.io` IO object, source of input data."""
+
+        self.input = None
+        """Raw text input; either a single string or, for more complex cases,
+        a collection of strings."""
+
+    def set_parser(self, parser_name):
+        """Set `self.parser` by name."""
+        parser_class = parsers.get_parser_class(parser_name)
+        self.parser = parser_class()
+
+    def read(self, source, parser, settings):
+        self.source = source
+        if not self.parser:
+            self.parser = parser
+        self.settings = settings
+        self.input = self.source.read()
+        self.parse()
+        return self.document
+
+    def parse(self):
+        """Parse `self.input` into a document tree."""
+        self.document = document = self.new_document()
+        self.parser.parse(self.input, document)
+        document.current_source = document.current_line = None
+
+    def new_document(self):
+        """Create and return a new empty document tree (root node)."""
+        document = utils.new_document(self.source.source_path, self.settings)
+        return document
+
+
+class ReReader(Reader):
+
+    """
+    A reader which rereads an existing document tree (e.g. a
+    deserializer).
+
+    Often used in conjunction with `writers.UnfilteredWriter`.
+    """
+
+    def get_transforms(self):
+        # Do not add any transforms.  They have already been applied
+        # by the reader which originally created the document.
+        return Component.get_transforms(self)
+
+
+_reader_aliases = {}
+
+def get_reader_class(reader_name):
+    """Return the Reader class from the `reader_name` module."""
+    reader_name = reader_name.lower()
+    if _reader_aliases.has_key(reader_name):
+        reader_name = _reader_aliases[reader_name]
+    module = __import__(reader_name, globals(), locals())
+    return module.Reader
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/readers/doctree.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,46 @@
+# $Id: doctree.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: Martin Blais <blais@furius.ca>
+# Copyright: This module has been placed in the public domain.
+
+"""Reader for existing document trees."""
+
+from docutils import readers, utils, transforms
+
+
+class Reader(readers.ReReader):
+
+    """
+    Adapt the Reader API for an existing document tree.
+
+    The existing document tree must be passed as the ``source`` parameter to
+    the `docutils.core.Publisher` initializer, wrapped in a
+    `docutils.io.DocTreeInput` object::
+
+        pub = docutils.core.Publisher(
+            ..., source=docutils.io.DocTreeInput(document), ...)
+
+    The original document settings are overridden; if you want to use the
+    settings of the original document, pass ``settings=document.settings`` to
+    the Publisher call above.
+    """
+
+    supported = ('doctree',)
+
+    config_section = 'doctree reader'
+    config_section_dependencies = ('readers',)
+
+    def parse(self):
+        """
+        No parsing to do; refurbish the document tree instead.
+        Overrides the inherited method.
+        """
+        self.document = self.input
+        # Create fresh Transformer object, to be populated from Writer
+        # component.
+        self.document.transformer = transforms.Transformer(self.document)
+        # Replace existing settings object with new one.
+        self.document.settings = self.settings
+        # Create fresh Reporter object because it is dependent on
+        # (new) settings.
+        self.document.reporter = utils.new_reporter(
+            self.document.get('source', ''), self.document.settings)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/readers/pep.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,48 @@
+# $Id: pep.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Python Enhancement Proposal (PEP) Reader.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils.readers import standalone
+from docutils.transforms import peps, references, misc, frontmatter
+from docutils.parsers import rst
+
+
+class Reader(standalone.Reader):
+
+    supported = ('pep',)
+    """Contexts this reader supports."""
+
+    settings_spec = (
+        'PEP Reader Option Defaults',
+        'The --pep-references and --rfc-references options (for the '
+        'reStructuredText parser) are on by default.',
+        ())
+
+    config_section = 'pep reader'
+    config_section_dependencies = ('readers', 'standalone reader')
+
+    def get_transforms(self):
+        transforms = standalone.Reader.get_transforms(self)
+        # We have PEP-specific frontmatter handling.
+        transforms.remove(frontmatter.DocTitle)
+        transforms.remove(frontmatter.SectionSubTitle)
+        transforms.remove(frontmatter.DocInfo)
+        transforms.extend([peps.Headers, peps.Contents, peps.TargetNotes])
+        return transforms
+
+    settings_default_overrides = {'pep_references': 1, 'rfc_references': 1}
+
+    inliner_class = rst.states.Inliner
+
+    def __init__(self, parser=None, parser_name=None):
+        """`parser` should be ``None``."""
+        if parser is None:
+            parser = rst.Parser(rfc2822=1, inliner=self.inliner_class())
+        standalone.Reader.__init__(self, parser, '')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/readers/python/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,127 @@
+# $Id: __init__.py 4813 2006-11-13 03:41:08Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains the Python Source Reader modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import docutils.readers
+from docutils.readers.python import moduleparser
+from docutils import parsers
+from docutils import nodes
+from docutils.readers.python import pynodes
+from docutils import readers
+
+class Reader(docutils.readers.Reader):
+
+    config_section = 'python reader'
+    config_section_dependencies = ('readers',)
+
+    default_parser = 'restructuredtext'
+
+    def parse(self):
+        """Parse `self.input` into a document tree."""
+        self.document = document = self.new_document()
+        module_section = moduleparser.parse_module(self.input,
+                                                   self.source.source_path)
+        module_section.walk(DocformatVisitor(self.document))
+        visitor = DocstringFormattingVisitor(
+            document=document,
+            default_parser=self.default_parser)
+        module_section.walk(visitor)
+        self.document.append(module_section)
+
+
+class DocformatVisitor(nodes.SparseNodeVisitor):
+
+    """
+    This sets docformat attributes in a module.  Wherever an assignment
+    to __docformat__ is found, we look for the enclosing scope -- a class,
+    a module, or a function -- and set the docformat attribute there.
+
+    We can't do this during the DocstringFormattingVisitor walking,
+    because __docformat__ may appear below a docstring in that format
+    (typically below the module docstring).
+    """
+
+    def visit_attribute(self, node):
+        assert isinstance(node[0], pynodes.object_name)
+        name = node[0][0].data
+        if name != '__docformat__':
+            return
+        value = None
+        for child in children:
+            if isinstance(child, pynodes.expression_value):
+                value = child[0].data
+                break
+        assert value.startswith("'") or value.startswith('"'), "__docformat__ must be assigned a string literal (not %s); line: %s" % (value, node['lineno'])
+        name = name[1:-1]
+        looking_in = node.parent
+        while not isinstance(looking_in, (pynodes.module_section,
+                                          pynodes.function_section,
+                                          pynodes.class_section)):
+            looking_in = looking_in.parent
+        looking_in['docformat'] = name
+
+
+class DocstringFormattingVisitor(nodes.SparseNodeVisitor):
+
+    def __init__(self, document, default_parser):
+        self.document = document
+        self.default_parser = default_parser
+        self.parsers = {}
+
+    def visit_docstring(self, node):
+        text = node[0].data
+        docformat = self.find_docformat(node)
+        del node[0]
+        node['docformat'] = docformat
+        parser = self.get_parser(docformat)
+        parser.parse(text, self.document)
+        for child in self.document.children:
+            node.append(child)
+        self.document.current_source = self.document.current_line = None
+        del self.document[:]
+
+    def get_parser(self, parser_name):
+        """
+        Get a parser based on its name.  We reuse parsers during this
+        visitation, so parser instances are cached.
+        """
+        parser_name = parsers._parser_aliases.get(parser_name, parser_name)
+        if not self.parsers.has_key(parser_name):
+            cls = parsers.get_parser_class(parser_name)
+            self.parsers[parser_name] = cls()
+        return self.parsers[parser_name]
+
+    def find_docformat(self, node):
+        """
+        Find the __docformat__ closest to this node (i.e., look in the
+        class or module)
+        """
+        while node:
+            if node.get('docformat'):
+                return node['docformat']
+            node = node.parent
+        return self.default_parser
+
+
+if __name__ == '__main__':
+    try:
+        import locale
+        locale.setlocale(locale.LC_ALL, '')
+    except:
+        pass
+
+    from docutils.core import publish_cmdline, default_description
+
+    description = ('Generates pseudo-XML from Python modules '
+                   '(for testing purposes).  ' + default_description)
+
+    publish_cmdline(description=description,
+                    reader=Reader())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/readers/python/moduleparser.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,758 @@
+# $Id: moduleparser.py 4813 2006-11-13 03:41:08Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Parser for Python modules.
+
+The `parse_module()` function takes a module's text and file name,
+runs it through the module parser (using compiler.py and tokenize.py)
+and produces a parse tree of the source code, using the nodes as found
+in pynodes.py.  For example, given this module (x.py)::
+
+    # comment
+
+    '''Docstring'''
+
+    '''Additional docstring'''
+
+    __docformat__ = 'reStructuredText'
+
+    a = 1
+    '''Attribute docstring'''
+
+    class C(Super):
+
+        '''C's docstring'''
+
+        class_attribute = 1
+        '''class_attribute's docstring'''
+
+        def __init__(self, text=None):
+            '''__init__'s docstring'''
+
+            self.instance_attribute = (text * 7
+                                       + ' whaddyaknow')
+            '''instance_attribute's docstring'''
+
+
+    def f(x,                            # parameter x
+          y=a*5,                        # parameter y
+          *args):                       # parameter args
+        '''f's docstring'''
+        return [x + item for item in args]
+
+    f.function_attribute = 1
+    '''f.function_attribute's docstring'''
+
+The module parser will produce this module documentation tree::
+
+    <module_section filename="test data">
+        <docstring>
+            Docstring
+        <docstring lineno="5">
+            Additional docstring
+        <attribute lineno="7">
+	    <object_name>
+	        __docformat__
+            <expression_value lineno="7">
+                'reStructuredText'
+        <attribute lineno="9">
+	    <object_name>
+	        a
+            <expression_value lineno="9">
+                1
+            <docstring lineno="10">
+                Attribute docstring
+        <class_section lineno="12">
+	    <object_name>
+	        C
+            <class_base>
+	        Super
+            <docstring lineno="12">
+                C's docstring
+            <attribute lineno="16">
+	        <object_name>
+		    class_attribute
+                <expression_value lineno="16">
+                    1
+                <docstring lineno="17">
+                    class_attribute's docstring
+            <method_section lineno="19">
+	        <object_name>
+		    __init__
+                <docstring lineno="19">
+                    __init__'s docstring
+                <parameter_list lineno="19">
+                    <parameter lineno="19">
+		        <object_name>
+			    self
+                    <parameter lineno="19">
+		        <object_name>
+			    text
+                        <parameter_default lineno="19">
+                            None
+                <attribute lineno="22">
+		    <object_name>
+		        self.instance_attribute
+                    <expression_value lineno="22">
+                        (text * 7 + ' whaddyaknow')
+                    <docstring lineno="24">
+                        instance_attribute's docstring
+        <function_section lineno="27">
+	    <object_name>
+	        f
+            <docstring lineno="27">
+                f's docstring
+            <parameter_list lineno="27">
+                <parameter lineno="27">
+		    <object_name>
+		        x
+                    <comment>
+                        # parameter x
+                <parameter lineno="27">
+		    <object_name>
+		        y
+                    <parameter_default lineno="27">
+                        a * 5
+                    <comment>
+                        # parameter y
+                <parameter excess_positional="1" lineno="27">
+		    <object_name>
+		        args
+                    <comment>
+                        # parameter args
+        <attribute lineno="33">
+	    <object_name>
+	        f.function_attribute
+            <expression_value lineno="33">
+                1
+            <docstring lineno="34">
+                f.function_attribute's docstring
+
+(Comments are not implemented yet.)
+
+compiler.parse() provides most of what's needed for this doctree, and
+"tokenize" can be used to get the rest.  We can determine the line
+number from the compiler.parse() AST, and the TokenParser.rhs(lineno)
+method provides the rest.
+
+The Docutils Python reader component will transform this module doctree into a
+Python-specific Docutils doctree, and then a "stylist transform" will
+further transform it into a generic doctree.  Namespaces will have to be
+compiled for each of the scopes, but I'm not certain at what stage of
+processing.
+
+It's very important to keep all docstring processing out of this, so that it's
+a completely generic and not tool-specific.
+
+::
+
+> Why perform all of those transformations?  Why not go from the AST to a
+> generic doctree?  Or, even from the AST to the final output?
+
+I want the docutils.readers.python.moduleparser.parse_module() function to
+produce a standard documentation-oriented tree that can be used by any tool.
+We can develop it together without having to compromise on the rest of our
+design (i.e., HappyDoc doesn't have to be made to work like Docutils, and
+vice-versa).  It would be a higher-level version of what compiler.py provides.
+
+The Python reader component transforms this generic AST into a Python-specific
+doctree (it knows about modules, classes, functions, etc.), but this is
+specific to Docutils and cannot be used by HappyDoc or others.  The stylist
+transform does the final layout, converting Python-specific structures
+("class" sections, etc.) into a generic doctree using primitives (tables,
+sections, lists, etc.).  This generic doctree does *not* know about Python
+structures any more.  The advantage is that this doctree can be handed off to
+any of the output writers to create any output format we like.
+
+The latter two transforms are separate because I want to be able to have
+multiple independent layout styles (multiple runtime-selectable "stylist
+transforms").  Each of the existing tools (HappyDoc, pydoc, epydoc, Crystal,
+etc.) has its own fixed format.  I personally don't like the tables-based
+format produced by these tools, and I'd like to be able to customize the
+format easily.  That's the goal of stylist transforms, which are independent
+from the Reader component itself.  One stylist transform could produce
+HappyDoc-like output, another could produce output similar to module docs in
+the Python library reference manual, and so on.
+
+It's for exactly this reason::
+
+>> It's very important to keep all docstring processing out of this, so that
+>> it's a completely generic and not tool-specific.
+
+... but it goes past docstring processing.  It's also important to keep style
+decisions and tool-specific data transforms out of this module parser.
+
+
+Issues
+======
+
+* At what point should namespaces be computed?  Should they be part of the
+  basic AST produced by the ASTVisitor walk, or generated by another tree
+  traversal?
+
+* At what point should a distinction be made between local variables &
+  instance attributes in __init__ methods?
+
+* Docstrings are getting their lineno from their parents.  Should the
+  TokenParser find the real line no's?
+
+* Comments: include them?  How and when?  Only full-line comments, or
+  parameter comments too?  (See function "f" above for an example.)
+
+* Module could use more docstrings & refactoring in places.
+
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import compiler
+import compiler.ast
+import tokenize
+import token
+from compiler.consts import OP_ASSIGN
+from compiler.visitor import ASTVisitor
+from types import StringType, UnicodeType, TupleType
+from docutils.readers.python import pynodes
+from docutils.nodes import Text
+
+
+def parse_module(module_text, filename):
+    """Return a module documentation tree from `module_text`."""
+    ast = compiler.parse(module_text)
+    token_parser = TokenParser(module_text)
+    visitor = ModuleVisitor(filename, token_parser)
+    compiler.walk(ast, visitor, walker=visitor)
+    return visitor.module
+
+class BaseVisitor(ASTVisitor):
+
+    def __init__(self, token_parser):
+        ASTVisitor.__init__(self)
+        self.token_parser = token_parser
+        self.context = []
+        self.documentable = None
+
+    def default(self, node, *args):
+        self.documentable = None
+        #print 'in default (%s)' % node.__class__.__name__
+        #ASTVisitor.default(self, node, *args)
+
+    def default_visit(self, node, *args):
+        #print 'in default_visit (%s)' % node.__class__.__name__
+        ASTVisitor.default(self, node, *args)
+
+
+class DocstringVisitor(BaseVisitor):
+
+    def visitDiscard(self, node):
+        if self.documentable:
+            self.visit(node.expr)
+
+    def visitConst(self, node):
+        if self.documentable:
+            if type(node.value) in (StringType, UnicodeType):
+                self.documentable.append(make_docstring(node.value, node.lineno))
+            else:
+                self.documentable = None
+
+    def visitStmt(self, node):
+        self.default_visit(node)
+
+
+class AssignmentVisitor(DocstringVisitor):
+
+    def visitAssign(self, node):
+        visitor = AttributeVisitor(self.token_parser)
+        compiler.walk(node, visitor, walker=visitor)
+        if visitor.attributes:
+            self.context[-1].extend(visitor.attributes)
+        if len(visitor.attributes) == 1:
+            self.documentable = visitor.attributes[0]
+        else:
+            self.documentable = None
+
+
+class ModuleVisitor(AssignmentVisitor):
+
+    def __init__(self, filename, token_parser):
+        AssignmentVisitor.__init__(self, token_parser)
+        self.filename = filename
+        self.module = None
+
+    def visitModule(self, node):
+        self.module = module = pynodes.module_section()
+        module['filename'] = self.filename
+        append_docstring(module, node.doc, node.lineno)
+        self.context.append(module)
+        self.documentable = module
+        self.visit(node.node)
+        self.context.pop()
+
+    def visitImport(self, node):
+        self.context[-1] += make_import_group(names=node.names,
+                                              lineno=node.lineno)
+        self.documentable = None
+
+    def visitFrom(self, node):
+        self.context[-1].append(
+            make_import_group(names=node.names, from_name=node.modname,
+                              lineno=node.lineno))
+        self.documentable = None
+
+    def visitFunction(self, node):
+        visitor = FunctionVisitor(self.token_parser,
+                                  function_class=pynodes.function_section)
+        compiler.walk(node, visitor, walker=visitor)
+        self.context[-1].append(visitor.function)
+
+    def visitClass(self, node):
+        visitor = ClassVisitor(self.token_parser)
+        compiler.walk(node, visitor, walker=visitor)
+        self.context[-1].append(visitor.klass)
+
+
+class AttributeVisitor(BaseVisitor):
+
+    def __init__(self, token_parser):
+        BaseVisitor.__init__(self, token_parser)
+        self.attributes = pynodes.class_attribute_section()
+
+    def visitAssign(self, node):
+        # Don't visit the expression itself, just the attribute nodes:
+        for child in node.nodes:
+            self.dispatch(child)
+        expression_text = self.token_parser.rhs(node.lineno)
+        expression = pynodes.expression_value()
+        expression.append(Text(expression_text))
+        for attribute in self.attributes:
+            attribute.append(expression)
+
+    def visitAssName(self, node):
+        self.attributes.append(make_attribute(node.name,
+                                              lineno=node.lineno))
+
+    def visitAssTuple(self, node):
+        attributes = self.attributes
+        self.attributes = []
+        self.default_visit(node)
+        n = pynodes.attribute_tuple()
+        n.extend(self.attributes)
+        n['lineno'] = self.attributes[0]['lineno']
+        attributes.append(n)
+        self.attributes = attributes
+        #self.attributes.append(att_tuple)
+
+    def visitAssAttr(self, node):
+        self.default_visit(node, node.attrname)
+
+    def visitGetattr(self, node, suffix):
+        self.default_visit(node, node.attrname + '.' + suffix)
+
+    def visitName(self, node, suffix):
+        self.attributes.append(make_attribute(node.name + '.' + suffix,
+                                              lineno=node.lineno))
+
+
+class FunctionVisitor(DocstringVisitor):
+
+    in_function = 0
+
+    def __init__(self, token_parser, function_class):
+        DocstringVisitor.__init__(self, token_parser)
+        self.function_class = function_class
+
+    def visitFunction(self, node):
+        if self.in_function:
+            self.documentable = None
+            # Don't bother with nested function definitions.
+            return
+        self.in_function = 1
+        self.function = function = make_function_like_section(
+            name=node.name,
+            lineno=node.lineno,
+            doc=node.doc,
+            function_class=self.function_class)
+        self.context.append(function)
+        self.documentable = function
+        self.parse_parameter_list(node)
+        self.visit(node.code)
+        self.context.pop()
+
+    def parse_parameter_list(self, node):
+        parameters = []
+        special = []
+        argnames = list(node.argnames)
+        if node.kwargs:
+            special.append(make_parameter(argnames[-1], excess_keyword=1))
+            argnames.pop()
+        if node.varargs:
+            special.append(make_parameter(argnames[-1],
+                                          excess_positional=1))
+            argnames.pop()
+        defaults = list(node.defaults)
+        defaults = [None] * (len(argnames) - len(defaults)) + defaults
+        function_parameters = self.token_parser.function_parameters(
+            node.lineno)
+        #print >>sys.stderr, function_parameters
+        for argname, default in zip(argnames, defaults):
+            if type(argname) is TupleType:
+                parameter = pynodes.parameter_tuple()
+                for tuplearg in argname:
+                    parameter.append(make_parameter(tuplearg))
+                argname = normalize_parameter_name(argname)
+            else:
+                parameter = make_parameter(argname)
+            if default:
+                n_default = pynodes.parameter_default()
+                n_default.append(Text(function_parameters[argname]))
+                parameter.append(n_default)
+            parameters.append(parameter)
+        if parameters or special:
+            special.reverse()
+            parameters.extend(special)
+            parameter_list = pynodes.parameter_list()
+            parameter_list.extend(parameters)
+            self.function.append(parameter_list)
+
+
+class ClassVisitor(AssignmentVisitor):
+
+    in_class = 0
+
+    def __init__(self, token_parser):
+        AssignmentVisitor.__init__(self, token_parser)
+        self.bases = []
+
+    def visitClass(self, node):
+        if self.in_class:
+            self.documentable = None
+            # Don't bother with nested class definitions.
+            return
+        self.in_class = 1
+        #import mypdb as pdb
+        #pdb.set_trace()
+        for base in node.bases:
+            self.visit(base)
+        self.klass = klass = make_class_section(node.name, self.bases,
+                                                doc=node.doc,
+                                                lineno=node.lineno)
+        self.context.append(klass)
+        self.documentable = klass
+        self.visit(node.code)
+        self.context.pop()
+
+    def visitGetattr(self, node, suffix=None):
+        if suffix:
+            name = node.attrname + '.' + suffix
+        else:
+            name = node.attrname
+        self.default_visit(node, name)
+
+    def visitName(self, node, suffix=None):
+        if suffix:
+            name = node.name + '.' + suffix
+        else:
+            name = node.name
+        self.bases.append(name)
+
+    def visitFunction(self, node):
+        if node.name == '__init__':
+            visitor = InitMethodVisitor(self.token_parser,
+                                        function_class=pynodes.method_section)
+            compiler.walk(node, visitor, walker=visitor)
+        else:
+            visitor = FunctionVisitor(self.token_parser,
+                                      function_class=pynodes.method_section)
+            compiler.walk(node, visitor, walker=visitor)
+        self.context[-1].append(visitor.function)
+
+
+class InitMethodVisitor(FunctionVisitor, AssignmentVisitor): pass
+
+
+class TokenParser:
+
+    def __init__(self, text):
+        self.text = text + '\n\n'
+        self.lines = self.text.splitlines(1)
+        self.generator = tokenize.generate_tokens(iter(self.lines).next)
+        self.next()
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        self.token = self.generator.next()
+        self.type, self.string, self.start, self.end, self.line = self.token
+        return self.token
+
+    def goto_line(self, lineno):
+        while self.start[0] < lineno:
+            self.next()
+        return token
+
+    def rhs(self, lineno):
+        """
+        Return a whitespace-normalized expression string from the right-hand
+        side of an assignment at line `lineno`.
+        """
+        self.goto_line(lineno)
+        while self.string != '=':
+            self.next()
+        self.stack = None
+        while self.type != token.NEWLINE and self.string != ';':
+            if self.string == '=' and not self.stack:
+                self.tokens = []
+                self.stack = []
+                self._type = None
+                self._string = None
+                self._backquote = 0
+            else:
+                self.note_token()
+            self.next()
+        self.next()
+        text = ''.join(self.tokens)
+        return text.strip()
+
+    closers = {')': '(', ']': '[', '}': '{'}
+    openers = {'(': 1, '[': 1, '{': 1}
+    del_ws_prefix = {'.': 1, '=': 1, ')': 1, ']': 1, '}': 1, ':': 1, ',': 1}
+    no_ws_suffix = {'.': 1, '=': 1, '(': 1, '[': 1, '{': 1}
+
+    def note_token(self):
+        if self.type == tokenize.NL:
+            return
+        del_ws = self.del_ws_prefix.has_key(self.string)
+        append_ws = not self.no_ws_suffix.has_key(self.string)
+        if self.openers.has_key(self.string):
+            self.stack.append(self.string)
+            if (self._type == token.NAME
+                or self.closers.has_key(self._string)):
+                del_ws = 1
+        elif self.closers.has_key(self.string):
+            assert self.stack[-1] == self.closers[self.string]
+            self.stack.pop()
+        elif self.string == '`':
+            if self._backquote:
+                del_ws = 1
+                assert self.stack[-1] == '`'
+                self.stack.pop()
+            else:
+                append_ws = 0
+                self.stack.append('`')
+            self._backquote = not self._backquote
+        if del_ws and self.tokens and self.tokens[-1] == ' ':
+            del self.tokens[-1]
+        self.tokens.append(self.string)
+        self._type = self.type
+        self._string = self.string
+        if append_ws:
+            self.tokens.append(' ')
+
+    def function_parameters(self, lineno):
+        """
+        Return a dictionary mapping parameters to defaults
+        (whitespace-normalized strings).
+        """
+        self.goto_line(lineno)
+        while self.string != 'def':
+            self.next()
+        while self.string != '(':
+            self.next()
+        name = None
+        default = None
+        parameter_tuple = None
+        self.tokens = []
+        parameters = {}
+        self.stack = [self.string]
+        self.next()
+        while 1:
+            if len(self.stack) == 1:
+                if parameter_tuple:
+                    # Just encountered ")".
+                    #print >>sys.stderr, 'parameter_tuple: %r' % self.tokens
+                    name = ''.join(self.tokens).strip()
+                    self.tokens = []
+                    parameter_tuple = None
+                if self.string in (')', ','):
+                    if name:
+                        if self.tokens:
+                            default_text = ''.join(self.tokens).strip()
+                        else:
+                            default_text = None
+                        parameters[name] = default_text
+                        self.tokens = []
+                        name = None
+                        default = None
+                    if self.string == ')':
+                        break
+                elif self.type == token.NAME:
+                    if name and default:
+                        self.note_token()
+                    else:
+                        assert name is None, (
+                            'token=%r name=%r parameters=%r stack=%r'
+                            % (self.token, name, parameters, self.stack))
+                        name = self.string
+                        #print >>sys.stderr, 'name=%r' % name
+                elif self.string == '=':
+                    assert name is not None, 'token=%r' % (self.token,)
+                    assert default is None, 'token=%r' % (self.token,)
+                    assert self.tokens == [], 'token=%r' % (self.token,)
+                    default = 1
+                    self._type = None
+                    self._string = None
+                    self._backquote = 0
+                elif name:
+                    self.note_token()
+                elif self.string == '(':
+                    parameter_tuple = 1
+                    self._type = None
+                    self._string = None
+                    self._backquote = 0
+                    self.note_token()
+                else:                   # ignore these tokens:
+                    assert (self.string in ('*', '**', '\n') 
+                            or self.type == tokenize.COMMENT), (
+                        'token=%r' % (self.token,))
+            else:
+                self.note_token()
+            self.next()
+        return parameters
+
+
+def make_docstring(doc, lineno):
+    n = pynodes.docstring()
+    if lineno:
+        # Really, only module docstrings don't have a line
+        # (@@: but maybe they should)
+        n['lineno'] = lineno
+    n.append(Text(doc))
+    return n
+
+def append_docstring(node, doc, lineno):
+    if doc:
+        node.append(make_docstring(doc, lineno))
+
+def make_class_section(name, bases, lineno, doc):
+    n = pynodes.class_section()
+    n['lineno'] = lineno
+    n.append(make_object_name(name))
+    for base in bases:
+        b = pynodes.class_base()
+        b.append(make_object_name(base))
+        n.append(b)
+    append_docstring(n, doc, lineno)
+    return n
+
+def make_object_name(name):
+    n = pynodes.object_name()
+    n.append(Text(name))
+    return n
+
+def make_function_like_section(name, lineno, doc, function_class):
+    n = function_class()
+    n['lineno'] = lineno
+    n.append(make_object_name(name))
+    append_docstring(n, doc, lineno)
+    return n
+
+def make_import_group(names, lineno, from_name=None):
+    n = pynodes.import_group()
+    n['lineno'] = lineno
+    if from_name:
+        n_from = pynodes.import_from()
+        n_from.append(Text(from_name))
+        n.append(n_from)
+    for name, alias in names:
+        n_name = pynodes.import_name()
+        n_name.append(Text(name))
+        if alias:
+            n_alias = pynodes.import_alias()
+            n_alias.append(Text(alias))
+            n_name.append(n_alias)
+        n.append(n_name)
+    return n
+
+def make_class_attribute(name, lineno):
+    n = pynodes.class_attribute()
+    n['lineno'] = lineno
+    n.append(Text(name))
+    return n
+
+def make_attribute(name, lineno):
+    n = pynodes.attribute()
+    n['lineno'] = lineno
+    n.append(make_object_name(name))
+    return n
+
+def make_parameter(name, excess_keyword=0, excess_positional=0):
+    """
+    excess_keyword and excess_positional must be either 1 or 0, and
+    not both of them can be 1.
+    """
+    n = pynodes.parameter()
+    n.append(make_object_name(name))
+    assert not excess_keyword or not excess_positional
+    if excess_keyword:
+        n['excess_keyword'] = 1
+    if excess_positional:
+        n['excess_positional'] = 1
+    return n
+
+def trim_docstring(text):
+    """
+    Trim indentation and blank lines from docstring text & return it.
+
+    See PEP 257.
+    """
+    if not text:
+        return text
+    # Convert tabs to spaces (following the normal Python rules)
+    # and split into a list of lines:
+    lines = text.expandtabs().splitlines()
+    # Determine minimum indentation (first line doesn't count):
+    indent = sys.maxint
+    for line in lines[1:]:
+        stripped = line.lstrip()
+        if stripped:
+            indent = min(indent, len(line) - len(stripped))
+    # Remove indentation (first line is special):
+    trimmed = [lines[0].strip()]
+    if indent < sys.maxint:
+        for line in lines[1:]:
+            trimmed.append(line[indent:].rstrip())
+    # Strip off trailing and leading blank lines:
+    while trimmed and not trimmed[-1]:
+        trimmed.pop()
+    while trimmed and not trimmed[0]:
+        trimmed.pop(0)
+    # Return a single string:
+    return '\n'.join(trimmed)
+
+def normalize_parameter_name(name):
+    """
+    Converts a tuple like ``('a', ('b', 'c'), 'd')`` into ``'(a, (b, c), d)'``
+    """
+    if type(name) is TupleType:
+        return '(%s)' % ', '.join([normalize_parameter_name(n) for n in name])
+    else:
+        return name
+
+if __name__ == '__main__':
+    import sys
+    args = sys.argv[1:]
+    if args[0] == '-v':
+        filename = args[1]
+        module_text = open(filename).read()
+        ast = compiler.parse(module_text)
+        visitor = compiler.visitor.ExampleASTVisitor()
+        compiler.walk(ast, visitor, walker=visitor, verbose=1)
+    else:
+        filename = args[0]
+        content = open(filename).read()
+        print parse_module(content, filename).pformat()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/readers/python/pynodes.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,81 @@
+#! /usr/bin/env python
+# $Id: pynodes.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+from docutils import nodes
+from docutils.nodes import Element, TextElement, Structural, Inline, Part, \
+     Text
+import types
+
+# This is the parent class of all the other pynode classes:
+class PythonStructural(Structural): pass
+
+# =====================
+#  Structural Elements
+# =====================
+
+class module_section(PythonStructural, Element): pass    
+class class_section(PythonStructural, Element): pass
+class class_base(PythonStructural, Element): pass
+class method_section(PythonStructural, Element): pass
+class attribute(PythonStructural, Element): pass
+class function_section(PythonStructural, Element): pass
+class class_attribute_section(PythonStructural, Element): pass
+class class_attribute(PythonStructural, Element): pass
+class expression_value(PythonStructural, Element): pass
+class attribute(PythonStructural, Element): pass
+
+# Structural Support Elements
+# ---------------------------
+
+class parameter_list(PythonStructural, Element): pass
+class parameter_tuple(PythonStructural, Element): pass
+class parameter_default(PythonStructural, TextElement): pass
+class import_group(PythonStructural, TextElement): pass
+class import_from(PythonStructural, TextElement): pass
+class import_name(PythonStructural, TextElement): pass
+class import_alias(PythonStructural, TextElement): pass
+class docstring(PythonStructural, Element): pass
+
+# =================
+#  Inline Elements
+# =================
+
+# These elements cannot become references until the second
+# pass.  Initially, we'll use "reference" or "name".
+
+class object_name(PythonStructural, TextElement): pass
+class parameter_list(PythonStructural, TextElement): pass
+class parameter(PythonStructural, TextElement): pass
+class parameter_default(PythonStructural, TextElement): pass
+class class_attribute(PythonStructural, TextElement): pass
+class attribute_tuple(PythonStructural, TextElement): pass
+
+# =================
+#  Unused Elements
+# =================
+
+# These were part of the model, and maybe should be in the future, but
+# aren't now.
+#class package_section(PythonStructural, Element): pass
+#class module_attribute_section(PythonStructural, Element): pass
+#class instance_attribute_section(PythonStructural, Element): pass
+#class module_attribute(PythonStructural, TextElement): pass
+#class instance_attribute(PythonStructural, TextElement): pass
+#class exception_class(PythonStructural, TextElement): pass
+#class warning_class(PythonStructural, TextElement): pass
+
+
+# Collect all the classes we've written above
+def install_node_class_names():
+    node_class_names = []
+    for name, var in globals().items():
+        if (type(var) is types.ClassType
+            and issubclass(var, PythonStructural) \
+            and name.lower() == name):
+            node_class_names.append(var.tagname or name)
+    # Register the new node names with GenericNodeVisitor and
+    # SpecificNodeVisitor:
+    nodes._add_node_class_names(node_class_names)
+install_node_class_names()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/readers/standalone.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,66 @@
+# $Id: standalone.py 4802 2006-11-12 18:02:17Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Standalone file Reader for the reStructuredText markup syntax.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+from docutils import frontend, readers
+from docutils.transforms import frontmatter, references, misc
+
+
+class Reader(readers.Reader):
+
+    supported = ('standalone',)
+    """Contexts this reader supports."""
+
+    document = None
+    """A single document tree."""
+
+    settings_spec = (
+        'Standalone Reader',
+        None,
+        (('Disable the promotion of a lone top-level section title to '
+          'document title (and subsequent section title to document '
+          'subtitle promotion; enabled by default).',
+          ['--no-doc-title'],
+          {'dest': 'doctitle_xform', 'action': 'store_false', 'default': 1,
+           'validator': frontend.validate_boolean}),
+         ('Disable the bibliographic field list transform (enabled by '
+          'default).',
+          ['--no-doc-info'],
+          {'dest': 'docinfo_xform', 'action': 'store_false', 'default': 1,
+           'validator': frontend.validate_boolean}),
+         ('Activate the promotion of lone subsection titles to '
+          'section subtitles (disabled by default).',
+          ['--section-subtitles'],
+          {'dest': 'sectsubtitle_xform', 'action': 'store_true', 'default': 0,
+           'validator': frontend.validate_boolean}),
+         ('Deactivate the promotion of lone subsection titles.',
+          ['--no-section-subtitles'],
+          {'dest': 'sectsubtitle_xform', 'action': 'store_false'}),
+         ))
+
+    config_section = 'standalone reader'
+    config_section_dependencies = ('readers',)
+
+    def get_transforms(self):
+        return readers.Reader.get_transforms(self) + [
+            references.Substitutions,
+            references.PropagateTargets,
+            frontmatter.DocTitle,
+            frontmatter.SectionSubTitle,
+            frontmatter.DocInfo,
+            references.AnonymousHyperlinks,
+            references.IndirectHyperlinks,
+            references.Footnotes,
+            references.ExternalTargets,
+            references.InternalTargets,
+            references.DanglingReferences,
+            misc.Transitions,
+            ]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/statemachine.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1490 @@
+# $Id: statemachine.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A finite state machine specialized for regular-expression-based text filters,
+this module defines the following classes:
+
+- `StateMachine`, a state machine
+- `State`, a state superclass
+- `StateMachineWS`, a whitespace-sensitive version of `StateMachine`
+- `StateWS`, a state superclass for use with `StateMachineWS`
+- `SearchStateMachine`, uses `re.search()` instead of `re.match()`
+- `SearchStateMachineWS`, uses `re.search()` instead of `re.match()`
+- `ViewList`, extends standard Python lists.
+- `StringList`, string-specific ViewList.
+
+Exception classes:
+
+- `StateMachineError`
+- `UnknownStateError`
+- `DuplicateStateError`
+- `UnknownTransitionError`
+- `DuplicateTransitionError`
+- `TransitionPatternNotFound`
+- `TransitionMethodNotFound`
+- `UnexpectedIndentationError`
+- `TransitionCorrection`: Raised to switch to another transition.
+- `StateCorrection`: Raised to switch to another state & transition.
+
+Functions:
+
+- `string2lines()`: split a multi-line string into a list of one-line strings
+
+
+How To Use This Module
+======================
+(See the individual classes, methods, and attributes for details.)
+
+1. Import it: ``import statemachine`` or ``from statemachine import ...``.
+   You will also need to ``import re``.
+
+2. Derive a subclass of `State` (or `StateWS`) for each state in your state
+   machine::
+
+       class MyState(statemachine.State):
+
+   Within the state's class definition:
+
+   a) Include a pattern for each transition, in `State.patterns`::
+
+          patterns = {'atransition': r'pattern', ...}
+
+   b) Include a list of initial transitions to be set up automatically, in
+      `State.initial_transitions`::
+
+          initial_transitions = ['atransition', ...]
+
+   c) Define a method for each transition, with the same name as the
+      transition pattern::
+
+          def atransition(self, match, context, next_state):
+              # do something
+              result = [...]  # a list
+              return context, next_state, result
+              # context, next_state may be altered
+
+      Transition methods may raise an `EOFError` to cut processing short.
+
+   d) You may wish to override the `State.bof()` and/or `State.eof()` implicit
+      transition methods, which handle the beginning- and end-of-file.
+
+   e) In order to handle nested processing, you may wish to override the
+      attributes `State.nested_sm` and/or `State.nested_sm_kwargs`.
+
+      If you are using `StateWS` as a base class, in order to handle nested
+      indented blocks, you may wish to:
+
+      - override the attributes `StateWS.indent_sm`,
+        `StateWS.indent_sm_kwargs`, `StateWS.known_indent_sm`, and/or
+        `StateWS.known_indent_sm_kwargs`;
+      - override the `StateWS.blank()` method; and/or
+      - override or extend the `StateWS.indent()`, `StateWS.known_indent()`,
+        and/or `StateWS.firstknown_indent()` methods.
+
+3. Create a state machine object::
+
+       sm = StateMachine(state_classes=[MyState, ...],
+                         initial_state='MyState')
+
+4. Obtain the input text, which needs to be converted into a tab-free list of
+   one-line strings. For example, to read text from a file called
+   'inputfile'::
+
+       input_string = open('inputfile').read()
+       input_lines = statemachine.string2lines(input_string)
+
+5. Run the state machine on the input text and collect the results, a list::
+
+       results = sm.run(input_lines)
+
+6. Remove any lingering circular references::
+
+       sm.unlink()
+"""
+
+__docformat__ = 'restructuredtext'
+
+import sys
+import re
+import types
+import unicodedata
+
+
+class StateMachine:
+
+    """
+    A finite state machine for text filters using regular expressions.
+
+    The input is provided in the form of a list of one-line strings (no
+    newlines). States are subclasses of the `State` class. Transitions consist
+    of regular expression patterns and transition methods, and are defined in
+    each state.
+
+    The state machine is started with the `run()` method, which returns the
+    results of processing in a list.
+    """
+
+    def __init__(self, state_classes, initial_state, debug=0):
+        """
+        Initialize a `StateMachine` object; add state objects.
+
+        Parameters:
+
+        - `state_classes`: a list of `State` (sub)classes.
+        - `initial_state`: a string, the class name of the initial state.
+        - `debug`: a boolean; produce verbose output if true (nonzero).
+        """
+
+        self.input_lines = None
+        """`StringList` of input lines (without newlines).
+        Filled by `self.run()`."""
+
+        self.input_offset = 0
+        """Offset of `self.input_lines` from the beginning of the file."""
+
+        self.line = None
+        """Current input line."""
+
+        self.line_offset = -1
+        """Current input line offset from beginning of `self.input_lines`."""
+
+        self.debug = debug
+        """Debugging mode on/off."""
+
+        self.initial_state = initial_state
+        """The name of the initial state (key to `self.states`)."""
+
+        self.current_state = initial_state
+        """The name of the current state (key to `self.states`)."""
+
+        self.states = {}
+        """Mapping of {state_name: State_object}."""
+
+        self.add_states(state_classes)
+
+        self.observers = []
+        """List of bound methods or functions to call whenever the current
+        line changes.  Observers are called with one argument, ``self``.
+        Cleared at the end of `run()`."""
+
+    def unlink(self):
+        """Remove circular references to objects no longer required."""
+        for state in self.states.values():
+            state.unlink()
+        self.states = None
+
+    def run(self, input_lines, input_offset=0, context=None,
+            input_source=None):
+        """
+        Run the state machine on `input_lines`. Return results (a list).
+
+        Reset `self.line_offset` and `self.current_state`. Run the
+        beginning-of-file transition. Input one line at a time and check for a
+        matching transition. If a match is found, call the transition method
+        and possibly change the state. Store the context returned by the
+        transition method to be passed on to the next transition matched.
+        Accumulate the results returned by the transition methods in a list.
+        Run the end-of-file transition. Finally, return the accumulated
+        results.
+
+        Parameters:
+
+        - `input_lines`: a list of strings without newlines, or `StringList`.
+        - `input_offset`: the line offset of `input_lines` from the beginning
+          of the file.
+        - `context`: application-specific storage.
+        - `input_source`: name or path of source of `input_lines`.
+        """
+        self.runtime_init()
+        if isinstance(input_lines, StringList):
+            self.input_lines = input_lines
+        else:
+            self.input_lines = StringList(input_lines, source=input_source)
+        self.input_offset = input_offset
+        self.line_offset = -1
+        self.current_state = self.initial_state
+        if self.debug:
+            print >>sys.stderr, (
+                '\nStateMachine.run: input_lines (line_offset=%s):\n| %s'
+                % (self.line_offset, '\n| '.join(self.input_lines)))
+        transitions = None
+        results = []
+        state = self.get_state()
+        try:
+            if self.debug:
+                print >>sys.stderr, ('\nStateMachine.run: bof transition')
+            context, result = state.bof(context)
+            results.extend(result)
+            while 1:
+                try:
+                    try:
+                        self.next_line()
+                        if self.debug:
+                            source, offset = self.input_lines.info(
+                                self.line_offset)
+                            print >>sys.stderr, (
+                                '\nStateMachine.run: line (source=%r, '
+                                'offset=%r):\n| %s'
+                                % (source, offset, self.line))
+                        context, next_state, result = self.check_line(
+                            context, state, transitions)
+                    except EOFError:
+                        if self.debug:
+                            print >>sys.stderr, (
+                                '\nStateMachine.run: %s.eof transition'
+                                % state.__class__.__name__)
+                        result = state.eof(context)
+                        results.extend(result)
+                        break
+                    else:
+                        results.extend(result)
+                except TransitionCorrection, exception:
+                    self.previous_line() # back up for another try
+                    transitions = (exception.args[0],)
+                    if self.debug:
+                        print >>sys.stderr, (
+                              '\nStateMachine.run: TransitionCorrection to '
+                              'state "%s", transition %s.'
+                              % (state.__class__.__name__, transitions[0]))
+                    continue
+                except StateCorrection, exception:
+                    self.previous_line() # back up for another try
+                    next_state = exception.args[0]
+                    if len(exception.args) == 1:
+                        transitions = None
+                    else:
+                        transitions = (exception.args[1],)
+                    if self.debug:
+                        print >>sys.stderr, (
+                              '\nStateMachine.run: StateCorrection to state '
+                              '"%s", transition %s.'
+                              % (next_state, transitions[0]))
+                else:
+                    transitions = None
+                state = self.get_state(next_state)
+        except:
+            if self.debug:
+                self.error()
+            raise
+        self.observers = []
+        return results
+
+    def get_state(self, next_state=None):
+        """
+        Return current state object; set it first if `next_state` given.
+
+        Parameter `next_state`: a string, the name of the next state.
+
+        Exception: `UnknownStateError` raised if `next_state` unknown.
+        """
+        if next_state:
+            if self.debug and next_state != self.current_state:
+                print >>sys.stderr, \
+                      ('\nStateMachine.get_state: Changing state from '
+                       '"%s" to "%s" (input line %s).'
+                       % (self.current_state, next_state,
+                          self.abs_line_number()))
+            self.current_state = next_state
+        try:
+            return self.states[self.current_state]
+        except KeyError:
+            raise UnknownStateError(self.current_state)
+
+    def next_line(self, n=1):
+        """Load `self.line` with the `n`'th next line and return it."""
+        try:
+            try:
+                self.line_offset += n
+                self.line = self.input_lines[self.line_offset]
+            except IndexError:
+                self.line = None
+                raise EOFError
+            return self.line
+        finally:
+            self.notify_observers()
+
+    def is_next_line_blank(self):
+        """Return 1 if the next line is blank or non-existant."""
+        try:
+            return not self.input_lines[self.line_offset + 1].strip()
+        except IndexError:
+            return 1
+
+    def at_eof(self):
+        """Return 1 if the input is at or past end-of-file."""
+        return self.line_offset >= len(self.input_lines) - 1
+
+    def at_bof(self):
+        """Return 1 if the input is at or before beginning-of-file."""
+        return self.line_offset <= 0
+
+    def previous_line(self, n=1):
+        """Load `self.line` with the `n`'th previous line and return it."""
+        self.line_offset -= n
+        if self.line_offset < 0:
+            self.line = None
+        else:
+            self.line = self.input_lines[self.line_offset]
+        self.notify_observers()
+        return self.line
+
+    def goto_line(self, line_offset):
+        """Jump to absolute line offset `line_offset`, load and return it."""
+        try:
+            try:
+                self.line_offset = line_offset - self.input_offset
+                self.line = self.input_lines[self.line_offset]
+            except IndexError:
+                self.line = None
+                raise EOFError
+            return self.line
+        finally:
+            self.notify_observers()
+
+    def get_source(self, line_offset):
+        """Return source of line at absolute line offset `line_offset`."""
+        return self.input_lines.source(line_offset - self.input_offset)
+
+    def abs_line_offset(self):
+        """Return line offset of current line, from beginning of file."""
+        return self.line_offset + self.input_offset
+
+    def abs_line_number(self):
+        """Return line number of current line (counting from 1)."""
+        return self.line_offset + self.input_offset + 1
+
+    def insert_input(self, input_lines, source):
+        self.input_lines.insert(self.line_offset + 1, '',
+                                source='internal padding')
+        self.input_lines.insert(self.line_offset + 1, '',
+                                source='internal padding')
+        self.input_lines.insert(self.line_offset + 2,
+                                StringList(input_lines, source))
+
+    def get_text_block(self, flush_left=0):
+        """
+        Return a contiguous block of text.
+
+        If `flush_left` is true, raise `UnexpectedIndentationError` if an
+        indented line is encountered before the text block ends (with a blank
+        line).
+        """
+        try:
+            block = self.input_lines.get_text_block(self.line_offset,
+                                                    flush_left)
+            self.next_line(len(block) - 1)
+            return block
+        except UnexpectedIndentationError, error:
+            block, source, lineno = error
+            self.next_line(len(block) - 1) # advance to last line of block
+            raise
+
+    def check_line(self, context, state, transitions=None):
+        """
+        Examine one line of input for a transition match & execute its method.
+
+        Parameters:
+
+        - `context`: application-dependent storage.
+        - `state`: a `State` object, the current state.
+        - `transitions`: an optional ordered list of transition names to try,
+          instead of ``state.transition_order``.
+
+        Return the values returned by the transition method:
+
+        - context: possibly modified from the parameter `context`;
+        - next state name (`State` subclass name);
+        - the result output of the transition, a list.
+
+        When there is no match, ``state.no_match()`` is called and its return
+        value is returned.
+        """
+        if transitions is None:
+            transitions =  state.transition_order
+        state_correction = None
+        if self.debug:
+            print >>sys.stderr, (
+                  '\nStateMachine.check_line: state="%s", transitions=%r.'
+                  % (state.__class__.__name__, transitions))
+        for name in transitions:
+            pattern, method, next_state = state.transitions[name]
+            match = self.match(pattern)
+            if match:
+                if self.debug:
+                    print >>sys.stderr, (
+                          '\nStateMachine.check_line: Matched transition '
+                          '"%s" in state "%s".'
+                          % (name, state.__class__.__name__))
+                return method(match, context, next_state)
+        else:
+            if self.debug:
+                print >>sys.stderr, (
+                      '\nStateMachine.check_line: No match in state "%s".'
+                      % state.__class__.__name__)
+            return state.no_match(context, transitions)
+
+    def match(self, pattern):
+        """
+        Return the result of a regular expression match.
+
+        Parameter `pattern`: an `re` compiled regular expression.
+        """
+        return pattern.match(self.line)
+
+    def add_state(self, state_class):
+        """
+        Initialize & add a `state_class` (`State` subclass) object.
+
+        Exception: `DuplicateStateError` raised if `state_class` was already
+        added.
+        """
+        statename = state_class.__name__
+        if self.states.has_key(statename):
+            raise DuplicateStateError(statename)
+        self.states[statename] = state_class(self, self.debug)
+
+    def add_states(self, state_classes):
+        """
+        Add `state_classes` (a list of `State` subclasses).
+        """
+        for state_class in state_classes:
+            self.add_state(state_class)
+
+    def runtime_init(self):
+        """
+        Initialize `self.states`.
+        """
+        for state in self.states.values():
+            state.runtime_init()
+
+    def error(self):
+        """Report error details."""
+        type, value, module, line, function = _exception_data()
+        print >>sys.stderr, '%s: %s' % (type, value)
+        print >>sys.stderr, 'input line %s' % (self.abs_line_number())
+        print >>sys.stderr, ('module %s, line %s, function %s'
+                             % (module, line, function))
+
+    def attach_observer(self, observer):
+        """
+        The `observer` parameter is a function or bound method which takes two
+        arguments, the source and offset of the current line.
+        """
+        self.observers.append(observer)
+
+    def detach_observer(self, observer):
+        self.observers.remove(observer)
+
+    def notify_observers(self):
+        for observer in self.observers:
+            try:
+                info = self.input_lines.info(self.line_offset)
+            except IndexError:
+                info = (None, None)
+            observer(*info)
+
+
+class State:
+
+    """
+    State superclass. Contains a list of transitions, and transition methods.
+
+    Transition methods all have the same signature. They take 3 parameters:
+
+    - An `re` match object. ``match.string`` contains the matched input line,
+      ``match.start()`` gives the start index of the match, and
+      ``match.end()`` gives the end index.
+    - A context object, whose meaning is application-defined (initial value
+      ``None``). It can be used to store any information required by the state
+      machine, and the retured context is passed on to the next transition
+      method unchanged.
+    - The name of the next state, a string, taken from the transitions list;
+      normally it is returned unchanged, but it may be altered by the
+      transition method if necessary.
+
+    Transition methods all return a 3-tuple:
+
+    - A context object, as (potentially) modified by the transition method.
+    - The next state name (a return value of ``None`` means no state change).
+    - The processing result, a list, which is accumulated by the state
+      machine.
+
+    Transition methods may raise an `EOFError` to cut processing short.
+
+    There are two implicit transitions, and corresponding transition methods
+    are defined: `bof()` handles the beginning-of-file, and `eof()` handles
+    the end-of-file. These methods have non-standard signatures and return
+    values. `bof()` returns the initial context and results, and may be used
+    to return a header string, or do any other processing needed. `eof()`
+    should handle any remaining context and wrap things up; it returns the
+    final processing result.
+
+    Typical applications need only subclass `State` (or a subclass), set the
+    `patterns` and `initial_transitions` class attributes, and provide
+    corresponding transition methods. The default object initialization will
+    take care of constructing the list of transitions.
+    """
+
+    patterns = None
+    """
+    {Name: pattern} mapping, used by `make_transition()`. Each pattern may
+    be a string or a compiled `re` pattern. Override in subclasses.
+    """
+
+    initial_transitions = None
+    """
+    A list of transitions to initialize when a `State` is instantiated.
+    Each entry is either a transition name string, or a (transition name, next
+    state name) pair. See `make_transitions()`. Override in subclasses.
+    """
+
+    nested_sm = None
+    """
+    The `StateMachine` class for handling nested processing.
+
+    If left as ``None``, `nested_sm` defaults to the class of the state's
+    controlling state machine. Override it in subclasses to avoid the default.
+    """
+
+    nested_sm_kwargs = None
+    """
+    Keyword arguments dictionary, passed to the `nested_sm` constructor.
+
+    Two keys must have entries in the dictionary:
+
+    - Key 'state_classes' must be set to a list of `State` classes.
+    - Key 'initial_state' must be set to the name of the initial state class.
+
+    If `nested_sm_kwargs` is left as ``None``, 'state_classes' defaults to the
+    class of the current state, and 'initial_state' defaults to the name of
+    the class of the current state. Override in subclasses to avoid the
+    defaults.
+    """
+
+    def __init__(self, state_machine, debug=0):
+        """
+        Initialize a `State` object; make & add initial transitions.
+
+        Parameters:
+
+        - `statemachine`: the controlling `StateMachine` object.
+        - `debug`: a boolean; produce verbose output if true (nonzero).
+        """
+
+        self.transition_order = []
+        """A list of transition names in search order."""
+
+        self.transitions = {}
+        """
+        A mapping of transition names to 3-tuples containing
+        (compiled_pattern, transition_method, next_state_name). Initialized as
+        an instance attribute dynamically (instead of as a class attribute)
+        because it may make forward references to patterns and methods in this
+        or other classes.
+        """
+
+        self.add_initial_transitions()
+
+        self.state_machine = state_machine
+        """A reference to the controlling `StateMachine` object."""
+
+        self.debug = debug
+        """Debugging mode on/off."""
+
+        if self.nested_sm is None:
+            self.nested_sm = self.state_machine.__class__
+        if self.nested_sm_kwargs is None:
+            self.nested_sm_kwargs = {'state_classes': [self.__class__],
+                                     'initial_state': self.__class__.__name__}
+
+    def runtime_init(self):
+        """
+        Initialize this `State` before running the state machine; called from
+        `self.state_machine.run()`.
+        """
+        pass
+
+    def unlink(self):
+        """Remove circular references to objects no longer required."""
+        self.state_machine = None
+
+    def add_initial_transitions(self):
+        """Make and add transitions listed in `self.initial_transitions`."""
+        if self.initial_transitions:
+            names, transitions = self.make_transitions(
+                  self.initial_transitions)
+            self.add_transitions(names, transitions)
+
+    def add_transitions(self, names, transitions):
+        """
+        Add a list of transitions to the start of the transition list.
+
+        Parameters:
+
+        - `names`: a list of transition names.
+        - `transitions`: a mapping of names to transition tuples.
+
+        Exceptions: `DuplicateTransitionError`, `UnknownTransitionError`.
+        """
+        for name in names:
+            if self.transitions.has_key(name):
+                raise DuplicateTransitionError(name)
+            if not transitions.has_key(name):
+                raise UnknownTransitionError(name)
+        self.transition_order[:0] = names
+        self.transitions.update(transitions)
+
+    def add_transition(self, name, transition):
+        """
+        Add a transition to the start of the transition list.
+
+        Parameter `transition`: a ready-made transition 3-tuple.
+
+        Exception: `DuplicateTransitionError`.
+        """
+        if self.transitions.has_key(name):
+            raise DuplicateTransitionError(name)
+        self.transition_order[:0] = [name]
+        self.transitions[name] = transition
+
+    def remove_transition(self, name):
+        """
+        Remove a transition by `name`.
+
+        Exception: `UnknownTransitionError`.
+        """
+        try:
+            del self.transitions[name]
+            self.transition_order.remove(name)
+        except:
+            raise UnknownTransitionError(name)
+
+    def make_transition(self, name, next_state=None):
+        """
+        Make & return a transition tuple based on `name`.
+
+        This is a convenience function to simplify transition creation.
+
+        Parameters:
+
+        - `name`: a string, the name of the transition pattern & method. This
+          `State` object must have a method called '`name`', and a dictionary
+          `self.patterns` containing a key '`name`'.
+        - `next_state`: a string, the name of the next `State` object for this
+          transition. A value of ``None`` (or absent) implies no state change
+          (i.e., continue with the same state).
+
+        Exceptions: `TransitionPatternNotFound`, `TransitionMethodNotFound`.
+        """
+        if next_state is None:
+            next_state = self.__class__.__name__
+        try:
+            pattern = self.patterns[name]
+            if not hasattr(pattern, 'match'):
+                pattern = re.compile(pattern)
+        except KeyError:
+            raise TransitionPatternNotFound(
+                  '%s.patterns[%r]' % (self.__class__.__name__, name))
+        try:
+            method = getattr(self, name)
+        except AttributeError:
+            raise TransitionMethodNotFound(
+                  '%s.%s' % (self.__class__.__name__, name))
+        return (pattern, method, next_state)
+
+    def make_transitions(self, name_list):
+        """
+        Return a list of transition names and a transition mapping.
+
+        Parameter `name_list`: a list, where each entry is either a transition
+        name string, or a 1- or 2-tuple (transition name, optional next state
+        name).
+        """
+        stringtype = type('')
+        names = []
+        transitions = {}
+        for namestate in name_list:
+            if type(namestate) is stringtype:
+                transitions[namestate] = self.make_transition(namestate)
+                names.append(namestate)
+            else:
+                transitions[namestate[0]] = self.make_transition(*namestate)
+                names.append(namestate[0])
+        return names, transitions
+
+    def no_match(self, context, transitions):
+        """
+        Called when there is no match from `StateMachine.check_line()`.
+
+        Return the same values returned by transition methods:
+
+        - context: unchanged;
+        - next state name: ``None``;
+        - empty result list.
+
+        Override in subclasses to catch this event.
+        """
+        return context, None, []
+
+    def bof(self, context):
+        """
+        Handle beginning-of-file. Return unchanged `context`, empty result.
+
+        Override in subclasses.
+
+        Parameter `context`: application-defined storage.
+        """
+        return context, []
+
+    def eof(self, context):
+        """
+        Handle end-of-file. Return empty result.
+
+        Override in subclasses.
+
+        Parameter `context`: application-defined storage.
+        """
+        return []
+
+    def nop(self, match, context, next_state):
+        """
+        A "do nothing" transition method.
+
+        Return unchanged `context` & `next_state`, empty result. Useful for
+        simple state changes (actionless transitions).
+        """
+        return context, next_state, []
+
+
+class StateMachineWS(StateMachine):
+
+    """
+    `StateMachine` subclass specialized for whitespace recognition.
+
+    There are three methods provided for extracting indented text blocks:
+    
+    - `get_indented()`: use when the indent is unknown.
+    - `get_known_indented()`: use when the indent is known for all lines.
+    - `get_first_known_indented()`: use when only the first line's indent is
+      known.
+    """
+
+    def get_indented(self, until_blank=0, strip_indent=1):
+        """
+        Return a block of indented lines of text, and info.
+
+        Extract an indented block where the indent is unknown for all lines.
+
+        :Parameters:
+            - `until_blank`: Stop collecting at the first blank line if true
+              (1).
+            - `strip_indent`: Strip common leading indent if true (1,
+              default).
+
+        :Return:
+            - the indented block (a list of lines of text),
+            - its indent,
+            - its first line offset from BOF, and
+            - whether or not it finished with a blank line.
+        """
+        offset = self.abs_line_offset()
+        indented, indent, blank_finish = self.input_lines.get_indented(
+              self.line_offset, until_blank, strip_indent)
+        if indented:
+            self.next_line(len(indented) - 1) # advance to last indented line
+        while indented and not indented[0].strip():
+            indented.trim_start()
+            offset += 1
+        return indented, indent, offset, blank_finish
+
+    def get_known_indented(self, indent, until_blank=0, strip_indent=1):
+        """
+        Return an indented block and info.
+
+        Extract an indented block where the indent is known for all lines.
+        Starting with the current line, extract the entire text block with at
+        least `indent` indentation (which must be whitespace, except for the
+        first line).
+
+        :Parameters:
+            - `indent`: The number of indent columns/characters.
+            - `until_blank`: Stop collecting at the first blank line if true
+              (1).
+            - `strip_indent`: Strip `indent` characters of indentation if true
+              (1, default).
+
+        :Return:
+            - the indented block,
+            - its first line offset from BOF, and
+            - whether or not it finished with a blank line.
+        """
+        offset = self.abs_line_offset()
+        indented, indent, blank_finish = self.input_lines.get_indented(
+              self.line_offset, until_blank, strip_indent,
+              block_indent=indent)
+        self.next_line(len(indented) - 1) # advance to last indented line
+        while indented and not indented[0].strip():
+            indented.trim_start()
+            offset += 1
+        return indented, offset, blank_finish
+
+    def get_first_known_indented(self, indent, until_blank=0, strip_indent=1,
+                                 strip_top=1):
+        """
+        Return an indented block and info.
+
+        Extract an indented block where the indent is known for the first line
+        and unknown for all other lines.
+
+        :Parameters:
+            - `indent`: The first line's indent (# of columns/characters).
+            - `until_blank`: Stop collecting at the first blank line if true
+              (1).
+            - `strip_indent`: Strip `indent` characters of indentation if true
+              (1, default).
+            - `strip_top`: Strip blank lines from the beginning of the block.
+
+        :Return:
+            - the indented block,
+            - its indent,
+            - its first line offset from BOF, and
+            - whether or not it finished with a blank line.
+        """
+        offset = self.abs_line_offset()
+        indented, indent, blank_finish = self.input_lines.get_indented(
+              self.line_offset, until_blank, strip_indent,
+              first_indent=indent)
+        self.next_line(len(indented) - 1) # advance to last indented line
+        if strip_top:
+            while indented and not indented[0].strip():
+                indented.trim_start()
+                offset += 1
+        return indented, indent, offset, blank_finish
+
+
+class StateWS(State):
+
+    """
+    State superclass specialized for whitespace (blank lines & indents).
+
+    Use this class with `StateMachineWS`.  The transitions 'blank' (for blank
+    lines) and 'indent' (for indented text blocks) are added automatically,
+    before any other transitions.  The transition method `blank()` handles
+    blank lines and `indent()` handles nested indented blocks.  Indented
+    blocks trigger a new state machine to be created by `indent()` and run.
+    The class of the state machine to be created is in `indent_sm`, and the
+    constructor keyword arguments are in the dictionary `indent_sm_kwargs`.
+
+    The methods `known_indent()` and `firstknown_indent()` are provided for
+    indented blocks where the indent (all lines' and first line's only,
+    respectively) is known to the transition method, along with the attributes
+    `known_indent_sm` and `known_indent_sm_kwargs`.  Neither transition method
+    is triggered automatically.
+    """
+
+    indent_sm = None
+    """
+    The `StateMachine` class handling indented text blocks.
+
+    If left as ``None``, `indent_sm` defaults to the value of
+    `State.nested_sm`.  Override it in subclasses to avoid the default.
+    """
+
+    indent_sm_kwargs = None
+    """
+    Keyword arguments dictionary, passed to the `indent_sm` constructor.
+
+    If left as ``None``, `indent_sm_kwargs` defaults to the value of
+    `State.nested_sm_kwargs`. Override it in subclasses to avoid the default.
+    """
+
+    known_indent_sm = None
+    """
+    The `StateMachine` class handling known-indented text blocks.
+
+    If left as ``None``, `known_indent_sm` defaults to the value of
+    `indent_sm`.  Override it in subclasses to avoid the default.
+    """
+
+    known_indent_sm_kwargs = None
+    """
+    Keyword arguments dictionary, passed to the `known_indent_sm` constructor.
+
+    If left as ``None``, `known_indent_sm_kwargs` defaults to the value of
+    `indent_sm_kwargs`. Override it in subclasses to avoid the default.
+    """
+
+    ws_patterns = {'blank': ' *$',
+                   'indent': ' +'}
+    """Patterns for default whitespace transitions.  May be overridden in
+    subclasses."""
+
+    ws_initial_transitions = ('blank', 'indent')
+    """Default initial whitespace transitions, added before those listed in
+    `State.initial_transitions`.  May be overridden in subclasses."""
+
+    def __init__(self, state_machine, debug=0):
+        """
+        Initialize a `StateSM` object; extends `State.__init__()`.
+
+        Check for indent state machine attributes, set defaults if not set.
+        """
+        State.__init__(self, state_machine, debug)
+        if self.indent_sm is None:
+            self.indent_sm = self.nested_sm
+        if self.indent_sm_kwargs is None:
+            self.indent_sm_kwargs = self.nested_sm_kwargs
+        if self.known_indent_sm is None:
+            self.known_indent_sm = self.indent_sm
+        if self.known_indent_sm_kwargs is None:
+            self.known_indent_sm_kwargs = self.indent_sm_kwargs
+
+    def add_initial_transitions(self):
+        """
+        Add whitespace-specific transitions before those defined in subclass.
+
+        Extends `State.add_initial_transitions()`.
+        """
+        State.add_initial_transitions(self)
+        if self.patterns is None:
+            self.patterns = {}
+        self.patterns.update(self.ws_patterns)
+        names, transitions = self.make_transitions(
+            self.ws_initial_transitions)
+        self.add_transitions(names, transitions)
+
+    def blank(self, match, context, next_state):
+        """Handle blank lines. Does nothing. Override in subclasses."""
+        return self.nop(match, context, next_state)
+
+    def indent(self, match, context, next_state):
+        """
+        Handle an indented text block. Extend or override in subclasses.
+
+        Recursively run the registered state machine for indented blocks
+        (`self.indent_sm`).
+        """
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_indented()
+        sm = self.indent_sm(debug=self.debug, **self.indent_sm_kwargs)
+        results = sm.run(indented, input_offset=line_offset)
+        return context, next_state, results
+
+    def known_indent(self, match, context, next_state):
+        """
+        Handle a known-indent text block. Extend or override in subclasses.
+
+        Recursively run the registered state machine for known-indent indented
+        blocks (`self.known_indent_sm`). The indent is the length of the
+        match, ``match.end()``.
+        """
+        indented, line_offset, blank_finish = \
+              self.state_machine.get_known_indented(match.end())
+        sm = self.known_indent_sm(debug=self.debug,
+                                 **self.known_indent_sm_kwargs)
+        results = sm.run(indented, input_offset=line_offset)
+        return context, next_state, results
+
+    def first_known_indent(self, match, context, next_state):
+        """
+        Handle an indented text block (first line's indent known).
+
+        Extend or override in subclasses.
+
+        Recursively run the registered state machine for known-indent indented
+        blocks (`self.known_indent_sm`). The indent is the length of the
+        match, ``match.end()``.
+        """
+        indented, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        sm = self.known_indent_sm(debug=self.debug,
+                                 **self.known_indent_sm_kwargs)
+        results = sm.run(indented, input_offset=line_offset)
+        return context, next_state, results
+
+
+class _SearchOverride:
+
+    """
+    Mix-in class to override `StateMachine` regular expression behavior.
+
+    Changes regular expression matching, from the default `re.match()`
+    (succeeds only if the pattern matches at the start of `self.line`) to
+    `re.search()` (succeeds if the pattern matches anywhere in `self.line`).
+    When subclassing a `StateMachine`, list this class **first** in the
+    inheritance list of the class definition.
+    """
+
+    def match(self, pattern):
+        """
+        Return the result of a regular expression search.
+
+        Overrides `StateMachine.match()`.
+
+        Parameter `pattern`: `re` compiled regular expression.
+        """
+        return pattern.search(self.line)
+
+
+class SearchStateMachine(_SearchOverride, StateMachine):
+    """`StateMachine` which uses `re.search()` instead of `re.match()`."""
+    pass
+
+
+class SearchStateMachineWS(_SearchOverride, StateMachineWS):
+    """`StateMachineWS` which uses `re.search()` instead of `re.match()`."""
+    pass
+
+
+class ViewList:
+
+    """
+    List with extended functionality: slices of ViewList objects are child
+    lists, linked to their parents. Changes made to a child list also affect
+    the parent list.  A child list is effectively a "view" (in the SQL sense)
+    of the parent list.  Changes to parent lists, however, do *not* affect
+    active child lists.  If a parent list is changed, any active child lists
+    should be recreated.
+
+    The start and end of the slice can be trimmed using the `trim_start()` and
+    `trim_end()` methods, without affecting the parent list.  The link between
+    child and parent lists can be broken by calling `disconnect()` on the
+    child list.
+
+    Also, ViewList objects keep track of the source & offset of each item. 
+    This information is accessible via the `source()`, `offset()`, and
+    `info()` methods.
+    """
+
+    def __init__(self, initlist=None, source=None, items=None,
+                 parent=None, parent_offset=None):
+        self.data = []
+        """The actual list of data, flattened from various sources."""
+
+        self.items = []
+        """A list of (source, offset) pairs, same length as `self.data`: the
+        source of each line and the offset of each line from the beginning of
+        its source."""
+
+        self.parent = parent
+        """The parent list."""
+
+        self.parent_offset = parent_offset
+        """Offset of this list from the beginning of the parent list."""
+
+        if isinstance(initlist, ViewList):
+            self.data = initlist.data[:]
+            self.items = initlist.items[:]
+        elif initlist is not None:
+            self.data = list(initlist)
+            if items:
+                self.items = items
+            else:
+                self.items = [(source, i) for i in range(len(initlist))]
+        assert len(self.data) == len(self.items), 'data mismatch'
+
+    def __str__(self):
+        return str(self.data)
+
+    def __repr__(self):
+        return '%s(%s, items=%s)' % (self.__class__.__name__,
+                                     self.data, self.items)
+
+    def __lt__(self, other): return self.data <  self.__cast(other)
+    def __le__(self, other): return self.data <= self.__cast(other)
+    def __eq__(self, other): return self.data == self.__cast(other)
+    def __ne__(self, other): return self.data != self.__cast(other)
+    def __gt__(self, other): return self.data >  self.__cast(other)
+    def __ge__(self, other): return self.data >= self.__cast(other)
+    def __cmp__(self, other): return cmp(self.data, self.__cast(other))
+
+    def __cast(self, other):
+        if isinstance(other, ViewList):
+            return other.data
+        else:
+            return other
+
+    def __contains__(self, item): return item in self.data
+    def __len__(self): return len(self.data)
+
+    # The __getitem__()/__setitem__() methods check whether the index
+    # is a slice first, since native list objects start supporting
+    # them directly in Python 2.3 (no exception is raised when
+    # indexing a list with a slice object; they just work).
+
+    def __getitem__(self, i):
+        if isinstance(i, types.SliceType):
+            assert i.step in (None, 1),  'cannot handle slice with stride'
+            return self.__class__(self.data[i.start:i.stop],
+                                  items=self.items[i.start:i.stop],
+                                  parent=self, parent_offset=i.start)
+        else:
+            return self.data[i]
+
+    def __setitem__(self, i, item):
+        if isinstance(i, types.SliceType):
+            assert i.step in (None, 1), 'cannot handle slice with stride'
+            if not isinstance(item, ViewList):
+                raise TypeError('assigning non-ViewList to ViewList slice')
+            self.data[i.start:i.stop] = item.data
+            self.items[i.start:i.stop] = item.items
+            assert len(self.data) == len(self.items), 'data mismatch'
+            if self.parent:
+                self.parent[i.start + self.parent_offset
+                            : i.stop + self.parent_offset] = item
+        else:
+            self.data[i] = item
+            if self.parent:
+                self.parent[i + self.parent_offset] = item
+
+    def __delitem__(self, i):
+        try:
+            del self.data[i]
+            del self.items[i]
+            if self.parent:
+                del self.parent[i + self.parent_offset]
+        except TypeError:
+            assert i.step is None, 'cannot handle slice with stride'
+            del self.data[i.start:i.stop]
+            del self.items[i.start:i.stop]
+            if self.parent:
+                del self.parent[i.start + self.parent_offset
+                                : i.stop + self.parent_offset]
+
+    def __add__(self, other):
+        if isinstance(other, ViewList):
+            return self.__class__(self.data + other.data,
+                                  items=(self.items + other.items))
+        else:
+            raise TypeError('adding non-ViewList to a ViewList')
+
+    def __radd__(self, other):
+        if isinstance(other, ViewList):
+            return self.__class__(other.data + self.data,
+                                  items=(other.items + self.items))
+        else:
+            raise TypeError('adding ViewList to a non-ViewList')
+
+    def __iadd__(self, other):
+        if isinstance(other, ViewList):
+            self.data += other.data
+        else:
+            raise TypeError('argument to += must be a ViewList')
+        return self
+
+    def __mul__(self, n):
+        return self.__class__(self.data * n, items=(self.items * n))
+
+    __rmul__ = __mul__
+
+    def __imul__(self, n):
+        self.data *= n
+        self.items *= n
+        return self
+
+    def extend(self, other):
+        if not isinstance(other, ViewList):
+            raise TypeError('extending a ViewList with a non-ViewList')
+        if self.parent:
+            self.parent.insert(len(self.data) + self.parent_offset, other)
+        self.data.extend(other.data)
+        self.items.extend(other.items)
+
+    def append(self, item, source=None, offset=0):
+        if source is None:
+            self.extend(item)
+        else:
+            if self.parent:
+                self.parent.insert(len(self.data) + self.parent_offset, item,
+                                   source, offset)
+            self.data.append(item)
+            self.items.append((source, offset))
+
+    def insert(self, i, item, source=None, offset=0):
+        if source is None:
+            if not isinstance(item, ViewList):
+                raise TypeError('inserting non-ViewList with no source given')
+            self.data[i:i] = item.data
+            self.items[i:i] = item.items
+            if self.parent:
+                index = (len(self.data) + i) % len(self.data)
+                self.parent.insert(index + self.parent_offset, item)
+        else:
+            self.data.insert(i, item)
+            self.items.insert(i, (source, offset))
+            if self.parent:
+                index = (len(self.data) + i) % len(self.data)
+                self.parent.insert(index + self.parent_offset, item,
+                                   source, offset)
+
+    def pop(self, i=-1):
+        if self.parent:
+            index = (len(self.data) + i) % len(self.data)
+            self.parent.pop(index + self.parent_offset)
+        self.items.pop(i)
+        return self.data.pop(i)
+
+    def trim_start(self, n=1):
+        """
+        Remove items from the start of the list, without touching the parent.
+        """
+        if n > len(self.data):
+            raise IndexError("Size of trim too large; can't trim %s items "
+                             "from a list of size %s." % (n, len(self.data)))
+        elif n < 0:
+            raise IndexError('Trim size must be >= 0.')
+        del self.data[:n]
+        del self.items[:n]
+        if self.parent:
+            self.parent_offset += n
+
+    def trim_end(self, n=1):
+        """
+        Remove items from the end of the list, without touching the parent.
+        """
+        if n > len(self.data):
+            raise IndexError("Size of trim too large; can't trim %s items "
+                             "from a list of size %s." % (n, len(self.data)))
+        elif n < 0:
+            raise IndexError('Trim size must be >= 0.')
+        del self.data[-n:]
+        del self.items[-n:]
+
+    def remove(self, item):
+        index = self.index(item)
+        del self[index]
+
+    def count(self, item): return self.data.count(item)
+    def index(self, item): return self.data.index(item)
+
+    def reverse(self):
+        self.data.reverse()
+        self.items.reverse()
+        self.parent = None
+
+    def sort(self, *args):
+        tmp = zip(self.data, self.items)
+        tmp.sort(*args)
+        self.data = [entry[0] for entry in tmp]
+        self.items = [entry[1] for entry in tmp]
+        self.parent = None
+
+    def info(self, i):
+        """Return source & offset for index `i`."""
+        try:
+            return self.items[i]
+        except IndexError:
+            if i == len(self.data):     # Just past the end
+                return self.items[i - 1][0], None
+            else:
+                raise
+
+    def source(self, i):
+        """Return source for index `i`."""
+        return self.info(i)[0]
+
+    def offset(self, i):
+        """Return offset for index `i`."""
+        return self.info(i)[1]
+
+    def disconnect(self):
+        """Break link between this list and parent list."""
+        self.parent = None
+
+
+class StringList(ViewList):
+
+    """A `ViewList` with string-specific methods."""
+
+    def trim_left(self, length, start=0, end=sys.maxint):
+        """
+        Trim `length` characters off the beginning of each item, in-place,
+        from index `start` to `end`.  No whitespace-checking is done on the
+        trimmed text.  Does not affect slice parent.
+        """
+        self.data[start:end] = [line[length:]
+                                for line in self.data[start:end]]
+
+    def get_text_block(self, start, flush_left=0):
+        """
+        Return a contiguous block of text.
+
+        If `flush_left` is true, raise `UnexpectedIndentationError` if an
+        indented line is encountered before the text block ends (with a blank
+        line).
+        """
+        end = start
+        last = len(self.data)
+        while end < last:
+            line = self.data[end]
+            if not line.strip():
+                break
+            if flush_left and (line[0] == ' '):
+                source, offset = self.info(end)
+                raise UnexpectedIndentationError(self[start:end], source,
+                                                 offset + 1)
+            end += 1
+        return self[start:end]
+
+    def get_indented(self, start=0, until_blank=0, strip_indent=1,
+                     block_indent=None, first_indent=None):
+        """
+        Extract and return a StringList of indented lines of text.
+
+        Collect all lines with indentation, determine the minimum indentation,
+        remove the minimum indentation from all indented lines (unless
+        `strip_indent` is false), and return them. All lines up to but not
+        including the first unindented line will be returned.
+
+        :Parameters:
+          - `start`: The index of the first line to examine.
+          - `until_blank`: Stop collecting at the first blank line if true.
+          - `strip_indent`: Strip common leading indent if true (default).
+          - `block_indent`: The indent of the entire block, if known.
+          - `first_indent`: The indent of the first line, if known.
+
+        :Return:
+          - a StringList of indented lines with mininum indent removed;
+          - the amount of the indent;
+          - a boolean: did the indented block finish with a blank line or EOF?
+        """
+        indent = block_indent           # start with None if unknown
+        end = start
+        if block_indent is not None and first_indent is None:
+            first_indent = block_indent
+        if first_indent is not None:
+            end += 1
+        last = len(self.data)
+        while end < last:
+            line = self.data[end]
+            if line and (line[0] != ' '
+                         or (block_indent is not None
+                             and line[:block_indent].strip())):
+                # Line not indented or insufficiently indented.
+                # Block finished properly iff the last indented line blank:
+                blank_finish = ((end > start)
+                                and not self.data[end - 1].strip())
+                break
+            stripped = line.lstrip()
+            if not stripped:            # blank line
+                if until_blank:
+                    blank_finish = 1
+                    break
+            elif block_indent is None:
+                line_indent = len(line) - len(stripped)
+                if indent is None:
+                    indent = line_indent
+                else:
+                    indent = min(indent, line_indent)
+            end += 1
+        else:
+            blank_finish = 1            # block ends at end of lines
+        block = self[start:end]
+        if first_indent is not None and block:
+            block.data[0] = block.data[0][first_indent:]
+        if indent and strip_indent:
+            block.trim_left(indent, start=(first_indent is not None))
+        return block, indent or 0, blank_finish
+
+    def get_2D_block(self, top, left, bottom, right, strip_indent=1):
+        block = self[top:bottom]
+        indent = right
+        for i in range(len(block.data)):
+            block.data[i] = line = block.data[i][left:right].rstrip()
+            if line:
+                indent = min(indent, len(line) - len(line.lstrip()))
+        if strip_indent and 0 < indent < right:
+            block.data = [line[indent:] for line in block.data]
+        return block
+
+    def pad_double_width(self, pad_char):
+        """
+        Pad all double-width characters in self by appending `pad_char` to each.
+        For East Asian language support.
+        """
+        if hasattr(unicodedata, 'east_asian_width'):
+            east_asian_width = unicodedata.east_asian_width
+        else:
+            return                      # new in Python 2.4
+        for i in range(len(self.data)):
+            line = self.data[i]
+            if isinstance(line, types.UnicodeType):
+                new = []
+                for char in line:
+                    new.append(char)
+                    if east_asian_width(char) in 'WF': # 'W'ide & 'F'ull-width
+                        new.append(pad_char)
+                self.data[i] = ''.join(new)
+
+    def replace(self, old, new):
+        """Replace all occurrences of substring `old` with `new`."""
+        for i in range(len(self.data)):
+            self.data[i] = self.data[i].replace(old, new)
+
+
+class StateMachineError(Exception): pass
+class UnknownStateError(StateMachineError): pass
+class DuplicateStateError(StateMachineError): pass
+class UnknownTransitionError(StateMachineError): pass
+class DuplicateTransitionError(StateMachineError): pass
+class TransitionPatternNotFound(StateMachineError): pass
+class TransitionMethodNotFound(StateMachineError): pass
+class UnexpectedIndentationError(StateMachineError): pass
+
+
+class TransitionCorrection(Exception):
+
+    """
+    Raise from within a transition method to switch to another transition.
+
+    Raise with one argument, the new transition name.
+    """
+
+
+class StateCorrection(Exception):
+
+    """
+    Raise from within a transition method to switch to another state.
+
+    Raise with one or two arguments: new state name, and an optional new
+    transition name.
+    """
+
+
+def string2lines(astring, tab_width=8, convert_whitespace=0,
+                 whitespace=re.compile('[\v\f]')):
+    """
+    Return a list of one-line strings with tabs expanded, no newlines, and
+    trailing whitespace stripped.
+
+    Each tab is expanded with between 1 and `tab_width` spaces, so that the
+    next character's index becomes a multiple of `tab_width` (8 by default).
+
+    Parameters:
+
+    - `astring`: a multi-line string.
+    - `tab_width`: the number of columns between tab stops.
+    - `convert_whitespace`: convert form feeds and vertical tabs to spaces?
+    """
+    if convert_whitespace:
+        astring = whitespace.sub(' ', astring)
+    return [s.expandtabs(tab_width).rstrip() for s in astring.splitlines()]
+
+def _exception_data():
+    """
+    Return exception information:
+
+    - the exception's class name;
+    - the exception object;
+    - the name of the file containing the offending code;
+    - the line number of the offending code;
+    - the function name of the offending code.
+    """
+    type, value, traceback = sys.exc_info()
+    while traceback.tb_next:
+        traceback = traceback.tb_next
+    code = traceback.tb_frame.f_code
+    return (type.__name__, value, code.co_filename, traceback.tb_lineno,
+            code.co_name)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,172 @@
+# $Id: __init__.py 4975 2007-03-01 18:08:32Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains modules for standard tree transforms available
+to Docutils components. Tree transforms serve a variety of purposes:
+
+- To tie up certain syntax-specific "loose ends" that remain after the
+  initial parsing of the input plaintext. These transforms are used to
+  supplement a limited syntax.
+
+- To automate the internal linking of the document tree (hyperlink
+  references, footnote references, etc.).
+
+- To extract useful information from the document tree. These
+  transforms may be used to construct (for example) indexes and tables
+  of contents.
+
+Each transform is an optional step that a Docutils component may
+choose to perform on the parsed document.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils import languages, ApplicationError, TransformSpec
+
+
+class TransformError(ApplicationError): pass
+
+
+class Transform:
+
+    """
+    Docutils transform component abstract base class.
+    """
+
+    default_priority = None
+    """Numerical priority of this transform, 0 through 999 (override)."""
+
+    def __init__(self, document, startnode=None):
+        """
+        Initial setup for in-place document transforms.
+        """
+
+        self.document = document
+        """The document tree to transform."""
+
+        self.startnode = startnode
+        """Node from which to begin the transform.  For many transforms which
+        apply to the document as a whole, `startnode` is not set (i.e. its
+        value is `None`)."""
+
+        self.language = languages.get_language(
+            document.settings.language_code)
+        """Language module local to this document."""
+
+    def apply(self, **kwargs):
+        """Override to apply the transform to the document tree."""
+        raise NotImplementedError('subclass must override this method')
+
+
+class Transformer(TransformSpec):
+
+    """
+    Stores transforms (`Transform` classes) and applies them to document
+    trees.  Also keeps track of components by component type name.
+    """
+
+    def __init__(self, document):
+        self.transforms = []
+        """List of transforms to apply.  Each item is a 3-tuple:
+        ``(priority string, transform class, pending node or None)``."""
+
+        self.unknown_reference_resolvers = []
+        """List of hook functions which assist in resolving references"""
+
+        self.document = document
+        """The `nodes.document` object this Transformer is attached to."""
+
+        self.applied = []
+        """Transforms already applied, in order."""
+
+        self.sorted = 0
+        """Boolean: is `self.tranforms` sorted?"""
+
+        self.components = {}
+        """Mapping of component type name to component object.  Set by
+        `self.populate_from_components()`."""
+
+        self.serialno = 0
+        """Internal serial number to keep track of the add order of
+        transforms."""
+
+    def add_transform(self, transform_class, priority=None, **kwargs):
+        """
+        Store a single transform.  Use `priority` to override the default.
+        `kwargs` is a dictionary whose contents are passed as keyword
+        arguments to the `apply` method of the transform.  This can be used to
+        pass application-specific data to the transform instance.
+        """
+        if priority is None:
+            priority = transform_class.default_priority
+        priority_string = self.get_priority_string(priority)
+        self.transforms.append(
+            (priority_string, transform_class, None, kwargs))
+        self.sorted = 0
+
+    def add_transforms(self, transform_list):
+        """Store multiple transforms, with default priorities."""
+        for transform_class in transform_list:
+            priority_string = self.get_priority_string(
+                transform_class.default_priority)
+            self.transforms.append(
+                (priority_string, transform_class, None, {}))
+        self.sorted = 0
+
+    def add_pending(self, pending, priority=None):
+        """Store a transform with an associated `pending` node."""
+        transform_class = pending.transform
+        if priority is None:
+            priority = transform_class.default_priority
+        priority_string = self.get_priority_string(priority)
+        self.transforms.append(
+            (priority_string, transform_class, pending, {}))
+        self.sorted = 0
+
+    def get_priority_string(self, priority):
+        """
+        Return a string, `priority` combined with `self.serialno`.
+
+        This ensures FIFO order on transforms with identical priority.
+        """
+        self.serialno += 1
+        return '%03d-%03d' % (priority, self.serialno)
+
+    def populate_from_components(self, components):
+        """
+        Store each component's default transforms, with default priorities.
+        Also, store components by type name in a mapping for later lookup.
+        """
+        for component in components:
+            if component is None:
+                continue
+            self.add_transforms(component.get_transforms())
+            self.components[component.component_type] = component
+        self.sorted = 0
+        # Set up all of the reference resolvers for this transformer. Each
+        # component of this transformer is able to register its own helper
+        # functions to help resolve references.
+        unknown_reference_resolvers = []
+        for i in components:
+            unknown_reference_resolvers.extend(i.unknown_reference_resolvers)
+        decorated_list = [(f.priority, f) for f in unknown_reference_resolvers]
+        decorated_list.sort()
+        self.unknown_reference_resolvers.extend([f[1] for f in decorated_list])
+
+    def apply_transforms(self):
+        """Apply all of the stored transforms, in priority order."""
+        self.document.reporter.attach_observer(
+            self.document.note_transform_message)
+        while self.transforms:
+            if not self.sorted:
+                # Unsorted initially, and whenever a transform is added.
+                self.transforms.sort()
+                self.transforms.reverse()
+                self.sorted = 1
+            priority, transform_class, pending, kwargs = self.transforms.pop()
+            transform = transform_class(self.document, startnode=pending)
+            transform.apply(**kwargs)
+            self.applied.append((priority, transform_class, pending, kwargs))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/components.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,52 @@
+# $Id: components.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Docutils component-related transforms.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import re
+import time
+from docutils import nodes, utils
+from docutils import ApplicationError, DataError
+from docutils.transforms import Transform, TransformError
+
+
+class Filter(Transform):
+
+    """
+    Include or exclude elements which depend on a specific Docutils component.
+
+    For use with `nodes.pending` elements.  A "pending" element's dictionary
+    attribute ``details`` must contain the keys "component" and "format".  The
+    value of ``details['component']`` must match the type name of the
+    component the elements depend on (e.g. "writer").  The value of
+    ``details['format']`` is the name of a specific format or context of that
+    component (e.g. "html").  If the matching Docutils component supports that
+    format or context, the "pending" element is replaced by the contents of
+    ``details['nodes']`` (a list of nodes); otherwise, the "pending" element
+    is removed.
+
+    For example, the reStructuredText "meta" directive creates a "pending"
+    element containing a "meta" element (in ``pending.details['nodes']``).
+    Only writers (``pending.details['component'] == 'writer'``) supporting the
+    "html" format (``pending.details['format'] == 'html'``) will include the
+    "meta" element; it will be deleted from the output of all other writers.
+    """
+
+    default_priority = 780
+
+    def apply(self):
+        pending = self.startnode
+        component_type = pending.details['component'] # 'reader' or 'writer'
+        format = pending.details['format']
+        component = self.document.transformer.components[component_type]
+        if component.supports(format):
+            pending.replace_self(pending.details['nodes'])
+        else:
+            pending.parent.remove(pending)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/frontmatter.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,512 @@
+# $Id: frontmatter.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger, Ueli Schlaepfer <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms related to the front matter of a document or a section
+(information found before the main text):
+
+- `DocTitle`: Used to transform a lone top level section's title to
+  the document title, promote a remaining lone top-level section's
+  title to the document subtitle, and determine the document's title
+  metadata (document['title']) based on the document title and/or the
+  "title" setting.
+
+- `SectionSubTitle`: Used to transform a lone subsection into a
+  subtitle.
+
+- `DocInfo`: Used to transform a bibliographic field list into docinfo
+  elements.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class TitlePromoter(Transform):
+
+    """
+    Abstract base class for DocTitle and SectionSubTitle transforms.
+    """
+
+    def promote_title(self, node):
+        """
+        Transform the following tree::
+
+            <node>
+                <section>
+                    <title>
+                    ...
+
+        into ::
+
+            <node>
+                <title>
+                ...
+
+        `node` is normally a document.
+        """
+        # `node` must not have a title yet.
+        assert not (len(node) and isinstance(node[0], nodes.title))
+        section, index = self.candidate_index(node)
+        if index is None:
+            return None
+        # Transfer the section's attributes to the node:
+        node.attributes.update(section.attributes)
+        # setup_child is called automatically for all nodes.
+        node[:] = (section[:1]        # section title
+                   + node[:index]     # everything that was in the
+                                      # node before the section
+                   + section[1:])     # everything that was in the section
+        assert isinstance(node[0], nodes.title)
+        return 1
+
+    def promote_subtitle(self, node):
+        """
+        Transform the following node tree::
+
+            <node>
+                <title>
+                <section>
+                    <title>
+                    ...
+
+        into ::
+
+            <node>
+                <title>
+                <subtitle>
+                ...
+        """
+        subsection, index = self.candidate_index(node)
+        if index is None:
+            return None
+        subtitle = nodes.subtitle()
+        # Transfer the subsection's attributes to the new subtitle:
+        # This causes trouble with list attributes!  To do: Write a
+        # test case which catches direct access to the `attributes`
+        # dictionary and/or write a test case which shows problems in
+        # this particular case.
+        subtitle.attributes.update(subsection.attributes)
+        # We're losing the subtitle's attributes here!  To do: Write a
+        # test case which shows this behavior.
+        # Transfer the contents of the subsection's title to the
+        # subtitle:
+        subtitle[:] = subsection[0][:]
+        node[:] = (node[:1]       # title
+                   + [subtitle]
+                   # everything that was before the section:
+                   + node[1:index]
+                   # everything that was in the subsection:
+                   + subsection[1:])
+        return 1
+
+    def candidate_index(self, node):
+        """
+        Find and return the promotion candidate and its index.
+
+        Return (None, None) if no valid candidate was found.
+        """
+        index = node.first_child_not_matching_class(
+            nodes.PreBibliographic)
+        if index is None or len(node) > (index + 1) or \
+               not isinstance(node[index], nodes.section):
+            return None, None
+        else:
+            return node[index], index
+
+
+class DocTitle(TitlePromoter):
+
+    """
+    In reStructuredText_, there is no way to specify a document title
+    and subtitle explicitly. Instead, we can supply the document title
+    (and possibly the subtitle as well) implicitly, and use this
+    two-step transform to "raise" or "promote" the title(s) (and their
+    corresponding section contents) to the document level.
+
+    1. If the document contains a single top-level section as its
+       first non-comment element, the top-level section's title
+       becomes the document's title, and the top-level section's
+       contents become the document's immediate contents. The lone
+       top-level section header must be the first non-comment element
+       in the document.
+
+       For example, take this input text::
+
+           =================
+            Top-Level Title
+           =================
+
+           A paragraph.
+
+       Once parsed, it looks like this::
+
+           <document>
+               <section names="top-level title">
+                   <title>
+                       Top-Level Title
+                   <paragraph>
+                       A paragraph.
+
+       After running the DocTitle transform, we have::
+
+           <document names="top-level title">
+               <title>
+                   Top-Level Title
+               <paragraph>
+                   A paragraph.
+
+    2. If step 1 successfully determines the document title, we
+       continue by checking for a subtitle.
+
+       If the lone top-level section itself contains a single
+       second-level section as its first non-comment element, that
+       section's title is promoted to the document's subtitle, and
+       that section's contents become the document's immediate
+       contents. Given this input text::
+
+           =================
+            Top-Level Title
+           =================
+
+           Second-Level Title
+           ~~~~~~~~~~~~~~~~~~
+
+           A paragraph.
+
+       After parsing and running the Section Promotion transform, the
+       result is::
+
+           <document names="top-level title">
+               <title>
+                   Top-Level Title
+               <subtitle names="second-level title">
+                   Second-Level Title
+               <paragraph>
+                   A paragraph.
+
+       (Note that the implicit hyperlink target generated by the
+       "Second-Level Title" is preserved on the "subtitle" element
+       itself.)
+
+    Any comment elements occurring before the document title or
+    subtitle are accumulated and inserted as the first body elements
+    after the title(s).
+
+    This transform also sets the document's metadata title
+    (document['title']).
+
+    .. _reStructuredText: http://docutils.sf.net/rst.html
+    """
+
+    default_priority = 320
+
+    def set_metadata(self):
+        """
+        Set document['title'] metadata title from the following
+        sources, listed in order of priority:
+
+        * Existing document['title'] attribute.
+        * "title" setting.
+        * Document title node (as promoted by promote_title).
+        """
+        if not self.document.hasattr('title'):
+            if self.document.settings.title is not None:
+                self.document['title'] = self.document.settings.title
+            elif len(self.document) and isinstance(self.document[0], nodes.title):
+                self.document['title'] = self.document[0].astext()
+
+    def apply(self):
+        if getattr(self.document.settings, 'doctitle_xform', 1):
+            # promote_(sub)title defined in TitlePromoter base class.
+            if self.promote_title(self.document):
+                # If a title has been promoted, also try to promote a
+                # subtitle.
+                self.promote_subtitle(self.document)
+        # Set document['title'].
+        self.set_metadata()
+
+
+class SectionSubTitle(TitlePromoter):
+
+    """
+    This works like document subtitles, but for sections.  For example, ::
+
+        <section>
+            <title>
+                Title
+            <section>
+                <title>
+                    Subtitle
+                ...
+
+    is transformed into ::
+
+        <section>
+            <title>
+                Title
+            <subtitle>
+                Subtitle
+            ...
+
+    For details refer to the docstring of DocTitle.
+    """
+
+    default_priority = 350
+
+    def apply(self):
+        if not getattr(self.document.settings, 'sectsubtitle_xform', 1):
+            return
+        for section in self.document.traverse(nodes.section):
+            # On our way through the node tree, we are deleting
+            # sections, but we call self.promote_subtitle for those
+            # sections nonetheless.  To do: Write a test case which
+            # shows the problem and discuss on Docutils-develop.
+            self.promote_subtitle(section)
+
+
+class DocInfo(Transform):
+
+    """
+    This transform is specific to the reStructuredText_ markup syntax;
+    see "Bibliographic Fields" in the `reStructuredText Markup
+    Specification`_ for a high-level description. This transform
+    should be run *after* the `DocTitle` transform.
+
+    Given a field list as the first non-comment element after the
+    document title and subtitle (if present), registered bibliographic
+    field names are transformed to the corresponding DTD elements,
+    becoming child elements of the "docinfo" element (except for a
+    dedication and/or an abstract, which become "topic" elements after
+    "docinfo").
+
+    For example, given this document fragment after parsing::
+
+        <document>
+            <title>
+                Document Title
+            <field_list>
+                <field>
+                    <field_name>
+                        Author
+                    <field_body>
+                        <paragraph>
+                            A. Name
+                <field>
+                    <field_name>
+                        Status
+                    <field_body>
+                        <paragraph>
+                            $RCSfile$
+            ...
+
+    After running the bibliographic field list transform, the
+    resulting document tree would look like this::
+
+        <document>
+            <title>
+                Document Title
+            <docinfo>
+                <author>
+                    A. Name
+                <status>
+                    frontmatter.py
+            ...
+
+    The "Status" field contained an expanded RCS keyword, which is
+    normally (but optionally) cleaned up by the transform. The sole
+    contents of the field body must be a paragraph containing an
+    expanded RCS keyword of the form "$keyword: expansion text $". Any
+    RCS keyword can be processed in any bibliographic field. The
+    dollar signs and leading RCS keyword name are removed. Extra
+    processing is done for the following RCS keywords:
+
+    - "RCSfile" expands to the name of the file in the RCS or CVS
+      repository, which is the name of the source file with a ",v"
+      suffix appended. The transform will remove the ",v" suffix.
+
+    - "Date" expands to the format "YYYY/MM/DD hh:mm:ss" (in the UTC
+      time zone). The RCS Keywords transform will extract just the
+      date itself and transform it to an ISO 8601 format date, as in
+      "2000-12-31".
+
+      (Since the source file for this text is itself stored under CVS,
+      we can't show an example of the "Date" RCS keyword because we
+      can't prevent any RCS keywords used in this explanation from
+      being expanded. Only the "RCSfile" keyword is stable; its
+      expansion text changes only if the file name changes.)
+
+    .. _reStructuredText: http://docutils.sf.net/rst.html
+    .. _reStructuredText Markup Specification:
+       http://docutils.sf.net/docs/ref/rst/restructuredtext.html
+    """
+
+    default_priority = 340
+
+    biblio_nodes = {
+          'author': nodes.author,
+          'authors': nodes.authors,
+          'organization': nodes.organization,
+          'address': nodes.address,
+          'contact': nodes.contact,
+          'version': nodes.version,
+          'revision': nodes.revision,
+          'status': nodes.status,
+          'date': nodes.date,
+          'copyright': nodes.copyright,
+          'dedication': nodes.topic,
+          'abstract': nodes.topic}
+    """Canonical field name (lowcased) to node class name mapping for
+    bibliographic fields (field_list)."""
+
+    def apply(self):
+        if not getattr(self.document.settings, 'docinfo_xform', 1):
+            return
+        document = self.document
+        index = document.first_child_not_matching_class(
+              nodes.PreBibliographic)
+        if index is None:
+            return
+        candidate = document[index]
+        if isinstance(candidate, nodes.field_list):
+            biblioindex = document.first_child_not_matching_class(
+                  (nodes.Titular, nodes.Decorative))
+            nodelist = self.extract_bibliographic(candidate)
+            del document[index]         # untransformed field list (candidate)
+            document[biblioindex:biblioindex] = nodelist
+
+    def extract_bibliographic(self, field_list):
+        docinfo = nodes.docinfo()
+        bibliofields = self.language.bibliographic_fields
+        labels = self.language.labels
+        topics = {'dedication': None, 'abstract': None}
+        for field in field_list:
+            try:
+                name = field[0][0].astext()
+                normedname = nodes.fully_normalize_name(name)
+                if not (len(field) == 2 and bibliofields.has_key(normedname)
+                        and self.check_empty_biblio_field(field, name)):
+                    raise TransformError
+                canonical = bibliofields[normedname]
+                biblioclass = self.biblio_nodes[canonical]
+                if issubclass(biblioclass, nodes.TextElement):
+                    if not self.check_compound_biblio_field(field, name):
+                        raise TransformError
+                    utils.clean_rcs_keywords(
+                          field[1][0], self.rcs_keyword_substitutions)
+                    docinfo.append(biblioclass('', '', *field[1][0]))
+                elif issubclass(biblioclass, nodes.authors):
+                    self.extract_authors(field, name, docinfo)
+                elif issubclass(biblioclass, nodes.topic):
+                    if topics[canonical]:
+                        field[-1] += self.document.reporter.warning(
+                            'There can only be one "%s" field.' % name,
+                            base_node=field)
+                        raise TransformError
+                    title = nodes.title(name, labels[canonical])
+                    topics[canonical] = biblioclass(
+                        '', title, classes=[canonical], *field[1].children)
+                else:
+                    docinfo.append(biblioclass('', *field[1].children))
+            except TransformError:
+                if len(field[-1]) == 1 \
+                       and isinstance(field[-1][0], nodes.paragraph):
+                    utils.clean_rcs_keywords(
+                        field[-1][0], self.rcs_keyword_substitutions)
+                docinfo.append(field)
+        nodelist = []
+        if len(docinfo) != 0:
+            nodelist.append(docinfo)
+        for name in ('dedication', 'abstract'):
+            if topics[name]:
+                nodelist.append(topics[name])
+        return nodelist
+
+    def check_empty_biblio_field(self, field, name):
+        if len(field[-1]) < 1:
+            field[-1] += self.document.reporter.warning(
+                  'Cannot extract empty bibliographic field "%s".' % name,
+                  base_node=field)
+            return None
+        return 1
+
+    def check_compound_biblio_field(self, field, name):
+        if len(field[-1]) > 1:
+            field[-1] += self.document.reporter.warning(
+                  'Cannot extract compound bibliographic field "%s".' % name,
+                  base_node=field)
+            return None
+        if not isinstance(field[-1][0], nodes.paragraph):
+            field[-1] += self.document.reporter.warning(
+                  'Cannot extract bibliographic field "%s" containing '
+                  'anything other than a single paragraph.' % name,
+                  base_node=field)
+            return None
+        return 1
+
+    rcs_keyword_substitutions = [
+          (re.compile(r'\$' r'Date: (\d\d\d\d)[-/](\d\d)[-/](\d\d)[ T][\d:]+'
+                      r'[^$]* \$', re.IGNORECASE), r'\1-\2-\3'),
+          (re.compile(r'\$' r'RCSfile: (.+),v \$', re.IGNORECASE), r'\1'),
+          (re.compile(r'\$[a-zA-Z]+: (.+) \$'), r'\1'),]
+
+    def extract_authors(self, field, name, docinfo):
+        try:
+            if len(field[1]) == 1:
+                if isinstance(field[1][0], nodes.paragraph):
+                    authors = self.authors_from_one_paragraph(field)
+                elif isinstance(field[1][0], nodes.bullet_list):
+                    authors = self.authors_from_bullet_list(field)
+                else:
+                    raise TransformError
+            else:
+                authors = self.authors_from_paragraphs(field)
+            authornodes = [nodes.author('', '', *author)
+                           for author in authors if author]
+            if len(authornodes) >= 1:
+                docinfo.append(nodes.authors('', *authornodes))
+            else:
+                raise TransformError
+        except TransformError:
+            field[-1] += self.document.reporter.warning(
+                  'Bibliographic field "%s" incompatible with extraction: '
+                  'it must contain either a single paragraph (with authors '
+                  'separated by one of "%s"), multiple paragraphs (one per '
+                  'author), or a bullet list with one paragraph (one author) '
+                  'per item.'
+                  % (name, ''.join(self.language.author_separators)),
+                  base_node=field)
+            raise
+
+    def authors_from_one_paragraph(self, field):
+        text = field[1][0].astext().strip()
+        if not text:
+            raise TransformError
+        for authorsep in self.language.author_separators:
+            authornames = text.split(authorsep)
+            if len(authornames) > 1:
+                break
+        authornames = [author.strip() for author in authornames]
+        authors = [[nodes.Text(author)] for author in authornames if author]
+        return authors
+
+    def authors_from_bullet_list(self, field):
+        authors = []
+        for item in field[1][0]:
+            if len(item) != 1 or not isinstance(item[0], nodes.paragraph):
+                raise TransformError
+            authors.append(item[0].children)
+        if not authors:
+            raise TransformError
+        return authors
+
+    def authors_from_paragraphs(self, field):
+        for item in field[1]:
+            if not isinstance(item, nodes.paragraph):
+                raise TransformError
+        authors = [item.children for item in field[1]]
+        return authors
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/misc.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,143 @@
+# $Id: misc.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Miscellaneous transforms.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes
+from docutils.transforms import Transform, TransformError
+
+
+class CallBack(Transform):
+
+    """
+    Inserts a callback into a document.  The callback is called when the
+    transform is applied, which is determined by its priority.
+
+    For use with `nodes.pending` elements.  Requires a ``details['callback']``
+    entry, a bound method or function which takes one parameter: the pending
+    node.  Other data can be stored in the ``details`` attribute or in the
+    object hosting the callback method.
+    """
+
+    default_priority = 990
+
+    def apply(self):
+        pending = self.startnode
+        pending.details['callback'](pending)
+        pending.parent.remove(pending)
+
+
+class ClassAttribute(Transform):
+
+    """
+    Move the "class" attribute specified in the "pending" node into the
+    immediately following non-comment element.
+    """
+
+    default_priority = 210
+
+    def apply(self):
+        pending = self.startnode
+        parent = pending.parent
+        child = pending
+        while parent:
+            # Check for appropriate following siblings:
+            for index in range(parent.index(child) + 1, len(parent)):
+                element = parent[index]
+                if (isinstance(element, nodes.Invisible) or
+                    isinstance(element, nodes.system_message)):
+                    continue
+                element['classes'] += pending.details['class']
+                pending.parent.remove(pending)
+                return
+            else:
+                # At end of section or container; apply to sibling
+                child = parent
+                parent = parent.parent
+        error = self.document.reporter.error(
+            'No suitable element following "%s" directive'
+            % pending.details['directive'],
+            nodes.literal_block(pending.rawsource, pending.rawsource),
+            line=pending.line)
+        pending.replace_self(error)
+
+
+class Transitions(Transform):
+
+    """
+    Move transitions at the end of sections up the tree.  Complain
+    on transitions after a title, at the beginning or end of the
+    document, and after another transition.
+
+    For example, transform this::
+
+        <section>
+            ...
+            <transition>
+        <section>
+            ...
+
+    into this::
+
+        <section>
+            ...
+        <transition>
+        <section>
+            ...
+    """
+
+    default_priority = 830
+
+    def apply(self):
+        for node in self.document.traverse(nodes.transition):
+            self.visit_transition(node)
+
+    def visit_transition(self, node):
+        index = node.parent.index(node)
+        error = None
+        if (index == 0 or
+            isinstance(node.parent[0], nodes.title) and
+            (index == 1 or
+             isinstance(node.parent[1], nodes.subtitle) and
+             index == 2)):
+            assert (isinstance(node.parent, nodes.document) or
+                    isinstance(node.parent, nodes.section))
+            error = self.document.reporter.error(
+                'Document or section may not begin with a transition.',
+                line=node.line)
+        elif isinstance(node.parent[index - 1], nodes.transition):
+            error = self.document.reporter.error(
+                'At least one body element must separate transitions; '
+                'adjacent transitions are not allowed.', line=node.line)
+        if error:
+            # Insert before node and update index.
+            node.parent.insert(index, error)
+            index += 1
+        assert index < len(node.parent)
+        if index != len(node.parent) - 1:
+            # No need to move the node.
+            return
+        # Node behind which the transition is to be moved.
+        sibling = node
+        # While sibling is the last node of its parent.
+        while index == len(sibling.parent) - 1:
+            sibling = sibling.parent
+            # If sibling is the whole document (i.e. it has no parent).
+            if sibling.parent is None:
+                # Transition at the end of document.  Do not move the
+                # transition up, and place an error behind.
+                error = self.document.reporter.error(
+                    'Document may not end with a transition.',
+                    line=node.line)
+                node.parent.insert(node.parent.index(node) + 1, error)
+                return
+            index = sibling.parent.index(sibling)
+        # Remove the original transition node.
+        node.parent.remove(node)
+        # Insert the transition after the sibling.
+        sibling.parent.insert(index + 1, node)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/parts.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,164 @@
+# $Id: parts.py 4891 2007-01-22 08:35:57Z wiemann $
+# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer; Dmitry Jemerov
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms related to document parts.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import re
+import sys
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class SectNum(Transform):
+
+    """
+    Automatically assigns numbers to the titles of document sections.
+
+    It is possible to limit the maximum section level for which the numbers
+    are added.  For those sections that are auto-numbered, the "autonum"
+    attribute is set, informing the contents table generator that a different
+    form of the TOC should be used.
+    """
+
+    default_priority = 710
+    """Should be applied before `Contents`."""
+
+    def apply(self):
+        self.maxdepth = self.startnode.details.get('depth', sys.maxint)
+        self.startvalue = self.startnode.details.get('start', 1)
+        self.prefix = self.startnode.details.get('prefix', '')
+        self.suffix = self.startnode.details.get('suffix', '')
+        self.startnode.parent.remove(self.startnode)
+        if self.document.settings.sectnum_xform:
+            self.update_section_numbers(self.document)
+
+    def update_section_numbers(self, node, prefix=(), depth=0):
+        depth += 1
+        if prefix:
+            sectnum = 1
+        else:
+            sectnum = self.startvalue
+        for child in node:
+            if isinstance(child, nodes.section):
+                numbers = prefix + (str(sectnum),)
+                title = child[0]
+                # Use &nbsp; for spacing:
+                generated = nodes.generated(
+                    '', (self.prefix + '.'.join(numbers) + self.suffix
+                         +  u'\u00a0' * 3),
+                    classes=['sectnum'])
+                title.insert(0, generated)
+                title['auto'] = 1
+                if depth < self.maxdepth:
+                    self.update_section_numbers(child, numbers, depth)
+                sectnum += 1
+
+
+class Contents(Transform):
+
+    """
+    This transform generates a table of contents from the entire document tree
+    or from a single branch.  It locates "section" elements and builds them
+    into a nested bullet list, which is placed within a "topic" created by the
+    contents directive.  A title is either explicitly specified, taken from
+    the appropriate language module, or omitted (local table of contents).
+    The depth may be specified.  Two-way references between the table of
+    contents and section titles are generated (requires Writer support).
+
+    This transform requires a startnode, which which contains generation
+    options and provides the location for the generated table of contents (the
+    startnode is replaced by the table of contents "topic").
+    """
+
+    default_priority = 720
+
+    def apply(self):
+        details = self.startnode.details
+        if details.has_key('local'):
+            startnode = self.startnode.parent.parent
+            while not (isinstance(startnode, nodes.section)
+                       or isinstance(startnode, nodes.document)):
+                # find the ToC root: a direct ancestor of startnode
+                startnode = startnode.parent
+        else:
+            startnode = self.document
+        self.toc_id = self.startnode.parent['ids'][0]
+        if details.has_key('backlinks'):
+            self.backlinks = details['backlinks']
+        else:
+            self.backlinks = self.document.settings.toc_backlinks
+        contents = self.build_contents(startnode)
+        if len(contents):
+            self.startnode.replace_self(contents)
+        else:
+            self.startnode.parent.parent.remove(self.startnode.parent)
+
+    def build_contents(self, node, level=0):
+        level += 1
+        sections = [sect for sect in node if isinstance(sect, nodes.section)]
+        entries = []
+        autonum = 0
+        depth = self.startnode.details.get('depth', sys.maxint)
+        for section in sections:
+            title = section[0]
+            auto = title.get('auto')    # May be set by SectNum.
+            entrytext = self.copy_and_filter(title)
+            reference = nodes.reference('', '', refid=section['ids'][0],
+                                        *entrytext)
+            ref_id = self.document.set_id(reference)
+            entry = nodes.paragraph('', '', reference)
+            item = nodes.list_item('', entry)
+            if ( self.backlinks in ('entry', 'top')
+                 and title.next_node(nodes.reference) is None):
+                if self.backlinks == 'entry':
+                    title['refid'] = ref_id
+                elif self.backlinks == 'top':
+                    title['refid'] = self.toc_id
+            if level < depth:
+                subsects = self.build_contents(section, level)
+                item += subsects
+            entries.append(item)
+        if entries:
+            contents = nodes.bullet_list('', *entries)
+            if auto:
+                contents['classes'].append('auto-toc')
+            return contents
+        else:
+            return []
+
+    def copy_and_filter(self, node):
+        """Return a copy of a title, with references, images, etc. removed."""
+        visitor = ContentsFilter(self.document)
+        node.walkabout(visitor)
+        return visitor.get_entry_text()
+
+
+class ContentsFilter(nodes.TreeCopyVisitor):
+
+    def get_entry_text(self):
+        return self.get_tree_copy().children
+
+    def visit_citation_reference(self, node):
+        raise nodes.SkipNode
+
+    def visit_footnote_reference(self, node):
+        raise nodes.SkipNode
+
+    def visit_image(self, node):
+        if node.hasattr('alt'):
+            self.parent.append(nodes.Text(node['alt']))
+        raise nodes.SkipNode
+
+    def ignore_node_but_process_children(self, node):
+        raise nodes.SkipDeparture
+
+    visit_interpreted = ignore_node_but_process_children
+    visit_problematic = ignore_node_but_process_children
+    visit_reference = ignore_node_but_process_children
+    visit_target = ignore_node_but_process_children
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/peps.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,304 @@
+# $Id: peps.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms for PEP processing.
+
+- `Headers`: Used to transform a PEP's initial RFC-2822 header.  It remains a
+  field list, but some entries get processed.
+- `Contents`: Auto-inserts a table of contents.
+- `PEPZero`: Special processing for PEP 0.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import re
+import time
+from docutils import nodes, utils, languages
+from docutils import ApplicationError, DataError
+from docutils.transforms import Transform, TransformError
+from docutils.transforms import parts, references, misc
+
+
+class Headers(Transform):
+
+    """
+    Process fields in a PEP's initial RFC-2822 header.
+    """
+
+    default_priority = 360
+
+    pep_url = 'pep-%04d'
+    pep_cvs_url = ('http://svn.python.org/view/*checkout*'
+                   '/peps/trunk/pep-%04d.txt')
+    rcs_keyword_substitutions = (
+          (re.compile(r'\$' r'RCSfile: (.+),v \$$', re.IGNORECASE), r'\1'),
+          (re.compile(r'\$[a-zA-Z]+: (.+) \$$'), r'\1'),)
+
+    def apply(self):
+        if not len(self.document):
+            # @@@ replace these DataErrors with proper system messages
+            raise DataError('Document tree is empty.')
+        header = self.document[0]
+        if not isinstance(header, nodes.field_list) or \
+              'rfc2822' not in header['classes']:
+            raise DataError('Document does not begin with an RFC-2822 '
+                            'header; it is not a PEP.')
+        pep = None
+        for field in header:
+            if field[0].astext().lower() == 'pep': # should be the first field
+                value = field[1].astext()
+                try:
+                    pep = int(value)
+                    cvs_url = self.pep_cvs_url % pep
+                except ValueError:
+                    pep = value
+                    cvs_url = None
+                    msg = self.document.reporter.warning(
+                        '"PEP" header must contain an integer; "%s" is an '
+                        'invalid value.' % pep, base_node=field)
+                    msgid = self.document.set_id(msg)
+                    prb = nodes.problematic(value, value or '(none)',
+                                            refid=msgid)
+                    prbid = self.document.set_id(prb)
+                    msg.add_backref(prbid)
+                    if len(field[1]):
+                        field[1][0][:] = [prb]
+                    else:
+                        field[1] += nodes.paragraph('', '', prb)
+                break
+        if pep is None:
+            raise DataError('Document does not contain an RFC-2822 "PEP" '
+                            'header.')
+        if pep == 0:
+            # Special processing for PEP 0.
+            pending = nodes.pending(PEPZero)
+            self.document.insert(1, pending)
+            self.document.note_pending(pending)
+        if len(header) < 2 or header[1][0].astext().lower() != 'title':
+            raise DataError('No title!')
+        for field in header:
+            name = field[0].astext().lower()
+            body = field[1]
+            if len(body) > 1:
+                raise DataError('PEP header field body contains multiple '
+                                'elements:\n%s' % field.pformat(level=1))
+            elif len(body) == 1:
+                if not isinstance(body[0], nodes.paragraph):
+                    raise DataError('PEP header field body may only contain '
+                                    'a single paragraph:\n%s'
+                                    % field.pformat(level=1))
+            elif name == 'last-modified':
+                date = time.strftime(
+                      '%d-%b-%Y',
+                      time.localtime(os.stat(self.document['source'])[8]))
+                if cvs_url:
+                    body += nodes.paragraph(
+                        '', '', nodes.reference('', date, refuri=cvs_url))
+            else:
+                # empty
+                continue
+            para = body[0]
+            if name == 'author':
+                for node in para:
+                    if isinstance(node, nodes.reference):
+                        node.replace_self(mask_email(node))
+            elif name == 'discussions-to':
+                for node in para:
+                    if isinstance(node, nodes.reference):
+                        node.replace_self(mask_email(node, pep))
+            elif name in ('replaces', 'replaced-by', 'requires'):
+                newbody = []
+                space = nodes.Text(' ')
+                for refpep in re.split(',?\s+', body.astext()):
+                    pepno = int(refpep)
+                    newbody.append(nodes.reference(
+                        refpep, refpep,
+                        refuri=(self.document.settings.pep_base_url
+                                + self.pep_url % pepno)))
+                    newbody.append(space)
+                para[:] = newbody[:-1] # drop trailing space
+            elif name == 'last-modified':
+                utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions)
+                if cvs_url:
+                    date = para.astext()
+                    para[:] = [nodes.reference('', date, refuri=cvs_url)]
+            elif name == 'content-type':
+                pep_type = para.astext()
+                uri = self.document.settings.pep_base_url + self.pep_url % 12
+                para[:] = [nodes.reference('', pep_type, refuri=uri)]
+            elif name == 'version' and len(body):
+                utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions)
+
+
+class Contents(Transform):
+
+    """
+    Insert an empty table of contents topic and a transform placeholder into
+    the document after the RFC 2822 header.
+    """
+
+    default_priority = 380
+
+    def apply(self):
+        language = languages.get_language(self.document.settings.language_code)
+        name = language.labels['contents']
+        title = nodes.title('', name)
+        topic = nodes.topic('', title, classes=['contents'])
+        name = nodes.fully_normalize_name(name)
+        if not self.document.has_name(name):
+            topic['names'].append(name)
+        self.document.note_implicit_target(topic)
+        pending = nodes.pending(parts.Contents)
+        topic += pending
+        self.document.insert(1, topic)
+        self.document.note_pending(pending)
+
+
+class TargetNotes(Transform):
+
+    """
+    Locate the "References" section, insert a placeholder for an external
+    target footnote insertion transform at the end, and schedule the
+    transform to run immediately.
+    """
+
+    default_priority = 520
+
+    def apply(self):
+        doc = self.document
+        i = len(doc) - 1
+        refsect = copyright = None
+        while i >= 0 and isinstance(doc[i], nodes.section):
+            title_words = doc[i][0].astext().lower().split()
+            if 'references' in title_words:
+                refsect = doc[i]
+                break
+            elif 'copyright' in title_words:
+                copyright = i
+            i -= 1
+        if not refsect:
+            refsect = nodes.section()
+            refsect += nodes.title('', 'References')
+            doc.set_id(refsect)
+            if copyright:
+                # Put the new "References" section before "Copyright":
+                doc.insert(copyright, refsect)
+            else:
+                # Put the new "References" section at end of doc:
+                doc.append(refsect)
+        pending = nodes.pending(references.TargetNotes)
+        refsect.append(pending)
+        self.document.note_pending(pending, 0)
+        pending = nodes.pending(misc.CallBack,
+                                details={'callback': self.cleanup_callback})
+        refsect.append(pending)
+        self.document.note_pending(pending, 1)
+
+    def cleanup_callback(self, pending):
+        """
+        Remove an empty "References" section.
+
+        Called after the `references.TargetNotes` transform is complete.
+        """
+        if len(pending.parent) == 2:    # <title> and <pending>
+            pending.parent.parent.remove(pending.parent)
+
+
+class PEPZero(Transform):
+
+    """
+    Special processing for PEP 0.
+    """
+
+    default_priority =760
+
+    def apply(self):
+        visitor = PEPZeroSpecial(self.document)
+        self.document.walk(visitor)
+        self.startnode.parent.remove(self.startnode)
+
+
+class PEPZeroSpecial(nodes.SparseNodeVisitor):
+
+    """
+    Perform the special processing needed by PEP 0:
+
+    - Mask email addresses.
+
+    - Link PEP numbers in the second column of 4-column tables to the PEPs
+      themselves.
+    """
+
+    pep_url = Headers.pep_url
+
+    def unknown_visit(self, node):
+        pass
+
+    def visit_reference(self, node):
+        node.replace_self(mask_email(node))
+
+    def visit_field_list(self, node):
+        if 'rfc2822' in node['classes']:
+            raise nodes.SkipNode
+
+    def visit_tgroup(self, node):
+        self.pep_table = node['cols'] == 4
+        self.entry = 0
+
+    def visit_colspec(self, node):
+        self.entry += 1
+        if self.pep_table and self.entry == 2:
+            node['classes'].append('num')
+
+    def visit_row(self, node):
+        self.entry = 0
+
+    def visit_entry(self, node):
+        self.entry += 1
+        if self.pep_table and self.entry == 2 and len(node) == 1:
+            node['classes'].append('num')
+            p = node[0]
+            if isinstance(p, nodes.paragraph) and len(p) == 1:
+                text = p.astext()
+                try:
+                    pep = int(text)
+                    ref = (self.document.settings.pep_base_url
+                           + self.pep_url % pep)
+                    p[0] = nodes.reference(text, text, refuri=ref)
+                except ValueError:
+                    pass
+
+
+non_masked_addresses = ('peps@python.org',
+                        'python-list@python.org',
+                        'python-dev@python.org')
+
+def mask_email(ref, pepno=None):
+    """
+    Mask the email address in `ref` and return a replacement node.
+
+    `ref` is returned unchanged if it contains no email address.
+
+    For email addresses such as "user@host", mask the address as "user at
+    host" (text) to thwart simple email address harvesters (except for those
+    listed in `non_masked_addresses`).  If a PEP number (`pepno`) is given,
+    return a reference including a default email subject.
+    """
+    if ref.hasattr('refuri') and ref['refuri'].startswith('mailto:'):
+        if ref['refuri'][8:] in non_masked_addresses:
+            replacement = ref[0]
+        else:
+            replacement_text = ref.astext().replace('@', '&#32;&#97;t&#32;')
+            replacement = nodes.raw('', replacement_text, format='html')
+        if pepno is None:
+            return replacement
+        else:
+            ref['refuri'] += '?subject=PEP%%20%s' % pepno
+            ref[:] = [replacement]
+            return ref
+    else:
+        return ref
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/references.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,896 @@
+# $Id: references.py 5018 2007-03-12 21:39:31Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms for resolving references.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import re
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class PropagateTargets(Transform):
+
+    """
+    Propagate empty internal targets to the next element.
+
+    Given the following nodes::
+
+        <target ids="internal1" names="internal1">
+        <target anonymous="1" ids="id1">
+        <target ids="internal2" names="internal2">
+        <paragraph>
+            This is a test.
+
+    PropagateTargets propagates the ids and names of the internal
+    targets preceding the paragraph to the paragraph itself::
+
+        <target refid="internal1">
+        <target anonymous="1" refid="id1">
+        <target refid="internal2">
+        <paragraph ids="internal2 id1 internal1" names="internal2 internal1">
+            This is a test.
+    """
+
+    default_priority = 260
+
+    def apply(self):
+        for target in self.document.traverse(nodes.target):
+            # Only block-level targets without reference (like ".. target:"):
+            if (isinstance(target.parent, nodes.TextElement) or
+                (target.hasattr('refid') or target.hasattr('refuri') or
+                 target.hasattr('refname'))):
+                continue
+            assert len(target) == 0, 'error: block-level target has children'
+            next_node = target.next_node(ascend=1)
+            # Do not move names and ids into Invisibles (we'd lose the
+            # attributes) or different Targetables (e.g. footnotes).
+            if (next_node is not None and
+                ((not isinstance(next_node, nodes.Invisible) and
+                  not isinstance(next_node, nodes.Targetable)) or
+                 isinstance(next_node, nodes.target))):
+                next_node['ids'].extend(target['ids'])
+                next_node['names'].extend(target['names'])
+                # Set defaults for next_node.expect_referenced_by_name/id.
+                if not hasattr(next_node, 'expect_referenced_by_name'):
+                    next_node.expect_referenced_by_name = {}
+                if not hasattr(next_node, 'expect_referenced_by_id'):
+                    next_node.expect_referenced_by_id = {}
+                for id in target['ids']:
+                    # Update IDs to node mapping.
+                    self.document.ids[id] = next_node
+                    # If next_node is referenced by id ``id``, this
+                    # target shall be marked as referenced.
+                    next_node.expect_referenced_by_id[id] = target
+                for name in target['names']:
+                    next_node.expect_referenced_by_name[name] = target
+                # If there are any expect_referenced_by_... attributes
+                # in target set, copy them to next_node.
+                next_node.expect_referenced_by_name.update(
+                    getattr(target, 'expect_referenced_by_name', {}))
+                next_node.expect_referenced_by_id.update(
+                    getattr(target, 'expect_referenced_by_id', {}))
+                # Set refid to point to the first former ID of target
+                # which is now an ID of next_node.
+                target['refid'] = target['ids'][0]
+                # Clear ids and names; they have been moved to
+                # next_node.
+                target['ids'] = []
+                target['names'] = []
+                self.document.note_refid(target)
+
+
+class AnonymousHyperlinks(Transform):
+
+    """
+    Link anonymous references to targets.  Given::
+
+        <paragraph>
+            <reference anonymous="1">
+                internal
+            <reference anonymous="1">
+                external
+        <target anonymous="1" ids="id1">
+        <target anonymous="1" ids="id2" refuri="http://external">
+
+    Corresponding references are linked via "refid" or resolved via "refuri"::
+
+        <paragraph>
+            <reference anonymous="1" refid="id1">
+                text
+            <reference anonymous="1" refuri="http://external">
+                external
+        <target anonymous="1" ids="id1">
+        <target anonymous="1" ids="id2" refuri="http://external">
+    """
+
+    default_priority = 440
+
+    def apply(self):
+        anonymous_refs = []
+        anonymous_targets = []
+        for node in self.document.traverse(nodes.reference):
+            if node.get('anonymous'):
+                anonymous_refs.append(node)
+        for node in self.document.traverse(nodes.target):
+            if node.get('anonymous'):
+                anonymous_targets.append(node)
+        if len(anonymous_refs) \
+              != len(anonymous_targets):
+            msg = self.document.reporter.error(
+                  'Anonymous hyperlink mismatch: %s references but %s '
+                  'targets.\nSee "backrefs" attribute for IDs.'
+                  % (len(anonymous_refs), len(anonymous_targets)))
+            msgid = self.document.set_id(msg)
+            for ref in anonymous_refs:
+                prb = nodes.problematic(
+                      ref.rawsource, ref.rawsource, refid=msgid)
+                prbid = self.document.set_id(prb)
+                msg.add_backref(prbid)
+                ref.replace_self(prb)
+            return
+        for ref, target in zip(anonymous_refs, anonymous_targets):
+            target.referenced = 1
+            while 1:
+                if target.hasattr('refuri'):
+                    ref['refuri'] = target['refuri']
+                    ref.resolved = 1
+                    break
+                else:
+                    if not target['ids']:
+                        # Propagated target.
+                        target = self.document.ids[target['refid']]
+                        continue
+                    ref['refid'] = target['ids'][0]
+                    self.document.note_refid(ref)
+                    break
+
+
+class IndirectHyperlinks(Transform):
+
+    """
+    a) Indirect external references::
+
+           <paragraph>
+               <reference refname="indirect external">
+                   indirect external
+           <target id="id1" name="direct external"
+               refuri="http://indirect">
+           <target id="id2" name="indirect external"
+               refname="direct external">
+
+       The "refuri" attribute is migrated back to all indirect targets
+       from the final direct target (i.e. a target not referring to
+       another indirect target)::
+
+           <paragraph>
+               <reference refname="indirect external">
+                   indirect external
+           <target id="id1" name="direct external"
+               refuri="http://indirect">
+           <target id="id2" name="indirect external"
+               refuri="http://indirect">
+
+       Once the attribute is migrated, the preexisting "refname" attribute
+       is dropped.
+
+    b) Indirect internal references::
+
+           <target id="id1" name="final target">
+           <paragraph>
+               <reference refname="indirect internal">
+                   indirect internal
+           <target id="id2" name="indirect internal 2"
+               refname="final target">
+           <target id="id3" name="indirect internal"
+               refname="indirect internal 2">
+
+       Targets which indirectly refer to an internal target become one-hop
+       indirect (their "refid" attributes are directly set to the internal
+       target's "id"). References which indirectly refer to an internal
+       target become direct internal references::
+
+           <target id="id1" name="final target">
+           <paragraph>
+               <reference refid="id1">
+                   indirect internal
+           <target id="id2" name="indirect internal 2" refid="id1">
+           <target id="id3" name="indirect internal" refid="id1">
+    """
+
+    default_priority = 460
+
+    def apply(self):
+        for target in self.document.indirect_targets:
+            if not target.resolved:
+                self.resolve_indirect_target(target)
+            self.resolve_indirect_references(target)
+
+    def resolve_indirect_target(self, target):
+        refname = target.get('refname')
+        if refname is None:
+            reftarget_id = target['refid']
+        else:
+            reftarget_id = self.document.nameids.get(refname)
+            if not reftarget_id:
+                # Check the unknown_reference_resolvers
+                for resolver_function in \
+                        self.document.transformer.unknown_reference_resolvers:
+                    if resolver_function(target):
+                        break
+                else:
+                    self.nonexistent_indirect_target(target)
+                return
+        reftarget = self.document.ids[reftarget_id]
+        reftarget.note_referenced_by(id=reftarget_id)
+        if isinstance(reftarget, nodes.target) \
+               and not reftarget.resolved and reftarget.hasattr('refname'):
+            if hasattr(target, 'multiply_indirect'):
+                #and target.multiply_indirect):
+                #del target.multiply_indirect
+                self.circular_indirect_reference(target)
+                return
+            target.multiply_indirect = 1
+            self.resolve_indirect_target(reftarget) # multiply indirect
+            del target.multiply_indirect
+        if reftarget.hasattr('refuri'):
+            target['refuri'] = reftarget['refuri']
+            if target.has_key('refid'):
+                del target['refid']
+        elif reftarget.hasattr('refid'):
+            target['refid'] = reftarget['refid']
+            self.document.note_refid(target)
+        else:
+            if reftarget['ids']:
+                target['refid'] = reftarget_id
+                self.document.note_refid(target)
+            else:
+                self.nonexistent_indirect_target(target)
+                return
+        if refname is not None:
+            del target['refname']
+        target.resolved = 1
+
+    def nonexistent_indirect_target(self, target):
+        if self.document.nameids.has_key(target['refname']):
+            self.indirect_target_error(target, 'which is a duplicate, and '
+                                       'cannot be used as a unique reference')
+        else:
+            self.indirect_target_error(target, 'which does not exist')
+
+    def circular_indirect_reference(self, target):
+        self.indirect_target_error(target, 'forming a circular reference')
+
+    def indirect_target_error(self, target, explanation):
+        naming = ''
+        reflist = []
+        if target['names']:
+            naming = '"%s" ' % target['names'][0]
+        for name in target['names']:
+            reflist.extend(self.document.refnames.get(name, []))
+        for id in target['ids']:
+            reflist.extend(self.document.refids.get(id, []))
+        naming += '(id="%s")' % target['ids'][0]
+        msg = self.document.reporter.error(
+              'Indirect hyperlink target %s refers to target "%s", %s.'
+              % (naming, target['refname'], explanation), base_node=target)
+        msgid = self.document.set_id(msg)
+        for ref in utils.uniq(reflist):
+            prb = nodes.problematic(
+                  ref.rawsource, ref.rawsource, refid=msgid)
+            prbid = self.document.set_id(prb)
+            msg.add_backref(prbid)
+            ref.replace_self(prb)
+        target.resolved = 1
+
+    def resolve_indirect_references(self, target):
+        if target.hasattr('refid'):
+            attname = 'refid'
+            call_method = self.document.note_refid
+        elif target.hasattr('refuri'):
+            attname = 'refuri'
+            call_method = None
+        else:
+            return
+        attval = target[attname]
+        for name in target['names']:
+            reflist = self.document.refnames.get(name, [])
+            if reflist:
+                target.note_referenced_by(name=name)
+            for ref in reflist:
+                if ref.resolved:
+                    continue
+                del ref['refname']
+                ref[attname] = attval
+                if call_method:
+                    call_method(ref)
+                ref.resolved = 1
+                if isinstance(ref, nodes.target):
+                    self.resolve_indirect_references(ref)
+        for id in target['ids']:
+            reflist = self.document.refids.get(id, [])
+            if reflist:
+                target.note_referenced_by(id=id)
+            for ref in reflist:
+                if ref.resolved:
+                    continue
+                del ref['refid']
+                ref[attname] = attval
+                if call_method:
+                    call_method(ref)
+                ref.resolved = 1
+                if isinstance(ref, nodes.target):
+                    self.resolve_indirect_references(ref)
+
+
+class ExternalTargets(Transform):
+
+    """
+    Given::
+
+        <paragraph>
+            <reference refname="direct external">
+                direct external
+        <target id="id1" name="direct external" refuri="http://direct">
+
+    The "refname" attribute is replaced by the direct "refuri" attribute::
+
+        <paragraph>
+            <reference refuri="http://direct">
+                direct external
+        <target id="id1" name="direct external" refuri="http://direct">
+    """
+
+    default_priority = 640
+
+    def apply(self):
+        for target in self.document.traverse(nodes.target):
+            if target.hasattr('refuri'):
+                refuri = target['refuri']
+                for name in target['names']:
+                    reflist = self.document.refnames.get(name, [])
+                    if reflist:
+                        target.note_referenced_by(name=name)
+                    for ref in reflist:
+                        if ref.resolved:
+                            continue
+                        del ref['refname']
+                        ref['refuri'] = refuri
+                        ref.resolved = 1
+
+
+class InternalTargets(Transform):
+
+    default_priority = 660
+
+    def apply(self):
+        for target in self.document.traverse(nodes.target):
+            if not target.hasattr('refuri') and not target.hasattr('refid'):
+                self.resolve_reference_ids(target)
+
+    def resolve_reference_ids(self, target):
+        """
+        Given::
+
+            <paragraph>
+                <reference refname="direct internal">
+                    direct internal
+            <target id="id1" name="direct internal">
+
+        The "refname" attribute is replaced by "refid" linking to the target's
+        "id"::
+
+            <paragraph>
+                <reference refid="id1">
+                    direct internal
+            <target id="id1" name="direct internal">
+        """
+        for name in target['names']:
+            refid = self.document.nameids[name]
+            reflist = self.document.refnames.get(name, [])
+            if reflist:
+                target.note_referenced_by(name=name)
+            for ref in reflist:
+                if ref.resolved:
+                    continue
+                del ref['refname']
+                ref['refid'] = refid
+                ref.resolved = 1
+
+
+class Footnotes(Transform):
+
+    """
+    Assign numbers to autonumbered footnotes, and resolve links to footnotes,
+    citations, and their references.
+
+    Given the following ``document`` as input::
+
+        <document>
+            <paragraph>
+                A labeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id1" refname="footnote">
+            <paragraph>
+                An unlabeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id2">
+            <footnote auto="1" id="id3">
+                <paragraph>
+                    Unlabeled autonumbered footnote.
+            <footnote auto="1" id="footnote" name="footnote">
+                <paragraph>
+                    Labeled autonumbered footnote.
+
+    Auto-numbered footnotes have attribute ``auto="1"`` and no label.
+    Auto-numbered footnote_references have no reference text (they're
+    empty elements). When resolving the numbering, a ``label`` element
+    is added to the beginning of the ``footnote``, and reference text
+    to the ``footnote_reference``.
+
+    The transformed result will be::
+
+        <document>
+            <paragraph>
+                A labeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id1" refid="footnote">
+                    2
+            <paragraph>
+                An unlabeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id2" refid="id3">
+                    1
+            <footnote auto="1" id="id3" backrefs="id2">
+                <label>
+                    1
+                <paragraph>
+                    Unlabeled autonumbered footnote.
+            <footnote auto="1" id="footnote" name="footnote" backrefs="id1">
+                <label>
+                    2
+                <paragraph>
+                    Labeled autonumbered footnote.
+
+    Note that the footnotes are not in the same order as the references.
+
+    The labels and reference text are added to the auto-numbered ``footnote``
+    and ``footnote_reference`` elements.  Footnote elements are backlinked to
+    their references via "refids" attributes.  References are assigned "id"
+    and "refid" attributes.
+
+    After adding labels and reference text, the "auto" attributes can be
+    ignored.
+    """
+
+    default_priority = 620
+
+    autofootnote_labels = None
+    """Keep track of unlabeled autonumbered footnotes."""
+
+    symbols = [
+          # Entries 1-4 and 6 below are from section 12.51 of
+          # The Chicago Manual of Style, 14th edition.
+          '*',                          # asterisk/star
+          u'\u2020',                    # dagger &dagger;
+          u'\u2021',                    # double dagger &Dagger;
+          u'\u00A7',                    # section mark &sect;
+          u'\u00B6',                    # paragraph mark (pilcrow) &para;
+                                        # (parallels ['||'] in CMoS)
+          '#',                          # number sign
+          # The entries below were chosen arbitrarily.
+          u'\u2660',                    # spade suit &spades;
+          u'\u2665',                    # heart suit &hearts;
+          u'\u2666',                    # diamond suit &diams;
+          u'\u2663',                    # club suit &clubs;
+          ]
+
+    def apply(self):
+        self.autofootnote_labels = []
+        startnum = self.document.autofootnote_start
+        self.document.autofootnote_start = self.number_footnotes(startnum)
+        self.number_footnote_references(startnum)
+        self.symbolize_footnotes()
+        self.resolve_footnotes_and_citations()
+
+    def number_footnotes(self, startnum):
+        """
+        Assign numbers to autonumbered footnotes.
+
+        For labeled autonumbered footnotes, copy the number over to
+        corresponding footnote references.
+        """
+        for footnote in self.document.autofootnotes:
+            while 1:
+                label = str(startnum)
+                startnum += 1
+                if not self.document.nameids.has_key(label):
+                    break
+            footnote.insert(0, nodes.label('', label))
+            for name in footnote['names']:
+                for ref in self.document.footnote_refs.get(name, []):
+                    ref += nodes.Text(label)
+                    ref.delattr('refname')
+                    assert len(footnote['ids']) == len(ref['ids']) == 1
+                    ref['refid'] = footnote['ids'][0]
+                    footnote.add_backref(ref['ids'][0])
+                    self.document.note_refid(ref)
+                    ref.resolved = 1
+            if not footnote['names'] and not footnote['dupnames']:
+                footnote['names'].append(label)
+                self.document.note_explicit_target(footnote, footnote)
+                self.autofootnote_labels.append(label)
+        return startnum
+
+    def number_footnote_references(self, startnum):
+        """Assign numbers to autonumbered footnote references."""
+        i = 0
+        for ref in self.document.autofootnote_refs:
+            if ref.resolved or ref.hasattr('refid'):
+                continue
+            try:
+                label = self.autofootnote_labels[i]
+            except IndexError:
+                msg = self.document.reporter.error(
+                      'Too many autonumbered footnote references: only %s '
+                      'corresponding footnotes available.'
+                      % len(self.autofootnote_labels), base_node=ref)
+                msgid = self.document.set_id(msg)
+                for ref in self.document.autofootnote_refs[i:]:
+                    if ref.resolved or ref.hasattr('refname'):
+                        continue
+                    prb = nodes.problematic(
+                          ref.rawsource, ref.rawsource, refid=msgid)
+                    prbid = self.document.set_id(prb)
+                    msg.add_backref(prbid)
+                    ref.replace_self(prb)
+                break
+            ref += nodes.Text(label)
+            id = self.document.nameids[label]
+            footnote = self.document.ids[id]
+            ref['refid'] = id
+            self.document.note_refid(ref)
+            assert len(ref['ids']) == 1
+            footnote.add_backref(ref['ids'][0])
+            ref.resolved = 1
+            i += 1
+
+    def symbolize_footnotes(self):
+        """Add symbols indexes to "[*]"-style footnotes and references."""
+        labels = []
+        for footnote in self.document.symbol_footnotes:
+            reps, index = divmod(self.document.symbol_footnote_start,
+                                 len(self.symbols))
+            labeltext = self.symbols[index] * (reps + 1)
+            labels.append(labeltext)
+            footnote.insert(0, nodes.label('', labeltext))
+            self.document.symbol_footnote_start += 1
+            self.document.set_id(footnote)
+        i = 0
+        for ref in self.document.symbol_footnote_refs:
+            try:
+                ref += nodes.Text(labels[i])
+            except IndexError:
+                msg = self.document.reporter.error(
+                      'Too many symbol footnote references: only %s '
+                      'corresponding footnotes available.' % len(labels),
+                      base_node=ref)
+                msgid = self.document.set_id(msg)
+                for ref in self.document.symbol_footnote_refs[i:]:
+                    if ref.resolved or ref.hasattr('refid'):
+                        continue
+                    prb = nodes.problematic(
+                          ref.rawsource, ref.rawsource, refid=msgid)
+                    prbid = self.document.set_id(prb)
+                    msg.add_backref(prbid)
+                    ref.replace_self(prb)
+                break
+            footnote = self.document.symbol_footnotes[i]
+            assert len(footnote['ids']) == 1
+            ref['refid'] = footnote['ids'][0]
+            self.document.note_refid(ref)
+            footnote.add_backref(ref['ids'][0])
+            i += 1
+
+    def resolve_footnotes_and_citations(self):
+        """
+        Link manually-labeled footnotes and citations to/from their
+        references.
+        """
+        for footnote in self.document.footnotes:
+            for label in footnote['names']:
+                if self.document.footnote_refs.has_key(label):
+                    reflist = self.document.footnote_refs[label]
+                    self.resolve_references(footnote, reflist)
+        for citation in self.document.citations:
+            for label in citation['names']:
+                if self.document.citation_refs.has_key(label):
+                    reflist = self.document.citation_refs[label]
+                    self.resolve_references(citation, reflist)
+
+    def resolve_references(self, note, reflist):
+        assert len(note['ids']) == 1
+        id = note['ids'][0]
+        for ref in reflist:
+            if ref.resolved:
+                continue
+            ref.delattr('refname')
+            ref['refid'] = id
+            assert len(ref['ids']) == 1
+            note.add_backref(ref['ids'][0])
+            ref.resolved = 1
+        note.resolved = 1
+
+
+class CircularSubstitutionDefinitionError(Exception): pass
+
+
+class Substitutions(Transform):
+
+    """
+    Given the following ``document`` as input::
+
+        <document>
+            <paragraph>
+                The
+                <substitution_reference refname="biohazard">
+                    biohazard
+                 symbol is deservedly scary-looking.
+            <substitution_definition name="biohazard">
+                <image alt="biohazard" uri="biohazard.png">
+
+    The ``substitution_reference`` will simply be replaced by the
+    contents of the corresponding ``substitution_definition``.
+
+    The transformed result will be::
+
+        <document>
+            <paragraph>
+                The
+                <image alt="biohazard" uri="biohazard.png">
+                 symbol is deservedly scary-looking.
+            <substitution_definition name="biohazard">
+                <image alt="biohazard" uri="biohazard.png">
+    """
+
+    default_priority = 220
+    """The Substitutions transform has to be applied very early, before
+    `docutils.tranforms.frontmatter.DocTitle` and others."""
+
+    def apply(self):
+        defs = self.document.substitution_defs
+        normed = self.document.substitution_names
+        subreflist = self.document.traverse(nodes.substitution_reference)
+        nested = {}
+        for ref in subreflist:
+            refname = ref['refname']
+            key = None
+            if defs.has_key(refname):
+                key = refname
+            else:
+                normed_name = refname.lower()
+                if normed.has_key(normed_name):
+                    key = normed[normed_name]
+            if key is None:
+                msg = self.document.reporter.error(
+                      'Undefined substitution referenced: "%s".'
+                      % refname, base_node=ref)
+                msgid = self.document.set_id(msg)
+                prb = nodes.problematic(
+                      ref.rawsource, ref.rawsource, refid=msgid)
+                prbid = self.document.set_id(prb)
+                msg.add_backref(prbid)
+                ref.replace_self(prb)
+            else:
+                subdef = defs[key]
+                parent = ref.parent
+                index = parent.index(ref)
+                if  (subdef.attributes.has_key('ltrim')
+                     or subdef.attributes.has_key('trim')):
+                    if index > 0 and isinstance(parent[index - 1],
+                                                nodes.Text):
+                        parent.replace(parent[index - 1],
+                                       parent[index - 1].rstrip())
+                if  (subdef.attributes.has_key('rtrim')
+                     or subdef.attributes.has_key('trim')):
+                    if  (len(parent) > index + 1
+                         and isinstance(parent[index + 1], nodes.Text)):
+                        parent.replace(parent[index + 1],
+                                       parent[index + 1].lstrip())
+                subdef_copy = subdef.deepcopy()
+                try:
+                    # Take care of nested substitution references:
+                    for nested_ref in subdef_copy.traverse(
+                          nodes.substitution_reference):
+                        nested_name = normed[nested_ref['refname'].lower()]
+                        if nested_name in nested.setdefault(nested_name, []):
+                            raise CircularSubstitutionDefinitionError
+                        else:
+                            nested[nested_name].append(key)
+                            subreflist.append(nested_ref)
+                except CircularSubstitutionDefinitionError:
+                    parent = ref.parent
+                    if isinstance(parent, nodes.substitution_definition):
+                        msg = self.document.reporter.error(
+                            'Circular substitution definition detected:',
+                            nodes.literal_block(parent.rawsource,
+                                                parent.rawsource),
+                            line=parent.line, base_node=parent)
+                        parent.replace_self(msg)
+                    else:
+                        msg = self.document.reporter.error(
+                            'Circular substitution definition referenced: "%s".'
+                            % refname, base_node=ref)
+                        msgid = self.document.set_id(msg)
+                        prb = nodes.problematic(
+                            ref.rawsource, ref.rawsource, refid=msgid)
+                        prbid = self.document.set_id(prb)
+                        msg.add_backref(prbid)
+                        ref.replace_self(prb)
+                else:
+                    ref.replace_self(subdef_copy.children)
+
+
+class TargetNotes(Transform):
+
+    """
+    Creates a footnote for each external target in the text, and corresponding
+    footnote references after each reference.
+    """
+
+    default_priority = 540
+    """The TargetNotes transform has to be applied after `IndirectHyperlinks`
+    but before `Footnotes`."""
+
+
+    def __init__(self, document, startnode):
+        Transform.__init__(self, document, startnode=startnode)
+
+        self.classes = startnode.details.get('class', [])
+
+    def apply(self):
+        notes = {}
+        nodelist = []
+        for target in self.document.traverse(nodes.target):
+            # Only external targets.
+            if not target.hasattr('refuri'):
+                continue
+            names = target['names']
+            refs = []
+            for name in names:
+                refs.extend(self.document.refnames.get(name, []))
+            if not refs:
+                continue
+            footnote = self.make_target_footnote(target['refuri'], refs,
+                                                 notes)
+            if not notes.has_key(target['refuri']):
+                notes[target['refuri']] = footnote
+                nodelist.append(footnote)
+        # Take care of anonymous references.
+        for ref in self.document.traverse(nodes.reference):
+            if not ref.get('anonymous'):
+                continue
+            if ref.hasattr('refuri'):
+                footnote = self.make_target_footnote(ref['refuri'], [ref],
+                                                     notes)
+                if not notes.has_key(ref['refuri']):
+                    notes[ref['refuri']] = footnote
+                    nodelist.append(footnote)
+        self.startnode.replace_self(nodelist)
+
+    def make_target_footnote(self, refuri, refs, notes):
+        if notes.has_key(refuri):  # duplicate?
+            footnote = notes[refuri]
+            assert len(footnote['names']) == 1
+            footnote_name = footnote['names'][0]
+        else:                           # original
+            footnote = nodes.footnote()
+            footnote_id = self.document.set_id(footnote)
+            # Use uppercase letters and a colon; they can't be
+            # produced inside names by the parser.
+            footnote_name = 'TARGET_NOTE: ' + footnote_id
+            footnote['auto'] = 1
+            footnote['names'] = [footnote_name]
+            footnote_paragraph = nodes.paragraph()
+            footnote_paragraph += nodes.reference('', refuri, refuri=refuri)
+            footnote += footnote_paragraph
+            self.document.note_autofootnote(footnote)
+            self.document.note_explicit_target(footnote, footnote)
+        for ref in refs:
+            if isinstance(ref, nodes.target):
+                continue
+            refnode = nodes.footnote_reference(
+                refname=footnote_name, auto=1)
+            refnode['classes'] += self.classes
+            self.document.note_autofootnote_ref(refnode)
+            self.document.note_footnote_ref(refnode)
+            index = ref.parent.index(ref) + 1
+            reflist = [refnode]
+            if not utils.get_trim_footnote_ref_space(self.document.settings):
+                if self.classes:
+                    reflist.insert(0, nodes.inline(text=' ', Classes=self.classes))
+                else:
+                    reflist.insert(0, nodes.Text(' '))
+            ref.parent.insert(index, reflist)
+        return footnote
+
+
+class DanglingReferences(Transform):
+
+    """
+    Check for dangling references (incl. footnote & citation) and for
+    unreferenced targets.
+    """
+
+    default_priority = 850
+
+    def apply(self):
+        visitor = DanglingReferencesVisitor(
+            self.document,
+            self.document.transformer.unknown_reference_resolvers)
+        self.document.walk(visitor)
+        # *After* resolving all references, check for unreferenced
+        # targets:
+        for target in self.document.traverse(nodes.target):
+            if not target.referenced:
+                if target.get('anonymous'):
+                    # If we have unreferenced anonymous targets, there
+                    # is already an error message about anonymous
+                    # hyperlink mismatch; no need to generate another
+                    # message.
+                    continue
+                if target['names']:
+                    naming = target['names'][0]
+                elif target['ids']:
+                    naming = target['ids'][0]
+                else:
+                    # Hack: Propagated targets always have their refid
+                    # attribute set.
+                    naming = target['refid']
+                self.document.reporter.info(
+                    'Hyperlink target "%s" is not referenced.'
+                    % naming, base_node=target)
+
+
+class DanglingReferencesVisitor(nodes.SparseNodeVisitor):
+    
+    def __init__(self, document, unknown_reference_resolvers):
+        nodes.SparseNodeVisitor.__init__(self, document)
+        self.document = document
+        self.unknown_reference_resolvers = unknown_reference_resolvers
+
+    def unknown_visit(self, node):
+        pass
+
+    def visit_reference(self, node):
+        if node.resolved or not node.hasattr('refname'):
+            return
+        refname = node['refname']
+        id = self.document.nameids.get(refname)
+        if id is None:
+            for resolver_function in self.unknown_reference_resolvers:
+                if resolver_function(node):
+                    break
+            else:
+                if self.document.nameids.has_key(refname):
+                    msg = self.document.reporter.error(
+                        'Duplicate target name, cannot be used as a unique '
+                        'reference: "%s".' % (node['refname']), base_node=node)
+                else:
+                    msg = self.document.reporter.error(
+                        'Unknown target name: "%s".' % (node['refname']),
+                        base_node=node)
+                msgid = self.document.set_id(msg)
+                prb = nodes.problematic(
+                      node.rawsource, node.rawsource, refid=msgid)
+                prbid = self.document.set_id(prb)
+                msg.add_backref(prbid)
+                node.replace_self(prb)
+        else:
+            del node['refname']
+            node['refid'] = id
+            self.document.ids[id].note_referenced_by(id=id)
+            node.resolved = 1
+
+    visit_footnote_reference = visit_citation_reference = visit_reference
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/universal.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,203 @@
+# $Id: universal.py 4913 2007-02-12 04:05:20Z goodger $
+# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms needed by most or all documents:
+
+- `Decorations`: Generate a document's header & footer.
+- `Messages`: Placement of system messages stored in
+  `nodes.document.transform_messages`.
+- `TestMessages`: Like `Messages`, used on test runs.
+- `FinalReferences`: Resolve remaining references.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+import sys
+import time
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class Decorations(Transform):
+
+    """
+    Populate a document's decoration element (header, footer).
+    """
+
+    default_priority = 820
+
+    def apply(self):
+        header_nodes = self.generate_header()
+        if header_nodes:
+            decoration = self.document.get_decoration()
+            header = decoration.get_header()
+            header.extend(header_nodes)
+        footer_nodes = self.generate_footer()
+        if footer_nodes:
+            decoration = self.document.get_decoration()
+            footer = decoration.get_footer()
+            footer.extend(footer_nodes)
+
+    def generate_header(self):
+        return None
+
+    def generate_footer(self):
+        # @@@ Text is hard-coded for now.
+        # Should be made dynamic (language-dependent).
+        settings = self.document.settings
+        if settings.generator or settings.datestamp or settings.source_link \
+               or settings.source_url:
+            text = []
+            if settings.source_link and settings._source \
+                   or settings.source_url:
+                if settings.source_url:
+                    source = settings.source_url
+                else:
+                    source = utils.relative_path(settings._destination,
+                                                 settings._source)
+                text.extend([
+                    nodes.reference('', 'View document source',
+                                    refuri=source),
+                    nodes.Text('.\n')])
+            if settings.datestamp:
+                datestamp = time.strftime(settings.datestamp, time.gmtime())
+                text.append(nodes.Text('Generated on: ' + datestamp + '.\n'))
+            if settings.generator:
+                text.extend([
+                    nodes.Text('Generated by '),
+                    nodes.reference('', 'Docutils', refuri=
+                                    'http://docutils.sourceforge.net/'),
+                    nodes.Text(' from '),
+                    nodes.reference('', 'reStructuredText', refuri='http://'
+                                    'docutils.sourceforge.net/rst.html'),
+                    nodes.Text(' source.\n')])
+            return [nodes.paragraph('', '', *text)]
+        else:
+            return None
+
+
+class ExposeInternals(Transform):
+
+    """
+    Expose internal attributes if ``expose_internals`` setting is set.
+    """
+
+    default_priority = 840
+
+    def not_Text(self, node):
+        return not isinstance(node, nodes.Text)
+
+    def apply(self):
+        if self.document.settings.expose_internals:
+            for node in self.document.traverse(self.not_Text):
+                for att in self.document.settings.expose_internals:
+                    value = getattr(node, att, None)
+                    if value is not None:
+                        node['internal:' + att] = value
+
+
+class Messages(Transform):
+
+    """
+    Place any system messages generated after parsing into a dedicated section
+    of the document.
+    """
+
+    default_priority = 860
+
+    def apply(self):
+        unfiltered = self.document.transform_messages
+        threshold = self.document.reporter.report_level
+        messages = []
+        for msg in unfiltered:
+            if msg['level'] >= threshold and not msg.parent:
+                messages.append(msg)
+        if messages:
+            section = nodes.section(classes=['system-messages'])
+            # @@@ get this from the language module?
+            section += nodes.title('', 'Docutils System Messages')
+            section += messages
+            self.document.transform_messages[:] = []
+            self.document += section
+
+
+class FilterMessages(Transform):
+
+    """
+    Remove system messages below verbosity threshold.
+    """
+
+    default_priority = 870
+
+    def apply(self):
+        for node in self.document.traverse(nodes.system_message):
+            if node['level'] < self.document.reporter.report_level:
+                node.parent.remove(node)
+
+
+class TestMessages(Transform):
+
+    """
+    Append all post-parse system messages to the end of the document.
+
+    Used for testing purposes.
+    """
+
+    default_priority = 880
+
+    def apply(self):
+        for msg in self.document.transform_messages:
+            if not msg.parent:
+                self.document += msg
+
+
+class StripComments(Transform):
+
+    """
+    Remove comment elements from the document tree (only if the
+    ``strip_comments`` setting is enabled).
+    """
+
+    default_priority = 740
+
+    def apply(self):
+        if self.document.settings.strip_comments:
+            for node in self.document.traverse(nodes.comment):
+                node.parent.remove(node)
+
+
+class StripClassesAndElements(Transform):
+
+    """
+    Remove from the document tree all elements with classes in
+    `self.document.settings.strip_elements_with_classes` and all "classes"
+    attribute values in `self.document.settings.strip_classes`.
+    """
+
+    default_priority = 750
+
+    def apply(self):
+        if not (self.document.settings.strip_elements_with_classes
+                or self.document.settings.strip_classes):
+            return
+        # prepare dicts for lookup (not sets, for Python 2.2 compatibility):
+        self.strip_elements = dict(
+            [(key, None)
+             for key in (self.document.settings.strip_elements_with_classes
+                         or [])])
+        self.strip_classes = dict(
+            [(key, None) for key in (self.document.settings.strip_classes
+                                     or [])])
+        for node in self.document.traverse(self.check_classes):
+            node.parent.remove(node)
+
+    def check_classes(self, node):
+        if isinstance(node, nodes.Element):
+            for class_value in node['classes'][:]:
+                if class_value in self.strip_classes:
+                    node['classes'].remove(class_value)
+                if class_value in self.strip_elements:
+                    return 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/transforms/writer_aux.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,88 @@
+# $Id: writer_aux.py 5174 2007-05-31 00:01:52Z wiemann $
+# Author: Lea Wiemann <LeWiemann@gmail.com>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Auxiliary transforms mainly to be used by Writer components.
+
+This module is called "writer_aux" because otherwise there would be
+conflicting imports like this one::
+
+    from docutils import writers
+    from docutils.transforms import writers
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes, utils, languages
+from docutils.transforms import Transform
+
+
+class Compound(Transform):
+
+    """
+    Flatten all compound paragraphs.  For example, transform ::
+
+        <compound>
+            <paragraph>
+            <literal_block>
+            <paragraph>
+
+    into ::
+
+        <paragraph>
+        <literal_block classes="continued">
+        <paragraph classes="continued">
+    """
+
+    default_priority = 910
+
+    def apply(self):
+        for compound in self.document.traverse(nodes.compound):
+            first_child = 1
+            for child in compound:
+                if first_child:
+                    if not isinstance(child, nodes.Invisible):
+                        first_child = 0
+                else:
+                    child['classes'].append('continued')
+            # Substitute children for compound.
+            compound.replace_self(compound[:])
+
+
+class Admonitions(Transform):
+
+    """
+    Transform specific admonitions, like this:
+
+        <note>
+            <paragraph>
+                 Note contents ...
+
+    into generic admonitions, like this::
+
+        <admonition classes="note">
+            <title>
+                Note
+            <paragraph>
+                Note contents ...
+
+    The admonition title is localized.
+    """
+
+    default_priority = 920
+
+    def apply(self):
+        lcode = self.document.settings.language_code
+        language = languages.get_language(lcode)
+        for node in self.document.traverse(nodes.Admonition):
+            node_name = node.__class__.__name__
+            # Set class, so that we know what node this admonition came from.
+            node['classes'].append(node_name)
+            if not isinstance(node, nodes.admonition):
+                # Specific admonition.  Transform into a generic admonition.
+                admonition = nodes.admonition(node.rawsource, *node.children,
+                                              **node.attributes)
+                title = nodes.title('', language.labels[node_name])
+                admonition.insert(0, title)
+                node.replace_self(admonition)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/urischemes.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,136 @@
+# $Id: urischemes.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+`schemes` is a dictionary with lowercase URI addressing schemes as
+keys and descriptions as values. It was compiled from the index at
+http://www.iana.org/assignments/uri-schemes (revised 2005-11-28)
+and an older list at http://www.w3.org/Addressing/schemes.html.
+"""
+
+# Many values are blank and should be filled in with useful descriptions.
+
+schemes = {
+      'about': 'provides information on Navigator',
+      'acap': 'Application Configuration Access Protocol; RFC 2244',
+      'addbook': "To add vCard entries to Communicator's Address Book",
+      'afp': 'Apple Filing Protocol',
+      'afs': 'Andrew File System global file names',
+      'aim': 'AOL Instant Messenger',
+      'callto': 'for NetMeeting links',
+      'castanet': 'Castanet Tuner URLs for Netcaster',
+      'chttp': 'cached HTTP supported by RealPlayer',
+      'cid': 'content identifier; RFC 2392',
+      'crid': 'TV-Anytime Content Reference Identifier; RFC 4078',
+      'data': ('allows inclusion of small data items as "immediate" data; '
+               'RFC 2397'),
+      'dav': 'Distributed Authoring and Versioning Protocol; RFC 2518',
+      'dict': 'dictionary service protocol; RFC 2229',
+      'dns': 'Domain Name System resources',
+      'eid': ('External ID; non-URL data; general escape mechanism to allow '
+              'access to information for applications that are too '
+              'specialized to justify their own schemes'),
+      'fax': ('a connection to a terminal that can handle telefaxes '
+              '(facsimiles); RFC 2806'),
+      'feed' : 'NetNewsWire feed',
+      'file': 'Host-specific file names; RFC 1738',
+      'finger': '',
+      'freenet': '',
+      'ftp': 'File Transfer Protocol; RFC 1738',
+      'go': 'go; RFC 3368',
+      'gopher': 'The Gopher Protocol',
+      'gsm-sms': ('Global System for Mobile Communications Short Message '
+                  'Service'),
+      'h323': ('video (audiovisual) communication on local area networks; '
+               'RFC 3508'),
+      'h324': ('video and audio communications over low bitrate connections '
+               'such as POTS modem connections'),
+      'hdl': 'CNRI handle system',
+      'hnews': 'an HTTP-tunneling variant of the NNTP news protocol',
+      'http': 'Hypertext Transfer Protocol; RFC 2616',
+      'https': 'HTTP over SSL; RFC 2818',
+      'hydra': 'SubEthaEdit URI.  See http://www.codingmonkeys.de/subethaedit.',
+      'iioploc': 'Internet Inter-ORB Protocol Location?',
+      'ilu': 'Inter-Language Unification',
+      'im': 'Instant Messaging; RFC 3860',
+      'imap': 'Internet Message Access Protocol; RFC 2192',
+      'info': 'Information Assets with Identifiers in Public Namespaces',
+      'ior': 'CORBA interoperable object reference',
+      'ipp': 'Internet Printing Protocol; RFC 3510',
+      'irc': 'Internet Relay Chat',
+      'iris.beep': 'iris.beep; RFC 3983',
+      'iseek' : 'See www.ambrosiasw.com;  a little util for OS X.',
+      'jar': 'Java archive',
+      'javascript': ('JavaScript code; evaluates the expression after the '
+                     'colon'),
+      'jdbc': 'JDBC connection URI.',
+      'ldap': 'Lightweight Directory Access Protocol',
+      'lifn': '',
+      'livescript': '',
+      'lrq': '',
+      'mailbox': 'Mail folder access',
+      'mailserver': 'Access to data available from mail servers',
+      'mailto': 'Electronic mail address; RFC 2368',
+      'md5': '',
+      'mid': 'message identifier; RFC 2392',
+      'mocha': '',
+      'modem': ('a connection to a terminal that can handle incoming data '
+                'calls; RFC 2806'),
+      'mtqp': 'Message Tracking Query Protocol; RFC 3887',
+      'mupdate': 'Mailbox Update (MUPDATE) Protocol; RFC 3656',
+      'news': 'USENET news; RFC 1738',
+      'nfs': 'Network File System protocol; RFC 2224',
+      'nntp': 'USENET news using NNTP access; RFC 1738',
+      'opaquelocktoken': 'RFC 2518',
+      'phone': '',
+      'pop': 'Post Office Protocol; RFC 2384',
+      'pop3': 'Post Office Protocol v3',
+      'pres': 'Presence; RFC 3859',
+      'printer': '',
+      'prospero': 'Prospero Directory Service; RFC 4157',
+      'rdar' : ('URLs found in Darwin source '
+                '(http://www.opensource.apple.com/darwinsource/).'),
+      'res': '',
+      'rtsp': 'real time streaming protocol; RFC 2326',
+      'rvp': '',
+      'rwhois': '',
+      'rx': 'Remote Execution',
+      'sdp': '',
+      'service': 'service location; RFC 2609',
+      'shttp': 'secure hypertext transfer protocol',
+      'sip': 'Session Initiation Protocol; RFC 3261',
+      'sips': 'secure session intitiaion protocol; RFC 3261',
+      'smb': 'SAMBA filesystems.',
+      'snews': 'For NNTP postings via SSL',
+      'snmp': 'Simple Network Management Protocol; RFC 4088',
+      'soap.beep': 'RFC 3288',
+      'soap.beeps': 'RFC 3288',
+      'ssh': 'Reference to interactive sessions via ssh.',
+      't120': 'real time data conferencing (audiographics)',
+      'tag': 'RFC 4151',
+      'tcp': '',
+      'tel': ('a connection to a terminal that handles normal voice '
+              'telephone calls, a voice mailbox or another voice messaging '
+              'system or a service that can be operated using DTMF tones; '
+              'RFC 2806.'),
+      'telephone': 'telephone',
+      'telnet': 'Reference to interactive sessions; RFC 4248',
+      'tftp': 'Trivial File Transfer Protocol; RFC 3617',
+      'tip': 'Transaction Internet Protocol; RFC 2371',
+      'tn3270': 'Interactive 3270 emulation sessions',
+      'tv': '',
+      'urn': 'Uniform Resource Name; RFC 2141',
+      'uuid': '',
+      'vemmi': 'versatile multimedia interface; RFC 2122',
+      'videotex': '',
+      'view-source': 'displays HTML code that was generated with JavaScript',
+      'wais': 'Wide Area Information Servers; RFC 4156',
+      'whodp': '',
+      'whois++': 'Distributed directory service.',
+      'x-man-page': ('Opens man page in Terminal.app on OS X '
+                     '(see macosxhints.com)'),
+      'xmlrpc.beep': 'RFC 3529',
+      'xmlrpc.beeps': 'RFC 3529',
+      'z39.50r': 'Z39.50 Retrieval; RFC 2056',
+      'z39.50s': 'Z39.50 Session; RFC 2056',}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/utils.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,593 @@
+# $Id: utils.py 5040 2007-04-03 17:41:59Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Miscellaneous utilities for the documentation utilities.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import os.path
+import types
+import warnings
+import unicodedata
+from types import StringType, UnicodeType
+from docutils import ApplicationError, DataError
+from docutils import nodes
+
+
+class SystemMessage(ApplicationError):
+
+    def __init__(self, system_message, level):
+        Exception.__init__(self, system_message.astext())
+        self.level = level
+
+
+class SystemMessagePropagation(ApplicationError): pass
+
+
+class Reporter:
+
+    """
+    Info/warning/error reporter and ``system_message`` element generator.
+
+    Five levels of system messages are defined, along with corresponding
+    methods: `debug()`, `info()`, `warning()`, `error()`, and `severe()`.
+
+    There is typically one Reporter object per process.  A Reporter object is
+    instantiated with thresholds for reporting (generating warnings) and
+    halting processing (raising exceptions), a switch to turn debug output on
+    or off, and an I/O stream for warnings.  These are stored as instance
+    attributes.
+
+    When a system message is generated, its level is compared to the stored
+    thresholds, and a warning or error is generated as appropriate.  Debug
+    messages are produced iff the stored debug switch is on, independently of
+    other thresholds.  Message output is sent to the stored warning stream if
+    not set to ''.
+
+    The Reporter class also employs a modified form of the "Observer" pattern
+    [GoF95]_ to track system messages generated.  The `attach_observer` method
+    should be called before parsing, with a bound method or function which
+    accepts system messages.  The observer can be removed with
+    `detach_observer`, and another added in its place.
+
+    .. [GoF95] Gamma, Helm, Johnson, Vlissides. *Design Patterns: Elements of
+       Reusable Object-Oriented Software*. Addison-Wesley, Reading, MA, USA,
+       1995.
+    """
+
+    levels = 'DEBUG INFO WARNING ERROR SEVERE'.split()
+    """List of names for system message levels, indexed by level."""
+
+    # system message level constants:
+    (DEBUG_LEVEL,
+     INFO_LEVEL,
+     WARNING_LEVEL,
+     ERROR_LEVEL,
+     SEVERE_LEVEL) = range(5)
+
+    def __init__(self, source, report_level, halt_level, stream=None,
+                 debug=0, encoding='ascii', error_handler='replace'):
+        """
+        :Parameters:
+            - `source`: The path to or description of the source data.
+            - `report_level`: The level at or above which warning output will
+              be sent to `stream`.
+            - `halt_level`: The level at or above which `SystemMessage`
+              exceptions will be raised, halting execution.
+            - `debug`: Show debug (level=0) system messages?
+            - `stream`: Where warning output is sent.  Can be file-like (has a
+              ``.write`` method), a string (file name, opened for writing),
+              '' (empty string, for discarding all stream messages) or
+              `None` (implies `sys.stderr`; default).
+            - `encoding`: The encoding for stderr output.
+            - `error_handler`: The error handler for stderr output encoding.
+        """
+
+        self.source = source
+        """The path to or description of the source data."""
+
+        self.encoding = encoding
+        """The character encoding for the stderr output."""
+
+        self.error_handler = error_handler
+        """The character encoding error handler."""
+
+        self.debug_flag = debug
+        """Show debug (level=0) system messages?"""
+
+        self.report_level = report_level
+        """The level at or above which warning output will be sent
+        to `self.stream`."""
+
+        self.halt_level = halt_level
+        """The level at or above which `SystemMessage` exceptions
+        will be raised, halting execution."""
+
+        if stream is None:
+            stream = sys.stderr
+        elif type(stream) in (StringType, UnicodeType):
+            # Leave stream untouched if it's ''.
+            if stream != '':
+                if type(stream) == StringType:
+                    stream = open(stream, 'w')
+                elif type(stream) == UnicodeType:
+                    stream = open(stream.encode(), 'w')
+
+        self.stream = stream
+        """Where warning output is sent."""
+
+        self.observers = []
+        """List of bound methods or functions to call with each system_message
+        created."""
+
+        self.max_level = -1
+        """The highest level system message generated so far."""
+
+    def set_conditions(self, category, report_level, halt_level,
+                       stream=None, debug=0):
+        warnings.warn('docutils.utils.Reporter.set_conditions deprecated; '
+                      'set attributes via configuration settings or directly',
+                      DeprecationWarning, stacklevel=2)
+        self.report_level = report_level
+        self.halt_level = halt_level
+        if stream is None:
+            stream = sys.stderr
+        self.stream = stream
+        self.debug_flag = debug
+
+    def attach_observer(self, observer):
+        """
+        The `observer` parameter is a function or bound method which takes one
+        argument, a `nodes.system_message` instance.
+        """
+        self.observers.append(observer)
+
+    def detach_observer(self, observer):
+        self.observers.remove(observer)
+
+    def notify_observers(self, message):
+        for observer in self.observers:
+            observer(message)
+
+    def system_message(self, level, message, *children, **kwargs):
+        """
+        Return a system_message object.
+
+        Raise an exception or generate a warning if appropriate.
+        """
+        attributes = kwargs.copy()
+        if kwargs.has_key('base_node'):
+            source, line = get_source_line(kwargs['base_node'])
+            del attributes['base_node']
+            if source is not None:
+                attributes.setdefault('source', source)
+            if line is not None:
+                attributes.setdefault('line', line)
+        attributes.setdefault('source', self.source)
+        msg = nodes.system_message(message, level=level,
+                                   type=self.levels[level],
+                                   *children, **attributes)
+        if self.stream and (level >= self.report_level
+                            or self.debug_flag and level == self.DEBUG_LEVEL):
+            msgtext = msg.astext().encode(self.encoding, self.error_handler)
+            print >>self.stream, msgtext
+        if level >= self.halt_level:
+            raise SystemMessage(msg, level)
+        if level > self.DEBUG_LEVEL or self.debug_flag:
+            self.notify_observers(msg)
+        self.max_level = max(level, self.max_level)
+        return msg
+
+    def debug(self, *args, **kwargs):
+        """
+        Level-0, "DEBUG": an internal reporting issue. Typically, there is no
+        effect on the processing. Level-0 system messages are handled
+        separately from the others.
+        """
+        if self.debug_flag:
+            return self.system_message(self.DEBUG_LEVEL, *args, **kwargs)
+
+    def info(self, *args, **kwargs):
+        """
+        Level-1, "INFO": a minor issue that can be ignored. Typically there is
+        no effect on processing, and level-1 system messages are not reported.
+        """
+        return self.system_message(self.INFO_LEVEL, *args, **kwargs)
+
+    def warning(self, *args, **kwargs):
+        """
+        Level-2, "WARNING": an issue that should be addressed. If ignored,
+        there may be unpredictable problems with the output.
+        """
+        return self.system_message(self.WARNING_LEVEL, *args, **kwargs)
+
+    def error(self, *args, **kwargs):
+        """
+        Level-3, "ERROR": an error that should be addressed. If ignored, the
+        output will contain errors.
+        """
+        return self.system_message(self.ERROR_LEVEL, *args, **kwargs)
+
+    def severe(self, *args, **kwargs):
+        """
+        Level-4, "SEVERE": a severe error that must be addressed. If ignored,
+        the output will contain severe errors. Typically level-4 system
+        messages are turned into exceptions which halt processing.
+        """
+        return self.system_message(self.SEVERE_LEVEL, *args, **kwargs)
+
+
+class ExtensionOptionError(DataError): pass
+class BadOptionError(ExtensionOptionError): pass
+class BadOptionDataError(ExtensionOptionError): pass
+class DuplicateOptionError(ExtensionOptionError): pass
+
+
+def extract_extension_options(field_list, options_spec):
+    """
+    Return a dictionary mapping extension option names to converted values.
+
+    :Parameters:
+        - `field_list`: A flat field list without field arguments, where each
+          field body consists of a single paragraph only.
+        - `options_spec`: Dictionary mapping known option names to a
+          conversion function such as `int` or `float`.
+
+    :Exceptions:
+        - `KeyError` for unknown option names.
+        - `ValueError` for invalid option values (raised by the conversion
+           function).
+        - `TypeError` for invalid option value types (raised by conversion
+           function).
+        - `DuplicateOptionError` for duplicate options.
+        - `BadOptionError` for invalid fields.
+        - `BadOptionDataError` for invalid option data (missing name,
+          missing data, bad quotes, etc.).
+    """
+    option_list = extract_options(field_list)
+    option_dict = assemble_option_dict(option_list, options_spec)
+    return option_dict
+
+def extract_options(field_list):
+    """
+    Return a list of option (name, value) pairs from field names & bodies.
+
+    :Parameter:
+        `field_list`: A flat field list, where each field name is a single
+        word and each field body consists of a single paragraph only.
+
+    :Exceptions:
+        - `BadOptionError` for invalid fields.
+        - `BadOptionDataError` for invalid option data (missing name,
+          missing data, bad quotes, etc.).
+    """
+    option_list = []
+    for field in field_list:
+        if len(field[0].astext().split()) != 1:
+            raise BadOptionError(
+                'extension option field name may not contain multiple words')
+        name = str(field[0].astext().lower())
+        body = field[1]
+        if len(body) == 0:
+            data = None
+        elif len(body) > 1 or not isinstance(body[0], nodes.paragraph) \
+              or len(body[0]) != 1 or not isinstance(body[0][0], nodes.Text):
+            raise BadOptionDataError(
+                  'extension option field body may contain\n'
+                  'a single paragraph only (option "%s")' % name)
+        else:
+            data = body[0][0].astext()
+        option_list.append((name, data))
+    return option_list
+
+def assemble_option_dict(option_list, options_spec):
+    """
+    Return a mapping of option names to values.
+
+    :Parameters:
+        - `option_list`: A list of (name, value) pairs (the output of
+          `extract_options()`).
+        - `options_spec`: Dictionary mapping known option names to a
+          conversion function such as `int` or `float`.
+
+    :Exceptions:
+        - `KeyError` for unknown option names.
+        - `DuplicateOptionError` for duplicate options.
+        - `ValueError` for invalid option values (raised by conversion
+           function).
+        - `TypeError` for invalid option value types (raised by conversion
+           function).
+    """
+    options = {}
+    for name, value in option_list:
+        convertor = options_spec[name]  # raises KeyError if unknown
+        if convertor is None:
+            raise KeyError(name)        # or if explicitly disabled
+        if options.has_key(name):
+            raise DuplicateOptionError('duplicate option "%s"' % name)
+        try:
+            options[name] = convertor(value)
+        except (ValueError, TypeError), detail:
+            raise detail.__class__('(option: "%s"; value: %r)\n%s'
+                                   % (name, value, ' '.join(detail.args)))
+    return options
+
+
+class NameValueError(DataError): pass
+
+
+def extract_name_value(line):
+    """
+    Return a list of (name, value) from a line of the form "name=value ...".
+
+    :Exception:
+        `NameValueError` for invalid input (missing name, missing data, bad
+        quotes, etc.).
+    """
+    attlist = []
+    while line:
+        equals = line.find('=')
+        if equals == -1:
+            raise NameValueError('missing "="')
+        attname = line[:equals].strip()
+        if equals == 0 or not attname:
+            raise NameValueError(
+                  'missing attribute name before "="')
+        line = line[equals+1:].lstrip()
+        if not line:
+            raise NameValueError(
+                  'missing value after "%s="' % attname)
+        if line[0] in '\'"':
+            endquote = line.find(line[0], 1)
+            if endquote == -1:
+                raise NameValueError(
+                      'attribute "%s" missing end quote (%s)'
+                      % (attname, line[0]))
+            if len(line) > endquote + 1 and line[endquote + 1].strip():
+                raise NameValueError(
+                      'attribute "%s" end quote (%s) not followed by '
+                      'whitespace' % (attname, line[0]))
+            data = line[1:endquote]
+            line = line[endquote+1:].lstrip()
+        else:
+            space = line.find(' ')
+            if space == -1:
+                data = line
+                line = ''
+            else:
+                data = line[:space]
+                line = line[space+1:].lstrip()
+        attlist.append((attname.lower(), data))
+    return attlist
+
+def new_reporter(source_path, settings):
+    """
+    Return a new Reporter object.
+
+    :Parameters:
+        `source` : string
+            The path to or description of the source text of the document.
+        `settings` : optparse.Values object
+            Runtime settings.
+    """
+    reporter = Reporter(
+        source_path, settings.report_level, settings.halt_level,
+        stream=settings.warning_stream, debug=settings.debug,
+        encoding=settings.error_encoding,
+        error_handler=settings.error_encoding_error_handler)
+    return reporter
+
+def new_document(source_path, settings=None):
+    """
+    Return a new empty document object.
+
+    :Parameters:
+        `source_path` : string
+            The path to or description of the source text of the document.
+        `settings` : optparse.Values object
+            Runtime settings.  If none provided, a default set will be used.
+    """
+    from docutils import frontend
+    if settings is None:
+        settings = frontend.OptionParser().get_default_values()
+    reporter = new_reporter(source_path, settings)
+    document = nodes.document(settings, reporter, source=source_path)
+    document.note_source(source_path, -1)
+    return document
+
+def clean_rcs_keywords(paragraph, keyword_substitutions):
+    if len(paragraph) == 1 and isinstance(paragraph[0], nodes.Text):
+        textnode = paragraph[0]
+        for pattern, substitution in keyword_substitutions:
+            match = pattern.search(textnode.data)
+            if match:
+                textnode.data = pattern.sub(substitution, textnode.data)
+                return
+
+def relative_path(source, target):
+    """
+    Build and return a path to `target`, relative to `source` (both files).
+
+    If there is no common prefix, return the absolute path to `target`.
+    """
+    source_parts = os.path.abspath(source or 'dummy_file').split(os.sep)
+    target_parts = os.path.abspath(target).split(os.sep)
+    # Check first 2 parts because '/dir'.split('/') == ['', 'dir']:
+    if source_parts[:2] != target_parts[:2]:
+        # Nothing in common between paths.
+        # Return absolute path, using '/' for URLs:
+        return '/'.join(target_parts)
+    source_parts.reverse()
+    target_parts.reverse()
+    while (source_parts and target_parts
+           and source_parts[-1] == target_parts[-1]):
+        # Remove path components in common:
+        source_parts.pop()
+        target_parts.pop()
+    target_parts.reverse()
+    parts = ['..'] * (len(source_parts) - 1) + target_parts
+    return '/'.join(parts)
+
+def get_stylesheet_reference(settings, relative_to=None):
+    """
+    Retrieve a stylesheet reference from the settings object.
+    """
+    if settings.stylesheet_path:
+        assert not settings.stylesheet, \
+               'stylesheet and stylesheet_path are mutually exclusive.'
+        if relative_to == None:
+            relative_to = settings._destination
+        return relative_path(relative_to, settings.stylesheet_path)
+    else:
+        return settings.stylesheet
+
+def get_trim_footnote_ref_space(settings):
+    """
+    Return whether or not to trim footnote space.
+
+    If trim_footnote_reference_space is not None, return it.
+
+    If trim_footnote_reference_space is None, return False unless the
+    footnote reference style is 'superscript'.
+    """
+    if settings.trim_footnote_reference_space is None:
+        return hasattr(settings, 'footnote_references') and \
+               settings.footnote_references == 'superscript'
+    else:
+        return settings.trim_footnote_reference_space
+
+def get_source_line(node):
+    """
+    Return the "source" and "line" attributes from the `node` given or from
+    its closest ancestor.
+    """
+    while node:
+        if node.source or node.line:
+            return node.source, node.line
+        node = node.parent
+    return None, None
+
+def escape2null(text):
+    """Return a string with escape-backslashes converted to nulls."""
+    parts = []
+    start = 0
+    while 1:
+        found = text.find('\\', start)
+        if found == -1:
+            parts.append(text[start:])
+            return ''.join(parts)
+        parts.append(text[start:found])
+        parts.append('\x00' + text[found+1:found+2])
+        start = found + 2               # skip character after escape
+
+def unescape(text, restore_backslashes=0):
+    """
+    Return a string with nulls removed or restored to backslashes.
+    Backslash-escaped spaces are also removed.
+    """
+    if restore_backslashes:
+        return text.replace('\x00', '\\')
+    else:
+        for sep in ['\x00 ', '\x00\n', '\x00']:
+            text = ''.join(text.split(sep))
+        return text
+
+east_asian_widths = {'W': 2,   # Wide
+                     'F': 2,   # Full-width (wide)
+                     'Na': 1,  # Narrow
+                     'H': 1,   # Half-width (narrow)
+                     'N': 1,   # Neutral (not East Asian, treated as narrow)
+                     'A': 1}   # Ambiguous (s/b wide in East Asian context,
+                               # narrow otherwise, but that doesn't work)
+"""Mapping of result codes from `unicodedata.east_asian_width()` to character
+column widths."""
+
+def east_asian_column_width(text):
+    if isinstance(text, types.UnicodeType):
+        total = 0
+        for c in text:
+            total += east_asian_widths[unicodedata.east_asian_width(c)]
+        return total
+    else:
+        return len(text)
+
+if hasattr(unicodedata, 'east_asian_width'):
+    column_width = east_asian_column_width
+else:
+    column_width = len
+
+def uniq(L):
+     r = []
+     for item in L:
+         if not item in r:
+             r.append(item)
+     return r
+
+
+class DependencyList:
+
+    """
+    List of dependencies, with file recording support.
+
+    Note that the output file is not automatically closed.  You have
+    to explicitly call the close() method.
+    """
+
+    def __init__(self, output_file=None, dependencies=[]):
+        """
+        Initialize the dependency list, automatically setting the
+        output file to `output_file` (see `set_output()`) and adding
+        all supplied dependencies.
+        """
+        self.set_output(output_file)
+        for i in dependencies:
+            self.add(i)
+
+    def set_output(self, output_file):
+        """
+        Set the output file and clear the list of already added
+        dependencies.
+
+        `output_file` must be a string.  The specified file is
+        immediately overwritten.
+
+        If output_file is '-', the output will be written to stdout.
+        If it is None, no file output is done when calling add().
+        """
+        self.list = []
+        if output_file == '-':
+            self.file = sys.stdout
+        elif output_file:
+            self.file = open(output_file, 'w')
+        else:
+            self.file = None
+
+    def add(self, filename):
+        """
+        If the dependency `filename` has not already been added,
+        append it to self.list and print it to self.file if self.file
+        is not None.
+        """
+        if not filename in self.list:
+            self.list.append(filename)
+            if self.file is not None:
+                print >>self.file, filename
+
+    def close(self):
+        """
+        Close the output file.
+        """
+        self.file.close()
+        self.file = None
+
+    def __repr__(self):
+        if self.file:
+            output_file = self.file.name
+        else:
+            output_file = None
+        return '%s(%r, %s)' % (self.__class__.__name__, output_file, self.list)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,133 @@
+# $Id: __init__.py 4913 2007-02-12 04:05:20Z goodger $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains Docutils Writer modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import os.path
+import docutils
+from docutils import languages, Component
+from docutils.transforms import universal
+
+
+class Writer(Component):
+
+    """
+    Abstract base class for docutils Writers.
+
+    Each writer module or package must export a subclass also called 'Writer'.
+    Each writer must support all standard node types listed in
+    `docutils.nodes.node_class_names`.
+
+    The `write()` method is the main entry point.
+    """
+
+    component_type = 'writer'
+    config_section = 'writers'
+
+    def get_transforms(self):
+        return Component.get_transforms(self) + [
+            universal.Messages,
+            universal.FilterMessages,
+            universal.StripClassesAndElements,]
+
+    document = None
+    """The document to write (Docutils doctree); set by `write`."""
+
+    output = None
+    """Final translated form of `document` (Unicode string for text, binary
+    string for other forms); set by `translate`."""
+
+    language = None
+    """Language module for the document; set by `write`."""
+
+    destination = None
+    """`docutils.io` Output object; where to write the document.
+    Set by `write`."""
+
+    def __init__(self):
+
+        # Currently only used by HTML writer for output fragments:
+        self.parts = {}
+        """Mapping of document part names to fragments of `self.output`.
+        Values are Unicode strings; encoding is up to the client.  The 'whole'
+        key should contain the entire document output.
+        """
+
+    def write(self, document, destination):
+        """
+        Process a document into its final form.
+
+        Translate `document` (a Docutils document tree) into the Writer's
+        native format, and write it out to its `destination` (a
+        `docutils.io.Output` subclass object).
+
+        Normally not overridden or extended in subclasses.
+        """
+        self.document = document
+        self.language = languages.get_language(
+            document.settings.language_code)
+        self.destination = destination
+        self.translate()
+        output = self.destination.write(self.output)
+        return output
+
+    def translate(self):
+        """
+        Do final translation of `self.document` into `self.output`.  Called
+        from `write`.  Override in subclasses.
+
+        Usually done with a `docutils.nodes.NodeVisitor` subclass, in
+        combination with a call to `docutils.nodes.Node.walk()` or
+        `docutils.nodes.Node.walkabout()`.  The ``NodeVisitor`` subclass must
+        support all standard elements (listed in
+        `docutils.nodes.node_class_names`) and possibly non-standard elements
+        used by the current Reader as well.
+        """
+        raise NotImplementedError('subclass must override this method')
+
+    def assemble_parts(self):
+        """Assemble the `self.parts` dictionary.  Extend in subclasses."""
+        self.parts['whole'] = self.output
+        self.parts['encoding'] = self.document.settings.output_encoding
+        self.parts['version'] = docutils.__version__
+
+
+class UnfilteredWriter(Writer):
+
+    """
+    A writer that passes the document tree on unchanged (e.g. a
+    serializer.)
+
+    Documents written by UnfilteredWriters are typically reused at a
+    later date using a subclass of `readers.ReReader`.
+    """
+
+    def get_transforms(self):
+        # Do not add any transforms.  When the document is reused
+        # later, the then-used writer will add the appropriate
+        # transforms.
+        return Component.get_transforms(self)
+
+
+_writer_aliases = {
+      'html': 'html4css1',
+      'latex': 'latex2e',
+      'pprint': 'pseudoxml',
+      'pformat': 'pseudoxml',
+      'pdf': 'rlpdf',
+      'xml': 'docutils_xml',
+      's5': 's5_html'}
+
+def get_writer_class(writer_name):
+    """Return the Writer class from the `writer_name` module."""
+    writer_name = writer_name.lower()
+    if _writer_aliases.has_key(writer_name):
+        writer_name = _writer_aliases[writer_name]
+    module = __import__(writer_name, globals(), locals())
+    return module.Writer
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/docutils_xml.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,73 @@
+# $Id: docutils_xml.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Simple internal document tree Writer, writes Docutils XML.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import docutils
+from docutils import frontend, writers
+
+
+class Writer(writers.Writer):
+
+    supported = ('xml',)
+    """Formats this writer supports."""
+
+    settings_spec = (
+        '"Docutils XML" Writer Options',
+        'Warning: the --newlines and --indents options may adversely affect '
+        'whitespace; use them only for reading convenience.',
+        (('Generate XML with newlines before and after tags.',
+          ['--newlines'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Generate XML with indents and newlines.',
+          ['--indents'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Omit the XML declaration.  Use with caution.',
+          ['--no-xml-declaration'],
+          {'dest': 'xml_declaration', 'default': 1, 'action': 'store_false',
+           'validator': frontend.validate_boolean}),
+         ('Omit the DOCTYPE declaration.',
+          ['--no-doctype'],
+          {'dest': 'doctype_declaration', 'default': 1,
+           'action': 'store_false', 'validator': frontend.validate_boolean}),))
+
+    settings_defaults = {'output_encoding_error_handler': 'xmlcharrefreplace'}
+
+    config_section = 'docutils_xml writer'
+    config_section_dependencies = ('writers',)
+
+    output = None
+    """Final translated form of `document`."""
+
+    xml_declaration = '<?xml version="1.0" encoding="%s"?>\n'
+    #xml_stylesheet = '<?xml-stylesheet type="text/xsl" href="%s"?>\n'
+    doctype = (
+        '<!DOCTYPE document PUBLIC'
+        ' "+//IDN docutils.sourceforge.net//DTD Docutils Generic//EN//XML"'
+        ' "http://docutils.sourceforge.net/docs/ref/docutils.dtd">\n')
+    generator = '<!-- Generated by Docutils %s -->\n'
+
+    def translate(self):
+        settings = self.document.settings
+        indent = newline = ''
+        if settings.newlines:
+            newline = '\n'
+        if settings.indents:
+            newline = '\n'
+            indent = '    '
+        output_prefix = []
+        if settings.xml_declaration:
+            output_prefix.append(
+                self.xml_declaration % settings.output_encoding)
+        if settings.doctype_declaration:
+            output_prefix.append(self.doctype)
+        output_prefix.append(self.generator % docutils.__version__)
+        docnode = self.document.asdom().childNodes[0]
+        self.output = (''.join(output_prefix)
+                       + docnode.toprettyxml(indent, newline))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/html4css1/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1538 @@
+# $Id: __init__.py 5314 2007-07-05 12:45:43Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Simple HyperText Markup Language document tree Writer.
+
+The output conforms to the XHTML version 1.0 Transitional DTD
+(*almost* strict).  The output contains a minimum of formatting
+information.  The cascading style sheet "html4css1.css" is required
+for proper viewing with a modern graphical browser.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os
+import os.path
+import time
+import re
+from types import ListType
+try:
+    import Image                        # check for the Python Imaging Library
+except ImportError:
+    Image = None
+import docutils
+from docutils import frontend, nodes, utils, writers, languages
+from docutils.transforms import writer_aux
+
+
+class Writer(writers.Writer):
+
+    supported = ('html', 'html4css1', 'xhtml')
+    """Formats this writer supports."""
+
+    default_stylesheet = 'html4css1.css'
+
+    default_stylesheet_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_stylesheet))
+
+    default_template = 'template.txt'
+
+    default_template_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_template))
+
+    settings_spec = (
+        'HTML-Specific Options',
+        None,
+        (('Specify the template file (UTF-8 encoded).  Default is "%s".'
+          % default_template_path,
+          ['--template'],
+          {'default': default_template_path, 'metavar': '<file>'}),
+        ('Specify a stylesheet URL, used verbatim.  Overrides '
+          '--stylesheet-path.',
+          ['--stylesheet'],
+          {'metavar': '<URL>', 'overrides': 'stylesheet_path'}),
+         ('Specify a stylesheet file, relative to the current working '
+          'directory.  The path is adjusted relative to the output HTML '
+          'file.  Overrides --stylesheet.  Default: "%s"'
+          % default_stylesheet_path,
+          ['--stylesheet-path'],
+          {'metavar': '<file>', 'overrides': 'stylesheet',
+           'default': default_stylesheet_path}),
+         ('Embed the stylesheet in the output HTML file.  The stylesheet '
+          'file must be accessible during processing (--stylesheet-path is '
+          'recommended).  This is the default.',
+          ['--embed-stylesheet'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Link to the stylesheet in the output HTML file.  Default: '
+          'embed the stylesheet, do not link to it.',
+          ['--link-stylesheet'],
+          {'dest': 'embed_stylesheet', 'action': 'store_false'}),
+         ('Specify the initial header level.  Default is 1 for "<h1>".  '
+          'Does not affect document title & subtitle (see --no-doc-title).',
+          ['--initial-header-level'],
+          {'choices': '1 2 3 4 5 6'.split(), 'default': '1',
+           'metavar': '<level>'}),
+         ('Specify the maximum width (in characters) for one-column field '
+          'names.  Longer field names will span an entire row of the table '
+          'used to render the field list.  Default is 14 characters.  '
+          'Use 0 for "no limit".',
+          ['--field-name-limit'],
+          {'default': 14, 'metavar': '<level>',
+           'validator': frontend.validate_nonnegative_int}),
+         ('Specify the maximum width (in characters) for options in option '
+          'lists.  Longer options will span an entire row of the table used '
+          'to render the option list.  Default is 14 characters.  '
+          'Use 0 for "no limit".',
+          ['--option-limit'],
+          {'default': 14, 'metavar': '<level>',
+           'validator': frontend.validate_nonnegative_int}),
+         ('Format for footnote references: one of "superscript" or '
+          '"brackets".  Default is "brackets".',
+          ['--footnote-references'],
+          {'choices': ['superscript', 'brackets'], 'default': 'brackets',
+           'metavar': '<format>',
+           'overrides': 'trim_footnote_reference_space'}),
+         ('Format for block quote attributions: one of "dash" (em-dash '
+          'prefix), "parentheses"/"parens", or "none".  Default is "dash".',
+          ['--attribution'],
+          {'choices': ['dash', 'parentheses', 'parens', 'none'],
+           'default': 'dash', 'metavar': '<format>'}),
+         ('Remove extra vertical whitespace between items of "simple" bullet '
+          'lists and enumerated lists.  Default: enabled.',
+          ['--compact-lists'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compact simple bullet and enumerated lists.',
+          ['--no-compact-lists'],
+          {'dest': 'compact_lists', 'action': 'store_false'}),
+         ('Remove extra vertical whitespace between items of simple field '
+          'lists.  Default: enabled.',
+          ['--compact-field-lists'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compact simple field lists.',
+          ['--no-compact-field-lists'],
+          {'dest': 'compact_field_lists', 'action': 'store_false'}),
+         ('Omit the XML declaration.  Use with caution.',
+          ['--no-xml-declaration'],
+          {'dest': 'xml_declaration', 'default': 1, 'action': 'store_false',
+           'validator': frontend.validate_boolean}),
+         ('Obfuscate email addresses to confuse harvesters while still '
+          'keeping email links usable with standards-compliant browsers.',
+          ['--cloak-email-addresses'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),))
+
+    settings_defaults = {'output_encoding_error_handler': 'xmlcharrefreplace'}
+
+    relative_path_settings = ('stylesheet_path',)
+
+    config_section = 'html4css1 writer'
+    config_section_dependencies = ('writers',)
+
+    visitor_attributes = (
+        'head_prefix', 'head', 'stylesheet', 'body_prefix',
+        'body_pre_docinfo', 'docinfo', 'body', 'body_suffix',
+        'title', 'subtitle', 'header', 'footer', 'meta', 'fragment',
+        'html_prolog', 'html_head', 'html_title', 'html_subtitle',
+        'html_body')
+
+    def get_transforms(self):
+        return writers.Writer.get_transforms(self) + [writer_aux.Admonitions]
+
+    def __init__(self):
+        writers.Writer.__init__(self)
+        self.translator_class = HTMLTranslator
+
+    def translate(self):
+        self.visitor = visitor = self.translator_class(self.document)
+        self.document.walkabout(visitor)
+        for attr in self.visitor_attributes:
+            setattr(self, attr, getattr(visitor, attr))
+        self.output = self.apply_template()
+
+    def apply_template(self):
+        template_file = open(self.document.settings.template)
+        template = unicode(template_file.read(), 'utf-8')
+        template_file.close()
+        subs = self.interpolation_dict()
+        return template % subs
+
+    def interpolation_dict(self):
+        subs = {}
+        settings = self.document.settings
+        for attr in self.visitor_attributes:
+            subs[attr] = ''.join(getattr(self, attr)).rstrip('\n')
+        subs['encoding'] = settings.output_encoding
+        subs['version'] = docutils.__version__
+        return subs
+
+    def assemble_parts(self):
+        writers.Writer.assemble_parts(self)
+        for part in self.visitor_attributes:
+            self.parts[part] = ''.join(getattr(self, part))
+
+
+class HTMLTranslator(nodes.NodeVisitor):
+
+    """
+    This HTML writer has been optimized to produce visually compact
+    lists (less vertical whitespace).  HTML's mixed content models
+    allow list items to contain "<li><p>body elements</p></li>" or
+    "<li>just text</li>" or even "<li>text<p>and body
+    elements</p>combined</li>", each with different effects.  It would
+    be best to stick with strict body elements in list items, but they
+    affect vertical spacing in browsers (although they really
+    shouldn't).
+
+    Here is an outline of the optimization:
+
+    - Check for and omit <p> tags in "simple" lists: list items
+      contain either a single paragraph, a nested simple list, or a
+      paragraph followed by a nested simple list.  This means that
+      this list can be compact:
+
+          - Item 1.
+          - Item 2.
+
+      But this list cannot be compact:
+
+          - Item 1.
+
+            This second paragraph forces space between list items.
+
+          - Item 2.
+
+    - In non-list contexts, omit <p> tags on a paragraph if that
+      paragraph is the only child of its parent (footnotes & citations
+      are allowed a label first).
+
+    - Regardless of the above, in definitions, table cells, field bodies,
+      option descriptions, and list items, mark the first child with
+      'class="first"' and the last child with 'class="last"'.  The stylesheet
+      sets the margins (top & bottom respectively) to 0 for these elements.
+
+    The ``no_compact_lists`` setting (``--no-compact-lists`` command-line
+    option) disables list whitespace optimization.
+    """
+
+    xml_declaration = '<?xml version="1.0" encoding="%s" ?>\n'
+    doctype = (
+        '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"'
+        ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n')
+    head_prefix_template = ('<html xmlns="http://www.w3.org/1999/xhtml"'
+                            ' xml:lang="%s" lang="%s">\n<head>\n')
+    content_type = ('<meta http-equiv="Content-Type"'
+                    ' content="text/html; charset=%s" />\n')
+    generator = ('<meta name="generator" content="Docutils %s: '
+                 'http://docutils.sourceforge.net/" />\n')
+    stylesheet_link = '<link rel="stylesheet" href="%s" type="text/css" />\n'
+    embedded_stylesheet = '<style type="text/css">\n\n%s\n</style>\n'
+    words_and_spaces = re.compile(r'\S+| +|\n')
+
+    def __init__(self, document):
+        nodes.NodeVisitor.__init__(self, document)
+        self.settings = settings = document.settings
+        lcode = settings.language_code
+        self.language = languages.get_language(lcode)
+        self.meta = [self.content_type % settings.output_encoding,
+                     self.generator % docutils.__version__]
+        self.head_prefix = []
+        self.html_prolog = []
+        if settings.xml_declaration:
+            self.head_prefix.append(self.xml_declaration
+                                    % settings.output_encoding)
+            # encoding not interpolated:
+            self.html_prolog.append(self.xml_declaration)
+        self.head_prefix.extend([self.doctype,
+                                 self.head_prefix_template % (lcode, lcode)])
+        self.html_prolog.append(self.doctype)
+        self.head = self.meta[:]
+        stylesheet = utils.get_stylesheet_reference(settings)
+        self.stylesheet = []
+        if stylesheet:
+            if settings.embed_stylesheet:
+                stylesheet = utils.get_stylesheet_reference(
+                    settings, os.path.join(os.getcwd(), 'dummy'))
+                settings.record_dependencies.add(stylesheet)
+                stylesheet_text = open(stylesheet).read()
+                self.stylesheet = [self.embedded_stylesheet % stylesheet_text]
+            else:
+                self.stylesheet = [self.stylesheet_link
+                                   % self.encode(stylesheet)]
+        self.body_prefix = ['</head>\n<body>\n']
+        # document title, subtitle display
+        self.body_pre_docinfo = []
+        # author, date, etc.
+        self.docinfo = []
+        self.body = []
+        self.fragment = []
+        self.body_suffix = ['</body>\n</html>\n']
+        self.section_level = 0
+        self.initial_header_level = int(settings.initial_header_level)
+        # A heterogenous stack used in conjunction with the tree traversal.
+        # Make sure that the pops correspond to the pushes:
+        self.context = []
+        self.topic_classes = []
+        self.colspecs = []
+        self.compact_p = 1
+        self.compact_simple = None
+        self.compact_field_list = None
+        self.in_docinfo = None
+        self.in_sidebar = None
+        self.title = []
+        self.subtitle = []
+        self.header = []
+        self.footer = []
+        self.html_head = [self.content_type] # charset not interpolated
+        self.html_title = []
+        self.html_subtitle = []
+        self.html_body = []
+        self.in_document_title = 0
+        self.in_mailto = 0
+        self.author_in_authors = None
+
+    def astext(self):
+        return ''.join(self.head_prefix + self.head
+                       + self.stylesheet + self.body_prefix
+                       + self.body_pre_docinfo + self.docinfo
+                       + self.body + self.body_suffix)
+
+    def encode(self, text):
+        """Encode special characters in `text` & return."""
+        # @@@ A codec to do these and all other HTML entities would be nice.
+        text = text.replace("&", "&amp;")
+        text = text.replace("<", "&lt;")
+        text = text.replace('"', "&quot;")
+        text = text.replace(">", "&gt;")
+        text = text.replace("@", "&#64;") # may thwart some address harvesters
+        # Replace the non-breaking space character with the HTML entity:
+        text = text.replace(u'\u00a0', "&nbsp;")
+        return text
+
+    def cloak_mailto(self, uri):
+        """Try to hide a mailto: URL from harvesters."""
+        # Encode "@" using a URL octet reference (see RFC 1738).
+        # Further cloaking with HTML entities will be done in the
+        # `attval` function.
+        return uri.replace('@', '%40')
+
+    def cloak_email(self, addr):
+        """Try to hide the link text of a email link from harversters."""
+        # Surround at-signs and periods with <span> tags.  ("@" has
+        # already been encoded to "&#64;" by the `encode` method.)
+        addr = addr.replace('&#64;', '<span>&#64;</span>')
+        addr = addr.replace('.', '<span>&#46;</span>')
+        return addr
+
+    def attval(self, text,
+               whitespace=re.compile('[\n\r\t\v\f]')):
+        """Cleanse, HTML encode, and return attribute value text."""
+        encoded = self.encode(whitespace.sub(' ', text))
+        if self.in_mailto and self.settings.cloak_email_addresses:
+            # Cloak at-signs ("%40") and periods with HTML entities.
+            encoded = encoded.replace('%40', '&#37;&#52;&#48;')
+            encoded = encoded.replace('.', '&#46;')
+        return encoded
+
+    def starttag(self, node, tagname, suffix='\n', empty=0, **attributes):
+        """
+        Construct and return a start tag given a node (id & class attributes
+        are extracted), tag name, and optional attributes.
+        """
+        tagname = tagname.lower()
+        prefix = []
+        atts = {}
+        ids = []
+        for (name, value) in attributes.items():
+            atts[name.lower()] = value
+        classes = node.get('classes', [])
+        if atts.has_key('class'):
+            classes.append(atts['class'])
+        if classes:
+            atts['class'] = ' '.join(classes)
+        assert not atts.has_key('id')
+        ids.extend(node.get('ids', []))
+        if atts.has_key('ids'):
+            ids.extend(atts['ids'])
+            del atts['ids']
+        if ids:
+            atts['id'] = ids[0]
+            for id in ids[1:]:
+                # Add empty "span" elements for additional IDs.  Note
+                # that we cannot use empty "a" elements because there
+                # may be targets inside of references, but nested "a"
+                # elements aren't allowed in XHTML (even if they do
+                # not all have a "href" attribute).
+                if empty:
+                    # Empty tag.  Insert target right in front of element.
+                    prefix.append('<span id="%s"></span>' % id)
+                else:
+                    # Non-empty tag.  Place the auxiliary <span> tag
+                    # *inside* the element, as the first child.
+                    suffix += '<span id="%s"></span>' % id
+        attlist = atts.items()
+        attlist.sort()
+        parts = [tagname]
+        for name, value in attlist:
+            # value=None was used for boolean attributes without
+            # value, but this isn't supported by XHTML.
+            assert value is not None
+            if isinstance(value, ListType):
+                values = [unicode(v) for v in value]
+                parts.append('%s="%s"' % (name.lower(),
+                                          self.attval(' '.join(values))))
+            else:
+                parts.append('%s="%s"' % (name.lower(),
+                                          self.attval(unicode(value))))
+        if empty:
+            infix = ' /'
+        else:
+            infix = ''
+        return ''.join(prefix) + '<%s%s>' % (' '.join(parts), infix) + suffix
+
+    def emptytag(self, node, tagname, suffix='\n', **attributes):
+        """Construct and return an XML-compatible empty tag."""
+        return self.starttag(node, tagname, suffix, empty=1, **attributes)
+
+    def set_class_on_child(self, node, class_, index=0):
+        """
+        Set class `class_` on the visible child no. index of `node`.
+        Do nothing if node has fewer children than `index`.
+        """
+        children = [n for n in node if not isinstance(n, nodes.Invisible)]
+        try:
+            child = children[index]
+        except IndexError:
+            return
+        child['classes'].append(class_)
+
+    def set_first_last(self, node):
+        self.set_class_on_child(node, 'first', 0)
+        self.set_class_on_child(node, 'last', -1)
+
+    def visit_Text(self, node):
+        text = node.astext()
+        encoded = self.encode(text)
+        if self.in_mailto and self.settings.cloak_email_addresses:
+            encoded = self.cloak_email(encoded)
+        self.body.append(encoded)
+
+    def depart_Text(self, node):
+        pass
+
+    def visit_abbreviation(self, node):
+        # @@@ implementation incomplete ("title" attribute)
+        self.body.append(self.starttag(node, 'abbr', ''))
+
+    def depart_abbreviation(self, node):
+        self.body.append('</abbr>')
+
+    def visit_acronym(self, node):
+        # @@@ implementation incomplete ("title" attribute)
+        self.body.append(self.starttag(node, 'acronym', ''))
+
+    def depart_acronym(self, node):
+        self.body.append('</acronym>')
+
+    def visit_address(self, node):
+        self.visit_docinfo_item(node, 'address', meta=None)
+        self.body.append(self.starttag(node, 'pre', CLASS='address'))
+
+    def depart_address(self, node):
+        self.body.append('\n</pre>\n')
+        self.depart_docinfo_item()
+
+    def visit_admonition(self, node):
+        self.body.append(self.starttag(node, 'div'))
+        self.set_first_last(node)
+
+    def depart_admonition(self, node=None):
+        self.body.append('</div>\n')
+
+    attribution_formats = {'dash': ('&mdash;', ''),
+                           'parentheses': ('(', ')'),
+                           'parens': ('(', ')'),
+                           'none': ('', '')}
+
+    def visit_attribution(self, node):
+        prefix, suffix = self.attribution_formats[self.settings.attribution]
+        self.context.append(suffix)
+        self.body.append(
+            self.starttag(node, 'p', prefix, CLASS='attribution'))
+
+    def depart_attribution(self, node):
+        self.body.append(self.context.pop() + '</p>\n')
+
+    def visit_author(self, node):
+        if isinstance(node.parent, nodes.authors):
+            if self.author_in_authors:
+                self.body.append('\n<br />')
+        else:
+            self.visit_docinfo_item(node, 'author')
+
+    def depart_author(self, node):
+        if isinstance(node.parent, nodes.authors):
+            self.author_in_authors += 1
+        else:
+            self.depart_docinfo_item()
+
+    def visit_authors(self, node):
+        self.visit_docinfo_item(node, 'authors')
+        self.author_in_authors = 0      # initialize counter
+
+    def depart_authors(self, node):
+        self.depart_docinfo_item()
+        self.author_in_authors = None
+
+    def visit_block_quote(self, node):
+        self.body.append(self.starttag(node, 'blockquote'))
+
+    def depart_block_quote(self, node):
+        self.body.append('</blockquote>\n')
+
+    def check_simple_list(self, node):
+        """Check for a simple list that can be rendered compactly."""
+        visitor = SimpleListChecker(self.document)
+        try:
+            node.walk(visitor)
+        except nodes.NodeFound:
+            return None
+        else:
+            return 1
+
+    def is_compactable(self, node):
+        return ('compact' in node['classes']
+                or (self.settings.compact_lists
+                    and 'open' not in node['classes']
+                    and (self.compact_simple
+                         or self.topic_classes == ['contents']
+                         or self.check_simple_list(node))))
+
+    def visit_bullet_list(self, node):
+        atts = {}
+        old_compact_simple = self.compact_simple
+        self.context.append((self.compact_simple, self.compact_p))
+        self.compact_p = None
+        self.compact_simple = self.is_compactable(node)
+        if self.compact_simple and not old_compact_simple:
+            atts['class'] = 'simple'
+        self.body.append(self.starttag(node, 'ul', **atts))
+
+    def depart_bullet_list(self, node):
+        self.compact_simple, self.compact_p = self.context.pop()
+        self.body.append('</ul>\n')
+
+    def visit_caption(self, node):
+        self.body.append(self.starttag(node, 'p', '', CLASS='caption'))
+
+    def depart_caption(self, node):
+        self.body.append('</p>\n')
+
+    def visit_citation(self, node):
+        self.body.append(self.starttag(node, 'table',
+                                       CLASS='docutils citation',
+                                       frame="void", rules="none"))
+        self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
+                         '<tbody valign="top">\n'
+                         '<tr>')
+        self.footnote_backrefs(node)
+
+    def depart_citation(self, node):
+        self.body.append('</td></tr>\n'
+                         '</tbody>\n</table>\n')
+
+    def visit_citation_reference(self, node):
+        href = '#' + node['refid']
+        self.body.append(self.starttag(
+            node, 'a', '[', CLASS='citation-reference', href=href))
+
+    def depart_citation_reference(self, node):
+        self.body.append(']</a>')
+
+    def visit_classifier(self, node):
+        self.body.append(' <span class="classifier-delimiter">:</span> ')
+        self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
+
+    def depart_classifier(self, node):
+        self.body.append('</span>')
+
+    def visit_colspec(self, node):
+        self.colspecs.append(node)
+        # "stubs" list is an attribute of the tgroup element:
+        node.parent.stubs.append(node.attributes.get('stub'))
+
+    def depart_colspec(self, node):
+        pass
+
+    def write_colspecs(self):
+        width = 0
+        for node in self.colspecs:
+            width += node['colwidth']
+        for node in self.colspecs:
+            colwidth = int(node['colwidth'] * 100.0 / width + 0.5)
+            self.body.append(self.emptytag(node, 'col',
+                                           width='%i%%' % colwidth))
+        self.colspecs = []
+
+    def visit_comment(self, node,
+                      sub=re.compile('-(?=-)').sub):
+        """Escape double-dashes in comment text."""
+        self.body.append('<!-- %s -->\n' % sub('- ', node.astext()))
+        # Content already processed:
+        raise nodes.SkipNode
+
+    def visit_compound(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='compound'))
+        if len(node) > 1:
+            node[0]['classes'].append('compound-first')
+            node[-1]['classes'].append('compound-last')
+            for child in node[1:-1]:
+                child['classes'].append('compound-middle')
+
+    def depart_compound(self, node):
+        self.body.append('</div>\n')
+
+    def visit_container(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='container'))
+
+    def depart_container(self, node):
+        self.body.append('</div>\n')
+
+    def visit_contact(self, node):
+        self.visit_docinfo_item(node, 'contact', meta=None)
+
+    def depart_contact(self, node):
+        self.depart_docinfo_item()
+
+    def visit_copyright(self, node):
+        self.visit_docinfo_item(node, 'copyright')
+
+    def depart_copyright(self, node):
+        self.depart_docinfo_item()
+
+    def visit_date(self, node):
+        self.visit_docinfo_item(node, 'date')
+
+    def depart_date(self, node):
+        self.depart_docinfo_item()
+
+    def visit_decoration(self, node):
+        pass
+
+    def depart_decoration(self, node):
+        pass
+
+    def visit_definition(self, node):
+        self.body.append('</dt>\n')
+        self.body.append(self.starttag(node, 'dd', ''))
+        self.set_first_last(node)
+
+    def depart_definition(self, node):
+        self.body.append('</dd>\n')
+
+    def visit_definition_list(self, node):
+        self.body.append(self.starttag(node, 'dl', CLASS='docutils'))
+
+    def depart_definition_list(self, node):
+        self.body.append('</dl>\n')
+
+    def visit_definition_list_item(self, node):
+        pass
+
+    def depart_definition_list_item(self, node):
+        pass
+
+    def visit_description(self, node):
+        self.body.append(self.starttag(node, 'td', ''))
+        self.set_first_last(node)
+
+    def depart_description(self, node):
+        self.body.append('</td>')
+
+    def visit_docinfo(self, node):
+        self.context.append(len(self.body))
+        self.body.append(self.starttag(node, 'table',
+                                       CLASS='docinfo',
+                                       frame="void", rules="none"))
+        self.body.append('<col class="docinfo-name" />\n'
+                         '<col class="docinfo-content" />\n'
+                         '<tbody valign="top">\n')
+        self.in_docinfo = 1
+
+    def depart_docinfo(self, node):
+        self.body.append('</tbody>\n</table>\n')
+        self.in_docinfo = None
+        start = self.context.pop()
+        self.docinfo = self.body[start:]
+        self.body = []
+
+    def visit_docinfo_item(self, node, name, meta=1):
+        if meta:
+            meta_tag = '<meta name="%s" content="%s" />\n' \
+                       % (name, self.attval(node.astext()))
+            self.add_meta(meta_tag)
+        self.body.append(self.starttag(node, 'tr', ''))
+        self.body.append('<th class="docinfo-name">%s:</th>\n<td>'
+                         % self.language.labels[name])
+        if len(node):
+            if isinstance(node[0], nodes.Element):
+                node[0]['classes'].append('first')
+            if isinstance(node[-1], nodes.Element):
+                node[-1]['classes'].append('last')
+
+    def depart_docinfo_item(self):
+        self.body.append('</td></tr>\n')
+
+    def visit_doctest_block(self, node):
+        self.body.append(self.starttag(node, 'pre', CLASS='doctest-block'))
+
+    def depart_doctest_block(self, node):
+        self.body.append('\n</pre>\n')
+
+    def visit_document(self, node):
+        self.head.append('<title>%s</title>\n'
+                         % self.encode(node.get('title', '')))
+
+    def depart_document(self, node):
+        self.fragment.extend(self.body)
+        self.body_prefix.append(self.starttag(node, 'div', CLASS='document'))
+        self.body_suffix.insert(0, '</div>\n')
+        # skip content-type meta tag with interpolated charset value:
+        self.html_head.extend(self.head[1:])
+        self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo
+                              + self.docinfo + self.body
+                              + self.body_suffix[:-1])
+        assert not self.context, 'len(context) = %s' % len(self.context)
+
+    def visit_emphasis(self, node):
+        self.body.append('<em>')
+
+    def depart_emphasis(self, node):
+        self.body.append('</em>')
+
+    def visit_entry(self, node):
+        atts = {'class': []}
+        if isinstance(node.parent.parent, nodes.thead):
+            atts['class'].append('head')
+        if node.parent.parent.parent.stubs[node.parent.column]:
+            # "stubs" list is an attribute of the tgroup element
+            atts['class'].append('stub')
+        if atts['class']:
+            tagname = 'th'
+            atts['class'] = ' '.join(atts['class'])
+        else:
+            tagname = 'td'
+            del atts['class']
+        node.parent.column += 1
+        if node.has_key('morerows'):
+            atts['rowspan'] = node['morerows'] + 1
+        if node.has_key('morecols'):
+            atts['colspan'] = node['morecols'] + 1
+            node.parent.column += node['morecols']
+        self.body.append(self.starttag(node, tagname, '', **atts))
+        self.context.append('</%s>\n' % tagname.lower())
+        if len(node) == 0:              # empty cell
+            self.body.append('&nbsp;')
+        self.set_first_last(node)
+
+    def depart_entry(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_enumerated_list(self, node):
+        """
+        The 'start' attribute does not conform to HTML 4.01's strict.dtd, but
+        CSS1 doesn't help. CSS2 isn't widely enough supported yet to be
+        usable.
+        """
+        atts = {}
+        if node.has_key('start'):
+            atts['start'] = node['start']
+        if node.has_key('enumtype'):
+            atts['class'] = node['enumtype']
+        # @@@ To do: prefix, suffix. How? Change prefix/suffix to a
+        # single "format" attribute? Use CSS2?
+        old_compact_simple = self.compact_simple
+        self.context.append((self.compact_simple, self.compact_p))
+        self.compact_p = None
+        self.compact_simple = self.is_compactable(node)
+        if self.compact_simple and not old_compact_simple:
+            atts['class'] = (atts.get('class', '') + ' simple').strip()
+        self.body.append(self.starttag(node, 'ol', **atts))
+
+    def depart_enumerated_list(self, node):
+        self.compact_simple, self.compact_p = self.context.pop()
+        self.body.append('</ol>\n')
+
+    def visit_field(self, node):
+        self.body.append(self.starttag(node, 'tr', '', CLASS='field'))
+
+    def depart_field(self, node):
+        self.body.append('</tr>\n')
+
+    def visit_field_body(self, node):
+        self.body.append(self.starttag(node, 'td', '', CLASS='field-body'))
+        self.set_class_on_child(node, 'first', 0)
+        field = node.parent
+        if (self.compact_field_list or
+            isinstance(field.parent, nodes.docinfo) or
+            field.parent.index(field) == len(field.parent) - 1):
+            # If we are in a compact list, the docinfo, or if this is
+            # the last field of the field list, do not add vertical
+            # space after last element.
+            self.set_class_on_child(node, 'last', -1)
+
+    def depart_field_body(self, node):
+        self.body.append('</td>\n')
+
+    def visit_field_list(self, node):
+        self.context.append((self.compact_field_list, self.compact_p))
+        self.compact_p = None
+        if 'compact' in node['classes']:
+            self.compact_field_list = 1
+        elif (self.settings.compact_field_lists
+              and 'open' not in node['classes']):
+            self.compact_field_list = 1
+        if self.compact_field_list:
+            for field in node:
+                field_body = field[-1]
+                assert isinstance(field_body, nodes.field_body)
+                children = [n for n in field_body
+                            if not isinstance(n, nodes.Invisible)]
+                if not (len(children) == 0 or
+                        len(children) == 1 and
+                        isinstance(children[0], nodes.paragraph)):
+                    self.compact_field_list = 0
+                    break
+        self.body.append(self.starttag(node, 'table', frame='void',
+                                       rules='none',
+                                       CLASS='docutils field-list'))
+        self.body.append('<col class="field-name" />\n'
+                         '<col class="field-body" />\n'
+                         '<tbody valign="top">\n')
+
+    def depart_field_list(self, node):
+        self.body.append('</tbody>\n</table>\n')
+        self.compact_field_list, self.compact_p = self.context.pop()
+
+    def visit_field_name(self, node):
+        atts = {}
+        if self.in_docinfo:
+            atts['class'] = 'docinfo-name'
+        else:
+            atts['class'] = 'field-name'
+        if ( self.settings.field_name_limit
+             and len(node.astext()) > self.settings.field_name_limit):
+            atts['colspan'] = 2
+            self.context.append('</tr>\n<tr><td>&nbsp;</td>')
+        else:
+            self.context.append('')
+        self.body.append(self.starttag(node, 'th', '', **atts))
+
+    def depart_field_name(self, node):
+        self.body.append(':</th>')
+        self.body.append(self.context.pop())
+
+    def visit_figure(self, node):
+        atts = {'class': 'figure'}
+        if node.get('width'):
+            atts['style'] = 'width: %spx' % node['width']
+        if node.get('align'):
+            atts['align'] = node['align']
+        self.body.append(self.starttag(node, 'div', **atts))
+
+    def depart_figure(self, node):
+        self.body.append('</div>\n')
+
+    def visit_footer(self, node):
+        self.context.append(len(self.body))
+
+    def depart_footer(self, node):
+        start = self.context.pop()
+        footer = [self.starttag(node, 'div', CLASS='footer'),
+                  '<hr class="footer" />\n']
+        footer.extend(self.body[start:])
+        footer.append('\n</div>\n')
+        self.footer.extend(footer)
+        self.body_suffix[:0] = footer
+        del self.body[start:]
+
+    def visit_footnote(self, node):
+        self.body.append(self.starttag(node, 'table',
+                                       CLASS='docutils footnote',
+                                       frame="void", rules="none"))
+        self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
+                         '<tbody valign="top">\n'
+                         '<tr>')
+        self.footnote_backrefs(node)
+
+    def footnote_backrefs(self, node):
+        backlinks = []
+        backrefs = node['backrefs']
+        if self.settings.footnote_backlinks and backrefs:
+            if len(backrefs) == 1:
+                self.context.append('')
+                self.context.append('</a>')
+                self.context.append('<a class="fn-backref" href="#%s">'
+                                    % backrefs[0])
+            else:
+                i = 1
+                for backref in backrefs:
+                    backlinks.append('<a class="fn-backref" href="#%s">%s</a>'
+                                     % (backref, i))
+                    i += 1
+                self.context.append('<em>(%s)</em> ' % ', '.join(backlinks))
+                self.context += ['', '']
+        else:
+            self.context.append('')
+            self.context += ['', '']
+        # If the node does not only consist of a label.
+        if len(node) > 1:
+            # If there are preceding backlinks, we do not set class
+            # 'first', because we need to retain the top-margin.
+            if not backlinks:
+                node[1]['classes'].append('first')
+            node[-1]['classes'].append('last')
+
+    def depart_footnote(self, node):
+        self.body.append('</td></tr>\n'
+                         '</tbody>\n</table>\n')
+
+    def visit_footnote_reference(self, node):
+        href = '#' + node['refid']
+        format = self.settings.footnote_references
+        if format == 'brackets':
+            suffix = '['
+            self.context.append(']')
+        else:
+            assert format == 'superscript'
+            suffix = '<sup>'
+            self.context.append('</sup>')
+        self.body.append(self.starttag(node, 'a', suffix,
+                                       CLASS='footnote-reference', href=href))
+
+    def depart_footnote_reference(self, node):
+        self.body.append(self.context.pop() + '</a>')
+
+    def visit_generated(self, node):
+        pass
+
+    def depart_generated(self, node):
+        pass
+
+    def visit_header(self, node):
+        self.context.append(len(self.body))
+
+    def depart_header(self, node):
+        start = self.context.pop()
+        header = [self.starttag(node, 'div', CLASS='header')]
+        header.extend(self.body[start:])
+        header.append('\n<hr class="header"/>\n</div>\n')
+        self.body_prefix.extend(header)
+        self.header.extend(header)
+        del self.body[start:]
+
+    def visit_image(self, node):
+        atts = {}
+        atts['src'] = node['uri']
+        if node.has_key('width'):
+            atts['width'] = node['width']
+        if node.has_key('height'):
+            atts['height'] = node['height']
+        if node.has_key('scale'):
+            if Image and not (node.has_key('width')
+                              and node.has_key('height')):
+                try:
+                    im = Image.open(str(atts['src']))
+                except (IOError, # Source image can't be found or opened
+                        UnicodeError):  # PIL doesn't like Unicode paths.
+                    pass
+                else:
+                    if not atts.has_key('width'):
+                        atts['width'] = str(im.size[0])
+                    if not atts.has_key('height'):
+                        atts['height'] = str(im.size[1])
+                    del im
+            for att_name in 'width', 'height':
+                if atts.has_key(att_name):
+                    match = re.match(r'([0-9.]+)(\S*)$', atts[att_name])
+                    assert match
+                    atts[att_name] = '%s%s' % (
+                        float(match.group(1)) * (float(node['scale']) / 100),
+                        match.group(2))
+        style = []
+        for att_name in 'width', 'height':
+            if atts.has_key(att_name):
+                if re.match(r'^[0-9.]+$', atts[att_name]):
+                    # Interpret unitless values as pixels.
+                    atts[att_name] += 'px'
+                style.append('%s: %s;' % (att_name, atts[att_name]))
+                del atts[att_name]
+        if style:
+            atts['style'] = ' '.join(style)
+        atts['alt'] = node.get('alt', atts['src'])
+        if (isinstance(node.parent, nodes.TextElement) or
+            (isinstance(node.parent, nodes.reference) and
+             not isinstance(node.parent.parent, nodes.TextElement))):
+            # Inline context or surrounded by <a>...</a>.
+            suffix = ''
+        else:
+            suffix = '\n'
+        if node.has_key('align'):
+            if node['align'] == 'center':
+                # "align" attribute is set in surrounding "div" element.
+                self.body.append('<div align="center" class="align-center">')
+                self.context.append('</div>\n')
+                suffix = ''
+            else:
+                # "align" attribute is set in "img" element.
+                atts['align'] = node['align']
+                self.context.append('')
+            atts['class'] = 'align-%s' % node['align']
+        else:
+            self.context.append('')
+        self.body.append(self.emptytag(node, 'img', suffix, **atts))
+
+    def depart_image(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_inline(self, node):
+        self.body.append(self.starttag(node, 'span', ''))
+
+    def depart_inline(self, node):
+        self.body.append('</span>')
+
+    def visit_label(self, node):
+        # Context added in footnote_backrefs.
+        self.body.append(self.starttag(node, 'td', '%s[' % self.context.pop(),
+                                       CLASS='label'))
+
+    def depart_label(self, node):
+        # Context added in footnote_backrefs.
+        self.body.append(']%s</td><td>%s' % (self.context.pop(), self.context.pop()))
+
+    def visit_legend(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='legend'))
+
+    def depart_legend(self, node):
+        self.body.append('</div>\n')
+
+    def visit_line(self, node):
+        self.body.append(self.starttag(node, 'div', suffix='', CLASS='line'))
+        if not len(node):
+            self.body.append('<br />')
+
+    def depart_line(self, node):
+        self.body.append('</div>\n')
+
+    def visit_line_block(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='line-block'))
+
+    def depart_line_block(self, node):
+        self.body.append('</div>\n')
+
+    def visit_list_item(self, node):
+        self.body.append(self.starttag(node, 'li', ''))
+        if len(node):
+            node[0]['classes'].append('first')
+
+    def depart_list_item(self, node):
+        self.body.append('</li>\n')
+
+    def visit_literal(self, node):
+        """Process text to prevent tokens from wrapping."""
+        self.body.append(
+            self.starttag(node, 'tt', '', CLASS='docutils literal'))
+        text = node.astext()
+        for token in self.words_and_spaces.findall(text):
+            if token.strip():
+                # Protect text like "--an-option" from bad line wrapping:
+                self.body.append('<span class="pre">%s</span>'
+                                 % self.encode(token))
+            elif token in ('\n', ' '):
+                # Allow breaks at whitespace:
+                self.body.append(token)
+            else:
+                # Protect runs of multiple spaces; the last space can wrap:
+                self.body.append('&nbsp;' * (len(token) - 1) + ' ')
+        self.body.append('</tt>')
+        # Content already processed:
+        raise nodes.SkipNode
+
+    def visit_literal_block(self, node):
+        self.body.append(self.starttag(node, 'pre', CLASS='literal-block'))
+
+    def depart_literal_block(self, node):
+        self.body.append('\n</pre>\n')
+
+    def visit_meta(self, node):
+        meta = self.emptytag(node, 'meta', **node.non_default_attributes())
+        self.add_meta(meta)
+
+    def depart_meta(self, node):
+        pass
+
+    def add_meta(self, tag):
+        self.meta.append(tag)
+        self.head.append(tag)
+
+    def visit_option(self, node):
+        if self.context[-1]:
+            self.body.append(', ')
+        self.body.append(self.starttag(node, 'span', '', CLASS='option'))
+
+    def depart_option(self, node):
+        self.body.append('</span>')
+        self.context[-1] += 1
+
+    def visit_option_argument(self, node):
+        self.body.append(node.get('delimiter', ' '))
+        self.body.append(self.starttag(node, 'var', ''))
+
+    def depart_option_argument(self, node):
+        self.body.append('</var>')
+
+    def visit_option_group(self, node):
+        atts = {}
+        if ( self.settings.option_limit
+             and len(node.astext()) > self.settings.option_limit):
+            atts['colspan'] = 2
+            self.context.append('</tr>\n<tr><td>&nbsp;</td>')
+        else:
+            self.context.append('')
+        self.body.append(
+            self.starttag(node, 'td', CLASS='option-group', **atts))
+        self.body.append('<kbd>')
+        self.context.append(0)          # count number of options
+
+    def depart_option_group(self, node):
+        self.context.pop()
+        self.body.append('</kbd></td>\n')
+        self.body.append(self.context.pop())
+
+    def visit_option_list(self, node):
+        self.body.append(
+              self.starttag(node, 'table', CLASS='docutils option-list',
+                            frame="void", rules="none"))
+        self.body.append('<col class="option" />\n'
+                         '<col class="description" />\n'
+                         '<tbody valign="top">\n')
+
+    def depart_option_list(self, node):
+        self.body.append('</tbody>\n</table>\n')
+
+    def visit_option_list_item(self, node):
+        self.body.append(self.starttag(node, 'tr', ''))
+
+    def depart_option_list_item(self, node):
+        self.body.append('</tr>\n')
+
+    def visit_option_string(self, node):
+        pass
+
+    def depart_option_string(self, node):
+        pass
+
+    def visit_organization(self, node):
+        self.visit_docinfo_item(node, 'organization')
+
+    def depart_organization(self, node):
+        self.depart_docinfo_item()
+
+    def should_be_compact_paragraph(self, node):
+        """
+        Determine if the <p> tags around paragraph ``node`` can be omitted.
+        """
+        if (isinstance(node.parent, nodes.document) or
+            isinstance(node.parent, nodes.compound)):
+            # Never compact paragraphs in document or compound.
+            return 0
+        for key, value in node.attlist():
+            if (node.is_not_default(key) and
+                not (key == 'classes' and value in
+                     ([], ['first'], ['last'], ['first', 'last']))):
+                # Attribute which needs to survive.
+                return 0
+        first = isinstance(node.parent[0], nodes.label) # skip label
+        for child in node.parent.children[first:]:
+            # only first paragraph can be compact
+            if isinstance(child, nodes.Invisible):
+                continue
+            if child is node:
+                break
+            return 0
+        parent_length = len([n for n in node.parent if not isinstance(
+            n, (nodes.Invisible, nodes.label))])
+        if ( self.compact_simple
+             or self.compact_field_list
+             or self.compact_p and parent_length == 1):
+            return 1
+        return 0
+
+    def visit_paragraph(self, node):
+        if self.should_be_compact_paragraph(node):
+            self.context.append('')
+        else:
+            self.body.append(self.starttag(node, 'p', ''))
+            self.context.append('</p>\n')
+
+    def depart_paragraph(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_problematic(self, node):
+        if node.hasattr('refid'):
+            self.body.append('<a href="#%s">' % node['refid'])
+            self.context.append('</a>')
+        else:
+            self.context.append('')
+        self.body.append(self.starttag(node, 'span', '', CLASS='problematic'))
+
+    def depart_problematic(self, node):
+        self.body.append('</span>')
+        self.body.append(self.context.pop())
+
+    def visit_raw(self, node):
+        if 'html' in node.get('format', '').split():
+            t = isinstance(node.parent, nodes.TextElement) and 'span' or 'div'
+            if node['classes']:
+                self.body.append(self.starttag(node, t, suffix=''))
+            self.body.append(node.astext())
+            if node['classes']:
+                self.body.append('</%s>' % t)
+        # Keep non-HTML raw text out of output:
+        raise nodes.SkipNode
+
+    def visit_reference(self, node):
+        atts = {'class': 'reference'}
+        if node.has_key('refuri'):
+            atts['href'] = node['refuri']
+            if ( self.settings.cloak_email_addresses
+                 and atts['href'].startswith('mailto:')):
+                atts['href'] = self.cloak_mailto(atts['href'])
+                self.in_mailto = 1
+            atts['class'] += ' external'
+        else:
+            assert node.has_key('refid'), \
+                   'References must have "refuri" or "refid" attribute.'
+            atts['href'] = '#' + node['refid']
+            atts['class'] += ' internal'
+        if not isinstance(node.parent, nodes.TextElement):
+            assert len(node) == 1 and isinstance(node[0], nodes.image)
+            atts['class'] += ' image-reference'
+        self.body.append(self.starttag(node, 'a', '', **atts))
+
+    def depart_reference(self, node):
+        self.body.append('</a>')
+        if not isinstance(node.parent, nodes.TextElement):
+            self.body.append('\n')
+        self.in_mailto = 0
+
+    def visit_revision(self, node):
+        self.visit_docinfo_item(node, 'revision', meta=None)
+
+    def depart_revision(self, node):
+        self.depart_docinfo_item()
+
+    def visit_row(self, node):
+        self.body.append(self.starttag(node, 'tr', ''))
+        node.column = 0
+
+    def depart_row(self, node):
+        self.body.append('</tr>\n')
+
+    def visit_rubric(self, node):
+        self.body.append(self.starttag(node, 'p', '', CLASS='rubric'))
+
+    def depart_rubric(self, node):
+        self.body.append('</p>\n')
+
+    def visit_section(self, node):
+        self.section_level += 1
+        self.body.append(
+            self.starttag(node, 'div', CLASS='section'))
+
+    def depart_section(self, node):
+        self.section_level -= 1
+        self.body.append('</div>\n')
+
+    def visit_sidebar(self, node):
+        self.body.append(
+            self.starttag(node, 'div', CLASS='sidebar'))
+        self.set_first_last(node)
+        self.in_sidebar = 1
+
+    def depart_sidebar(self, node):
+        self.body.append('</div>\n')
+        self.in_sidebar = None
+
+    def visit_status(self, node):
+        self.visit_docinfo_item(node, 'status', meta=None)
+
+    def depart_status(self, node):
+        self.depart_docinfo_item()
+
+    def visit_strong(self, node):
+        self.body.append('<strong>')
+
+    def depart_strong(self, node):
+        self.body.append('</strong>')
+
+    def visit_subscript(self, node):
+        self.body.append(self.starttag(node, 'sub', ''))
+
+    def depart_subscript(self, node):
+        self.body.append('</sub>')
+
+    def visit_substitution_definition(self, node):
+        """Internal only."""
+        raise nodes.SkipNode
+
+    def visit_substitution_reference(self, node):
+        self.unimplemented_visit(node)
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.sidebar):
+            self.body.append(self.starttag(node, 'p', '',
+                                           CLASS='sidebar-subtitle'))
+            self.context.append('</p>\n')
+        elif isinstance(node.parent, nodes.document):
+            self.body.append(self.starttag(node, 'h2', '', CLASS='subtitle'))
+            self.context.append('</h2>\n')
+            self.in_document_title = len(self.body)
+        elif isinstance(node.parent, nodes.section):
+            tag = 'h%s' % (self.section_level + self.initial_header_level - 1)
+            self.body.append(
+                self.starttag(node, tag, '', CLASS='section-subtitle') +
+                self.starttag({}, 'span', '', CLASS='section-subtitle'))
+            self.context.append('</span></%s>\n' % tag)
+
+    def depart_subtitle(self, node):
+        self.body.append(self.context.pop())
+        if self.in_document_title:
+            self.subtitle = self.body[self.in_document_title:-1]
+            self.in_document_title = 0
+            self.body_pre_docinfo.extend(self.body)
+            self.html_subtitle.extend(self.body)
+            del self.body[:]
+
+    def visit_superscript(self, node):
+        self.body.append(self.starttag(node, 'sup', ''))
+
+    def depart_superscript(self, node):
+        self.body.append('</sup>')
+
+    def visit_system_message(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='system-message'))
+        self.body.append('<p class="system-message-title">')
+        backref_text = ''
+        if len(node['backrefs']):
+            backrefs = node['backrefs']
+            if len(backrefs) == 1:
+                backref_text = ('; <em><a href="#%s">backlink</a></em>'
+                                % backrefs[0])
+            else:
+                i = 1
+                backlinks = []
+                for backref in backrefs:
+                    backlinks.append('<a href="#%s">%s</a>' % (backref, i))
+                    i += 1
+                backref_text = ('; <em>backlinks: %s</em>'
+                                % ', '.join(backlinks))
+        if node.hasattr('line'):
+            line = ', line %s' % node['line']
+        else:
+            line = ''
+        self.body.append('System Message: %s/%s '
+                         '(<tt class="docutils">%s</tt>%s)%s</p>\n'
+                         % (node['type'], node['level'],
+                            self.encode(node['source']), line, backref_text))
+
+    def depart_system_message(self, node):
+        self.body.append('</div>\n')
+
+    def visit_table(self, node):
+        self.body.append(
+            self.starttag(node, 'table', CLASS='docutils', border="1"))
+
+    def depart_table(self, node):
+        self.body.append('</table>\n')
+
+    def visit_target(self, node):
+        if not (node.has_key('refuri') or node.has_key('refid')
+                or node.has_key('refname')):
+            self.body.append(self.starttag(node, 'span', '', CLASS='target'))
+            self.context.append('</span>')
+        else:
+            self.context.append('')
+
+    def depart_target(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_tbody(self, node):
+        self.write_colspecs()
+        self.body.append(self.context.pop()) # '</colgroup>\n' or ''
+        self.body.append(self.starttag(node, 'tbody', valign='top'))
+
+    def depart_tbody(self, node):
+        self.body.append('</tbody>\n')
+
+    def visit_term(self, node):
+        self.body.append(self.starttag(node, 'dt', ''))
+
+    def depart_term(self, node):
+        """
+        Leave the end tag to `self.visit_definition()`, in case there's a
+        classifier.
+        """
+        pass
+
+    def visit_tgroup(self, node):
+        # Mozilla needs <colgroup>:
+        self.body.append(self.starttag(node, 'colgroup'))
+        # Appended by thead or tbody:
+        self.context.append('</colgroup>\n')
+        node.stubs = []
+
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_thead(self, node):
+        self.write_colspecs()
+        self.body.append(self.context.pop()) # '</colgroup>\n'
+        # There may or may not be a <thead>; this is for <tbody> to use:
+        self.context.append('')
+        self.body.append(self.starttag(node, 'thead', valign='bottom'))
+
+    def depart_thead(self, node):
+        self.body.append('</thead>\n')
+
+    def visit_title(self, node):
+        """Only 6 section levels are supported by HTML."""
+        check_id = 0
+        close_tag = '</p>\n'
+        if isinstance(node.parent, nodes.topic):
+            self.body.append(
+                  self.starttag(node, 'p', '', CLASS='topic-title first'))
+        elif isinstance(node.parent, nodes.sidebar):
+            self.body.append(
+                  self.starttag(node, 'p', '', CLASS='sidebar-title'))
+        elif isinstance(node.parent, nodes.Admonition):
+            self.body.append(
+                  self.starttag(node, 'p', '', CLASS='admonition-title'))
+        elif isinstance(node.parent, nodes.table):
+            self.body.append(
+                  self.starttag(node, 'caption', ''))
+            close_tag = '</caption>\n'
+        elif isinstance(node.parent, nodes.document):
+            self.body.append(self.starttag(node, 'h1', '', CLASS='title'))
+            close_tag = '</h1>\n'
+            self.in_document_title = len(self.body)
+        else:
+            assert isinstance(node.parent, nodes.section)
+            h_level = self.section_level + self.initial_header_level - 1
+            atts = {}
+            if (len(node.parent) >= 2 and
+                isinstance(node.parent[1], nodes.subtitle)):
+                atts['CLASS'] = 'with-subtitle'
+            self.body.append(
+                  self.starttag(node, 'h%s' % h_level, '', **atts))
+            atts = {}
+            if node.hasattr('refid'):
+                atts['class'] = 'toc-backref'
+                atts['href'] = '#' + node['refid']
+            if atts:
+                self.body.append(self.starttag({}, 'a', '', **atts))
+                close_tag = '</a></h%s>\n' % (h_level)
+            else:
+                close_tag = '</h%s>\n' % (h_level)
+        self.context.append(close_tag)
+
+    def depart_title(self, node):
+        self.body.append(self.context.pop())
+        if self.in_document_title:
+            self.title = self.body[self.in_document_title:-1]
+            self.in_document_title = 0
+            self.body_pre_docinfo.extend(self.body)
+            self.html_title.extend(self.body)
+            del self.body[:]
+
+    def visit_title_reference(self, node):
+        self.body.append(self.starttag(node, 'cite', ''))
+
+    def depart_title_reference(self, node):
+        self.body.append('</cite>')
+
+    def visit_topic(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='topic'))
+        self.topic_classes = node['classes']
+
+    def depart_topic(self, node):
+        self.body.append('</div>\n')
+        self.topic_classes = []
+
+    def visit_transition(self, node):
+        self.body.append(self.emptytag(node, 'hr', CLASS='docutils'))
+
+    def depart_transition(self, node):
+        pass
+
+    def visit_version(self, node):
+        self.visit_docinfo_item(node, 'version', meta=None)
+
+    def depart_version(self, node):
+        self.depart_docinfo_item()
+
+    def unimplemented_visit(self, node):
+        raise NotImplementedError('visiting unimplemented node type: %s'
+                                  % node.__class__.__name__)
+
+
+class SimpleListChecker(nodes.GenericNodeVisitor):
+
+    """
+    Raise `nodes.NodeFound` if non-simple list item is encountered.
+
+    Here "simple" means a list item containing nothing other than a single
+    paragraph, a simple list, or a paragraph followed by a simple list.
+    """
+
+    def default_visit(self, node):
+        raise nodes.NodeFound
+
+    def visit_bullet_list(self, node):
+        pass
+
+    def visit_enumerated_list(self, node):
+        pass
+
+    def visit_list_item(self, node):
+        children = []
+        for child in node.children:
+            if not isinstance(child, nodes.Invisible):
+                children.append(child)
+        if (children and isinstance(children[0], nodes.paragraph)
+            and (isinstance(children[-1], nodes.bullet_list)
+                 or isinstance(children[-1], nodes.enumerated_list))):
+            children.pop()
+        if len(children) <= 1:
+            return
+        else:
+            raise nodes.NodeFound
+
+    def visit_paragraph(self, node):
+        raise nodes.SkipNode
+
+    def invisible_visit(self, node):
+        """Invisible nodes should be ignored."""
+        raise nodes.SkipNode
+
+    visit_comment = invisible_visit
+    visit_substitution_definition = invisible_visit
+    visit_target = invisible_visit
+    visit_pending = invisible_visit
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/html4css1/html4css1.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,273 @@
+/*
+:Author: David Goodger (goodger@python.org)
+:Id: $Id: html4css1.css 5196 2007-06-03 20:25:28Z wiemann $
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+  border: 0 }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 ! important }
+
+.first {
+  /* Override more specific margin styles with "! important". */
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+  font-weight: bold }
+*/
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin: 0 0 0.5em 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left {
+  clear: left }
+
+img.align-right {
+  clear: right }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font-family: serif ;
+  font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+ul.auto-toc {
+  list-style-type: none }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/html4css1/template.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,8 @@
+%(head_prefix)s
+%(head)s
+%(stylesheet)s
+%(body_prefix)s
+%(body_pre_docinfo)s
+%(docinfo)s
+%(body)s
+%(body_suffix)s
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/latex2e/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,2177 @@
+# $Id: __init__.py 5333 2007-07-10 17:31:28Z grubert $
+# Author: Engelbert Gruber <grubert@users.sourceforge.net>
+# Copyright: This module has been placed in the public domain.
+
+"""
+LaTeX2e document tree Writer.
+"""
+
+__docformat__ = 'reStructuredText'
+
+# code contributions from several people included, thanks to all.
+# some named: David Abrahams, Julien Letessier, Lele Gaifax, and others.
+#
+# convention deactivate code by two # e.g. ##.
+
+import sys
+import time
+import re
+import string
+from types import ListType
+from docutils import frontend, nodes, languages, writers, utils
+from docutils.writers.newlatex2e import unicode_map
+
+from docutils.transforms.references import DanglingReferencesVisitor
+
+class Writer(writers.Writer):
+
+    supported = ('latex','latex2e')
+    """Formats this writer supports."""
+
+    settings_spec = (
+        'LaTeX-Specific Options',
+        'The LaTeX "--output-encoding" default is "latin-1:strict".',
+        (('Specify documentclass.  Default is "article".',
+          ['--documentclass'],
+          {'default': 'article', }),
+         ('Specify document options.  Multiple options can be given, '
+          'separated by commas.  Default is "10pt,a4paper".',
+          ['--documentoptions'],
+          {'default': '10pt,a4paper', }),
+         ('Use LaTeX footnotes. LaTeX supports only numbered footnotes (does it?). '
+          'Default: no, uses figures.',
+          ['--use-latex-footnotes'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Format for footnote references: one of "superscript" or '
+          '"brackets".  Default is "superscript".',
+          ['--footnote-references'],
+          {'choices': ['superscript', 'brackets'], 'default': 'superscript',
+           'metavar': '<format>',
+           'overrides': 'trim_footnote_reference_space'}),
+         ('Use LaTeX citations. '
+          'Default: no, uses figures which might get mixed with images.',
+          ['--use-latex-citations'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Format for block quote attributions: one of "dash" (em-dash '
+          'prefix), "parentheses"/"parens", or "none".  Default is "dash".',
+          ['--attribution'],
+          {'choices': ['dash', 'parentheses', 'parens', 'none'],
+           'default': 'dash', 'metavar': '<format>'}),
+         ('Specify a stylesheet file. The file will be "input" by latex in '
+          'the document header.  Default is no stylesheet ("").  '
+          'Overrides --stylesheet-path.',
+          ['--stylesheet'],
+          {'default': '', 'metavar': '<file>',
+           'overrides': 'stylesheet_path'}),
+         ('Specify a stylesheet file, relative to the current working '
+          'directory.  Overrides --stylesheet.',
+          ['--stylesheet-path'],
+          {'metavar': '<file>', 'overrides': 'stylesheet'}),
+         ('Table of contents by docutils (default) or LaTeX. LaTeX (writer) '
+          'supports only one ToC per document, but docutils does not know of '
+          'pagenumbers. LaTeX table of contents also means LaTeX generates '
+          'sectionnumbers.',
+          ['--use-latex-toc'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Add parts on top of the section hierarchy.',
+          ['--use-part-section'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Let LaTeX print author and date, do not show it in docutils '
+          'document info.',
+          ['--use-latex-docinfo'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Use LaTeX abstract environment for the documents abstract.'
+          'Per default the abstract is an unnumbered section.',
+          ['--use-latex-abstract'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Color of any hyperlinks embedded in text '
+          '(default: "blue", "0" to disable).',
+          ['--hyperlink-color'], {'default': 'blue'}),
+         ('Enable compound enumerators for nested enumerated lists '
+          '(e.g. "1.2.a.ii").  Default: disabled.',
+          ['--compound-enumerators'],
+          {'default': None, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compound enumerators for nested enumerated lists.  This is '
+          'the default.',
+          ['--no-compound-enumerators'],
+          {'action': 'store_false', 'dest': 'compound_enumerators'}),
+         ('Enable section ("." subsection ...) prefixes for compound '
+          'enumerators.  This has no effect without --compound-enumerators.  '
+          'Default: disabled.',
+          ['--section-prefix-for-enumerators'],
+          {'default': None, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable section prefixes for compound enumerators.  '
+          'This is the default.',
+          ['--no-section-prefix-for-enumerators'],
+          {'action': 'store_false', 'dest': 'section_prefix_for_enumerators'}),
+         ('Set the separator between section number and enumerator '
+          'for compound enumerated lists.  Default is "-".',
+          ['--section-enumerator-separator'],
+          {'default': '-', 'metavar': '<char>'}),
+         ('When possibile, use verbatim for literal-blocks. '
+          'Default is to always use the mbox environment.',
+          ['--use-verbatim-when-possible'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Table style. "standard" with horizontal and vertical lines, '
+          '"booktabs" (LaTeX booktabs style) only horizontal lines '
+          'above and below the table and below the header or "nolines".  '
+          'Default: "standard"',
+          ['--table-style'],
+          {'choices': ['standard', 'booktabs','nolines'], 'default': 'standard',
+           'metavar': '<format>'}),
+         ('LaTeX graphicx package option. '
+          'Possible values are "dvips", "pdftex". "auto" includes LaTeX code '
+          'to use "pdftex" if processing with pdf(la)tex and dvips otherwise. '
+          'Default is no option.',
+          ['--graphicx-option'],
+          {'default': ''}),
+         ('LaTeX font encoding. '
+          'Possible values are "T1", "OT1", "" or some other fontenc option. '
+          'The font encoding influences available symbols, e.g. "<<" as one '
+          'character. Default is "" which leads to package "ae" (a T1 '
+          'emulation using CM fonts).',
+          ['--font-encoding'],
+          {'default': ''}),
+         ('Per default the latex-writer puts the reference title into '
+          'hyperreferences. Specify "ref*" or "pageref*" to get the section '
+          'number or the page number.',
+          ['--reference-label'],
+          {'default': None, }),
+         ('Specify style and database for bibtex, for example '
+          '"--use-bibtex=mystyle,mydb1,mydb2".',
+          ['--use-bibtex'],
+          {'default': None, }),
+          ),)
+
+    settings_defaults = {'output_encoding': 'latin-1'}
+
+    relative_path_settings = ('stylesheet_path',)
+
+    config_section = 'latex2e writer'
+    config_section_dependencies = ('writers',)
+
+    visitor_attributes = ("head_prefix", "head", 
+            "body_prefix", "body", "body_suffix")
+
+    output = None
+    """Final translated form of `document`."""
+
+    def __init__(self):
+        writers.Writer.__init__(self)
+        self.translator_class = LaTeXTranslator
+
+    def translate(self):
+        visitor = self.translator_class(self.document)
+        self.document.walkabout(visitor)
+        self.output = visitor.astext()
+        # copy parts 
+        for attr in self.visitor_attributes:
+            setattr(self, attr, getattr(visitor, attr))
+
+    def assemble_parts(self):
+        writers.Writer.assemble_parts(self)
+        for part in self.visitor_attributes:
+            self.parts[part] = ''.join(getattr(self, part))
+
+
+"""
+Notes on LaTeX
+--------------
+
+* LaTeX does not support multiple tocs in one document.
+  (might be no limitation except for docutils documentation)
+
+  The "minitoc" latex package can produce per-chapter tocs in
+  book and report document classes.
+
+* width
+
+  * linewidth - width of a line in the local environment
+  * textwidth - the width of text on the page
+
+  Maybe always use linewidth ?
+
+  *Bug* inside a minipage a (e.g. Sidebar) the linewidth is
+        not changed, needs fix in docutils so that tables
+        are not too wide.
+
+        So we add locallinewidth set it initially and
+        on entering sidebar and reset on exit.
+"""
+
+class Babel:
+    """Language specifics for LaTeX."""
+    # country code by a.schlock.
+    # partly manually converted from iso and babel stuff, dialects and some
+    _ISO639_TO_BABEL = {
+        'no': 'norsk',     #XXX added by hand ( forget about nynorsk?)
+        'gd': 'scottish',  #XXX added by hand
+        'hu': 'magyar',    #XXX added by hand
+        'pt': 'portuguese',#XXX added by hand
+        'sl': 'slovenian',
+        'af': 'afrikaans',
+        'bg': 'bulgarian',
+        'br': 'breton',
+        'ca': 'catalan',
+        'cs': 'czech',
+        'cy': 'welsh',
+        'da': 'danish',
+        'fr': 'french',
+        # french, francais, canadien, acadian
+        'de': 'ngerman',  #XXX rather than german
+        # ngerman, naustrian, german, germanb, austrian
+        'el': 'greek',
+        'en': 'english',
+        # english, USenglish, american, UKenglish, british, canadian
+        'eo': 'esperanto',
+        'es': 'spanish',
+        'et': 'estonian',
+        'eu': 'basque',
+        'fi': 'finnish',
+        'ga': 'irish',
+        'gl': 'galician',
+        'he': 'hebrew',
+        'hr': 'croatian',
+        'hu': 'hungarian',
+        'is': 'icelandic',
+        'it': 'italian',
+        'la': 'latin',
+        'nl': 'dutch',
+        'pl': 'polish',
+        'pt': 'portuguese',
+        'ro': 'romanian',
+        'ru': 'russian',
+        'sk': 'slovak',
+        'sr': 'serbian',
+        'sv': 'swedish',
+        'tr': 'turkish',
+        'uk': 'ukrainian'
+    }
+
+    def __init__(self,lang):
+        self.language = lang
+        # pdflatex does not produce double quotes for ngerman in tt.
+        self.double_quote_replacment = None
+        if re.search('^de',self.language):
+            #self.quotes = ("\"`", "\"'")
+            self.quotes = ('{\\glqq}', '{\\grqq}')
+            self.double_quote_replacment = "{\\dq}"
+        elif re.search('^it',self.language):
+            self.quotes = ("``", "''")
+            self.double_quote_replacment = r'{\char`\"}'
+        else:
+            self.quotes = ("``", "''")
+        self.quote_index = 0
+
+    def next_quote(self):
+        q = self.quotes[self.quote_index]
+        self.quote_index = (self.quote_index+1)%2
+        return q
+
+    def quote_quotes(self,text):
+        t = None
+        for part in text.split('"'):
+            if t == None:
+                t = part
+            else:
+                t += self.next_quote() + part
+        return t
+
+    def double_quotes_in_tt (self,text):
+        if not self.double_quote_replacment:
+            return text
+        return text.replace('"', self.double_quote_replacment)
+
+    def get_language(self):
+        if self._ISO639_TO_BABEL.has_key(self.language):
+            return self._ISO639_TO_BABEL[self.language]
+        else:
+            # support dialects.
+            l = self.language.split("_")[0]
+            if self._ISO639_TO_BABEL.has_key(l):
+                return self._ISO639_TO_BABEL[l]
+        return None
+
+
+latex_headings = {
+        'optionlist_environment' : [
+              '\\newcommand{\\optionlistlabel}[1]{\\bf #1 \\hfill}\n'
+              '\\newenvironment{optionlist}[1]\n'
+              '{\\begin{list}{}\n'
+              '  {\\setlength{\\labelwidth}{#1}\n'
+              '   \\setlength{\\rightmargin}{1cm}\n'
+              '   \\setlength{\\leftmargin}{\\rightmargin}\n'
+              '   \\addtolength{\\leftmargin}{\\labelwidth}\n'
+              '   \\addtolength{\\leftmargin}{\\labelsep}\n'
+              '   \\renewcommand{\\makelabel}{\\optionlistlabel}}\n'
+              '}{\\end{list}}\n',
+              ],
+        'lineblock_environment' : [
+            '\\newlength{\\lineblockindentation}\n'
+            '\\setlength{\\lineblockindentation}{2.5em}\n'
+            '\\newenvironment{lineblock}[1]\n'
+            '{\\begin{list}{}\n'
+            '  {\\setlength{\\partopsep}{\\parskip}\n'
+            '   \\addtolength{\\partopsep}{\\baselineskip}\n'
+            '   \\topsep0pt\\itemsep0.15\\baselineskip\\parsep0pt\n'
+            '   \\leftmargin#1}\n'
+            ' \\raggedright}\n'
+            '{\\end{list}}\n'
+            ],
+        'footnote_floats' : [
+            '% begin: floats for footnotes tweaking.\n',
+            '\\setlength{\\floatsep}{0.5em}\n',
+            '\\setlength{\\textfloatsep}{\\fill}\n',
+            '\\addtolength{\\textfloatsep}{3em}\n',
+            '\\renewcommand{\\textfraction}{0.5}\n',
+            '\\renewcommand{\\topfraction}{0.5}\n',
+            '\\renewcommand{\\bottomfraction}{0.5}\n',
+            '\\setcounter{totalnumber}{50}\n',
+            '\\setcounter{topnumber}{50}\n',
+            '\\setcounter{bottomnumber}{50}\n',
+            '% end floats for footnotes\n',
+            ],
+        'some_commands' : [
+            '% some commands, that could be overwritten in the style file.\n'
+            '\\newcommand{\\rubric}[1]'
+            '{\\subsection*{~\\hfill {\\it #1} \\hfill ~}}\n'
+            '\\newcommand{\\titlereference}[1]{\\textsl{#1}}\n'
+            '% end of "some commands"\n',
+            ]
+        }
+
+class DocumentClass:
+    """Details of a LaTeX document class."""
+
+    def __init__(self, document_class, with_part=False):
+        self.document_class = document_class
+        self._with_part = with_part
+
+    def section(self, level):
+        """ Return the section name at the given level for the specific
+            document class.
+
+            Level is 1,2,3..., as level 0 is the title."""
+
+        sections = [ 'section', 'subsection', 'subsubsection', 
+                     'paragraph', 'subparagraph' ]
+        if self.document_class in ('book', 'report', 'scrreprt', 'scrbook'):
+            sections.insert(0, 'chapter')
+        if self._with_part:
+            sections.insert(0, 'part')
+        if level <= len(sections):
+            return sections[level-1]
+        else:
+            return sections[-1]
+
+class Table:
+    """ Manage a table while traversing.
+        Maybe change to a mixin defining the visit/departs, but then
+        class Table internal variables are in the Translator.
+
+        Table style might be 
+        
+        * standard: horizontal and vertical lines
+        * booktabs (requires booktabs latex package): only horizontal lines
+        * nolines, borderless : no lines
+    """
+    def __init__(self,latex_type,table_style):
+        self._latex_type = latex_type
+        self._table_style = table_style
+        self._open = 0
+        # miscellaneous attributes
+        self._attrs = {}
+        self._col_width = []
+        self._rowspan = []
+        self.stubs = []
+
+    def open(self):
+        self._open = 1
+        self._col_specs = []
+        self.caption = None
+        self._attrs = {}
+        self._in_head = 0 # maybe context with search
+    def close(self):
+        self._open = 0
+        self._col_specs = None
+        self.caption = None
+        self._attrs = {}
+        self.stubs = []
+    def is_open(self):
+        return self._open
+
+    def set_table_style(self, table_style):
+        if not table_style in ('standard','booktabs','borderless','nolines'):
+            return
+        self._table_style = table_style
+
+    def used_packages(self):
+        if self._table_style == 'booktabs':
+            return '\\usepackage{booktabs}\n'
+        return ''
+    def get_latex_type(self):
+        return self._latex_type
+
+    def set(self,attr,value):
+        self._attrs[attr] = value
+    def get(self,attr):
+        if self._attrs.has_key(attr):
+            return self._attrs[attr]
+        return None
+    def get_vertical_bar(self):
+        if self._table_style == 'standard':
+            return '|'
+        return ''
+    # horizontal lines are drawn below a row, because we.
+    def get_opening(self):
+        if self._latex_type == 'longtable':
+            # otherwise longtable might move before paragraph and subparagraph
+            prefix = '\\leavevmode\n'
+        else:
+            prefix = ''
+        return '%s\\begin{%s}[c]' % (prefix, self._latex_type)
+    def get_closing(self):
+        line = ""
+        if self._table_style == 'booktabs':
+            line = '\\bottomrule\n'
+        elif self._table_style == 'standard':
+            lines = '\\hline\n'
+        return '%s\\end{%s}' % (line,self._latex_type)
+
+    def visit_colspec(self, node):
+        self._col_specs.append(node)
+        # "stubs" list is an attribute of the tgroup element:
+        self.stubs.append(node.attributes.get('stub'))
+
+    def get_colspecs(self):
+        """
+        Return column specification for longtable.
+
+        Assumes reST line length being 80 characters.
+        Table width is hairy.
+
+        === ===
+        ABC DEF
+        === ===
+
+        usually gets to narrow, therefore we add 1 (fiddlefactor).
+        """
+        width = 80
+
+        total_width = 0.0
+        # first see if we get too wide.
+        for node in self._col_specs:
+            colwidth = float(node['colwidth']+1) / width
+            total_width += colwidth
+        self._col_width = []
+        self._rowspan = []
+        # donot make it full linewidth
+        factor = 0.93
+        if total_width > 1.0:
+            factor /= total_width
+        bar = self.get_vertical_bar()
+        latex_table_spec = ""
+        for node in self._col_specs:
+            colwidth = factor * float(node['colwidth']+1) / width
+            self._col_width.append(colwidth+0.005)
+            self._rowspan.append(0)
+            latex_table_spec += "%sp{%.3f\\locallinewidth}" % (bar,colwidth+0.005)
+        return latex_table_spec+bar
+
+    def get_column_width(self):
+        """ return columnwidth for current cell (not multicell)
+        """
+        return "%.2f\\locallinewidth" % self._col_width[self._cell_in_row-1]
+
+    def visit_thead(self):
+        self._in_thead = 1
+        if self._table_style == 'standard':
+            return ['\\hline\n']
+        elif self._table_style == 'booktabs':
+            return ['\\toprule\n']
+        return []
+    def depart_thead(self):
+        a = []
+        #if self._table_style == 'standard':
+        #    a.append('\\hline\n')
+        if self._table_style == 'booktabs':
+            a.append('\\midrule\n')
+        if self._latex_type == 'longtable':
+            a.append('\\endhead\n')
+        # for longtable one could add firsthead, foot and lastfoot
+        self._in_thead = 0
+        return a
+    def visit_row(self):
+        self._cell_in_row = 0
+    def depart_row(self):
+        res = [' \\\\\n']
+        self._cell_in_row = None  # remove cell counter
+        for i in range(len(self._rowspan)):
+            if (self._rowspan[i]>0):
+                self._rowspan[i] -= 1
+
+        if self._table_style == 'standard':
+            rowspans = []
+            for i in range(len(self._rowspan)):
+                if (self._rowspan[i]<=0):
+                    rowspans.append(i+1)
+            if len(rowspans)==len(self._rowspan):
+                res.append('\\hline\n')
+            else:
+                cline = ''
+                rowspans.reverse()
+                # TODO merge clines
+                while 1:
+                    try:
+                        c_start = rowspans.pop()
+                    except:
+                        break
+                    cline += '\\cline{%d-%d}\n' % (c_start,c_start)
+                res.append(cline)
+        return res
+
+    def set_rowspan(self,cell,value):
+        try:
+            self._rowspan[cell] = value
+        except:
+            pass
+    def get_rowspan(self,cell):
+        try:
+            return self._rowspan[cell]
+        except:
+            return 0
+    def get_entry_number(self):
+        return self._cell_in_row
+    def visit_entry(self):
+        self._cell_in_row += 1
+    def is_stub_column(self):
+        if len(self.stubs) >= self._cell_in_row:
+            return self.stubs[self._cell_in_row-1]
+        return False
+
+
+class LaTeXTranslator(nodes.NodeVisitor):
+
+    # When options are given to the documentclass, latex will pass them
+    # to other packages, as done with babel.
+    # Dummy settings might be taken from document settings
+    
+    # Templates
+    # ---------
+    
+    latex_head = '\\documentclass[%s]{%s}\n'
+    linking = '\\usepackage[colorlinks=%s,linkcolor=%s,urlcolor=%s]{hyperref}\n'
+    stylesheet = '\\input{%s}\n'
+    # add a generated on day , machine by user using docutils version.
+    generator = '% generated by Docutils <http://docutils.sourceforge.net/>\n'
+    # Config setting defaults
+    # -----------------------
+
+    # use latex tableofcontents or let docutils do it.
+    use_latex_toc = 0
+
+    # TODO: use mixins for different implementations.
+    # list environment for docinfo. else tabularx
+    use_optionlist_for_docinfo = 0 # NOT YET IN USE
+
+    # Use compound enumerations (1.A.1.)
+    compound_enumerators = 0
+
+    # If using compound enumerations, include section information.
+    section_prefix_for_enumerators = 0
+
+    # This is the character that separates the section ("." subsection ...)
+    # prefix from the regular list enumerator.
+    section_enumerator_separator = '-'
+
+    # default link color
+    hyperlink_color = "blue"
+
+    def __init__(self, document):
+        nodes.NodeVisitor.__init__(self, document)
+        self.settings = settings = document.settings
+        self.latex_encoding = self.to_latex_encoding(settings.output_encoding)
+        self.use_latex_toc = settings.use_latex_toc
+        self.use_latex_docinfo = settings.use_latex_docinfo
+        self.use_latex_footnotes = settings.use_latex_footnotes
+        self._use_latex_citations = settings.use_latex_citations
+        self._reference_label = settings.reference_label
+        self.hyperlink_color = settings.hyperlink_color
+        self.compound_enumerators = settings.compound_enumerators
+        self.font_encoding = settings.font_encoding
+        self.section_prefix_for_enumerators = (
+            settings.section_prefix_for_enumerators)
+        self.section_enumerator_separator = (
+            settings.section_enumerator_separator.replace('_', '\\_'))
+        if self.hyperlink_color == '0':
+            self.hyperlink_color = 'black'
+            self.colorlinks = 'false'
+        else:
+            self.colorlinks = 'true'
+
+        if self.settings.use_bibtex:
+            self.bibtex = self.settings.use_bibtex.split(",",1)
+            # TODO avoid errors on not declared citations.
+        else:
+            self.bibtex = None
+        # language: labels, bibliographic_fields, and author_separators.
+        # to allow writing labes for specific languages.
+        self.language = languages.get_language(settings.language_code)
+        self.babel = Babel(settings.language_code)
+        self.author_separator = self.language.author_separators[0]
+        self.d_options = self.settings.documentoptions
+        if self.babel.get_language():
+            self.d_options += ',%s' % self.babel.get_language()
+
+        self.d_class = DocumentClass(settings.documentclass, 
+                                     settings.use_part_section)
+        # object for a table while proccessing.
+        self.table_stack = []
+        self.active_table = Table('longtable',settings.table_style)
+
+        # HACK.  Should have more sophisticated typearea handling.
+        if settings.documentclass.find('scr') == -1:
+            self.typearea = '\\usepackage[DIV12]{typearea}\n'
+        else:
+            if self.d_options.find('DIV') == -1 and self.d_options.find('BCOR') == -1:
+                self.typearea = '\\typearea{12}\n'
+            else:
+                self.typearea = ''
+
+        if self.font_encoding == 'OT1':
+            fontenc_header = ''
+        elif self.font_encoding == '':
+            fontenc_header = '\\usepackage{ae}\n\\usepackage{aeguill}\n'
+        else:
+            fontenc_header = '\\usepackage[%s]{fontenc}\n' % (self.font_encoding,)
+        if self.latex_encoding.startswith('utf8'):
+            input_encoding = '\\usepackage{ucs}\n\\usepackage[utf8x]{inputenc}\n'
+        else:
+            input_encoding = '\\usepackage[%s]{inputenc}\n' % self.latex_encoding
+        if self.settings.graphicx_option == '':
+            self.graphicx_package = '\\usepackage{graphicx}\n'
+        elif self.settings.graphicx_option.lower() == 'auto':
+            self.graphicx_package = '\n'.join(
+                ('%Check if we are compiling under latex or pdflatex',
+                 '\\ifx\\pdftexversion\\undefined',
+                 '  \\usepackage{graphicx}',
+                 '\\else',
+                 '  \\usepackage[pdftex]{graphicx}',
+                 '\\fi\n'))
+        else:
+            self.graphicx_package = (
+                '\\usepackage[%s]{graphicx}\n' % self.settings.graphicx_option)
+
+        self.head_prefix = [
+              self.latex_head % (self.d_options,self.settings.documentclass),
+              '\\usepackage{babel}\n',     # language is in documents settings.
+              fontenc_header,
+              '\\usepackage{shortvrb}\n',  # allows verb in footnotes.
+              input_encoding,
+              # * tabularx: for docinfo, automatic width of columns, always on one page.
+              '\\usepackage{tabularx}\n',
+              '\\usepackage{longtable}\n',
+              self.active_table.used_packages(),
+              # possible other packages.
+              # * fancyhdr
+              # * ltxtable is a combination of tabularx and longtable (pagebreaks).
+              #   but ??
+              #
+              # extra space between text in tables and the line above them
+              '\\setlength{\\extrarowheight}{2pt}\n',
+              '\\usepackage{amsmath}\n',   # what fore amsmath.
+              self.graphicx_package,
+              '\\usepackage{color}\n',
+              '\\usepackage{multirow}\n',
+              '\\usepackage{ifthen}\n',   # before hyperref!
+              self.linking % (self.colorlinks, self.hyperlink_color, self.hyperlink_color),
+              self.typearea,
+              self.generator,
+              # latex lengths
+              '\\newlength{\\admonitionwidth}\n',
+              '\\setlength{\\admonitionwidth}{0.9\\textwidth}\n'
+              # width for docinfo tablewidth
+              '\\newlength{\\docinfowidth}\n',
+              '\\setlength{\\docinfowidth}{0.9\\textwidth}\n'
+              # linewidth of current environment, so tables are not wider
+              # than the sidebar: using locallinewidth seems to defer evaluation
+              # of linewidth, this is fixing it.
+              '\\newlength{\\locallinewidth}\n',
+              # will be set later.
+              ]
+        self.head_prefix.extend( latex_headings['optionlist_environment'] )
+        self.head_prefix.extend( latex_headings['lineblock_environment'] )
+        self.head_prefix.extend( latex_headings['footnote_floats'] )
+        self.head_prefix.extend( latex_headings['some_commands'] )
+        ## stylesheet is last: so it might be possible to overwrite defaults.
+        stylesheet = utils.get_stylesheet_reference(settings)
+        if stylesheet:
+            settings.record_dependencies.add(stylesheet)
+            self.head_prefix.append(self.stylesheet % (stylesheet))
+
+        if self.linking: # and maybe check for pdf
+            self.pdfinfo = [ ]
+            self.pdfauthor = None
+            # pdftitle, pdfsubject, pdfauthor, pdfkeywords, 
+            # pdfcreator, pdfproducer
+        else:
+            self.pdfinfo = None
+        # NOTE: Latex wants a date and an author, rst puts this into
+        #   docinfo, so normally we do not want latex author/date handling.
+        # latex article has its own handling of date and author, deactivate.
+        # self.astext() adds \title{...} \author{...} \date{...}, even if the
+        # "..." are empty strings.
+        self.head = [ ]
+        # separate title, so we can appen subtitle.
+        self.title = ''
+        # if use_latex_docinfo: collects lists of author/organization/contact/address lines
+        self.author_stack = []
+        self.date = ''
+
+        self.body_prefix = ['\\raggedbottom\n']
+        self.body = []
+        self.body_suffix = ['\n']
+        self.section_level = 0
+        self.context = []
+        self.topic_classes = []
+        # column specification for tables
+        self.table_caption = None
+        
+        # Flags to encode
+        # ---------------
+        # verbatim: to tell encode not to encode.
+        self.verbatim = 0
+        # insert_newline: to tell encode to replace blanks by "~".
+        self.insert_none_breaking_blanks = 0
+        # insert_newline: to tell encode to add latex newline.
+        self.insert_newline = 0
+        # mbox_newline: to tell encode to add mbox and newline.
+        self.mbox_newline = 0
+        # inside citation reference labels underscores dont need to be escaped.
+        self.inside_citation_reference_label = 0
+
+        # Stack of section counters so that we don't have to use_latex_toc.
+        # This will grow and shrink as processing occurs.
+        # Initialized for potential first-level sections.
+        self._section_number = [0]
+
+        # The current stack of enumerations so that we can expand
+        # them into a compound enumeration.  
+        self._enumeration_counters = []
+
+        # The maximum number of enumeration counters we've used.
+        # If we go beyond this number, we need to create a new
+        # counter; otherwise, just reuse an old one.
+        self._max_enumeration_counters = 0
+
+        self._bibitems = []
+
+        # docinfo.
+        self.docinfo = None
+        # inside literal block: no quote mangling.
+        self.literal_block = 0
+        self.literal_block_stack = []
+        self.literal = 0
+        # true when encoding in math mode
+        self.mathmode = 0
+
+    def to_latex_encoding(self,docutils_encoding):
+        """
+        Translate docutils encoding name into latex's.
+
+        Default fallback method is remove "-" and "_" chars from docutils_encoding.
+
+        """
+        tr = {  "iso-8859-1": "latin1",     # west european
+                "iso-8859-2": "latin2",     # east european
+                "iso-8859-3": "latin3",     # esperanto, maltese
+                "iso-8859-4": "latin4",     # north european,scandinavian, baltic
+                "iso-8859-5": "iso88595",   # cyrillic (ISO)
+                "iso-8859-9": "latin5",     # turkish
+                "iso-8859-15": "latin9",    # latin9, update to latin1.
+                "mac_cyrillic": "maccyr",   # cyrillic (on Mac)
+                "windows-1251": "cp1251",   # cyrillic (on Windows)
+                "koi8-r": "koi8-r",         # cyrillic (Russian)
+                "koi8-u": "koi8-u",         # cyrillic (Ukrainian)
+                "windows-1250": "cp1250",   #
+                "windows-1252": "cp1252",   #
+                "us-ascii": "ascii",        # ASCII (US)
+                # unmatched encodings
+                #"": "applemac",
+                #"": "ansinew",  # windows 3.1 ansi
+                #"": "ascii",    # ASCII encoding for the range 32--127.
+                #"": "cp437",    # dos latine us
+                #"": "cp850",    # dos latin 1
+                #"": "cp852",    # dos latin 2
+                #"": "decmulti",
+                #"": "latin10",
+                #"iso-8859-6": ""   # arabic
+                #"iso-8859-7": ""   # greek
+                #"iso-8859-8": ""   # hebrew
+                #"iso-8859-10": ""   # latin6, more complete iso-8859-4
+             }
+        if tr.has_key(docutils_encoding.lower()):
+            return tr[docutils_encoding.lower()]
+        # convert: latin-1 and utf-8 and similar things
+        return docutils_encoding.replace("_", "").replace("-", "").lower()
+
+    def language_label(self, docutil_label):
+        return self.language.labels[docutil_label]
+
+    latex_equivalents = {
+        u'\u00A0' : '~',
+        u'\u2013' : '{--}',
+        u'\u2014' : '{---}',
+        u'\u2018' : '`',
+        u'\u2019' : '\'',
+        u'\u201A' : ',',
+        u'\u201C' : '``',
+        u'\u201D' : '\'\'',
+        u'\u201E' : ',,',
+        u'\u2020' : '{\\dag}',
+        u'\u2021' : '{\\ddag}',
+        u'\u2026' : '{\\dots}',
+        u'\u2122' : '{\\texttrademark}',
+        u'\u21d4' : '{$\\Leftrightarrow$}',
+        # greek alphabet ?
+    }
+
+    def unicode_to_latex(self,text):
+        # see LaTeX codec
+        # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252124
+        # Only some special chracters are translated, for documents with many
+        # utf-8 chars one should use the LaTeX unicode package.
+        for uchar in self.latex_equivalents.keys():
+            text = text.replace(uchar,self.latex_equivalents[uchar])
+        return text
+
+    def ensure_math(self, text):
+        if not self.__dict__.has_key('ensure_math_re'):
+            chars = {
+                # lnot,pm,twosuperior,threesuperior,mu,onesuperior,times,div
+                'latin1' : '\xac\xb1\xb2\xb3\xb5\xb9\xd7\xf7' ,
+                # also latin5 and latin9
+                }
+            self.ensure_math_re = re.compile('([%s])' % chars['latin1'])
+        text = self.ensure_math_re.sub(r'\\ensuremath{\1}', text)
+        return text
+
+    def encode(self, text):
+        """
+        Encode special characters (``# $ % & ~ _ ^ \ { }``) in `text` & return
+        """
+        # Escaping with a backslash does not help with backslashes, ~ and ^.
+
+        #     < > are only available in math-mode or tt font. (really ?)
+        #     $ starts math- mode.
+        # AND quotes
+        if self.verbatim:
+            return text
+        # compile the regexps once. do it here so one can see them.
+        #
+        # first the braces.
+        if not self.__dict__.has_key('encode_re_braces'):
+            self.encode_re_braces = re.compile(r'([{}])')
+        text = self.encode_re_braces.sub(r'{\\\1}',text)
+        if not self.__dict__.has_key('encode_re_bslash'):
+            # find backslash: except in the form '{\{}' or '{\}}'.
+            self.encode_re_bslash = re.compile(r'(?<!{)(\\)(?![{}]})')
+        # then the backslash: except in the form from line above:
+        # either '{\{}' or '{\}}'.
+        text = self.encode_re_bslash.sub(r'{\\textbackslash}', text)
+
+        # then dollar
+        text = text.replace("$", '{\\$}')
+        if not ( self.literal_block or self.literal or self.mathmode ):
+            # the vertical bar: in mathmode |,\vert or \mid
+            #   in textmode \textbar
+            text = text.replace("|", '{\\textbar}')
+            text = text.replace("<", '{\\textless}')
+            text = text.replace(">", '{\\textgreater}')
+        # then
+        text = text.replace("&", '{\\&}')
+        # the ^:
+        # * verb|^| does not work in mbox.
+        # * mathmode has wedge. hat{~} would also work.
+        # text = text.replace("^", '{\\ensuremath{^\\wedge}}')
+        text = text.replace("^", '{\\textasciicircum}')
+        text = text.replace("%", '{\\%}')
+        text = text.replace("#", '{\\#}')
+        text = text.replace("~", '{\\textasciitilde}')
+        # Separate compound characters, e.g. "--" to "-{}-".  (The
+        # actual separation is done later; see below.)
+        separate_chars = '-'
+        if self.literal_block or self.literal:
+            # In monospace-font, we also separate ",,", "``" and "''"
+            # and some other characters which can't occur in
+            # non-literal text.
+            separate_chars += ',`\'"<>'
+            # pdflatex does not produce doublequotes for ngerman.
+            text = self.babel.double_quotes_in_tt(text)
+            if self.font_encoding == 'OT1':
+                # We're using OT1 font-encoding and have to replace
+                # underscore by underlined blank, because this has
+                # correct width.
+                text = text.replace('_', '{\\underline{ }}')
+                # And the tt-backslash doesn't work in OT1, so we use
+                # a mirrored slash.
+                text = text.replace('\\textbackslash', '\\reflectbox{/}')
+            else:
+                text = text.replace('_', '{\\_}')
+        else:
+            text = self.babel.quote_quotes(text)
+            if not self.inside_citation_reference_label:
+                text = text.replace("_", '{\\_}')
+        for char in separate_chars * 2:
+            # Do it twice ("* 2") becaues otherwise we would replace
+            # "---" by "-{}--".
+            text = text.replace(char + char, char + '{}' + char)
+        if self.insert_newline or self.literal_block:
+            # Insert a blank before the newline, to avoid
+            # ! LaTeX Error: There's no line here to end.
+            text = text.replace("\n", '~\\\\\n')
+        elif self.mbox_newline:
+            if self.literal_block:
+                closings = "}" * len(self.literal_block_stack)
+                openings = "".join(self.literal_block_stack)
+            else:
+                closings = ""
+                openings = ""
+            text = text.replace("\n", "%s}\\\\\n\\mbox{%s" % (closings,openings))
+        text = text.replace('[', '{[}').replace(']', '{]}')
+        if self.insert_none_breaking_blanks:
+            text = text.replace(' ', '~')
+        if self.latex_encoding != 'utf8':
+            text = self.unicode_to_latex(text)
+            text = self.ensure_math(text)
+        return text
+
+    def attval(self, text,
+               whitespace=re.compile('[\n\r\t\v\f]')):
+        """Cleanse, encode, and return attribute value text."""
+        return self.encode(whitespace.sub(' ', text))
+
+    def astext(self):
+        if self.pdfinfo is not None and self.pdfauthor:
+            self.pdfinfo.append('pdfauthor={%s}' % self.pdfauthor)
+        if self.pdfinfo:
+            pdfinfo = '\\hypersetup{\n' + ',\n'.join(self.pdfinfo) + '\n}\n'
+        else:
+            pdfinfo = ''
+        head = '\\title{%s}\n\\author{%s}\n\\date{%s}\n' % \
+               (self.title,
+                ' \\and\n'.join(['~\\\\\n'.join(author_lines)
+                                 for author_lines in self.author_stack]),
+                self.date)
+        return ''.join(self.head_prefix + [head] + self.head + [pdfinfo]
+                        + self.body_prefix  + self.body + self.body_suffix)
+
+    def visit_Text(self, node):
+        self.body.append(self.encode(node.astext()))
+
+    def depart_Text(self, node):
+        pass
+
+    def visit_address(self, node):
+        self.visit_docinfo_item(node, 'address')
+
+    def depart_address(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_admonition(self, node, name=''):
+        self.body.append('\\begin{center}\\begin{sffamily}\n')
+        self.body.append('\\fbox{\\parbox{\\admonitionwidth}{\n')
+        if name:
+            self.body.append('\\textbf{\\large '+ self.language.labels[name] + '}\n');
+        self.body.append('\\vspace{2mm}\n')
+
+
+    def depart_admonition(self, node=None):
+        self.body.append('}}\n') # end parbox fbox
+        self.body.append('\\end{sffamily}\n\\end{center}\n');
+
+    def visit_attention(self, node):
+        self.visit_admonition(node, 'attention')
+
+    def depart_attention(self, node):
+        self.depart_admonition()
+
+    def visit_author(self, node):
+        self.visit_docinfo_item(node, 'author')
+
+    def depart_author(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_authors(self, node):
+        # not used: visit_author is called anyway for each author.
+        pass
+
+    def depart_authors(self, node):
+        pass
+
+    def visit_block_quote(self, node):
+        self.body.append( '\\begin{quote}\n')
+
+    def depart_block_quote(self, node):
+        self.body.append( '\\end{quote}\n')
+
+    def visit_bullet_list(self, node):
+        if 'contents' in self.topic_classes:
+            if self.use_latex_toc:
+                raise nodes.SkipNode
+            self.body.append( '\\begin{list}{}{}\n' )
+        else:
+            self.body.append( '\\begin{itemize}\n' )
+
+    def depart_bullet_list(self, node):
+        if 'contents' in self.topic_classes:
+            self.body.append( '\\end{list}\n' )
+        else:
+            self.body.append( '\\end{itemize}\n' )
+
+    # Imperfect superscript/subscript handling: mathmode italicizes
+    # all letters by default.
+    def visit_superscript(self, node):
+        self.body.append('$^{')
+        self.mathmode = 1
+
+    def depart_superscript(self, node):
+        self.body.append('}$')
+        self.mathmode = 0
+
+    def visit_subscript(self, node):
+        self.body.append('$_{')
+        self.mathmode = 1
+
+    def depart_subscript(self, node):
+        self.body.append('}$')
+        self.mathmode = 0
+
+    def visit_caption(self, node):
+        self.body.append( '\\caption{' )
+
+    def depart_caption(self, node):
+        self.body.append('}')
+
+    def visit_caution(self, node):
+        self.visit_admonition(node, 'caution')
+
+    def depart_caution(self, node):
+        self.depart_admonition()
+
+    def visit_title_reference(self, node):
+        self.body.append( '\\titlereference{' )
+
+    def depart_title_reference(self, node):
+        self.body.append( '}' )
+
+    def visit_citation(self, node):
+        # TODO maybe use cite bibitems
+        if self._use_latex_citations:
+            self.context.append(len(self.body))
+        else:
+            self.body.append('\\begin{figure}[b]')
+            for id in node['ids']:
+                self.body.append('\\hypertarget{%s}' % id)
+
+    def depart_citation(self, node):
+        if self._use_latex_citations:
+            size = self.context.pop()
+            label = self.body[size]
+            text = ''.join(self.body[size+1:])
+            del self.body[size:]
+            self._bibitems.append([label, text])
+        else:
+            self.body.append('\\end{figure}\n')
+
+    def visit_citation_reference(self, node):
+        if self._use_latex_citations:
+            self.body.append('\\cite{')
+            self.inside_citation_reference_label = 1
+        else:
+            href = ''
+            if node.has_key('refid'):
+                href = node['refid']
+            elif node.has_key('refname'):
+                href = self.document.nameids[node['refname']]
+            self.body.append('[\\hyperlink{%s}{' % href)
+
+    def depart_citation_reference(self, node):
+        if self._use_latex_citations:
+            self.body.append('}')
+            self.inside_citation_reference_label = 0
+        else:
+            self.body.append('}]')
+
+    def visit_classifier(self, node):
+        self.body.append( '(\\textbf{' )
+
+    def depart_classifier(self, node):
+        self.body.append( '})\n' )
+
+    def visit_colspec(self, node):
+        self.active_table.visit_colspec(node)
+
+    def depart_colspec(self, node):
+        pass
+
+    def visit_comment(self, node):
+        # Escape end of line by a new comment start in comment text.
+        self.body.append('%% %s \n' % node.astext().replace('\n', '\n% '))
+        raise nodes.SkipNode
+
+    def visit_compound(self, node):
+        pass
+
+    def depart_compound(self, node):
+        pass
+
+    def visit_contact(self, node):
+        self.visit_docinfo_item(node, 'contact')
+
+    def depart_contact(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_container(self, node):
+        pass
+
+    def depart_container(self, node):
+        pass
+
+    def visit_copyright(self, node):
+        self.visit_docinfo_item(node, 'copyright')
+
+    def depart_copyright(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_danger(self, node):
+        self.visit_admonition(node, 'danger')
+
+    def depart_danger(self, node):
+        self.depart_admonition()
+
+    def visit_date(self, node):
+        self.visit_docinfo_item(node, 'date')
+
+    def depart_date(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_decoration(self, node):
+        pass
+
+    def depart_decoration(self, node):
+        pass
+
+    def visit_definition(self, node):
+        pass
+
+    def depart_definition(self, node):
+        self.body.append('\n')
+
+    def visit_definition_list(self, node):
+        self.body.append( '\\begin{description}\n' )
+
+    def depart_definition_list(self, node):
+        self.body.append( '\\end{description}\n' )
+
+    def visit_definition_list_item(self, node):
+        pass
+
+    def depart_definition_list_item(self, node):
+        pass
+
+    def visit_description(self, node):
+        self.body.append( ' ' )
+
+    def depart_description(self, node):
+        pass
+
+    def visit_docinfo(self, node):
+        self.docinfo = []
+        self.docinfo.append('%' + '_'*75 + '\n')
+        self.docinfo.append('\\begin{center}\n')
+        self.docinfo.append('\\begin{tabularx}{\\docinfowidth}{lX}\n')
+
+    def depart_docinfo(self, node):
+        self.docinfo.append('\\end{tabularx}\n')
+        self.docinfo.append('\\end{center}\n')
+        self.body = self.docinfo + self.body
+        # clear docinfo, so field names are no longer appended.
+        self.docinfo = None
+
+    def visit_docinfo_item(self, node, name):
+        if name == 'author':
+            if not self.pdfinfo == None:
+                if not self.pdfauthor:
+                    self.pdfauthor = self.attval(node.astext())
+                else:
+                    self.pdfauthor += self.author_separator + self.attval(node.astext())
+        if self.use_latex_docinfo:
+            if name in ('author', 'organization', 'contact', 'address'):
+                # We attach these to the last author.  If any of them precedes
+                # the first author, put them in a separate "author" group (for
+                # no better semantics).
+                if name == 'author' or not self.author_stack:
+                    self.author_stack.append([])
+                if name == 'address':   # newlines are meaningful
+                    self.insert_newline = 1
+                    text = self.encode(node.astext())
+                    self.insert_newline = 0
+                else:
+                    text = self.attval(node.astext())
+                self.author_stack[-1].append(text)
+                raise nodes.SkipNode
+            elif name == 'date':
+                self.date = self.attval(node.astext())
+                raise nodes.SkipNode
+        self.docinfo.append('\\textbf{%s}: &\n\t' % self.language_label(name))
+        if name == 'address':
+            self.insert_newline = 1
+            self.docinfo.append('{\\raggedright\n')
+            self.context.append(' } \\\\\n')
+        else:
+            self.context.append(' \\\\\n')
+        self.context.append(self.docinfo)
+        self.context.append(len(self.body))
+
+    def depart_docinfo_item(self, node):
+        size = self.context.pop()
+        dest = self.context.pop()
+        tail = self.context.pop()
+        tail = self.body[size:] + [tail]
+        del self.body[size:]
+        dest.extend(tail)
+        # for address we did set insert_newline
+        self.insert_newline = 0
+
+    def visit_doctest_block(self, node):
+        self.body.append( '\\begin{verbatim}' )
+        self.verbatim = 1
+
+    def depart_doctest_block(self, node):
+        self.body.append( '\\end{verbatim}\n' )
+        self.verbatim = 0
+
+    def visit_document(self, node):
+        self.body_prefix.append('\\begin{document}\n')
+        # titled document?
+        if self.use_latex_docinfo or len(node) and isinstance(node[0], nodes.title):
+            self.body_prefix.append('\\maketitle\n')
+            # alternative use titlepage environment.
+            # \begin{titlepage}
+            # ...
+        self.body.append('\n\\setlength{\\locallinewidth}{\\linewidth}\n')
+
+    def depart_document(self, node):
+        # TODO insertion point of bibliography should none automatic.
+        if self._use_latex_citations and len(self._bibitems)>0:
+            if not self.bibtex:
+                widest_label = ""
+                for bi in self._bibitems:
+                    if len(widest_label)<len(bi[0]):
+                        widest_label = bi[0]
+                self.body.append('\n\\begin{thebibliography}{%s}\n'%widest_label)
+                for bi in self._bibitems:
+                    # cite_key: underscores must not be escaped
+                    cite_key = bi[0].replace(r"{\_}","_")
+                    self.body.append('\\bibitem[%s]{%s}{%s}\n' % (bi[0], cite_key, bi[1]))
+                self.body.append('\\end{thebibliography}\n')
+            else:
+                self.body.append('\n\\bibliographystyle{%s}\n' % self.bibtex[0])
+                self.body.append('\\bibliography{%s}\n' % self.bibtex[1])
+
+        self.body_suffix.append('\\end{document}\n')
+
+    def visit_emphasis(self, node):
+        self.body.append('\\emph{')
+        self.literal_block_stack.append('\\emph{')
+
+    def depart_emphasis(self, node):
+        self.body.append('}')
+        self.literal_block_stack.pop()
+
+    def visit_entry(self, node):
+        self.active_table.visit_entry()
+        # cell separation
+        if self.active_table.get_entry_number() == 1:
+            # if the firstrow is a multirow, this actually is the second row.
+            # this gets hairy if rowspans follow each other.
+            if self.active_table.get_rowspan(0):
+                count = 0
+                while self.active_table.get_rowspan(count):
+                    count += 1
+                    self.body.append(' & ')
+                self.active_table.visit_entry() # increment cell count
+        else:
+            self.body.append(' & ')
+
+        # multi{row,column}
+        # IN WORK BUG TODO HACK continues here
+        # multirow in LaTeX simply will enlarge the cell over several rows
+        # (the following n if n is positive, the former if negative).
+        if node.has_key('morerows') and node.has_key('morecols'):
+            raise NotImplementedError('Cells that '
+            'span multiple rows *and* columns are not supported, sorry.')
+        if node.has_key('morerows'):
+            count = node['morerows'] + 1
+            self.active_table.set_rowspan(self.active_table.get_entry_number()-1,count)
+            self.body.append('\\multirow{%d}{%s}{' % \
+                    (count,self.active_table.get_column_width()))
+            self.context.append('}')
+            # BUG following rows must have empty cells.
+        elif node.has_key('morecols'):
+            # the vertical bar before column is missing if it is the first column.
+            # the one after always.
+            if self.active_table.get_entry_number() == 1:
+                bar1 = self.active_table.get_vertical_bar()
+            else:
+                bar1 = ''
+            count = node['morecols'] + 1
+            self.body.append('\\multicolumn{%d}{%sl%s}{' % \
+                    (count, bar1, self.active_table.get_vertical_bar()))
+            self.context.append('}')
+        else:
+            self.context.append('')
+
+        # header / not header
+        if isinstance(node.parent.parent, nodes.thead):
+            self.body.append('\\textbf{')
+            self.context.append('}')
+        elif self.active_table.is_stub_column():
+            self.body.append('\\textbf{')
+            self.context.append('}')
+        else:
+            self.context.append('')
+
+    def depart_entry(self, node):
+        self.body.append(self.context.pop()) # header / not header
+        self.body.append(self.context.pop()) # multirow/column
+        # if following row is spanned from above.
+        if self.active_table.get_rowspan(self.active_table.get_entry_number()):
+           self.body.append(' & ')
+           self.active_table.visit_entry() # increment cell count
+
+    def visit_row(self, node):
+        self.active_table.visit_row()
+
+    def depart_row(self, node):
+        self.body.extend(self.active_table.depart_row())
+
+    def visit_enumerated_list(self, node):
+        # We create our own enumeration list environment.
+        # This allows to set the style and starting value
+        # and unlimited nesting.
+        enum_style = {'arabic':'arabic',
+                'loweralpha':'alph',
+                'upperalpha':'Alph',
+                'lowerroman':'roman',
+                'upperroman':'Roman' }
+        enum_suffix = ""
+        if node.has_key('suffix'):
+            enum_suffix = node['suffix']
+        enum_prefix = ""
+        if node.has_key('prefix'):
+            enum_prefix = node['prefix']
+        if self.compound_enumerators:
+            pref = ""
+            if self.section_prefix_for_enumerators and self.section_level:
+                for i in range(self.section_level):
+                    pref += '%d.' % self._section_number[i]
+                pref = pref[:-1] + self.section_enumerator_separator
+                enum_prefix += pref
+            for ctype, cname in self._enumeration_counters:
+                enum_prefix += '\\%s{%s}.' % (ctype, cname)
+        enum_type = "arabic"
+        if node.has_key('enumtype'):
+            enum_type = node['enumtype']
+        if enum_style.has_key(enum_type):
+            enum_type = enum_style[enum_type]
+
+        counter_name = "listcnt%d" % len(self._enumeration_counters)
+        self._enumeration_counters.append((enum_type, counter_name))
+        # If we haven't used this counter name before, then create a
+        # new counter; otherwise, reset & reuse the old counter.
+        if len(self._enumeration_counters) > self._max_enumeration_counters:
+            self._max_enumeration_counters = len(self._enumeration_counters)
+            self.body.append('\\newcounter{%s}\n' % counter_name)
+        else:
+            self.body.append('\\setcounter{%s}{0}\n' % counter_name)
+            
+        self.body.append('\\begin{list}{%s\\%s{%s}%s}\n' % \
+            (enum_prefix,enum_type,counter_name,enum_suffix))
+        self.body.append('{\n')
+        self.body.append('\\usecounter{%s}\n' % counter_name)
+        # set start after usecounter, because it initializes to zero.
+        if node.has_key('start'):
+            self.body.append('\\addtocounter{%s}{%d}\n' \
+                    % (counter_name,node['start']-1))
+        ## set rightmargin equal to leftmargin
+        self.body.append('\\setlength{\\rightmargin}{\\leftmargin}\n')
+        self.body.append('}\n')
+
+    def depart_enumerated_list(self, node):
+        self.body.append('\\end{list}\n')
+        self._enumeration_counters.pop()
+
+    def visit_error(self, node):
+        self.visit_admonition(node, 'error')
+
+    def depart_error(self, node):
+        self.depart_admonition()
+
+    def visit_field(self, node):
+        # real output is done in siblings: _argument, _body, _name
+        pass
+
+    def depart_field(self, node):
+        self.body.append('\n')
+        ##self.body.append('%[depart_field]\n')
+
+    def visit_field_argument(self, node):
+        self.body.append('%[visit_field_argument]\n')
+
+    def depart_field_argument(self, node):
+        self.body.append('%[depart_field_argument]\n')
+
+    def visit_field_body(self, node):
+        # BUG by attach as text we loose references.
+        if self.docinfo:
+            self.docinfo.append('%s \\\\\n' % self.encode(node.astext()))
+            raise nodes.SkipNode
+        # BUG: what happens if not docinfo
+
+    def depart_field_body(self, node):
+        self.body.append( '\n' )
+
+    def visit_field_list(self, node):
+        if not self.docinfo:
+            self.body.append('\\begin{quote}\n')
+            self.body.append('\\begin{description}\n')
+
+    def depart_field_list(self, node):
+        if not self.docinfo:
+            self.body.append('\\end{description}\n')
+            self.body.append('\\end{quote}\n')
+
+    def visit_field_name(self, node):
+        # BUG this duplicates docinfo_item
+        if self.docinfo:
+            self.docinfo.append('\\textbf{%s}: &\n\t' % self.encode(node.astext()))
+            raise nodes.SkipNode
+        else:
+            self.body.append('\\item [')
+
+    def depart_field_name(self, node):
+        if not self.docinfo:
+            self.body.append(':]')
+
+    def visit_figure(self, node):
+        if (not node.attributes.has_key('align') or
+            node.attributes['align'] == 'center'):
+            # centering does not add vertical space like center.
+            align = '\n\\centering'
+            align_end = ''
+        else:
+            # TODO non vertical space for other alignments.
+            align = '\\begin{flush%s}' % node.attributes['align']
+            align_end = '\\end{flush%s}' % node.attributes['align']
+        self.body.append( '\\begin{figure}[htbp]%s\n' % align )
+        self.context.append( '%s\\end{figure}\n' % align_end )
+
+    def depart_figure(self, node):
+        self.body.append( self.context.pop() )
+
+    def visit_footer(self, node):
+        self.context.append(len(self.body))
+
+    def depart_footer(self, node):
+        start = self.context.pop()
+        footer = (['\n\\begin{center}\small\n']
+                  + self.body[start:] + ['\n\\end{center}\n'])
+        self.body_suffix[:0] = footer
+        del self.body[start:]
+
+    def visit_footnote(self, node):
+        if self.use_latex_footnotes:
+            num,text = node.astext().split(None,1)
+            num = self.encode(num.strip())
+            self.body.append('\\footnotetext['+num+']')
+            self.body.append('{')
+        else:
+            self.body.append('\\begin{figure}[b]')
+            for id in node['ids']:
+                self.body.append('\\hypertarget{%s}' % id)
+
+    def depart_footnote(self, node):
+        if self.use_latex_footnotes:
+            self.body.append('}\n')
+        else:
+            self.body.append('\\end{figure}\n')
+
+    def visit_footnote_reference(self, node):
+        if self.use_latex_footnotes:
+            self.body.append("\\footnotemark["+self.encode(node.astext())+"]")
+            raise nodes.SkipNode
+        href = ''
+        if node.has_key('refid'):
+            href = node['refid']
+        elif node.has_key('refname'):
+            href = self.document.nameids[node['refname']]
+        format = self.settings.footnote_references
+        if format == 'brackets':
+            suffix = '['
+            self.context.append(']')
+        elif format == 'superscript':
+            suffix = '\\raisebox{.5em}[0em]{\\scriptsize'
+            self.context.append('}')
+        else:                           # shouldn't happen
+            raise AssertionError('Illegal footnote reference format.')
+        self.body.append('%s\\hyperlink{%s}{' % (suffix,href))
+
+    def depart_footnote_reference(self, node):
+        if self.use_latex_footnotes:
+            return
+        self.body.append('}%s' % self.context.pop())
+
+    # footnote/citation label
+    def label_delim(self, node, bracket, superscript):
+        if isinstance(node.parent, nodes.footnote):
+            if self.use_latex_footnotes:
+                raise nodes.SkipNode
+            if self.settings.footnote_references == 'brackets':
+                self.body.append(bracket)
+            else:
+                self.body.append(superscript)
+        else:
+            assert isinstance(node.parent, nodes.citation)
+            if not self._use_latex_citations:
+                self.body.append(bracket)
+
+    def visit_label(self, node):
+        self.label_delim(node, '[', '$^{')
+
+    def depart_label(self, node):
+        self.label_delim(node, ']', '}$')
+
+    # elements generated by the framework e.g. section numbers.
+    def visit_generated(self, node):
+        pass
+
+    def depart_generated(self, node):
+        pass
+
+    def visit_header(self, node):
+        self.context.append(len(self.body))
+
+    def depart_header(self, node):
+        start = self.context.pop()
+        self.body_prefix.append('\n\\verb|begin_header|\n')
+        self.body_prefix.extend(self.body[start:])
+        self.body_prefix.append('\n\\verb|end_header|\n')
+        del self.body[start:]
+
+    def visit_hint(self, node):
+        self.visit_admonition(node, 'hint')
+
+    def depart_hint(self, node):
+        self.depart_admonition()
+
+    def latex_image_length(self, width_str):
+        match = re.match('(\d*\.?\d*)\s*(\S*)', width_str)
+        if not match:
+            # fallback
+            return width_str
+        res = width_str
+        amount, unit = match.groups()[:2]
+        if unit == "px":
+            # LaTeX does not know pixels but points
+            res = "%spt" % amount
+        elif unit == "%":
+            res = "%.3f\\linewidth" % (float(amount)/100.0)
+        return res
+
+    def visit_image(self, node):
+        attrs = node.attributes
+        # Add image URI to dependency list, assuming that it's
+        # referring to a local file.
+        self.settings.record_dependencies.add(attrs['uri'])
+        pre = []                        # in reverse order
+        post = []
+        include_graphics_options = []
+        inline = isinstance(node.parent, nodes.TextElement)
+        if attrs.has_key('scale'):
+            # Could also be done with ``scale`` option to
+            # ``\includegraphics``; doing it this way for consistency.
+            pre.append('\\scalebox{%f}{' % (attrs['scale'] / 100.0,))
+            post.append('}')
+        if attrs.has_key('width'):
+            include_graphics_options.append('width=%s' % (
+                            self.latex_image_length(attrs['width']), ))
+        if attrs.has_key('height'):
+            include_graphics_options.append('height=%s' % (
+                            self.latex_image_length(attrs['height']), ))
+        if attrs.has_key('align'):
+            align_prepost = {
+                # By default latex aligns the top of an image.
+                (1, 'top'): ('', ''),
+                (1, 'middle'): ('\\raisebox{-0.5\\height}{', '}'),
+                (1, 'bottom'): ('\\raisebox{-\\height}{', '}'),
+                (0, 'center'): ('{\\hfill', '\\hfill}'),
+                # These 2 don't exactly do the right thing.  The image should
+                # be floated alongside the paragraph.  See
+                # http://www.w3.org/TR/html4/struct/objects.html#adef-align-IMG
+                (0, 'left'): ('{', '\\hfill}'),
+                (0, 'right'): ('{\\hfill', '}'),}
+            try:
+                pre.append(align_prepost[inline, attrs['align']][0])
+                post.append(align_prepost[inline, attrs['align']][1])
+            except KeyError:
+                pass                    # XXX complain here?
+        if not inline:
+            pre.append('\n')
+            post.append('\n')
+        pre.reverse()
+        self.body.extend( pre )
+        options = ''
+        if len(include_graphics_options)>0:
+            options = '[%s]' % (','.join(include_graphics_options))
+        self.body.append( '\\includegraphics%s{%s}' % (
+                            options, attrs['uri'] ) )
+        self.body.extend( post )
+
+    def depart_image(self, node):
+        pass
+
+    def visit_important(self, node):
+        self.visit_admonition(node, 'important')
+
+    def depart_important(self, node):
+        self.depart_admonition()
+
+    def visit_interpreted(self, node):
+        # @@@ Incomplete, pending a proper implementation on the
+        # Parser/Reader end.
+        self.visit_literal(node)
+
+    def depart_interpreted(self, node):
+        self.depart_literal(node)
+
+    def visit_legend(self, node):
+        self.body.append('{\\small ')
+
+    def depart_legend(self, node):
+        self.body.append('}')
+
+    def visit_line(self, node):
+        self.body.append('\item[] ')
+
+    def depart_line(self, node):
+        self.body.append('\n')
+
+    def visit_line_block(self, node):
+        if isinstance(node.parent, nodes.line_block):
+            self.body.append('\\item[] \n'
+                             '\\begin{lineblock}{\\lineblockindentation}\n')
+        else:
+            self.body.append('\n\\begin{lineblock}{0em}\n')
+
+    def depart_line_block(self, node):
+        self.body.append('\\end{lineblock}\n')
+
+    def visit_list_item(self, node):
+        # Append "{}" in case the next character is "[", which would break
+        # LaTeX's list environment (no numbering and the "[" is not printed).
+        self.body.append('\\item {} ')
+
+    def depart_list_item(self, node):
+        self.body.append('\n')
+
+    def visit_literal(self, node):
+        self.literal = 1
+        self.body.append('\\texttt{')
+
+    def depart_literal(self, node):
+        self.body.append('}')
+        self.literal = 0
+
+    def visit_literal_block(self, node):
+        """
+        Render a literal-block.
+
+        Literal blocks are used for "::"-prefixed literal-indented
+        blocks of text, where the inline markup is not recognized,
+        but are also the product of the parsed-literal directive,
+        where the markup is respected.
+        """
+        # In both cases, we want to use a typewriter/monospaced typeface.
+        # For "real" literal-blocks, we can use \verbatim, while for all
+        # the others we must use \mbox.
+        #
+        # We can distinguish between the two kinds by the number of
+        # siblings that compose this node: if it is composed by a
+        # single element, it's surely either a real one or a
+        # parsed-literal that does not contain any markup.
+        #
+        if not self.active_table.is_open():
+            # no quote inside tables, to avoid vertical space between
+            # table border and literal block.
+            # BUG: fails if normal text preceeds the literal block.
+            self.body.append('\\begin{quote}')
+            self.context.append('\\end{quote}\n')
+        else:
+            self.body.append('\n')
+            self.context.append('\n')
+        if (self.settings.use_verbatim_when_possible and (len(node) == 1)
+              # in case of a parsed-literal containing just a "**bold**" word:
+              and isinstance(node[0], nodes.Text)):
+            self.verbatim = 1
+            self.body.append('\\begin{verbatim}\n')
+        else:
+            self.literal_block = 1
+            self.insert_none_breaking_blanks = 1
+            self.body.append('{\\ttfamily \\raggedright \\noindent\n')
+            # * obey..: is from julien and never worked for me (grubert).
+            #   self.body.append('{\\obeylines\\obeyspaces\\ttfamily\n')
+
+    def depart_literal_block(self, node):
+        if self.verbatim:
+            self.body.append('\n\\end{verbatim}\n')
+            self.verbatim = 0
+        else:
+            self.body.append('\n}')
+            self.insert_none_breaking_blanks = 0
+            self.literal_block = 0
+            # obey end: self.body.append('}\n')
+        self.body.append(self.context.pop())
+
+    def visit_meta(self, node):
+        self.body.append('[visit_meta]\n')
+        # BUG maybe set keywords for pdf
+        ##self.head.append(self.starttag(node, 'meta', **node.attributes))
+
+    def depart_meta(self, node):
+        self.body.append('[depart_meta]\n')
+
+    def visit_note(self, node):
+        self.visit_admonition(node, 'note')
+
+    def depart_note(self, node):
+        self.depart_admonition()
+
+    def visit_option(self, node):
+        if self.context[-1]:
+            # this is not the first option
+            self.body.append(', ')
+
+    def depart_option(self, node):
+        # flag tha the first option is done.
+        self.context[-1] += 1
+
+    def visit_option_argument(self, node):
+        """The delimiter betweeen an option and its argument."""
+        self.body.append(node.get('delimiter', ' '))
+
+    def depart_option_argument(self, node):
+        pass
+
+    def visit_option_group(self, node):
+        self.body.append('\\item [')
+        # flag for first option
+        self.context.append(0)
+
+    def depart_option_group(self, node):
+        self.context.pop() # the flag
+        self.body.append('] ')
+
+    def visit_option_list(self, node):
+        self.body.append('\\begin{optionlist}{3cm}\n')
+
+    def depart_option_list(self, node):
+        self.body.append('\\end{optionlist}\n')
+
+    def visit_option_list_item(self, node):
+        pass
+
+    def depart_option_list_item(self, node):
+        pass
+
+    def visit_option_string(self, node):
+        ##self.body.append(self.starttag(node, 'span', '', CLASS='option'))
+        pass
+
+    def depart_option_string(self, node):
+        ##self.body.append('</span>')
+        pass
+
+    def visit_organization(self, node):
+        self.visit_docinfo_item(node, 'organization')
+
+    def depart_organization(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_paragraph(self, node):
+        index = node.parent.index(node)
+        if not ('contents' in self.topic_classes or
+                (isinstance(node.parent, nodes.compound) and
+                 index > 0 and
+                 not isinstance(node.parent[index - 1], nodes.paragraph) and
+                 not isinstance(node.parent[index - 1], nodes.compound))):
+            self.body.append('\n')
+
+    def depart_paragraph(self, node):
+        self.body.append('\n')
+
+    def visit_problematic(self, node):
+        self.body.append('{\\color{red}\\bfseries{}')
+
+    def depart_problematic(self, node):
+        self.body.append('}')
+
+    def visit_raw(self, node):
+        if 'latex' in node.get('format', '').split():
+            self.body.append(node.astext())
+        raise nodes.SkipNode
+
+    def visit_reference(self, node):
+        # BUG: hash_char "#" is trouble some in LaTeX.
+        # mbox and other environment do not like the '#'.
+        hash_char = '\\#'
+        if node.has_key('refuri'):
+            href = node['refuri'].replace('#',hash_char)
+        elif node.has_key('refid'):
+            href = hash_char + node['refid']
+        elif node.has_key('refname'):
+            href = hash_char + self.document.nameids[node['refname']]
+        else:
+            raise AssertionError('Unknown reference.')
+        self.body.append('\\href{%s}{' % href)
+        if self._reference_label and not node.has_key('refuri'):
+            self.body.append('\\%s{%s}}' % (self._reference_label,
+                        href.replace(hash_char, '')))
+            raise nodes.SkipNode
+
+    def depart_reference(self, node):
+        self.body.append('}')
+
+    def visit_revision(self, node):
+        self.visit_docinfo_item(node, 'revision')
+
+    def depart_revision(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_section(self, node):
+        self.section_level += 1
+        # Initialize counter for potential subsections:
+        self._section_number.append(0)
+        # Counter for this section's level (initialized by parent section):
+        self._section_number[self.section_level - 1] += 1
+
+    def depart_section(self, node):
+        # Remove counter for potential subsections:
+        self._section_number.pop()
+        self.section_level -= 1
+
+    def visit_sidebar(self, node):
+        # BUG:  this is just a hack to make sidebars render something
+        self.body.append('\n\\setlength{\\locallinewidth}{0.9\\admonitionwidth}\n')
+        self.body.append('\\begin{center}\\begin{sffamily}\n')
+        self.body.append('\\fbox{\\colorbox[gray]{0.80}{\\parbox{\\admonitionwidth}{\n')
+
+    def depart_sidebar(self, node):
+        self.body.append('}}}\n') # end parbox colorbox fbox
+        self.body.append('\\end{sffamily}\n\\end{center}\n');
+        self.body.append('\n\\setlength{\\locallinewidth}{\\linewidth}\n')
+
+
+    attribution_formats = {'dash': ('---', ''),
+                           'parentheses': ('(', ')'),
+                           'parens': ('(', ')'),
+                           'none': ('', '')}
+
+    def visit_attribution(self, node):
+        prefix, suffix = self.attribution_formats[self.settings.attribution]
+        self.body.append('\n\\begin{flushright}\n')
+        self.body.append(prefix)
+        self.context.append(suffix)
+
+    def depart_attribution(self, node):
+        self.body.append(self.context.pop() + '\n')
+        self.body.append('\\end{flushright}\n')
+
+    def visit_status(self, node):
+        self.visit_docinfo_item(node, 'status')
+
+    def depart_status(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_strong(self, node):
+        self.body.append('\\textbf{')
+        self.literal_block_stack.append('\\textbf{')
+
+    def depart_strong(self, node):
+        self.body.append('}')
+        self.literal_block_stack.pop()
+
+    def visit_substitution_definition(self, node):
+        raise nodes.SkipNode
+
+    def visit_substitution_reference(self, node):
+        self.unimplemented_visit(node)
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.sidebar):
+            self.body.append('~\\\\\n\\textbf{')
+            self.context.append('}\n\\smallskip\n')
+        elif isinstance(node.parent, nodes.document):
+            self.title = self.title + \
+                '\\\\\n\\large{%s}\n' % self.encode(node.astext())
+            raise nodes.SkipNode
+        elif isinstance(node.parent, nodes.section):
+            self.body.append('\\textbf{')
+            self.context.append('}\\vspace{0.2cm}\n\n\\noindent ')
+
+    def depart_subtitle(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_system_message(self, node):
+        pass
+
+    def depart_system_message(self, node):
+        self.body.append('\n')
+
+    def visit_table(self, node):
+        if self.active_table.is_open():
+            self.table_stack.append(self.active_table)
+            # nesting longtable does not work (e.g. 2007-04-18)
+            self.active_table = Table('tabular',self.settings.table_style)
+        self.active_table.open()
+        for cl in node['classes']:
+            self.active_table.set_table_style(cl)
+        self.body.append('\n' + self.active_table.get_opening())
+
+    def depart_table(self, node):
+        self.body.append(self.active_table.get_closing() + '\n')
+        self.active_table.close()
+        if len(self.table_stack)>0:
+            self.active_table = self.table_stack.pop()
+        else:
+            self.active_table.set_table_style(self.settings.table_style)
+
+    def visit_target(self, node):
+        # BUG: why not (refuri or refid or refname) means not footnote ?
+        if not (node.has_key('refuri') or node.has_key('refid')
+                or node.has_key('refname')):
+            for id in node['ids']:
+                self.body.append('\\hypertarget{%s}{' % id)
+            self.context.append('}' * len(node['ids']))
+        elif node.get("refid"):
+            self.body.append('\\hypertarget{%s}{' % node.get("refid"))
+            self.context.append('}')
+        else:
+            self.context.append('')
+
+    def depart_target(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_tbody(self, node):
+        # BUG write preamble if not yet done (colspecs not [])
+        # for tables without heads.
+        if not self.active_table.get('preamble written'):
+            self.visit_thead(None)
+            # self.depart_thead(None)
+
+    def depart_tbody(self, node):
+        pass
+
+    def visit_term(self, node):
+        self.body.append('\\item[{')
+
+    def depart_term(self, node):
+        # definition list term.
+        # \leavevmode results in a line break if the term is followed by a item list.
+        self.body.append('}] \leavevmode ')
+
+    def visit_tgroup(self, node):
+        #self.body.append(self.starttag(node, 'colgroup'))
+        #self.context.append('</colgroup>\n')
+        pass
+
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_thead(self, node):
+        self.body.append('{%s}\n' % self.active_table.get_colspecs())
+        if self.active_table.caption:
+            self.body.append('\\caption{%s}\\\\\n' % self.active_table.caption)
+        self.active_table.set('preamble written',1)
+        # TODO longtable supports firsthead and lastfoot too.
+        self.body.extend(self.active_table.visit_thead())
+
+    def depart_thead(self, node):
+        # the table header written should be on every page
+        # => \endhead
+        self.body.extend(self.active_table.depart_thead())
+        # and the firsthead => \endfirsthead
+        # BUG i want a "continued from previous page" on every not
+        # firsthead, but then we need the header twice.
+        #
+        # there is a \endfoot and \endlastfoot too.
+        # but we need the number of columns to
+        # self.body.append('\\multicolumn{%d}{c}{"..."}\n' % number_of_columns)
+        # self.body.append('\\hline\n\\endfoot\n')
+        # self.body.append('\\hline\n')
+        # self.body.append('\\endlastfoot\n')
+
+    def visit_tip(self, node):
+        self.visit_admonition(node, 'tip')
+
+    def depart_tip(self, node):
+        self.depart_admonition()
+
+    def bookmark(self, node):
+        """Append latex href and pdfbookmarks for titles.
+        """
+        if node.parent['ids']:
+            for id in node.parent['ids']:
+                self.body.append('\\hypertarget{%s}{}\n' % id)
+            if not self.use_latex_toc:
+                # BUG level depends on style. pdflatex allows level 0 to 3
+                # ToC would be the only on level 0 so i choose to decrement the rest.
+                # "Table of contents" bookmark to see the ToC. To avoid this
+                # we set all zeroes to one.
+                l = self.section_level
+                if l>0:
+                    l = l-1
+                # pdftex does not like "_" subscripts in titles
+                text = self.encode(node.astext())
+                for id in node.parent['ids']:
+                    self.body.append('\\pdfbookmark[%d]{%s}{%s}\n' % \
+                                     (l, text, id))
+
+    def visit_title(self, node):
+        """Section and other titles."""
+
+        if isinstance(node.parent, nodes.topic):
+            # the table of contents.
+            self.bookmark(node)
+            if ('contents' in self.topic_classes
+            and self.use_latex_toc):
+                self.body.append('\\renewcommand{\\contentsname}{')
+                self.context.append('}\n\\tableofcontents\n\n\\bigskip\n')
+            elif ('abstract' in self.topic_classes
+            and self.settings.use_latex_abstract):
+                raise nodes.SkipNode
+            else: # or section titles before the table of contents.
+                # BUG: latex chokes on center environment with 
+                # "perhaps a missing item", therefore we use hfill.
+                self.body.append('\\subsubsection*{~\\hfill ')
+                # the closing brace for subsection.
+                self.context.append('\\hfill ~}\n')
+        # TODO: for admonition titles before the first section
+        # either specify every possible node or ... ?
+        elif isinstance(node.parent, nodes.sidebar) \
+        or isinstance(node.parent, nodes.admonition):
+            self.body.append('\\textbf{\\large ')
+            self.context.append('}\n\\smallskip\n')
+        elif isinstance(node.parent, nodes.table):
+            # caption must be written after column spec
+            self.active_table.caption = self.encode(node.astext())
+            raise nodes.SkipNode
+        elif self.section_level == 0:
+            # document title
+            self.title = self.encode(node.astext())
+            if not self.pdfinfo == None:
+                self.pdfinfo.append( 'pdftitle={%s}' % self.encode(node.astext()) )
+            raise nodes.SkipNode
+        else:
+            self.body.append('\n\n')
+            self.body.append('%' + '_' * 75)
+            self.body.append('\n\n')
+            self.bookmark(node)
+
+            if self.use_latex_toc:
+                section_star = ""
+            else:
+                section_star = "*"
+
+            section_name = self.d_class.section(self.section_level)
+            self.body.append('\\%s%s{' % (section_name, section_star))
+            # MAYBE postfix paragraph and subparagraph with \leavemode to
+            # ensure floatables stay in the section and text starts on a new line.
+            self.context.append('}\n')
+
+    def depart_title(self, node):
+        self.body.append(self.context.pop())
+        for id in node.parent['ids']:
+            self.body.append('\\label{%s}\n' % id)
+
+    def visit_topic(self, node):
+        self.topic_classes = node['classes']
+        if ('abstract' in self.topic_classes
+            and self.settings.use_latex_abstract):
+            self.body.append('\\begin{abstract}\n')
+
+    def depart_topic(self, node):
+        if ('abstract' in self.topic_classes
+            and self.settings.use_latex_abstract):
+            self.body.append('\\end{abstract}\n')
+        self.topic_classes = []
+        if 'contents' in node['classes'] and self.use_latex_toc:
+            pass
+        else:
+            self.body.append('\n')
+
+    def visit_inline(self, node): # titlereference
+        classes = node.get('classes', ['Unknown', ])
+        for cls in classes:
+            self.body.append( '\\docutilsrole%s{' % cls)
+        self.context.append('}'*len(classes))
+
+    def depart_inline(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_rubric(self, node):
+        self.body.append('\\rubric{')
+        self.context.append('}\n')
+
+    def depart_rubric(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_transition(self, node):
+        self.body.append('\n\n')
+        self.body.append('%' + '_' * 75)
+        self.body.append('\n\\hspace*{\\fill}\\hrulefill\\hspace*{\\fill}')
+        self.body.append('\n\n')
+
+    def depart_transition(self, node):
+        pass
+
+    def visit_version(self, node):
+        self.visit_docinfo_item(node, 'version')
+
+    def depart_version(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_warning(self, node):
+        self.visit_admonition(node, 'warning')
+
+    def depart_warning(self, node):
+        self.depart_admonition()
+
+    def unimplemented_visit(self, node):
+        raise NotImplementedError('visiting unimplemented node type: %s'
+                                  % node.__class__.__name__)
+
+#    def unknown_visit(self, node):
+#    def default_visit(self, node):
+
+# vim: set ts=4 et ai :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/latex2e/latex2e.tex	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,74 @@
+% latex include file for docutils latex writer
+% --------------------------------------------
+%
+% CVS: $Id: latex2e.tex 4163 2005-12-09 04:21:34Z goodger $
+%
+% This is included at the end of the latex header in the generated file,
+% to allow overwriting defaults, although this could get hairy.
+% Generated files should process well standalone too, LaTeX might give a
+% message about a missing file.
+
+% donot indent first line of paragraph.
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{5pt plus 2pt minus 1pt}
+
+% sloppy
+% ------
+% Less strict (opposite to default fussy) space size between words. Therefore
+% less hyphenation.
+\sloppy
+
+% fonts
+% -----
+% times for pdf generation, gives smaller pdf files.
+%
+% But in standard postscript fonts: courier and times/helvetica do not fit.
+% Maybe use pslatex.
+\usepackage{times}
+
+% pagestyle
+% ---------
+% headings might put section titles in the page heading, but not if
+% the table of contents is done by docutils.
+% If pagestyle{headings} is used, \geometry{headheight=10pt,headsep=1pt}
+% should be set too.
+%\pagestyle{plain}
+%
+% or use fancyhdr (untested !)
+%\usepackage{fancyhdr}
+%\pagestyle{fancy}
+%\addtolength{\headheight}{\\baselineskip}
+%\renewcommand{\sectionmark}[1]{\markboth{#1}{}}
+%\renewcommand{\subsectionmark}[1]{\markright{#1}}
+%\fancyhf{}
+%\fancyhead[LE,RO]{\\bfseries\\textsf{\Large\\thepage}}
+%\fancyhead[LO]{\\textsf{\\footnotesize\\rightmark}}
+%\fancyhead[RE]{\\textsc{\\textsf{\\footnotesize\leftmark}}}
+%\\fancyfoot[LE,RO]{\\bfseries\\textsf{\scriptsize Docutils}}
+%\fancyfoot[RE,LO]{\\textsf{\scriptsize\\today}}
+
+% geometry 
+% --------
+% = papersizes and margins
+%\geometry{a4paper,twoside,tmargin=1.5cm,
+%          headheight=1cm,headsep=0.75cm}
+
+% Do section number display
+% -------------------------
+%\makeatletter
+%\def\@seccntformat#1{}
+%\makeatother
+% no numbers in toc
+%\renewcommand{\numberline}[1]{}
+
+
+% change maketitle
+% ----------------
+%\renewcommand{\maketitle}{
+%  \begin{titlepage}
+%    \begin{center}
+%    \textsf{TITLE \@title} \\
+%       Date: \today
+%    \end{center}
+%  \end{titlepage}
+%}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,825 @@
+# $Id: __init__.py 5174 2007-05-31 00:01:52Z wiemann $
+# Author: Lea Wiemann <LeWiemann@gmail.com>
+# Copyright: This module has been placed in the public domain.
+
+"""
+LaTeX2e document tree Writer.
+"""
+
+# Thanks to Engelbert Gruber and various contributors for the original
+# LaTeX writer, some code and many ideas of which have been used for
+# this writer.
+
+__docformat__ = 'reStructuredText'
+
+
+import re
+import os.path
+from types import ListType
+
+import docutils
+from docutils import nodes, writers, utils
+from docutils.writers.newlatex2e import unicode_map
+from docutils.transforms import writer_aux
+
+
+class Writer(writers.Writer):
+
+    supported = ('newlatex', 'newlatex2e')
+    """Formats this writer supports."""
+
+    default_stylesheet = 'base.tex'
+
+    default_stylesheet_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_stylesheet))
+
+    settings_spec = (
+        'LaTeX-Specific Options',
+        'Note that this LaTeX writer is still EXPERIMENTAL and not '
+        'feature-complete. ',
+        (('Specify a stylesheet file.  The path is used verbatim to include '
+          'the file.  Overrides --stylesheet-path.',
+          ['--stylesheet'],
+          {'default': '', 'metavar': '<file>',
+           'overrides': 'stylesheet_path'}),
+         ('Specify a stylesheet file, relative to the current working '
+          'directory.  Overrides --stylesheet.  Default: "%s"'
+          % default_stylesheet_path,
+          ['--stylesheet-path'],
+          {'metavar': '<file>', 'overrides': 'stylesheet',
+           'default': default_stylesheet_path}),
+         ('Specify a user stylesheet file.  See --stylesheet.',
+          ['--user-stylesheet'],
+          {'default': '', 'metavar': '<file>',
+           'overrides': 'user_stylesheet_path'}),
+         ('Specify a user stylesheet file.  See --stylesheet-path.',
+          ['--user-stylesheet-path'],
+          {'metavar': '<file>', 'overrides': 'user_stylesheet'})
+         ),)
+
+    settings_defaults = {
+        # Many Unicode characters are provided by unicode_map.py, so
+        # we can default to latin-1.
+        'output_encoding': 'latin-1',
+        'output_encoding_error_handler': 'strict',
+        # Since we are using superscript footnotes, it is necessary to
+        # trim whitespace in front of footnote references.
+        'trim_footnote_reference_space': 1,
+        # Currently unsupported:
+        'docinfo_xform': 0,
+        # During development:
+        'traceback': 1
+        }
+
+    relative_path_settings = ('stylesheet_path', 'user_stylesheet_path')
+
+    config_section = 'newlatex2e writer'
+    config_section_dependencies = ('writers',)
+
+    output = None
+    """Final translated form of `document`."""
+
+    def get_transforms(self):
+        return writers.Writer.get_transforms(self) + [
+            writer_aux.Compound, writer_aux.Admonitions]
+
+    def __init__(self):
+        writers.Writer.__init__(self)
+        self.translator_class = LaTeXTranslator
+
+    def translate(self):
+        visitor = self.translator_class(self.document)
+        self.document.walkabout(visitor)
+        assert not visitor.context, 'context not empty: %s' % visitor.context
+        self.output = visitor.astext()
+        self.head = visitor.header
+        self.body = visitor.body
+
+
+class LaTeXException(Exception):
+    """
+    Exception base class to for exceptions which influence the
+    automatic generation of LaTeX code.
+    """
+
+
+class SkipAttrParentLaTeX(LaTeXException):
+    """
+    Do not generate ``\DECattr`` and ``\renewcommand{\DEVparent}{...}`` for this
+    node.
+
+    To be raised from ``before_...`` methods.
+    """
+
+
+class SkipParentLaTeX(LaTeXException):
+    """
+    Do not generate ``\renewcommand{\DEVparent}{...}`` for this node.
+
+    To be raised from ``before_...`` methods.
+    """
+
+
+class LaTeXTranslator(nodes.SparseNodeVisitor):
+
+    # Country code by a.schlock.
+    # Partly manually converted from iso and babel stuff.
+    iso639_to_babel = {
+        'no': 'norsk',     # added by hand
+        'gd': 'scottish',  # added by hand
+        'sl': 'slovenian',
+        'af': 'afrikaans',
+        'bg': 'bulgarian',
+        'br': 'breton',
+        'ca': 'catalan',
+        'cs': 'czech',
+        'cy': 'welsh',
+        'da': 'danish',
+        'fr': 'french',
+        # french, francais, canadien, acadian
+        'de': 'ngerman',
+        # ngerman, naustrian, german, germanb, austrian
+        'el': 'greek',
+        'en': 'english',
+        # english, USenglish, american, UKenglish, british, canadian
+        'eo': 'esperanto',
+        'es': 'spanish',
+        'et': 'estonian',
+        'eu': 'basque',
+        'fi': 'finnish',
+        'ga': 'irish',
+        'gl': 'galician',
+        'he': 'hebrew',
+        'hr': 'croatian',
+        'hu': 'hungarian',
+        'is': 'icelandic',
+        'it': 'italian',
+        'la': 'latin',
+        'nl': 'dutch',
+        'pl': 'polish',
+        'pt': 'portuguese',
+        'ro': 'romanian',
+        'ru': 'russian',
+        'sk': 'slovak',
+        'sr': 'serbian',
+        'sv': 'swedish',
+        'tr': 'turkish',
+        'uk': 'ukrainian'
+    }
+
+    # Start with left double quote.
+    left_quote = 1
+
+    def __init__(self, document):
+        nodes.NodeVisitor.__init__(self, document)
+        self.settings = document.settings
+        self.header = []
+        self.body = []
+        self.context = []
+        self.stylesheet_path = utils.get_stylesheet_reference(
+            self.settings, os.path.join(os.getcwd(), 'dummy'))
+        if self.stylesheet_path:
+            self.settings.record_dependencies.add(self.stylesheet_path)
+        # This ugly hack will be cleaned up when refactoring the
+        # stylesheet mess.
+        self.settings.stylesheet = self.settings.user_stylesheet
+        self.settings.stylesheet_path = self.settings.user_stylesheet_path
+        self.user_stylesheet_path = utils.get_stylesheet_reference(
+            self.settings, os.path.join(os.getcwd(), 'dummy'))
+        if self.user_stylesheet_path:
+            self.settings.record_dependencies.add(self.user_stylesheet_path)
+        self.write_header()
+
+    def write_header(self):
+        a = self.header.append
+        a('%% Generated by Docutils %s <http://docutils.sourceforge.net>.'
+          % docutils.__version__)
+        a('')
+        a('% Docutils settings:')
+        lang = self.settings.language_code or ''
+        a(r'\providecommand{\DEVlanguageiso}{%s}' % lang)
+        a(r'\providecommand{\DEVlanguagebabel}{%s}' % self.iso639_to_babel.get(
+            lang, self.iso639_to_babel.get(lang.split('_')[0], '')))
+        a('')
+        if self.user_stylesheet_path:
+            a('% User stylesheet:')
+            a(r'\input{%s}' % self.user_stylesheet_path)
+        a('% Docutils stylesheet:')
+        a(r'\input{%s}' % self.stylesheet_path)
+        a('')
+        a('% Default definitions for Docutils nodes:')
+        for node_name in nodes.node_class_names:
+            a(r'\providecommand{\DN%s}[1]{#1}' % node_name.replace('_', ''))
+        a('')
+        a('% Auxiliary definitions:')
+        for attr in (r'\DEVparent \DEVattrlen \DEVtitleastext '
+                     r'\DEVsinglebackref \DEVmultiplebackrefs'
+                     ).split():
+            # Later set using \renewcommand.
+            a(r'\providecommand{%s}{DOCUTILSUNINITIALIZEDVARIABLE}' % attr)
+        for attr in (r'\DEVparagraphindented \DEVhassubtitle').split():
+            # Initialize as boolean variables.
+            a(r'\providecommand{%s}{false}' % attr)
+        a('\n\n')
+
+    unicode_map = unicode_map.unicode_map # comprehensive Unicode map
+    # Fix problems with unimap.py.
+    unicode_map.update({
+        # We have AE or T1 encoding, so "``" etc. work.  The macros
+        # from unimap.py may *not* work.
+        u'\u201C': '{``}',
+        u'\u201D': "{''}",
+        u'\u201E': '{,,}',
+        })
+
+    character_map = {
+        '\\': r'{\textbackslash}',
+        '{': r'{\{}',
+        '}': r'{\}}',
+        '$': r'{\$}',
+        '&': r'{\&}',
+        '%': r'{\%}',
+        '#': r'{\#}',
+        '[': r'{[}',
+        ']': r'{]}',
+        '-': r'{-}',
+        '`': r'{`}',
+        "'": r"{'}",
+        ',': r'{,}',
+        '"': r'{"}',
+        '|': r'{\textbar}',
+        '<': r'{\textless}',
+        '>': r'{\textgreater}',
+        '^': r'{\textasciicircum}',
+        '~': r'{\textasciitilde}',
+        '_': r'{\DECtextunderscore}',
+        }
+    character_map.update(unicode_map)
+    #character_map.update(special_map)
+    
+    # `att_map` is for encoding attributes.  According to
+    # <http://www-h.eng.cam.ac.uk/help/tpl/textprocessing/teTeX/latex/latex2e-html/ltx-164.html>,
+    # the following characters are special: # $ % & ~ _ ^ \ { }
+    # These work without special treatment in macro parameters:
+    # $, &, ~, _, ^
+    att_map = {'#': '\\#',
+               '%': '\\%',
+               # We cannot do anything about backslashes.
+               '\\': '',
+               '{': '\\{',
+               '}': '\\}',
+               # The quotation mark may be redefined by babel.
+               '"': '"{}',
+               }
+    att_map.update(unicode_map)
+
+    def encode(self, text, attval=None):
+        """
+        Encode special characters in ``text`` and return it.
+
+        If attval is true, preserve as much as possible verbatim (used
+        in attribute value encoding).  If attval is 'width' or
+        'height', `text` is interpreted as a length value.
+        """
+        if attval in ('width', 'height'):
+            match = re.match(r'([0-9.]+)(\S*)$', text)
+            assert match, '%s="%s" must be a length' % (attval, text)
+            value, unit = match.groups()
+            if unit == '%':
+                value = str(float(value) / 100)
+                unit = r'\DECrelativeunit'
+            elif unit in ('', 'px'):
+                # If \DECpixelunit is "pt", this gives the same notion
+                # of pixels as graphicx.  This is a bit of a hack.
+                value = str(float(value) * 0.75)
+                unit = '\DECpixelunit'
+            return '%s%s' % (value, unit)
+        if attval:
+            get = self.att_map.get
+        else:
+            get = self.character_map.get
+        text = ''.join([get(c, c) for c in text])
+        if (self.literal_block or self.inline_literal) and not attval:
+            # NB: We can have inline literals within literal blocks.
+            # Shrink '\r\n'.
+            text = text.replace('\r\n', '\n')
+            # Convert space.  If "{ }~~~~~" is wrapped (at the
+            # brace-enclosed space "{ }"), the following non-breaking
+            # spaces ("~~~~") do *not* wind up at the beginning of the
+            # next line.  Also note that no hyphenation is done if the
+            # breaking space ("{ }") comes *after* the non-breaking
+            # spaces.
+            if self.literal_block:
+                # Replace newlines with real newlines.
+                text = text.replace('\n', '\mbox{}\\\\{}')
+                replace_fn = self.encode_replace_for_literal_block_spaces
+            else:
+                replace_fn = self.encode_replace_for_inline_literal_spaces
+            text = re.sub(r'\s+', replace_fn, text)
+            # Protect hyphens; if we don't, line breaks will be
+            # possible at the hyphens and even the \textnhtt macro
+            # from the hyphenat package won't change that.
+            text = text.replace('-', r'\mbox{-}')
+            text = text.replace("'", r'{\DECtextliteralsinglequote}')
+            return text
+        else:
+            if not attval:
+                # Replace space with single protected space.
+                text = re.sub(r'\s+', '{ }', text)
+                # Replace double quotes with macro calls.
+                L = []
+                for part in text.split(self.character_map['"']):
+                    if L:
+                        # Insert quote.
+                        L.append(self.left_quote and r'{\DECtextleftdblquote}'
+                                 or r'{\DECtextrightdblquote}')
+                        self.left_quote = not self.left_quote
+                    L.append(part)
+                return ''.join(L)
+            else:
+                return text
+
+    def encode_replace_for_literal_block_spaces(self, match):
+        return '~' * len(match.group())
+
+    def encode_replace_for_inline_literal_spaces(self, match):
+        return '{ }' + '~' * (len(match.group()) - 1)
+
+    def astext(self):
+        return '\n'.join(self.header) + (''.join(self.body))
+
+    def append(self, text, newline='%\n'):
+        """
+        Append text, stripping newlines, producing nice LaTeX code.
+        """
+        lines = ['  ' * self.indentation_level + line + newline
+                 for line in text.splitlines(0)]
+        self.body.append(''.join(lines))
+
+    def visit_Text(self, node):
+        self.append(self.encode(node.astext()))
+
+    def depart_Text(self, node):
+        pass
+
+    def is_indented(self, paragraph):
+        """Return true if `paragraph` should be first-line-indented."""
+        assert isinstance(paragraph, nodes.paragraph)
+        siblings = [n for n in paragraph.parent if
+                    self.is_visible(n) and not isinstance(n, nodes.Titular)]
+        index = siblings.index(paragraph)
+        if ('continued' in paragraph['classes'] or
+            index > 0 and isinstance(siblings[index-1], nodes.transition)):
+            return 0
+        # Indent all but the first paragraphs.
+        return index > 0
+
+    def before_paragraph(self, node):
+        self.append(r'\renewcommand{\DEVparagraphindented}{%s}'
+                    % (self.is_indented(node) and 'true' or 'false'))
+
+    def before_title(self, node):
+        self.append(r'\renewcommand{\DEVtitleastext}{%s}'
+                    % self.encode(node.astext()))
+        self.append(r'\renewcommand{\DEVhassubtitle}{%s}'
+                    % ((len(node.parent) > 2 and
+                        isinstance(node.parent[1], nodes.subtitle))
+                       and 'true' or 'false'))
+
+    def before_generated(self, node):
+        if 'sectnum' in node['classes']:
+            node[0] = node[0].strip()
+
+    literal_block = 0
+
+    def visit_literal_block(self, node):
+        self.literal_block = 1
+
+    def depart_literal_block(self, node):
+        self.literal_block = 0
+
+    visit_doctest_block = visit_literal_block
+    depart_doctest_block = depart_literal_block
+
+    inline_literal = 0
+
+    def visit_literal(self, node):
+        self.inline_literal += 1
+
+    def depart_literal(self, node):
+        self.inline_literal -= 1
+
+    def _make_encodable(self, text):
+        """
+        Return text (a unicode object) with all unencodable characters
+        replaced with '?'.
+
+        Thus, the returned unicode string is guaranteed to be encodable.
+        """
+        encoding = self.settings.output_encoding
+        return text.encode(encoding, 'replace').decode(encoding)
+
+    def visit_comment(self, node):
+        """
+        Insert the comment unchanged into the document, replacing
+        unencodable characters with '?'.
+
+        (This is done in order not to fail if comments contain unencodable
+        characters, because our default encoding is not UTF-8.)
+        """
+        self.append('\n'.join(['% ' + self._make_encodable(line) for line
+                               in node.astext().splitlines(0)]), newline='\n')
+        raise nodes.SkipChildren
+
+    def before_topic(self, node):
+        if 'contents' in node['classes']:
+            for bullet_list in list(node.traverse(nodes.bullet_list)):
+                p = bullet_list.parent
+                if isinstance(p, nodes.list_item):
+                    p.parent.insert(p.parent.index(p) + 1, bullet_list)
+                    del p[1]
+            for paragraph in node.traverse(nodes.paragraph):
+                paragraph.attributes.update(paragraph[0].attributes)
+                paragraph[:] = paragraph[0]
+                paragraph.parent['tocrefid'] = paragraph['refid']
+            node['contents'] = 1
+        else:
+            node['contents'] = 0
+
+    bullet_list_level = 0
+
+    def visit_bullet_list(self, node):
+        self.append(r'\DECsetbullet{\labelitem%s}' %
+                    ['i', 'ii', 'iii', 'iv'][min(self.bullet_list_level, 3)])
+        self.bullet_list_level += 1
+
+    def depart_bullet_list(self, node):
+        self.bullet_list_level -= 1
+
+    enum_styles = {'arabic': 'arabic', 'loweralpha': 'alph', 'upperalpha':
+                   'Alph', 'lowerroman': 'roman', 'upperroman': 'Roman'}
+
+    enum_counter = 0
+
+    def visit_enumerated_list(self, node):
+        # We create our own enumeration list environment.  This allows
+        # to set the style and starting value and unlimited nesting.
+        # Maybe the actual creation (\DEC) can be moved to the
+        # stylesheet?
+        self.enum_counter += 1
+        enum_prefix = self.encode(node['prefix'])
+        enum_suffix = self.encode(node['suffix'])
+        enum_type = '\\' + self.enum_styles.get(node['enumtype'], r'arabic')
+        start = node.get('start', 1) - 1
+        counter = 'Denumcounter%d' % self.enum_counter
+        self.append(r'\DECmakeenumeratedlist{%s}{%s}{%s}{%s}{%s}{'
+                    % (enum_prefix, enum_type, enum_suffix, counter, start))
+                    # for Emacs: }
+
+    def depart_enumerated_list(self, node):
+        self.append('}')  # for Emacs: {
+
+    def before_list_item(self, node):
+        # XXX needs cleanup.
+        if (len(node) and (isinstance(node[-1], nodes.TextElement) or
+                           isinstance(node[-1], nodes.Text)) and
+            node.parent.index(node) == len(node.parent) - 1):
+            node['lastitem'] = 'true'
+
+    before_line = before_list_item
+
+    def before_raw(self, node):
+        if 'latex' in node.get('format', '').split():
+            # We're inserting the text in before_raw and thus outside
+            # of \DN... and \DECattr in order to make grouping with
+            # curly brackets work.
+            self.append(node.astext())
+        raise nodes.SkipChildren
+
+    def process_backlinks(self, node, type):
+        """
+        Add LaTeX handling code for backlinks of footnote or citation
+        node `node`.  `type` is either 'footnote' or 'citation'.
+        """
+        self.append(r'\renewcommand{\DEVsinglebackref}{}')
+        self.append(r'\renewcommand{\DEVmultiplebackrefs}{}')
+        if len(node['backrefs']) > 1:
+            refs = []
+            for i in range(len(node['backrefs'])):
+                # \DECmulticitationbacklink or \DECmultifootnotebacklink.
+                refs.append(r'\DECmulti%sbacklink{%s}{%s}'
+                            % (type, node['backrefs'][i], i + 1))
+            self.append(r'\renewcommand{\DEVmultiplebackrefs}{(%s){ }}'
+                        % ', '.join(refs))
+        elif len(node['backrefs']) == 1:
+            self.append(r'\renewcommand{\DEVsinglebackref}{%s}'
+                        % node['backrefs'][0])
+
+    def visit_footnote(self, node):
+        self.process_backlinks(node, 'footnote')
+
+    def visit_citation(self, node):
+        self.process_backlinks(node, 'citation')
+
+    def before_table(self, node):
+        # A table contains exactly one tgroup.  See before_tgroup.
+        pass
+
+    def before_tgroup(self, node):
+        widths = []
+        total_width = 0
+        for i in range(int(node['cols'])):
+            assert isinstance(node[i], nodes.colspec)
+            widths.append(int(node[i]['colwidth']) + 1)
+            total_width += widths[-1]
+        del node[:len(widths)]
+        tablespec = '|'
+        for w in widths:
+            # 0.93 is probably wrong in many cases.  XXX Find a
+            # solution which works *always*.
+            tablespec += r'p{%s\textwidth}|' % (0.93 * w /
+                                                max(total_width, 60))
+        self.append(r'\DECmaketable{%s}{' % tablespec)
+        self.context.append('}')
+        raise SkipAttrParentLaTeX
+
+    def depart_tgroup(self, node):
+        self.append(self.context.pop())
+
+    def before_row(self, node):
+        raise SkipAttrParentLaTeX
+
+    def before_thead(self, node):
+        raise SkipAttrParentLaTeX
+
+    def before_tbody(self, node):
+        raise SkipAttrParentLaTeX
+
+    def is_simply_entry(self, node):
+        return (len(node) == 1 and isinstance(node[0], nodes.paragraph) or
+                len(node) == 0)
+
+    def before_entry(self, node):
+        is_leftmost = 0
+        if node.hasattr('morerows'):
+            self.document.reporter.severe('Rowspans are not supported.')
+            # Todo: Add empty cells below rowspanning cell and issue
+            # warning instead of severe.
+        if node.hasattr('morecols'):
+            # The author got a headache trying to implement
+            # multicolumn support.
+            if not self.is_simply_entry(node):
+                self.document.reporter.severe(
+                    'Colspanning table cells may only contain one paragraph.')
+                # Todo: Same as above.
+            # The number of columns this entry spans (as a string).
+            colspan = int(node['morecols']) + 1
+            del node['morecols']
+        else:
+            colspan = 1
+        # Macro to call -- \DECcolspan or \DECcolspanleft.
+        macro_name = r'\DECcolspan'
+        if node.parent.index(node) == 0:
+            # Leftmost column.
+            macro_name += 'left'
+            is_leftmost = 1
+        if colspan > 1:
+            self.append('%s{%s}{' % (macro_name, colspan))
+            self.context.append('}')
+        else:
+            # Do not add a multicolumn with colspan 1 beacuse we need
+            # at least one non-multicolumn cell per column to get the
+            # desired column widths, and we can only do colspans with
+            # cells consisting of only one paragraph.
+            if not is_leftmost:
+                self.append(r'\DECsubsequententry{')
+                self.context.append('}')
+            else:
+                self.context.append('')
+        if isinstance(node.parent.parent, nodes.thead):
+            node['tableheaderentry'] = 'true'
+
+        # Don't add \renewcommand{\DEVparent}{...} because there must
+        # not be any non-expandable commands in front of \multicolumn.
+        raise SkipParentLaTeX
+
+    def depart_entry(self, node):
+        self.append(self.context.pop())
+
+    def before_substitution_definition(self, node):
+        raise nodes.SkipNode
+
+    indentation_level = 0
+
+    def node_name(self, node):
+        return node.__class__.__name__.replace('_', '')
+
+    # Attribute propagation order.
+    attribute_order = ['align', 'classes', 'ids']
+
+    def attribute_cmp(self, a1, a2):
+        """
+        Compare attribute names `a1` and `a2`.  Used in
+        propagate_attributes to determine propagation order.
+
+        See built-in function `cmp` for return value.
+        """
+        if a1 in self.attribute_order and a2 in self.attribute_order:
+            return cmp(self.attribute_order.index(a1),
+                       self.attribute_order.index(a2))
+        if (a1 in self.attribute_order) != (a2 in self.attribute_order):
+            # Attributes not in self.attribute_order come last.
+            return a1 in self.attribute_order and -1 or 1
+        else:
+            return cmp(a1, a2)
+
+    def propagate_attributes(self, node):
+        # Propagate attributes using \DECattr macros.
+        node_name = self.node_name(node)
+        attlist = []
+        if isinstance(node, nodes.Element):
+            attlist = node.attlist()
+        attlist.sort(lambda pair1, pair2: self.attribute_cmp(pair1[0],
+                                                             pair2[0]))
+        # `numatts` may be greater than len(attlist) due to list
+        # attributes.
+        numatts = 0
+        pass_contents = self.pass_contents(node)
+        for key, value in attlist:
+            if isinstance(value, ListType):
+                self.append(r'\renewcommand{\DEVattrlen}{%s}' % len(value))
+                for i in range(len(value)):
+                    self.append(r'\DECattr{%s}{%s}{%s}{%s}{' %
+                                (i+1, key, self.encode(value[i], attval=key),
+                                 node_name))
+                    if not pass_contents:
+                        self.append('}')
+                numatts += len(value)
+            else:
+                self.append(r'\DECattr{}{%s}{%s}{%s}{' %
+                            (key, self.encode(unicode(value), attval=key),
+                             node_name))
+                if not pass_contents:
+                    self.append('}')
+                numatts += 1
+        if pass_contents:
+            self.context.append('}' * numatts)  # for Emacs: {
+        else:
+            self.context.append('')
+
+    def visit_docinfo(self, node):
+        raise NotImplementedError('Docinfo not yet implemented.')
+
+    def visit_document(self, node):
+        document = node
+        # Move IDs into TextElements.  This won't work for images.
+        # Need to review this.
+        for node in document.traverse(nodes.Element):
+            if node.has_key('ids') and not isinstance(node,
+                                                      nodes.TextElement):
+                next_text_element = node.next_node(nodes.TextElement)
+                if next_text_element:
+                    next_text_element['ids'].extend(node['ids'])
+                    node['ids'] = []
+
+    def pass_contents(self, node):
+        r"""
+        Return True if the node contents should be passed in
+        \DN<nodename>{<contents>} and \DECattr{}{}{}{}{<contents>}.
+        Return False if the node contents should be passed in
+        \DECvisit<nodename> <contents> \DECdepart<nodename>, and no
+        attribute handler should be called.
+        """
+        # Passing the whole document or whole sections as parameters
+        # to \DN... or \DECattr causes LaTeX to run out of memory.
+        return not isinstance(node, (nodes.document, nodes.section))
+
+    def dispatch_visit(self, node):
+        skip_attr = skip_parent = 0
+        # TreePruningException to be propagated.
+        tree_pruning_exception = None
+        if hasattr(self, 'before_' + node.__class__.__name__):
+            try:
+                getattr(self, 'before_' + node.__class__.__name__)(node)
+            except SkipParentLaTeX:
+                skip_parent = 1
+            except SkipAttrParentLaTeX:
+                skip_attr = 1
+                skip_parent = 1
+            except nodes.SkipNode:
+                raise
+            except (nodes.SkipChildren, nodes.SkipSiblings), instance:
+                tree_pruning_exception = instance
+            except nodes.SkipDeparture:
+                raise NotImplementedError(
+                    'SkipDeparture not usable in LaTeX writer')
+
+        if not isinstance(node, nodes.Text):
+            node_name = self.node_name(node)
+            # attribute_deleters will be appended to self.context.
+            attribute_deleters = []
+            if not skip_parent and not isinstance(node, nodes.document):
+                self.append(r'\renewcommand{\DEVparent}{%s}'
+                            % self.node_name(node.parent))
+                for name, value in node.attlist():
+                    if not isinstance(value, ListType) and not ':' in name:
+                        # For non-list and non-special (like
+                        # 'xml:preserve') attributes, set
+                        # \DEVcurrentN<nodename>A<attribute> to the
+                        # attribute value, so that the value of the
+                        # attribute is available in the node handler
+                        # and all children.
+                        macro = r'\DEVcurrentN%sA%s' % (node_name, name)
+                        self.append(r'\def%s{%s}' % (
+                            macro, self.encode(unicode(value), attval=name)))
+                        # Make the attribute undefined afterwards.
+                        attribute_deleters.append(r'\let%s=\relax' % macro)
+            self.context.append('\n'.join(attribute_deleters))
+            if self.pass_contents(node):
+                # Call \DN<nodename>{<contents>}.
+                self.append(r'\DN%s{' % node_name)
+                self.context.append('}')
+            else:
+                # Call \DECvisit<nodename> <contents>
+                # \DECdepart<nodename>.  (Maybe we should use LaTeX
+                # environments for this?)
+                self.append(r'\DECvisit%s' % node_name)
+                self.context.append(r'\DECdepart%s' % node_name)
+            self.indentation_level += 1
+            if not skip_attr:
+                self.propagate_attributes(node)
+            else:
+                self.context.append('')
+
+        if (isinstance(node, nodes.TextElement) and
+            not isinstance(node.parent, nodes.TextElement)):
+            # Reset current quote to left.
+            self.left_quote = 1
+
+        # Call visit_... method.
+        try:
+            nodes.SparseNodeVisitor.dispatch_visit(self, node)
+        except LaTeXException:
+            raise NotImplementedError(
+                'visit_... methods must not raise LaTeXExceptions')
+
+        if tree_pruning_exception:
+            # Propagate TreePruningException raised in before_... method.
+            raise tree_pruning_exception
+
+    def is_invisible(self, node):
+        # Return true if node is invisible or moved away in the LaTeX
+        # rendering.
+        return (not isinstance(node, nodes.Text) and
+                (isinstance(node, nodes.Invisible) or
+                 isinstance(node, nodes.footnote) or
+                 isinstance(node, nodes.citation) or
+                 # Assume raw nodes to be invisible.
+                 isinstance(node, nodes.raw) or
+                 # Floating image or figure.
+                 node.get('align') in ('left', 'right')))
+
+    def is_visible(self, node):
+        return not self.is_invisible(node)
+
+    def needs_space(self, node):
+        """Two nodes for which `needs_space` is true need auxiliary space."""
+        # Return true if node is a visible block-level element.
+        return ((isinstance(node, nodes.Body) or
+                 isinstance(node, nodes.topic)) and
+                not (self.is_invisible(node) or
+                     isinstance(node.parent, nodes.TextElement)))
+
+    def always_needs_space(self, node):
+        """
+        Always add space around nodes for which `always_needs_space()`
+        is true, regardless of whether the other node needs space as
+        well.  (E.g. transition next to section.)
+        """
+        return isinstance(node, nodes.transition)
+
+    def dispatch_departure(self, node):
+        # Call departure method.
+        nodes.SparseNodeVisitor.dispatch_departure(self, node)
+
+        if not isinstance(node, nodes.Text):
+            # Close attribute and node handler call (\DN...{...}).
+            self.indentation_level -= 1
+            self.append(self.context.pop() + self.context.pop())
+            # Delete \DECcurrentN... attribute macros.
+            self.append(self.context.pop())
+            # Get next sibling.
+            next_node = node.next_node(
+                ascend=0, siblings=1, descend=0,
+                condition=self.is_visible)
+            # Insert space if necessary.
+            if  (self.needs_space(node) and self.needs_space(next_node) or
+                 self.always_needs_space(node) or
+                 self.always_needs_space(next_node)):
+                if isinstance(node, nodes.paragraph) and isinstance(next_node, nodes.paragraph):
+                    # Space between paragraphs.
+                    self.append(r'\DECparagraphspace')
+                else:
+                    # One of the elements is not a paragraph.
+                    self.append(r'\DECauxiliaryspace')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/base.tex	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1180 @@
+% System stylesheet for the new LaTeX writer, newlatex2e.
+
+% Major parts of the rendering are done in this stylesheet and not in the
+% Python module.
+
+% For development notes, see notes.txt.
+
+% User documentation (in the stylesheet for now; that may change though):
+
+% Naming conventions:
+% All uppercase letters in macro names have a specific meaning.
+% \D...: All macros introduced by the Docutils LaTeX writer start with "D".
+% \DS<name>: Setup function (called at the bottom of this stylesheet).
+% \DN<nodename>{<contents>}: Handler for Docutils document tree node `node`; called by
+%                            the Python module.
+% \DEV<name>: External variable, set by the Python module.
+% \DEC<name>: External command.  It is called by the Python module and must be
+%             defined in this stylesheet.
+% \DN<nodename>A<attribute>{<number>}{<attribute>}{<value>}{<nodename>}{<contents>}:
+%     Attribute handler for `attribute` set on nodes of type `nodename`.
+%     See below for a discussion of attribute handlers.
+% \DA<attribute>{<number>}{<attribute>}{<value>}{<nodename>}{<contents>}:
+%     Attribute handler for all `attribute`.  Called only when no specific
+%     \DN<nodename>A<attribute> handler is defined.
+% \DN<nodename>C<class>{<contents>}:
+%     Handler for `class`, when set on nodes of type `nodename`.
+% \DC<class>{<contents>}:
+%     Handler for `class`.  Called only when no specific \DN<nodename>C<class>
+%     handler is defined.
+% \D<name>: Generic variable or function.
+
+% Attribute handlers:
+% TODO
+
+% ---------------------------------------------------------------------------
+
+% Having to intersperse code with \makeatletter-\makeatother pairs is very
+% annoying, so we call \makeatletter at the top and \makeatother at the
+% bottom.   Just be aware that you cannot use "@" as a text character inside
+% this stylesheet.
+\makeatletter
+
+% Print-mode (as opposed to online mode e.g. with Adobe Reader).
+% This causes for example blue hyperlinks.
+\providecommand{\Dprinting}{false}
+
+% \DSearly is called right after \documentclass.
+\providecommand{\DSearly}{}
+% \DSlate is called at the end of the stylesheet (right before the document
+% tree).
+\providecommand{\DSlate}{}
+
+% Use the KOMA script article class.
+\providecommand{\Ddocumentclass}{scrartcl}
+\providecommand{\Ddocumentoptions}{a4paper}
+\providecommand{\DSdocumentclass}{
+  \documentclass[\Ddocumentoptions]{\Ddocumentclass} }
+
+% Todo: This should be movable to the bottom, but it isn't as long as
+% we use \usepackage commands at the top level of this stylesheet
+% (which we shouldn't).
+\DSdocumentclass
+
+\providecommand{\DSpackages}{
+  % Load miscellaneous packages.
+  % Note 1: Many of the packages loaded here are used throughout this stylesheet.
+  % If one of these packages does not work on your system or in your scenario,
+  % please let us know, so we can consider making the package optional.
+  % Note 2: It would appear cleaner to load packages where they are used.
+  % However, since using a wrong package loading order can lead to *very*
+  % subtle bugs, we centralize the loading of most packages here.
+  \DSfontencoding % load font encoding packages
+  \DSlanguage % load babel
+  % Using \ifthenelse conditionals.
+  \usepackage{ifthen} % before hyperref (really!)
+  % There is not support for *not* using hyperref because it's used in many
+  % places.  If this is a problem (e.g. because hyperref doesn't work on your
+  % system), please let us know.
+  \usepackage[colorlinks=false,pdfborder={0 0 0}]{hyperref}
+  % Get color, e.g. for links and system messages.
+  \usepackage{color}
+  % Get \textnhtt macro (non-hyphenating type writer).
+  \usepackage{hyphenat}
+  % For sidebars.
+  \usepackage{picins}
+  % We use longtable to create tables.
+  \usepackage{longtable}
+  % Images.
+  \usepackage{graphicx}
+  % These packages might be useful (some just add magic pixie dust), so
+  % evaluate them:
+  %\usepackage{fixmath}
+  %\usepackage{amsmath}
+  % Add some missing symbols like \textonehalf.
+  \usepackage{textcomp}
+}
+
+\providecommand{\DSfontencoding}{
+  % Set up font encoding.  Called by \DSpackages.
+  % AE is a T1 emulation.  It provides mostly the same characters and
+  % features as T1-encoded fonts but doesn't use bitmap fonts (which are
+  % unsuitable for online reading and subtle for printers).
+  \usepackage{ae}
+  % Provide the characters not contained in AE from EC bitmap fonts.
+  \usepackage{aecompl}
+  % Guillemets ("<<", ">>") in AE.
+  \usepackage{aeguill}
+}
+
+\providecommand{\DSsymbols}{%
+  % Fix up symbols.
+  % The Euro symbol in Computer Modern looks, um, funny.  Let's get a
+  % proper Euro symbol.
+  \usepackage{eurosym}%
+  \renewcommand{\texteuro}{\euro}%
+}
+
+% Taken from
+% <http://groups.google.de/groups?selm=1i0n5tgtplti420e1omp4pctlv19jpuhbb%404ax.com>
+% and modified.  Used with permission.
+\providecommand{\Dprovidelength}[2]{%
+  \begingroup%
+    \escapechar\m@ne%
+    \xdef\@gtempa{{\string#1}}%
+  \endgroup%
+  \expandafter\@ifundefined\@gtempa%
+  {\newlength{#1}\setlength{#1}{#2}}%
+  {}%
+}
+
+\providecommand{\Dprovidecounter}[2]{%
+  % Like \newcounter except that it doesn't crash if the counter
+  % already exists.
+  \@ifundefined{c@#1}{\newcounter{#1}\setcounter{#1}{#2}}{}
+}
+
+\Dprovidelength{\Dboxparindent}{\parindent}
+
+\providecommand{\Dmakebox}[1]{%
+  % Make a centered, frameless box.  Useful e.g. for block quotes.
+  % Do not use minipages here, but create pseudo-lists to allow
+  % page-breaking.  (Don't use KOMA-script's addmargin environment
+  % because it messes up bullet lists.)
+  \Dmakelistenvironment{}{}{%
+    \setlength{\parskip}{0pt}%
+    \setlength{\parindent}{\Dboxparindent}%
+    \item{#1}%
+  }%
+}
+
+\providecommand{\Dmakefbox}[1]{%
+  % Make a centered, framed box.  Useful e.g. for admonitions.
+  \vspace{0.4\baselineskip}%
+  \begin{center}%
+    \fbox{%
+      \begin{minipage}[t]{0.9\linewidth}%
+        \setlength{\parindent}{\Dboxparindent}%
+        #1%
+      \end{minipage}%
+    }%
+  \end{center}%
+  \vspace{0.4\baselineskip}%
+}
+
+% We do not currently recognize the difference between an end-sentence and a
+% mid-sentence period (".  " vs. ". " in plain text).  So \frenchspacing is
+% appropriate.
+\providecommand{\DSfrenchspacing}{\frenchspacing}
+
+
+\Dprovidelength{\Dblocklevelvspace}{%
+  % Space between block-level elements other than paragraphs.
+  0.7\baselineskip plus 0.3\baselineskip minus 0.2\baselineskip%
+}
+\providecommand{\DECauxiliaryspace}{%
+  \ifthenelse{\equal{\Dneedvspace}{true}}{\vspace{\Dblocklevelvspace}}{}%
+  \par\noindent%
+}
+\providecommand{\DECparagraphspace}{\par}
+\providecommand{\Dneedvspace}{true}
+
+\providecommand{\DSlanguage}{%
+  % Set up babel.
+  \usepackage[\DEVlanguagebabel]{babel}
+}
+
+\providecommand{\Difdefined}[3]{\@ifundefined{#1}{#3}{#2}}
+
+% Handler for 'classes' attribute (called for each class attribute).
+\providecommand{\DAclasses}[5]{%
+  % Dispatch to \DN<nodename>C<class>.
+  \Difdefined{DN#4C#3}{%
+    % Pass only contents, nothing else!
+    \csname DN#4C#3\endcsname{#5}%
+  }{%
+    % Otherwise, dispatch to \DC<class>.
+    \Difdefined{DC#3}{%
+      \csname DC#3\endcsname{#5}%
+    }{%
+      #5%
+    }%
+  }%
+}
+
+\providecommand{\DECattr}[5]{%
+  % Global attribute dispatcher, called inside the document tree.
+  % Parameters:
+  % 1. Attribute number.
+  % 2. Attribute name.
+  % 3. Attribute value.
+  % 4. Node name.
+  % 5. Node contents.
+  \Difdefined{DN#4A#2}{%
+    % Dispatch to \DN<nodename>A<attribute>.
+    \csname DN#4A#2\endcsname{#1}{#2}{#3}{#4}{#5}%
+  }{\Difdefined{DA#2}{%
+    % Otherwise dispatch to \DA<attribute>.
+    \csname DA#2\endcsname{#1}{#2}{#3}{#4}{#5}%
+  }{%
+    % Otherwise simply run the contents without calling a handler.
+    #5%
+  }}%
+}
+
+% ---------- Link handling ----------
+% Targets and references.
+
+\providecommand{\Draisedlink}[1]{%
+  % Anchors are placed on the base line by default.  This is a bad thing for
+  % inline context, so we raise the anchor (normally by \baselineskip).
+  \Hy@raisedlink{#1}%
+}
+
+% References.
+% We're assuming here that the "refid" and "refuri" attributes occur
+% only in inline context (in TextElements).
+\providecommand{\DArefid}[5]{%
+  \ifthenelse{\equal{#4}{reference}}{%
+    \Dexplicitreference{\##3}{#5}%
+  }{%
+    % If this is not a target node (targets with refids are
+    % uninteresting and should be silently dropped).
+    \ifthenelse{\not\equal{#4}{target}}{%
+      % If this is a footnote reference, call special macro.
+      \ifthenelse{\equal{#4}{footnotereference}}{%
+        \Dimplicitfootnotereference{\##3}{#5}%
+      }{%
+        \ifthenelse{\equal{#4}{citationreference}}{%
+          \Dimplicitcitationreference{\##3}{#5}%
+        }{%
+          \Dimplicitreference{\##3}{#5}%
+        }%
+      }%
+    }{}%
+  }%
+}
+\providecommand{\DArefuri}[5]{%
+  \ifthenelse{\equal{#4}{target}}{%
+    % The node name is 'target', so this is a hyperlink target, like this:
+    % .. _mytarget: URI
+    % Hyperlink targets are ignored because they are invisible.
+  }{%
+    % If a non-target node has a refuri attribute, it must be an explicit URI
+    % reference (i.e. node name is 'reference').
+    \Durireference{#3}{#5}%
+  }%
+}
+% Targets.
+\providecommand{\DAids}[5]{%
+  \label{#3}%
+  \ifthenelse{\equal{#4}{footnotereference}}{%
+    {%
+      \renewcommand{\HyperRaiseLinkDefault}{%
+        % Dirty hack to make backrefs to footnote references work.
+        % For some reason, \baselineskip is 0pt in fn references.
+        0.5\Doriginalbaselineskip%
+      }%
+      \Draisedlink{\hypertarget{#3}{}}#5%
+    }%
+  }{%
+    \Draisedlink{\hypertarget{#3}{}}#5%
+  }%
+}
+\providecommand{\Dimplicitreference}[2]{%
+  % Create implicit reference to ID.  Implicit references occur
+  % e.g. in TOC-backlinks of section titles.  Parameters:
+  % 1. Target.
+  % 2. Link text.
+  \href{#1}{#2}%
+}
+\providecommand{\Dimplicitfootnotereference}[2]{%
+  % Ditto, but for the special case of footnotes.
+  % We want them to be rendered like explicit references.
+  \Dexplicitreference{#1}{#2}%
+}
+\providecommand{\Dimplicitcitationreference}[2]{%
+  % Ditto for citation references.
+  \Dimplicitfootnotereference{#1}{#2}%
+}
+\providecommand{\Dcolorexplicitreference}{%
+  \ifthenelse{\equal{\Dprinting}{true}}{\color{black}}{\color{blue}}%
+}
+\providecommand{\Dexplicitreference}[2]{%
+  % Create explicit reference to ID, e.g. created with "foo_".
+  % Parameters:
+  % 1. Target.
+  % 2. Link text.
+  \href{#1}{{\Dcolorexplicitreference#2}}%
+}
+\providecommand{\Dcolorurireference}{\Dcolorexplicitreference}
+\providecommand{\Durireference}[2]{%
+  % Create reference to URI.  Parameters:
+  % 1. Target.
+  % 2. Link text.
+  \href{#1}{{\Dcolorurireference#2}}%
+}
+
+\Dprovidecounter{Dpdfbookmarkid}{0}%
+\providecommand{\Dpdfbookmark}[1]{%
+  % Temporarily decrement Desctionlevel counter.
+  \addtocounter{Dsectionlevel}{-1}%
+  %\typeout{\arabic{Dsectionlevel}}%
+  %\typeout{#1}%
+  %\typeout{docutils\roman{Dpdfbookmarkid}}%
+  %\typeout{}%
+  \pdfbookmark[\arabic{Dsectionlevel}]{#1}{docutils\arabic{Dpdfbookmarkid}}%
+  \addtocounter{Dsectionlevel}{1}%
+  \addtocounter{Dpdfbookmarkid}{1}%
+}
+% ---------- End of Link Handling ----------
+
+\providecommand{\DNparagraph}[1]{%
+  \ifthenelse{\equal{\DEVparagraphindented}{true}}{\indent}{\noindent}%
+  #1%
+}
+\providecommand{\Dformatboxtitle}[1]{{\Large\textbf{#1}}}
+\providecommand{\Dformatboxsubtitle}[1]{{\large\textbf{#1}}}
+\providecommand{\Dtopictitle}[1]{%
+  \Difinsidetoc{\vspace{1em}\par}{}%
+  \noindent\Dformatboxtitle{#1}%
+  \ifthenelse{\equal{\DEVhassubtitle}{false}}{\vspace{1em}}{\vspace{0.5em}}%
+  \par%
+}
+\providecommand{\Dadmonitiontitle}[1]{%
+  \Dtopictitle{#1}%
+}
+\providecommand{\Dtopicsubtitle}[1]{%
+  \noindent\Dformatboxsubtitle{#1}%
+  \vspace{1em}%
+  \par%
+}
+\providecommand{\Dsidebartitle}[1]{\Dtopictitle{#1}}
+\providecommand{\Dsidebarsubtitle}[1]{\Dtopicsubtitle{#1}}
+\providecommand{\Ddocumenttitle}[1]{%
+  \begin{center}{\Huge#1}\end{center}%
+  \ifthenelse{\equal{\DEVhassubtitle}{true}}{\vspace{0.1cm}}{\vspace{1cm}}%
+}
+\providecommand{\Ddocumentsubtitle}[1]{%
+  \begin{center}{\huge#1}\end{center}%
+  \vspace{1cm}%
+}
+% Can be overwritten by user stylesheet.
+\providecommand{\Dformatsectiontitle}[1]{#1}
+\providecommand{\Dformatsectionsubtitle}[1]{\Dformatsectiontitle{#1}}
+\providecommand{\Dbookmarksectiontitle}[1]{%
+  % Return text suitable for use in \section*, \subsection*, etc.,
+  % containing a PDF bookmark.  Parameter:  The title (as node tree).
+  \Draisedlink{\Dpdfbookmark{\DEVtitleastext}}%
+  #1%
+}
+\providecommand{\Dsectiontitlehook}[1]{#1}
+\providecommand{\Dsectiontitle}[1]{%
+  \Dsectiontitlehook{%
+    \Ddispatchsectiontitle{\Dbookmarksectiontitle{\Dformatsectiontitle{#1}}}%
+  }%
+}
+\providecommand{\Ddispatchsectiontitle}[1]{%
+  \@ifundefined{Dsectiontitle\roman{Dsectionlevel}}{%
+    \Ddeepsectiontitle{#1}%
+  }{%
+    \csname Dsectiontitle\roman{Dsectionlevel}\endcsname{#1}%
+  }%
+}
+\providecommand{\Ddispatchsectionsubtitle}[1]{%
+  \Ddispatchsectiontitle{#1}%
+}
+\providecommand{\Dsectiontitlei}[1]{\section*{#1}}
+\providecommand{\Dsectiontitleii}[1]{\subsection*{#1}}
+\providecommand{\Ddeepsectiontitle}[1]{%
+  % Anything below \subsubsection (like \paragraph or \subparagraph)
+  % is useless because it uses the same font.  The only way to
+  % (visually) distinguish such deeply nested sections is to use
+  % section numbering.
+  \subsubsection*{#1}%
+}
+\providecommand{\Dsectionsubtitlehook}[1]{#1}
+\Dprovidelength{\Dsectionsubtitleraisedistance}{0.7em}
+\providecommand{\Dsectionsubtitlescaling}{0.85}
+\providecommand{\Dsectionsubtitle}[1]{%
+  \Dsectionsubtitlehook{%
+    % Move the subtitle nearer to the title.
+    \vspace{-\Dsectionsubtitleraisedistance}%
+    % Don't create a PDF bookmark.
+    \Ddispatchsectionsubtitle{%
+      \Dformatsectionsubtitle{\scalebox{\Dsectionsubtitlescaling}{#1}}%
+    }%
+  }%
+}
+\providecommand{\DNtitle}[1]{%
+  % Dispatch to \D<parent>title.
+  \csname D\DEVparent title\endcsname{#1}%
+}
+\providecommand{\DNsubtitle}[1]{%
+  % Dispatch to \D<parent>subtitle.
+  \csname D\DEVparent subtitle\endcsname{#1}%
+}
+
+\providecommand{\DNliteralblock}[1]{%
+  \Dmakelistenvironment{}{%
+    \ifthenelse{\equal{\Dinsidetabular}{true}}{%
+      \setlength{\leftmargin}{0pt}%
+    }{}%
+    \setlength{\rightmargin}{0pt}%
+  }{%
+    \raggedright\item\noindent\nohyphens{\textnhtt{#1\Dfinalstrut}}%
+  }%
+}
+\providecommand{\DNdoctestblock}[1]{\DNliteralblock{#1}}
+\providecommand{\DNliteral}[1]{\textnhtt{#1}}
+\providecommand{\DNemphasis}[1]{\emph{#1}}
+\providecommand{\DNstrong}[1]{\textbf{#1}}
+\providecommand{\DECvisitdocument}{\begin{document}\noindent}
+\providecommand{\DECdepartdocument}{\end{document}}
+\providecommand{\DNtopic}[1]{%
+  \ifthenelse{\equal{\DEVcurrentNtopicAcontents}{1}}{%
+    \addtocounter{Dtoclevel}{1}%
+    \par\noindent%
+    #1%
+    \addtocounter{Dtoclevel}{-1}%
+  }{%
+    \par\noindent%
+    \Dmakebox{#1}%
+  }%
+}
+\providecommand{\DNadmonition}[1]{%
+  \DNtopic{#1}%
+}
+\providecommand{\Dformatrubric}[1]{\textbf{#1}}
+\Dprovidelength{\Dprerubricspace}{0.3em}
+\providecommand{\DNrubric}[1]{%
+  \vspace{\Dprerubricspace}\par\noindent\Dformatrubric{#1}\par%
+}
+
+\providecommand{\Dbullet}{}
+\providecommand{\DECsetbullet}[1]{\renewcommand{\Dbullet}{#1}}
+\providecommand{\DNbulletlist}[1]{%
+  \Difinsidetoc{%
+    \Dtocbulletlist{#1}%
+  }{%
+    \Dmakelistenvironment{\Dbullet}{}{#1}%
+  }%
+}
+% Todo: So what on earth is @pnumwidth?
+\renewcommand{\@pnumwidth}{2.2em}
+\providecommand{\DNlistitem}[1]{%
+  \Difinsidetoc{%
+    \ifthenelse{\equal{\theDtoclevel}{1}\and\equal{\Dlocaltoc}{false}}{%
+      {%
+        \par\addvspace{1em}\noindent%
+        \sectfont%
+        #1\hfill\pageref{\DEVcurrentNlistitemAtocrefid}%
+      }%
+    }{%
+      \@dottedtocline{0}{\Dtocindent}{0em}{#1}{%
+        \pageref{\DEVcurrentNlistitemAtocrefid}%
+      }%
+    }%
+  }{%
+    \item{#1}%
+  }%
+}
+\providecommand{\DNenumeratedlist}[1]{#1}
+\Dprovidecounter{Dsectionlevel}{0}
+\providecommand{\Dvisitsectionhook}{}
+\providecommand{\Ddepartsectionhook}{}
+\providecommand{\DECvisitsection}{%
+  \addtocounter{Dsectionlevel}{1}%
+  \Dvisitsectionhook%
+}
+\providecommand{\DECdepartsection}{%
+  \Ddepartsectionhook%
+  \addtocounter{Dsectionlevel}{-1}%
+}
+
+% Using \_ will cause hyphenation after _ even in \textnhtt-typewriter
+% because the hyphenat package redefines \_.  So we use
+% \textunderscore here.
+\providecommand{\DECtextunderscore}{\textunderscore}
+
+\providecommand{\Dtextinlineliteralfirstspace}{{ }}
+\providecommand{\Dtextinlineliteralsecondspace}{{~}}
+
+\Dprovidelength{\Dlistspacing}{0.8\baselineskip}
+
+\providecommand{\Dsetlistrightmargin}{%
+  \ifthenelse{\lengthtest{\linewidth>12em}}{%
+    % Equal margins.
+    \setlength{\rightmargin}{\leftmargin}%
+  }{%
+    % If the line is narrower than 10em, we don't remove any further
+    % space from the right.
+    \setlength{\rightmargin}{0pt}%
+  }%
+}
+\providecommand{\Dresetlistdepth}{false}
+\Dprovidelength{\Doriginallabelsep}{\labelsep}
+\providecommand{\Dmakelistenvironment}[3]{%
+  % Make list environment with support for unlimited nesting and with
+  % reasonable default lengths.  Parameters:
+  % 1. Label (same as in list environment).
+  % 2. Spacing (same as in list environment).
+  % 3. List contents (contents of list environment).
+  \ifthenelse{\equal{\Dinsidetabular}{true}}{%
+    % Unfortunately, vertical spacing doesn't work correctly when
+    % using lists inside tabular environments, so we use a minipage.
+    \begin{minipage}[t]{\linewidth}%
+  }{}%
+    {%
+      \renewcommand{\Dneedvspace}{false}%
+      % \parsep0.5\baselineskip
+      \renewcommand{\Dresetlistdepth}{false}%
+      \ifnum \@listdepth>5%
+      \protect\renewcommand{\Dresetlistdepth}{true}%
+      \@listdepth=5%
+      \fi%
+      \begin{list}{%
+          #1%
+        }{%
+          \setlength{\itemsep}{0pt}%
+          \setlength{\partopsep}{0pt}%
+          \setlength{\topsep}{0pt}%
+                                  % List should take 90% of total width.
+          \setlength{\leftmargin}{0.05\linewidth}%
+          \ifthenelse{\lengthtest{\leftmargin<1.8em}}{%
+            \setlength{\leftmargin}{1.8em}%
+          }{}%
+          \setlength{\labelsep}{\Doriginallabelsep}%
+          \Dsetlistrightmargin%
+          #2%
+        }{%
+          #3%
+        }%
+      \end{list}%
+      \ifthenelse{\equal{\Dresetlistdepth}{true}}{\@listdepth=5}{}%
+    }%
+  \ifthenelse{\equal{\Dinsidetabular}{true}}{\end{minipage}}{}%
+}
+\providecommand{\Dfinalstrut}{\@finalstrut\@arstrutbox}
+\providecommand{\DAlastitem}[5]{#5\Dfinalstrut}
+
+\Dprovidelength{\Ditemsep}{0pt}
+\providecommand{\DECmakeenumeratedlist}[6]{%
+  % Make enumerated list.
+  % Parameters:
+  % - prefix
+  % - type (\arabic, \roman, ...)
+  % - suffix
+  % - suggested counter name
+  % - start number - 1
+  % - list contents
+  \newcounter{#4}%
+  \Dmakelistenvironment{#1#2{#4}#3}{%
+    % Use as much space as needed for the label.
+    \setlength{\labelwidth}{10em}%
+    % Reserve enough space so that the label doesn't go beyond the
+    % left margin of preceding paragraphs.  Like that:
+    %
+    %    A paragraph.
+    %
+    %   1. First item.
+    \setlength{\leftmargin}{2.5em}%
+    \Dsetlistrightmargin%
+    \setlength{\itemsep}{\Ditemsep}%
+    % Use counter recommended by Python module.
+    \usecounter{#4}%
+    % Set start value.
+    \addtocounter{#4}{#5}%
+  }{%
+    % The list contents.
+    #6%
+  }%
+}
+
+
+% Single quote in literal mode.  \textquotesingle from package
+% textcomp has wrong width when using package ae, so we use a normal
+% single curly quote here.
+\providecommand{\DECtextliteralsinglequote}{'}
+
+
+% "Tabular lists" are field lists and options lists (not definition
+% lists because there the term always appears on its own line).  We'll
+% use the terminology of field lists now ("field", "field name",
+% "field body"), but the same is also analogously applicable to option
+% lists.
+%
+% We want these lists to be breakable across pages.  We cannot
+% automatically get the narrowest possible size for the left column
+% (i.e. the field names or option groups) because tabularx does not
+% support multi-page tables, ltxtable needs to have the table in an
+% external file and we don't want to clutter the user's directories
+% with auxiliary files created by the filecontents environment, and
+% ltablex is not included in teTeX.
+%
+% Thus we set a fixed length for the left column and use list
+% environments.  This also has the nice side effect that breaking is
+% now possible anywhere, not just between fields.
+%
+% Note that we are creating a distinct list environment for each
+% field.  There is no macro for a whole tabular list!
+\Dprovidelength{\Dtabularlistfieldnamewidth}{6em}
+\Dprovidelength{\Dtabularlistfieldnamesep}{0.5em}
+\providecommand{\Dinsidetabular}{false}
+\providecommand{\Dsavefieldname}{}
+\providecommand{\Dsavefieldbody}{}
+\Dprovidelength{\Dusedfieldnamewidth}{0pt}
+\Dprovidelength{\Drealfieldnamewidth}{0pt}
+\providecommand{\Dtabularlistfieldname}[1]{\renewcommand{\Dsavefieldname}{#1}}
+\providecommand{\Dtabularlistfieldbody}[1]{\renewcommand{\Dsavefieldbody}{#1}}
+\Dprovidelength{\Dparskiptemp}{0pt}
+\providecommand{\Dtabularlistfield}[1]{%
+  {%
+    % This only saves field name and field body in \Dsavefieldname and
+    % \Dsavefieldbody, resp.  It does not insert any text into the
+    % document.
+    #1%
+    % Recalculate the real field name width everytime we encounter a
+    % tabular list field because it may have been changed using a
+    % "raw" node.
+    \setlength{\Drealfieldnamewidth}{\Dtabularlistfieldnamewidth}%
+    \addtolength{\Drealfieldnamewidth}{\Dtabularlistfieldnamesep}%
+    \Dmakelistenvironment{%
+      \makebox[\Drealfieldnamewidth][l]{\Dsavefieldname}%
+    }{%
+      \setlength{\labelwidth}{\Drealfieldnamewidth}%
+      \setlength{\leftmargin}{\Drealfieldnamewidth}%
+      \setlength{\rightmargin}{0pt}%
+      \setlength{\labelsep}{0pt}%
+    }{%
+      \item%
+      \settowidth{\Dusedfieldnamewidth}{\Dsavefieldname}%
+      \setlength{\Dparskiptemp}{\parskip}%
+      \ifthenelse{%
+        \lengthtest{\Dusedfieldnamewidth>\Dtabularlistfieldnamewidth}%
+      }{%
+        \mbox{}\par%
+        \setlength{\parskip}{0pt}%
+      }{}%
+      \Dsavefieldbody%
+      \setlength{\parskip}{\Dparskiptemp}%
+      %XXX Why did we need this?
+      %\@finalstrut\@arstrutbox%
+    }%
+    \par%
+  }%
+}
+
+\providecommand{\Dformatfieldname}[1]{\textbf{#1:}}
+\providecommand{\DNfieldlist}[1]{#1}
+\providecommand{\DNfield}[1]{\Dtabularlistfield{#1}}
+\providecommand{\DNfieldname}[1]{%
+  \Dtabularlistfieldname{%
+    \Dformatfieldname{#1}%
+  }%
+}
+\providecommand{\DNfieldbody}[1]{\Dtabularlistfieldbody{#1}}
+
+\providecommand{\Dformatoptiongroup}[1]{%
+  % Format option group, e.g. "-f file, --input file".
+  \texttt{#1}%
+}
+\providecommand{\Dformatoption}[1]{%
+  % Format option, e.g. "-f file".
+  % Put into mbox to avoid line-breaking at spaces.
+  \mbox{#1}%
+}
+\providecommand{\Dformatoptionstring}[1]{%
+  % Format option string, e.g. "-f".
+  #1%
+}
+\providecommand{\Dformatoptionargument}[1]{%
+  % Format option argument, e.g. "file".
+  \textsl{#1}%
+}
+\providecommand{\Dformatoptiondescription}[1]{%
+  % Format option description, e.g.
+  % "\DNparagraph{Read input data from file.}"
+  #1%
+}
+\providecommand{\DNoptionlist}[1]{#1}
+\providecommand{\Doptiongroupjoiner}{,{ }}
+\providecommand{\Disfirstoption}{%
+  % Auxiliary macro indicating if a given option is the first child
+  % of its option group (if it's not, it has to preceded by
+  % \Doptiongroupjoiner).
+  false%
+}
+\providecommand{\DNoptionlistitem}[1]{%
+  \Dtabularlistfield{#1}%
+}
+\providecommand{\DNoptiongroup}[1]{%
+  \renewcommand{\Disfirstoption}{true}%
+  \Dtabularlistfieldname{\Dformatoptiongroup{#1}}%
+}
+\providecommand{\DNoption}[1]{%
+  % If this is not the first option in this option group, add a
+  % joiner.
+  \ifthenelse{\equal{\Disfirstoption}{true}}{%
+    \renewcommand{\Disfirstoption}{false}%
+  }{%
+    \Doptiongroupjoiner%
+  }%
+  \Dformatoption{#1}%
+}
+\providecommand{\DNoptionstring}[1]{\Dformatoptionstring{#1}}
+\providecommand{\DNoptionargument}[1]{{ }\Dformatoptionargument{#1}}
+\providecommand{\DNdescription}[1]{%
+  \Dtabularlistfieldbody{\Dformatoptiondescription{#1}}%
+}
+
+\providecommand{\DNdefinitionlist}[1]{%
+  \begin{description}%
+    \parskip0pt%
+    #1%
+  \end{description}%
+}
+\providecommand{\DNdefinitionlistitem}[1]{%
+  % LaTeX expects the label in square brackets; we provide an empty
+  % label.
+  \item[]#1%
+}
+\providecommand{\Dformatterm}[1]{#1}
+\providecommand{\DNterm}[1]{\hspace{-5pt}\Dformatterm{#1}}
+% I'm still not sure what's the best rendering for classifiers.  The
+% colon syntax is used by reStructuredText, so it's at least WYSIWYG.
+% Use slanted text because italic would cause too much emphasis.
+\providecommand{\Dformatclassifier}[1]{\textsl{#1}}
+\providecommand{\DNclassifier}[1]{~:~\Dformatclassifier{#1}}
+\providecommand{\Dformatdefinition}[1]{#1}
+\providecommand{\DNdefinition}[1]{\par\Dformatdefinition{#1}}
+
+\providecommand{\Dlineblockindentation}{2.5em}
+\providecommand{\DNlineblock}[1]{%
+  \Dmakelistenvironment{}{%
+    \ifthenelse{\equal{\DEVparent}{lineblock}}{%
+      % Parent is a line block, so indent.
+      \setlength{\leftmargin}{\Dlineblockindentation}%
+    }{%
+      % At top level; don't indent.
+      \setlength{\leftmargin}{0pt}%
+    }%
+    \setlength{\rightmargin}{0pt}%
+    \setlength{\parsep}{0pt}%
+  }{%
+    #1%
+  }%
+}
+\providecommand{\DNline}[1]{\item#1}
+
+\providecommand{\DNtransition}{%
+  \raisebox{0.25em}{\parbox{\linewidth}{\hspace*{\fill}\hrulefill\hrulefill\hspace*{\fill}}}%
+}
+
+\providecommand{\Dformatblockquote}[1]{%
+  % Format contents of block quote.
+  % This occurs in block-level context, so we cannot use \textsl.
+  {\slshape#1}%
+}
+\providecommand{\Dformatattribution}[1]{---\textup{#1}}
+\providecommand{\DNblockquote}[1]{%
+  \Dmakebox{%
+    \Dformatblockquote{#1}
+  }%
+}
+\providecommand{\DNattribution}[1]{%
+  \par%
+  \begin{flushright}\Dformatattribution{#1}\end{flushright}%
+}
+
+
+% Sidebars:
+% Vertical and horizontal margins.
+\Dprovidelength{\Dsidebarvmargin}{0.5em}
+\Dprovidelength{\Dsidebarhmargin}{1em}
+% Padding (space between contents and frame).
+\Dprovidelength{\Dsidebarpadding}{1em}
+% Frame width.
+\Dprovidelength{\Dsidebarframewidth}{2\fboxrule}
+% Position ("l" or "r").
+\providecommand{\Dsidebarposition}{r}
+% Width.
+\Dprovidelength{\Dsidebarwidth}{0.45\linewidth}
+\providecommand{\DNsidebar}[1]{
+  \parpic[\Dsidebarposition]{%
+    \begin{minipage}[t]{\Dsidebarwidth}%
+      % Doing this with nested minipages is ugly, but I haven't found
+      % another way to place vertical space before and after the fbox.
+      \vspace{\Dsidebarvmargin}%
+      {%
+        \setlength{\fboxrule}{\Dsidebarframewidth}%
+        \setlength{\fboxsep}{\Dsidebarpadding}%
+        \fbox{%
+          \begin{minipage}[t]{\linewidth}%
+            \setlength{\parindent}{\Dboxparindent}%
+            #1%
+          \end{minipage}%
+        }%
+      }%
+      \vspace{\Dsidebarvmargin}%
+    \end{minipage}%
+  }%
+}
+
+
+% Citations and footnotes.
+\providecommand{\Dformatfootnote}[1]{%
+  % Format footnote.
+  {%
+    \footnotesize#1%
+    % \par is necessary for LaTeX to adjust baselineskip to the
+    % changed font size.
+    \par%
+  }%
+}
+\providecommand{\Dformatcitation}[1]{\Dformatfootnote{#1}}
+\Dprovidelength{\Doriginalbaselineskip}{0pt}
+\providecommand{\DNfootnotereference}[1]{%
+  {%
+    % \baselineskip is 0pt in \textsuperscript, so we save it here.
+    \setlength{\Doriginalbaselineskip}{\baselineskip}%
+    \textsuperscript{#1}%
+  }%
+}
+\providecommand{\DNcitationreference}[1]{{[}#1{]}}
+\Dprovidelength{\Dfootnotesep}{3.5pt}
+\providecommand{\Dsetfootnotespacing}{%
+  % Spacing commands executed at the beginning of footnotes.
+  \setlength{\parindent}{0pt}%
+  \hspace{1em}%
+}
+\providecommand{\DNfootnote}[1]{%
+  % See ltfloat.dtx for details.
+  {%
+    \insert\footins{%
+      % BUG: This is too small if the user adds
+      % \onehalfspacing or \doublespace.
+      \vspace{\Dfootnotesep}%
+      \Dsetfootnotespacing%
+      \Dformatfootnote{#1}%
+    }%
+  }%
+}
+\providecommand{\DNcitation}[1]{\DNfootnote{#1}}
+\providecommand{\Dformatfootnotelabel}[1]{%
+  % Keep \footnotesize in footnote labels (\textsuperscript would
+  % reduce the font size even more).
+  \textsuperscript{\footnotesize#1{ }}%
+}
+\providecommand{\Dformatcitationlabel}[1]{{[}#1{]}{ }}
+\providecommand{\Dformatmultiplebackrefs}[1]{%
+  % If in printing mode, do not write out multiple backrefs.
+  \ifthenelse{\equal{\Dprinting}{true}}{}{\textsl{#1}}%
+}
+\providecommand{\Dthislabel}{}
+\providecommand{\DNlabel}[1]{%
+  % Footnote or citatation label.
+  \renewcommand{\Dthislabel}{#1}%
+  \ifthenelse{\not\equal{\DEVsinglebackref}{}}{%
+    \let\Doriginallabel=\Dthislabel%
+    \def\Dthislabel{%
+      \Dsinglefootnotebacklink{\DEVsinglebackref}{\Doriginallabel}%
+    }%
+  }{}%
+  \ifthenelse{\equal{\DEVparent}{footnote}}{%
+    % Footnote label.
+    \Dformatfootnotelabel{\Dthislabel}%
+  }{%
+    \ifthenelse{\equal{\DEVparent}{citation}}{%
+      % Citation label.
+      \Dformatcitationlabel{\Dthislabel}%
+    }{}%
+  }%
+  % If there are multiple backrefs, add them now.
+  \Dformatmultiplebackrefs{\DEVmultiplebackrefs}%
+}
+\providecommand{\Dsinglefootnotebacklink}[2]{%
+  % Create normal backlink of a footnote label.  Parameters:
+  % 1. ID.
+  % 2. Link text.
+  % Treat like a footnote reference.
+  \Dimplicitfootnotereference{\##1}{#2}%
+}
+\providecommand{\DECmultifootnotebacklink}[2]{%
+  % Create generated backlink, as in (1, 2).  Parameters:
+  % 1. ID.
+  % 2. Link text.
+  % Treat like a footnote reference.
+  \Dimplicitfootnotereference{\##1}{#2}%
+}
+\providecommand{\Dsinglecitationbacklink}[2]{\Dsinglefootnotebacklink{#1}{#2}}
+\providecommand{\DECmulticitationbacklink}[2]{\DECmultifootnotebacklink{#1}{#2}}
+
+
+\providecommand{\DECmaketable}[2]{%
+  % Make table.  Parameters:
+  % 1. Table spec (like "|p|p|").
+  % 2. Table contents.
+  {%
+    \ifthenelse{\equal{\Dinsidetabular}{true}}{%
+      % Inside longtable; we cannot have nested longtables.
+      \begin{tabular}{#1}%
+        \hline%
+        #2%
+      \end{tabular}%
+    }{%
+      \renewcommand{\Dinsidetabular}{true}%
+      \begin{longtable}{#1}%
+        \hline%
+        #2%
+      \end{longtable}%
+    }%
+  }%
+}
+\providecommand{\DNthead}[1]{%
+  #1%
+  \endhead%
+}
+\providecommand{\DNrow}[1]{%
+  #1\tabularnewline%
+  \hline%
+}
+\providecommand{\Dinsidemulticolumn}{false}
+\providecommand{\Dcompensatingmulticol}[3]{%
+  \multicolumn{#1}{#2}{%
+    {%
+      \renewcommand{\Dinsidemulticolumn}{true}%
+      % Compensate for weird missing vertical space at top of paragraph.
+      \raisebox{-2.5pt}{#3}%
+    }%
+  }%
+}
+\providecommand{\DECcolspan}[2]{%
+  % Take care of the morecols attribute (but incremented by 1).
+  &%
+  \Dcompensatingmulticol{#1}{l|}{#2}%
+}
+\providecommand{\DECcolspanleft}[2]{%
+  % Like \Dmorecols, but called for the leftmost entries in a table
+  % row.
+  \Dcompensatingmulticol{#1}{|l|}{#2}%
+}
+\providecommand{\DECsubsequententry}[1]{%
+  &#1%
+}
+\providecommand{\DNentry}[1]{%
+  % The following sequence adds minimal vertical space above the top
+  % lines of the first cell paragraph, so that vertical space is
+  % balanced at the top and bottom of table cells.
+  \ifthenelse{\equal{\Dinsidemulticolumn}{false}}{%
+    \vspace{-1em}\vspace{-\parskip}\par%
+  }{}%
+  #1%
+  % No need to add an ampersand ("&"); that's done by \DECsubsequententry.
+}
+\providecommand{\DAtableheaderentry}[5]{\Dformattableheaderentry{#5}}
+\providecommand{\Dformattableheaderentry}[1]{{\bfseries#1}}
+
+
+\providecommand{\DNsystemmessage}[1]{%
+  {%
+    \ifthenelse{\equal{\Dprinting}{false}}{\color{red}}{}%
+    \bfseries%
+    #1%
+  }%
+}
+
+
+\providecommand{\Dinsidehalign}{false}
+\newsavebox{\Dalignedimagebox}
+\Dprovidelength{\Dalignedimagewidth}{0pt}
+\providecommand{\Dhalign}[2]{%
+  % Horizontally align the contents to the left or right so that the
+  % text flows around it.
+  % Parameters:
+  % 1. l or r
+  % 2. Contents.
+  \renewcommand{\Dinsidehalign}{true}%
+  % For some obscure reason \parpic consumes some vertical space.
+  \vspace{-3pt}%
+  % Now we do something *really* ugly, but this enables us to wrap the
+  % image in a minipage while still allowing tight frames when
+  % class=border (see \DNimageCborder).
+  \sbox{\Dalignedimagebox}{#2}%
+  \settowidth{\Dalignedimagewidth}{\usebox{\Dalignedimagebox}}%
+  \parpic[#1]{%
+    \begin{minipage}[b]{\Dalignedimagewidth}%
+      % Compensate for previously added space, but not entirely.
+      \vspace*{2.0pt}%
+      \vspace*{\Dfloatimagetopmargin}%
+      \usebox{\Dalignedimagebox}%
+      \vspace*{1.5pt}%
+      \vspace*{\Dfloatimagebottommargin}%
+    \end{minipage}%
+  }%
+  \renewcommand{\Dinsidehalign}{false}%
+}
+
+
+% Maximum width of an image.
+\providecommand{\Dimagemaxwidth}{\linewidth}
+\providecommand{\Dfloatimagemaxwidth}{0.5\linewidth}
+% Auxiliary variable.
+\Dprovidelength{\Dcurrentimagewidth}{0pt}
+\providecommand{\DNimageAalign}[5]{%
+  \ifthenelse{\equal{#3}{left}}{%
+    \Dhalign{l}{#5}%
+  }{%
+    \ifthenelse{\equal{#3}{right}}{%
+      \Dhalign{r}{#5}%
+    }{%
+      \ifthenelse{\equal{#3}{center}}{%
+        % Text floating around centered figures is a bad idea.  Thus
+        % we use a center environment.  Note that no extra space is
+        % added by the writer, so the space added by the center
+        % environment is fine.
+        \begin{center}#5\end{center}%
+      }{%
+        #5%
+      }%
+    }%
+  }%
+}
+% Base path for images.
+\providecommand{\Dimagebase}{}
+% Auxiliary command.  Current image path.
+\providecommand{\Dimagepath}{}
+\providecommand{\DNimageAuri}[5]{%
+  % Insert image.  We treat the URI like a path here.
+  \renewcommand{\Dimagepath}{\Dimagebase#3}%
+  \Difdefined{DcurrentNimageAwidth}{%
+    \Dwidthimage{\DEVcurrentNimageAwidth}{\Dimagepath}%
+  }{%
+    \Dsimpleimage{\Dimagepath}%
+  }%
+}
+\Dprovidelength{\Dfloatimagevmargin}{0pt}
+\providecommand{\Dfloatimagetopmargin}{\Dfloatimagevmargin}
+\providecommand{\Dfloatimagebottommargin}{\Dfloatimagevmargin}
+\providecommand{\Dwidthimage}[2]{%
+  % Image with specified width.
+  % Parameters:
+  % 1. Image width.
+  % 2. Image path.
+  % Need to make bottom-alignment dependent on align attribute (add
+  % functional test first).  Need to observe height attribute.
+  %\begin{minipage}[b]{#1}%
+    \includegraphics[width=#1,height=\textheight,keepaspectratio]{#2}%
+  %\end{minipage}%
+}  
+\providecommand{\Dcurrentimagemaxwidth}{}
+\providecommand{\Dsimpleimage}[1]{%
+  % Insert image, without much parametrization.
+  \settowidth{\Dcurrentimagewidth}{\includegraphics{#1}}%
+  \ifthenelse{\equal{\Dinsidehalign}{true}}{%
+    \renewcommand{\Dcurrentimagemaxwidth}{\Dfloatimagemaxwidth}%
+  }{%
+    \renewcommand{\Dcurrentimagemaxwidth}{\Dimagemaxwidth}%
+  }%
+  \ifthenelse{\lengthtest{\Dcurrentimagewidth>\Dcurrentimagemaxwidth}}{%
+    \Dwidthimage{\Dcurrentimagemaxwidth}{#1}%
+  }{%
+    \Dwidthimage{\Dcurrentimagewidth}{#1}%
+  }%
+}
+\providecommand{\Dwidthimage}[2]{%
+  % Image with specified width.
+  % Parameters:
+  % 1. Image width.
+  % 2. Image path.
+  \Dwidthimage{#1}{#2}%
+}
+
+% Figures.
+\providecommand{\DNfigureAalign}[5]{%
+  % Hack to make it work Right Now.
+  %\def\DEVcurrentNimageAwidth{\DEVcurrentNfigureAwidth}%
+  %
+    %\def\DEVcurrentNimageAwidth{\linewidth}%
+    \DNimageAalign{#1}{#2}{#3}{#4}{%
+      \begin{minipage}[b]{0.4\linewidth}#5\end{minipage}}%
+    %\let\DEVcurrentNimageAwidth=\relax%
+  %
+  %\let\DEVcurrentNimageAwidth=\relax%
+}
+\providecommand{\DNcaption}[1]{\par\noindent{\slshape#1}}
+\providecommand{\DNlegend}[1]{\DECauxiliaryspace#1}
+
+\providecommand{\DCborder}[1]{\fbox{#1}}
+% No padding between image and border.
+\providecommand{\DNimageCborder}[1]{\frame{#1}}
+
+
+% Need to replace with language-specific stuff.  Maybe look at
+% csquotes.sty and ask the author for permission to use parts of it.
+\providecommand{\DECtextleftdblquote}{``}
+\providecommand{\DECtextrightdblquote}{''}
+
+% Table of contents:
+\Dprovidelength{\Dtocininitialsectnumwidth}{2.4em}
+\Dprovidelength{\Dtocadditionalsectnumwidth}{0.7em}
+% Level inside a table of contents.  While this is at -1, we are not
+% inside a TOC.
+\Dprovidecounter{Dtoclevel}{-1}%
+\providecommand{\Dlocaltoc}{false}%
+\providecommand{\DNtopicClocal}[1]{%
+  \renewcommand{\Dlocaltoc}{true}%
+  \addtolength{\Dtocsectnumwidth}{2\Dtocadditionalsectnumwidth}%
+  \addtolength{\Dtocindent}{-2\Dtocadditionalsectnumwidth}%
+  #1%
+  \addtolength{\Dtocindent}{2\Dtocadditionalsectnumwidth}%
+  \addtolength{\Dtocsectnumwidth}{-2\Dtocadditionalsectnumwidth}%
+  \renewcommand{\Dlocaltoc}{false}%
+}
+\Dprovidelength{\Dtocindent}{0pt}%
+\Dprovidelength{\Dtocsectnumwidth}{\Dtocininitialsectnumwidth}
+% Compensate for one additional TOC indentation space so that the
+% top-level is unindented.
+\addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}
+\addtolength{\Dtocindent}{-\Dtocsectnumwidth}
+\providecommand{\Difinsidetoc}[2]{%
+  \ifthenelse{\not\equal{\theDtoclevel}{-1}}{#1}{#2}%
+}
+\providecommand{\DNgeneratedCsectnum}[1]{%
+  \Difinsidetoc{%
+    % Section number inside TOC.
+    \makebox[\Dtocsectnumwidth][l]{#1}%
+  }{%
+    % Section number inside section title.
+    #1\quad%
+  }%
+}
+\providecommand{\Dtocbulletlist}[1]{%
+  \addtocounter{Dtoclevel}{1}%
+  \addtolength{\Dtocindent}{\Dtocsectnumwidth}%
+  \addtolength{\Dtocsectnumwidth}{\Dtocadditionalsectnumwidth}%
+  #1%
+  \addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}%
+  \addtolength{\Dtocindent}{-\Dtocsectnumwidth}%
+  \addtocounter{Dtoclevel}{-1}%
+}
+
+
+% For \DECpixelunit, the length value is pre-multiplied with 0.75, so by
+% specifying "pt" we get the same notion of "pixel" as graphicx.
+\providecommand{\DECpixelunit}{pt}
+% Normally lengths are relative to the current linewidth.
+\providecommand{\DECrelativeunit}{\linewidth}
+
+
+% ACTION: These commands actually *do* something.
+% Ultimately, everything should be done here, and no active content should be
+% above (not even \usepackage).
+
+\DSearly
+\DSpackages
+\DSfrenchspacing
+\DSsymbols
+\DSlate
+
+\makeatother
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/unicode_map.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,2369 @@
+# $Id$
+# Author: Lea Wiemann <LeWiemann@gmail.com>
+# Copyright: This file has been placed in the public domain.
+
+# This is a mapping of Unicode characters to LaTeX equivalents.
+# The information has been extracted from
+# <http://www.w3.org/2003/entities/xml/unicode.xml>, written by
+# David Carlisle and Sebastian Rahtz.
+#
+# The extraction has been done by the "create_unimap.py" script
+# located at <http://docutils.sf.net/tools/dev/create_unimap.py>.
+
+unicode_map = {u'\xa0': '$~$',
+u'\xa1': '{\\textexclamdown}',
+u'\xa2': '{\\textcent}',
+u'\xa3': '{\\textsterling}',
+u'\xa4': '{\\textcurrency}',
+u'\xa5': '{\\textyen}',
+u'\xa6': '{\\textbrokenbar}',
+u'\xa7': '{\\textsection}',
+u'\xa8': '{\\textasciidieresis}',
+u'\xa9': '{\\textcopyright}',
+u'\xaa': '{\\textordfeminine}',
+u'\xab': '{\\guillemotleft}',
+u'\xac': '$\\lnot$',
+u'\xad': '$\\-$',
+u'\xae': '{\\textregistered}',
+u'\xaf': '{\\textasciimacron}',
+u'\xb0': '{\\textdegree}',
+u'\xb1': '$\\pm$',
+u'\xb2': '${^2}$',
+u'\xb3': '${^3}$',
+u'\xb4': '{\\textasciiacute}',
+u'\xb5': '$\\mathrm{\\mu}$',
+u'\xb6': '{\\textparagraph}',
+u'\xb7': '$\\cdot$',
+u'\xb8': '{\\c{}}',
+u'\xb9': '${^1}$',
+u'\xba': '{\\textordmasculine}',
+u'\xbb': '{\\guillemotright}',
+u'\xbc': '{\\textonequarter}',
+u'\xbd': '{\\textonehalf}',
+u'\xbe': '{\\textthreequarters}',
+u'\xbf': '{\\textquestiondown}',
+u'\xc0': '{\\`{A}}',
+u'\xc1': "{\\'{A}}",
+u'\xc2': '{\\^{A}}',
+u'\xc3': '{\\~{A}}',
+u'\xc4': '{\\"{A}}',
+u'\xc5': '{\\AA}',
+u'\xc6': '{\\AE}',
+u'\xc7': '{\\c{C}}',
+u'\xc8': '{\\`{E}}',
+u'\xc9': "{\\'{E}}",
+u'\xca': '{\\^{E}}',
+u'\xcb': '{\\"{E}}',
+u'\xcc': '{\\`{I}}',
+u'\xcd': "{\\'{I}}",
+u'\xce': '{\\^{I}}',
+u'\xcf': '{\\"{I}}',
+u'\xd0': '{\\DH}',
+u'\xd1': '{\\~{N}}',
+u'\xd2': '{\\`{O}}',
+u'\xd3': "{\\'{O}}",
+u'\xd4': '{\\^{O}}',
+u'\xd5': '{\\~{O}}',
+u'\xd6': '{\\"{O}}',
+u'\xd7': '{\\texttimes}',
+u'\xd8': '{\\O}',
+u'\xd9': '{\\`{U}}',
+u'\xda': "{\\'{U}}",
+u'\xdb': '{\\^{U}}',
+u'\xdc': '{\\"{U}}',
+u'\xdd': "{\\'{Y}}",
+u'\xde': '{\\TH}',
+u'\xdf': '{\\ss}',
+u'\xe0': '{\\`{a}}',
+u'\xe1': "{\\'{a}}",
+u'\xe2': '{\\^{a}}',
+u'\xe3': '{\\~{a}}',
+u'\xe4': '{\\"{a}}',
+u'\xe5': '{\\aa}',
+u'\xe6': '{\\ae}',
+u'\xe7': '{\\c{c}}',
+u'\xe8': '{\\`{e}}',
+u'\xe9': "{\\'{e}}",
+u'\xea': '{\\^{e}}',
+u'\xeb': '{\\"{e}}',
+u'\xec': '{\\`{\\i}}',
+u'\xed': "{\\'{\\i}}",
+u'\xee': '{\\^{\\i}}',
+u'\xef': '{\\"{\\i}}',
+u'\xf0': '{\\dh}',
+u'\xf1': '{\\~{n}}',
+u'\xf2': '{\\`{o}}',
+u'\xf3': "{\\'{o}}",
+u'\xf4': '{\\^{o}}',
+u'\xf5': '{\\~{o}}',
+u'\xf6': '{\\"{o}}',
+u'\xf7': '$\\div$',
+u'\xf8': '{\\o}',
+u'\xf9': '{\\`{u}}',
+u'\xfa': "{\\'{u}}",
+u'\xfb': '{\\^{u}}',
+u'\xfc': '{\\"{u}}',
+u'\xfd': "{\\'{y}}",
+u'\xfe': '{\\th}',
+u'\xff': '{\\"{y}}',
+u'\u0100': '{\\={A}}',
+u'\u0101': '{\\={a}}',
+u'\u0102': '{\\u{A}}',
+u'\u0103': '{\\u{a}}',
+u'\u0104': '{\\k{A}}',
+u'\u0105': '{\\k{a}}',
+u'\u0106': "{\\'{C}}",
+u'\u0107': "{\\'{c}}",
+u'\u0108': '{\\^{C}}',
+u'\u0109': '{\\^{c}}',
+u'\u010a': '{\\.{C}}',
+u'\u010b': '{\\.{c}}',
+u'\u010c': '{\\v{C}}',
+u'\u010d': '{\\v{c}}',
+u'\u010e': '{\\v{D}}',
+u'\u010f': '{\\v{d}}',
+u'\u0110': '{\\DJ}',
+u'\u0111': '{\\dj}',
+u'\u0112': '{\\={E}}',
+u'\u0113': '{\\={e}}',
+u'\u0114': '{\\u{E}}',
+u'\u0115': '{\\u{e}}',
+u'\u0116': '{\\.{E}}',
+u'\u0117': '{\\.{e}}',
+u'\u0118': '{\\k{E}}',
+u'\u0119': '{\\k{e}}',
+u'\u011a': '{\\v{E}}',
+u'\u011b': '{\\v{e}}',
+u'\u011c': '{\\^{G}}',
+u'\u011d': '{\\^{g}}',
+u'\u011e': '{\\u{G}}',
+u'\u011f': '{\\u{g}}',
+u'\u0120': '{\\.{G}}',
+u'\u0121': '{\\.{g}}',
+u'\u0122': '{\\c{G}}',
+u'\u0123': '{\\c{g}}',
+u'\u0124': '{\\^{H}}',
+u'\u0125': '{\\^{h}}',
+u'\u0126': '{{\\fontencoding{LELA}\\selectfont\\char40}}',
+u'\u0127': '$\\Elzxh$',
+u'\u0128': '{\\~{I}}',
+u'\u0129': '{\\~{\\i}}',
+u'\u012a': '{\\={I}}',
+u'\u012b': '{\\={\\i}}',
+u'\u012c': '{\\u{I}}',
+u'\u012d': '{\\u{\\i}}',
+u'\u012e': '{\\k{I}}',
+u'\u012f': '{\\k{i}}',
+u'\u0130': '{\\.{I}}',
+u'\u0131': '{\\i}',
+u'\u0132': '{IJ}',
+u'\u0133': '{ij}',
+u'\u0134': '{\\^{J}}',
+u'\u0135': '{\\^{\\j}}',
+u'\u0136': '{\\c{K}}',
+u'\u0137': '{\\c{k}}',
+u'\u0138': '{{\\fontencoding{LELA}\\selectfont\\char91}}',
+u'\u0139': "{\\'{L}}",
+u'\u013a': "{\\'{l}}",
+u'\u013b': '{\\c{L}}',
+u'\u013c': '{\\c{l}}',
+u'\u013d': '{\\v{L}}',
+u'\u013e': '{\\v{l}}',
+u'\u013f': '{{\\fontencoding{LELA}\\selectfont\\char201}}',
+u'\u0140': '{{\\fontencoding{LELA}\\selectfont\\char202}}',
+u'\u0141': '{\\L}',
+u'\u0142': '{\\l}',
+u'\u0143': "{\\'{N}}",
+u'\u0144': "{\\'{n}}",
+u'\u0145': '{\\c{N}}',
+u'\u0146': '{\\c{n}}',
+u'\u0147': '{\\v{N}}',
+u'\u0148': '{\\v{n}}',
+u'\u0149': "{'n}",
+u'\u014a': '{\\NG}',
+u'\u014b': '{\\ng}',
+u'\u014c': '{\\={O}}',
+u'\u014d': '{\\={o}}',
+u'\u014e': '{\\u{O}}',
+u'\u014f': '{\\u{o}}',
+u'\u0150': '{\\H{O}}',
+u'\u0151': '{\\H{o}}',
+u'\u0152': '{\\OE}',
+u'\u0153': '{\\oe}',
+u'\u0154': "{\\'{R}}",
+u'\u0155': "{\\'{r}}",
+u'\u0156': '{\\c{R}}',
+u'\u0157': '{\\c{r}}',
+u'\u0158': '{\\v{R}}',
+u'\u0159': '{\\v{r}}',
+u'\u015a': "{\\'{S}}",
+u'\u015b': "{\\'{s}}",
+u'\u015c': '{\\^{S}}',
+u'\u015d': '{\\^{s}}',
+u'\u015e': '{\\c{S}}',
+u'\u015f': '{\\c{s}}',
+u'\u0160': '{\\v{S}}',
+u'\u0161': '{\\v{s}}',
+u'\u0162': '{\\c{T}}',
+u'\u0163': '{\\c{t}}',
+u'\u0164': '{\\v{T}}',
+u'\u0165': '{\\v{t}}',
+u'\u0166': '{{\\fontencoding{LELA}\\selectfont\\char47}}',
+u'\u0167': '{{\\fontencoding{LELA}\\selectfont\\char63}}',
+u'\u0168': '{\\~{U}}',
+u'\u0169': '{\\~{u}}',
+u'\u016a': '{\\={U}}',
+u'\u016b': '{\\={u}}',
+u'\u016c': '{\\u{U}}',
+u'\u016d': '{\\u{u}}',
+u'\u016e': '{\\r{U}}',
+u'\u016f': '{\\r{u}}',
+u'\u0170': '{\\H{U}}',
+u'\u0171': '{\\H{u}}',
+u'\u0172': '{\\k{U}}',
+u'\u0173': '{\\k{u}}',
+u'\u0174': '{\\^{W}}',
+u'\u0175': '{\\^{w}}',
+u'\u0176': '{\\^{Y}}',
+u'\u0177': '{\\^{y}}',
+u'\u0178': '{\\"{Y}}',
+u'\u0179': "{\\'{Z}}",
+u'\u017a': "{\\'{z}}",
+u'\u017b': '{\\.{Z}}',
+u'\u017c': '{\\.{z}}',
+u'\u017d': '{\\v{Z}}',
+u'\u017e': '{\\v{z}}',
+u'\u0192': '$f$',
+u'\u0195': '{\\texthvlig}',
+u'\u019e': '{\\textnrleg}',
+u'\u01aa': '$\\eth$',
+u'\u01ba': '{{\\fontencoding{LELA}\\selectfont\\char195}}',
+u'\u01c2': '{\\textdoublepipe}',
+u'\u01f5': "{\\'{g}}",
+u'\u0250': '$\\Elztrna$',
+u'\u0252': '$\\Elztrnsa$',
+u'\u0254': '$\\Elzopeno$',
+u'\u0256': '$\\Elzrtld$',
+u'\u0258': '{{\\fontencoding{LEIP}\\selectfont\\char61}}',
+u'\u0259': '$\\Elzschwa$',
+u'\u025b': '$\\varepsilon$',
+u'\u0261': '{g}',
+u'\u0263': '$\\Elzpgamma$',
+u'\u0264': '$\\Elzpbgam$',
+u'\u0265': '$\\Elztrnh$',
+u'\u026c': '$\\Elzbtdl$',
+u'\u026d': '$\\Elzrtll$',
+u'\u026f': '$\\Elztrnm$',
+u'\u0270': '$\\Elztrnmlr$',
+u'\u0271': '$\\Elzltlmr$',
+u'\u0272': '{\\Elzltln}',
+u'\u0273': '$\\Elzrtln$',
+u'\u0277': '$\\Elzclomeg$',
+u'\u0278': '{\\textphi}',
+u'\u0279': '$\\Elztrnr$',
+u'\u027a': '$\\Elztrnrl$',
+u'\u027b': '$\\Elzrttrnr$',
+u'\u027c': '$\\Elzrl$',
+u'\u027d': '$\\Elzrtlr$',
+u'\u027e': '$\\Elzfhr$',
+u'\u027f': '{{\\fontencoding{LEIP}\\selectfont\\char202}}',
+u'\u0282': '$\\Elzrtls$',
+u'\u0283': '$\\Elzesh$',
+u'\u0287': '$\\Elztrnt$',
+u'\u0288': '$\\Elzrtlt$',
+u'\u028a': '$\\Elzpupsil$',
+u'\u028b': '$\\Elzpscrv$',
+u'\u028c': '$\\Elzinvv$',
+u'\u028d': '$\\Elzinvw$',
+u'\u028e': '$\\Elztrny$',
+u'\u0290': '$\\Elzrtlz$',
+u'\u0292': '$\\Elzyogh$',
+u'\u0294': '$\\Elzglst$',
+u'\u0295': '$\\Elzreglst$',
+u'\u0296': '$\\Elzinglst$',
+u'\u029e': '{\\textturnk}',
+u'\u02a4': '$\\Elzdyogh$',
+u'\u02a7': '$\\Elztesh$',
+u'\u02bc': "{'}",
+u'\u02c7': '{\\textasciicaron}',
+u'\u02c8': '$\\Elzverts$',
+u'\u02cc': '$\\Elzverti$',
+u'\u02d0': '$\\Elzlmrk$',
+u'\u02d1': '$\\Elzhlmrk$',
+u'\u02d2': '$\\Elzsbrhr$',
+u'\u02d3': '$\\Elzsblhr$',
+u'\u02d4': '$\\Elzrais$',
+u'\u02d5': '$\\Elzlow$',
+u'\u02d8': '{\\textasciibreve}',
+u'\u02d9': '{\\textperiodcentered}',
+u'\u02da': '{\\r{}}',
+u'\u02db': '{\\k{}}',
+u'\u02dc': '{\\texttildelow}',
+u'\u02dd': '{\\H{}}',
+u'\u02e5': '{\\tone{55}}',
+u'\u02e6': '{\\tone{44}}',
+u'\u02e7': '{\\tone{33}}',
+u'\u02e8': '{\\tone{22}}',
+u'\u02e9': '{\\tone{11}}',
+u'\u0300': '{\\`}',
+u'\u0301': "{\\'}",
+u'\u0302': '{\\^}',
+u'\u0303': '{\\~}',
+u'\u0304': '{\\=}',
+u'\u0306': '{\\u}',
+u'\u0307': '{\\.}',
+u'\u0308': '{\\"}',
+u'\u030a': '{\\r}',
+u'\u030b': '{\\H}',
+u'\u030c': '{\\v}',
+u'\u030f': '{\\cyrchar\\C}',
+u'\u0311': '{{\\fontencoding{LECO}\\selectfont\\char177}}',
+u'\u0318': '{{\\fontencoding{LECO}\\selectfont\\char184}}',
+u'\u0319': '{{\\fontencoding{LECO}\\selectfont\\char185}}',
+u'\u0321': '$\\Elzpalh$',
+u'\u0322': '{\\Elzrh}',
+u'\u0327': '{\\c}',
+u'\u0328': '{\\k}',
+u'\u032a': '$\\Elzsbbrg$',
+u'\u032b': '{{\\fontencoding{LECO}\\selectfont\\char203}}',
+u'\u032f': '{{\\fontencoding{LECO}\\selectfont\\char207}}',
+u'\u0335': '{\\Elzxl}',
+u'\u0336': '{\\Elzbar}',
+u'\u0337': '{{\\fontencoding{LECO}\\selectfont\\char215}}',
+u'\u0338': '{{\\fontencoding{LECO}\\selectfont\\char216}}',
+u'\u033a': '{{\\fontencoding{LECO}\\selectfont\\char218}}',
+u'\u033b': '{{\\fontencoding{LECO}\\selectfont\\char219}}',
+u'\u033c': '{{\\fontencoding{LECO}\\selectfont\\char220}}',
+u'\u033d': '{{\\fontencoding{LECO}\\selectfont\\char221}}',
+u'\u0361': '{{\\fontencoding{LECO}\\selectfont\\char225}}',
+u'\u0386': "{\\'{A}}",
+u'\u0388': "{\\'{E}}",
+u'\u0389': "{\\'{H}}",
+u'\u038a': "{\\'{}{I}}",
+u'\u038c': "{\\'{}O}",
+u'\u038e': "$\\mathrm{'Y}$",
+u'\u038f': "$\\mathrm{'\\Omega}$",
+u'\u0390': '$\\acute{\\ddot{\\iota}}$',
+u'\u0391': '$\\Alpha$',
+u'\u0392': '$\\Beta$',
+u'\u0393': '$\\Gamma$',
+u'\u0394': '$\\Delta$',
+u'\u0395': '$\\Epsilon$',
+u'\u0396': '$\\Zeta$',
+u'\u0397': '$\\Eta$',
+u'\u0398': '$\\Theta$',
+u'\u0399': '$\\Iota$',
+u'\u039a': '$\\Kappa$',
+u'\u039b': '$\\Lambda$',
+u'\u039c': '$M$',
+u'\u039d': '$N$',
+u'\u039e': '$\\Xi$',
+u'\u039f': '$O$',
+u'\u03a0': '$\\Pi$',
+u'\u03a1': '$\\Rho$',
+u'\u03a3': '$\\Sigma$',
+u'\u03a4': '$\\Tau$',
+u'\u03a5': '$\\Upsilon$',
+u'\u03a6': '$\\Phi$',
+u'\u03a7': '$\\Chi$',
+u'\u03a8': '$\\Psi$',
+u'\u03a9': '$\\Omega$',
+u'\u03aa': '$\\mathrm{\\ddot{I}}$',
+u'\u03ab': '$\\mathrm{\\ddot{Y}}$',
+u'\u03ac': "{\\'{$\\alpha$}}",
+u'\u03ad': '$\\acute{\\epsilon}$',
+u'\u03ae': '$\\acute{\\eta}$',
+u'\u03af': '$\\acute{\\iota}$',
+u'\u03b0': '$\\acute{\\ddot{\\upsilon}}$',
+u'\u03b1': '$\\alpha$',
+u'\u03b2': '$\\beta$',
+u'\u03b3': '$\\gamma$',
+u'\u03b4': '$\\delta$',
+u'\u03b5': '$\\epsilon$',
+u'\u03b6': '$\\zeta$',
+u'\u03b7': '$\\eta$',
+u'\u03b8': '{\\texttheta}',
+u'\u03b9': '$\\iota$',
+u'\u03ba': '$\\kappa$',
+u'\u03bb': '$\\lambda$',
+u'\u03bc': '$\\mu$',
+u'\u03bd': '$\\nu$',
+u'\u03be': '$\\xi$',
+u'\u03bf': '$o$',
+u'\u03c0': '$\\pi$',
+u'\u03c1': '$\\rho$',
+u'\u03c2': '$\\varsigma$',
+u'\u03c3': '$\\sigma$',
+u'\u03c4': '$\\tau$',
+u'\u03c5': '$\\upsilon$',
+u'\u03c6': '$\\varphi$',
+u'\u03c7': '$\\chi$',
+u'\u03c8': '$\\psi$',
+u'\u03c9': '$\\omega$',
+u'\u03ca': '$\\ddot{\\iota}$',
+u'\u03cb': '$\\ddot{\\upsilon}$',
+u'\u03cc': "{\\'{o}}",
+u'\u03cd': '$\\acute{\\upsilon}$',
+u'\u03ce': '$\\acute{\\omega}$',
+u'\u03d0': '{\\Pisymbol{ppi022}{87}}',
+u'\u03d1': '{\\textvartheta}',
+u'\u03d2': '$\\Upsilon$',
+u'\u03d5': '$\\phi$',
+u'\u03d6': '$\\varpi$',
+u'\u03da': '$\\Stigma$',
+u'\u03dc': '$\\Digamma$',
+u'\u03dd': '$\\digamma$',
+u'\u03de': '$\\Koppa$',
+u'\u03e0': '$\\Sampi$',
+u'\u03f0': '$\\varkappa$',
+u'\u03f1': '$\\varrho$',
+u'\u03f4': '{\\textTheta}',
+u'\u03f6': '$\\backepsilon$',
+u'\u0401': '{\\cyrchar\\CYRYO}',
+u'\u0402': '{\\cyrchar\\CYRDJE}',
+u'\u0403': "{\\cyrchar{\\'\\CYRG}}",
+u'\u0404': '{\\cyrchar\\CYRIE}',
+u'\u0405': '{\\cyrchar\\CYRDZE}',
+u'\u0406': '{\\cyrchar\\CYRII}',
+u'\u0407': '{\\cyrchar\\CYRYI}',
+u'\u0408': '{\\cyrchar\\CYRJE}',
+u'\u0409': '{\\cyrchar\\CYRLJE}',
+u'\u040a': '{\\cyrchar\\CYRNJE}',
+u'\u040b': '{\\cyrchar\\CYRTSHE}',
+u'\u040c': "{\\cyrchar{\\'\\CYRK}}",
+u'\u040e': '{\\cyrchar\\CYRUSHRT}',
+u'\u040f': '{\\cyrchar\\CYRDZHE}',
+u'\u0410': '{\\cyrchar\\CYRA}',
+u'\u0411': '{\\cyrchar\\CYRB}',
+u'\u0412': '{\\cyrchar\\CYRV}',
+u'\u0413': '{\\cyrchar\\CYRG}',
+u'\u0414': '{\\cyrchar\\CYRD}',
+u'\u0415': '{\\cyrchar\\CYRE}',
+u'\u0416': '{\\cyrchar\\CYRZH}',
+u'\u0417': '{\\cyrchar\\CYRZ}',
+u'\u0418': '{\\cyrchar\\CYRI}',
+u'\u0419': '{\\cyrchar\\CYRISHRT}',
+u'\u041a': '{\\cyrchar\\CYRK}',
+u'\u041b': '{\\cyrchar\\CYRL}',
+u'\u041c': '{\\cyrchar\\CYRM}',
+u'\u041d': '{\\cyrchar\\CYRN}',
+u'\u041e': '{\\cyrchar\\CYRO}',
+u'\u041f': '{\\cyrchar\\CYRP}',
+u'\u0420': '{\\cyrchar\\CYRR}',
+u'\u0421': '{\\cyrchar\\CYRS}',
+u'\u0422': '{\\cyrchar\\CYRT}',
+u'\u0423': '{\\cyrchar\\CYRU}',
+u'\u0424': '{\\cyrchar\\CYRF}',
+u'\u0425': '{\\cyrchar\\CYRH}',
+u'\u0426': '{\\cyrchar\\CYRC}',
+u'\u0427': '{\\cyrchar\\CYRCH}',
+u'\u0428': '{\\cyrchar\\CYRSH}',
+u'\u0429': '{\\cyrchar\\CYRSHCH}',
+u'\u042a': '{\\cyrchar\\CYRHRDSN}',
+u'\u042b': '{\\cyrchar\\CYRERY}',
+u'\u042c': '{\\cyrchar\\CYRSFTSN}',
+u'\u042d': '{\\cyrchar\\CYREREV}',
+u'\u042e': '{\\cyrchar\\CYRYU}',
+u'\u042f': '{\\cyrchar\\CYRYA}',
+u'\u0430': '{\\cyrchar\\cyra}',
+u'\u0431': '{\\cyrchar\\cyrb}',
+u'\u0432': '{\\cyrchar\\cyrv}',
+u'\u0433': '{\\cyrchar\\cyrg}',
+u'\u0434': '{\\cyrchar\\cyrd}',
+u'\u0435': '{\\cyrchar\\cyre}',
+u'\u0436': '{\\cyrchar\\cyrzh}',
+u'\u0437': '{\\cyrchar\\cyrz}',
+u'\u0438': '{\\cyrchar\\cyri}',
+u'\u0439': '{\\cyrchar\\cyrishrt}',
+u'\u043a': '{\\cyrchar\\cyrk}',
+u'\u043b': '{\\cyrchar\\cyrl}',
+u'\u043c': '{\\cyrchar\\cyrm}',
+u'\u043d': '{\\cyrchar\\cyrn}',
+u'\u043e': '{\\cyrchar\\cyro}',
+u'\u043f': '{\\cyrchar\\cyrp}',
+u'\u0440': '{\\cyrchar\\cyrr}',
+u'\u0441': '{\\cyrchar\\cyrs}',
+u'\u0442': '{\\cyrchar\\cyrt}',
+u'\u0443': '{\\cyrchar\\cyru}',
+u'\u0444': '{\\cyrchar\\cyrf}',
+u'\u0445': '{\\cyrchar\\cyrh}',
+u'\u0446': '{\\cyrchar\\cyrc}',
+u'\u0447': '{\\cyrchar\\cyrch}',
+u'\u0448': '{\\cyrchar\\cyrsh}',
+u'\u0449': '{\\cyrchar\\cyrshch}',
+u'\u044a': '{\\cyrchar\\cyrhrdsn}',
+u'\u044b': '{\\cyrchar\\cyrery}',
+u'\u044c': '{\\cyrchar\\cyrsftsn}',
+u'\u044d': '{\\cyrchar\\cyrerev}',
+u'\u044e': '{\\cyrchar\\cyryu}',
+u'\u044f': '{\\cyrchar\\cyrya}',
+u'\u0451': '{\\cyrchar\\cyryo}',
+u'\u0452': '{\\cyrchar\\cyrdje}',
+u'\u0453': "{\\cyrchar{\\'\\cyrg}}",
+u'\u0454': '{\\cyrchar\\cyrie}',
+u'\u0455': '{\\cyrchar\\cyrdze}',
+u'\u0456': '{\\cyrchar\\cyrii}',
+u'\u0457': '{\\cyrchar\\cyryi}',
+u'\u0458': '{\\cyrchar\\cyrje}',
+u'\u0459': '{\\cyrchar\\cyrlje}',
+u'\u045a': '{\\cyrchar\\cyrnje}',
+u'\u045b': '{\\cyrchar\\cyrtshe}',
+u'\u045c': "{\\cyrchar{\\'\\cyrk}}",
+u'\u045e': '{\\cyrchar\\cyrushrt}',
+u'\u045f': '{\\cyrchar\\cyrdzhe}',
+u'\u0460': '{\\cyrchar\\CYROMEGA}',
+u'\u0461': '{\\cyrchar\\cyromega}',
+u'\u0462': '{\\cyrchar\\CYRYAT}',
+u'\u0464': '{\\cyrchar\\CYRIOTE}',
+u'\u0465': '{\\cyrchar\\cyriote}',
+u'\u0466': '{\\cyrchar\\CYRLYUS}',
+u'\u0467': '{\\cyrchar\\cyrlyus}',
+u'\u0468': '{\\cyrchar\\CYRIOTLYUS}',
+u'\u0469': '{\\cyrchar\\cyriotlyus}',
+u'\u046a': '{\\cyrchar\\CYRBYUS}',
+u'\u046c': '{\\cyrchar\\CYRIOTBYUS}',
+u'\u046d': '{\\cyrchar\\cyriotbyus}',
+u'\u046e': '{\\cyrchar\\CYRKSI}',
+u'\u046f': '{\\cyrchar\\cyrksi}',
+u'\u0470': '{\\cyrchar\\CYRPSI}',
+u'\u0471': '{\\cyrchar\\cyrpsi}',
+u'\u0472': '{\\cyrchar\\CYRFITA}',
+u'\u0474': '{\\cyrchar\\CYRIZH}',
+u'\u0478': '{\\cyrchar\\CYRUK}',
+u'\u0479': '{\\cyrchar\\cyruk}',
+u'\u047a': '{\\cyrchar\\CYROMEGARND}',
+u'\u047b': '{\\cyrchar\\cyromegarnd}',
+u'\u047c': '{\\cyrchar\\CYROMEGATITLO}',
+u'\u047d': '{\\cyrchar\\cyromegatitlo}',
+u'\u047e': '{\\cyrchar\\CYROT}',
+u'\u047f': '{\\cyrchar\\cyrot}',
+u'\u0480': '{\\cyrchar\\CYRKOPPA}',
+u'\u0481': '{\\cyrchar\\cyrkoppa}',
+u'\u0482': '{\\cyrchar\\cyrthousands}',
+u'\u0488': '{\\cyrchar\\cyrhundredthousands}',
+u'\u0489': '{\\cyrchar\\cyrmillions}',
+u'\u048c': '{\\cyrchar\\CYRSEMISFTSN}',
+u'\u048d': '{\\cyrchar\\cyrsemisftsn}',
+u'\u048e': '{\\cyrchar\\CYRRTICK}',
+u'\u048f': '{\\cyrchar\\cyrrtick}',
+u'\u0490': '{\\cyrchar\\CYRGUP}',
+u'\u0491': '{\\cyrchar\\cyrgup}',
+u'\u0492': '{\\cyrchar\\CYRGHCRS}',
+u'\u0493': '{\\cyrchar\\cyrghcrs}',
+u'\u0494': '{\\cyrchar\\CYRGHK}',
+u'\u0495': '{\\cyrchar\\cyrghk}',
+u'\u0496': '{\\cyrchar\\CYRZHDSC}',
+u'\u0497': '{\\cyrchar\\cyrzhdsc}',
+u'\u0498': '{\\cyrchar\\CYRZDSC}',
+u'\u0499': '{\\cyrchar\\cyrzdsc}',
+u'\u049a': '{\\cyrchar\\CYRKDSC}',
+u'\u049b': '{\\cyrchar\\cyrkdsc}',
+u'\u049c': '{\\cyrchar\\CYRKVCRS}',
+u'\u049d': '{\\cyrchar\\cyrkvcrs}',
+u'\u049e': '{\\cyrchar\\CYRKHCRS}',
+u'\u049f': '{\\cyrchar\\cyrkhcrs}',
+u'\u04a0': '{\\cyrchar\\CYRKBEAK}',
+u'\u04a1': '{\\cyrchar\\cyrkbeak}',
+u'\u04a2': '{\\cyrchar\\CYRNDSC}',
+u'\u04a3': '{\\cyrchar\\cyrndsc}',
+u'\u04a4': '{\\cyrchar\\CYRNG}',
+u'\u04a5': '{\\cyrchar\\cyrng}',
+u'\u04a6': '{\\cyrchar\\CYRPHK}',
+u'\u04a7': '{\\cyrchar\\cyrphk}',
+u'\u04a8': '{\\cyrchar\\CYRABHHA}',
+u'\u04a9': '{\\cyrchar\\cyrabhha}',
+u'\u04aa': '{\\cyrchar\\CYRSDSC}',
+u'\u04ab': '{\\cyrchar\\cyrsdsc}',
+u'\u04ac': '{\\cyrchar\\CYRTDSC}',
+u'\u04ad': '{\\cyrchar\\cyrtdsc}',
+u'\u04ae': '{\\cyrchar\\CYRY}',
+u'\u04af': '{\\cyrchar\\cyry}',
+u'\u04b0': '{\\cyrchar\\CYRYHCRS}',
+u'\u04b1': '{\\cyrchar\\cyryhcrs}',
+u'\u04b2': '{\\cyrchar\\CYRHDSC}',
+u'\u04b3': '{\\cyrchar\\cyrhdsc}',
+u'\u04b4': '{\\cyrchar\\CYRTETSE}',
+u'\u04b5': '{\\cyrchar\\cyrtetse}',
+u'\u04b6': '{\\cyrchar\\CYRCHRDSC}',
+u'\u04b7': '{\\cyrchar\\cyrchrdsc}',
+u'\u04b8': '{\\cyrchar\\CYRCHVCRS}',
+u'\u04b9': '{\\cyrchar\\cyrchvcrs}',
+u'\u04ba': '{\\cyrchar\\CYRSHHA}',
+u'\u04bb': '{\\cyrchar\\cyrshha}',
+u'\u04bc': '{\\cyrchar\\CYRABHCH}',
+u'\u04bd': '{\\cyrchar\\cyrabhch}',
+u'\u04be': '{\\cyrchar\\CYRABHCHDSC}',
+u'\u04bf': '{\\cyrchar\\cyrabhchdsc}',
+u'\u04c0': '{\\cyrchar\\CYRpalochka}',
+u'\u04c3': '{\\cyrchar\\CYRKHK}',
+u'\u04c4': '{\\cyrchar\\cyrkhk}',
+u'\u04c7': '{\\cyrchar\\CYRNHK}',
+u'\u04c8': '{\\cyrchar\\cyrnhk}',
+u'\u04cb': '{\\cyrchar\\CYRCHLDSC}',
+u'\u04cc': '{\\cyrchar\\cyrchldsc}',
+u'\u04d4': '{\\cyrchar\\CYRAE}',
+u'\u04d5': '{\\cyrchar\\cyrae}',
+u'\u04d8': '{\\cyrchar\\CYRSCHWA}',
+u'\u04d9': '{\\cyrchar\\cyrschwa}',
+u'\u04e0': '{\\cyrchar\\CYRABHDZE}',
+u'\u04e1': '{\\cyrchar\\cyrabhdze}',
+u'\u04e8': '{\\cyrchar\\CYROTLD}',
+u'\u04e9': '{\\cyrchar\\cyrotld}',
+u'\u2002': '{\\hspace{0.6em}}',
+u'\u2003': '{\\hspace{1em}}',
+u'\u2004': '{\\hspace{0.33em}}',
+u'\u2005': '{\\hspace{0.25em}}',
+u'\u2006': '{\\hspace{0.166em}}',
+u'\u2007': '{\\hphantom{0}}',
+u'\u2008': '{\\hphantom{,}}',
+u'\u2009': '{\\hspace{0.167em}}',
+u'\u200a': '$\\mkern1mu$',
+u'\u2010': '{-}',
+u'\u2013': '{\\textendash}',
+u'\u2014': '{\\textemdash}',
+u'\u2015': '{\\rule{1em}{1pt}}',
+u'\u2016': '$\\Vert$',
+u'\u2018': '{`}',
+u'\u2019': "{'}",
+u'\u201a': '{,}',
+u'\u201b': '$\\Elzreapos$',
+u'\u201c': '{\\textquotedblleft}',
+u'\u201d': '{\\textquotedblright}',
+u'\u201e': '{,,}',
+u'\u2020': '{\\textdagger}',
+u'\u2021': '{\\textdaggerdbl}',
+u'\u2022': '{\\textbullet}',
+u'\u2024': '{.}',
+u'\u2025': '{..}',
+u'\u2026': '{\\ldots}',
+u'\u2030': '{\\textperthousand}',
+u'\u2031': '{\\textpertenthousand}',
+u'\u2032': "${'}$",
+u'\u2033': "${''}$",
+u'\u2034': "${'''}$",
+u'\u2035': '$\\backprime$',
+u'\u2039': '{\\guilsinglleft}',
+u'\u203a': '{\\guilsinglright}',
+u'\u2057': "$''''$",
+u'\u205f': '{\\mkern4mu}',
+u'\u2060': '{\\nolinebreak}',
+u'\u20a7': '{\\ensuremath{\\Elzpes}}',
+u'\u20ac': '{\\mbox{\\texteuro}}',
+u'\u20db': '$\\dddot$',
+u'\u20dc': '$\\ddddot$',
+u'\u2102': '$\\mathbb{C}$',
+u'\u210a': '{\\mathscr{g}}',
+u'\u210b': '$\\mathscr{H}$',
+u'\u210c': '$\\mathfrak{H}$',
+u'\u210d': '$\\mathbb{H}$',
+u'\u210f': '$\\hslash$',
+u'\u2110': '$\\mathscr{I}$',
+u'\u2111': '$\\mathfrak{I}$',
+u'\u2112': '$\\mathscr{L}$',
+u'\u2113': '$\\mathscr{l}$',
+u'\u2115': '$\\mathbb{N}$',
+u'\u2116': '{\\cyrchar\\textnumero}',
+u'\u2118': '$\\wp$',
+u'\u2119': '$\\mathbb{P}$',
+u'\u211a': '$\\mathbb{Q}$',
+u'\u211b': '$\\mathscr{R}$',
+u'\u211c': '$\\mathfrak{R}$',
+u'\u211d': '$\\mathbb{R}$',
+u'\u211e': '$\\Elzxrat$',
+u'\u2122': '{\\texttrademark}',
+u'\u2124': '$\\mathbb{Z}$',
+u'\u2126': '$\\Omega$',
+u'\u2127': '$\\mho$',
+u'\u2128': '$\\mathfrak{Z}$',
+u'\u2129': '$\\ElsevierGlyph{2129}$',
+u'\u212b': '{\\AA}',
+u'\u212c': '$\\mathscr{B}$',
+u'\u212d': '$\\mathfrak{C}$',
+u'\u212f': '$\\mathscr{e}$',
+u'\u2130': '$\\mathscr{E}$',
+u'\u2131': '$\\mathscr{F}$',
+u'\u2133': '$\\mathscr{M}$',
+u'\u2134': '$\\mathscr{o}$',
+u'\u2135': '$\\aleph$',
+u'\u2136': '$\\beth$',
+u'\u2137': '$\\gimel$',
+u'\u2138': '$\\daleth$',
+u'\u2153': '$\\textfrac{1}{3}$',
+u'\u2154': '$\\textfrac{2}{3}$',
+u'\u2155': '$\\textfrac{1}{5}$',
+u'\u2156': '$\\textfrac{2}{5}$',
+u'\u2157': '$\\textfrac{3}{5}$',
+u'\u2158': '$\\textfrac{4}{5}$',
+u'\u2159': '$\\textfrac{1}{6}$',
+u'\u215a': '$\\textfrac{5}{6}$',
+u'\u215b': '$\\textfrac{1}{8}$',
+u'\u215c': '$\\textfrac{3}{8}$',
+u'\u215d': '$\\textfrac{5}{8}$',
+u'\u215e': '$\\textfrac{7}{8}$',
+u'\u2190': '$\\leftarrow$',
+u'\u2191': '$\\uparrow$',
+u'\u2192': '$\\rightarrow$',
+u'\u2193': '$\\downarrow$',
+u'\u2194': '$\\leftrightarrow$',
+u'\u2195': '$\\updownarrow$',
+u'\u2196': '$\\nwarrow$',
+u'\u2197': '$\\nearrow$',
+u'\u2198': '$\\searrow$',
+u'\u2199': '$\\swarrow$',
+u'\u219a': '$\\nleftarrow$',
+u'\u219b': '$\\nrightarrow$',
+u'\u219c': '$\\arrowwaveright$',
+u'\u219d': '$\\arrowwaveright$',
+u'\u219e': '$\\twoheadleftarrow$',
+u'\u21a0': '$\\twoheadrightarrow$',
+u'\u21a2': '$\\leftarrowtail$',
+u'\u21a3': '$\\rightarrowtail$',
+u'\u21a6': '$\\mapsto$',
+u'\u21a9': '$\\hookleftarrow$',
+u'\u21aa': '$\\hookrightarrow$',
+u'\u21ab': '$\\looparrowleft$',
+u'\u21ac': '$\\looparrowright$',
+u'\u21ad': '$\\leftrightsquigarrow$',
+u'\u21ae': '$\\nleftrightarrow$',
+u'\u21b0': '$\\Lsh$',
+u'\u21b1': '$\\Rsh$',
+u'\u21b3': '$\\ElsevierGlyph{21B3}$',
+u'\u21b6': '$\\curvearrowleft$',
+u'\u21b7': '$\\curvearrowright$',
+u'\u21ba': '$\\circlearrowleft$',
+u'\u21bb': '$\\circlearrowright$',
+u'\u21bc': '$\\leftharpoonup$',
+u'\u21bd': '$\\leftharpoondown$',
+u'\u21be': '$\\upharpoonright$',
+u'\u21bf': '$\\upharpoonleft$',
+u'\u21c0': '$\\rightharpoonup$',
+u'\u21c1': '$\\rightharpoondown$',
+u'\u21c2': '$\\downharpoonright$',
+u'\u21c3': '$\\downharpoonleft$',
+u'\u21c4': '$\\rightleftarrows$',
+u'\u21c5': '$\\dblarrowupdown$',
+u'\u21c6': '$\\leftrightarrows$',
+u'\u21c7': '$\\leftleftarrows$',
+u'\u21c8': '$\\upuparrows$',
+u'\u21c9': '$\\rightrightarrows$',
+u'\u21ca': '$\\downdownarrows$',
+u'\u21cb': '$\\leftrightharpoons$',
+u'\u21cc': '$\\rightleftharpoons$',
+u'\u21cd': '$\\nLeftarrow$',
+u'\u21ce': '$\\nLeftrightarrow$',
+u'\u21cf': '$\\nRightarrow$',
+u'\u21d0': '$\\Leftarrow$',
+u'\u21d1': '$\\Uparrow$',
+u'\u21d2': '$\\Rightarrow$',
+u'\u21d3': '$\\Downarrow$',
+u'\u21d4': '$\\Leftrightarrow$',
+u'\u21d5': '$\\Updownarrow$',
+u'\u21da': '$\\Lleftarrow$',
+u'\u21db': '$\\Rrightarrow$',
+u'\u21dd': '$\\rightsquigarrow$',
+u'\u21f5': '$\\DownArrowUpArrow$',
+u'\u2200': '$\\forall$',
+u'\u2201': '$\\complement$',
+u'\u2202': '$\\partial$',
+u'\u2203': '$\\exists$',
+u'\u2204': '$\\nexists$',
+u'\u2205': '$\\varnothing$',
+u'\u2207': '$\\nabla$',
+u'\u2208': '$\\in$',
+u'\u2209': '$\\not\\in$',
+u'\u220b': '$\\ni$',
+u'\u220c': '$\\not\\ni$',
+u'\u220f': '$\\prod$',
+u'\u2210': '$\\coprod$',
+u'\u2211': '$\\sum$',
+u'\u2212': '{-}',
+u'\u2213': '$\\mp$',
+u'\u2214': '$\\dotplus$',
+u'\u2216': '$\\setminus$',
+u'\u2217': '${_\\ast}$',
+u'\u2218': '$\\circ$',
+u'\u2219': '$\\bullet$',
+u'\u221a': '$\\surd$',
+u'\u221d': '$\\propto$',
+u'\u221e': '$\\infty$',
+u'\u221f': '$\\rightangle$',
+u'\u2220': '$\\angle$',
+u'\u2221': '$\\measuredangle$',
+u'\u2222': '$\\sphericalangle$',
+u'\u2223': '$\\mid$',
+u'\u2224': '$\\nmid$',
+u'\u2225': '$\\parallel$',
+u'\u2226': '$\\nparallel$',
+u'\u2227': '$\\wedge$',
+u'\u2228': '$\\vee$',
+u'\u2229': '$\\cap$',
+u'\u222a': '$\\cup$',
+u'\u222b': '$\\int$',
+u'\u222c': '$\\int\\!\\int$',
+u'\u222d': '$\\int\\!\\int\\!\\int$',
+u'\u222e': '$\\oint$',
+u'\u222f': '$\\surfintegral$',
+u'\u2230': '$\\volintegral$',
+u'\u2231': '$\\clwintegral$',
+u'\u2232': '$\\ElsevierGlyph{2232}$',
+u'\u2233': '$\\ElsevierGlyph{2233}$',
+u'\u2234': '$\\therefore$',
+u'\u2235': '$\\because$',
+u'\u2237': '$\\Colon$',
+u'\u2238': '$\\ElsevierGlyph{2238}$',
+u'\u223a': '$\\mathbin{{:}\\!\\!{-}\\!\\!{:}}$',
+u'\u223b': '$\\homothetic$',
+u'\u223c': '$\\sim$',
+u'\u223d': '$\\backsim$',
+u'\u223e': '$\\lazysinv$',
+u'\u2240': '$\\wr$',
+u'\u2241': '$\\not\\sim$',
+u'\u2242': '$\\ElsevierGlyph{2242}$',
+u'\u2243': '$\\simeq$',
+u'\u2244': '$\\not\\simeq$',
+u'\u2245': '$\\cong$',
+u'\u2246': '$\\approxnotequal$',
+u'\u2247': '$\\not\\cong$',
+u'\u2248': '$\\approx$',
+u'\u2249': '$\\not\\approx$',
+u'\u224a': '$\\approxeq$',
+u'\u224b': '$\\tildetrpl$',
+u'\u224c': '$\\allequal$',
+u'\u224d': '$\\asymp$',
+u'\u224e': '$\\Bumpeq$',
+u'\u224f': '$\\bumpeq$',
+u'\u2250': '$\\doteq$',
+u'\u2251': '$\\doteqdot$',
+u'\u2252': '$\\fallingdotseq$',
+u'\u2253': '$\\risingdotseq$',
+u'\u2254': '{:=}',
+u'\u2255': '$=:$',
+u'\u2256': '$\\eqcirc$',
+u'\u2257': '$\\circeq$',
+u'\u2259': '$\\estimates$',
+u'\u225a': '$\\ElsevierGlyph{225A}$',
+u'\u225b': '$\\starequal$',
+u'\u225c': '$\\triangleq$',
+u'\u225f': '$\\ElsevierGlyph{225F}$',
+u'\u2260': '$\\not =$',
+u'\u2261': '$\\equiv$',
+u'\u2262': '$\\not\\equiv$',
+u'\u2264': '$\\leq$',
+u'\u2265': '$\\geq$',
+u'\u2266': '$\\leqq$',
+u'\u2267': '$\\geqq$',
+u'\u2268': '$\\lneqq$',
+u'\u2269': '$\\gneqq$',
+u'\u226a': '$\\ll$',
+u'\u226b': '$\\gg$',
+u'\u226c': '$\\between$',
+u'\u226d': '$\\not\\kern-0.3em\\times$',
+u'\u226e': '$\\not<$',
+u'\u226f': '$\\not>$',
+u'\u2270': '$\\not\\leq$',
+u'\u2271': '$\\not\\geq$',
+u'\u2272': '$\\lessequivlnt$',
+u'\u2273': '$\\greaterequivlnt$',
+u'\u2274': '$\\ElsevierGlyph{2274}$',
+u'\u2275': '$\\ElsevierGlyph{2275}$',
+u'\u2276': '$\\lessgtr$',
+u'\u2277': '$\\gtrless$',
+u'\u2278': '$\\notlessgreater$',
+u'\u2279': '$\\notgreaterless$',
+u'\u227a': '$\\prec$',
+u'\u227b': '$\\succ$',
+u'\u227c': '$\\preccurlyeq$',
+u'\u227d': '$\\succcurlyeq$',
+u'\u227e': '$\\precapprox$',
+u'\u227f': '$\\succapprox$',
+u'\u2280': '$\\not\\prec$',
+u'\u2281': '$\\not\\succ$',
+u'\u2282': '$\\subset$',
+u'\u2283': '$\\supset$',
+u'\u2284': '$\\not\\subset$',
+u'\u2285': '$\\not\\supset$',
+u'\u2286': '$\\subseteq$',
+u'\u2287': '$\\supseteq$',
+u'\u2288': '$\\not\\subseteq$',
+u'\u2289': '$\\not\\supseteq$',
+u'\u228a': '$\\subsetneq$',
+u'\u228b': '$\\supsetneq$',
+u'\u228e': '$\\uplus$',
+u'\u228f': '$\\sqsubset$',
+u'\u2290': '$\\sqsupset$',
+u'\u2291': '$\\sqsubseteq$',
+u'\u2292': '$\\sqsupseteq$',
+u'\u2293': '$\\sqcap$',
+u'\u2294': '$\\sqcup$',
+u'\u2295': '$\\oplus$',
+u'\u2296': '$\\ominus$',
+u'\u2297': '$\\otimes$',
+u'\u2298': '$\\oslash$',
+u'\u2299': '$\\odot$',
+u'\u229a': '$\\circledcirc$',
+u'\u229b': '$\\circledast$',
+u'\u229d': '$\\circleddash$',
+u'\u229e': '$\\boxplus$',
+u'\u229f': '$\\boxminus$',
+u'\u22a0': '$\\boxtimes$',
+u'\u22a1': '$\\boxdot$',
+u'\u22a2': '$\\vdash$',
+u'\u22a3': '$\\dashv$',
+u'\u22a4': '$\\top$',
+u'\u22a5': '$\\perp$',
+u'\u22a7': '$\\truestate$',
+u'\u22a8': '$\\forcesextra$',
+u'\u22a9': '$\\Vdash$',
+u'\u22aa': '$\\Vvdash$',
+u'\u22ab': '$\\VDash$',
+u'\u22ac': '$\\nvdash$',
+u'\u22ad': '$\\nvDash$',
+u'\u22ae': '$\\nVdash$',
+u'\u22af': '$\\nVDash$',
+u'\u22b2': '$\\vartriangleleft$',
+u'\u22b3': '$\\vartriangleright$',
+u'\u22b4': '$\\trianglelefteq$',
+u'\u22b5': '$\\trianglerighteq$',
+u'\u22b6': '$\\original$',
+u'\u22b7': '$\\image$',
+u'\u22b8': '$\\multimap$',
+u'\u22b9': '$\\hermitconjmatrix$',
+u'\u22ba': '$\\intercal$',
+u'\u22bb': '$\\veebar$',
+u'\u22be': '$\\rightanglearc$',
+u'\u22c0': '$\\ElsevierGlyph{22C0}$',
+u'\u22c1': '$\\ElsevierGlyph{22C1}$',
+u'\u22c2': '$\\bigcap$',
+u'\u22c3': '$\\bigcup$',
+u'\u22c4': '$\\diamond$',
+u'\u22c5': '$\\cdot$',
+u'\u22c6': '$\\star$',
+u'\u22c7': '$\\divideontimes$',
+u'\u22c8': '$\\bowtie$',
+u'\u22c9': '$\\ltimes$',
+u'\u22ca': '$\\rtimes$',
+u'\u22cb': '$\\leftthreetimes$',
+u'\u22cc': '$\\rightthreetimes$',
+u'\u22cd': '$\\backsimeq$',
+u'\u22ce': '$\\curlyvee$',
+u'\u22cf': '$\\curlywedge$',
+u'\u22d0': '$\\Subset$',
+u'\u22d1': '$\\Supset$',
+u'\u22d2': '$\\Cap$',
+u'\u22d3': '$\\Cup$',
+u'\u22d4': '$\\pitchfork$',
+u'\u22d6': '$\\lessdot$',
+u'\u22d7': '$\\gtrdot$',
+u'\u22d8': '$\\verymuchless$',
+u'\u22d9': '$\\verymuchgreater$',
+u'\u22da': '$\\lesseqgtr$',
+u'\u22db': '$\\gtreqless$',
+u'\u22de': '$\\curlyeqprec$',
+u'\u22df': '$\\curlyeqsucc$',
+u'\u22e2': '$\\not\\sqsubseteq$',
+u'\u22e3': '$\\not\\sqsupseteq$',
+u'\u22e5': '$\\Elzsqspne$',
+u'\u22e6': '$\\lnsim$',
+u'\u22e7': '$\\gnsim$',
+u'\u22e8': '$\\precedesnotsimilar$',
+u'\u22e9': '$\\succnsim$',
+u'\u22ea': '$\\ntriangleleft$',
+u'\u22eb': '$\\ntriangleright$',
+u'\u22ec': '$\\ntrianglelefteq$',
+u'\u22ed': '$\\ntrianglerighteq$',
+u'\u22ee': '$\\vdots$',
+u'\u22ef': '$\\cdots$',
+u'\u22f0': '$\\upslopeellipsis$',
+u'\u22f1': '$\\downslopeellipsis$',
+u'\u2305': '{\\barwedge}',
+u'\u2306': '$\\perspcorrespond$',
+u'\u2308': '$\\lceil$',
+u'\u2309': '$\\rceil$',
+u'\u230a': '$\\lfloor$',
+u'\u230b': '$\\rfloor$',
+u'\u2315': '$\\recorder$',
+u'\u2316': '$\\mathchar"2208$',
+u'\u231c': '$\\ulcorner$',
+u'\u231d': '$\\urcorner$',
+u'\u231e': '$\\llcorner$',
+u'\u231f': '$\\lrcorner$',
+u'\u2322': '$\\frown$',
+u'\u2323': '$\\smile$',
+u'\u2329': '$\\langle$',
+u'\u232a': '$\\rangle$',
+u'\u233d': '$\\ElsevierGlyph{E838}$',
+u'\u23a3': '$\\Elzdlcorn$',
+u'\u23b0': '$\\lmoustache$',
+u'\u23b1': '$\\rmoustache$',
+u'\u2423': '{\\textvisiblespace}',
+u'\u2460': '{\\ding{172}}',
+u'\u2461': '{\\ding{173}}',
+u'\u2462': '{\\ding{174}}',
+u'\u2463': '{\\ding{175}}',
+u'\u2464': '{\\ding{176}}',
+u'\u2465': '{\\ding{177}}',
+u'\u2466': '{\\ding{178}}',
+u'\u2467': '{\\ding{179}}',
+u'\u2468': '{\\ding{180}}',
+u'\u2469': '{\\ding{181}}',
+u'\u24c8': '$\\circledS$',
+u'\u2506': '$\\Elzdshfnc$',
+u'\u2519': '$\\Elzsqfnw$',
+u'\u2571': '$\\diagup$',
+u'\u25a0': '{\\ding{110}}',
+u'\u25a1': '$\\square$',
+u'\u25aa': '$\\blacksquare$',
+u'\u25ad': '$\\fbox{~~}$',
+u'\u25af': '$\\Elzvrecto$',
+u'\u25b1': '$\\ElsevierGlyph{E381}$',
+u'\u25b2': '{\\ding{115}}',
+u'\u25b3': '$\\bigtriangleup$',
+u'\u25b4': '$\\blacktriangle$',
+u'\u25b5': '$\\vartriangle$',
+u'\u25b8': '$\\blacktriangleright$',
+u'\u25b9': '$\\triangleright$',
+u'\u25bc': '{\\ding{116}}',
+u'\u25bd': '$\\bigtriangledown$',
+u'\u25be': '$\\blacktriangledown$',
+u'\u25bf': '$\\triangledown$',
+u'\u25c2': '$\\blacktriangleleft$',
+u'\u25c3': '$\\triangleleft$',
+u'\u25c6': '{\\ding{117}}',
+u'\u25ca': '$\\lozenge$',
+u'\u25cb': '$\\bigcirc$',
+u'\u25cf': '{\\ding{108}}',
+u'\u25d0': '$\\Elzcirfl$',
+u'\u25d1': '$\\Elzcirfr$',
+u'\u25d2': '$\\Elzcirfb$',
+u'\u25d7': '{\\ding{119}}',
+u'\u25d8': '$\\Elzrvbull$',
+u'\u25e7': '$\\Elzsqfl$',
+u'\u25e8': '$\\Elzsqfr$',
+u'\u25ea': '$\\Elzsqfse$',
+u'\u25ef': '$\\bigcirc$',
+u'\u2605': '{\\ding{72}}',
+u'\u2606': '{\\ding{73}}',
+u'\u260e': '{\\ding{37}}',
+u'\u261b': '{\\ding{42}}',
+u'\u261e': '{\\ding{43}}',
+u'\u263e': '{\\rightmoon}',
+u'\u263f': '{\\mercury}',
+u'\u2640': '{\\venus}',
+u'\u2642': '{\\male}',
+u'\u2643': '{\\jupiter}',
+u'\u2644': '{\\saturn}',
+u'\u2645': '{\\uranus}',
+u'\u2646': '{\\neptune}',
+u'\u2647': '{\\pluto}',
+u'\u2648': '{\\aries}',
+u'\u2649': '{\\taurus}',
+u'\u264a': '{\\gemini}',
+u'\u264b': '{\\cancer}',
+u'\u264c': '{\\leo}',
+u'\u264d': '{\\virgo}',
+u'\u264e': '{\\libra}',
+u'\u264f': '{\\scorpio}',
+u'\u2650': '{\\sagittarius}',
+u'\u2651': '{\\capricornus}',
+u'\u2652': '{\\aquarius}',
+u'\u2653': '{\\pisces}',
+u'\u2660': '{\\ding{171}}',
+u'\u2662': '$\\diamond$',
+u'\u2663': '{\\ding{168}}',
+u'\u2665': '{\\ding{170}}',
+u'\u2666': '{\\ding{169}}',
+u'\u2669': '{\\quarternote}',
+u'\u266a': '{\\eighthnote}',
+u'\u266d': '$\\flat$',
+u'\u266e': '$\\natural$',
+u'\u266f': '$\\sharp$',
+u'\u2701': '{\\ding{33}}',
+u'\u2702': '{\\ding{34}}',
+u'\u2703': '{\\ding{35}}',
+u'\u2704': '{\\ding{36}}',
+u'\u2706': '{\\ding{38}}',
+u'\u2707': '{\\ding{39}}',
+u'\u2708': '{\\ding{40}}',
+u'\u2709': '{\\ding{41}}',
+u'\u270c': '{\\ding{44}}',
+u'\u270d': '{\\ding{45}}',
+u'\u270e': '{\\ding{46}}',
+u'\u270f': '{\\ding{47}}',
+u'\u2710': '{\\ding{48}}',
+u'\u2711': '{\\ding{49}}',
+u'\u2712': '{\\ding{50}}',
+u'\u2713': '{\\ding{51}}',
+u'\u2714': '{\\ding{52}}',
+u'\u2715': '{\\ding{53}}',
+u'\u2716': '{\\ding{54}}',
+u'\u2717': '{\\ding{55}}',
+u'\u2718': '{\\ding{56}}',
+u'\u2719': '{\\ding{57}}',
+u'\u271a': '{\\ding{58}}',
+u'\u271b': '{\\ding{59}}',
+u'\u271c': '{\\ding{60}}',
+u'\u271d': '{\\ding{61}}',
+u'\u271e': '{\\ding{62}}',
+u'\u271f': '{\\ding{63}}',
+u'\u2720': '{\\ding{64}}',
+u'\u2721': '{\\ding{65}}',
+u'\u2722': '{\\ding{66}}',
+u'\u2723': '{\\ding{67}}',
+u'\u2724': '{\\ding{68}}',
+u'\u2725': '{\\ding{69}}',
+u'\u2726': '{\\ding{70}}',
+u'\u2727': '{\\ding{71}}',
+u'\u2729': '{\\ding{73}}',
+u'\u272a': '{\\ding{74}}',
+u'\u272b': '{\\ding{75}}',
+u'\u272c': '{\\ding{76}}',
+u'\u272d': '{\\ding{77}}',
+u'\u272e': '{\\ding{78}}',
+u'\u272f': '{\\ding{79}}',
+u'\u2730': '{\\ding{80}}',
+u'\u2731': '{\\ding{81}}',
+u'\u2732': '{\\ding{82}}',
+u'\u2733': '{\\ding{83}}',
+u'\u2734': '{\\ding{84}}',
+u'\u2735': '{\\ding{85}}',
+u'\u2736': '{\\ding{86}}',
+u'\u2737': '{\\ding{87}}',
+u'\u2738': '{\\ding{88}}',
+u'\u2739': '{\\ding{89}}',
+u'\u273a': '{\\ding{90}}',
+u'\u273b': '{\\ding{91}}',
+u'\u273c': '{\\ding{92}}',
+u'\u273d': '{\\ding{93}}',
+u'\u273e': '{\\ding{94}}',
+u'\u273f': '{\\ding{95}}',
+u'\u2740': '{\\ding{96}}',
+u'\u2741': '{\\ding{97}}',
+u'\u2742': '{\\ding{98}}',
+u'\u2743': '{\\ding{99}}',
+u'\u2744': '{\\ding{100}}',
+u'\u2745': '{\\ding{101}}',
+u'\u2746': '{\\ding{102}}',
+u'\u2747': '{\\ding{103}}',
+u'\u2748': '{\\ding{104}}',
+u'\u2749': '{\\ding{105}}',
+u'\u274a': '{\\ding{106}}',
+u'\u274b': '{\\ding{107}}',
+u'\u274d': '{\\ding{109}}',
+u'\u274f': '{\\ding{111}}',
+u'\u2750': '{\\ding{112}}',
+u'\u2751': '{\\ding{113}}',
+u'\u2752': '{\\ding{114}}',
+u'\u2756': '{\\ding{118}}',
+u'\u2758': '{\\ding{120}}',
+u'\u2759': '{\\ding{121}}',
+u'\u275a': '{\\ding{122}}',
+u'\u275b': '{\\ding{123}}',
+u'\u275c': '{\\ding{124}}',
+u'\u275d': '{\\ding{125}}',
+u'\u275e': '{\\ding{126}}',
+u'\u2761': '{\\ding{161}}',
+u'\u2762': '{\\ding{162}}',
+u'\u2763': '{\\ding{163}}',
+u'\u2764': '{\\ding{164}}',
+u'\u2765': '{\\ding{165}}',
+u'\u2766': '{\\ding{166}}',
+u'\u2767': '{\\ding{167}}',
+u'\u2776': '{\\ding{182}}',
+u'\u2777': '{\\ding{183}}',
+u'\u2778': '{\\ding{184}}',
+u'\u2779': '{\\ding{185}}',
+u'\u277a': '{\\ding{186}}',
+u'\u277b': '{\\ding{187}}',
+u'\u277c': '{\\ding{188}}',
+u'\u277d': '{\\ding{189}}',
+u'\u277e': '{\\ding{190}}',
+u'\u277f': '{\\ding{191}}',
+u'\u2780': '{\\ding{192}}',
+u'\u2781': '{\\ding{193}}',
+u'\u2782': '{\\ding{194}}',
+u'\u2783': '{\\ding{195}}',
+u'\u2784': '{\\ding{196}}',
+u'\u2785': '{\\ding{197}}',
+u'\u2786': '{\\ding{198}}',
+u'\u2787': '{\\ding{199}}',
+u'\u2788': '{\\ding{200}}',
+u'\u2789': '{\\ding{201}}',
+u'\u278a': '{\\ding{202}}',
+u'\u278b': '{\\ding{203}}',
+u'\u278c': '{\\ding{204}}',
+u'\u278d': '{\\ding{205}}',
+u'\u278e': '{\\ding{206}}',
+u'\u278f': '{\\ding{207}}',
+u'\u2790': '{\\ding{208}}',
+u'\u2791': '{\\ding{209}}',
+u'\u2792': '{\\ding{210}}',
+u'\u2793': '{\\ding{211}}',
+u'\u2794': '{\\ding{212}}',
+u'\u2798': '{\\ding{216}}',
+u'\u2799': '{\\ding{217}}',
+u'\u279a': '{\\ding{218}}',
+u'\u279b': '{\\ding{219}}',
+u'\u279c': '{\\ding{220}}',
+u'\u279d': '{\\ding{221}}',
+u'\u279e': '{\\ding{222}}',
+u'\u279f': '{\\ding{223}}',
+u'\u27a0': '{\\ding{224}}',
+u'\u27a1': '{\\ding{225}}',
+u'\u27a2': '{\\ding{226}}',
+u'\u27a3': '{\\ding{227}}',
+u'\u27a4': '{\\ding{228}}',
+u'\u27a5': '{\\ding{229}}',
+u'\u27a6': '{\\ding{230}}',
+u'\u27a7': '{\\ding{231}}',
+u'\u27a8': '{\\ding{232}}',
+u'\u27a9': '{\\ding{233}}',
+u'\u27aa': '{\\ding{234}}',
+u'\u27ab': '{\\ding{235}}',
+u'\u27ac': '{\\ding{236}}',
+u'\u27ad': '{\\ding{237}}',
+u'\u27ae': '{\\ding{238}}',
+u'\u27af': '{\\ding{239}}',
+u'\u27b1': '{\\ding{241}}',
+u'\u27b2': '{\\ding{242}}',
+u'\u27b3': '{\\ding{243}}',
+u'\u27b4': '{\\ding{244}}',
+u'\u27b5': '{\\ding{245}}',
+u'\u27b6': '{\\ding{246}}',
+u'\u27b7': '{\\ding{247}}',
+u'\u27b8': '{\\ding{248}}',
+u'\u27b9': '{\\ding{249}}',
+u'\u27ba': '{\\ding{250}}',
+u'\u27bb': '{\\ding{251}}',
+u'\u27bc': '{\\ding{252}}',
+u'\u27bd': '{\\ding{253}}',
+u'\u27be': '{\\ding{254}}',
+u'\u27f5': '$\\longleftarrow$',
+u'\u27f6': '$\\longrightarrow$',
+u'\u27f7': '$\\longleftrightarrow$',
+u'\u27f8': '$\\Longleftarrow$',
+u'\u27f9': '$\\Longrightarrow$',
+u'\u27fa': '$\\Longleftrightarrow$',
+u'\u27fc': '$\\longmapsto$',
+u'\u27ff': '$\\sim\\joinrel\\leadsto$',
+u'\u2905': '$\\ElsevierGlyph{E212}$',
+u'\u2912': '$\\UpArrowBar$',
+u'\u2913': '$\\DownArrowBar$',
+u'\u2923': '$\\ElsevierGlyph{E20C}$',
+u'\u2924': '$\\ElsevierGlyph{E20D}$',
+u'\u2925': '$\\ElsevierGlyph{E20B}$',
+u'\u2926': '$\\ElsevierGlyph{E20A}$',
+u'\u2927': '$\\ElsevierGlyph{E211}$',
+u'\u2928': '$\\ElsevierGlyph{E20E}$',
+u'\u2929': '$\\ElsevierGlyph{E20F}$',
+u'\u292a': '$\\ElsevierGlyph{E210}$',
+u'\u2933': '$\\ElsevierGlyph{E21C}$',
+u'\u2936': '$\\ElsevierGlyph{E21A}$',
+u'\u2937': '$\\ElsevierGlyph{E219}$',
+u'\u2940': '$\\Elolarr$',
+u'\u2941': '$\\Elorarr$',
+u'\u2942': '$\\ElzRlarr$',
+u'\u2944': '$\\ElzrLarr$',
+u'\u2947': '$\\Elzrarrx$',
+u'\u294e': '$\\LeftRightVector$',
+u'\u294f': '$\\RightUpDownVector$',
+u'\u2950': '$\\DownLeftRightVector$',
+u'\u2951': '$\\LeftUpDownVector$',
+u'\u2952': '$\\LeftVectorBar$',
+u'\u2953': '$\\RightVectorBar$',
+u'\u2954': '$\\RightUpVectorBar$',
+u'\u2955': '$\\RightDownVectorBar$',
+u'\u2956': '$\\DownLeftVectorBar$',
+u'\u2957': '$\\DownRightVectorBar$',
+u'\u2958': '$\\LeftUpVectorBar$',
+u'\u2959': '$\\LeftDownVectorBar$',
+u'\u295a': '$\\LeftTeeVector$',
+u'\u295b': '$\\RightTeeVector$',
+u'\u295c': '$\\RightUpTeeVector$',
+u'\u295d': '$\\RightDownTeeVector$',
+u'\u295e': '$\\DownLeftTeeVector$',
+u'\u295f': '$\\DownRightTeeVector$',
+u'\u2960': '$\\LeftUpTeeVector$',
+u'\u2961': '$\\LeftDownTeeVector$',
+u'\u296e': '$\\UpEquilibrium$',
+u'\u296f': '$\\ReverseUpEquilibrium$',
+u'\u2970': '$\\RoundImplies$',
+u'\u297c': '$\\ElsevierGlyph{E214}$',
+u'\u297d': '$\\ElsevierGlyph{E215}$',
+u'\u2980': '$\\Elztfnc$',
+u'\u2985': '$\\ElsevierGlyph{3018}$',
+u'\u2986': '$\\Elroang$',
+u'\u2993': '$<\\kern-0.58em($',
+u'\u2994': '$\\ElsevierGlyph{E291}$',
+u'\u2999': '$\\Elzddfnc$',
+u'\u299c': '$\\Angle$',
+u'\u29a0': '$\\Elzlpargt$',
+u'\u29b5': '$\\ElsevierGlyph{E260}$',
+u'\u29b6': '$\\ElsevierGlyph{E61B}$',
+u'\u29ca': '$\\ElzLap$',
+u'\u29cb': '$\\Elzdefas$',
+u'\u29cf': '$\\LeftTriangleBar$',
+u'\u29d0': '$\\RightTriangleBar$',
+u'\u29dc': '$\\ElsevierGlyph{E372}$',
+u'\u29eb': '$\\blacklozenge$',
+u'\u29f4': '$\\RuleDelayed$',
+u'\u2a04': '$\\Elxuplus$',
+u'\u2a05': '$\\ElzThr$',
+u'\u2a06': '$\\Elxsqcup$',
+u'\u2a07': '$\\ElzInf$',
+u'\u2a08': '$\\ElzSup$',
+u'\u2a0d': '$\\ElzCint$',
+u'\u2a0f': '$\\clockoint$',
+u'\u2a10': '$\\ElsevierGlyph{E395}$',
+u'\u2a16': '$\\sqrint$',
+u'\u2a25': '$\\ElsevierGlyph{E25A}$',
+u'\u2a2a': '$\\ElsevierGlyph{E25B}$',
+u'\u2a2d': '$\\ElsevierGlyph{E25C}$',
+u'\u2a2e': '$\\ElsevierGlyph{E25D}$',
+u'\u2a2f': '$\\ElzTimes$',
+u'\u2a34': '$\\ElsevierGlyph{E25E}$',
+u'\u2a35': '$\\ElsevierGlyph{E25E}$',
+u'\u2a3c': '$\\ElsevierGlyph{E259}$',
+u'\u2a3f': '$\\amalg$',
+u'\u2a53': '$\\ElzAnd$',
+u'\u2a54': '$\\ElzOr$',
+u'\u2a55': '$\\ElsevierGlyph{E36E}$',
+u'\u2a56': '$\\ElOr$',
+u'\u2a5e': '$\\perspcorrespond$',
+u'\u2a5f': '$\\Elzminhat$',
+u'\u2a63': '$\\ElsevierGlyph{225A}$',
+u'\u2a6e': '$\\stackrel{*}{=}$',
+u'\u2a75': '$\\Equal$',
+u'\u2a7d': '$\\leqslant$',
+u'\u2a7e': '$\\geqslant$',
+u'\u2a85': '$\\lessapprox$',
+u'\u2a86': '$\\gtrapprox$',
+u'\u2a87': '$\\lneq$',
+u'\u2a88': '$\\gneq$',
+u'\u2a89': '$\\lnapprox$',
+u'\u2a8a': '$\\gnapprox$',
+u'\u2a8b': '$\\lesseqqgtr$',
+u'\u2a8c': '$\\gtreqqless$',
+u'\u2a95': '$\\eqslantless$',
+u'\u2a96': '$\\eqslantgtr$',
+u'\u2a9d': '$\\Pisymbol{ppi020}{117}$',
+u'\u2a9e': '$\\Pisymbol{ppi020}{105}$',
+u'\u2aa1': '$\\NestedLessLess$',
+u'\u2aa2': '$\\NestedGreaterGreater$',
+u'\u2aaf': '$\\preceq$',
+u'\u2ab0': '$\\succeq$',
+u'\u2ab5': '$\\precneqq$',
+u'\u2ab6': '$\\succneqq$',
+u'\u2ab7': '$\\precapprox$',
+u'\u2ab8': '$\\succapprox$',
+u'\u2ab9': '$\\precnapprox$',
+u'\u2aba': '$\\succnapprox$',
+u'\u2ac5': '$\\subseteqq$',
+u'\u2ac6': '$\\supseteqq$',
+u'\u2acb': '$\\subsetneqq$',
+u'\u2acc': '$\\supsetneqq$',
+u'\u2aeb': '$\\ElsevierGlyph{E30D}$',
+u'\u2af6': '$\\Elztdcol$',
+u'\u2afd': '${{/}\\!\\!{/}}$',
+u'\u300a': '$\\ElsevierGlyph{300A}$',
+u'\u300b': '$\\ElsevierGlyph{300B}$',
+u'\u3018': '$\\ElsevierGlyph{3018}$',
+u'\u3019': '$\\ElsevierGlyph{3019}$',
+u'\u301a': '$\\openbracketleft$',
+u'\u301b': '$\\openbracketright$',
+u'\ufb00': '{ff}',
+u'\ufb01': '{fi}',
+u'\ufb02': '{fl}',
+u'\ufb03': '{ffi}',
+u'\ufb04': '{ffl}',
+u'\U0001d400': '$\\mathbf{A}$',
+u'\U0001d401': '$\\mathbf{B}$',
+u'\U0001d402': '$\\mathbf{C}$',
+u'\U0001d403': '$\\mathbf{D}$',
+u'\U0001d404': '$\\mathbf{E}$',
+u'\U0001d405': '$\\mathbf{F}$',
+u'\U0001d406': '$\\mathbf{G}$',
+u'\U0001d407': '$\\mathbf{H}$',
+u'\U0001d408': '$\\mathbf{I}$',
+u'\U0001d409': '$\\mathbf{J}$',
+u'\U0001d40a': '$\\mathbf{K}$',
+u'\U0001d40b': '$\\mathbf{L}$',
+u'\U0001d40c': '$\\mathbf{M}$',
+u'\U0001d40d': '$\\mathbf{N}$',
+u'\U0001d40e': '$\\mathbf{O}$',
+u'\U0001d40f': '$\\mathbf{P}$',
+u'\U0001d410': '$\\mathbf{Q}$',
+u'\U0001d411': '$\\mathbf{R}$',
+u'\U0001d412': '$\\mathbf{S}$',
+u'\U0001d413': '$\\mathbf{T}$',
+u'\U0001d414': '$\\mathbf{U}$',
+u'\U0001d415': '$\\mathbf{V}$',
+u'\U0001d416': '$\\mathbf{W}$',
+u'\U0001d417': '$\\mathbf{X}$',
+u'\U0001d418': '$\\mathbf{Y}$',
+u'\U0001d419': '$\\mathbf{Z}$',
+u'\U0001d41a': '$\\mathbf{a}$',
+u'\U0001d41b': '$\\mathbf{b}$',
+u'\U0001d41c': '$\\mathbf{c}$',
+u'\U0001d41d': '$\\mathbf{d}$',
+u'\U0001d41e': '$\\mathbf{e}$',
+u'\U0001d41f': '$\\mathbf{f}$',
+u'\U0001d420': '$\\mathbf{g}$',
+u'\U0001d421': '$\\mathbf{h}$',
+u'\U0001d422': '$\\mathbf{i}$',
+u'\U0001d423': '$\\mathbf{j}$',
+u'\U0001d424': '$\\mathbf{k}$',
+u'\U0001d425': '$\\mathbf{l}$',
+u'\U0001d426': '$\\mathbf{m}$',
+u'\U0001d427': '$\\mathbf{n}$',
+u'\U0001d428': '$\\mathbf{o}$',
+u'\U0001d429': '$\\mathbf{p}$',
+u'\U0001d42a': '$\\mathbf{q}$',
+u'\U0001d42b': '$\\mathbf{r}$',
+u'\U0001d42c': '$\\mathbf{s}$',
+u'\U0001d42d': '$\\mathbf{t}$',
+u'\U0001d42e': '$\\mathbf{u}$',
+u'\U0001d42f': '$\\mathbf{v}$',
+u'\U0001d430': '$\\mathbf{w}$',
+u'\U0001d431': '$\\mathbf{x}$',
+u'\U0001d432': '$\\mathbf{y}$',
+u'\U0001d433': '$\\mathbf{z}$',
+u'\U0001d434': '$\\mathsl{A}$',
+u'\U0001d435': '$\\mathsl{B}$',
+u'\U0001d436': '$\\mathsl{C}$',
+u'\U0001d437': '$\\mathsl{D}$',
+u'\U0001d438': '$\\mathsl{E}$',
+u'\U0001d439': '$\\mathsl{F}$',
+u'\U0001d43a': '$\\mathsl{G}$',
+u'\U0001d43b': '$\\mathsl{H}$',
+u'\U0001d43c': '$\\mathsl{I}$',
+u'\U0001d43d': '$\\mathsl{J}$',
+u'\U0001d43e': '$\\mathsl{K}$',
+u'\U0001d43f': '$\\mathsl{L}$',
+u'\U0001d440': '$\\mathsl{M}$',
+u'\U0001d441': '$\\mathsl{N}$',
+u'\U0001d442': '$\\mathsl{O}$',
+u'\U0001d443': '$\\mathsl{P}$',
+u'\U0001d444': '$\\mathsl{Q}$',
+u'\U0001d445': '$\\mathsl{R}$',
+u'\U0001d446': '$\\mathsl{S}$',
+u'\U0001d447': '$\\mathsl{T}$',
+u'\U0001d448': '$\\mathsl{U}$',
+u'\U0001d449': '$\\mathsl{V}$',
+u'\U0001d44a': '$\\mathsl{W}$',
+u'\U0001d44b': '$\\mathsl{X}$',
+u'\U0001d44c': '$\\mathsl{Y}$',
+u'\U0001d44d': '$\\mathsl{Z}$',
+u'\U0001d44e': '$\\mathsl{a}$',
+u'\U0001d44f': '$\\mathsl{b}$',
+u'\U0001d450': '$\\mathsl{c}$',
+u'\U0001d451': '$\\mathsl{d}$',
+u'\U0001d452': '$\\mathsl{e}$',
+u'\U0001d453': '$\\mathsl{f}$',
+u'\U0001d454': '$\\mathsl{g}$',
+u'\U0001d456': '$\\mathsl{i}$',
+u'\U0001d457': '$\\mathsl{j}$',
+u'\U0001d458': '$\\mathsl{k}$',
+u'\U0001d459': '$\\mathsl{l}$',
+u'\U0001d45a': '$\\mathsl{m}$',
+u'\U0001d45b': '$\\mathsl{n}$',
+u'\U0001d45c': '$\\mathsl{o}$',
+u'\U0001d45d': '$\\mathsl{p}$',
+u'\U0001d45e': '$\\mathsl{q}$',
+u'\U0001d45f': '$\\mathsl{r}$',
+u'\U0001d460': '$\\mathsl{s}$',
+u'\U0001d461': '$\\mathsl{t}$',
+u'\U0001d462': '$\\mathsl{u}$',
+u'\U0001d463': '$\\mathsl{v}$',
+u'\U0001d464': '$\\mathsl{w}$',
+u'\U0001d465': '$\\mathsl{x}$',
+u'\U0001d466': '$\\mathsl{y}$',
+u'\U0001d467': '$\\mathsl{z}$',
+u'\U0001d468': '$\\mathbit{A}$',
+u'\U0001d469': '$\\mathbit{B}$',
+u'\U0001d46a': '$\\mathbit{C}$',
+u'\U0001d46b': '$\\mathbit{D}$',
+u'\U0001d46c': '$\\mathbit{E}$',
+u'\U0001d46d': '$\\mathbit{F}$',
+u'\U0001d46e': '$\\mathbit{G}$',
+u'\U0001d46f': '$\\mathbit{H}$',
+u'\U0001d470': '$\\mathbit{I}$',
+u'\U0001d471': '$\\mathbit{J}$',
+u'\U0001d472': '$\\mathbit{K}$',
+u'\U0001d473': '$\\mathbit{L}$',
+u'\U0001d474': '$\\mathbit{M}$',
+u'\U0001d475': '$\\mathbit{N}$',
+u'\U0001d476': '$\\mathbit{O}$',
+u'\U0001d477': '$\\mathbit{P}$',
+u'\U0001d478': '$\\mathbit{Q}$',
+u'\U0001d479': '$\\mathbit{R}$',
+u'\U0001d47a': '$\\mathbit{S}$',
+u'\U0001d47b': '$\\mathbit{T}$',
+u'\U0001d47c': '$\\mathbit{U}$',
+u'\U0001d47d': '$\\mathbit{V}$',
+u'\U0001d47e': '$\\mathbit{W}$',
+u'\U0001d47f': '$\\mathbit{X}$',
+u'\U0001d480': '$\\mathbit{Y}$',
+u'\U0001d481': '$\\mathbit{Z}$',
+u'\U0001d482': '$\\mathbit{a}$',
+u'\U0001d483': '$\\mathbit{b}$',
+u'\U0001d484': '$\\mathbit{c}$',
+u'\U0001d485': '$\\mathbit{d}$',
+u'\U0001d486': '$\\mathbit{e}$',
+u'\U0001d487': '$\\mathbit{f}$',
+u'\U0001d488': '$\\mathbit{g}$',
+u'\U0001d489': '$\\mathbit{h}$',
+u'\U0001d48a': '$\\mathbit{i}$',
+u'\U0001d48b': '$\\mathbit{j}$',
+u'\U0001d48c': '$\\mathbit{k}$',
+u'\U0001d48d': '$\\mathbit{l}$',
+u'\U0001d48e': '$\\mathbit{m}$',
+u'\U0001d48f': '$\\mathbit{n}$',
+u'\U0001d490': '$\\mathbit{o}$',
+u'\U0001d491': '$\\mathbit{p}$',
+u'\U0001d492': '$\\mathbit{q}$',
+u'\U0001d493': '$\\mathbit{r}$',
+u'\U0001d494': '$\\mathbit{s}$',
+u'\U0001d495': '$\\mathbit{t}$',
+u'\U0001d496': '$\\mathbit{u}$',
+u'\U0001d497': '$\\mathbit{v}$',
+u'\U0001d498': '$\\mathbit{w}$',
+u'\U0001d499': '$\\mathbit{x}$',
+u'\U0001d49a': '$\\mathbit{y}$',
+u'\U0001d49b': '$\\mathbit{z}$',
+u'\U0001d49c': '$\\mathscr{A}$',
+u'\U0001d49e': '$\\mathscr{C}$',
+u'\U0001d49f': '$\\mathscr{D}$',
+u'\U0001d4a2': '$\\mathscr{G}$',
+u'\U0001d4a5': '$\\mathscr{J}$',
+u'\U0001d4a6': '$\\mathscr{K}$',
+u'\U0001d4a9': '$\\mathscr{N}$',
+u'\U0001d4aa': '$\\mathscr{O}$',
+u'\U0001d4ab': '$\\mathscr{P}$',
+u'\U0001d4ac': '$\\mathscr{Q}$',
+u'\U0001d4ae': '$\\mathscr{S}$',
+u'\U0001d4af': '$\\mathscr{T}$',
+u'\U0001d4b0': '$\\mathscr{U}$',
+u'\U0001d4b1': '$\\mathscr{V}$',
+u'\U0001d4b2': '$\\mathscr{W}$',
+u'\U0001d4b3': '$\\mathscr{X}$',
+u'\U0001d4b4': '$\\mathscr{Y}$',
+u'\U0001d4b5': '$\\mathscr{Z}$',
+u'\U0001d4b6': '$\\mathscr{a}$',
+u'\U0001d4b7': '$\\mathscr{b}$',
+u'\U0001d4b8': '$\\mathscr{c}$',
+u'\U0001d4b9': '$\\mathscr{d}$',
+u'\U0001d4bb': '$\\mathscr{f}$',
+u'\U0001d4bd': '$\\mathscr{h}$',
+u'\U0001d4be': '$\\mathscr{i}$',
+u'\U0001d4bf': '$\\mathscr{j}$',
+u'\U0001d4c0': '$\\mathscr{k}$',
+u'\U0001d4c1': '$\\mathscr{l}$',
+u'\U0001d4c2': '$\\mathscr{m}$',
+u'\U0001d4c3': '$\\mathscr{n}$',
+u'\U0001d4c5': '$\\mathscr{p}$',
+u'\U0001d4c6': '$\\mathscr{q}$',
+u'\U0001d4c7': '$\\mathscr{r}$',
+u'\U0001d4c8': '$\\mathscr{s}$',
+u'\U0001d4c9': '$\\mathscr{t}$',
+u'\U0001d4ca': '$\\mathscr{u}$',
+u'\U0001d4cb': '$\\mathscr{v}$',
+u'\U0001d4cc': '$\\mathscr{w}$',
+u'\U0001d4cd': '$\\mathscr{x}$',
+u'\U0001d4ce': '$\\mathscr{y}$',
+u'\U0001d4cf': '$\\mathscr{z}$',
+u'\U0001d4d0': '$\\mathmit{A}$',
+u'\U0001d4d1': '$\\mathmit{B}$',
+u'\U0001d4d2': '$\\mathmit{C}$',
+u'\U0001d4d3': '$\\mathmit{D}$',
+u'\U0001d4d4': '$\\mathmit{E}$',
+u'\U0001d4d5': '$\\mathmit{F}$',
+u'\U0001d4d6': '$\\mathmit{G}$',
+u'\U0001d4d7': '$\\mathmit{H}$',
+u'\U0001d4d8': '$\\mathmit{I}$',
+u'\U0001d4d9': '$\\mathmit{J}$',
+u'\U0001d4da': '$\\mathmit{K}$',
+u'\U0001d4db': '$\\mathmit{L}$',
+u'\U0001d4dc': '$\\mathmit{M}$',
+u'\U0001d4dd': '$\\mathmit{N}$',
+u'\U0001d4de': '$\\mathmit{O}$',
+u'\U0001d4df': '$\\mathmit{P}$',
+u'\U0001d4e0': '$\\mathmit{Q}$',
+u'\U0001d4e1': '$\\mathmit{R}$',
+u'\U0001d4e2': '$\\mathmit{S}$',
+u'\U0001d4e3': '$\\mathmit{T}$',
+u'\U0001d4e4': '$\\mathmit{U}$',
+u'\U0001d4e5': '$\\mathmit{V}$',
+u'\U0001d4e6': '$\\mathmit{W}$',
+u'\U0001d4e7': '$\\mathmit{X}$',
+u'\U0001d4e8': '$\\mathmit{Y}$',
+u'\U0001d4e9': '$\\mathmit{Z}$',
+u'\U0001d4ea': '$\\mathmit{a}$',
+u'\U0001d4eb': '$\\mathmit{b}$',
+u'\U0001d4ec': '$\\mathmit{c}$',
+u'\U0001d4ed': '$\\mathmit{d}$',
+u'\U0001d4ee': '$\\mathmit{e}$',
+u'\U0001d4ef': '$\\mathmit{f}$',
+u'\U0001d4f0': '$\\mathmit{g}$',
+u'\U0001d4f1': '$\\mathmit{h}$',
+u'\U0001d4f2': '$\\mathmit{i}$',
+u'\U0001d4f3': '$\\mathmit{j}$',
+u'\U0001d4f4': '$\\mathmit{k}$',
+u'\U0001d4f5': '$\\mathmit{l}$',
+u'\U0001d4f6': '$\\mathmit{m}$',
+u'\U0001d4f7': '$\\mathmit{n}$',
+u'\U0001d4f8': '$\\mathmit{o}$',
+u'\U0001d4f9': '$\\mathmit{p}$',
+u'\U0001d4fa': '$\\mathmit{q}$',
+u'\U0001d4fb': '$\\mathmit{r}$',
+u'\U0001d4fc': '$\\mathmit{s}$',
+u'\U0001d4fd': '$\\mathmit{t}$',
+u'\U0001d4fe': '$\\mathmit{u}$',
+u'\U0001d4ff': '$\\mathmit{v}$',
+u'\U0001d500': '$\\mathmit{w}$',
+u'\U0001d501': '$\\mathmit{x}$',
+u'\U0001d502': '$\\mathmit{y}$',
+u'\U0001d503': '$\\mathmit{z}$',
+u'\U0001d504': '$\\mathfrak{A}$',
+u'\U0001d505': '$\\mathfrak{B}$',
+u'\U0001d507': '$\\mathfrak{D}$',
+u'\U0001d508': '$\\mathfrak{E}$',
+u'\U0001d509': '$\\mathfrak{F}$',
+u'\U0001d50a': '$\\mathfrak{G}$',
+u'\U0001d50d': '$\\mathfrak{J}$',
+u'\U0001d50e': '$\\mathfrak{K}$',
+u'\U0001d50f': '$\\mathfrak{L}$',
+u'\U0001d510': '$\\mathfrak{M}$',
+u'\U0001d511': '$\\mathfrak{N}$',
+u'\U0001d512': '$\\mathfrak{O}$',
+u'\U0001d513': '$\\mathfrak{P}$',
+u'\U0001d514': '$\\mathfrak{Q}$',
+u'\U0001d516': '$\\mathfrak{S}$',
+u'\U0001d517': '$\\mathfrak{T}$',
+u'\U0001d518': '$\\mathfrak{U}$',
+u'\U0001d519': '$\\mathfrak{V}$',
+u'\U0001d51a': '$\\mathfrak{W}$',
+u'\U0001d51b': '$\\mathfrak{X}$',
+u'\U0001d51c': '$\\mathfrak{Y}$',
+u'\U0001d51e': '$\\mathfrak{a}$',
+u'\U0001d51f': '$\\mathfrak{b}$',
+u'\U0001d520': '$\\mathfrak{c}$',
+u'\U0001d521': '$\\mathfrak{d}$',
+u'\U0001d522': '$\\mathfrak{e}$',
+u'\U0001d523': '$\\mathfrak{f}$',
+u'\U0001d524': '$\\mathfrak{g}$',
+u'\U0001d525': '$\\mathfrak{h}$',
+u'\U0001d526': '$\\mathfrak{i}$',
+u'\U0001d527': '$\\mathfrak{j}$',
+u'\U0001d528': '$\\mathfrak{k}$',
+u'\U0001d529': '$\\mathfrak{l}$',
+u'\U0001d52a': '$\\mathfrak{m}$',
+u'\U0001d52b': '$\\mathfrak{n}$',
+u'\U0001d52c': '$\\mathfrak{o}$',
+u'\U0001d52d': '$\\mathfrak{p}$',
+u'\U0001d52e': '$\\mathfrak{q}$',
+u'\U0001d52f': '$\\mathfrak{r}$',
+u'\U0001d530': '$\\mathfrak{s}$',
+u'\U0001d531': '$\\mathfrak{t}$',
+u'\U0001d532': '$\\mathfrak{u}$',
+u'\U0001d533': '$\\mathfrak{v}$',
+u'\U0001d534': '$\\mathfrak{w}$',
+u'\U0001d535': '$\\mathfrak{x}$',
+u'\U0001d536': '$\\mathfrak{y}$',
+u'\U0001d537': '$\\mathfrak{z}$',
+u'\U0001d538': '$\\mathbb{A}$',
+u'\U0001d539': '$\\mathbb{B}$',
+u'\U0001d53b': '$\\mathbb{D}$',
+u'\U0001d53c': '$\\mathbb{E}$',
+u'\U0001d53d': '$\\mathbb{F}$',
+u'\U0001d53e': '$\\mathbb{G}$',
+u'\U0001d540': '$\\mathbb{I}$',
+u'\U0001d541': '$\\mathbb{J}$',
+u'\U0001d542': '$\\mathbb{K}$',
+u'\U0001d543': '$\\mathbb{L}$',
+u'\U0001d544': '$\\mathbb{M}$',
+u'\U0001d546': '$\\mathbb{O}$',
+u'\U0001d54a': '$\\mathbb{S}$',
+u'\U0001d54b': '$\\mathbb{T}$',
+u'\U0001d54c': '$\\mathbb{U}$',
+u'\U0001d54d': '$\\mathbb{V}$',
+u'\U0001d54e': '$\\mathbb{W}$',
+u'\U0001d54f': '$\\mathbb{X}$',
+u'\U0001d550': '$\\mathbb{Y}$',
+u'\U0001d552': '$\\mathbb{a}$',
+u'\U0001d553': '$\\mathbb{b}$',
+u'\U0001d554': '$\\mathbb{c}$',
+u'\U0001d555': '$\\mathbb{d}$',
+u'\U0001d556': '$\\mathbb{e}$',
+u'\U0001d557': '$\\mathbb{f}$',
+u'\U0001d558': '$\\mathbb{g}$',
+u'\U0001d559': '$\\mathbb{h}$',
+u'\U0001d55a': '$\\mathbb{i}$',
+u'\U0001d55b': '$\\mathbb{j}$',
+u'\U0001d55c': '$\\mathbb{k}$',
+u'\U0001d55d': '$\\mathbb{l}$',
+u'\U0001d55e': '$\\mathbb{m}$',
+u'\U0001d55f': '$\\mathbb{n}$',
+u'\U0001d560': '$\\mathbb{o}$',
+u'\U0001d561': '$\\mathbb{p}$',
+u'\U0001d562': '$\\mathbb{q}$',
+u'\U0001d563': '$\\mathbb{r}$',
+u'\U0001d564': '$\\mathbb{s}$',
+u'\U0001d565': '$\\mathbb{t}$',
+u'\U0001d566': '$\\mathbb{u}$',
+u'\U0001d567': '$\\mathbb{v}$',
+u'\U0001d568': '$\\mathbb{w}$',
+u'\U0001d569': '$\\mathbb{x}$',
+u'\U0001d56a': '$\\mathbb{y}$',
+u'\U0001d56b': '$\\mathbb{z}$',
+u'\U0001d56c': '$\\mathslbb{A}$',
+u'\U0001d56d': '$\\mathslbb{B}$',
+u'\U0001d56e': '$\\mathslbb{C}$',
+u'\U0001d56f': '$\\mathslbb{D}$',
+u'\U0001d570': '$\\mathslbb{E}$',
+u'\U0001d571': '$\\mathslbb{F}$',
+u'\U0001d572': '$\\mathslbb{G}$',
+u'\U0001d573': '$\\mathslbb{H}$',
+u'\U0001d574': '$\\mathslbb{I}$',
+u'\U0001d575': '$\\mathslbb{J}$',
+u'\U0001d576': '$\\mathslbb{K}$',
+u'\U0001d577': '$\\mathslbb{L}$',
+u'\U0001d578': '$\\mathslbb{M}$',
+u'\U0001d579': '$\\mathslbb{N}$',
+u'\U0001d57a': '$\\mathslbb{O}$',
+u'\U0001d57b': '$\\mathslbb{P}$',
+u'\U0001d57c': '$\\mathslbb{Q}$',
+u'\U0001d57d': '$\\mathslbb{R}$',
+u'\U0001d57e': '$\\mathslbb{S}$',
+u'\U0001d57f': '$\\mathslbb{T}$',
+u'\U0001d580': '$\\mathslbb{U}$',
+u'\U0001d581': '$\\mathslbb{V}$',
+u'\U0001d582': '$\\mathslbb{W}$',
+u'\U0001d583': '$\\mathslbb{X}$',
+u'\U0001d584': '$\\mathslbb{Y}$',
+u'\U0001d585': '$\\mathslbb{Z}$',
+u'\U0001d586': '$\\mathslbb{a}$',
+u'\U0001d587': '$\\mathslbb{b}$',
+u'\U0001d588': '$\\mathslbb{c}$',
+u'\U0001d589': '$\\mathslbb{d}$',
+u'\U0001d58a': '$\\mathslbb{e}$',
+u'\U0001d58b': '$\\mathslbb{f}$',
+u'\U0001d58c': '$\\mathslbb{g}$',
+u'\U0001d58d': '$\\mathslbb{h}$',
+u'\U0001d58e': '$\\mathslbb{i}$',
+u'\U0001d58f': '$\\mathslbb{j}$',
+u'\U0001d590': '$\\mathslbb{k}$',
+u'\U0001d591': '$\\mathslbb{l}$',
+u'\U0001d592': '$\\mathslbb{m}$',
+u'\U0001d593': '$\\mathslbb{n}$',
+u'\U0001d594': '$\\mathslbb{o}$',
+u'\U0001d595': '$\\mathslbb{p}$',
+u'\U0001d596': '$\\mathslbb{q}$',
+u'\U0001d597': '$\\mathslbb{r}$',
+u'\U0001d598': '$\\mathslbb{s}$',
+u'\U0001d599': '$\\mathslbb{t}$',
+u'\U0001d59a': '$\\mathslbb{u}$',
+u'\U0001d59b': '$\\mathslbb{v}$',
+u'\U0001d59c': '$\\mathslbb{w}$',
+u'\U0001d59d': '$\\mathslbb{x}$',
+u'\U0001d59e': '$\\mathslbb{y}$',
+u'\U0001d59f': '$\\mathslbb{z}$',
+u'\U0001d5a0': '$\\mathsf{A}$',
+u'\U0001d5a1': '$\\mathsf{B}$',
+u'\U0001d5a2': '$\\mathsf{C}$',
+u'\U0001d5a3': '$\\mathsf{D}$',
+u'\U0001d5a4': '$\\mathsf{E}$',
+u'\U0001d5a5': '$\\mathsf{F}$',
+u'\U0001d5a6': '$\\mathsf{G}$',
+u'\U0001d5a7': '$\\mathsf{H}$',
+u'\U0001d5a8': '$\\mathsf{I}$',
+u'\U0001d5a9': '$\\mathsf{J}$',
+u'\U0001d5aa': '$\\mathsf{K}$',
+u'\U0001d5ab': '$\\mathsf{L}$',
+u'\U0001d5ac': '$\\mathsf{M}$',
+u'\U0001d5ad': '$\\mathsf{N}$',
+u'\U0001d5ae': '$\\mathsf{O}$',
+u'\U0001d5af': '$\\mathsf{P}$',
+u'\U0001d5b0': '$\\mathsf{Q}$',
+u'\U0001d5b1': '$\\mathsf{R}$',
+u'\U0001d5b2': '$\\mathsf{S}$',
+u'\U0001d5b3': '$\\mathsf{T}$',
+u'\U0001d5b4': '$\\mathsf{U}$',
+u'\U0001d5b5': '$\\mathsf{V}$',
+u'\U0001d5b6': '$\\mathsf{W}$',
+u'\U0001d5b7': '$\\mathsf{X}$',
+u'\U0001d5b8': '$\\mathsf{Y}$',
+u'\U0001d5b9': '$\\mathsf{Z}$',
+u'\U0001d5ba': '$\\mathsf{a}$',
+u'\U0001d5bb': '$\\mathsf{b}$',
+u'\U0001d5bc': '$\\mathsf{c}$',
+u'\U0001d5bd': '$\\mathsf{d}$',
+u'\U0001d5be': '$\\mathsf{e}$',
+u'\U0001d5bf': '$\\mathsf{f}$',
+u'\U0001d5c0': '$\\mathsf{g}$',
+u'\U0001d5c1': '$\\mathsf{h}$',
+u'\U0001d5c2': '$\\mathsf{i}$',
+u'\U0001d5c3': '$\\mathsf{j}$',
+u'\U0001d5c4': '$\\mathsf{k}$',
+u'\U0001d5c5': '$\\mathsf{l}$',
+u'\U0001d5c6': '$\\mathsf{m}$',
+u'\U0001d5c7': '$\\mathsf{n}$',
+u'\U0001d5c8': '$\\mathsf{o}$',
+u'\U0001d5c9': '$\\mathsf{p}$',
+u'\U0001d5ca': '$\\mathsf{q}$',
+u'\U0001d5cb': '$\\mathsf{r}$',
+u'\U0001d5cc': '$\\mathsf{s}$',
+u'\U0001d5cd': '$\\mathsf{t}$',
+u'\U0001d5ce': '$\\mathsf{u}$',
+u'\U0001d5cf': '$\\mathsf{v}$',
+u'\U0001d5d0': '$\\mathsf{w}$',
+u'\U0001d5d1': '$\\mathsf{x}$',
+u'\U0001d5d2': '$\\mathsf{y}$',
+u'\U0001d5d3': '$\\mathsf{z}$',
+u'\U0001d5d4': '$\\mathsfbf{A}$',
+u'\U0001d5d5': '$\\mathsfbf{B}$',
+u'\U0001d5d6': '$\\mathsfbf{C}$',
+u'\U0001d5d7': '$\\mathsfbf{D}$',
+u'\U0001d5d8': '$\\mathsfbf{E}$',
+u'\U0001d5d9': '$\\mathsfbf{F}$',
+u'\U0001d5da': '$\\mathsfbf{G}$',
+u'\U0001d5db': '$\\mathsfbf{H}$',
+u'\U0001d5dc': '$\\mathsfbf{I}$',
+u'\U0001d5dd': '$\\mathsfbf{J}$',
+u'\U0001d5de': '$\\mathsfbf{K}$',
+u'\U0001d5df': '$\\mathsfbf{L}$',
+u'\U0001d5e0': '$\\mathsfbf{M}$',
+u'\U0001d5e1': '$\\mathsfbf{N}$',
+u'\U0001d5e2': '$\\mathsfbf{O}$',
+u'\U0001d5e3': '$\\mathsfbf{P}$',
+u'\U0001d5e4': '$\\mathsfbf{Q}$',
+u'\U0001d5e5': '$\\mathsfbf{R}$',
+u'\U0001d5e6': '$\\mathsfbf{S}$',
+u'\U0001d5e7': '$\\mathsfbf{T}$',
+u'\U0001d5e8': '$\\mathsfbf{U}$',
+u'\U0001d5e9': '$\\mathsfbf{V}$',
+u'\U0001d5ea': '$\\mathsfbf{W}$',
+u'\U0001d5eb': '$\\mathsfbf{X}$',
+u'\U0001d5ec': '$\\mathsfbf{Y}$',
+u'\U0001d5ed': '$\\mathsfbf{Z}$',
+u'\U0001d5ee': '$\\mathsfbf{a}$',
+u'\U0001d5ef': '$\\mathsfbf{b}$',
+u'\U0001d5f0': '$\\mathsfbf{c}$',
+u'\U0001d5f1': '$\\mathsfbf{d}$',
+u'\U0001d5f2': '$\\mathsfbf{e}$',
+u'\U0001d5f3': '$\\mathsfbf{f}$',
+u'\U0001d5f4': '$\\mathsfbf{g}$',
+u'\U0001d5f5': '$\\mathsfbf{h}$',
+u'\U0001d5f6': '$\\mathsfbf{i}$',
+u'\U0001d5f7': '$\\mathsfbf{j}$',
+u'\U0001d5f8': '$\\mathsfbf{k}$',
+u'\U0001d5f9': '$\\mathsfbf{l}$',
+u'\U0001d5fa': '$\\mathsfbf{m}$',
+u'\U0001d5fb': '$\\mathsfbf{n}$',
+u'\U0001d5fc': '$\\mathsfbf{o}$',
+u'\U0001d5fd': '$\\mathsfbf{p}$',
+u'\U0001d5fe': '$\\mathsfbf{q}$',
+u'\U0001d5ff': '$\\mathsfbf{r}$',
+u'\U0001d600': '$\\mathsfbf{s}$',
+u'\U0001d601': '$\\mathsfbf{t}$',
+u'\U0001d602': '$\\mathsfbf{u}$',
+u'\U0001d603': '$\\mathsfbf{v}$',
+u'\U0001d604': '$\\mathsfbf{w}$',
+u'\U0001d605': '$\\mathsfbf{x}$',
+u'\U0001d606': '$\\mathsfbf{y}$',
+u'\U0001d607': '$\\mathsfbf{z}$',
+u'\U0001d608': '$\\mathsfsl{A}$',
+u'\U0001d609': '$\\mathsfsl{B}$',
+u'\U0001d60a': '$\\mathsfsl{C}$',
+u'\U0001d60b': '$\\mathsfsl{D}$',
+u'\U0001d60c': '$\\mathsfsl{E}$',
+u'\U0001d60d': '$\\mathsfsl{F}$',
+u'\U0001d60e': '$\\mathsfsl{G}$',
+u'\U0001d60f': '$\\mathsfsl{H}$',
+u'\U0001d610': '$\\mathsfsl{I}$',
+u'\U0001d611': '$\\mathsfsl{J}$',
+u'\U0001d612': '$\\mathsfsl{K}$',
+u'\U0001d613': '$\\mathsfsl{L}$',
+u'\U0001d614': '$\\mathsfsl{M}$',
+u'\U0001d615': '$\\mathsfsl{N}$',
+u'\U0001d616': '$\\mathsfsl{O}$',
+u'\U0001d617': '$\\mathsfsl{P}$',
+u'\U0001d618': '$\\mathsfsl{Q}$',
+u'\U0001d619': '$\\mathsfsl{R}$',
+u'\U0001d61a': '$\\mathsfsl{S}$',
+u'\U0001d61b': '$\\mathsfsl{T}$',
+u'\U0001d61c': '$\\mathsfsl{U}$',
+u'\U0001d61d': '$\\mathsfsl{V}$',
+u'\U0001d61e': '$\\mathsfsl{W}$',
+u'\U0001d61f': '$\\mathsfsl{X}$',
+u'\U0001d620': '$\\mathsfsl{Y}$',
+u'\U0001d621': '$\\mathsfsl{Z}$',
+u'\U0001d622': '$\\mathsfsl{a}$',
+u'\U0001d623': '$\\mathsfsl{b}$',
+u'\U0001d624': '$\\mathsfsl{c}$',
+u'\U0001d625': '$\\mathsfsl{d}$',
+u'\U0001d626': '$\\mathsfsl{e}$',
+u'\U0001d627': '$\\mathsfsl{f}$',
+u'\U0001d628': '$\\mathsfsl{g}$',
+u'\U0001d629': '$\\mathsfsl{h}$',
+u'\U0001d62a': '$\\mathsfsl{i}$',
+u'\U0001d62b': '$\\mathsfsl{j}$',
+u'\U0001d62c': '$\\mathsfsl{k}$',
+u'\U0001d62d': '$\\mathsfsl{l}$',
+u'\U0001d62e': '$\\mathsfsl{m}$',
+u'\U0001d62f': '$\\mathsfsl{n}$',
+u'\U0001d630': '$\\mathsfsl{o}$',
+u'\U0001d631': '$\\mathsfsl{p}$',
+u'\U0001d632': '$\\mathsfsl{q}$',
+u'\U0001d633': '$\\mathsfsl{r}$',
+u'\U0001d634': '$\\mathsfsl{s}$',
+u'\U0001d635': '$\\mathsfsl{t}$',
+u'\U0001d636': '$\\mathsfsl{u}$',
+u'\U0001d637': '$\\mathsfsl{v}$',
+u'\U0001d638': '$\\mathsfsl{w}$',
+u'\U0001d639': '$\\mathsfsl{x}$',
+u'\U0001d63a': '$\\mathsfsl{y}$',
+u'\U0001d63b': '$\\mathsfsl{z}$',
+u'\U0001d63c': '$\\mathsfbfsl{A}$',
+u'\U0001d63d': '$\\mathsfbfsl{B}$',
+u'\U0001d63e': '$\\mathsfbfsl{C}$',
+u'\U0001d63f': '$\\mathsfbfsl{D}$',
+u'\U0001d640': '$\\mathsfbfsl{E}$',
+u'\U0001d641': '$\\mathsfbfsl{F}$',
+u'\U0001d642': '$\\mathsfbfsl{G}$',
+u'\U0001d643': '$\\mathsfbfsl{H}$',
+u'\U0001d644': '$\\mathsfbfsl{I}$',
+u'\U0001d645': '$\\mathsfbfsl{J}$',
+u'\U0001d646': '$\\mathsfbfsl{K}$',
+u'\U0001d647': '$\\mathsfbfsl{L}$',
+u'\U0001d648': '$\\mathsfbfsl{M}$',
+u'\U0001d649': '$\\mathsfbfsl{N}$',
+u'\U0001d64a': '$\\mathsfbfsl{O}$',
+u'\U0001d64b': '$\\mathsfbfsl{P}$',
+u'\U0001d64c': '$\\mathsfbfsl{Q}$',
+u'\U0001d64d': '$\\mathsfbfsl{R}$',
+u'\U0001d64e': '$\\mathsfbfsl{S}$',
+u'\U0001d64f': '$\\mathsfbfsl{T}$',
+u'\U0001d650': '$\\mathsfbfsl{U}$',
+u'\U0001d651': '$\\mathsfbfsl{V}$',
+u'\U0001d652': '$\\mathsfbfsl{W}$',
+u'\U0001d653': '$\\mathsfbfsl{X}$',
+u'\U0001d654': '$\\mathsfbfsl{Y}$',
+u'\U0001d655': '$\\mathsfbfsl{Z}$',
+u'\U0001d656': '$\\mathsfbfsl{a}$',
+u'\U0001d657': '$\\mathsfbfsl{b}$',
+u'\U0001d658': '$\\mathsfbfsl{c}$',
+u'\U0001d659': '$\\mathsfbfsl{d}$',
+u'\U0001d65a': '$\\mathsfbfsl{e}$',
+u'\U0001d65b': '$\\mathsfbfsl{f}$',
+u'\U0001d65c': '$\\mathsfbfsl{g}$',
+u'\U0001d65d': '$\\mathsfbfsl{h}$',
+u'\U0001d65e': '$\\mathsfbfsl{i}$',
+u'\U0001d65f': '$\\mathsfbfsl{j}$',
+u'\U0001d660': '$\\mathsfbfsl{k}$',
+u'\U0001d661': '$\\mathsfbfsl{l}$',
+u'\U0001d662': '$\\mathsfbfsl{m}$',
+u'\U0001d663': '$\\mathsfbfsl{n}$',
+u'\U0001d664': '$\\mathsfbfsl{o}$',
+u'\U0001d665': '$\\mathsfbfsl{p}$',
+u'\U0001d666': '$\\mathsfbfsl{q}$',
+u'\U0001d667': '$\\mathsfbfsl{r}$',
+u'\U0001d668': '$\\mathsfbfsl{s}$',
+u'\U0001d669': '$\\mathsfbfsl{t}$',
+u'\U0001d66a': '$\\mathsfbfsl{u}$',
+u'\U0001d66b': '$\\mathsfbfsl{v}$',
+u'\U0001d66c': '$\\mathsfbfsl{w}$',
+u'\U0001d66d': '$\\mathsfbfsl{x}$',
+u'\U0001d66e': '$\\mathsfbfsl{y}$',
+u'\U0001d66f': '$\\mathsfbfsl{z}$',
+u'\U0001d670': '$\\mathtt{A}$',
+u'\U0001d671': '$\\mathtt{B}$',
+u'\U0001d672': '$\\mathtt{C}$',
+u'\U0001d673': '$\\mathtt{D}$',
+u'\U0001d674': '$\\mathtt{E}$',
+u'\U0001d675': '$\\mathtt{F}$',
+u'\U0001d676': '$\\mathtt{G}$',
+u'\U0001d677': '$\\mathtt{H}$',
+u'\U0001d678': '$\\mathtt{I}$',
+u'\U0001d679': '$\\mathtt{J}$',
+u'\U0001d67a': '$\\mathtt{K}$',
+u'\U0001d67b': '$\\mathtt{L}$',
+u'\U0001d67c': '$\\mathtt{M}$',
+u'\U0001d67d': '$\\mathtt{N}$',
+u'\U0001d67e': '$\\mathtt{O}$',
+u'\U0001d67f': '$\\mathtt{P}$',
+u'\U0001d680': '$\\mathtt{Q}$',
+u'\U0001d681': '$\\mathtt{R}$',
+u'\U0001d682': '$\\mathtt{S}$',
+u'\U0001d683': '$\\mathtt{T}$',
+u'\U0001d684': '$\\mathtt{U}$',
+u'\U0001d685': '$\\mathtt{V}$',
+u'\U0001d686': '$\\mathtt{W}$',
+u'\U0001d687': '$\\mathtt{X}$',
+u'\U0001d688': '$\\mathtt{Y}$',
+u'\U0001d689': '$\\mathtt{Z}$',
+u'\U0001d68a': '$\\mathtt{a}$',
+u'\U0001d68b': '$\\mathtt{b}$',
+u'\U0001d68c': '$\\mathtt{c}$',
+u'\U0001d68d': '$\\mathtt{d}$',
+u'\U0001d68e': '$\\mathtt{e}$',
+u'\U0001d68f': '$\\mathtt{f}$',
+u'\U0001d690': '$\\mathtt{g}$',
+u'\U0001d691': '$\\mathtt{h}$',
+u'\U0001d692': '$\\mathtt{i}$',
+u'\U0001d693': '$\\mathtt{j}$',
+u'\U0001d694': '$\\mathtt{k}$',
+u'\U0001d695': '$\\mathtt{l}$',
+u'\U0001d696': '$\\mathtt{m}$',
+u'\U0001d697': '$\\mathtt{n}$',
+u'\U0001d698': '$\\mathtt{o}$',
+u'\U0001d699': '$\\mathtt{p}$',
+u'\U0001d69a': '$\\mathtt{q}$',
+u'\U0001d69b': '$\\mathtt{r}$',
+u'\U0001d69c': '$\\mathtt{s}$',
+u'\U0001d69d': '$\\mathtt{t}$',
+u'\U0001d69e': '$\\mathtt{u}$',
+u'\U0001d69f': '$\\mathtt{v}$',
+u'\U0001d6a0': '$\\mathtt{w}$',
+u'\U0001d6a1': '$\\mathtt{x}$',
+u'\U0001d6a2': '$\\mathtt{y}$',
+u'\U0001d6a3': '$\\mathtt{z}$',
+u'\U0001d6a8': '$\\mathbf{\\Alpha}$',
+u'\U0001d6a9': '$\\mathbf{\\Beta}$',
+u'\U0001d6aa': '$\\mathbf{\\Gamma}$',
+u'\U0001d6ab': '$\\mathbf{\\Delta}$',
+u'\U0001d6ac': '$\\mathbf{\\Epsilon}$',
+u'\U0001d6ad': '$\\mathbf{\\Zeta}$',
+u'\U0001d6ae': '$\\mathbf{\\Eta}$',
+u'\U0001d6af': '$\\mathbf{\\Theta}$',
+u'\U0001d6b0': '$\\mathbf{\\Iota}$',
+u'\U0001d6b1': '$\\mathbf{\\Kappa}$',
+u'\U0001d6b2': '$\\mathbf{\\Lambda}$',
+u'\U0001d6b3': '$M$',
+u'\U0001d6b4': '$N$',
+u'\U0001d6b5': '$\\mathbf{\\Xi}$',
+u'\U0001d6b6': '$O$',
+u'\U0001d6b7': '$\\mathbf{\\Pi}$',
+u'\U0001d6b8': '$\\mathbf{\\Rho}$',
+u'\U0001d6b9': '{\\mathbf{\\vartheta}}',
+u'\U0001d6ba': '$\\mathbf{\\Sigma}$',
+u'\U0001d6bb': '$\\mathbf{\\Tau}$',
+u'\U0001d6bc': '$\\mathbf{\\Upsilon}$',
+u'\U0001d6bd': '$\\mathbf{\\Phi}$',
+u'\U0001d6be': '$\\mathbf{\\Chi}$',
+u'\U0001d6bf': '$\\mathbf{\\Psi}$',
+u'\U0001d6c0': '$\\mathbf{\\Omega}$',
+u'\U0001d6c1': '$\\mathbf{\\nabla}$',
+u'\U0001d6c2': '$\\mathbf{\\Alpha}$',
+u'\U0001d6c3': '$\\mathbf{\\Beta}$',
+u'\U0001d6c4': '$\\mathbf{\\Gamma}$',
+u'\U0001d6c5': '$\\mathbf{\\Delta}$',
+u'\U0001d6c6': '$\\mathbf{\\Epsilon}$',
+u'\U0001d6c7': '$\\mathbf{\\Zeta}$',
+u'\U0001d6c8': '$\\mathbf{\\Eta}$',
+u'\U0001d6c9': '$\\mathbf{\\theta}$',
+u'\U0001d6ca': '$\\mathbf{\\Iota}$',
+u'\U0001d6cb': '$\\mathbf{\\Kappa}$',
+u'\U0001d6cc': '$\\mathbf{\\Lambda}$',
+u'\U0001d6cd': '$M$',
+u'\U0001d6ce': '$N$',
+u'\U0001d6cf': '$\\mathbf{\\Xi}$',
+u'\U0001d6d0': '$O$',
+u'\U0001d6d1': '$\\mathbf{\\Pi}$',
+u'\U0001d6d2': '$\\mathbf{\\Rho}$',
+u'\U0001d6d3': '$\\mathbf{\\varsigma}$',
+u'\U0001d6d4': '$\\mathbf{\\Sigma}$',
+u'\U0001d6d5': '$\\mathbf{\\Tau}$',
+u'\U0001d6d6': '$\\mathbf{\\Upsilon}$',
+u'\U0001d6d7': '$\\mathbf{\\Phi}$',
+u'\U0001d6d8': '$\\mathbf{\\Chi}$',
+u'\U0001d6d9': '$\\mathbf{\\Psi}$',
+u'\U0001d6da': '$\\mathbf{\\Omega}$',
+u'\U0001d6db': '$\\partial$',
+u'\U0001d6dc': '$\\in$',
+u'\U0001d6dd': '{\\mathbf{\\vartheta}}',
+u'\U0001d6de': '{\\mathbf{\\varkappa}}',
+u'\U0001d6df': '{\\mathbf{\\phi}}',
+u'\U0001d6e0': '{\\mathbf{\\varrho}}',
+u'\U0001d6e1': '{\\mathbf{\\varpi}}',
+u'\U0001d6e2': '$\\mathsl{\\Alpha}$',
+u'\U0001d6e3': '$\\mathsl{\\Beta}$',
+u'\U0001d6e4': '$\\mathsl{\\Gamma}$',
+u'\U0001d6e5': '$\\mathsl{\\Delta}$',
+u'\U0001d6e6': '$\\mathsl{\\Epsilon}$',
+u'\U0001d6e7': '$\\mathsl{\\Zeta}$',
+u'\U0001d6e8': '$\\mathsl{\\Eta}$',
+u'\U0001d6e9': '$\\mathsl{\\Theta}$',
+u'\U0001d6ea': '$\\mathsl{\\Iota}$',
+u'\U0001d6eb': '$\\mathsl{\\Kappa}$',
+u'\U0001d6ec': '$\\mathsl{\\Lambda}$',
+u'\U0001d6ed': '$M$',
+u'\U0001d6ee': '$N$',
+u'\U0001d6ef': '$\\mathsl{\\Xi}$',
+u'\U0001d6f0': '$O$',
+u'\U0001d6f1': '$\\mathsl{\\Pi}$',
+u'\U0001d6f2': '$\\mathsl{\\Rho}$',
+u'\U0001d6f3': '{\\mathsl{\\vartheta}}',
+u'\U0001d6f4': '$\\mathsl{\\Sigma}$',
+u'\U0001d6f5': '$\\mathsl{\\Tau}$',
+u'\U0001d6f6': '$\\mathsl{\\Upsilon}$',
+u'\U0001d6f7': '$\\mathsl{\\Phi}$',
+u'\U0001d6f8': '$\\mathsl{\\Chi}$',
+u'\U0001d6f9': '$\\mathsl{\\Psi}$',
+u'\U0001d6fa': '$\\mathsl{\\Omega}$',
+u'\U0001d6fb': '$\\mathsl{\\nabla}$',
+u'\U0001d6fc': '$\\mathsl{\\Alpha}$',
+u'\U0001d6fd': '$\\mathsl{\\Beta}$',
+u'\U0001d6fe': '$\\mathsl{\\Gamma}$',
+u'\U0001d6ff': '$\\mathsl{\\Delta}$',
+u'\U0001d700': '$\\mathsl{\\Epsilon}$',
+u'\U0001d701': '$\\mathsl{\\Zeta}$',
+u'\U0001d702': '$\\mathsl{\\Eta}$',
+u'\U0001d703': '$\\mathsl{\\Theta}$',
+u'\U0001d704': '$\\mathsl{\\Iota}$',
+u'\U0001d705': '$\\mathsl{\\Kappa}$',
+u'\U0001d706': '$\\mathsl{\\Lambda}$',
+u'\U0001d707': '$M$',
+u'\U0001d708': '$N$',
+u'\U0001d709': '$\\mathsl{\\Xi}$',
+u'\U0001d70a': '$O$',
+u'\U0001d70b': '$\\mathsl{\\Pi}$',
+u'\U0001d70c': '$\\mathsl{\\Rho}$',
+u'\U0001d70d': '$\\mathsl{\\varsigma}$',
+u'\U0001d70e': '$\\mathsl{\\Sigma}$',
+u'\U0001d70f': '$\\mathsl{\\Tau}$',
+u'\U0001d710': '$\\mathsl{\\Upsilon}$',
+u'\U0001d711': '$\\mathsl{\\Phi}$',
+u'\U0001d712': '$\\mathsl{\\Chi}$',
+u'\U0001d713': '$\\mathsl{\\Psi}$',
+u'\U0001d714': '$\\mathsl{\\Omega}$',
+u'\U0001d715': '$\\partial$',
+u'\U0001d716': '$\\in$',
+u'\U0001d717': '{\\mathsl{\\vartheta}}',
+u'\U0001d718': '{\\mathsl{\\varkappa}}',
+u'\U0001d719': '{\\mathsl{\\phi}}',
+u'\U0001d71a': '{\\mathsl{\\varrho}}',
+u'\U0001d71b': '{\\mathsl{\\varpi}}',
+u'\U0001d71c': '$\\mathbit{\\Alpha}$',
+u'\U0001d71d': '$\\mathbit{\\Beta}$',
+u'\U0001d71e': '$\\mathbit{\\Gamma}$',
+u'\U0001d71f': '$\\mathbit{\\Delta}$',
+u'\U0001d720': '$\\mathbit{\\Epsilon}$',
+u'\U0001d721': '$\\mathbit{\\Zeta}$',
+u'\U0001d722': '$\\mathbit{\\Eta}$',
+u'\U0001d723': '$\\mathbit{\\Theta}$',
+u'\U0001d724': '$\\mathbit{\\Iota}$',
+u'\U0001d725': '$\\mathbit{\\Kappa}$',
+u'\U0001d726': '$\\mathbit{\\Lambda}$',
+u'\U0001d727': '$M$',
+u'\U0001d728': '$N$',
+u'\U0001d729': '$\\mathbit{\\Xi}$',
+u'\U0001d72a': '$O$',
+u'\U0001d72b': '$\\mathbit{\\Pi}$',
+u'\U0001d72c': '$\\mathbit{\\Rho}$',
+u'\U0001d72d': '{\\mathbit{O}}',
+u'\U0001d72e': '$\\mathbit{\\Sigma}$',
+u'\U0001d72f': '$\\mathbit{\\Tau}$',
+u'\U0001d730': '$\\mathbit{\\Upsilon}$',
+u'\U0001d731': '$\\mathbit{\\Phi}$',
+u'\U0001d732': '$\\mathbit{\\Chi}$',
+u'\U0001d733': '$\\mathbit{\\Psi}$',
+u'\U0001d734': '$\\mathbit{\\Omega}$',
+u'\U0001d735': '$\\mathbit{\\nabla}$',
+u'\U0001d736': '$\\mathbit{\\Alpha}$',
+u'\U0001d737': '$\\mathbit{\\Beta}$',
+u'\U0001d738': '$\\mathbit{\\Gamma}$',
+u'\U0001d739': '$\\mathbit{\\Delta}$',
+u'\U0001d73a': '$\\mathbit{\\Epsilon}$',
+u'\U0001d73b': '$\\mathbit{\\Zeta}$',
+u'\U0001d73c': '$\\mathbit{\\Eta}$',
+u'\U0001d73d': '$\\mathbit{\\Theta}$',
+u'\U0001d73e': '$\\mathbit{\\Iota}$',
+u'\U0001d73f': '$\\mathbit{\\Kappa}$',
+u'\U0001d740': '$\\mathbit{\\Lambda}$',
+u'\U0001d741': '$M$',
+u'\U0001d742': '$N$',
+u'\U0001d743': '$\\mathbit{\\Xi}$',
+u'\U0001d744': '$O$',
+u'\U0001d745': '$\\mathbit{\\Pi}$',
+u'\U0001d746': '$\\mathbit{\\Rho}$',
+u'\U0001d747': '$\\mathbit{\\varsigma}$',
+u'\U0001d748': '$\\mathbit{\\Sigma}$',
+u'\U0001d749': '$\\mathbit{\\Tau}$',
+u'\U0001d74a': '$\\mathbit{\\Upsilon}$',
+u'\U0001d74b': '$\\mathbit{\\Phi}$',
+u'\U0001d74c': '$\\mathbit{\\Chi}$',
+u'\U0001d74d': '$\\mathbit{\\Psi}$',
+u'\U0001d74e': '$\\mathbit{\\Omega}$',
+u'\U0001d74f': '$\\partial$',
+u'\U0001d750': '$\\in$',
+u'\U0001d751': '{\\mathbit{\\vartheta}}',
+u'\U0001d752': '{\\mathbit{\\varkappa}}',
+u'\U0001d753': '{\\mathbit{\\phi}}',
+u'\U0001d754': '{\\mathbit{\\varrho}}',
+u'\U0001d755': '{\\mathbit{\\varpi}}',
+u'\U0001d756': '$\\mathsfbf{\\Alpha}$',
+u'\U0001d757': '$\\mathsfbf{\\Beta}$',
+u'\U0001d758': '$\\mathsfbf{\\Gamma}$',
+u'\U0001d759': '$\\mathsfbf{\\Delta}$',
+u'\U0001d75a': '$\\mathsfbf{\\Epsilon}$',
+u'\U0001d75b': '$\\mathsfbf{\\Zeta}$',
+u'\U0001d75c': '$\\mathsfbf{\\Eta}$',
+u'\U0001d75d': '$\\mathsfbf{\\Theta}$',
+u'\U0001d75e': '$\\mathsfbf{\\Iota}$',
+u'\U0001d75f': '$\\mathsfbf{\\Kappa}$',
+u'\U0001d760': '$\\mathsfbf{\\Lambda}$',
+u'\U0001d761': '$M$',
+u'\U0001d762': '$N$',
+u'\U0001d763': '$\\mathsfbf{\\Xi}$',
+u'\U0001d764': '$O$',
+u'\U0001d765': '$\\mathsfbf{\\Pi}$',
+u'\U0001d766': '$\\mathsfbf{\\Rho}$',
+u'\U0001d767': '{\\mathsfbf{\\vartheta}}',
+u'\U0001d768': '$\\mathsfbf{\\Sigma}$',
+u'\U0001d769': '$\\mathsfbf{\\Tau}$',
+u'\U0001d76a': '$\\mathsfbf{\\Upsilon}$',
+u'\U0001d76b': '$\\mathsfbf{\\Phi}$',
+u'\U0001d76c': '$\\mathsfbf{\\Chi}$',
+u'\U0001d76d': '$\\mathsfbf{\\Psi}$',
+u'\U0001d76e': '$\\mathsfbf{\\Omega}$',
+u'\U0001d76f': '$\\mathsfbf{\\nabla}$',
+u'\U0001d770': '$\\mathsfbf{\\Alpha}$',
+u'\U0001d771': '$\\mathsfbf{\\Beta}$',
+u'\U0001d772': '$\\mathsfbf{\\Gamma}$',
+u'\U0001d773': '$\\mathsfbf{\\Delta}$',
+u'\U0001d774': '$\\mathsfbf{\\Epsilon}$',
+u'\U0001d775': '$\\mathsfbf{\\Zeta}$',
+u'\U0001d776': '$\\mathsfbf{\\Eta}$',
+u'\U0001d777': '$\\mathsfbf{\\Theta}$',
+u'\U0001d778': '$\\mathsfbf{\\Iota}$',
+u'\U0001d779': '$\\mathsfbf{\\Kappa}$',
+u'\U0001d77a': '$\\mathsfbf{\\Lambda}$',
+u'\U0001d77b': '$M$',
+u'\U0001d77c': '$N$',
+u'\U0001d77d': '$\\mathsfbf{\\Xi}$',
+u'\U0001d77e': '$O$',
+u'\U0001d77f': '$\\mathsfbf{\\Pi}$',
+u'\U0001d780': '$\\mathsfbf{\\Rho}$',
+u'\U0001d781': '$\\mathsfbf{\\varsigma}$',
+u'\U0001d782': '$\\mathsfbf{\\Sigma}$',
+u'\U0001d783': '$\\mathsfbf{\\Tau}$',
+u'\U0001d784': '$\\mathsfbf{\\Upsilon}$',
+u'\U0001d785': '$\\mathsfbf{\\Phi}$',
+u'\U0001d786': '$\\mathsfbf{\\Chi}$',
+u'\U0001d787': '$\\mathsfbf{\\Psi}$',
+u'\U0001d788': '$\\mathsfbf{\\Omega}$',
+u'\U0001d789': '$\\partial$',
+u'\U0001d78a': '$\\in$',
+u'\U0001d78b': '{\\mathsfbf{\\vartheta}}',
+u'\U0001d78c': '{\\mathsfbf{\\varkappa}}',
+u'\U0001d78d': '{\\mathsfbf{\\phi}}',
+u'\U0001d78e': '{\\mathsfbf{\\varrho}}',
+u'\U0001d78f': '{\\mathsfbf{\\varpi}}',
+u'\U0001d790': '$\\mathsfbfsl{\\Alpha}$',
+u'\U0001d791': '$\\mathsfbfsl{\\Beta}$',
+u'\U0001d792': '$\\mathsfbfsl{\\Gamma}$',
+u'\U0001d793': '$\\mathsfbfsl{\\Delta}$',
+u'\U0001d794': '$\\mathsfbfsl{\\Epsilon}$',
+u'\U0001d795': '$\\mathsfbfsl{\\Zeta}$',
+u'\U0001d796': '$\\mathsfbfsl{\\Eta}$',
+u'\U0001d797': '$\\mathsfbfsl{\\vartheta}$',
+u'\U0001d798': '$\\mathsfbfsl{\\Iota}$',
+u'\U0001d799': '$\\mathsfbfsl{\\Kappa}$',
+u'\U0001d79a': '$\\mathsfbfsl{\\Lambda}$',
+u'\U0001d79b': '$M$',
+u'\U0001d79c': '$N$',
+u'\U0001d79d': '$\\mathsfbfsl{\\Xi}$',
+u'\U0001d79e': '$O$',
+u'\U0001d79f': '$\\mathsfbfsl{\\Pi}$',
+u'\U0001d7a0': '$\\mathsfbfsl{\\Rho}$',
+u'\U0001d7a1': '{\\mathsfbfsl{\\vartheta}}',
+u'\U0001d7a2': '$\\mathsfbfsl{\\Sigma}$',
+u'\U0001d7a3': '$\\mathsfbfsl{\\Tau}$',
+u'\U0001d7a4': '$\\mathsfbfsl{\\Upsilon}$',
+u'\U0001d7a5': '$\\mathsfbfsl{\\Phi}$',
+u'\U0001d7a6': '$\\mathsfbfsl{\\Chi}$',
+u'\U0001d7a7': '$\\mathsfbfsl{\\Psi}$',
+u'\U0001d7a8': '$\\mathsfbfsl{\\Omega}$',
+u'\U0001d7a9': '$\\mathsfbfsl{\\nabla}$',
+u'\U0001d7aa': '$\\mathsfbfsl{\\Alpha}$',
+u'\U0001d7ab': '$\\mathsfbfsl{\\Beta}$',
+u'\U0001d7ac': '$\\mathsfbfsl{\\Gamma}$',
+u'\U0001d7ad': '$\\mathsfbfsl{\\Delta}$',
+u'\U0001d7ae': '$\\mathsfbfsl{\\Epsilon}$',
+u'\U0001d7af': '$\\mathsfbfsl{\\Zeta}$',
+u'\U0001d7b0': '$\\mathsfbfsl{\\Eta}$',
+u'\U0001d7b1': '$\\mathsfbfsl{\\vartheta}$',
+u'\U0001d7b2': '$\\mathsfbfsl{\\Iota}$',
+u'\U0001d7b3': '$\\mathsfbfsl{\\Kappa}$',
+u'\U0001d7b4': '$\\mathsfbfsl{\\Lambda}$',
+u'\U0001d7b5': '$M$',
+u'\U0001d7b6': '$N$',
+u'\U0001d7b7': '$\\mathsfbfsl{\\Xi}$',
+u'\U0001d7b8': '$O$',
+u'\U0001d7b9': '$\\mathsfbfsl{\\Pi}$',
+u'\U0001d7ba': '$\\mathsfbfsl{\\Rho}$',
+u'\U0001d7bb': '$\\mathsfbfsl{\\varsigma}$',
+u'\U0001d7bc': '$\\mathsfbfsl{\\Sigma}$',
+u'\U0001d7bd': '$\\mathsfbfsl{\\Tau}$',
+u'\U0001d7be': '$\\mathsfbfsl{\\Upsilon}$',
+u'\U0001d7bf': '$\\mathsfbfsl{\\Phi}$',
+u'\U0001d7c0': '$\\mathsfbfsl{\\Chi}$',
+u'\U0001d7c1': '$\\mathsfbfsl{\\Psi}$',
+u'\U0001d7c2': '$\\mathsfbfsl{\\Omega}$',
+u'\U0001d7c3': '$\\partial$',
+u'\U0001d7c4': '$\\in$',
+u'\U0001d7c5': '{\\mathsfbfsl{\\vartheta}}',
+u'\U0001d7c6': '{\\mathsfbfsl{\\varkappa}}',
+u'\U0001d7c7': '{\\mathsfbfsl{\\phi}}',
+u'\U0001d7c8': '{\\mathsfbfsl{\\varrho}}',
+u'\U0001d7c9': '{\\mathsfbfsl{\\varpi}}',
+u'\U0001d7ce': '$\\mathbf{0}$',
+u'\U0001d7cf': '$\\mathbf{1}$',
+u'\U0001d7d0': '$\\mathbf{2}$',
+u'\U0001d7d1': '$\\mathbf{3}$',
+u'\U0001d7d2': '$\\mathbf{4}$',
+u'\U0001d7d3': '$\\mathbf{5}$',
+u'\U0001d7d4': '$\\mathbf{6}$',
+u'\U0001d7d5': '$\\mathbf{7}$',
+u'\U0001d7d6': '$\\mathbf{8}$',
+u'\U0001d7d7': '$\\mathbf{9}$',
+u'\U0001d7d8': '$\\mathbb{0}$',
+u'\U0001d7d9': '$\\mathbb{1}$',
+u'\U0001d7da': '$\\mathbb{2}$',
+u'\U0001d7db': '$\\mathbb{3}$',
+u'\U0001d7dc': '$\\mathbb{4}$',
+u'\U0001d7dd': '$\\mathbb{5}$',
+u'\U0001d7de': '$\\mathbb{6}$',
+u'\U0001d7df': '$\\mathbb{7}$',
+u'\U0001d7e0': '$\\mathbb{8}$',
+u'\U0001d7e1': '$\\mathbb{9}$',
+u'\U0001d7e2': '$\\mathsf{0}$',
+u'\U0001d7e3': '$\\mathsf{1}$',
+u'\U0001d7e4': '$\\mathsf{2}$',
+u'\U0001d7e5': '$\\mathsf{3}$',
+u'\U0001d7e6': '$\\mathsf{4}$',
+u'\U0001d7e7': '$\\mathsf{5}$',
+u'\U0001d7e8': '$\\mathsf{6}$',
+u'\U0001d7e9': '$\\mathsf{7}$',
+u'\U0001d7ea': '$\\mathsf{8}$',
+u'\U0001d7eb': '$\\mathsf{9}$',
+u'\U0001d7ec': '$\\mathsfbf{0}$',
+u'\U0001d7ed': '$\\mathsfbf{1}$',
+u'\U0001d7ee': '$\\mathsfbf{2}$',
+u'\U0001d7ef': '$\\mathsfbf{3}$',
+u'\U0001d7f0': '$\\mathsfbf{4}$',
+u'\U0001d7f1': '$\\mathsfbf{5}$',
+u'\U0001d7f2': '$\\mathsfbf{6}$',
+u'\U0001d7f3': '$\\mathsfbf{7}$',
+u'\U0001d7f4': '$\\mathsfbf{8}$',
+u'\U0001d7f5': '$\\mathsfbf{9}$',
+u'\U0001d7f6': '$\\mathtt{0}$',
+u'\U0001d7f7': '$\\mathtt{1}$',
+u'\U0001d7f8': '$\\mathtt{2}$',
+u'\U0001d7f9': '$\\mathtt{3}$',
+u'\U0001d7fa': '$\\mathtt{4}$',
+u'\U0001d7fb': '$\\mathtt{5}$',
+u'\U0001d7fc': '$\\mathtt{6}$',
+u'\U0001d7fd': '$\\mathtt{7}$',
+u'\U0001d7fe': '$\\mathtt{8}$',
+u'\U0001d7ff': '$\\mathtt{9}$'}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/null.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,21 @@
+# $Id: null.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A do-nothing Writer.
+"""
+
+from docutils import writers
+
+
+class Writer(writers.UnfilteredWriter):
+
+    supported = ('null',)
+    """Formats this writer supports."""
+
+    config_section = 'null writer'
+    config_section_dependencies = ('writers',)
+
+    def translate(self):
+        pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/pep_html/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,105 @@
+# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+PEP HTML Writer.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os
+import os.path
+import codecs
+import docutils
+from docutils import frontend, nodes, utils, writers
+from docutils.writers import html4css1
+
+
+class Writer(html4css1.Writer):
+
+    default_stylesheet = 'pep.css'
+
+    default_stylesheet_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_stylesheet))
+
+    default_template = 'template.txt'
+
+    default_template_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_template))
+
+    settings_spec = html4css1.Writer.settings_spec + (
+        'PEP/HTML-Specific Options',
+        'For the PEP/HTML writer, the default value for the --stylesheet-path '
+        'option is "%s", and the default value for --template is "%s". '
+        'See HTML-Specific Options above.'
+        % (default_stylesheet_path, default_template_path),
+        (('Python\'s home URL.  Default is "http://www.python.org".',
+          ['--python-home'],
+          {'default': 'http://www.python.org', 'metavar': '<URL>'}),
+         ('Home URL prefix for PEPs.  Default is "." (current directory).',
+          ['--pep-home'],
+          {'default': '.', 'metavar': '<URL>'}),
+         # For testing.
+         (frontend.SUPPRESS_HELP,
+          ['--no-random'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),))
+
+    settings_default_overrides = {'stylesheet_path': default_stylesheet_path,
+                                  'template': default_template_path,}
+
+    relative_path_settings = (html4css1.Writer.relative_path_settings
+                              + ('template',))
+
+    config_section = 'pep_html writer'
+    config_section_dependencies = ('writers', 'html4css1 writer')
+
+    def __init__(self):
+        html4css1.Writer.__init__(self)
+        self.translator_class = HTMLTranslator
+
+    def interpolation_dict(self):
+        subs = html4css1.Writer.interpolation_dict(self)
+        settings = self.document.settings
+        pyhome = settings.python_home
+        subs['pyhome'] = pyhome
+        subs['pephome'] = settings.pep_home
+        if pyhome == '..':
+            subs['pepindex'] = '.'
+        else:
+            subs['pepindex'] = pyhome + '/dev/peps'
+        index = self.document.first_child_matching_class(nodes.field_list)
+        header = self.document[index]
+        self.pepnum = header[0][1].astext()
+        subs['pep'] = self.pepnum
+        if settings.no_random:
+            subs['banner'] = 0
+        else:
+            import random
+            subs['banner'] = random.randrange(64)
+        try:
+            subs['pepnum'] = '%04i' % int(self.pepnum)
+        except ValueError:
+            subs['pepnum'] = pepnum
+        self.title = header[1][1].astext()
+        subs['title'] = self.title
+        subs['body'] = ''.join(
+            self.body_pre_docinfo + self.docinfo + self.body)
+        return subs
+
+    def assemble_parts(self):
+        html4css1.Writer.assemble_parts(self)
+        self.parts['title'] = [self.title]
+        self.parts['pepnum'] = self.pepnum
+
+
+class HTMLTranslator(html4css1.HTMLTranslator):
+
+    def depart_field_list(self, node):
+        html4css1.HTMLTranslator.depart_field_list(self, node)
+        if 'rfc2822' in node['classes']:
+             self.body.append('<hr />\n')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/pep_html/pep.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,344 @@
+/*
+:Author: David Goodger
+:Contact: goodger@python.org
+:date: $Date: 2006-05-21 22:44:42 +0200 (Sun, 21 May 2006) $
+:version: $Revision: 4564 $
+:copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the PEP HTML output of Docutils.
+*/
+
+/* "! important" is used here to override other ``margin-top`` and
+   ``margin-bottom`` styles that are later in the stylesheet or 
+   more specific.  See http://www.w3.org/TR/CSS1#the-cascade */
+.first {
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+.navigation {
+  width: 100% ;
+  background: #99ccff ;
+  margin-top: 0px ;
+  margin-bottom: 0px }
+
+.navigation .navicon {
+  width: 150px ;
+  height: 35px }
+
+.navigation .textlinks {
+  padding-left: 1em ;
+  text-align: left }
+
+.navigation td, .navigation th {
+  padding-left: 0em ;
+  padding-right: 0em ;
+  vertical-align: middle }
+
+.rfc2822 {
+  margin-top: 0.5em ;
+  margin-left: 0.5em ;
+  margin-right: 0.5em ;
+  margin-bottom: 0em }
+
+.rfc2822 td {
+  text-align: left }
+
+.rfc2822 th.field-name {
+  text-align: right ;
+  font-family: sans-serif ;
+  padding-right: 0.5em ;
+  font-weight: bold ;
+  margin-bottom: 0em }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+body {
+  margin: 0px ;
+  margin-bottom: 1em ;
+  padding: 0px }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+div.section {
+  margin-left: 1em ;
+  margin-right: 1em ;
+  margin-bottom: 1.5em }
+
+div.section div.section {
+  margin-left: 0em ;
+  margin-right: 0em ;
+  margin-top: 1.5em }
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.footer {
+  margin-left: 1em ;
+  margin-right: 1em }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin-left: 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1 {
+  font-family: sans-serif ;
+  font-size: large }
+
+h2 {
+  font-family: sans-serif ;
+  font-size: medium }
+
+h3 {
+  font-family: sans-serif ;
+  font-size: small }
+
+h4 {
+  font-family: sans-serif ;
+  font-style: italic ;
+  font-size: small }
+
+h5 {
+  font-family: sans-serif;
+  font-size: x-small }
+
+h6 {
+  font-family: sans-serif;
+  font-style: italic ;
+  font-size: x-small }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left {
+  clear: left }
+
+img.align-right {
+  clear: right }
+
+img.borderless {
+  border: 0 }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font-family: serif ;
+  font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.option-argument {
+  font-style: italic }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+td.num {
+  text-align: right }
+
+th.field-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+ul.auto-toc {
+  list-style-type: none }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/pep_html/template.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="%(encoding)s" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+This HTML is auto-generated.  DO NOT EDIT THIS FILE!  If you are writing a new
+PEP, see http://www.python.org/dev/peps/pep-0001 for instructions and links
+to templates.  DO NOT USE THIS HTML FILE AS YOUR TEMPLATE!
+-->
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=%(encoding)s" />
+  <meta name="generator" content="Docutils %(version)s: http://docutils.sourceforge.net/" />
+  <title>PEP %(pep)s -- %(title)s</title>
+  %(stylesheet)s
+</head>
+<body bgcolor="white">
+<table class="navigation" cellpadding="0" cellspacing="0"
+       width="100%%" border="0">
+<tr><td class="navicon" width="150" height="35">
+<a href="%(pyhome)s/" title="Python Home Page">
+<img src="%(pyhome)s/pics/PyBanner%(banner)03d.gif" alt="[Python]"
+ border="0" width="150" height="35" /></a></td>
+<td class="textlinks" align="left">
+[<b><a href="%(pyhome)s/">Python Home</a></b>]
+[<b><a href="%(pepindex)s/">PEP Index</a></b>]
+[<b><a href="%(pephome)s/pep-%(pepnum)s.txt">PEP Source</a></b>]
+</td></tr></table>
+<div class="document">
+%(body)s
+%(body_suffix)s
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/pseudoxml.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,31 @@
+# $Id: pseudoxml.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+Simple internal document tree Writer, writes indented pseudo-XML.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils import writers
+
+
+class Writer(writers.Writer):
+
+    supported = ('pprint', 'pformat', 'pseudoxml')
+    """Formats this writer supports."""
+
+    config_section = 'pseudoxml writer'
+    config_section_dependencies = ('writers',)
+
+    output = None
+    """Final translated form of `document`."""
+
+    def translate(self):
+        self.output = self.document.pformat()
+
+    def supports(self, format):
+        """This writer supports all format-specific elements."""
+        return 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,337 @@
+# $Id: __init__.py 4883 2007-01-16 01:51:28Z wiemann $
+# Authors: Chris Liechti <cliechti@gmx.net>;
+#          David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+S5/HTML Slideshow Writer.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os
+import re
+import docutils
+from docutils import frontend, nodes, utils
+from docutils.writers import html4css1
+from docutils.parsers.rst import directives
+
+themes_dir_path = utils.relative_path(
+    os.path.join(os.getcwd(), 'dummy'),
+    os.path.join(os.path.dirname(__file__), 'themes'))
+
+def find_theme(name):
+    # Where else to look for a theme?
+    # Check working dir?  Destination dir?  Config dir?  Plugins dir?
+    path = os.path.join(themes_dir_path, name)
+    if not os.path.isdir(path):
+        raise docutils.ApplicationError(
+            'Theme directory not found: %r (path: %r)' % (name, path))
+    return path
+
+
+class Writer(html4css1.Writer):
+
+    settings_spec = html4css1.Writer.settings_spec + (
+        'S5 Slideshow Specific Options',
+        'For the S5/HTML writer, the --no-toc-backlinks option '
+        '(defined in General Docutils Options above) is the default, '
+        'and should not be changed.',
+        (('Specify an installed S5 theme by name.  Overrides --theme-url.  '
+          'The default theme name is "default".  The theme files will be '
+          'copied into a "ui/<theme>" directory, in the same directory as the '
+          'destination file (output HTML).  Note that existing theme files '
+          'will not be overwritten (unless --overwrite-theme-files is used).',
+          ['--theme'],
+          {'default': 'default', 'metavar': '<name>',
+           'overrides': 'theme_url'}),
+         ('Specify an S5 theme URL.  The destination file (output HTML) will '
+          'link to this theme; nothing will be copied.  Overrides --theme.',
+          ['--theme-url'],
+          {'metavar': '<URL>', 'overrides': 'theme'}),
+         ('Allow existing theme files in the ``ui/<theme>`` directory to be '
+          'overwritten.  The default is not to overwrite theme files.',
+          ['--overwrite-theme-files'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Keep existing theme files in the ``ui/<theme>`` directory; do not '
+          'overwrite any.  This is the default.',
+          ['--keep-theme-files'],
+          {'dest': 'overwrite_theme_files', 'action': 'store_false'}),
+         ('Set the initial view mode to "slideshow" [default] or "outline".',
+          ['--view-mode'],
+          {'choices': ['slideshow', 'outline'], 'default': 'slideshow',
+           'metavar': '<mode>'}),
+         ('Normally hide the presentation controls in slideshow mode. '
+          'This is the default.',
+          ['--hidden-controls'],
+          {'action': 'store_true', 'default': True,
+           'validator': frontend.validate_boolean}),
+         ('Always show the presentation controls in slideshow mode.  '
+          'The default is to hide the controls.',
+          ['--visible-controls'],
+          {'dest': 'hidden_controls', 'action': 'store_false'}),
+         ('Enable the current slide indicator ("1 / 15").  '
+          'The default is to disable it.',
+          ['--current-slide'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Disable the current slide indicator.  This is the default.',
+          ['--no-current-slide'],
+          {'dest': 'current_slide', 'action': 'store_false'}),))
+
+    settings_default_overrides = {'toc_backlinks': 0}
+
+    config_section = 's5_html writer'
+    config_section_dependencies = ('writers', 'html4css1 writer')
+
+    def __init__(self):
+        html4css1.Writer.__init__(self)
+        self.translator_class = S5HTMLTranslator
+
+
+class S5HTMLTranslator(html4css1.HTMLTranslator):
+
+    s5_stylesheet_template = """\
+<!-- configuration parameters -->
+<meta name="defaultView" content="%(view_mode)s" />
+<meta name="controlVis" content="%(control_visibility)s" />
+<!-- style sheet links -->
+<script src="%(path)s/slides.js" type="text/javascript"></script>
+<link rel="stylesheet" href="%(path)s/slides.css"
+      type="text/css" media="projection" id="slideProj" />
+<link rel="stylesheet" href="%(path)s/outline.css"
+      type="text/css" media="screen" id="outlineStyle" />
+<link rel="stylesheet" href="%(path)s/print.css"
+      type="text/css" media="print" id="slidePrint" />
+<link rel="stylesheet" href="%(path)s/opera.css"
+      type="text/css" media="projection" id="operaFix" />\n"""
+    # The script element must go in front of the link elements to
+    # avoid a flash of unstyled content (FOUC), reproducible with
+    # Firefox.
+
+    disable_current_slide = """
+<style type="text/css">
+#currentSlide {display: none;}
+</style>\n"""
+
+    layout_template = """\
+<div class="layout">
+<div id="controls"></div>
+<div id="currentSlide"></div>
+<div id="header">
+%(header)s
+</div>
+<div id="footer">
+%(title)s%(footer)s
+</div>
+</div>\n"""
+# <div class="topleft"></div>
+# <div class="topright"></div>
+# <div class="bottomleft"></div>
+# <div class="bottomright"></div>
+
+    default_theme = 'default'
+    """Name of the default theme."""
+
+    base_theme_file = '__base__'
+    """Name of the file containing the name of the base theme."""
+
+    direct_theme_files = (
+        'slides.css', 'outline.css', 'print.css', 'opera.css', 'slides.js')
+    """Names of theme files directly linked to in the output HTML"""
+
+    indirect_theme_files = (
+        's5-core.css', 'framing.css', 'pretty.css', 'blank.gif', 'iepngfix.htc')
+    """Names of files used indirectly; imported or used by files in
+    `direct_theme_files`."""
+
+    required_theme_files = indirect_theme_files + direct_theme_files
+    """Names of mandatory theme files."""
+
+    def __init__(self, *args):
+        html4css1.HTMLTranslator.__init__(self, *args)
+        #insert S5-specific stylesheet and script stuff:
+        self.theme_file_path = None
+        self.setup_theme()
+        view_mode = self.document.settings.view_mode
+        control_visibility = ('visible', 'hidden')[self.document.settings
+                                                   .hidden_controls]
+        self.stylesheet.append(self.s5_stylesheet_template
+                               % {'path': self.theme_file_path,
+                                  'view_mode': view_mode,
+                                  'control_visibility': control_visibility})
+        if not self.document.settings.current_slide:
+            self.stylesheet.append(self.disable_current_slide)
+        self.add_meta('<meta name="version" content="S5 1.1" />\n')
+        self.s5_footer = []
+        self.s5_header = []
+        self.section_count = 0
+        self.theme_files_copied = None
+
+    def setup_theme(self):
+        if self.document.settings.theme:
+            self.copy_theme()
+        elif self.document.settings.theme_url:
+            self.theme_file_path = self.document.settings.theme_url
+        else:
+            raise docutils.ApplicationError(
+                'No theme specified for S5/HTML writer.')
+
+    def copy_theme(self):
+        """
+        Locate & copy theme files.
+
+        A theme may be explicitly based on another theme via a '__base__'
+        file.  The default base theme is 'default'.  Files are accumulated
+        from the specified theme, any base themes, and 'default'.
+        """
+        settings = self.document.settings
+        path = find_theme(settings.theme)
+        theme_paths = [path]
+        self.theme_files_copied = {}
+        required_files_copied = {}
+        # This is a link (URL) in HTML, so we use "/", not os.sep:
+        self.theme_file_path = '%s/%s' % ('ui', settings.theme)
+        if settings._destination:
+            dest = os.path.join(
+                os.path.dirname(settings._destination), 'ui', settings.theme)
+            if not os.path.isdir(dest):
+                os.makedirs(dest)
+        else:
+            # no destination, so we can't copy the theme
+            return
+        default = 0
+        while path:
+            for f in os.listdir(path):  # copy all files from each theme
+                if f == self.base_theme_file:
+                    continue            # ... except the "__base__" file
+                if ( self.copy_file(f, path, dest)
+                     and f in self.required_theme_files):
+                    required_files_copied[f] = 1
+            if default:
+                break                   # "default" theme has no base theme
+            # Find the "__base__" file in theme directory:
+            base_theme_file = os.path.join(path, self.base_theme_file)
+            # If it exists, read it and record the theme path:
+            if os.path.isfile(base_theme_file):
+                lines = open(base_theme_file).readlines()
+                for line in lines:
+                    line = line.strip()
+                    if line and not line.startswith('#'):
+                        path = find_theme(line)
+                        if path in theme_paths: # check for duplicates (cycles)
+                            path = None         # if found, use default base
+                        else:
+                            theme_paths.append(path)
+                        break
+                else:                   # no theme name found
+                    path = None         # use default base
+            else:                       # no base theme file found
+                path = None             # use default base
+            if not path:
+                path = find_theme(self.default_theme)
+                theme_paths.append(path)
+                default = 1
+        if len(required_files_copied) != len(self.required_theme_files):
+            # Some required files weren't found & couldn't be copied.
+            required = list(self.required_theme_files)
+            for f in required_files_copied.keys():
+                required.remove(f)
+            raise docutils.ApplicationError(
+                'Theme files not found: %s'
+                % ', '.join(['%r' % f for f in required]))
+
+    files_to_skip_pattern = re.compile(r'~$|\.bak$|#$|\.cvsignore$')
+
+    def copy_file(self, name, source_dir, dest_dir):
+        """
+        Copy file `name` from `source_dir` to `dest_dir`.
+        Return 1 if the file exists in either `source_dir` or `dest_dir`.
+        """
+        source = os.path.join(source_dir, name)
+        dest = os.path.join(dest_dir, name)
+        if self.theme_files_copied.has_key(dest):
+            return 1
+        else:
+            self.theme_files_copied[dest] = 1
+        if os.path.isfile(source):
+            if self.files_to_skip_pattern.search(source):
+                return None
+            settings = self.document.settings
+            if os.path.exists(dest) and not settings.overwrite_theme_files:
+                settings.record_dependencies.add(dest)
+            else:
+                src_file = open(source, 'rb')
+                src_data = src_file.read()
+                src_file.close()
+                dest_file = open(dest, 'wb')
+                dest_dir = dest_dir.replace(os.sep, '/')
+                dest_file.write(src_data.replace(
+                    'ui/default', dest_dir[dest_dir.rfind('ui/'):]))
+                dest_file.close()
+                settings.record_dependencies.add(source)
+            return 1
+        if os.path.isfile(dest):
+            return 1
+
+    def depart_document(self, node):
+        header = ''.join(self.s5_header)
+        footer = ''.join(self.s5_footer)
+        title = ''.join(self.html_title).replace('<h1 class="title">', '<h1>')
+        layout = self.layout_template % {'header': header,
+                                         'title': title,
+                                         'footer': footer}
+        self.fragment.extend(self.body)
+        self.body_prefix.extend(layout)
+        self.body_prefix.append('<div class="presentation">\n')
+        self.body_prefix.append(
+            self.starttag({'classes': ['slide'], 'ids': ['slide0']}, 'div'))
+        if not self.section_count:
+            self.body.append('</div>\n')
+        self.body_suffix.insert(0, '</div>\n')
+        # skip content-type meta tag with interpolated charset value:
+        self.html_head.extend(self.head[1:])
+        self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo
+                              + self.docinfo + self.body
+                              + self.body_suffix[:-1])
+
+    def depart_footer(self, node):
+        start = self.context.pop()
+        self.s5_footer.append('<h2>')
+        self.s5_footer.extend(self.body[start:])
+        self.s5_footer.append('</h2>')
+        del self.body[start:]
+
+    def depart_header(self, node):
+        start = self.context.pop()
+        header = ['<div id="header">\n']
+        header.extend(self.body[start:])
+        header.append('\n</div>\n')
+        del self.body[start:]
+        self.s5_header.extend(header)
+
+    def visit_section(self, node):
+        if not self.section_count:
+            self.body.append('\n</div>\n')
+        self.section_count += 1
+        self.section_level += 1
+        if self.section_level > 1:
+            # dummy for matching div's
+            self.body.append(self.starttag(node, 'div', CLASS='section'))
+        else:
+            self.body.append(self.starttag(node, 'div', CLASS='slide'))
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.section):
+            level = self.section_level + self.initial_header_level - 1
+            if level == 1:
+                level = 2
+            tag = 'h%s' % level
+            self.body.append(self.starttag(node, tag, ''))
+            self.context.append('</%s>\n' % tag)
+        else:
+            html4css1.HTMLTranslator.visit_subtitle(self, node)
+
+    def visit_title(self, node):
+        html4css1.HTMLTranslator.visit_title(self, node)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/README.txt	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,6 @@
+Except where otherwise noted (default/iepngfix.htc), all files in this
+directory have been released into the Public Domain.
+
+These files are based on files from S5 1.1, released into the Public
+Domain by Eric Meyer.  For further details, please see
+http://www.meyerweb.com/eric/tools/s5/credits.html.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/__base__	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,2 @@
+# base theme of this theme:
+big-white
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/framing.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,25 @@
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+    to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {top: 0; z-index: 1;}
+div#footer {display:none;}
+.slide {top: 0; width: 92%; padding: 0.1em 4% 4%; z-index: 2;}
+/*  list-style: none;} */
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/pretty.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,109 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;}
+.slide h2 {font-size: 110%;}
+.slide h3 {font-size: 105%;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0;
+  font-size: 150%; white-space: normal; background: transparent;}
+#slide0 h2 {font: 110%; font-style: italic; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-size: 150%;}
+.big {font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/framing.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+   to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {display:none;}
+.slide {top: 0; width: 92%; padding: 0.25em 4% 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/pretty.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,107 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #88A !important;}
+#controls :focus {outline: 1px dotted #227;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;}
+.slide h2 {font-size: 110%;}
+.slide h3 {font-size: 105%;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #005; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #227;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0;
+  font-size: 150%; white-space: normal; background: transparent;}
+#slide0 h2 {font: 110%; font-style: italic; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: white; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-size: 150%;}
+.big {font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Binary file buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/blank.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/framing.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,25 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+   to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {position: fixed; top: 0; height: 3em; z-index: 1;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 2.5em 4% 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/iepngfix.htc	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,42 @@
+<public:component>
+<public:attach event="onpropertychange" onevent="doFix()" />
+
+<script>
+
+// IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull http://www.twinhelix.com
+// Free usage permitted as long as this notice remains intact.
+
+// This must be a path to a blank image. That's all the configuration you need here.
+var blankImg = 'ui/default/blank.gif';
+
+var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
+
+function filt(s, m) {
+ if (filters[f]) {
+  filters[f].enabled = s ? true : false;
+  if (s) with (filters[f]) { src = s; sizingMethod = m }
+ } else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
+}
+
+function doFix() {
+ if ((parseFloat(navigator.userAgent.match(/MSIE (\S+)/)[1]) < 5.5) ||
+  (event && !/(background|src)/.test(event.propertyName))) return;
+
+ if (tagName == 'IMG') {
+  if ((/\.png$/i).test(src)) {
+   filt(src, 'image');  // was 'scale'
+   src = blankImg;
+  } else if (src.indexOf(blankImg) < 0) filt();
+ } else if (style.backgroundImage) {
+  if (style.backgroundImage.match(/^url[("']+(.*\.png)[)"']+$/i)) {
+   var s = RegExp.$1;
+   style.backgroundImage = '';
+   filt(s, 'crop');
+  } else filt();
+ }
+}
+
+doFix();
+
+</script>
+</public:component>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/opera.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,8 @@
+/* This file has been placed in the public domain. */
+/* DO NOT CHANGE THESE unless you really want to break Opera Show */
+.slide {
+	visibility: visible !important;
+	position: static !important;
+	page-break-before: always;
+}
+#slide0 {page-break-before: avoid;}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/outline.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,16 @@
+/* This file has been placed in the public domain. */
+/* Don't change this unless you want the layout stuff to show up in the
+   outline view! */
+
+.layout div, #footer *, #controlForm * {display: none;}
+#footer, #controls, #controlForm, #navLinks, #toggle {
+  display: block; visibility: visible; margin: 0; padding: 0;}
+#toggle {float: right; padding: 0.5em;}
+html>body #toggle {position: fixed; top: 0; right: 0;}
+
+/* making the outline look pretty-ish */
+
+#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;}
+#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;}
+
+.outline {display: inline ! important;}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/pretty.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,120 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+/* Replace the background style above with the style below (and again for
+   div#header) for a graphic: */
+/* background: white url(bodybg.gif) -16px 0 no-repeat; */
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #88A !important;}
+#controls :focus {outline: 1px dotted #227;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#header, div#footer {background: #005; color: #AAB; font-family: sans-serif;}
+/* background: #005 url(bodybg.gif) -16px 0 no-repeat; */
+div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {position: absolute; top: 0.45em; z-index: 1;
+  margin: 0; padding-left: 0.7em; white-space: nowrap;
+  font: bold 150% sans-serif; color: #DDE; background: #005;}
+.slide h2 {font: bold 120%/1em sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  background: #005; border: none; color: #779; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #227;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #449;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 1.5em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0; color: #000;
+  font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {visibility: visible;
+  color: white; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/print.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following rule is necessary to have all slides appear in print!
+   DO NOT REMOVE IT! */
+.slide, ul {page-break-inside: avoid; visibility: visible !important;}
+h1 {page-break-after: avoid;}
+
+body {font-size: 12pt; background: white;}
+* {color: black;}
+
+#slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;}
+#slide0 h3 {margin: 0; padding: 0;}
+#slide0 h4 {margin: 0 0 0.5em; padding: 0;}
+#slide0 {margin-bottom: 3em;}
+
+#header {display: none;}
+#footer h1 {margin: 0; border-bottom: 1px solid; color: gray;
+  font-style: italic;}
+#footer h2, #controls {display: none;}
+
+.print {display: inline ! important;}
+
+/* The following rule keeps the layout stuff out of print.
+   Remove at your own risk! */
+.layout, .layout * {display: none !important;}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/s5-core.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,11 @@
+/* This file has been placed in the public domain. */
+/* Do not edit or override these styles!
+   The system will likely break if you do. */
+
+div#header, div#footer, div#controls, .slide {position: absolute;}
+html>body div#header, html>body div#footer, 
+  html>body div#controls, html>body .slide {position: fixed;}
+.handout {display: none;}
+.layout {display: block;}
+.slide, .hideme, .incremental {visibility: hidden;}
+#slide0 {visibility: visible;}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,10 @@
+/* This file has been placed in the public domain. */
+
+/* required to make the slide show run at all */
+@import url(s5-core.css);
+
+/* sets basic placement and size of slide components */
+@import url(framing.css);
+
+/* styles that make the slides look good */
+@import url(pretty.css);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.js	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,558 @@
+// S5 v1.1 slides.js -- released into the Public Domain
+// Modified for Docutils (http://docutils.sf.net) by David Goodger
+//
+// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for
+// information about all the wonderful and talented contributors to this code!
+
+var undef;
+var slideCSS = '';
+var snum = 0;
+var smax = 1;
+var slideIDs = new Array();
+var incpos = 0;
+var number = undef;
+var s5mode = true;
+var defaultView = 'slideshow';
+var controlVis = 'visible';
+
+var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0;
+var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
+var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
+
+function hasClass(object, className) {
+	if (!object.className) return false;
+	return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
+}
+
+function hasValue(object, value) {
+	if (!object) return false;
+	return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
+}
+
+function removeClass(object,className) {
+	if (!object) return;
+	object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
+}
+
+function addClass(object,className) {
+	if (!object || hasClass(object, className)) return;
+	if (object.className) {
+		object.className += ' '+className;
+	} else {
+		object.className = className;
+	}
+}
+
+function GetElementsWithClassName(elementName,className) {
+	var allElements = document.getElementsByTagName(elementName);
+	var elemColl = new Array();
+	for (var i = 0; i< allElements.length; i++) {
+		if (hasClass(allElements[i], className)) {
+			elemColl[elemColl.length] = allElements[i];
+		}
+	}
+	return elemColl;
+}
+
+function isParentOrSelf(element, id) {
+	if (element == null || element.nodeName=='BODY') return false;
+	else if (element.id == id) return true;
+	else return isParentOrSelf(element.parentNode, id);
+}
+
+function nodeValue(node) {
+	var result = "";
+	if (node.nodeType == 1) {
+		var children = node.childNodes;
+		for (var i = 0; i < children.length; ++i) {
+			result += nodeValue(children[i]);
+		}		
+	}
+	else if (node.nodeType == 3) {
+		result = node.nodeValue;
+	}
+	return(result);
+}
+
+function slideLabel() {
+	var slideColl = GetElementsWithClassName('*','slide');
+	var list = document.getElementById('jumplist');
+	smax = slideColl.length;
+	for (var n = 0; n < smax; n++) {
+		var obj = slideColl[n];
+
+		var did = 'slide' + n.toString();
+		if (obj.getAttribute('id')) {
+			slideIDs[n] = obj.getAttribute('id');
+		}
+		else {
+			obj.setAttribute('id',did);
+			slideIDs[n] = did;
+		}
+		if (isOp) continue;
+
+		var otext = '';
+		var menu = obj.firstChild;
+		if (!menu) continue; // to cope with empty slides
+		while (menu && menu.nodeType == 3) {
+			menu = menu.nextSibling;
+		}
+	 	if (!menu) continue; // to cope with slides with only text nodes
+
+		var menunodes = menu.childNodes;
+		for (var o = 0; o < menunodes.length; o++) {
+			otext += nodeValue(menunodes[o]);
+		}
+		list.options[list.length] = new Option(n + ' : '  + otext, n);
+	}
+}
+
+function currentSlide() {
+	var cs;
+	var footer_nodes;
+	var vis = 'visible';
+	if (document.getElementById) {
+		cs = document.getElementById('currentSlide');
+		footer_nodes = document.getElementById('footer').childNodes;
+	} else {
+		cs = document.currentSlide;
+		footer = document.footer.childNodes;
+	}
+	cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' + 
+		'<span id="csSep">\/<\/span> ' + 
+		'<span id="csTotal">' + (smax-1) + '<\/span>';
+	if (snum == 0) {
+		vis = 'hidden';
+	}
+	cs.style.visibility = vis;
+	for (var i = 0; i < footer_nodes.length; i++) {
+		if (footer_nodes[i].nodeType == 1) {
+			footer_nodes[i].style.visibility = vis;
+		}
+	}		
+}
+
+function go(step) {
+	if (document.getElementById('slideProj').disabled || step == 0) return;
+	var jl = document.getElementById('jumplist');
+	var cid = slideIDs[snum];
+	var ce = document.getElementById(cid);
+	if (incrementals[snum].length > 0) {
+		for (var i = 0; i < incrementals[snum].length; i++) {
+			removeClass(incrementals[snum][i], 'current');
+			removeClass(incrementals[snum][i], 'incremental');
+		}
+	}
+	if (step != 'j') {
+		snum += step;
+		lmax = smax - 1;
+		if (snum > lmax) snum = lmax;
+		if (snum < 0) snum = 0;
+	} else
+		snum = parseInt(jl.value);
+	var nid = slideIDs[snum];
+	var ne = document.getElementById(nid);
+	if (!ne) {
+		ne = document.getElementById(slideIDs[0]);
+		snum = 0;
+	}
+	if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
+	if (incrementals[snum].length > 0 && incpos == 0) {
+		for (var i = 0; i < incrementals[snum].length; i++) {
+			if (hasClass(incrementals[snum][i], 'current'))
+				incpos = i + 1;
+			else
+				addClass(incrementals[snum][i], 'incremental');
+		}
+	}
+	if (incrementals[snum].length > 0 && incpos > 0)
+		addClass(incrementals[snum][incpos - 1], 'current');
+	ce.style.visibility = 'hidden';
+	ne.style.visibility = 'visible';
+	jl.selectedIndex = snum;
+	currentSlide();
+	number = 0;
+}
+
+function goTo(target) {
+	if (target >= smax || target == snum) return;
+	go(target - snum);
+}
+
+function subgo(step) {
+	if (step > 0) {
+		removeClass(incrementals[snum][incpos - 1],'current');
+		removeClass(incrementals[snum][incpos], 'incremental');
+		addClass(incrementals[snum][incpos],'current');
+		incpos++;
+	} else {
+		incpos--;
+		removeClass(incrementals[snum][incpos],'current');
+		addClass(incrementals[snum][incpos], 'incremental');
+		addClass(incrementals[snum][incpos - 1],'current');
+	}
+}
+
+function toggle() {
+	var slideColl = GetElementsWithClassName('*','slide');
+	var slides = document.getElementById('slideProj');
+	var outline = document.getElementById('outlineStyle');
+	if (!slides.disabled) {
+		slides.disabled = true;
+		outline.disabled = false;
+		s5mode = false;
+		fontSize('1em');
+		for (var n = 0; n < smax; n++) {
+			var slide = slideColl[n];
+			slide.style.visibility = 'visible';
+		}
+	} else {
+		slides.disabled = false;
+		outline.disabled = true;
+		s5mode = true;
+		fontScale();
+		for (var n = 0; n < smax; n++) {
+			var slide = slideColl[n];
+			slide.style.visibility = 'hidden';
+		}
+		slideColl[snum].style.visibility = 'visible';
+	}
+}
+
+function showHide(action) {
+	var obj = GetElementsWithClassName('*','hideme')[0];
+	switch (action) {
+	case 's': obj.style.visibility = 'visible'; break;
+	case 'h': obj.style.visibility = 'hidden'; break;
+	case 'k':
+		if (obj.style.visibility != 'visible') {
+			obj.style.visibility = 'visible';
+		} else {
+			obj.style.visibility = 'hidden';
+		}
+	break;
+	}
+}
+
+// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
+function keys(key) {
+	if (!key) {
+		key = event;
+		key.which = key.keyCode;
+	}
+	if (key.which == 84) {
+		toggle();
+		return;
+	}
+	if (s5mode) {
+		switch (key.which) {
+			case 10: // return
+			case 13: // enter
+				if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+				if (key.target && isParentOrSelf(key.target, 'controls')) return;
+				if(number != undef) {
+					goTo(number);
+					break;
+				}
+			case 32: // spacebar
+			case 34: // page down
+			case 39: // rightkey
+			case 40: // downkey
+				if(number != undef) {
+					go(number);
+				} else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+					go(1);
+				} else {
+					subgo(1);
+				}
+				break;
+			case 33: // page up
+			case 37: // leftkey
+			case 38: // upkey
+				if(number != undef) {
+					go(-1 * number);
+				} else if (!incrementals[snum] || incpos <= 0) {
+					go(-1);
+				} else {
+					subgo(-1);
+				}
+				break;
+			case 36: // home
+				goTo(0);
+				break;
+			case 35: // end
+				goTo(smax-1);
+				break;
+			case 67: // c
+				showHide('k');
+				break;
+		}
+		if (key.which < 48 || key.which > 57) {
+			number = undef;
+		} else {
+			if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+			if (key.target && isParentOrSelf(key.target, 'controls')) return;
+			number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
+		}
+	}
+	return false;
+}
+
+function clicker(e) {
+	number = undef;
+	var target;
+	if (window.event) {
+		target = window.event.srcElement;
+		e = window.event;
+	} else target = e.target;
+    if (target.href != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target, 'object')) return true; 
+	if (!e.which || e.which == 1) {
+		if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+			go(1);
+		} else {
+			subgo(1);
+		}
+	}
+}
+
+function findSlide(hash) {
+	var target = document.getElementById(hash);
+	if (target) {
+		for (var i = 0; i < slideIDs.length; i++) {
+			if (target.id == slideIDs[i]) return i;
+		}
+	}
+	return null;
+}
+
+function slideJump() {
+	if (window.location.hash == null || window.location.hash == '') {
+		currentSlide();
+		return;
+	}
+	if (window.location.hash == null) return;
+	var dest = null;
+	dest = findSlide(window.location.hash.slice(1));
+	if (dest == null) {
+		dest = 0;
+	}
+	go(dest - snum);
+}
+
+function fixLinks() {
+	var thisUri = window.location.href;
+	thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
+	var aelements = document.getElementsByTagName('A');
+	for (var i = 0; i < aelements.length; i++) {
+		var a = aelements[i].href;
+		var slideID = a.match('\#.+');
+		if ((slideID) && (slideID[0].slice(0,1) == '#')) {
+			var dest = findSlide(slideID[0].slice(1));
+			if (dest != null) {
+				if (aelements[i].addEventListener) {
+					aelements[i].addEventListener("click", new Function("e",
+						"if (document.getElementById('slideProj').disabled) return;" +
+						"go("+dest+" - snum); " +
+						"if (e.preventDefault) e.preventDefault();"), true);
+				} else if (aelements[i].attachEvent) {
+					aelements[i].attachEvent("onclick", new Function("",
+						"if (document.getElementById('slideProj').disabled) return;" +
+						"go("+dest+" - snum); " +
+						"event.returnValue = false;"));
+				}
+			}
+		}
+	}
+}
+
+function externalLinks() {
+	if (!document.getElementsByTagName) return;
+	var anchors = document.getElementsByTagName('a');
+	for (var i=0; i<anchors.length; i++) {
+		var anchor = anchors[i];
+		if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
+			anchor.target = '_blank';
+			addClass(anchor,'external');
+		}
+	}
+}
+
+function createControls() {
+	var controlsDiv = document.getElementById("controls");
+	if (!controlsDiv) return;
+	var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
+	var hideDiv, hideList = '';
+	if (controlVis == 'hidden') {
+		hideDiv = hider;
+	} else {
+		hideList = hider;
+	}
+	controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
+	'<div id="navLinks">' +
+	'<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
+	'<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
+	'<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
+	'<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
+	'<\/div><\/form>';
+	if (controlVis == 'hidden') {
+		var hidden = document.getElementById('navLinks');
+	} else {
+		var hidden = document.getElementById('jumplist');
+	}
+	addClass(hidden,'hideme');
+}
+
+function fontScale() {  // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers
+	if (!s5mode) return false;
+	var vScale = 22;  // both yield 32 (after rounding) at 1024x768
+	var hScale = 32;  // perhaps should auto-calculate based on theme's declared value?
+	if (window.innerHeight) {
+		var vSize = window.innerHeight;
+		var hSize = window.innerWidth;
+	} else if (document.documentElement.clientHeight) {
+		var vSize = document.documentElement.clientHeight;
+		var hSize = document.documentElement.clientWidth;
+	} else if (document.body.clientHeight) {
+		var vSize = document.body.clientHeight;
+		var hSize = document.body.clientWidth;
+	} else {
+		var vSize = 700;  // assuming 1024x768, minus chrome and such
+		var hSize = 1024; // these do not account for kiosk mode or Opera Show
+	}
+	var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
+	fontSize(newSize + 'px');
+	if (isGe) {  // hack to counter incremental reflow bugs
+		var obj = document.getElementsByTagName('body')[0];
+		obj.style.display = 'none';
+		obj.style.display = 'block';
+	}
+}
+
+function fontSize(value) {
+	if (!(s5ss = document.getElementById('s5ss'))) {
+		if (!isIE) {
+			document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
+			s5ss.setAttribute('media','screen, projection');
+			s5ss.setAttribute('id','s5ss');
+		} else {
+			document.createStyleSheet();
+			document.s5ss = document.styleSheets[document.styleSheets.length - 1];
+		}
+	}
+	if (!isIE) {
+		while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
+		s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
+	} else {
+		document.s5ss.addRule('body','font-size: ' + value + ' !important;');
+	}
+}
+
+function notOperaFix() {
+	slideCSS = document.getElementById('slideProj').href;
+	var slides = document.getElementById('slideProj');
+	var outline = document.getElementById('outlineStyle');
+	slides.setAttribute('media','screen');
+	outline.disabled = true;
+	if (isGe) {
+		slides.setAttribute('href','null');   // Gecko fix
+		slides.setAttribute('href',slideCSS); // Gecko fix
+	}
+	if (isIE && document.styleSheets && document.styleSheets[0]) {
+		document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)');
+		document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)');
+		document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)');
+	}
+}
+
+function getIncrementals(obj) {
+	var incrementals = new Array();
+	if (!obj) 
+		return incrementals;
+	var children = obj.childNodes;
+	for (var i = 0; i < children.length; i++) {
+		var child = children[i];
+		if (hasClass(child, 'incremental')) {
+			if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+				removeClass(child, 'incremental');
+				for (var j = 0; j < child.childNodes.length; j++) {
+					if (child.childNodes[j].nodeType == 1) {
+						addClass(child.childNodes[j], 'incremental');
+					}
+				}
+			} else {
+				incrementals[incrementals.length] = child;
+				removeClass(child,'incremental');
+			}
+		}
+		if (hasClass(child, 'show-first')) {
+			if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+				removeClass(child, 'show-first');
+				if (child.childNodes[isGe].nodeType == 1) {
+					removeClass(child.childNodes[isGe], 'incremental');
+				}
+			} else {
+				incrementals[incrementals.length] = child;
+			}
+		}
+		incrementals = incrementals.concat(getIncrementals(child));
+	}
+	return incrementals;
+}
+
+function createIncrementals() {
+	var incrementals = new Array();
+	for (var i = 0; i < smax; i++) {
+		incrementals[i] = getIncrementals(document.getElementById(slideIDs[i]));
+	}
+	return incrementals;
+}
+
+function defaultCheck() {
+	var allMetas = document.getElementsByTagName('meta');
+	for (var i = 0; i< allMetas.length; i++) {
+		if (allMetas[i].name == 'defaultView') {
+			defaultView = allMetas[i].content;
+		}
+		if (allMetas[i].name == 'controlVis') {
+			controlVis = allMetas[i].content;
+		}
+	}
+}
+
+// Key trap fix, new function body for trap()
+function trap(e) {
+	if (!e) {
+		e = event;
+		e.which = e.keyCode;
+	}
+	try {
+		modifierKey = e.ctrlKey || e.altKey || e.metaKey;
+	}
+	catch(e) {
+		modifierKey = false;
+	}
+	return modifierKey || e.which == 0;
+}
+
+function startup() {
+	defaultCheck();
+	if (!isOp) createControls();
+	slideLabel();
+	fixLinks();
+	externalLinks();
+	fontScale();
+	if (!isOp) {
+		notOperaFix();
+		incrementals = createIncrementals();
+		slideJump();
+		if (defaultView == 'outline') {
+			toggle();
+		}
+		document.onkeyup = keys;
+		document.onkeypress = trap;
+		document.onclick = clicker;
+	}
+}
+
+window.onload = startup;
+window.onresize = function(){setTimeout('fontScale()', 50);}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-black/__base__	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,2 @@
+# base theme of this theme:
+medium-white
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-black/pretty.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,115 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #AAA; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.75em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 125% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 110% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 1em; top: 0;
+  font: bold 150% sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 125% sans-serif; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font: bold 110% sans-serif;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-white/framing.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+    to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 0.75em 4% 0 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/medium-white/pretty.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,113 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #222;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #444; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.75em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 125% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 110% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #222;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 1em; top: 0;
+  font: bold 150% sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 125% sans-serif; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font: bold 110% sans-serif;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: white; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-black/__base__	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,2 @@
+# base theme of this theme:
+small-white
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-black/pretty.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,116 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #AAA; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 120% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 0em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+  font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-white/framing.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+    to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 1em 4% 0 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/small-white/pretty.css	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,114 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #222;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #444; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 120% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #222;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 0em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+  font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: white; visibility: visible; border: 0; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/roman.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,81 @@
+"""Convert to and from Roman numerals"""
+
+__author__ = "Mark Pilgrim (f8dy@diveintopython.org)"
+__version__ = "1.4"
+__date__ = "8 August 2001"
+__copyright__ = """Copyright (c) 2001 Mark Pilgrim
+
+This program is part of "Dive Into Python", a free Python tutorial for
+experienced programmers.  Visit http://diveintopython.org/ for the
+latest version.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the Python 2.1.1 license, available at
+http://www.python.org/2.1.1/license.html
+"""
+
+import re
+
+#Define exceptions
+class RomanError(Exception): pass
+class OutOfRangeError(RomanError): pass
+class NotIntegerError(RomanError): pass
+class InvalidRomanNumeralError(RomanError): pass
+
+#Define digit mapping
+romanNumeralMap = (('M',  1000),
+                   ('CM', 900),
+                   ('D',  500),
+                   ('CD', 400),
+                   ('C',  100),
+                   ('XC', 90),
+                   ('L',  50),
+                   ('XL', 40),
+                   ('X',  10),
+                   ('IX', 9),
+                   ('V',  5),
+                   ('IV', 4),
+                   ('I',  1))
+
+def toRoman(n):
+    """convert integer to Roman numeral"""
+    if not (0 < n < 5000):
+        raise OutOfRangeError, "number out of range (must be 1..4999)"
+    if int(n) <> n:
+        raise NotIntegerError, "decimals can not be converted"
+
+    result = ""
+    for numeral, integer in romanNumeralMap:
+        while n >= integer:
+            result += numeral
+            n -= integer
+    return result
+
+#Define pattern to detect valid Roman numerals
+romanNumeralPattern = re.compile("""
+    ^                   # beginning of string
+    M{0,4}              # thousands - 0 to 4 M's
+    (CM|CD|D?C{0,3})    # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
+                        #            or 500-800 (D, followed by 0 to 3 C's)
+    (XC|XL|L?X{0,3})    # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
+                        #        or 50-80 (L, followed by 0 to 3 X's)
+    (IX|IV|V?I{0,3})    # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
+                        #        or 5-8 (V, followed by 0 to 3 I's)
+    $                   # end of string
+    """ ,re.VERBOSE)
+
+def fromRoman(s):
+    """convert Roman numeral to integer"""
+    if not s:
+        raise InvalidRomanNumeralError, 'Input can not be blank'
+    if not romanNumeralPattern.search(s):
+        raise InvalidRomanNumeralError, 'Invalid Roman numeral: %s' % s
+
+    result = 0
+    index = 0
+    for numeral, integer in romanNumeralMap:
+        while s[index:index+len(numeral)] == numeral:
+            result += integer
+            index += len(numeral)
+    return result
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/easy-install.pth	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,16 @@
+import sys; sys.__plen = len(sys.path)
+./setuptools-0.6c5-py2.5.egg
+./Amara-1.2.0.1-py2.5.egg
+./coverage-2.85-py2.5.egg
+./docutils-0.5-py2.5.egg
+./epydoc-3.0beta1-py2.5.egg
+./Jinja-1.2-py2.5-win32.egg
+./Jinja2-2.2.1-py2.5.egg
+./nose-0.11.1-py2.6.egg
+./mocker-0.10.1-py2.5.egg
+./path-2.2-py2.5.egg
+./pygments-0.10-py2.5.egg
+./simplejson-1.9.1-py2.5-win32.egg
+./sphinx-0.5.1-py2.5.egg
+./psyco-1.6-py2.5.egg
+import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
Binary file buildframework/helium/external/python/lib/common/epydoc-3.0beta1-py2.5.egg has changed
Binary file buildframework/helium/external/python/lib/common/mocker-0.10.1-py2.5.egg has changed
Binary file buildframework/helium/external/python/lib/common/nose-0.11.1-py2.6.egg has changed
Binary file buildframework/helium/external/python/lib/common/path-2.2-py2.5.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/EGG-INFO/PKG-INFO	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,22 @@
+Metadata-Version: 1.0
+Name: psyco
+Version: 1.6
+Summary: Psyco, the Python specializing compiler
+Home-page: http://psyco.sourceforge.net/
+Author: Armin Rigo
+Author-email: arigo@users.sourceforge.net
+License: MIT License
+Description: Psyco shows that it is possible to execute Python code at speeds
+        approaching that of fully compiled languages, by "specialization".
+        This extension module for the unmodified interpreter accelerates
+        user programs with little or not change in their sources, by a
+        factor that can be very interesting (2-10 times is common).
+Platform: i386
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: C
+Classifier: Topic :: Software Development :: Compilers
+Classifier: Topic :: Software Development :: Interpreters
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/psyco/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,54 @@
+###########################################################################
+# 
+#  Psyco top-level file of the Psyco package.
+#   Copyright (C) 2001-2002  Armin Rigo et.al.
+
+"""Psyco -- the Python Specializing Compiler.
+
+Typical usage: add the following lines to your application's main module,
+preferably after the other imports:
+
+try:
+    import psyco
+    psyco.full()
+except ImportError:
+    print 'Psyco not installed, the program will just run slower'
+"""
+###########################################################################
+
+
+#
+# This module is present to make 'psyco' a package and to
+# publish the main functions and variables.
+#
+# More documentation can be found in core.py.
+#
+
+
+# Try to import the dynamic-loading _psyco and report errors
+try:
+    import _psyco
+except ImportError, e:
+    extramsg = ''
+    import sys, imp
+    try:
+        file, filename, (suffix, mode, type) = imp.find_module('_psyco', __path__)
+    except ImportError:
+        ext = [suffix for suffix, mode, type in imp.get_suffixes()
+               if type == imp.C_EXTENSION]
+        if ext:
+            extramsg = (" (cannot locate the compiled extension '_psyco%s' "
+                        "in the package path '%s')" % (ext[0], '; '.join(__path__)))
+    else:
+        extramsg = (" (check that the compiled extension '%s' is for "
+                    "the correct Python version; this is Python %s)" %
+                    (filename, sys.version.split()[0]))
+    raise ImportError, str(e) + extramsg
+
+# Publish important data by importing them in the package
+from support import __version__, error, warning, _getrealframe, _getemulframe
+from support import version_info, __version__ as hexversion
+from core import full, profile, background, runonly, stop, cannotcompile
+from core import log, bind, unbind, proxy, unproxy, dumpcodebuf
+from _psyco import setfilter
+from _psyco import compact, compacttype
Binary file buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/psyco/_psyco.pyd has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/psyco/classes.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,42 @@
+###########################################################################
+# 
+#  Psyco class support module.
+#   Copyright (C) 2001-2002  Armin Rigo et.al.
+
+"""Psyco class support module.
+
+'psyco.classes.psyobj' is an alternate Psyco-optimized root for classes.
+Any class inheriting from it or using the metaclass '__metaclass__' might
+get optimized specifically for Psyco. It is equivalent to call
+psyco.bind() on the class object after its creation.
+
+Importing everything from psyco.classes in a module will import the
+'__metaclass__' name, so all classes defined after a
+
+       from psyco.classes import *
+
+will automatically use the Psyco-optimized metaclass.
+"""
+###########################################################################
+
+__all__ = ['psyobj', 'psymetaclass', '__metaclass__']
+
+
+from _psyco import compacttype
+import core
+from types import FunctionType
+
+class psymetaclass(compacttype):
+    "Psyco-optimized meta-class. Turns all methods into Psyco proxies."
+
+    def __new__(cls, name, bases, dict):
+        bindlist = dict.get('__psyco__bind__')
+        if bindlist is None:
+            bindlist = [key for key, value in dict.items()
+                        if isinstance(value, FunctionType)]
+        for attr in bindlist:
+            dict[attr] = core.proxy(dict[attr])
+        return super(psymetaclass, cls).__new__(cls, name, bases, dict)
+
+psyobj = psymetaclass("psyobj", (), {})
+__metaclass__ = psymetaclass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/psyco/core.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,228 @@
+###########################################################################
+# 
+#  Psyco main functions.
+#   Copyright (C) 2001-2002  Armin Rigo et.al.
+
+"""Psyco main functions.
+
+Here are the routines that you can use from your applications.
+These are mostly interfaces to the C core, but they depend on
+the Python version.
+
+You can use these functions from the 'psyco' module instead of
+'psyco.core', e.g.
+
+    import psyco
+    psyco.log('/tmp/psyco.log')
+    psyco.profile()
+"""
+###########################################################################
+
+import _psyco
+import types, new
+from support import *
+
+
+# Default charge profiler values
+default_watermark     = 0.09     # between 0.0 (0%) and 1.0 (100%)
+default_halflife      = 0.5      # seconds
+default_pollfreq_profile    = 20       # Hz
+default_pollfreq_background = 100      # Hz -- a maximum for sleep's resolution
+default_parentframe   = 0.25     # should not be more than 0.5 (50%)
+
+
+def full(memory=None, time=None, memorymax=None, timemax=None):
+    """Compile as much as possible.
+
+Typical use is for small scripts performing intensive computations
+or string handling."""
+    import profiler
+    p = profiler.FullCompiler()
+    p.run(memory, time, memorymax, timemax)
+
+
+def profile(watermark   = default_watermark,
+            halflife    = default_halflife,
+            pollfreq    = default_pollfreq_profile,
+            parentframe = default_parentframe,
+            memory=None, time=None, memorymax=None, timemax=None):
+    """Turn on profiling.
+
+The 'watermark' parameter controls how easily running functions will
+be compiled. The smaller the value, the more functions are compiled."""
+    import profiler
+    p = profiler.ActivePassiveProfiler(watermark, halflife,
+                                       pollfreq, parentframe)
+    p.run(memory, time, memorymax, timemax)
+
+
+def background(watermark   = default_watermark,
+               halflife    = default_halflife,
+               pollfreq    = default_pollfreq_background,
+               parentframe = default_parentframe,
+               memory=None, time=None, memorymax=None, timemax=None):
+    """Turn on passive profiling.
+
+This is a very lightweight mode in which only intensively computing
+functions can be detected. The smaller the 'watermark', the more functions
+are compiled."""
+    import profiler
+    p = profiler.PassiveProfiler(watermark, halflife, pollfreq, parentframe)
+    p.run(memory, time, memorymax, timemax)
+
+
+def runonly(memory=None, time=None, memorymax=None, timemax=None):
+    """Nonprofiler.
+
+XXX check if this is useful and document."""
+    import profiler
+    p = profiler.RunOnly()
+    p.run(memory, time, memorymax, timemax)
+
+
+def stop():
+    """Turn off all automatic compilation.  bind() calls remain in effect."""
+    import profiler
+    profiler.go([])
+
+
+def log(logfile='', mode='w', top=10):
+    """Enable logging to the given file.
+
+If the file name is unspecified, a default name is built by appending
+a 'log-psyco' extension to the main script name.
+
+Mode is 'a' to append to a possibly existing file or 'w' to overwrite
+an existing file. Note that the log file may grow quickly in 'a' mode."""
+    import profiler, logger
+    if not logfile:
+        import os
+        logfile, dummy = os.path.splitext(sys.argv[0])
+        if os.path.basename(logfile):
+            logfile += '.'
+        logfile += 'log-psyco'
+    if hasattr(_psyco, 'VERBOSE_LEVEL'):
+        print >> sys.stderr, 'psyco: logging to', logfile
+    # logger.current should be a real file object; subtle problems
+    # will show up if its write() and flush() methods are written
+    # in Python, as Psyco will invoke them while compiling.
+    logger.current = open(logfile, mode)
+    logger.print_charges = top
+    profiler.logger = logger
+    logger.writedate('Logging started')
+    cannotcompile(logger.psycowrite)
+    _psyco.statwrite(logger=logger.psycowrite)
+
+
+def bind(x, rec=None):
+    """Enable compilation of the given function, method, or class object.
+
+If C is a class (or anything with a '__dict__' attribute), bind(C) will
+rebind all functions and methods found in C.__dict__ (which means, for
+classes, all methods defined in the class but not in its parents).
+
+The optional second argument specifies the number of recursive
+compilation levels: all functions called by func are compiled
+up to the given depth of indirection."""
+    if isinstance(x, types.MethodType):
+        x = x.im_func
+    if isinstance(x, types.FunctionType):
+        if rec is None:
+            x.func_code = _psyco.proxycode(x)
+        else:
+            x.func_code = _psyco.proxycode(x, rec)
+        return
+    if hasattr(x, '__dict__'):
+        funcs = [o for o in x.__dict__.values()
+                 if isinstance(o, types.MethodType)
+                 or isinstance(o, types.FunctionType)]
+        if not funcs:
+            raise error, ("nothing bindable found in %s object" %
+                          type(x).__name__)
+        for o in funcs:
+            bind(o, rec)
+        return
+    raise TypeError, "cannot bind %s objects" % type(x).__name__
+
+
+def unbind(x):
+    """Reverse of bind()."""
+    if isinstance(x, types.MethodType):
+        x = x.im_func
+    if isinstance(x, types.FunctionType):
+        try:
+            f = _psyco.unproxycode(x.func_code)
+        except error:
+            pass
+        else:
+            x.func_code = f.func_code
+        return
+    if hasattr(x, '__dict__'):
+        for o in x.__dict__.values():
+            if (isinstance(o, types.MethodType)
+             or isinstance(o, types.FunctionType)):
+                unbind(o)
+        return
+    raise TypeError, "cannot unbind %s objects" % type(x).__name__
+
+
+def proxy(x, rec=None):
+    """Return a Psyco-enabled copy of the function.
+
+The original function is still available for non-compiled calls.
+The optional second argument specifies the number of recursive
+compilation levels: all functions called by func are compiled
+up to the given depth of indirection."""
+    if isinstance(x, types.FunctionType):
+        if rec is None:
+            code = _psyco.proxycode(x)
+        else:
+            code = _psyco.proxycode(x, rec)
+        return new.function(code, x.func_globals, x.func_name)
+    if isinstance(x, types.MethodType):
+        p = proxy(x.im_func, rec)
+        return new.instancemethod(p, x.im_self, x.im_class)
+    raise TypeError, "cannot proxy %s objects" % type(x).__name__
+
+
+def unproxy(proxy):
+    """Return a new copy of the original function of method behind a proxy.
+The result behaves like the original function in that calling it
+does not trigger compilation nor execution of any compiled code."""
+    if isinstance(proxy, types.FunctionType):
+        return _psyco.unproxycode(proxy.func_code)
+    if isinstance(proxy, types.MethodType):
+        f = unproxy(proxy.im_func)
+        return new.instancemethod(f, proxy.im_self, proxy.im_class)
+    raise TypeError, "%s objects cannot be proxies" % type(proxy).__name__
+
+
+def cannotcompile(x):
+    """Instruct Psyco never to compile the given function, method
+or code object."""
+    if isinstance(x, types.MethodType):
+        x = x.im_func
+    if isinstance(x, types.FunctionType):
+        x = x.func_code
+    if isinstance(x, types.CodeType):
+        _psyco.cannotcompile(x)
+    else:
+        raise TypeError, "unexpected %s object" % type(x).__name__
+
+
+def dumpcodebuf():
+    """Write in file psyco.dump a copy of the emitted machine code,
+provided Psyco was compiled with a non-zero CODE_DUMP.
+See py-utils/httpxam.py to examine psyco.dump."""
+    if hasattr(_psyco, 'dumpcodebuf'):
+        _psyco.dumpcodebuf()
+
+
+###########################################################################
+# Psyco variables
+#   error         * the error raised by Psyco
+#   warning       * the warning raised by Psyco
+#   __in_psyco__  * a new built-in variable which is always zero, but which
+#                     Psyco special-cases by returning 1 instead. So
+#                     __in_psyco__ can be used in a function to know if
+#                     that function is being executed by Psyco or not.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/psyco/kdictproxy.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,133 @@
+###########################################################################
+#
+#  Support code for the 'psyco.compact' type.
+
+from __future__ import generators
+
+try:
+    from UserDict import DictMixin
+except ImportError:
+
+    # backported from Python 2.3 to Python 2.2
+    class DictMixin:
+        # Mixin defining all dictionary methods for classes that already have
+        # a minimum dictionary interface including getitem, setitem, delitem,
+        # and keys. Without knowledge of the subclass constructor, the mixin
+        # does not define __init__() or copy().  In addition to the four base
+        # methods, progressively more efficiency comes with defining
+        # __contains__(), __iter__(), and iteritems().
+
+        # second level definitions support higher levels
+        def __iter__(self):
+            for k in self.keys():
+                yield k
+        def has_key(self, key):
+            try:
+                value = self[key]
+            except KeyError:
+                return False
+            return True
+        def __contains__(self, key):
+            return self.has_key(key)
+
+        # third level takes advantage of second level definitions
+        def iteritems(self):
+            for k in self:
+                yield (k, self[k])
+        def iterkeys(self):
+            return self.__iter__()
+
+        # fourth level uses definitions from lower levels
+        def itervalues(self):
+            for _, v in self.iteritems():
+                yield v
+        def values(self):
+            return [v for _, v in self.iteritems()]
+        def items(self):
+            return list(self.iteritems())
+        def clear(self):
+            for key in self.keys():
+                del self[key]
+        def setdefault(self, key, default):
+            try:
+                return self[key]
+            except KeyError:
+                self[key] = default
+            return default
+        def pop(self, key, *args):
+            if len(args) > 1:
+                raise TypeError, "pop expected at most 2 arguments, got "\
+                                  + repr(1 + len(args))
+            try:
+                value = self[key]
+            except KeyError:
+                if args:
+                    return args[0]
+                raise
+            del self[key]
+            return value
+        def popitem(self):
+            try:
+                k, v = self.iteritems().next()
+            except StopIteration:
+                raise KeyError, 'container is empty'
+            del self[k]
+            return (k, v)
+        def update(self, other):
+            # Make progressively weaker assumptions about "other"
+            if hasattr(other, 'iteritems'):  # iteritems saves memory and lookups
+                for k, v in other.iteritems():
+                    self[k] = v
+            elif hasattr(other, '__iter__'): # iter saves memory
+                for k in other:
+                    self[k] = other[k]
+            else:
+                for k in other.keys():
+                    self[k] = other[k]
+        def get(self, key, default=None):
+            try:
+                return self[key]
+            except KeyError:
+                return default
+        def __repr__(self):
+            return repr(dict(self.iteritems()))
+        def __cmp__(self, other):
+            if other is None:
+                return 1
+            if isinstance(other, DictMixin):
+                other = dict(other.iteritems())
+            return cmp(dict(self.iteritems()), other)
+        def __len__(self):
+            return len(self.keys())
+
+###########################################################################
+
+from _psyco import compact
+
+
+class compactdictproxy(DictMixin):
+
+    def __init__(self, ko):
+        self._ko = ko    # compact object of which 'self' is the dict
+
+    def __getitem__(self, key):
+        return compact.__getslot__(self._ko, key)
+
+    def __setitem__(self, key, value):
+        compact.__setslot__(self._ko, key, value)
+
+    def __delitem__(self, key):
+        compact.__delslot__(self._ko, key)
+
+    def keys(self):
+        return compact.__members__.__get__(self._ko)
+
+    def clear(self):
+        keys = self.keys()
+        keys.reverse()
+        for key in keys:
+            del self[key]
+
+    def __repr__(self):
+        keys = ', '.join(self.keys())
+        return '<compactdictproxy object {%s}>' % (keys,)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/psyco/logger.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,96 @@
+###########################################################################
+# 
+#  Psyco logger.
+#   Copyright (C) 2001-2002  Armin Rigo et.al.
+
+"""Psyco logger.
+
+See log() in core.py.
+"""
+###########################################################################
+
+
+import _psyco
+from time import time, localtime, strftime
+
+
+current = None
+print_charges = 10
+dump_delay = 0.2
+dump_last = 0.0
+
+def write(s, level):
+    t = time()
+    f = t-int(t)
+    try:
+        current.write("%s.%02d  %-*s%s\n" % (
+            strftime("%X", localtime(int(t))),
+            int(f*100.0), 63-level, s,
+            "%"*level))
+        current.flush()
+    except (OSError, IOError):
+        pass
+
+def psycowrite(s):
+    t = time()
+    f = t-int(t)
+    try:
+        current.write("%s.%02d  %-*s%s\n" % (
+            strftime("%X", localtime(int(t))),
+            int(f*100.0), 60, s.strip(),
+            "% %"))
+        current.flush()
+    except (OSError, IOError):
+        pass
+
+##def writelines(lines, level=0):
+##    if lines:
+##        t = time()
+##        f = t-int(t)
+##        timedesc = strftime("%x %X", localtime(int(t)))
+##        print >> current, "%s.%03d  %-*s %s" % (
+##            timedesc, int(f*1000),
+##            50-level, lines[0],
+##            "+"*level)
+##        timedesc = " " * (len(timedesc)+5)
+##        for line in lines[1:]:
+##            print >> current, timedesc, line
+
+def writememory():
+    write("memory usage: %d+ kb" % _psyco.memory(), 1)
+
+def dumpcharges():
+    global dump_last
+    if print_charges:
+        t = time()
+        if not (dump_last <= t < dump_last+dump_delay):
+            if t <= dump_last+1.5*dump_delay:
+                dump_last += dump_delay
+            else:
+                dump_last = t
+            #write("%s: charges:" % who, 0)
+            lst = _psyco.stattop(print_charges)
+            if lst:
+                f = t-int(t)
+                lines = ["%s.%02d   ______\n" % (
+                    strftime("%X", localtime(int(t))),
+                    int(f*100.0))]
+                i = 1
+                for co, charge in lst:
+                    detail = co.co_filename
+                    if len(detail) > 19:
+                        detail = '...' + detail[-17:]
+                    lines.append("        #%-3d |%4.1f %%|  %-26s%20s:%d\n" %
+                                 (i, charge*100.0, co.co_name, detail,
+                                  co.co_firstlineno))
+                    i += 1
+                current.writelines(lines)
+                current.flush()
+
+def writefinalstats():
+    dumpcharges()
+    writememory()
+    writedate("program exit")
+
+def writedate(msg):
+    write('%s, %s' % (msg, strftime("%x")), 20)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/psyco/profiler.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,379 @@
+###########################################################################
+# 
+#  Psyco profiler (Python part).
+#   Copyright (C) 2001-2002  Armin Rigo et.al.
+
+"""Psyco profiler (Python part).
+
+The implementation of the non-time-critical parts of the profiler.
+See profile() and full() in core.py for the easy interface.
+"""
+###########################################################################
+
+import _psyco
+from support import *
+import math, time, types, atexit
+now = time.time
+try:
+    import thread
+except ImportError:
+    import dummy_thread as thread
+
+
+# current profiler instance
+current = None
+
+# enabled profilers, in order of priority
+profilers = []
+
+# logger module (when enabled by core.log())
+logger = None
+
+# a lock for a thread-safe go()
+go_lock = thread.allocate_lock()
+
+def go(stop=0):
+    # run the highest-priority profiler in 'profilers'
+    global current
+    go_lock.acquire()
+    try:
+        prev = current
+        if stop:
+            del profilers[:]
+        if prev:
+            if profilers and profilers[0] is prev:
+                return    # best profiler already running
+            prev.stop()
+            current = None
+        for p in profilers[:]:
+            if p.start():
+                current = p
+                if logger: # and p is not prev:
+                    logger.write("%s: starting" % p.__class__.__name__, 5)
+                return
+    finally:
+        go_lock.release()
+    # no profiler is running now
+    if stop:
+        if logger:
+            logger.writefinalstats()
+    else:
+        tag2bind()
+
+atexit.register(go, 1)
+
+
+def buildfncache(globals, cache):
+    if hasattr(types.IntType, '__dict__'):
+        clstypes = (types.ClassType, types.TypeType)
+    else:
+        clstypes = types.ClassType
+    for x in globals.values():
+        if isinstance(x, types.MethodType):
+            x = x.im_func
+        if isinstance(x, types.FunctionType):
+            cache[x.func_code] = x, ''
+        elif isinstance(x, clstypes):
+            for y in x.__dict__.values():
+                if isinstance(y, types.MethodType):
+                    y = y.im_func
+                if isinstance(y, types.FunctionType):
+                    cache[y.func_code] = y, x.__name__
+
+# code-to-function mapping (cache)
+function_cache = {}
+
+def trytobind(co, globals, log=1):
+    try:
+        f, clsname = function_cache[co]
+    except KeyError:
+        buildfncache(globals, function_cache)
+        try:
+            f, clsname = function_cache[co]
+        except KeyError:
+            if logger:
+                logger.write('warning: cannot find function %s in %s' %
+                             (co.co_name, globals.get('__name__', '?')), 3)
+            return  # give up
+    if logger and log:
+        modulename = globals.get('__name__', '?')
+        if clsname:
+            modulename += '.' + clsname
+        logger.write('bind function: %s.%s' % (modulename, co.co_name), 1)
+    f.func_code = _psyco.proxycode(f)
+
+
+# the list of code objects that have been tagged
+tagged_codes = []
+
+def tag(co, globals):
+    if logger:
+        try:
+            f, clsname = function_cache[co]
+        except KeyError:
+            buildfncache(globals, function_cache)
+            try:
+                f, clsname = function_cache[co]
+            except KeyError:
+                clsname = ''  # give up
+        modulename = globals.get('__name__', '?')
+        if clsname:
+            modulename += '.' + clsname
+        logger.write('tag function: %s.%s' % (modulename, co.co_name), 1)
+    tagged_codes.append((co, globals))
+    _psyco.turbo_frame(co)
+    _psyco.turbo_code(co)
+
+def tag2bind():
+    if tagged_codes:
+        if logger:
+            logger.write('profiling stopped, binding %d functions' %
+                         len(tagged_codes), 2)
+        for co, globals in tagged_codes:
+            trytobind(co, globals, 0)
+        function_cache.clear()
+        del tagged_codes[:]
+
+
+class Profiler:
+    MemoryTimerResolution = 0.103
+
+    def run(self, memory, time, memorymax, timemax):
+        self.memory = memory
+        self.memorymax = memorymax
+        self.time = time
+        if timemax is None:
+            self.endtime = None
+        else:
+            self.endtime = now() + timemax
+        self.alarms = []
+        profilers.append(self)
+        go()
+    
+    def start(self):
+        curmem = _psyco.memory()
+        memlimits = []
+        if self.memorymax is not None:
+            if curmem >= self.memorymax:
+                if logger:
+                    logger.writememory()
+                return self.limitreached('memorymax')
+            memlimits.append(self.memorymax)
+        if self.memory is not None:
+            if self.memory <= 0:
+                if logger:
+                    logger.writememory()
+                return self.limitreached('memory')
+            memlimits.append(curmem + self.memory)
+            self.memory_at_start = curmem
+
+        curtime = now()
+        timelimits = []
+        if self.endtime is not None:
+            if curtime >= self.endtime:
+                return self.limitreached('timemax')
+            timelimits.append(self.endtime - curtime)
+        if self.time is not None:
+            if self.time <= 0.0:
+                return self.limitreached('time')
+            timelimits.append(self.time)
+            self.time_at_start = curtime
+        
+        try:
+            self.do_start()
+        except error, e:
+            if logger:
+                logger.write('%s: disabled by psyco.error:' % (
+                    self.__class__.__name__), 4)
+                logger.write('    %s' % str(e), 3)
+            return 0
+        
+        if memlimits:
+            self.memlimits_args = (time.sleep, (self.MemoryTimerResolution,),
+                                   self.check_memory, (min(memlimits),))
+            self.alarms.append(_psyco.alarm(*self.memlimits_args))
+        if timelimits:
+            self.alarms.append(_psyco.alarm(time.sleep, (min(timelimits),),
+                                            self.time_out))
+        return 1
+    
+    def stop(self):
+        for alarm in self.alarms:
+            alarm.stop(0)
+        for alarm in self.alarms:
+            alarm.stop(1)   # wait for parallel threads to stop
+        del self.alarms[:]
+        if self.time is not None:
+            self.time -= now() - self.time_at_start
+        if self.memory is not None:
+            self.memory -= _psyco.memory() - self.memory_at_start
+
+        try:
+            self.do_stop()
+        except error:
+            return 0
+        return 1
+
+    def check_memory(self, limit):
+        if _psyco.memory() < limit:
+            return self.memlimits_args
+        go()
+
+    def time_out(self):
+        self.time = 0.0
+        go()
+
+    def limitreached(self, limitname):
+        try:
+            profilers.remove(self)
+        except ValueError:
+            pass
+        if logger:
+            logger.write('%s: disabled (%s limit reached)' % (
+                self.__class__.__name__, limitname), 4)
+        return 0
+
+
+class FullCompiler(Profiler):
+
+    def do_start(self):
+        _psyco.profiling('f')
+
+    def do_stop(self):
+        _psyco.profiling('.')
+
+
+class RunOnly(Profiler):
+
+    def do_start(self):
+        _psyco.profiling('n')
+
+    def do_stop(self):
+        _psyco.profiling('.')
+
+
+class ChargeProfiler(Profiler):
+
+    def __init__(self, watermark, parentframe):
+        self.watermark = watermark
+        self.parent2 = parentframe * 2.0
+        self.lock = thread.allocate_lock()
+
+    def init_charges(self):
+        _psyco.statwrite(watermark = self.watermark,
+                         parent2   = self.parent2)
+
+    def do_stop(self):
+        _psyco.profiling('.')
+        _psyco.statwrite(callback = None)
+
+
+class ActiveProfiler(ChargeProfiler):
+
+    def active_start(self):
+        _psyco.profiling('p')
+
+    def do_start(self):
+        self.init_charges()
+        self.active_start()
+        _psyco.statwrite(callback = self.charge_callback)
+
+    def charge_callback(self, frame, charge):
+        tag(frame.f_code, frame.f_globals)
+
+
+class PassiveProfiler(ChargeProfiler):
+
+    initial_charge_unit   = _psyco.statread('unit')
+    reset_stats_after     = 120      # half-lives (maximum 200!)
+    reset_limit           = initial_charge_unit * (2.0 ** reset_stats_after)
+
+    def __init__(self, watermark, halflife, pollfreq, parentframe):
+        ChargeProfiler.__init__(self, watermark, parentframe)
+        self.pollfreq = pollfreq
+        # self.progress is slightly more than 1.0, and computed so that
+        # do_profile() will double the change_unit every 'halflife' seconds.
+        self.progress = 2.0 ** (1.0 / (halflife * pollfreq))
+
+    def reset(self):
+        _psyco.statwrite(unit = self.initial_charge_unit, callback = None)
+        _psyco.statreset()
+        if logger:
+            logger.write("%s: resetting stats" % self.__class__.__name__, 1)
+
+    def passive_start(self):
+        self.passivealarm_args = (time.sleep, (1.0 / self.pollfreq,),
+                                  self.do_profile)
+        self.alarms.append(_psyco.alarm(*self.passivealarm_args))
+
+    def do_start(self):
+        tag2bind()
+        self.init_charges()
+        self.passive_start()
+
+    def do_profile(self):
+        _psyco.statcollect()
+        if logger:
+            logger.dumpcharges()
+        nunit = _psyco.statread('unit') * self.progress
+        if nunit > self.reset_limit:
+            self.reset()
+        else:
+            _psyco.statwrite(unit = nunit, callback = self.charge_callback)
+        return self.passivealarm_args
+
+    def charge_callback(self, frame, charge):
+        trytobind(frame.f_code, frame.f_globals)
+
+
+class ActivePassiveProfiler(PassiveProfiler, ActiveProfiler):
+
+    def do_start(self):
+        self.init_charges()
+        self.active_start()
+        self.passive_start()
+
+    def charge_callback(self, frame, charge):
+        tag(frame.f_code, frame.f_globals)
+
+
+
+#
+# we register our own version of sys.settrace(), sys.setprofile()
+# and thread.start_new_thread().
+#
+
+def psyco_settrace(*args, **kw):
+    "This is the Psyco-aware version of sys.settrace()."
+    result = original_settrace(*args, **kw)
+    go()
+    return result
+
+def psyco_setprofile(*args, **kw):
+    "This is the Psyco-aware version of sys.setprofile()."
+    result = original_setprofile(*args, **kw)
+    go()
+    return result
+
+def psyco_thread_stub(callable, args, kw):
+    _psyco.statcollect()
+    if kw is None:
+        return callable(*args)
+    else:
+        return callable(*args, **kw)
+
+def psyco_start_new_thread(callable, args, kw=None):
+    "This is the Psyco-aware version of thread.start_new_thread()."
+    return original_start_new_thread(psyco_thread_stub, (callable, args, kw))
+
+original_settrace         = sys.settrace
+original_setprofile       = sys.setprofile
+original_start_new_thread = thread.start_new_thread
+sys.settrace            = psyco_settrace
+sys.setprofile          = psyco_setprofile
+thread.start_new_thread = psyco_start_new_thread
+# hack to patch threading._start_new_thread if the module is
+# already loaded
+if (sys.modules.has_key('threading') and
+    hasattr(sys.modules['threading'], '_start_new_thread')):
+    sys.modules['threading']._start_new_thread = psyco_start_new_thread
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/psyco-1.6-py2.5.egg/psyco/support.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,191 @@
+###########################################################################
+# 
+#  Psyco general support module.
+#   Copyright (C) 2001-2002  Armin Rigo et.al.
+
+"""Psyco general support module.
+
+For internal use.
+"""
+###########################################################################
+
+import sys, _psyco, __builtin__
+
+error = _psyco.error
+class warning(Warning):
+    pass
+
+_psyco.NoLocalsWarning = warning
+
+def warn(msg):
+    from warnings import warn
+    warn(msg, warning, stacklevel=2)
+
+#
+# Version checks
+#
+__version__ = 0x010600f0
+if _psyco.PSYVER != __version__:
+    raise error, "version mismatch between Psyco parts, reinstall it"
+
+version_info = (__version__ >> 24,
+                (__version__ >> 16) & 0xff,
+                (__version__ >> 8) & 0xff,
+                {0xa0: 'alpha',
+                 0xb0: 'beta',
+                 0xc0: 'candidate',
+                 0xf0: 'final'}[__version__ & 0xf0],
+                __version__ & 0xf)
+
+
+VERSION_LIMITS = [0x02020200,   # 2.2.2
+                  0x02030000,   # 2.3
+                  0x02040000]   # 2.4
+
+if ([v for v in VERSION_LIMITS if v <= sys.hexversion] !=
+    [v for v in VERSION_LIMITS if v <= _psyco.PYVER  ]):
+    if sys.hexversion < VERSION_LIMITS[0]:
+        warn("Psyco requires Python version 2.2.2 or later")
+    else:
+        warn("Psyco version does not match Python version. "
+             "Psyco must be updated or recompiled")
+
+
+if hasattr(_psyco, 'ALL_CHECKS') and hasattr(_psyco, 'VERBOSE_LEVEL'):
+    print >> sys.stderr, ('psyco: running in debugging mode on %s' %
+                          _psyco.PROCESSOR)
+
+
+###########################################################################
+# sys._getframe() gives strange results on a mixed Psyco- and Python-style
+# stack frame. Psyco provides a replacement that partially emulates Python
+# frames from Psyco frames. The new sys._getframe() may return objects of
+# a custom "Psyco frame" type, which is a subtype of the normal frame type.
+#
+# The same problems require some other built-in functions to be replaced
+# as well. Note that the local variables are not available in any
+# dictionary with Psyco.
+
+
+class Frame:
+    pass
+
+
+class PythonFrame(Frame):
+
+    def __init__(self, frame):
+        self.__dict__.update({
+            '_frame': frame,
+            })
+
+    def __getattr__(self, attr):
+        if attr == 'f_back':
+            try:
+                result = embedframe(_psyco.getframe(self._frame))
+            except ValueError:
+                result = None
+            except error:
+                warn("f_back is skipping dead Psyco frames")
+                result = self._frame.f_back
+            self.__dict__['f_back'] = result
+            return result
+        else:
+            return getattr(self._frame, attr)
+
+    def __setattr__(self, attr, value):
+        setattr(self._frame, attr, value)
+
+    def __delattr__(self, attr):
+        delattr(self._frame, attr)
+
+
+class PsycoFrame(Frame):
+
+    def __init__(self, tag):
+        self.__dict__.update({
+            '_tag'     : tag,
+            'f_code'   : tag[0],
+            'f_globals': tag[1],
+            })
+
+    def __getattr__(self, attr):
+        if attr == 'f_back':
+            try:
+                result = embedframe(_psyco.getframe(self._tag))
+            except ValueError:
+                result = None
+        elif attr == 'f_lineno':
+            result = self.f_code.co_firstlineno  # better than nothing
+        elif attr == 'f_builtins':
+            result = self.f_globals['__builtins__']
+        elif attr == 'f_restricted':
+            result = self.f_builtins is not __builtins__
+        elif attr == 'f_locals':
+            raise AttributeError, ("local variables of functions run by Psyco "
+                                   "cannot be accessed in any way, sorry")
+        else:
+            raise AttributeError, ("emulated Psyco frames have "
+                                   "no '%s' attribute" % attr)
+        self.__dict__[attr] = result
+        return result
+
+    def __setattr__(self, attr, value):
+        raise AttributeError, "Psyco frame objects are read-only"
+
+    def __delattr__(self, attr):
+        if attr == 'f_trace':
+            # for bdb which relies on CPython frames exhibiting a slightly
+            # buggy behavior: you can 'del f.f_trace' as often as you like
+            # even without having set it previously.
+            return
+        raise AttributeError, "Psyco frame objects are read-only"
+
+
+def embedframe(result):
+    if type(result) is type(()):
+        return PsycoFrame(result)
+    else:
+        return PythonFrame(result)
+
+def _getframe(depth=0):
+    """Return a frame object from the call stack. This is a replacement for
+sys._getframe() which is aware of Psyco frames.
+
+The returned objects are instances of either PythonFrame or PsycoFrame
+instead of being real Python-level frame object, so that they can emulate
+the common attributes of frame objects.
+
+The original sys._getframe() ignoring Psyco frames altogether is stored in
+psyco._getrealframe(). See also psyco._getemulframe()."""
+    # 'depth+1' to account for this _getframe() Python function
+    return embedframe(_psyco.getframe(depth+1))
+
+def _getemulframe(depth=0):
+    """As _getframe(), but the returned objects are real Python frame objects
+emulating Psyco frames. Some of their attributes can be wrong or missing,
+however."""
+    # 'depth+1' to account for this _getemulframe() Python function
+    return _psyco.getframe(depth+1, 1)
+
+def patch(name, module=__builtin__):
+    f = getattr(_psyco, name)
+    org = getattr(module, name)
+    if org is not f:
+        setattr(module, name, f)
+        setattr(_psyco, 'original_' + name, org)
+
+_getrealframe = sys._getframe
+sys._getframe = _getframe
+patch('globals')
+patch('eval')
+patch('execfile')
+patch('locals')
+patch('vars')
+patch('dir')
+patch('input')
+_psyco.original_raw_input = raw_input
+__builtin__.__in_psyco__ = 0==1   # False
+
+if hasattr(_psyco, 'compact'):
+    import kdictproxy
+    _psyco.compactdictproxy = kdictproxy.compactdictproxy
Binary file buildframework/helium/external/python/lib/common/setuptools-0.6c5-py2.5.egg has changed
Binary file buildframework/helium/external/python/lib/common/simplejson-1.9.1-py2.5-win32.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/site.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,394 @@
+# Duplicating setuptools' site.py...
+def __boot():
+    PYTHONPATH = []    
+    if sys.platform=='win32':
+        PYTHONPATH.append(os.path.join(sys.prefix, 'lib'))
+    if not (os.environ.get('PYTHONPATH') is None or (sys.platform=='win32' and not os.environ.get('PYTHONPATH'))):
+        PYTHONPATH.extend(os.environ.get('PYTHONPATH').split(os.pathsep))
+    pic = getattr(sys,'path_importer_cache',{})
+    stdpath = sys.path[len(PYTHONPATH):]
+    mydir = os.path.dirname(__file__)
+    known_paths = dict([(makepath(item)[1],1) for item in sys.path]) # 2.2 comp
+
+    oldpos = getattr(sys,'__egginsert',0)   # save old insertion position
+    sys.__egginsert = 0                     # and reset the current one
+
+    for item in PYTHONPATH:
+        addsitedir(item)
+        item_site_packages = os.path.join(item, 'site-packages')
+        if os.path.exists(item_site_packages):
+            addsitedir(item_site_packages)
+
+    sys.__egginsert += oldpos           # restore effective old position
+
+    d,nd = makepath(stdpath[0])
+    insert_at = None
+    new_path = []
+
+    for item in sys.path:
+        p,np = makepath(item)
+
+        if np==nd and insert_at is None:
+            # We've hit the first 'system' path entry, so added entries go here
+            insert_at = len(new_path)
+
+        if np in known_paths or insert_at is None:
+            new_path.append(item)
+        else:
+            # new path after the insert point, back-insert it
+            new_path.insert(insert_at, item)
+            insert_at += 1
+
+    sys.path[:] = new_path
+    
+import sys
+import os
+import __builtin__
+
+def makepath(*paths):
+    dir = os.path.abspath(os.path.join(*paths))
+    return dir, os.path.normcase(dir)
+
+def abs__file__():
+    """Set all module' __file__ attribute to an absolute path"""
+    for m in sys.modules.values():
+        try:
+            m.__file__ = os.path.abspath(m.__file__)
+        except AttributeError:
+            continue
+
+try:
+    set
+except NameError:
+    class set:
+        def __init__(self, args=()):
+            self.d = {}
+            for v in args:
+                self.d[v] = None
+        def __contains__(self, key):
+            return key in self.d
+        def add(self, key):
+            self.d[key] = None
+
+def removeduppaths():
+    """ Remove duplicate entries from sys.path along with making them
+    absolute"""
+    # This ensures that the initial path provided by the interpreter contains
+    # only absolute pathnames, even if we're running from the build directory.
+    L = []
+    known_paths = set()
+    for dir in sys.path:
+        # Filter out duplicate paths (on case-insensitive file systems also
+        # if they only differ in case); turn relative paths into absolute
+        # paths.
+        dir, dircase = makepath(dir)
+        if not dircase in known_paths:
+            L.append(dir)
+            known_paths.add(dircase)
+    sys.path[:] = L
+    return known_paths
+
+def _init_pathinfo():
+    """Return a set containing all existing directory entries from sys.path"""
+    d = set()
+    for dir in sys.path:
+        try:
+            if os.path.isdir(dir):
+                dir, dircase = makepath(dir)
+                d.add(dircase)
+        except TypeError:
+            continue
+    return d
+
+def addpackage(sitedir, name, known_paths, exclude_packages=()):
+    """Add a new path to known_paths by combining sitedir and 'name' or execute
+    sitedir if it starts with 'import'"""
+    import fnmatch
+    if known_paths is None:
+        _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    fullname = os.path.join(sitedir, name)
+    try:
+        f = open(fullname, "rU")
+    except IOError:
+        return
+    try:
+        for line in f:
+            if line.startswith("#"):
+                continue
+            found_exclude = False
+            for exclude in exclude_packages:
+                if exclude(line):
+                    found_exclude = True
+                    break
+            if found_exclude:
+                continue
+            if line.startswith("import"):
+                exec line
+                continue
+            line = line.rstrip()
+            dir, dircase = makepath(sitedir, line)
+            if not dircase in known_paths and os.path.exists(dir):
+                sys.path.append(dir)
+                known_paths.add(dircase)
+    finally:
+        f.close()
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitedir(sitedir, known_paths=None, exclude_packages=()):
+    """Add 'sitedir' argument to sys.path if missing and handle .pth files in
+    'sitedir'"""
+    if known_paths is None:
+        known_paths = _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    sitedir, sitedircase = makepath(sitedir)
+    if not sitedircase in known_paths:
+        sys.path.append(sitedir)        # Add path component
+    try:
+        names = os.listdir(sitedir)
+    except os.error:
+        return
+    names.sort()
+    for name in names:
+        if name.endswith(os.extsep + "pth"):
+            addpackage(sitedir, name, known_paths,
+                       exclude_packages=exclude_packages)
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitepackages(known_paths):
+    """Add site-packages (and possibly site-python) to sys.path"""
+    prefixes = [os.path.join(sys.prefix, "local"), sys.prefix]
+    if sys.exec_prefix != sys.prefix:
+        prefixes.append(os.path.join(sys.exec_prefix, "local"))
+    for prefix in prefixes:
+        if prefix:
+            if sys.platform in ('os2emx', 'riscos'):
+                sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
+            elif os.sep == '/':
+                sitedirs = [os.path.join(prefix,
+                                         "lib",
+                                         "python" + sys.version[:3],
+                                         "site-packages"),
+                            os.path.join(prefix, "lib", "site-python")]
+                try:
+                    # sys.getobjects only available in --with-pydebug build
+                    # pylint: disable-msg=E1101
+                    sys.getobjects
+                    sitedirs.insert(0, os.path.join(sitedirs[0], 'debug'))
+                except AttributeError:
+                    pass
+            else:
+                sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
+            if sys.platform == 'darwin':
+                sitedirs.append( os.path.join('/opt/local', 'lib', 'python' + sys.version[:3], 'site-packages') )
+                # for framework builds *only* we add the standard Apple
+                # locations. Currently only per-user, but /Library and
+                # /Network/Library could be added too
+                if 'Python.framework' in prefix:
+                    home = os.environ.get('HOME')
+                    if home:
+                        sitedirs.append(
+                            os.path.join(home,
+                                         'Library',
+                                         'Python',
+                                         sys.version[:3],
+                                         'site-packages'))
+            for sitedir in sitedirs:
+                if os.path.isdir(sitedir):
+                    addsitedir(sitedir, known_paths,
+                               exclude_packages=[lambda line: 'setuptools' in line])
+    return None
+
+def setquit():
+    """Define new built-ins 'quit' and 'exit'.
+    These are simply strings that display a hint on how to exit.
+
+    """
+    if os.sep == ':':
+        exit = 'Use Cmd-Q to quit.'
+    elif os.sep == '\\':
+        exit = 'Use Ctrl-Z plus Return to exit.'
+    else:
+        exit = 'Use Ctrl-D (i.e. EOF) to exit.'
+    __builtin__.quit = __builtin__.exit = exit
+
+
+class _Printer(object):
+    """interactive prompt objects for printing the license text, a list of
+    contributors and the copyright notice."""
+
+    MAXLINES = 23
+
+    def __init__(self, name, data, files=(), dirs=()):
+        self.__name = name
+        self.__data = data
+        self.__files = files
+        self.__dirs = dirs
+        self.__lines = None
+
+    def __setup(self):
+        if self.__lines:
+            return
+        data = None
+        for dir in self.__dirs:
+            for filename in self.__files:
+                filename = os.path.join(dir, filename)
+                try:
+                    fp = file(filename, "rU")
+                    data = fp.read()
+                    fp.close()
+                    break
+                except IOError:
+                    pass
+            if data:
+                break
+        if not data:
+            data = self.__data
+        self.__lines = data.split('\n')
+        self.__linecnt = len(self.__lines)
+
+    def __repr__(self):
+        self.__setup()
+        if len(self.__lines) <= self.MAXLINES:
+            return "\n".join(self.__lines)
+        else:
+            return "Type %s() to see the full %s text" % ((self.__name,)*2)
+
+    def __call__(self):
+        self.__setup()
+        prompt = 'Hit Return for more, or q (and Return) to quit: '
+        lineno = 0
+        while 1:
+            try:
+                for i in range(lineno, lineno + self.MAXLINES):
+                    print self.__lines[i]
+            except IndexError:
+                break
+            else:
+                lineno += self.MAXLINES
+                key = None
+                while key is None:
+                    key = raw_input(prompt)
+                    if key not in ('', 'q'):
+                        key = None
+                if key == 'q':
+                    break
+
+def setcopyright():
+    """Set 'copyright' and 'credits' in __builtin__"""
+    __builtin__.copyright = _Printer("copyright", sys.copyright)
+    if sys.platform[:4] == 'java':
+        __builtin__.credits = _Printer(
+            "credits",
+            "Jython is maintained by the Jython developers (www.jython.org).")
+    else:
+        __builtin__.credits = _Printer("credits", """\
+    Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
+    for supporting Python development.  See www.python.org for more information.""")
+    here = os.path.dirname(os.__file__)
+    __builtin__.license = _Printer(
+        "license", "See http://www.python.org/%.3s/license.html" % sys.version,
+        ["LICENSE.txt", "LICENSE"],
+        [os.path.join(here, os.pardir), here, os.curdir])
+
+
+class _Helper(object):
+    """Define the built-in 'help'.
+    This is a wrapper around pydoc.help (with a twist).
+
+    """
+
+    def __repr__(self):
+        return "Type help() for interactive help, " \
+               "or help(object) for help about object."
+    def __call__(self, *args, **kwds):
+        import pydoc
+        return pydoc.help(*args, **kwds)
+
+def sethelper():
+    __builtin__.help = _Helper()
+
+def aliasmbcs():
+    """On Windows, some default encodings are not provided by Python,
+    while they are always available as "mbcs" in each locale. Make
+    them usable by aliasing to "mbcs" in such a case."""
+    if sys.platform == 'win32':
+        import locale, codecs
+        enc = locale.getdefaultlocale()[1]
+        if enc.startswith('cp'):            # "cp***" ?
+            try:
+                codecs.lookup(enc)
+            except LookupError:
+                import encodings
+                encodings._cache[enc] = encodings._unknown
+                encodings.aliases.aliases[enc] = 'mbcs'
+
+def setencoding():
+    """Set the string encoding used by the Unicode implementation.  The
+    default is 'ascii', but if you're willing to experiment, you can
+    change this."""
+    encoding = "ascii" # Default value set by _PyUnicode_Init()
+    if 0:
+        # Enable to support locale aware default string encodings.
+        import locale
+        loc = locale.getdefaultlocale()
+        if loc[1]:
+            encoding = loc[1]
+    if 0:
+        # Enable to switch off string to Unicode coercion and implicit
+        # Unicode to string conversion.
+        encoding = "undefined"
+    if encoding != "ascii":
+        # On Non-Unicode builds this will raise an AttributeError...
+        sys.setdefaultencoding(encoding) # Needs Python Unicode build !
+
+
+def execsitecustomize():
+    """Run custom site specific code, if available."""
+    try:
+        import sitecustomize
+    except ImportError:
+        pass
+
+def fixup_setuptools():
+    """Make sure our setuptools monkeypatch is in place"""
+    for i in range(len(sys.path)):
+        if sys.path[i].find('setuptools') != -1:
+            path = sys.path[i]
+            del sys.path[i]
+            sys.path.append(path)
+
+def main():
+    abs__file__()
+    paths_in_sys = removeduppaths()
+    if include_site_packages:
+        paths_in_sys = addsitepackages(paths_in_sys)
+    setquit()
+    setcopyright()
+    sethelper()
+    aliasmbcs()
+    setencoding()
+    execsitecustomize()
+    # Remove sys.setdefaultencoding() so that users cannot change the
+    # encoding after initialization.  The test for presence is needed when
+    # this module is run as a script, because this code is executed twice.
+    if hasattr(sys, "setdefaultencoding"):
+        del sys.setdefaultencoding
+    __boot()
+    fixup_setuptools()
+    
+
+
+include_site_packages = False
+
+
+
+main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/sphinx-build.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,9 @@
+#!python.exe
+# EASY-INSTALL-ENTRY-SCRIPT: 'Sphinx==0.5.1','console_scripts','sphinx-build'
+__requires__ = 'Sphinx==0.5.1'
+import sys
+from pkg_resources import load_entry_point
+
+sys.exit(
+   load_entry_point('Sphinx==0.5.1', 'console_scripts', 'sphinx-build')()
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/threadpool.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,337 @@
+
+# -*- coding: UTF-8 -*-
+"""Easy to use object-oriented thread pool framework.
+
+A thread pool is an object that maintains a pool of worker threads to perform
+time consuming operations in parallel. It assigns jobs to the threads
+by putting them in a work request queue, where they are picked up by the
+next available thread. This then performs the requested operation in the
+background and puts the results in a another queue.
+
+The thread pool object can then collect the results from all threads from
+this queue as soon as they become available or after all threads have
+finished their work. It's also possible, to define callbacks to handle
+each result as it comes in.
+
+The basic concept and some code was taken from the book "Python in a Nutshell"
+by Alex Martelli, copyright 2003, ISBN 0-596-00188-6, from section 14.5
+"Threaded Program Architecture". I wrapped the main program logic in the
+ThreadPool class, added the WorkRequest class and the callback system and
+tweaked the code here and there. Kudos also to Florent Aide for the exception
+handling mechanism.
+
+Basic usage:
+
+>>> pool = TreadPool(poolsize)
+>>> requests = makeRequests(some_callable, list_of_args, callback)
+>>> [pool.putRequest(req) for req in requests]
+>>> pool.wait()
+
+See the end of the module code for a brief, annotated usage example.
+
+Website : http://chrisarndt.de/en/software/python/threadpool/
+"""
+
+__all__ = [
+  'makeRequests',
+  'NoResultsPending',
+  'NoWorkersAvailable',
+  'ThreadPool',
+  'WorkRequest',
+  'WorkerThread'
+]
+
+__author__ = "Christopher Arndt"
+__version__ = "1.2.3"
+__revision__ = "$Revision: 1.5 $"
+__date__ = "$Date: 2006/06/23 12:32:25 $"
+__license__ = 'Python license'
+
+# standard library modules
+import sys
+import threading
+import Queue
+
+# exceptions
+class NoResultsPending(Exception):
+    """All work requests have been processed."""
+    pass
+
+class NoWorkersAvailable(Exception):
+    """No worker threads available to process remaining requests."""
+    pass
+
+# classes
+class WorkerThread(threading.Thread):
+    """Background thread connected to the requests/results queues.
+
+    A worker thread sits in the background and picks up work requests from
+    one queue and puts the results in another until it is dismissed.
+    """
+
+    def __init__(self, requestsQueue, resultsQueue, **kwds):
+        """Set up thread in daemonic mode and start it immediatedly.
+
+        requestsQueue and resultQueue are instances of Queue.Queue passed
+        by the ThreadPool class when it creates a new worker thread.
+        """
+
+        threading.Thread.__init__(self, **kwds)
+        self.setDaemon(1)
+        self.workRequestQueue = requestsQueue
+        self.resultQueue = resultsQueue
+        self._dismissed = threading.Event()
+        self.start()
+
+    def run(self):
+        """Repeatedly process the job queue until told to exit."""
+
+        while not self._dismissed.isSet():
+            # thread blocks here, if queue empty
+            request = self.workRequestQueue.get()
+            if self._dismissed.isSet():
+                # if told to exit, return the work request we just picked up
+                self.workRequestQueue.put(request)
+                break # and exit
+            try:
+                self.resultQueue.put(
+                    (request, request.callable(*request.args, **request.kwds))
+                )
+            except:
+                request.exception = True
+                self.resultQueue.put((request, sys.exc_info()))
+
+    def dismiss(self):
+        """Sets a flag to tell the thread to exit when done with current job.
+        """
+
+        self._dismissed.set()
+
+
+class WorkRequest:
+    """A request to execute a callable for putting in the request queue later.
+
+    See the module function makeRequests() for the common case
+    where you want to build several WorkRequests for the same callable
+    but with different arguments for each call.
+    """
+
+    def __init__(self, callable, args=None, kwds=None, requestID=None,
+      callback=None, exc_callback=None):
+        """Create a work request for a callable and attach callbacks.
+
+        A work request consists of the a callable to be executed by a
+        worker thread, a list of positional arguments, a dictionary
+        of keyword arguments.
+
+        A callback function can be specified, that is called when the results
+        of the request are picked up from the result queue. It must accept
+        two arguments, the request object and the results of the callable,
+        in that order. If you want to pass additional information to the
+        callback, just stick it on the request object.
+
+        You can also give a callback for when an exception occurs. It should
+        also accept two arguments, the work request and a tuple with the
+        exception details as returned by sys.exc_info().
+
+        requestID, if given, must be hashable since it is used by the
+        ThreadPool object to store the results of that work request in a
+        dictionary. It defaults to the return value of id(self).
+        """
+
+        if requestID is None:
+            self.requestID = id(self)
+        else:
+            try:
+                hash(requestID)
+            except TypeError:
+                raise TypeError("requestID must be hashable.")
+            self.requestID = requestID
+        self.exception = False
+        self.callback = callback
+        self.exc_callback = exc_callback
+        self.callable = callable
+        self.args = args or []
+        self.kwds = kwds or {}
+
+
+class ThreadPool:
+    """A thread pool, distributing work requests and collecting results.
+
+    See the module doctring for more information.
+    """
+
+    def __init__(self, num_workers, q_size=0):
+        """Set up the thread pool and start num_workers worker threads.
+
+        num_workers is the number of worker threads to start initialy.
+        If q_size > 0 the size of the work request queue is limited and
+        the thread pool blocks when the queue is full and it tries to put
+        more work requests in it (see putRequest method).
+        """
+
+        self.requestsQueue = Queue.Queue(q_size)
+        self.resultsQueue = Queue.Queue()
+        self.workers = []
+        self.workRequests = {}
+        self.createWorkers(num_workers)
+
+    def createWorkers(self, num_workers):
+        """Add num_workers worker threads to the pool."""
+
+        for i in range(num_workers):
+            self.workers.append(WorkerThread(self.requestsQueue,
+              self.resultsQueue))
+
+    def dismissWorkers(self, num_workers):
+        """Tell num_workers worker threads to quit after their current task.
+        """
+
+        for i in range(min(num_workers, len(self.workers))):
+            worker = self.workers.pop()
+            worker.dismiss()
+
+    def addWork(self, callable, args=None, kwds=None, requestID=None, callback=None, exc_callback=None, block=True, timeout=0):
+        request = WorkRequest(callable, args, kwds, requestID, callback, exc_callback)
+        self.putRequest(request, block, timeout)
+        
+    def putRequest(self, request, block=True, timeout=0):
+        """Put work request into work queue and save its id for later."""
+
+        assert isinstance(request, WorkRequest)
+        self.requestsQueue.put(request, block, timeout)
+        self.workRequests[request.requestID] = request
+
+    def poll(self, block=False):
+        """Process any new results in the queue."""
+
+        while True:
+            # still results pending?
+            if not self.workRequests:
+                raise NoResultsPending
+            # are there still workers to process remaining requests?
+            elif block and not self.workers:
+                raise NoWorkersAvailable
+            try:
+                # get back next results
+                request, result = self.resultsQueue.get(block=block)
+                # has an exception occured?
+                if request.exception and request.exc_callback:
+                    request.exc_callback(request, result)
+                # hand results to callback, if any
+                if request.callback and not \
+                  (request.exception and request.exc_callback):
+                    request.callback(request, result)
+                del self.workRequests[request.requestID]
+            except Queue.Empty:
+                break
+
+    def wait(self):
+        """Wait for results, blocking until all have arrived."""
+
+        while 1:
+            try:
+                self.poll(True)
+            except NoResultsPending:
+                break
+
+# helper functions
+def makeRequests(callable, args_list, callback=None, exc_callback=None):
+    """Create several work requests for same callable with different arguments.
+
+    Convenience function for creating several work requests for the same
+    callable where each invocation of the callable receives different values
+    for its arguments.
+
+    args_list contains the parameters for each invocation of callable.
+    Each item in 'args_list' should be either a 2-item tuple of the list of
+    positional arguments and a dictionary of keyword arguments or a single,
+    non-tuple argument.
+
+    See docstring for WorkRequest for info on callback and exc_callback.
+    """
+
+    requests = []
+    for item in args_list:
+        if isinstance(item, tuple):
+            requests.append(
+              WorkRequest(callable, item[0], item[1], callback=callback,
+                exc_callback=exc_callback)
+            )
+        else:
+            requests.append(
+              WorkRequest(callable, [item], None, callback=callback,
+                exc_callback=exc_callback)
+            )
+    return requests
+
+################
+# USAGE EXAMPLE
+################
+
+if __name__ == '__main__':
+    import random
+    import time
+
+    # the work the threads will have to do (rather trivial in our example)
+    def do_something(data):
+        time.sleep(random.randint(1, 5))
+        result = round(random.random() * data, 5)
+        # just to show off, we throw an exception once in a while
+        if result > 3:
+            raise RuntimeError("Something extraordinary happened!")
+        return result
+
+    # this will be called each time a result is available
+    def print_result(request, result):
+        print "**Result: %s from request #%s" % (result, request.requestID)
+
+    # this will be called when an exception occurs within a thread
+    def handle_exception(request, exc_info):
+        print "Exception occured in request #%s: %s" % \
+          (request.requestID, exc_info[1])
+
+    # assemble the arguments for each job to a list...
+    data = [random.randint(1, 10) for i in range(20)]
+    # ... and build a WorkRequest object for each item in data
+    requests = makeRequests(do_something, data, print_result, handle_exception)
+
+    # or the other form of args_lists accepted by makeRequests: ((,), {})
+    data = [((random.randint(1, 10), ), {}) for i in range(20)]
+    requests.extend(
+      makeRequests(do_something, data, print_result, handle_exception)
+    )
+
+    # we create a pool of 3 worker threads
+    main = ThreadPool(3)
+
+    # then we put the work requests in the queue...
+    for req in requests:
+        main.putRequest(req)
+        print "Work request #%s added." % req.requestID
+    # or shorter:
+    # [main.putRequest(req) for req in requests]
+
+    # ...and wait for the results to arrive in the result queue
+    # by using ThreadPool.wait(). This would block until results for
+    # all work requests have arrived:
+    # main.wait()
+
+    # instead we can poll for results while doing something else:
+    i = 0
+    while 1:
+        try:
+            main.poll()
+            print "Main thread working..."
+            time.sleep(0.5)
+            if i == 10:
+                print "Adding 3 more worker threads..."
+                main.createWorkers(3)
+            i += 1
+        except KeyboardInterrupt:
+            print "Interrupted!"
+            break
+        except NoResultsPending:
+            print "All results collected."
+            break
+
Binary file buildframework/helium/external/python/lib/linux/4Suite-XML-1.0.2.tar.gz has changed
Binary file buildframework/helium/external/python/lib/linux/PyXML-0.8.4.tar.gz has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/linux/easy-install.pth	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,5 @@
+import sys; sys.__plen = len(sys.path)
+./PyXML-0.8.4.egg
+./4Suite_XML-1.0.2.egg
+./lxml-1.3.6.egg
+import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
Binary file buildframework/helium/external/python/lib/linux/lxml-1.3.6.tgz has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/linux/site.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,394 @@
+# Duplicating setuptools' site.py...
+def __boot():
+    PYTHONPATH = []    
+    if sys.platform=='win32':
+        PYTHONPATH.append(os.path.join(sys.prefix, 'lib'))
+    if not (os.environ.get('PYTHONPATH') is None or (sys.platform=='win32' and not os.environ.get('PYTHONPATH'))):
+        PYTHONPATH.extend(os.environ.get('PYTHONPATH').split(os.pathsep))
+    pic = getattr(sys,'path_importer_cache',{})
+    stdpath = sys.path[len(PYTHONPATH):]
+    mydir = os.path.dirname(__file__)
+    known_paths = dict([(makepath(item)[1],1) for item in sys.path]) # 2.2 comp
+
+    oldpos = getattr(sys,'__egginsert',0)   # save old insertion position
+    sys.__egginsert = 0                     # and reset the current one
+
+    for item in PYTHONPATH:
+        addsitedir(item)
+        item_site_packages = os.path.join(item, 'site-packages')
+        if os.path.exists(item_site_packages):
+            addsitedir(item_site_packages)
+
+    sys.__egginsert += oldpos           # restore effective old position
+
+    d,nd = makepath(stdpath[0])
+    insert_at = None
+    new_path = []
+
+    for item in sys.path:
+        p,np = makepath(item)
+
+        if np==nd and insert_at is None:
+            # We've hit the first 'system' path entry, so added entries go here
+            insert_at = len(new_path)
+
+        if np in known_paths or insert_at is None:
+            new_path.append(item)
+        else:
+            # new path after the insert point, back-insert it
+            new_path.insert(insert_at, item)
+            insert_at += 1
+
+    sys.path[:] = new_path
+    
+import sys
+import os
+import __builtin__
+
+def makepath(*paths):
+    dir = os.path.abspath(os.path.join(*paths))
+    return dir, os.path.normcase(dir)
+
+def abs__file__():
+    """Set all module' __file__ attribute to an absolute path"""
+    for m in sys.modules.values():
+        try:
+            m.__file__ = os.path.abspath(m.__file__)
+        except AttributeError:
+            continue
+
+try:
+    set
+except NameError:
+    class set:
+        def __init__(self, args=()):
+            self.d = {}
+            for v in args:
+                self.d[v] = None
+        def __contains__(self, key):
+            return key in self.d
+        def add(self, key):
+            self.d[key] = None
+
+def removeduppaths():
+    """ Remove duplicate entries from sys.path along with making them
+    absolute"""
+    # This ensures that the initial path provided by the interpreter contains
+    # only absolute pathnames, even if we're running from the build directory.
+    L = []
+    known_paths = set()
+    for dir in sys.path:
+        # Filter out duplicate paths (on case-insensitive file systems also
+        # if they only differ in case); turn relative paths into absolute
+        # paths.
+        dir, dircase = makepath(dir)
+        if not dircase in known_paths:
+            L.append(dir)
+            known_paths.add(dircase)
+    sys.path[:] = L
+    return known_paths
+
+def _init_pathinfo():
+    """Return a set containing all existing directory entries from sys.path"""
+    d = set()
+    for dir in sys.path:
+        try:
+            if os.path.isdir(dir):
+                dir, dircase = makepath(dir)
+                d.add(dircase)
+        except TypeError:
+            continue
+    return d
+
+def addpackage(sitedir, name, known_paths, exclude_packages=()):
+    """Add a new path to known_paths by combining sitedir and 'name' or execute
+    sitedir if it starts with 'import'"""
+    import fnmatch
+    if known_paths is None:
+        _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    fullname = os.path.join(sitedir, name)
+    try:
+        f = open(fullname, "rU")
+    except IOError:
+        return
+    try:
+        for line in f:
+            if line.startswith("#"):
+                continue
+            found_exclude = False
+            for exclude in exclude_packages:
+                if exclude(line):
+                    found_exclude = True
+                    break
+            if found_exclude:
+                continue
+            if line.startswith("import"):
+                exec line
+                continue
+            line = line.rstrip()
+            dir, dircase = makepath(sitedir, line)
+            if not dircase in known_paths and os.path.exists(dir):
+                sys.path.append(dir)
+                known_paths.add(dircase)
+    finally:
+        f.close()
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitedir(sitedir, known_paths=None, exclude_packages=()):
+    """Add 'sitedir' argument to sys.path if missing and handle .pth files in
+    'sitedir'"""
+    if known_paths is None:
+        known_paths = _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    sitedir, sitedircase = makepath(sitedir)
+    if not sitedircase in known_paths:
+        sys.path.append(sitedir)        # Add path component
+    try:
+        names = os.listdir(sitedir)
+    except os.error:
+        return
+    names.sort()
+    for name in names:
+        if name.endswith(os.extsep + "pth"):
+            addpackage(sitedir, name, known_paths,
+                       exclude_packages=exclude_packages)
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitepackages(known_paths):
+    """Add site-packages (and possibly site-python) to sys.path"""
+    prefixes = [os.path.join(sys.prefix, "local"), sys.prefix]
+    if sys.exec_prefix != sys.prefix:
+        prefixes.append(os.path.join(sys.exec_prefix, "local"))
+    for prefix in prefixes:
+        if prefix:
+            if sys.platform in ('os2emx', 'riscos'):
+                sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
+            elif os.sep == '/':
+                sitedirs = [os.path.join(prefix,
+                                         "lib",
+                                         "python" + sys.version[:3],
+                                         "site-packages"),
+                            os.path.join(prefix, "lib", "site-python")]
+                try:
+                    # sys.getobjects only available in --with-pydebug build
+                    # pylint: disable-msg=E1101
+                    sys.getobjects
+                    sitedirs.insert(0, os.path.join(sitedirs[0], 'debug'))
+                except AttributeError:
+                    pass
+            else:
+                sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
+            if sys.platform == 'darwin':
+                sitedirs.append( os.path.join('/opt/local', 'lib', 'python' + sys.version[:3], 'site-packages') )
+                # for framework builds *only* we add the standard Apple
+                # locations. Currently only per-user, but /Library and
+                # /Network/Library could be added too
+                if 'Python.framework' in prefix:
+                    home = os.environ.get('HOME')
+                    if home:
+                        sitedirs.append(
+                            os.path.join(home,
+                                         'Library',
+                                         'Python',
+                                         sys.version[:3],
+                                         'site-packages'))
+            for sitedir in sitedirs:
+                if os.path.isdir(sitedir):
+                    addsitedir(sitedir, known_paths,
+                               exclude_packages=[lambda line: 'setuptools' in line])
+    return None
+
+def setquit():
+    """Define new built-ins 'quit' and 'exit'.
+    These are simply strings that display a hint on how to exit.
+
+    """
+    if os.sep == ':':
+        exit = 'Use Cmd-Q to quit.'
+    elif os.sep == '\\':
+        exit = 'Use Ctrl-Z plus Return to exit.'
+    else:
+        exit = 'Use Ctrl-D (i.e. EOF) to exit.'
+    __builtin__.quit = __builtin__.exit = exit
+
+
+class _Printer(object):
+    """interactive prompt objects for printing the license text, a list of
+    contributors and the copyright notice."""
+
+    MAXLINES = 23
+
+    def __init__(self, name, data, files=(), dirs=()):
+        self.__name = name
+        self.__data = data
+        self.__files = files
+        self.__dirs = dirs
+        self.__lines = None
+
+    def __setup(self):
+        if self.__lines:
+            return
+        data = None
+        for dir in self.__dirs:
+            for filename in self.__files:
+                filename = os.path.join(dir, filename)
+                try:
+                    fp = file(filename, "rU")
+                    data = fp.read()
+                    fp.close()
+                    break
+                except IOError:
+                    pass
+            if data:
+                break
+        if not data:
+            data = self.__data
+        self.__lines = data.split('\n')
+        self.__linecnt = len(self.__lines)
+
+    def __repr__(self):
+        self.__setup()
+        if len(self.__lines) <= self.MAXLINES:
+            return "\n".join(self.__lines)
+        else:
+            return "Type %s() to see the full %s text" % ((self.__name,)*2)
+
+    def __call__(self):
+        self.__setup()
+        prompt = 'Hit Return for more, or q (and Return) to quit: '
+        lineno = 0
+        while 1:
+            try:
+                for i in range(lineno, lineno + self.MAXLINES):
+                    print self.__lines[i]
+            except IndexError:
+                break
+            else:
+                lineno += self.MAXLINES
+                key = None
+                while key is None:
+                    key = raw_input(prompt)
+                    if key not in ('', 'q'):
+                        key = None
+                if key == 'q':
+                    break
+
+def setcopyright():
+    """Set 'copyright' and 'credits' in __builtin__"""
+    __builtin__.copyright = _Printer("copyright", sys.copyright)
+    if sys.platform[:4] == 'java':
+        __builtin__.credits = _Printer(
+            "credits",
+            "Jython is maintained by the Jython developers (www.jython.org).")
+    else:
+        __builtin__.credits = _Printer("credits", """\
+    Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
+    for supporting Python development.  See www.python.org for more information.""")
+    here = os.path.dirname(os.__file__)
+    __builtin__.license = _Printer(
+        "license", "See http://www.python.org/%.3s/license.html" % sys.version,
+        ["LICENSE.txt", "LICENSE"],
+        [os.path.join(here, os.pardir), here, os.curdir])
+
+
+class _Helper(object):
+    """Define the built-in 'help'.
+    This is a wrapper around pydoc.help (with a twist).
+
+    """
+
+    def __repr__(self):
+        return "Type help() for interactive help, " \
+               "or help(object) for help about object."
+    def __call__(self, *args, **kwds):
+        import pydoc
+        return pydoc.help(*args, **kwds)
+
+def sethelper():
+    __builtin__.help = _Helper()
+
+def aliasmbcs():
+    """On Windows, some default encodings are not provided by Python,
+    while they are always available as "mbcs" in each locale. Make
+    them usable by aliasing to "mbcs" in such a case."""
+    if sys.platform == 'win32':
+        import locale, codecs
+        enc = locale.getdefaultlocale()[1]
+        if enc.startswith('cp'):            # "cp***" ?
+            try:
+                codecs.lookup(enc)
+            except LookupError:
+                import encodings
+                encodings._cache[enc] = encodings._unknown
+                encodings.aliases.aliases[enc] = 'mbcs'
+
+def setencoding():
+    """Set the string encoding used by the Unicode implementation.  The
+    default is 'ascii', but if you're willing to experiment, you can
+    change this."""
+    encoding = "ascii" # Default value set by _PyUnicode_Init()
+    if 0:
+        # Enable to support locale aware default string encodings.
+        import locale
+        loc = locale.getdefaultlocale()
+        if loc[1]:
+            encoding = loc[1]
+    if 0:
+        # Enable to switch off string to Unicode coercion and implicit
+        # Unicode to string conversion.
+        encoding = "undefined"
+    if encoding != "ascii":
+        # On Non-Unicode builds this will raise an AttributeError...
+        sys.setdefaultencoding(encoding) # Needs Python Unicode build !
+
+
+def execsitecustomize():
+    """Run custom site specific code, if available."""
+    try:
+        import sitecustomize
+    except ImportError:
+        pass
+
+def fixup_setuptools():
+    """Make sure our setuptools monkeypatch is in place"""
+    for i in range(len(sys.path)):
+        if sys.path[i].find('setuptools') != -1:
+            path = sys.path[i]
+            del sys.path[i]
+            sys.path.append(path)
+
+def main():
+    abs__file__()
+    paths_in_sys = removeduppaths()
+    if include_site_packages:
+        paths_in_sys = addsitepackages(paths_in_sys)
+    setquit()
+    setcopyright()
+    sethelper()
+    aliasmbcs()
+    setencoding()
+    execsitecustomize()
+    # Remove sys.setdefaultencoding() so that users cannot change the
+    # encoding after initialization.  The test for presence is needed when
+    # this module is run as a script, because this code is executed twice.
+    if hasattr(sys, "setdefaultencoding"):
+        del sys.setdefaultencoding
+    __boot()
+    fixup_setuptools()
+    
+
+
+include_site_packages = False
+
+
+
+main()
--- a/buildframework/helium/helium.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/helium.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -24,7 +24,9 @@
     <description>
     Main full build targets and properties
     </description>
-
+    
+    <import file="build-jar.ant.xml"/>
+    
     <!-- Check the Ant version is what we expect. -->
     <property name="required.ant.version" value="1.7.0"/>
     <fail message="Incorrect version of Ant found. Please check you have Ant ${required.ant.version}.">
@@ -46,7 +48,6 @@
     ======================================================================-->
     <import file="helium_preinclude.ant.xml"/>
     
-    <property name="cache.dir" location="${env.TEMP}/helium/${env.USERNAME}"/>
     <property name="helium.build.dir" location="${helium.dir}/build"/>
     
     <hlm:typedef file="${helium.dir}/tools/common/common.antlib.xml" uri="http://www.nokia.com/helium"/> 
@@ -188,22 +189,32 @@
     
     <property name="build.id" value="${build.name}_${build.version}"/>
     <property name="build.type" value="core"/>
-    <property name="epocroot" value="\"/>
+    <condition property="epocroot" value="${env.EPOCROOT}" else="${env.EPOCROOT}/">
+        <matches pattern="^.*[\\/]$" string="${env.EPOCROOT}" />
+    </condition>
     <property name="data.model.file" location="${helium.dir}/config/helium_data_model.xml"/>
     <property name="data.model.parsed" location="${helium.build.dir}/datamodel.out"/>
     <condition property="data.model.xsl" value="${helium.dir}/extensions/nokia/config/helium_nokia_data_model.xsl" else="${helium.dir}/config/helium_data_model.xsl">
         <available file="${helium.dir}/extensions/nokia/config/helium_nokia_data_model.xsl"/>
     </condition>
-    <property name="database.file" location="${helium.dir}/build/database.xml"/>
+    <property name="database.file" location="${helium.build.dir}/database.xml"/>
     <property name="ccm.base.dir" location="${ccm.home.dir}\${minor.version}"/>
     <property name="prep.build.dir" location="${prep.root.dir}/${build.id}"/>
     <property name="build.output.dir" location="${build.drive}/output"/>
+    <property name="diamonds.build.output.dir" location="${build.output.dir}/diamonds"/>
     <property name="build.sisfiles.dir" location="${build.output.dir}/sisfiles"/>
     <property name="zips.build.dir" location="${build.output.dir}/build_area/engineering_english"/>
     <property name="zips.loc.dir" location="${build.output.dir}/build_area/localised"/>
     <property name="subcon.zips.dir" location="${build.output.dir}/build_area/subcon"/>
     <property name="zips.flashfiles.dir" location="${build.output.dir}/zips_flashfiles"/>
     <property name="build.log.dir" location="${build.output.dir}/logs"/>
+    <property name="prep.log.dir" location="${build.log.dir}/prep"/>
+    <property name="compile.log.dir" location="${build.log.dir}/compile"/>
+    <property name="test.log.dir" location="${build.log.dir}/test"/>
+    <property name="archive.log.dir" location="${build.log.dir}/archive"/>
+    <property name="roms.log.dir" location="${build.log.dir}/roms"/>       
+    <property name="post.log.dir" location="${build.log.dir}/post"/>
+    <property name="localisation.log.dir" location="${build.log.dir}/localisation"/>    
     <property name="build.signal.status.dir" location="${build.log.dir}/signals"/>
     <property name="build.status.email.template" location="${helium.dir}/tools/common/templates/log/email_status.html.ftl" />
     <property name="metadata.dbfile" location="${build.log.dir}/${build.id}_metadata.sqlite"/>
@@ -232,7 +243,7 @@
     
     <property name="release.images.dir" value="${build.output.dir}/release_flash_images"/>
     <property name="binary.root" value="${build.drive}/epoc32/release/armv5/urel" />
-    <property name="python.dir" value="${helium.dir}/external/python/lib/2.5"/>
+    <property name="python.dir" value="${helium.dir}/external/python/lib"/>
     <property name="python.tools" value="${helium.dir}/external/python/bin"/>
 
     <!-- EBS is selected as the default build system, but ec for Electric Cloud could be used. -->
@@ -244,7 +255,7 @@
     <property name="error.summary.file" location="${build.log.dir}/summary/${build.id}_error_summary.log.xml"/>
     <property name="build.logging.start.stage" value="check-env-prep"/>
     <property name="build.logging.key.stages" value="prep,build-ebs-main,postbuild,flashfiles,java-certification-rom,zip-main,publish-generic,variants-core,variants-elaf,variants-china,variants-thai,variants-japan,variants,mobilecrash-prep,localise-tutorial-content,hdd-images,zip-flashfiles,zip-localisation,data-packaging-prep"/>
-    <property name="build.log" value="${build.log.dir}/${build.id}_ant_build.log"/>
+    <property name="build.log" value="${build.log.dir}/${build.id}_main.ant.log"/>
     <property name="overlays.log.file" location="${build.log.dir}/${build.id}_overlays.xml"/>
     <property name="diamonds.listener.configuration.file" location="${helium.dir}/config/diamonds_config.xml.ftl"/>
     <property name="antlib.import.module.path" location="${helium.dir}/tools/hlm-antlib-imports"/>
@@ -267,11 +278,12 @@
     <property name="loc.temp.dir" location="${temp.build.dir}/locfiles"/>
     <property name="loc.output.dir" location="${build.output.dir}/build_area/localised"/>
     <property name="loc.output.filename" location="${build.id}_locfiles.zip"/>
-    
+    <property name="exceptions.target" value="hlm-exception-handler"/>
     <property name="tools.ivy.config.file" location="${helium.dir}/config/ivy/tools_ivy_settings.xml" />
     
-    <property name="build.property.cache.file" location="${build.log.dir}/build_properties_cache.txt" />
+    <property name="build.property.cache.file" location="${diamonds.build.output.dir}/build_properties_cache.txt" />
     <property name="ccmtask.python.script.file" location="${helium.dir}/tools/preparation/synergy/ccmtask.jep" />
+    <property name="ant.loglevel" value="verbose"/>
 
     <if>
         <available file="${build.property.cache.file}"/>
@@ -280,7 +292,8 @@
         </then>
     </if>
 
-    
+
+
 
     <!-- Default number of threads is 2 * NUMBER_OF_PROCESSORS, but this can be overridden by defining the
     property manually. -->
@@ -327,6 +340,7 @@
     <import file="tools/startup/bootstrap/bootstrap.ant.xml"/>
     <import file="tools/iad/iad.ant.xml"/>
     <import file="config/signaling_config_default.ant.xml"/>
+    <import file="config/stages_config_default.ant.xml"/>
     <import file="config/metadata_filter_config_default.ant.xml"/>
 
     <!-- Checking required properties from datamodel if "validate.properties.at.startup=yes" 
--- a/buildframework/helium/helium_preinclude.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/helium_preinclude.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -32,4 +32,6 @@
     <taskdef resource="com/nokia/helium/scm/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
     <taskdef resource="com/nokia/helium/metadata/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
     <taskdef resource="com/nokia/helium/quality/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+    <taskdef resource="com/nokia/helium/imaker/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+    <taskdef resource="com/nokia/helium/sbs/ant/antlib.xml" uri="http://www.nokia.com/helium" />
 </project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/hlm	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,116 @@
+#!/bin/bash
+
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+if [ ! $HELIUM_HOME ] ; then
+    export HELIUM_HOME=$(dirname $(readlink /proc/$$/fd/255))
+fi
+
+# For nokia specific enviroment configurations.
+if [ -f $HELIUM_HOME/extensions/nokia/env.sh ] ; then
+    . $HELIUM_HOME/extensions/nokia/env.sh
+fi
+
+export LANG="en_US.UTF-8"
+export ANT_ARGS="-lib $HELIUM_HOME/extensions/nokia/external/antlibs -lib $HELIUM_HOME/extensions/nokia/external/helium-nokia-antlib/bin -lib $HELIUM_HOME/external/helium-antlib/bin -lib $HELIUM_HOME/external/antlibs -lib $HELIUM_HOME/tools/common/java/lib -logger com.nokia.ant.HeliumLogger -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor -listener com.nokia.helium.diamonds.ant.HeliumListener -listener com.nokia.helium.logger.ant.listener.StatusAndLogListener"
+
+PYTHON_VERSION=`python -c "import sys; print sys.version[:3]"`
+PYTHON_VERSION2=$PYTHON_VERSION$HOSTTYPE
+PYTHONLIB=$HELIUM_HOME/external/python/lib/linux/$PYTHON_VERSION2
+
+TEMP_PYTHONPATH="$PYTHONLIB:$HELIUM_HOME/external/python/lib/common:$HELIUM_HOME/tools/common/python/lib:$HELIUM_HOME/tools/common/python/scripts:$HELIUM_HOME/extensions/nokia/external/python/lib/2.5:$HELIUM_HOME/extensions/nokia/tools/common/python/lib"
+
+if [ ! $PYTHONPATH ] ; then
+    export PYTHONPATH=$TEMP_PYTHONPATH
+else
+    export PYTHONPATH="$PYTHONPATH:$TEMP_PYTHONPATH"
+fi
+
+TEMP_JYTHONPATH="$HELIUM_HOME/external/python/lib/2.5/jython-2.5-py2.5.egg:$PYTHONPATH"
+
+if [ ! $JYTHONPATH ] ; then
+    export JYTHONPATH=$TEMP_JYTHONPATH
+else
+    export JYTHONPATH="$JYTHONPATH:$TEMP_JYTHONPATH"
+fi
+
+TEMP_PERL5LIB="$HELIUM_HOME/tools/common/packages"
+if [ ! $PERL5LIB ] ; then
+    PERL5LIB=$TEMP_PERL5LIB
+else
+    PERL5LIB="$PERL5LIB:$TEMP_PERL5LIB"
+fi
+
+
+if [ $HOST ]; then
+    export COMPUTERNAME=$HOST
+elif [ $HOSTNAME ]; then
+    export COMPUTERNAME=$HOSTNAME
+else
+    export COMPUTERNAME=$(hostname)
+fi
+
+CWD=`pwd`
+
+if [ ! -e "$PYTHONLIB" ] ; then
+    mkdir $PYTHONLIB
+    cp $HELIUM_HOME/external/python/lib/linux/site.py $PYTHONLIB
+fi
+
+if [ ! -e "$PYTHONLIB/4Suite_XML-1.0.2.egg" ] ; then
+    cp $HELIUM_HOME/external/python/lib/linux/easy-install.pth $PYTHONLIB
+    tar xvfz $HELIUM_HOME/external/python/lib/linux/4Suite-XML-1.0.2.tar.gz -C $PYTHONLIB > /dev/null
+    cd $PYTHONLIB/4Suite-XML-1.0.2
+    python setup.py bdist_egg > /dev/null
+    mv dist/*.egg $PYTHONLIB/4Suite_XML-1.0.2.egg
+fi
+
+if [ ! -e "$PYTHONLIB/lxml-1.3.6.egg" ] ; then
+    cp $HELIUM_HOME/external/python/lib/linux/easy-install.pth $PYTHONLIB
+    tar xvfz $HELIUM_HOME/external/python/lib/linux/lxml-1.3.6.tgz -C $PYTHONLIB > /dev/null
+    cd $PYTHONLIB/lxml-1.3.6
+    python setup.py bdist_egg > /dev/null
+    mv dist/*.egg $PYTHONLIB/lxml-1.3.6.egg
+fi
+
+if [ ! -e "$PYTHONLIB/PyXML-0.8.4.egg" ] ; then
+    cp $HELIUM_HOME/external/python/lib/linux/easy-install.pth $PYTHONLIB
+    tar xvfz $HELIUM_HOME/external/python/lib/linux/PyXML-0.8.4.tar.gz -C $PYTHONLIB > /dev/null
+    cd $PYTHONLIB/PyXML-0.8.4
+    python setup.py bdist > /dev/null
+    mv build/lib* $PYTHONLIB/PyXML-0.8.4.egg
+fi
+
+cd $CWD
+
+export USERNAME=$USER
+export SYMSEE_VERSION="not_in_use"
+export PID=$$
+export TEMP="/tmp/$USER"
+if [ $JOB_ID ] ; then
+    export HELIUM_CACHE_DIR="$TEMP/helium/$USER/$JOB_ID"
+else
+    export HELIUM_CACHE_DIR="$TEMP/helium/$USER"
+fi
+export ANT_OPTS="-Dlog4j.configuration=com/nokia/log4j.xml -Dlog4j.cache.dir=$HELIUM_CACHE_DIR"
+export PYTHON_CACHEDIR="$HELIUM_CACHE_DIR/python"
+
+mkdir -p $HELIUM_CACHE_DIR
+
+if [ ! $EPOCROOT ]; then
+    export EPOCROOT="/"
+fi 
+exec ant -Dpython.cachedir=$PYTHON_CACHEDIR -Dhelium.dir=$HELIUM_HOME -Dpython.path=$PYTHONPATH -Dcache.dir=$HELIUM_CACHE_DIR $* 
--- a/buildframework/helium/hlm.bat	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/hlm.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -42,10 +42,10 @@
 if not defined JAVA_6_HOME (
 set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
 ) ELSE  set TESTED_JAVA=%JAVA_6_HOME%
-if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+if exist "%TESTED_JAVA%" (set JAVA_HOME=%TESTED_JAVA%)
 if not exist "%JAVA_HOME%" ( echo *** Java cannot be found & goto :errorstop )
-set JEP_HOME=%HELIUM_HOME%\external\jep_1.6_2.5
-set PATH=%PATH%;%JEP_HOME%
+REM set JEP_HOME=%HELIUM_HOME%\external\jep_1.6_2.5
+REM set PATH=%PATH%;%JEP_HOME%
 
 REM Needed by python logging
 set PID=1
@@ -54,13 +54,15 @@
 
 REM Configure Apache Ant
 set TESTED_ANT=C:\APPS\ant_1.7
-if exist %TESTED_ANT% (set ANT_HOME=%TESTED_ANT%)
+if exist "%TESTED_ANT%" (set ANT_HOME=%TESTED_ANT%)
 if not exist "%ANT_HOME%" ( echo *** Ant cannot be found & goto :errorstop )
 if not defined ANT_OPTS (
 	set ANT_OPTS=-Xmx896M -Dlog4j.configuration=com/nokia/log4j.xml
 )
 
 set SIGNALING_ANT_ARGS= -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor
+set LOGGING_ANT_ARGS= -listener com.nokia.helium.logger.ant.listener.StatusAndLogListener
+REM -listener com.nokia.helium.logger.ant.listener.StatusAndLogListener
 set DIAMONDS_ANT_ARGS= -listener com.nokia.helium.diamonds.ant.HeliumListener
 
 if not defined HLM_DISABLE_INTERNAL_DATA (
@@ -69,7 +71,7 @@
 )
 
 if not defined ANT_ARGS (
-set ANT_ARGS=-lib "%HELIUM_HOME%\extensions\nokia\external\antlibs" -lib "%HELIUM_HOME%\extensions\nokia\external\helium-nokia-antlib\bin" -lib "%HELIUM_HOME%\external\helium-antlib\bin" -lib "%HELIUM_HOME%\tools\common\java\lib" -lib "%HELIUM_HOME%\external\antlibs" -lib "%JEP_HOME%" -logger com.nokia.ant.HeliumLogger  %DIAMONDS_ANT_ARGS% %INTERNAL_DATA_ANT_ARGS% %SIGNALING_ANT_ARGS%
+set ANT_ARGS=-lib "%HELIUM_HOME%\extensions\nokia\external\antlibs" -lib "%HELIUM_HOME%\extensions\nokia\external\helium-nokia-antlib\bin" -lib "%HELIUM_HOME%\external\helium-antlib\bin" -lib "%HELIUM_HOME%\tools\common\java\lib" -lib "%HELIUM_HOME%\external\antlibs" -logger com.nokia.ant.HeliumLogger  %DIAMONDS_ANT_ARGS% %INTERNAL_DATA_ANT_ARGS% %SIGNALING_ANT_ARGS% %LOGGING_ANT_ARGS%
 )
 
 REM Shall we impose the EPOCROOT?
@@ -80,19 +82,17 @@
 REM Symbian Build area path related settings
 set PATH=%PATH%;%EPOCROOT%epoc32\tools;%EPOCROOT%epoc32\gcc\bin;%EPOCROOT%epoc32\tools\build;%EPOCROOT%epoc32\rombuild
 
-REM Helium specific settings
-set PATH=%PATH%;%HELIUM_HOME%\tools\common\bin
-set PATH=%PATH%;%HELIUM_HOME%\extensions\nokia\external\doxygen
 set PATH=%PATH%;%HELIUM_HOME%\extensions\nokia\external\unxutils
-set PATH=%PATH%;%HELIUM_HOME%\external\filedisk
-set PATH=%PATH%;%HELIUM_HOME%\extensions\nokia\external\info-zip
 set PATH=%PATH%;%HELIUM_HOME%\extensions\nokia\external\Subversion\bin
 set PATH=%PATH%;%HELIUM_HOME%\extensions\nokia\external\graphviz\bin
-set PATH=%PATH%;%HELIUM_HOME%\extensions\nokia\external\LSC_5.2
 set PATH=%PATH%;\tools
 set PATH=%PATH%;\tools\ncp_tools
-set PYTHONPATH=%PYTHONPATH%;%HELIUM_HOME%\external\python\lib\2.5;%HELIUM_HOME%\tools\common\python\lib
-set PYTHONPATH=%PYTHONPATH%;%HELIUM_HOME%\extensions\nokia\external\python\lib\2.5
+
+for /f "tokens=2" %%a in ('"python -V 2>&1"') do (set pythonversion=%%a)
+for /f "tokens=1-2 delims=." %%a in ("%pythonversion%") do (set pythonversion=%%a.%%b)
+
+set PYTHONPATH=%PYTHONPATH%;%HELIUM_HOME%\external\python\lib\%pythonversion%;%HELIUM_HOME%\external\python\lib\common;%HELIUM_HOME%\tools\common\python\lib;%HELIUM_HOME%\tools\common\python\scripts
+set PYTHONPATH=%PYTHONPATH%;%HELIUM_HOME%\extensions\nokia\external\python\lib\%pythonversion%
 set PYTHONPATH=%PYTHONPATH%;%HELIUM_HOME%\extensions\nokia\tools\common\python\lib;%SBS_HOME%\python
 set PERL5LIB=%HELIUM_HOME%\tools\common\packages
 set COPYCMD=/y
@@ -107,10 +107,6 @@
 set ARMROOT=\
 
 
-REM Setting the Visual Studio environment
-REM if not exist "%HELIUM_HOME%\tools\common\bin\call_vcvars32.bat" ( echo *** "%HELIUM_HOME%\tools\common\bin\call_vcvars32.bat" cannot be found & goto :errorstop )
-REM call "%HELIUM_HOME%\tools\common\bin\call_vcvars32.bat" > nul
-
 REM Manage RVCT switching.
 if defined HLM_RVCT_VERSION (
 if not exist "C:\APPS\rvct%HLM_RVCT_VERSION%\rvctcmdprompt.bat" ( echo *** "C:\APPS\rvct%HLM_RVCT_VERSION%\rvctcmdprompt.bat" cannot be found & goto :errorstop )
@@ -122,7 +118,10 @@
 
 REM Call the Helium generated batch file if it exists
 REM This must match with the cache.dir property in helium.ant.xml
-set HELIUM_CACHE_DIR=%TEMP%\helium\%USERNAME%
+if defined JOB_ID  (
+	set HELIUM_CACHE_DIR=%TEMP%\helium\%USERNAME%\%JOB_ID%
+)ELSE set HELIUM_CACHE_DIR=%TEMP%\helium\%USERNAME%
+
 if not exist %HELIUM_CACHE_DIR% (
 md %HELIUM_CACHE_DIR%
 )
@@ -132,9 +131,9 @@
 	set ANT_OPTS=%ANT_OPTS% -Dlog4j.cache.dir=%HELIUM_CACHE_DIR% -Dpython.path=%PYTHONPATH%;%HELIUM_HOME%\external\python\lib\2.5\jython-2.5-py2.5.egg
 )
 
-call "%HELIUM_HOME%\precompile_py.bat"
+call "%HELIUM_HOME%\precompile_py.bat" > %HELIUM_CACHE_DIR%\precompile_output.txt 
 
-call ant -Dhelium.dir="%HELIUM_HOME%" %*
+call ant -Dhelium.dir="%HELIUM_HOME%" -Dcache.dir="%HELIUM_CACHE_DIR%" %*
 
 endlocal
 goto :eof
--- a/buildframework/helium/hlm.sh	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-#!/bin/csh
-
-#
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-# All rights reserved.
-# This component and the accompanying materials are made available
-# under the terms of the License "Eclipse Public License v1.0"
-# which accompanies this distribution, and is available
-# at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-# Initial Contributors:
-# Nokia Corporation - initial contribution.
-#
-# Contributors:
-#
-# Description: 
-#
-
-if (`alias module` != "") then
-    module load "java/1.6.0"
-    module load "tww/ant/1.7.1"
-    module load "tww/python/2.5.2"
-    module load "tww/p7zip/4.58"
-    module load "rvct/2.2_616"
-    module load "tww/graphviz/2.12"
-    module load mercurial
-endif
-
-setenv LANG en_US.UTF-8
-
-if (! $?HELIUM_HOME ) then
-    setenv HELIUM_HOME `pwd`
-endif
-
-setenv JEP_HOME $HELIUM_HOME/external/jep_1.6_2.5
-
-
-setenv ANT_ARGS "-lib $HELIUM_HOME/extensions/nokia/external/antlibs -lib $HELIUM_HOME/extensions/nokia/external/helium-nokia-antlib/bin -lib $HELIUM_HOME/external/helium-antlib/bin -lib $HELIUM_HOME/external/antlibs -lib $HELIUM_HOME/tools/common/java/lib -lib $JEP_HOME -logger com.nokia.ant.HeliumLogger -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor -listener com.nokia.helium.diamonds.ant.HeliumListener"
-
-setenv LD_LIBRARY_PATH $JEP_HOME
-if (-e /nokia/apps/tww/@sys/python252/lib/python2.5/config/libpython2.5.so) then
-    setenv LD_PRELOAD /nokia/apps/tww/@sys/python252/lib/python2.5/config/libpython2.5.so
-else
-    setenv LD_PRELOAD /usr/lib/libpython2.5.so.1
-endif
-
-setenv PYTHONPATH $HELIUM_HOME/external/python/lib/2.5/linux:$HELIUM_HOME/tools/common/python/lib:$HELIUM_HOME/extensions/nokia/external/python/lib/2.5:$HELIUM_HOME/extensions/nokia/tools/common/python/lib
-setenv JYTHONPATH "$HELIUM_HOME/external/python/lib/2.5/jython-2.5-py2.5.egg:$HELIUM_HOME/external/python/lib/2.5:$PYTHONPATH"
-setenv PERL5LIB $HELIUM_HOME/tools/common/packages
-
-setenv USERNAME $USER
-setenv TEMP /tmp/$USER
-if ($?HOST) then
-    setenv COMPUTERNAME $HOST
-else
-    setenv COMPUTERNAME `hostname`
-endif
-
-if (! $?EPOCROOT) then
-    setenv EPOCROOT /
-endif
-
-setenv SYMSEE_VERSION not_in_use
-setenv PID $$
-setenv HELIUM_CACHE_DIR $TEMP/helium/$USER
-setenv ANT_OPTS "-Dlog4j.configuration=com/nokia/log4j.xml -Dlog4j.cache.dir=$HELIUM_CACHE_DIR"
-ant -Dpython.cachedir=$HELIUM_HOME/temp -Dhelium.dir=$HELIUM_HOME -Dpython.path=$PYTHONPATH $* 
--- a/buildframework/helium/precompile_py.bat	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/precompile_py.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -17,7 +17,6 @@
 rem
 
 setlocal
-
-python %HELIUM_HOME%\tools\common\python\lib\precompile.py --modulepath %HELIUM_HOME%\tools\common\python\lib
-
+@echo precompiling the archiving module to generate the .pyc files for running in parallel
+python %HELIUM_HOME%\tools\common\python\lib\createZipInput.py
 endlocal
\ No newline at end of file
--- a/buildframework/helium/pt.bat	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/pt.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -19,7 +19,7 @@
 setlocal
 
 set HELIUM_HOME=.
-set PYTHONPATH=%HELIUM_HOME%\external\python\lib\2.5;%HELIUM_HOME%\tools\common\python\lib;%HELIUM_HOME%\tools\dp\iCreatorDP;c:\apps\sbs\python
+set PYTHONPATH=%HELIUM_HOME%\external\python\lib\2.5;%HELIUM_HOME%\tools\common\python\lib;%HELIUM_HOME%\tools\dp\iCreatorDP;c:\apps\sbs\python;%HELIUM_HOME%\extensions\nokia\external\python\lib\2.5;
 
 python external\python\bin\nosetests-script.py -v %*
 
--- a/buildframework/helium/tests/data/archive_test_input.cfg.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tests/data/archive_test_input.cfg.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -6,7 +6,7 @@
         <set name="max.files.per.archive" value="65000"/>
         <set name="archive.tool" value="7za"/>
         <set name="archives.dir" value="${env.TEMP}"/>
-        <set name="temp.build.dir" value="${temp.build.dir}"/>
+        <set name="temp.build.dir" value="${env.TEMP}"/>
         <set name="name" value="python_libs"/>
         <set name="include" value="lib\*.egg"/>
     </config>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/example_corernd.iconfig.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<build>
+    <config type="core">
+        <set name="CORE_NAME" value="RX-60_00_rnd"/>
+        <set name="ROFS2_NAME" value="RX-60_00.01_rnd"/>
+        <set name="ROFS3_NAME" value="RX-60_00_rnd"/>
+        <set name="LANGPACK_ID" value="01"/>
+        <set name="CUSTVARIANT_ID" value=""/>
+        <set name="PRODUCT_NAME" value="phone"/>
+        <set name="PRODUCT_TYPE" value="RX-60"/>
+        <set name="TYPE" value="rnd"/>
+        <set name="CORE_VERSION" value="V DFS79.92.0.0.1 RND"/>
+        <set name="LANGPACK_VERSION" value=""/>
+        <set name="ROFS3_VERSION" value="V DFS79.92.0.0.1 RND"/>
+        <set name="CORE_DIR" value="W:/output/release_flash_images/phone/rnd/core/RX-60_00_rnd"/>
+        <set name="ROFS2_DIR" value="W:/output/release_flash_images/phone/rnd/langpack/langpack_01/rofs2"/>
+        <set name="ROFS3_DIR" value="W:/output/release_flash_images/phone/rnd/customer/vanilla/rofs3"/>
+    </config>
+</build>
\ No newline at end of file
--- a/buildframework/helium/tests/data/flash_config/rom_image_config_test.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tests/data/flash_config/rom_image_config_test.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <build>
-    <spec name="mc" abstract="true">
+    <config name="mc" abstract="true">
         <set name="target.dir" value="${release.images.dir}"/>
         <set name="today" value="$(TODAY)"/>
         
@@ -48,7 +48,7 @@
         <set name="eraseuda.makefile.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\eraseuda.mk"/>
         <set name="flash.config.template" value="${build.drive}\mc\mc_config\mc_5132_config\rombuild\template.config.xml"/>
         
-        <spec name="product" abstract="true">
+        <config name="product" abstract="true">
             <set name="config.name" value="product"/>
             <set name="rommake.hwid" value="2048"/>
             <set name="version.product.type" value="RM-235"/>
@@ -56,62 +56,62 @@
             <set name="rommake.product.type" value="RM-235"/>
             
             <!-- Language pack and Variant -->
-            <spec name="variants" abstract="true">
+            <config name="variants" abstract="true">
                 <set name="target.dir" value="${release.images.dir}"/>
                 <set name="build.parallel" value="false"/>
                 <!-- core -->
-                <spec type="core">
+                <config type="core">
                     <set name="core.id" value="00"/>
                     <set name="image.type" value="rnd,prd"/>
-                </spec>
+                </config>
                 
                 <!-- western group -->
-                <spec name="western" abstract="true">
+                <config name="western" abstract="true">
                     <set name="build.parallel" value="true"/>
-                    <spec type="languagepack">
+                    <config type="languagepack">
                         <set name="languagepack.id" value="01"/>
                         <set name="default" value="01"/>
                         <set name="languages" value="01,02,03,05,04,13"/>
                         <set name="description" value="EURO1"/>
                         <set name="variation" value="western"/>
                         <set name="revision" value="0"/>
-                    </spec>
-                    <spec type="languagepack">
+                    </config>
+                    <config type="languagepack">
                         <set name="languagepack.id" value="02"/>
                         <set name="default" value="01"/>
                         <set name="languages" value="01,02,03,14,05,18"/>
                         <set name="description" value="EURO2"/>
-                    </spec>
-                    <spec type="languagepack">
+                    </config>
+                    <config type="languagepack">
                         <set name="languagepack.id" value="23"/>
                         <set name="default" value="01"/>
                         <set name="languages" value="01,02,18,03,05"/>
                         <set name="description" value="AFRICA2"/>
-                    </spec>
-                </spec>
+                    </config>
+                </config>
                 
-                <spec name="customer_roms" abstract="true">
+                <config name="customer_roms" abstract="true">
                     <set name="build.parallel" value="true"/>
-                    <spec type="customer">
+                    <config type="customer">
                         <set name="customer.id" value="01"/>
                         <set name="description" value="vanilla_customer_variant"/>
                         <set name="compatible.languagepack" value="01,02,03"/>
-                    </spec>
-                </spec>
-            </spec>
+                    </config>
+                </config>
+            </config>
             
             <!-- china group -->
-            <spec name="china" abstract="true">
+            <config name="china" abstract="true">
                 <set name="build.parallel" value="true"/>
                 <set name="variation" value="china"/>
-                <spec type="languagepack">
+                <config type="languagepack">
                     <set name="languagepack.id" value="11"/>
                     <set name="default" value="29"/>
                     <set name="languages" value="29,157"/>
                     <set name="description" value="TAIWAN"/>
-                </spec>
-            </spec>
+                </config>
+            </config>
             
-        </spec>
-    </spec>
+        </config>
+    </config>
 </build>
\ No newline at end of file
--- a/buildframework/helium/tests/data/logs/test_log.log	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tests/data/logs/test_log.log	Wed Dec 23 19:29:07 2009 +0200
@@ -4,5 +4,20 @@
 
 WARNING: This is a warning.
 
+
+copy "\conf\test1.confml" "\epoc32\rom\config\assets\s60\confml\test1.confml"
+copy "\conf\test2.confml" "\epoc32\rom\config\assets\s60\confml\test2.confml"
+copy "\conf\test3.confml" "\epoc32\rom\config\assets\s60\confml\test3.confml"
+copy "\conf\test4.confml" "\epoc32\rom\config\assets\s60\confml\test4.confml"
+\epoc32\rom\config\assets\s60\confml\test1.confml
+\epoc32\rom\config\assets\s60\confml\test2.confml
+\epoc32\rom\config\assets\s60\confml\test3.confml
+\epoc32\rom\config\assets\s60\confml\test4.confml
+
 More text...
 
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/packageiad/layers.sysdef.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!DOCTYPE SystemDefinition SYSTEM "sysdef_1_4_0.dtd" [
+  <!ENTITY layer_real_source_path "sf/app/camera" >
+]>
+
+<SystemDefinition name="camera" schema="1.4.0">
+  <systemModel>
+    <layer name="app_layer">
+      <module name="camera">
+        <unit unitID="imm.camera" mrp="" bldFile="&layer_real_source_path;/group" name="camera" />
+        <unit unitID="imm.camera.help" mrp="" bldFile="&layer_real_source_path;/camerauis/cameraapp/help/group" name="camera_help" />
+      </module>
+    </layer>
+    
+    <configuration name="developer_mc_403">
+        <layerRef layerName="api_test_layer">
+            <layer name="api_test_layer">
+              <module name="camera_api_tests">
+              	<unit unitID="imm.camera.camcorder_ui_constants_api" mrp="" bldFile="sf/app/camera/camera_plat/camcorder_ui_constants_api/tsrc/group"  name="camcorder_ui_constants_api"  />
+              </module>
+              <module name="active_palette_2_api_tests">
+              	<unit unitID="imm.camera.active_palette_2_api" mrp="" bldFile="sf/app/camera/camera_plat/active_palette_2_api/tsrc/group"  name="active_palette_2_api"  />
+              </module>
+            </layer>
+        </layerRef>
+    </configuration>
+        
+    <layer name="unit_test_layer">
+      <module name="camera_unit_tests">
+      </module>
+    </layer>
+        
+  </systemModel>
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/packageiad/sis/testPackage/depends.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<SystemDefinition name="sysdef_dtd_1_4_0_xml + domain_build + s60 + domain_build + PoC + camera + commonemail + contacts + contentcontrol + conversations + systemswextensions + devicecontrol + editors + extrapimui + filemanageruis + gallery + graphicsuis + homescreen + imgviewer + imppapplications + iptelephony + location + messaging + avdomain + multimediasharing + avdomain + organizer + photos + printingapps + profile + avdomain + security + telephony + videocenter + videotelephony + avdomain + webui + VpnClient + eas + redbend + tfxserver + webvideo + wmdrmkeystorage_dist + wmdrmpd_dist + appexts + camerasrv + classicui + compaccutils + contactservices + contentmanagement + conversationservices + devicecontentservices + devicemanagement + drm + eapol + editorengines + flashapi + graphics + imagehandling + imppservices + inputmethods + ipappservices + java + localconnectivity + locationservices + mds + mediamanagement + avdomain + avdomain + avdomain + mmuifw + avdomain + ncdengines + networking + openfw + openservices + organizerservices + presenceservices + remotestorage + searchengines + securityservices + serviceapi + systemswservices + telephonyservices + uiaccelerator + uiresources + uishellservices + upnpapplications + upnpservices + videoutils + voiceservices + web + webservices + xmlsrv + xmlui + graphicsadaptations + imagingextensions + localconnectivityextensions + locationextensions + messagingextensions + avdomainosext + mobileruntime + networkingextensions + systemswextensions + telephonyextensions + wlan + locationrefapp + avdomain + rtctest + analysistools + commontools + locationtools + nettools + performancetools + platformtools + systemswtools + toolsextensions + uitools + wlan_tools + ezynotes + tubefmradio + multimodal_interaction_sw.fmtx + multimodal_interaction_sw.hqtts + multimodal_interaction_sw.mobiledictionary + multimodal_interaction_sw.srsfengine + multimodal_interaction_sw.srsflanguagecomponents + multimodal_interaction_sw.voicesearch + analyzetool + bappeaprofiler + btproxy_rnd + ctc + eunit + hti + mc_rnd + nep + prism_rnd + traceswitch + trk_rnd + avdomain + avdomain + dictionary + j2mecerts + netdo_config + ocrsrv + phoneswitch + ptiezitypecore + ME_Music_VC + Me2ePlatform + OviIMPS + ShareOnline + TopContactsWidget + Juniper + Maps + ncdui + pec_sdk + iconsd + avdomain + Licensee_Tsy_Stub + PtiT9Core_stub + SIMATK_TSY_Stub + iaupdateapi_stub + posmsgpluginreferenceimpl + power_save_display_mode_stub + systemswstubs + wlanhwinit_stub" schema="1.4.0"><systemModel>
+
+    <layer name="s60_osext_layer">
+    
+    <module name="networkingextensions">
+        <unit unitID="netdo.networkingextensions" mrp="" bldFile="s60/osext/networkingextensions/group" name="networkingextensions"/>
+    </module>
+
+  
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/packageiad/sis/testPackage/sisinfo.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<SystemDefinition name="sysdef_dtd_1_4_0_xml + domain_build + s60 + domain_build + PoC + camera + commonemail + contacts + contentcontrol + conversations + systemswextensions + devicecontrol + editors + extrapimui + filemanageruis + gallery + graphicsuis + homescreen + imgviewer + imppapplications + iptelephony + location + messaging + avdomain + multimediasharing + avdomain + organizer + photos + printingapps + profile + avdomain + security + telephony + videocenter + videotelephony + avdomain + webui + VpnClient + eas + redbend + tfxserver + webvideo + wmdrmkeystorage_dist + wmdrmpd_dist + appexts + camerasrv + classicui + compaccutils + contactservices + contentmanagement + conversationservices + devicecontentservices + devicemanagement + drm + eapol + editorengines + flashapi + graphics + imagehandling + imppservices + inputmethods + ipappservices + java + localconnectivity + locationservices + mds + mediamanagement + avdomain + avdomain + avdomain + mmuifw + avdomain + ncdengines + networking + openfw + openservices + organizerservices + presenceservices + remotestorage + searchengines + securityservices + serviceapi + systemswservices + telephonyservices + uiaccelerator + uiresources + uishellservices + upnpapplications + upnpservices + videoutils + voiceservices + web + webservices + xmlsrv + xmlui + graphicsadaptations + imagingextensions + localconnectivityextensions + locationextensions + messagingextensions + avdomainosext + mobileruntime + networkingextensions + systemswextensions + telephonyextensions + wlan + locationrefapp + avdomain + rtctest + analysistools + commontools + locationtools + nettools + performancetools + platformtools + systemswtools + toolsextensions + uitools + wlan_tools + ezynotes + tubefmradio + multimodal_interaction_sw.fmtx + multimodal_interaction_sw.hqtts + multimodal_interaction_sw.mobiledictionary + multimodal_interaction_sw.srsfengine + multimodal_interaction_sw.srsflanguagecomponents + multimodal_interaction_sw.voicesearch + analyzetool + bappeaprofiler + btproxy_rnd + ctc + eunit + hti + mc_rnd + nep + prism_rnd + traceswitch + trk_rnd + avdomain + avdomain + dictionary + j2mecerts + netdo_config + ocrsrv + phoneswitch + ptiezitypecore + ME_Music_VC + Me2ePlatform + OviIMPS + ShareOnline + TopContactsWidget + Juniper + Maps + ncdui + pec_sdk + iconsd + avdomain + Licensee_Tsy_Stub + PtiT9Core_stub + SIMATK_TSY_Stub + iaupdateapi_stub + posmsgpluginreferenceimpl + power_save_display_mode_stub + systemswstubs + wlanhwinit_stub" schema="1.4.0"><systemModel>
+
+    <layer name="s60_osext_layer">
+    
+    <module name="networkingextensions">
+        <unit unitID="netdo.networkingextensions" mrp="" bldFile="s60/osext/networkingextensions/group" name="networkingextensions"/>
+    </module>
+
+  
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/packageiad/sis/testPackage/testPackage.sis	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+    <layer name="s60_osext_layer">
+    
+    <module name="networkingextensions">
+        <unit unitID="netdo.networkingextensions" mrp="" bldFile="s60/osext/networkingextensions/group" name="networkingextensions"/>
+    </module>
--- a/buildframework/helium/tests/data/scanlog/all_regex_type.log	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tests/data/scanlog/all_regex_type.log	Wed Dec 23 19:29:07 2009 +0200
@@ -1,17 +1,16 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<buildlog sbs_version="2.5.3 [2009-03-12 release]" xmlns="http://symbian.com/xml/build/log" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build/log http://symbian.com/xml/build/log/1_0.xsd">
-<info>sbs: version 2.5.3 [2009-03-12 release]
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<buildlog sbs_version="2.5.3 [2009-03-12 release]" xmlns="http://symbian.com/xml/build/log" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build/log http://symbian.com/xml/build/log/1_0.xsd">
+<info>sbs: version 2.5.3 [2009-03-12 release]
 </info>
-<info>SBS_HOME E:/Build_E/ido-config-df/sbs</info>
-<info>Set-up E:/Build_E/ido-config-df/sbs/sbs_init.xml</info>
-<warning>E:/build_e/sbs_2.8.4/sbs/win32/mingw/bin/cpp.exe: x:/sf/mw/accesssec/eapol/eapol_framework/eapol_symbian/group/eapol.mmp:36:2: warning: #warning For R&D info: Protected Setup & Expanded EAP defined, EAPOLPROTECTED.DEF will be used.</warning>
-<info>Command-line-arguments -s z:\output/build/canonical_system_definition_build.xml -k -c armv5 -j 4 -m z:\output\logs/ido_imm_mcl_devlon70_robot_5.1.005__armv5_multiple_thread_build_Makefile --filters=FilterHeliumLog -f z:\output\logs/ido_imm_mcl_devlon70_robot_5.1.005__armv5_multiple_thread_build_compile.log</info>
-<recipe name='resourcedependencies' target='z:/epoc32/build/camera/c_87f62b1af2e7d874/gscameraplugin_dll/gscameraplugin_resource_plugins_27.rpp.d' host='fawec012' layer='app_layer' component='' bldinf='z:/sf/app/camera/group/bld.inf' mmp='z:/sf/app/camera/camerauis/cameraapp/generic/GsCamcorderPlugin/group/gscameraplugin.mmp' config='armv5_udeb' platform='' phase='RESOURCE_DEPS' source=''>
-<![CDATA[
-mingw_make.exe: error
-test FATAL ERROR(S):abcd
-): Missing file:
-abcd FLEXlm error:
+<info>SBS_HOME E:/Build_E/ido-config-df/sbs</info>
+<info>Set-up E:/Build_E/ido-config-df/sbs/sbs_init.xml</info>
+<info>Command-line-arguments -s z:\output/build/canonical_system_definition_build.xml -k -c armv5 -j 4 -m z:\output\logs/ido_imm_mcl_devlon70_robot_5.1.005__armv5_multiple_thread_build_Makefile --filters=FilterHeliumLog -f z:\output\logs/ido_imm_mcl_devlon70_robot_5.1.005__armv5_multiple_thread_build_compile.log</info>
+<recipe name='resourcedependencies' target='z:/epoc32/build/camera/c_87f62b1af2e7d874/gscameraplugin_dll/gscameraplugin_resource_plugins_27.rpp.d' host='fawec012' layer='app_layer' component='' bldinf='z:/sf/app/camera/group/bld.inf' mmp='z:/sf/app/camera/camerauis/cameraapp/generic/GsCamcorderPlugin/group/gscameraplugin.mmp' config='armv5_udeb' platform='' phase='RESOURCE_DEPS' source=''>
+<![CDATA[
+mingw_make.exe: error
+test FATAL ERROR(S):abcd
+): Missing file:
+abcd FLEXlm error:
 ABLD ERROR: 1234
 BLDMAKE ERROR: 43543
 test FATAL ERROR 
--- a/buildframework/helium/tests/minibuilds/ats/build.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tests/minibuilds/ats/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -26,12 +26,15 @@
 
     <!-- Enable Helium internal assertion checking. -->
     <property name="hlm.enable.asserts" value="1" />
-        
+    <property name="build.family" value="test" />
     <property name="build.name" value="minibuild_ats" />
     <property name="major.version" value="0" />
     <property name="minor.version" value="0" />
     <property name="build.drive" value="z:" />
-    
+    <property name="build.id" value="${build.name}_${build.version}"/>
+    <property name="diamonds.host" value="diamonds.nmp.nokia.com"/>
+    <property name="diamonds.port" value="8080"/>
+    <property name="diamonds.path" value="/diamonds/builds/"/>
     
     <property name="enabled.ats" value="1" />
 
@@ -48,6 +51,7 @@
 		<property name="ats.test.timeout" value="60" />
 		<property name="tsrc.data.dir" value="data_rom" />
 		<property name="ats.ctc.enabled" value="True" />
+		<property name="ats.ctc.host" value="10.11.3.2" />
 		<property name="ats.flashfiles.minlimit" value="2" />
 		
 		<property name="ta.flag.list" value="TA_M, TA_MU, TA_MMAPPFW,TA_MM"/>
@@ -71,7 +75,13 @@
     <!-- Synergy is not configured -->
     <property name="skip.password.validation" value="1"/>
     
-    
+<echo>
+DIAMONDS URL: ${diamonds.build.url}
+DIAMONDS HOST: ${diamonds.host}
+DIAMONDS BID: ${diamonds.build.id}
+
+DIAMONDS ATS TEST PAGE: http://${diamonds.host}${diamonds.build.id}#tab=4
+</echo>
     <import file="${helium.dir}/helium.ant.xml"/>
     
     <!-- Run the full sequence of target for the minibuild. ,mini-build-prep,compile-main,zip-ee,mini-build-check-->
--- a/buildframework/helium/tests/minibuilds/ats/helium_minibuild_ats.sysdef.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tests/minibuilds/ats/helium_minibuild_ats.sysdef.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -25,9 +25,17 @@
 	<systemModel>
 	 	<layer name="ats_test_layer">
 			<module name="mod_tsrc_test">
-				<unit unitID="sortutil_api" name="sortutilapi" bldFile="\s60\test_nested\tsrc\group" mrp="" />
+				
+			<!--STIF-->	 <unit unitID="phonebookengines" name="sortutilapi" bldFile="\sf\app\contacts\phonebookengines\VirtualPhonebook\tsrc\T_VPbkCntModel_CContact\group" mrp="" />
+			<!--EUNIT--> <!--unit unitID="mmccsubcontroller" name="sortutilapi" bldFile="\sf\mw\ipappsrv\multimediacommscontroller\mmccsubcontroller\tsrc\ut_rtpmediaclock\group" mrp="" /-->
+				
 			</module>
 	 	</layer>
+	 	<!--<layer name="qt_unit_test_layer">
+			<module name="mod_qt_test">
+				<unit unitID="qttestee" name="qttestee" bldFile="\s60\qt\unit" filter="" mrp=""/>
+			</module>
+	 	</layer> -->
 	</systemModel>
     <build>
         <option name="KEEPGOING" abldOption="-keepgoing" description="Causes make to keepgoing on errors" enable="Y"/>
--- a/buildframework/helium/tests/minibuilds/compile/archive.cfg.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tests/minibuilds/compile/archive.cfg.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -29,6 +29,8 @@
         <set name="temp.build.dir" value="${temp.build.dir}"/>
         
 
+        <config name="empty_minibuild_archive" abstract="true" />
+        
         <config name="minibuild_archive" abstract="true">
         	<set name="grace.service" value="minibuild"/>
         	<set name="grace.product" value="SF"/>
@@ -71,7 +73,6 @@
                 <set name="policy.csv" value="${config.dir}/distribution.policy.extended_for_sf.id_status.csv"/>
             </config>
     	</config>
-
 	</config>
 </build>
   
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/compile/build.sbsinput.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="ido_sbs_input" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        ido sbs input
+    </description>
+
+    <import file="common.sbsinput.ant.xml" />
+    <patternset id="helium_minibuild_compile_layers" >
+        <include name="clock_layer" />
+    </patternset>
+
+    <hlm:sbsinput id="helium_minibuild_compile_input_tools">
+        <sbsInput refid="tools-${build.system}" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_tools_helium_minibuild_compile.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_helium_minibuild_compile" />
+        </sbsOptions>
+    </hlm:sbsinput>
+        
+    <hlm:sbsinput id="helium_minibuild_compile_input_armv5">
+        <sbsInput refid="armv5-${build.system}" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_armv5_helium_minibuild_compile.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_armv5_helium_minibuild_compile" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="helium_minibuild_compile_input">
+        <sbsInput refid="helium_minibuild_compile_input_tools" />
+        <sbsInput refid="helium_minibuild_compile_input_armv5" />
+    </hlm:sbsinput>
+    
+    <hlm:sbsbuild id="helium_minibuild_compile">
+        <sbsInput refid="helium_minibuild_compile_input" />
+    </hlm:sbsbuild> 
+    
+</project>
\ No newline at end of file
--- a/buildframework/helium/tests/minibuilds/compile/build.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tests/minibuilds/compile/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -50,7 +50,8 @@
 
 	<!-- Archiving configuration-->
 	<property name="zip.config.file" location="archive.cfg.xml" />
-	<property name="zips.ee.spec.name" value="minibuild_archive" />
+    <property name="zips.ee.spec.name" value="minibuild_archive" />
+    <property name="zips.ee-empty.spec.name" value="empty_minibuild_archive" />
 
 	<!-- Synergy is not configured -->
 	<property name="skip.password.validation" value="1" />
@@ -97,7 +98,7 @@
 	
     <!-- Test ec history option is create for single node build and merge is for multinode build. -->
     <target name="test-ec-history-option" if="build.system.ec-helium">
-        <loadfile srcfile="${build.log.dir}/${build.id}.${sysdef.configurations.list}_run_emake.bat" property="emake.bat.file"/>
+        <loadfile srcfile="${temp.build.dir}/${build.id}.${sysdef.configurations.list}_run_emake.bat" property="emake.bat.file"/>
         <if>
             <equals arg1="${ec.maxagents}" arg2="1" />
             <then>
@@ -232,7 +233,7 @@
 	</target>
 
 
-	<target name="mini-build-archive" depends="mini-build-archive-ant,mini-build-archive-ec-full" />
+	<target name="mini-build-archive" depends="mini-build-archive-ant,mini-build-archive-ec-full,mini-build-archive-ant-empty-config" />
 
 	<!-- This target will copy a part of the tree structure to test policy.remover mapper. -->
 	<target name="prepare-archiving">
@@ -265,6 +266,14 @@
 			<param name="zipping.type" value="ant" />
 			<!-- Uses to set the target location -->
 		</antcall>
+	    
+    </target>
+ 
+    <target name="mini-build-archive-ant-empty-config">
+        <hlm:zipContentMacro type="ee-empty" ec="false" file="${zip.config.file}" failonemptyconfig="false" />
+        <au:expectfailure>
+            <hlm:zipContentMacro type="ee-empty" ec="false" file="${zip.config.file}" failonemptyconfig="true" />
+        </au:expectfailure>
 	</target>
 
 	<target name="do-mini-build-archive">
@@ -288,7 +297,7 @@
 
 
 	<target name="mini-build-cleanup">
-		<delete verbose="true" includeemptydirs="true">		 
+		<delete verbose="true" includeemptydirs="true" failonerror="false">		 
 			<fileset dir="${build.drive}/" casesensitive="false">
 				<include name="makefile" />
 				<include name="*.mk" />
@@ -342,7 +351,7 @@
 			<isset property="build.system.ec-helium" />
 			<then>
 				<au:assertFileExists file="${build.drive}/emake.data" />
-				<au:assertFileExists file="${build.log.dir}/${build.id}.helium_minibuild_compile_run_emake.bat" />
+				<au:assertFileExists file="${temp.build.dir}/${build.id}.helium_minibuild_compile_run_emake.bat" />
 			</then>
 		</if>
 
@@ -367,7 +376,7 @@
 				<include name="fota" />
 			</targetset>
 		</imakerconfiguration>
-		<imakerconfiguration regionalVariation="true">
+		<imakerconfiguration>
 			<makefileset>
 			    <include name="**/${product.name}/*ui.mk"/>
 			</makefileset>
@@ -388,5 +397,6 @@
 		<include name="s60/app/**/*.mmp" />
 	</fileset>
 
+    <import file="build.sbsinput.ant.xml" />
 </project>
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/compile/common.sbsinput.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,185 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="common_sbs_input" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Common sbs input config.
+    </description>
+    <!-- Common make options for particular engine values of it could be overridden by referencing it-->
+    <hlm:sbsmakeoptions id="commonEMakeOptions" engine="emake">
+        <arg name="--emake-emulation" value="gmake" />
+        <arg name="--emake-annodetail" value="basic,history,waiting" />
+        <arg name="--emake-class" value="${ec.build.class}" />
+        <arg name="--emake-historyfile" value="${build.log.dir}/ec_history/raptor_clean.emake.data" />
+        <arg name="--case-sensitive" value="0" />
+        <arg name="--emake-root" value="${env.EMAKE_ROOT};${helium.dir};${env.SBS_HOME}" />
+    </hlm:sbsmakeoptions>
+
+    <hlm:sbsmakeoptions id="commonGmakeOptions" engine="gmake" />
+    <hlm:sbsmakeoptions id="commonPVMGmakeOptions" engine="pvmgmake" />
+
+    <!-- Tools specific make options inheriting the commone make option-->
+    <hlm:sbsmakeoptions id="toolsmake-sbs-ec">
+        <sbsmakeoptions refid="commonEMakeOptions" />
+        <arg name="--emake-maxagents" value="1" />
+    </hlm:sbsmakeoptions>
+            
+    <!-- Main build make option directly refering to common emake option -->
+    <hlm:sbsmakeoptions id="mainbuildmake-sbs-ec">
+        <sbsmakeoptions refid="commonEMakeOptions" />
+    </hlm:sbsmakeoptions>
+
+    <!-- tools common sbs options -->
+    <hlm:sbsoptions id="commonSBS">
+        <arg line="-k" />
+        <arg name="--filters" value="FilterMetadataLog"/>
+    </hlm:sbsoptions>
+
+    <!-- tools common sbs options -->
+    <hlm:sbsoptions id="toolsCommonSBS">
+        <argset refid="commonSBS" />
+        <arg line="-c tools_rel -c tools2_rel" />
+        <arg line="-j 1" />
+    </hlm:sbsoptions>
+
+    <hlm:sbsoptions id="winscwSBSOptions">
+        <argset refid="commonSBS" />
+        <arg line="-c winscw" />
+    </hlm:sbsoptions>
+
+    <!-- Mainbuild common sbs options -->
+    <hlm:sbsoptions id="armv5CommonSBS">
+            <argset refid="commonSBS" />
+            <arg line="-c armv5" />
+    </hlm:sbsoptions>
+
+    <hlm:sbsoptions id="testCommonSBS">
+            <argset refid="commonSBS" />
+            <arg line="-c armv5.test" />
+    </hlm:sbsoptions>
+
+
+    <hlm:sbsoptions id="testCleanSBS">
+        <argset refid="testcommonSBS" />
+        <argset refid="cleanCommon" />
+    </hlm:sbsoptions>
+
+    <hlm:sbsoptions id="cleanCommon">
+            <arg line="REALLYCLEAN" />
+    </hlm:sbsoptions>
+
+    <!-- Mainbuild common sbs options -->
+    <hlm:sbsoptions id="armv5Clean">
+        <argset refid="armv5CommonSBS"/>
+        <argset refid="cleanCommon" />
+    </hlm:sbsoptions>
+
+
+    <!-- Mainbuild common sbs options -->
+    <hlm:sbsoptions id="toolsClean">
+        <argset refid="toolsCommonSBS"/>
+        <argset refid="cleanCommon" />
+    </hlm:sbsoptions>
+
+    <!-- Mainbuild common sbs options -->
+    <hlm:sbsoptions id="winscwClean">
+        <argset refid="winscwSBSOptions"/>
+        <argset refid="cleanCommon" />
+    </hlm:sbsoptions>
+
+    <!-- sbs input consists of sbs options and sbs make options, the sbs options remains same for all
+    the build system, the make options varies
+     -->
+    <hlm:sbsinput id="tools-sbs">
+        <sbsoptions refid="toolsCommonSBS" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="tools-sbs-clean">
+        <sbsoptions refid="toolsClean" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="tools-sbs-ec">
+        <sbsoptions refid="toolsCommonSBS" />
+        <sbsmakeoptions refid="toolsmake-sbs-ec" ppThreads="20"/>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="tools-sbs-ec-clean">
+        <sbsoptions refid="toolsClean" />
+        <sbsmakeoptions refid="toolsmake-sbs-ec" ppThreads="20"/>
+    </hlm:sbsinput>
+
+    <!-- sbs input for main build.
+     -->
+    <hlm:sbsinput id="armv5-sbs">
+        <sbsoptions refid="armv5CommonSBS" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="armv5-sbs-clean">
+        <sbsoptions refid="armv5Clean" />
+    </hlm:sbsinput>
+
+    <!-- sbs input for main build.
+     -->
+    <hlm:sbsinput id="armv5-sbs-ec">
+        <sbsoptions refid="armv5CommonSBS" />
+        <sbsmakeoptions refid="mainbuildmake-sbs-ec" ppThreads="20"/>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="armv5-sbs-ec-clean">
+        <sbsoptions refid="armv5Clean" />
+        <sbsmakeoptions refid="mainbuildmake-sbs-ec" ppThreads="20" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="winscw-sbs">
+        <sbsoptions refid="winscwSBSOptions" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="winscw-sbs-clean">
+        <sbsoptions refid="winscwClean" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="winscw-sbs-ec-clean">
+        <sbsoptions refid="winscwClean" />
+        <sbsmakeoptions refid="mainbuildmake-sbs-ec" ppThreads="20"/>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="test-sbs">
+        <sbsoptions refid="testCommonSBS" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="test-sbs-clean">
+        <sbsoptions refid="testCleanSBS" />
+    </hlm:sbsinput>
+
+    <!-- sbs input for main build.
+     -->
+    <hlm:sbsinput id="test-sbs-ec">
+        <sbsoptions refid="testCommonSBS" />
+        <sbsmakeoptions refid="mainbuildmake-sbs-ec" ppThreads="20"/>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="test-sbs-ec-clean">
+        <sbsoptions refid="testCleanSBS" />
+        <sbsmakeoptions refid="mainbuildmake-sbs-ec" ppThreads="20" />
+    </hlm:sbsinput>
+
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ido-sbs/build.sbsinput.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,292 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="ido_sbs_input" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        ido sbs input
+    </description>
+
+    <import file="common.sbsinput.ant.xml" />
+    <patternset id="build_layers" >
+        <include name="os_layer" />
+        <include name="bldfirst_mw_layer" />
+        <include name="bldfirst_app_layer" />
+        <include name="mw_layer" />
+        <include name="complementary_layer" />
+        <include name="app_layer" />
+        <include name="tools_layer" />
+        <include name="stubs_layer" />
+        <include name="addon_layer" />
+    </patternset>
+
+    <patternset id="dfs_build_layers" >
+        <include name="os_layer" />
+        <include name="bldfirst_mw_layer" />
+        <include name="bldfirst_app_layer" />
+        <include name="mw_layer" />
+        <include name="complementary_layer" />
+        <include name="app_layer" />
+        <include name="tools_layer" />
+        <include name="addon_layer" />
+    </patternset>
+
+    <patternset id="test_layers" >
+        <include name="api_test_layer" />
+        <include name="unit_test_layer" />
+        <include name="perf_test_layer" />
+        <include name="module_test_layer" />
+        <include name="qt_unit_test_layer" />
+    </patternset>
+
+
+    <hlm:sbsinput id="build_input_tools">
+        <sbsInput refid="tools-${build.system}" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_tools_rel_build.log" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="build_input_armv5">
+        <sbsInput refid="armv5-${build.system}" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_armv5_build.log" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="build_input">
+        <sbsInput refid="build_input_tools" />
+        <sbsInput refid="build_input_armv5" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="build_input_clean_tools">
+        <sbsInput refid="tools-${build.system}-clean" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_tools_rel_build_clean.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_rel_build_clean" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="build_input_clean_armv5">
+        <sbsInput refid="armv5-${build.system}-clean" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_armv5_build_clean.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_armv5_build_clean" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsbuild id="build_clean">
+        <sbsInput refid="build_input_clean_tools" />
+        <sbsInput refid="build_input_clean_armv5" />
+    </hlm:sbsbuild>
+
+    <hlm:sbsinput id="helium_minibuild_ido_input_tools">
+        <sbsInput refid="tools-${build.system}" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_tools_helium_minibuild_ido.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_helium_minibuild_ido" />
+        </sbsOptions>
+    </hlm:sbsinput>
+        
+    <hlm:sbsinput id="helium_minibuild_ido_input_armv5">
+        <sbsInput refid="armv5-${build.system}" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_armv5_helium_minibuild_ido.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_armv5_helium_minibuild_ido" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="helium_minibuild_ido_input">
+        <sbsInput refid="helium_minibuild_ido_input_tools" />
+        <sbsInput refid="helium_minibuild_ido_input_armv5" />
+    </hlm:sbsinput>
+    
+    <hlm:sbsbuild id="helium_minibuild_ido">
+        <sbsInput refid="helium_minibuild_ido_input" />
+    </hlm:sbsbuild> 
+
+    <hlm:sbsinput id="helium_minibuild_ido_input_clean">
+        <sbsInput refid="helium_minibuild_ido_clean_tools" />
+        <sbsInput refid="helium_minibuild_ido_clean_armv5" />
+    </hlm:sbsinput>
+    
+    <hlm:sbsinput id="helium_minibuild_ido_input_clean_tools">
+        <sbsInput refid="tools-${build.system}-clean"/>
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_tools_helium_minibuild_ido_clean.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_helium_minibuild_ido_clean" />
+        </sbsOptions>
+    </hlm:sbsinput>
+        
+    <hlm:sbsinput id="helium_minibuild_ido_input_clean_armv5">
+        <sbsInput refid="armv5-${build.system}-clean" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_armv5_helium_minibuild_ido_clean.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_armv5_helium_minibuild_ido_clean.log" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsbuild id="helium_minibuild_ido_clean">
+        <sbsInput refid="helium_minibuild_ido_input_clean_tools" />
+        <sbsInput refid="helium_minibuild_ido_input_clean_armv5" />
+    </hlm:sbsbuild> 
+
+    <hlm:sbsinput id="sf_build_input_tools">
+        <sbsInput refid="tools-${build.system}" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_tools_sf_build.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_sf_build" />
+        </sbsOptions>
+    </hlm:sbsinput> 
+
+    <hlm:sbsinput id="sf_build_input_armv5">
+        <sbsInput refid="armv5-${build.system}" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_armv5_sf_build.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_armv5_sf_build" />
+        </sbsOptions>
+    </hlm:sbsinput> 
+
+    <hlm:sbsinput id="sf_build_input">
+        <sbsInput refid="sf_build_input_tools" />
+        <sbsInput refid="sf_build_input_armv5" />
+    </hlm:sbsinput>
+    
+    <hlm:sbsbuild id="sf_build">
+        <sbsInput refid="sf_build_input" />
+    </hlm:sbsbuild>
+
+    <hlm:sbsinput id="sf_build_input_clean_tools">
+        <sbsInput refid="tools-${build.system}-clean" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_tools_sf_build_clean.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_sf_build_clean" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="sf_build_input_armv5">
+        <sbsInput refid="armv5-${build.system}-clean" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_armv5_sf_build_clean.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_armv5_sf_build_clean" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="sf_build_input_clean">
+        <sbsInput refid="sf_build_input_clean_tools" />
+        <sbsInput refid="sf_build_input_clean_armv5" />
+    </hlm:sbsinput>
+    
+    <hlm:sbsbuild id="sf_build_clean">
+        <sbsInput refid="sf_build_input_clean" />
+    </hlm:sbsbuild>
+
+    <hlm:sbsinput id="nonhw_input_clean_tools">
+        <sbsInput refid="tools-${build.system}-clean" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_tools_winscw_build_clean.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_winscw_build_clean" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="nonhw_input_clean_winscw">
+        <sbsInput refid="winscw-${build.system}-clean" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_winscw_winscw_build_clean.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_winscw_winscw_build_clean" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="nonhw_input_clean">
+        <sbsInput refid="nonhw_input_clean_tools" />
+        <sbsInput refid="nonhw_input_clean_winscw" />
+    </hlm:sbsinput>
+    
+    <hlm:sbsbuild id="nonhw_clean">
+        <sbsInput refid="nonhw_input_clean" />
+    </hlm:sbsbuild>
+
+    <hlm:sbsinput id="nonhw_input_tools">
+        <sbsInput refid="tools-${build.system}" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_tools_build.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_build" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="nonhw_input_winscw">
+        <sbsInput refid="winscw-${build.system}" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_winscw_build.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_winscw_build" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="test_input_tools">
+        <sbsInput refid="test-${build.system}" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_tools_test.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_test" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="test_input_armv5">
+        <sbsInput refid="test-${build.system}" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_armv5_test.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_armv5_test" />
+        </sbsOptions>
+    </hlm:sbsinput>
+    
+    <hlm:sbsinput id="test_input">
+        <sbsInput refid="test_input_tools" />
+        <sbsInput refid="test_input_armv5" />
+    </hlm:sbsinput>
+    
+    <hlm:sbsbuild id="test">
+        <sbsInput refid="test_input" />
+    </hlm:sbsbuild>
+
+    <hlm:sbsinput id="test_input_clean_tools">
+        <sbsInput refid="test-${build.system}" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_tools_test_clean.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_test_clean" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="test_input_clean_armv5">
+        <sbsInput refid="test-${build.system}" />
+        <sbsOptions>
+            <arg name="--logfile" value="${compile.log.dir}/${build.id}_armv5_test_clean.log" />
+            <arg name="--makefile" value="${compile.log.dir}/${build.id}_armv5_test_clean" />
+        </sbsOptions>
+    </hlm:sbsinput>
+    
+    <hlm:sbsinput id="test_input_clean">
+        <sbsInput refid="test_input_clean_tools" />
+        <sbsInput refid="test_input_clean_armv5" />
+    </hlm:sbsinput>
+    
+    <hlm:sbsbuild id="test_clean">
+        <sbsInput refid="test_input_clean" />
+    </hlm:sbsbuild>    
+</project>
\ No newline at end of file
--- a/buildframework/helium/tests/minibuilds/ido-sbs/build.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tests/minibuilds/ido-sbs/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -37,7 +37,7 @@
     <target name="mini-build-check">
     	<!-- Check if prep has set some prop correctly... -->
         <echo>'${arm.compiler.version}'</echo>
-        <au:assertMatches string="${arm.compiler.version}" pattern="RVCT2\.2 \[Build 616\]" casesensitive="false" multiline="true"/>
+        <au:assertMatches string="${arm.compiler.version}" pattern="RVCT2\.2 \[Build 686\]" casesensitive="false" multiline="true"/>
 
         <!-- Check if compile-main step did what expected... -->
         <au:assertFileExists file="${canonical.sysdef.file}"/>
@@ -50,8 +50,9 @@
         </if>
     </target>
 	
-	
+
 	<import file="../ido/build.xml"/>
+    <import file="build.sbsinput.ant.xml" />
 </project>
 
     
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ido-sbs/common.sbsinput.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,185 @@
+<?xml version="1.0"?>
+<!-- 
+============================================================================ 
+Name        : 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="common_sbs_input" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Common sbs input config.
+    </description>
+    <!-- Common make options for particular engine values of it could be overridden by referencing it-->
+    <hlm:sbsmakeoptions id="commonEMakeOptions" engine="emake">
+        <arg name="--emake-emulation" value="gmake" />
+        <arg name="--emake-annodetail" value="basic,history,waiting" />
+        <arg name="--emake-class" value="${ec.build.class}" />
+        <arg name="--emake-historyfile" value="${build.log.dir}/ec_history/raptor_clean.emake.data" />
+        <arg name="--case-sensitive" value="0" />
+        <arg name="--emake-root" value="${env.EMAKE_ROOT};${helium.dir};${env.SBS_HOME}" />
+    </hlm:sbsmakeoptions>
+
+    <hlm:sbsmakeoptions id="commonGmakeOptions" engine="gmake" />
+    <hlm:sbsmakeoptions id="commonPVMGmakeOptions" engine="pvmgmake" />
+
+    <!-- Tools specific make options inheriting the commone make option-->
+    <hlm:sbsmakeoptions id="toolsmake-sbs-ec">
+        <sbsmakeoptions refid="commonEMakeOptions" />
+        <arg name="--emake-maxagents" value="1" />
+    </hlm:sbsmakeoptions>
+            
+    <!-- Main build make option directly refering to common emake option -->
+    <hlm:sbsmakeoptions id="mainbuildmake-sbs-ec">
+        <sbsmakeoptions refid="commonEMakeOptions" />
+    </hlm:sbsmakeoptions>
+
+    <!-- tools common sbs options -->
+    <hlm:sbsoptions id="commonSBS">
+        <arg line="-k" />
+        <arg name="--filters" value="FilterMetadataLog"/>
+    </hlm:sbsoptions>
+
+    <!-- tools common sbs options -->
+    <hlm:sbsoptions id="toolsCommonSBS">
+        <argset refid="commonSBS" />
+        <arg line="-c tools_rel -c tools2_rel" />
+        <arg line="-j 1" />
+    </hlm:sbsoptions>
+
+    <hlm:sbsoptions id="winscwSBSOptions">
+        <argset refid="commonSBS" />
+        <arg line="-c winscw" />
+    </hlm:sbsoptions>
+
+    <!-- Mainbuild common sbs options -->
+    <hlm:sbsoptions id="armv5CommonSBS">
+            <argset refid="commonSBS" />
+            <arg line="-c armv5" />
+    </hlm:sbsoptions>
+
+    <hlm:sbsoptions id="testCommonSBS">
+            <argset refid="commonSBS" />
+            <arg line="-c armv5.test" />
+    </hlm:sbsoptions>
+
+
+    <hlm:sbsoptions id="testCleanSBS">
+        <argset refid="testcommonSBS" />
+        <argset refid="cleanCommon" />
+    </hlm:sbsoptions>
+
+    <hlm:sbsoptions id="cleanCommon">
+            <arg line="REALLYCLEAN" />
+    </hlm:sbsoptions>
+
+    <!-- Mainbuild common sbs options -->
+    <hlm:sbsoptions id="armv5Clean">
+        <argset refid="armv5CommonSBS"/>
+        <argset refid="cleanCommon" />
+    </hlm:sbsoptions>
+
+
+    <!-- Mainbuild common sbs options -->
+    <hlm:sbsoptions id="toolsClean">
+        <argset refid="toolsCommonSBS"/>
+        <argset refid="cleanCommon" />
+    </hlm:sbsoptions>
+
+    <!-- Mainbuild common sbs options -->
+    <hlm:sbsoptions id="winscwClean">
+        <argset refid="winscwSBSOptions"/>
+        <argset refid="cleanCommon" />
+    </hlm:sbsoptions>
+
+    <!-- sbs input consists of sbs options and sbs make options, the sbs options remains same for all
+    the build system, the make options varies
+     -->
+    <hlm:sbsinput id="tools-sbs">
+        <sbsoptions refid="toolsCommonSBS" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="tools-sbs-clean">
+        <sbsoptions refid="toolsClean" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="tools-sbs-ec">
+        <sbsoptions refid="toolsCommonSBS" />
+        <sbsmakeoptions refid="toolsmake-sbs-ec" ppThreads="20"/>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="tools-sbs-ec-clean">
+        <sbsoptions refid="toolsClean" />
+        <sbsmakeoptions refid="toolsmake-sbs-ec" ppThreads="20"/>
+    </hlm:sbsinput>
+
+    <!-- sbs input for main build.
+     -->
+    <hlm:sbsinput id="armv5-sbs">
+        <sbsoptions refid="armv5CommonSBS" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="armv5-sbs-clean">
+        <sbsoptions refid="armv5Clean" />
+    </hlm:sbsinput>
+
+    <!-- sbs input for main build.
+     -->
+    <hlm:sbsinput id="armv5-sbs-ec">
+        <sbsoptions refid="armv5CommonSBS" />
+        <sbsmakeoptions refid="mainbuildmake-sbs-ec" ppThreads="20"/>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="armv5-sbs-ec-clean">
+        <sbsoptions refid="armv5Clean" />
+        <sbsmakeoptions refid="mainbuildmake-sbs-ec" ppThreads="20" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="winscw-sbs">
+        <sbsoptions refid="winscwSBSOptions" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="winscw-sbs-clean">
+        <sbsoptions refid="winscwClean" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="winscw-sbs-ec-clean">
+        <sbsoptions refid="winscwClean" />
+        <sbsmakeoptions refid="mainbuildmake-sbs-ec" ppThreads="20"/>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="test-sbs">
+        <sbsoptions refid="testCommonSBS" />
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="test-sbs-clean">
+        <sbsoptions refid="testCleanSBS" />
+    </hlm:sbsinput>
+
+    <!-- sbs input for main build.
+     -->
+    <hlm:sbsinput id="test-sbs-ec">
+        <sbsoptions refid="testCommonSBS" />
+        <sbsmakeoptions refid="mainbuildmake-sbs-ec" ppThreads="20"/>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="test-sbs-ec-clean">
+        <sbsoptions refid="testCleanSBS" />
+        <sbsmakeoptions refid="mainbuildmake-sbs-ec" ppThreads="20" />
+    </hlm:sbsinput>
+
+</project>
\ No newline at end of file
--- a/buildframework/helium/tests/minibuilds/ido/build.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tests/minibuilds/ido/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -25,6 +25,7 @@
 	<import file="../site/${env.TEAM}.ant.xml" />
 	<dirname property="config.dir" file="${ant.file.minibuild.ido}" />
 
+  <property name="data.drive.letter" value="E" />
 	<!-- Enable Helium internal assertion checking. -->
 	<property name="hlm.enable.asserts" value="1" />
 
@@ -32,8 +33,10 @@
 	<property name="build.family" value="test_minibuild_ido" />
 	<property name="major.version" value="0" />
 	<property name="minor.version" value="0" />
-
-	<property name="ccm.project.wa_path" location="E:\Build_E\${env.USERNAME}\ido_wa\${build.name}" />
+	
+	<condition property="ccm.project.wa_path" value="${data.drive.letter}:\Build_${data.drive.letter}\${env.USERNAME}\ido_wa\${build.name}"  else="${build.name}\wa" > 
+	      <os family="windows"/>
+	</condition> 
 	<property name="ccm.enabled" value="true" />
 
 
@@ -47,15 +50,16 @@
 
 	<!-- Configuring the build system -->
 	<property name="build.system" value="ec-helium" />
-	<property name="rvct.version" value="22_616" />
+	<property name="rvct.version" value="22_686" />
 
 	<!-- Configuring get latest env. -->
-	<property name="s60.grace.service" value="S60RnD" />
-	<property name="s60.grace.product" value="pf_5250" />
-	<property name="s60.grace.release" value="pf_5250(?:_| )?\d{4}(?:\s*wk)?\d{2}" />
-	<!-- matching pf_5250_200816 and pf_5250 2008 wk16 -->
-	<property name="prep.root.dir" value="E:\Build_E\${env.USERNAME}\ido_ba\${build.name}" />
-
+	<property name="s60.grace.service" value="s60_devices_sw" />
+	<property name="s60.grace.product" value="DFS7x.92" />
+	<property name="s60.grace.release" value="mcl_\d{6}_hw79" />
+	<!-- matching mcl_200948_hw79 -->
+	<condition property="prep.root.dir" value="${data.drive.letter}:\Build_${data.drive.letter}\${env.USERNAME}\ido_ba\${build.name}" else="${build.name}\ido_ba" >
+    <os family="windows"/>
+  </condition>
 	<!-- Synergy configuration -->
 	<property name="ccm.database" value="tr1test1" />
 	<property name="prep.delivery.file" location="config/delivery.xml" />
@@ -114,6 +118,7 @@
 		</fmpp>
 	</target>
 
+
 	<!-- Preparing the content on top of the env -->
 	<target name="ido-50-build" depends="ido-build-prep,compile-main,build-log-summary,render-internal-exports,update-policy-src-reference,render-validate-policy,localisation-50-build,ido-codescanner,rndsdk-create-api-descr-xml,ats-test,publish-tasks-to-folder,ido-sources-to-s60-build-robot" />
 	<target name="ido-build-prep" depends="ido-configure-prep,init,check-tool-dependencies,log-build-env,set-arm-version,check-free-space,diamonds,do-ccm-get-input,ido-prep-clean,ido-prep-copy,create-bom" />
@@ -150,7 +155,7 @@
 	</target>
 
 	<target name="mini-build-cleanup">
-		<delete verbose="true" includeemptydirs="true">
+		<delete verbose="true" includeemptydirs="true" failonerror="false">
 			<fileset dir="${build.drive}/" casesensitive="false">
 				<include name="makefile" />
 				<include name="*.mk" />
@@ -168,8 +173,9 @@
 
 	<target name="mini-build-check">
 		<!-- Check if prep has set some prop correctly... -->
+		<!-- remember to update the selection by the environment variable in hlm.bat when switching to other compiler version -->
 		<echo>'${arm.compiler.version}'</echo>
-		<au:assertMatches string="${arm.compiler.version}" pattern="RVCT2\.2 \[Build 616\]" casesensitive="false" multiline="true" />
+		<au:assertMatches string="${arm.compiler.version}" pattern="RVCT2\.2 \[Build 686\]" casesensitive="false" multiline="true" />
 
 		<!-- Check if compile-main step did what expected... -->
 		<au:assertFileExists file="${canonical.sysdef.file}" />
@@ -183,8 +189,8 @@
 				<au:assertFileExists file="${build.drive}/helium_minibuild_ido_clean.make" />
 				<au:assertFileExists file="${build.drive}/emake.data" />
 
-				<au:assertFileExists file="${build.log.dir}/${build.id}.helium_minibuild_ido_run_emake.bat" />
-				<au:assertFileExists file="${build.log.dir}/${build.id}.helium_minibuild_ido_clean_run_emake.bat" />
+				<au:assertFileExists file="${temp.build.dir}/${build.id}.helium_minibuild_ido_run_emake.bat" />
+				<au:assertFileExists file="${temp.build.dir}/${build.id}.helium_minibuild_ido_clean_run_emake.bat" />
 			</then>
 		</if>
 	</target>
--- a/buildframework/helium/tests/minibuilds/ido/hack-test.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tests/minibuilds/ido/hack-test.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -31,7 +31,7 @@
 	<target name="prepare-hack">
 		<mkdir dir="${hack.dir}"/>
 		<copy file="${build.drive}\epoc32\tools\variant\variant.cfg" todir="${hack.dir}" overwrite="true"/>
-		<copy file="${build.drive}\epoc32\rom\include\s60.iby" todir="${hack.dir}" overwrite="true"/>
+		<copy file="${build.drive}\epoc32\rom\ppd.oby" todir="${hack.dir}" overwrite="true"/>
 		<copy file="${build.drive}\epoc32\data\z\private\10202be9\101F8763.txt" todir="${hack.dir}" overwrite="true"/>
 	</target>
 
@@ -48,21 +48,21 @@
 	<target name="do-hack">
 		<!-- Hacking variant.cfg -->
 		<copy file="${hack.dir}/variant.cfg" tofile="${hack.dir}/variant_hacked.cfg" overwrite="true"/>
-		<hlm:hackMacro file="${hack.dir}/variant_hacked.cfg" keyword="ENABLE_ABIV2_MODE" regex="(.hrh\s*$)" replace="\1\nENABLE_ABIV2_MODE"/>
+		<hlm:hackMacro file="${hack.dir}/variant_hacked.cfg" keyword="ENABLE_ABIVX_MODE" regex="(.hrh\s*$)" replace="\1\nENABLE_ABIVX_MODE"/>
 		<copy file="${hack.dir}/variant_hacked.cfg" tofile="${hack.dir}/variant_skipped.cfg" overwrite="true"/>
-		<hlm:hackMacro file="${hack.dir}/variant_skipped.cfg" keyword="ENABLE_ABIV2_MODE" regex="(.hrh\s*$)" replace="\1\nENABLE_ABIV2_MODE"/>
+		<hlm:hackMacro file="${hack.dir}/variant_skipped.cfg" keyword="ENABLE_ABIVX_MODE" regex="(.hrh\s*$)" replace="\1\nENABLE_ABIVX_MODE"/>
 
 		<au:assertFilesDiffer expected="${hack.dir}/variant.cfg" actual="${hack.dir}/variant_hacked.cfg" />
 		<au:assertFilesMatch expected="${hack.dir}/variant_skipped.cfg" actual="${hack.dir}/variant_hacked.cfg" />
 
 		<!-- Hacking S60.iby -->
-		<copy file="${hack.dir}/s60.iby" tofile="${hack.dir}/s60_hacked.iby" overwrite="true"/>
-		<hlm:hackMacro file="${hack.dir}/s60_hacked.iby" keyword="&lt;foo\.iby&gt;" regex="#endif" replace="#include &lt;foo.iby&gt;\n#endif"/>
-		<copy file="${hack.dir}/s60_hacked.iby" tofile="${hack.dir}/s60_skipped.iby" overwrite="true"/>
-		<hlm:hackMacro file="${hack.dir}/s60_skipped.iby" keyword="&lt;foo\.iby&gt;" regex="#endif" replace="#include &lt;foo.iby&gt;\n#endif"/>
+		<copy file="${hack.dir}/ppd.oby" tofile="${hack.dir}/ppd_hacked.oby" overwrite="true"/>
+		<hlm:hackMacro file="${hack.dir}/ppd_hacked.oby" keyword="&lt;foo\.iby&gt;" regex="#endif" replace="#include &lt;foo.iby&gt;\n#endif"/>
+		<copy file="${hack.dir}/ppd_hacked.oby" tofile="${hack.dir}/ppd_skipped.oby" overwrite="true"/>
+		<hlm:hackMacro file="${hack.dir}/ppd_skipped.oby" keyword="&lt;foo\.iby&gt;" regex="#endif" replace="#include &lt;foo.iby&gt;\n#endif"/>
 
-		<au:assertFilesDiffer expected="${hack.dir}/s60.iby" actual="${hack.dir}/s60_hacked.iby" />
-		<au:assertFilesMatch expected="${hack.dir}/s60_skipped.iby" actual="${hack.dir}/s60_hacked.iby" />
+		<au:assertFilesDiffer expected="${hack.dir}/ppd.oby" actual="${hack.dir}/ppd_hacked.oby" />
+		<au:assertFilesMatch expected="${hack.dir}/ppd_skipped.oby" actual="${hack.dir}/ppd_hacked.oby" />
 
 		<!-- Hacking 101F8763.iby -->
 		<copy file="${hack.dir}/101F8763.txt" tofile="${hack.dir}/101F8763_hacked.txt" overwrite="true"/>
--- a/buildframework/helium/tests/minibuilds/ido/hlm.bat	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tests/minibuilds/ido/hlm.bat	Wed Dec 23 19:29:07 2009 +0200
@@ -16,5 +16,6 @@
 rem Description: 
 rem
 
+set HLM_RVCT_VERSION=22_686
 ..\..\..\..\helium\hlm.bat %*
 
--- a/buildframework/helium/tests/minibuilds/imaker/build.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tests/minibuilds/imaker/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -44,8 +44,8 @@
 
     <!-- Configuring get latest env. -->
 	<property name="s60.grace.service" value="s60_devices_sw" />
-	<property name="s60.grace.product" value="DFS70.91.91" />
-	<property name="s60.grace.release" value="S60.91_\d{6}_hw70" />
+	<property name="s60.grace.product" value="DFS7x.92" />
+	<property name="s60.grace.release" value="mcl_\d{6}_hw79" />
 	<property name="prep.root.dir" value="E:\Build_E\${env.USERNAME}\ido_ba\${build.name}" />
 
 
@@ -134,7 +134,7 @@
 	</target>
     
     <target name="mini-build-cleanup">
-        <delete verbose="true" includeemptydirs="true">
+        <delete verbose="true" includeemptydirs="true" failonerror="false">
             <fileset dir="${build.drive}/" casesensitive="false">
                 <include name="makefile"/>
                 <include name="*.mk"/>
@@ -158,7 +158,7 @@
     <hlm:imakerconfigurationset id="imaker.rom.config">
         <imakerconfiguration>
             <makefileset>
-                <include name="**/${product.name}*/*ui.mk"/>
+                <include name="**/${product.name}/*ui.mk"/>
             </makefileset>
             <targetset>
                 <include name="^core$"/>
@@ -174,7 +174,7 @@
         </imakerconfiguration>
                 <imakerconfiguration>
             <makefileset>
-                <include name="**/${product.name}*/*ui.mk"/>
+                <include name="**/${product.name}/*ui.mk"/>
             </makefileset>
             <targetset>
                 <include name="^core$"/>
--- a/buildframework/helium/tests/minibuilds/qt/build.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tests/minibuilds/qt/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -135,7 +135,7 @@
     XML content are made before using XMLUnit to compare the content.
     -->
     <target name="check-diamonds">
-        <loadfile srcfile="${build.log.dir}/${build.id}_diamonds-log-start.xml" property="diamonds.log.start">
+        <loadfile srcfile="${diamonds.build.output.dir}/${build.id}_diamonds-log-start.xml" property="diamonds.log.start">
             <filterchain>
                 <tokenfilter>
                     <filetokenizer />
@@ -183,7 +183,7 @@
     </target>
 
     <target name="mini-build-cleanup">
-        <delete verbose="true" includeemptydirs="true">         
+        <delete verbose="true" includeemptydirs="true" failonerror="false">         
             <fileset dir="${build.drive}/" casesensitive="false">
                 <include name="makefile" />
                 <include name="*.mk" />
@@ -221,7 +221,7 @@
                 <au:assertTrue>
                     <and>
                         <contains string="${qmake.build.makefile}" substring="qmake -listgen -r src.pro" />
-                        <contains string="${qmake.build.makefile}" substring="qmake -listgen -platform symbian-abld -r examples.pro" />
+                        <contains string="${qmake.build.makefile}" substring="qmake -listgen -r examples.pro" />
                     </and>
                 </au:assertTrue>
             </then>
@@ -230,7 +230,7 @@
                     <namespace uri="" prefix=""/>
                     <xpath expression="/project/target[@name='all']/parallel/sequential/if/then/exec/arg[@value='-listgen']"/>
                     <xpath expression="/project/target[@name='all']/parallel/sequential/if/then/exec/arg[@line='-r']"/>
-                    <xpath expression="/project/target[@name='all']/parallel/sequential/if/then/exec/arg[@line='-platform symbian-abld -r -listgen']"/>
+                    <xpath expression="/project/target[@name='all']/parallel/sequential/if/then/exec/arg[@line='-r -listgen']"/>
                 </xpathtest>
             </else>
         </if>
@@ -245,9 +245,9 @@
         <au:assertFileExists file="${qt.dir}/examples/bld.inf" />
         <au:assertFileExists file="${build.drive}/epoc32/tools/qmake.bat" />
         <au:assertFileExists file="${build.drive}/epoc32/tools/moc.bat" />
-        <hlm:assertFileExists file="${build.log.dir}/${build.id}_build.qmake.generated.txt"/>
-        <hlm:assertFileExists file="${build.log.dir}/${build.id}_build_tools.qmake.generated.txt"/>
-        <loadfile srcFile="${build.log.dir}/${build.id}_build.qmake.generated.txt" property="qmake.generated.output"/>
+        <hlm:assertFileExists file="${compile.log.dir}/${build.id}_build.qmake.generated.txt"/>
+        <hlm:assertFileExists file="${compile.log.dir}/${build.id}_build_tools.qmake.generated.txt"/>
+        <loadfile srcFile="${compile.log.dir}/${build.id}_build.qmake.generated.txt" property="qmake.generated.output"/>
         <au:assertMatches string="${qmake.generated.output}" pattern="[^/]+/+[^/]+" />
 
     </target>
--- a/buildframework/helium/tests/minibuilds/qt/config/qmake_zip_cfg.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tests/minibuilds/qt/config/qmake_zip_cfg.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -34,7 +34,7 @@
         <config>
             <set name="name" value="${build.id}_${sysdef.configuration}.qmake"/>
             <set name="scanners" value="default,input.file"/>
-            <set name="input.files" value="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.generated.txt"/>
+            <set name="input.files" value="${compile.log.dir}/${build.id}_${sysdef.configuration}.qmake.generated.txt"/>
             <set name="include" value="output/docs/"/>
         </config>
     </config>
Binary file buildframework/helium/tools/common/bin/CheckTools.class has changed
--- a/buildframework/helium/tools/common/bin/CheckTools.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/bin/CheckTools.java	Wed Dec 23 19:29:07 2009 +0200
@@ -28,10 +28,11 @@
             
             Process toolProcess = runtime.exec("python -V");
             InputStream err = toolProcess.getErrorStream();
-            if (!(toString(err).trim().startsWith("Python 2.5")))
+            String output = toString(err).trim();
+            if (!(output.startsWith("Python 2.5")) && !(output.startsWith("Python 2.6")))
             {
-                System.out.println("Error: Python 2.5 not found");
-                System.out.println(err);
+                System.out.println("Error: Python 2.5/2.6 not found");
+                System.out.println(output);
             }
             
             toolProcess = runtime.exec("java -version");
--- a/buildframework/helium/tools/common/bin/call_vcvars32.bat	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-rem
-rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-rem All rights reserved.
-rem This component and the accompanying materials are made available
-rem under the terms of the License "Eclipse Public License v1.0"
-rem which accompanies this distribution, and is available
-rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
-rem
-rem Initial Contributors:
-rem Nokia Corporation - initial contribution.
-rem
-rem Contributors:
-rem
-rem Description: 
-rem
-
-REM Set MS Visual C++ environment
-if "%MSVC_ENV_BAT%"=="" call :findmsvc vcvars32.bat
-goto :foundmsvc
-:findmsvc
-set MSVC_ENV_BAT=%~$PATH:1
-exit /b
-:foundmsvc
-if "%MSVC_ENV_BAT%"=="" set MSVC_ENV_BAT=C:\apps\msvc6\VC98\Bin\Vcvars32.bat
-if not exist "%MSVC_ENV_BAT%" set MSVC_ENV_BAT=C:\Program Files\Microsoft Visual Studio\VC98\Bin\Vcvars32.bat
-REM Do we need the following line to support MSVS.net 2003?
-REM if not exist "%MSVC_ENV_BAT%" set MSVC_ENV_BAT=C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\Vcvars32.bat
-if not exist "%MSVC_ENV_BAT%" ( echo *** WARNING: Can't find vcvars32.bat - MS Visual Studio not present. & goto MS_Set_Env_End )
-call "%MSVC_ENV_BAT%" > nul
-if not "%DEBUG%"=="" echo on
-:MS_Set_Env_End
--- a/buildframework/helium/tools/common/common.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/common.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -113,15 +113,20 @@
     </target>
 
     <!-- Finds the build manager's (current user) email address from their username. -->
-    <target name="lookup-email" if="email.ldap.server">
+    <target name="lookup-email" >
         <if>
-            <not>
-                <isset property="email.from"/>
-            </not>
+            <isset property="email.ldap.server"/>
             <then>
-                <hlm:ldap url="${email.ldap.server}" rootdn="${email.ldap.rootdn}" filter="uid=${env.USERNAME}" outputproperty="email.from" key="mail"/>
-            </then>
-        </if>
+                <if>
+                    <not>
+                        <isset property="email.from"/>
+                    </not>
+                    <then>
+                        <hlm:ldap url="${email.ldap.server}" rootdn="${email.ldap.rootdn}" filter="uid=${env.USERNAME}" outputproperty="email.from" key="mail"/>
+                    </then>
+                </if>
+            </then>   
+        </if>        
     </target>
     
     <!-- To authenticate the noe password (read from .netrc file) for ${env.USERNAME}. -->
@@ -203,9 +208,9 @@
     A <tt>target</tt> property should be defined on the command line to specify which target's dependencies to analyse. -->
     <target name="execlist">
         <fail unless="target" message="target property not defined" />
-        <record name="execlist.txt" action="start" emacsmode="true"/>
+        <hlm:record name="execlist.txt" action="start" emacsmode="true"/>
         <hlm:dependencies target="${target}" format="executable"/>
-        <record name="execlist.txt" action="stop"/>
+        <hlm:record name="execlist.txt" action="stop"/>
         <exec executable="notepad.exe">
             <arg value="execlist.txt"/>
         </exec>
--- a/buildframework/helium/tools/common/common.antlib.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/common.antlib.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -92,12 +92,12 @@
         </pre>
     -->
     <scriptdef name="toolMacro" language="beanshell" uri="http://www.nokia.com/helium">
-        <element name="toolvarset" classname="com.nokia.ant.types.VariableSet"/>
+        <element name="toolvarset" classname="com.nokia.helium.core.ant.types.VariableSet"/>
         <attribute name="name"/>
 <![CDATA[
 import com.nokia.ant.util.ToolsProcess;
 import com.nokia.tools.*;
-import com.nokia.ant.types.VariableSet;
+import com.nokia.helium.core.ant.types.VariableSet;
 import org.apache.tools.ant.types.Reference;
     Reference ref;
     java.lang.String toolName = attributes.get("name");
@@ -118,6 +118,68 @@
   }
 ]]>
     </scriptdef>
+    
+    <!-- ConE tool macro to run the command for each argument -->
+    <scriptdef name="conEToolMacro" language="beanshell" uri="http://www.nokia.com/helium">
+        <element name="arg" classname="com.nokia.ant.types.Variable"/>
+        <attribute name="name"/>
+<![CDATA[
+import com.nokia.ant.util.ToolsProcess;
+import com.nokia.tools.*;
+import com.nokia.ant.types.Variable;
+    conETool =  ToolsProcess.getTool("ConE");
+    vars = elements.get("arg");
+    for (i = 0; i < vars.size(); ++i) {
+        try {
+            var = (Variable)vars.get(i);
+            conETool.storeVariables(var.getName(), var.getValue());
+        } catch (Exception e) {
+            self.log("Error: " + e);
+            //self.log("Tool Argument Validation failure");
+            throw e;
+        }
+  }
+  conETool.execute(project);
+]]>
+    </scriptdef>
+    
+    
+    <!-- This macro will read the line from file which matches the regexp -->
+    <scriptdef name="grepMacro" language="beanshell" uri="http://www.nokia.com/helium">
+        <attribute name="filename"/>
+        <attribute name="output"/>
+        <attribute name="regexp"/>
+<![CDATA[
+import java.util.*;
+import java.io.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+if (attributes.get("filename") == null ||  attributes.get("output") == null || attributes.get("regexp") == null)
+    throw new BuildException("Filename/output/regexp attribute is not set for readLineMacro");
+    
+String search = attributes.get("regexp");
+String output = "";
+pattern = Pattern.compile(search);
+
+BufferedReader input =  new BufferedReader(new FileReader(attributes.get("filename")));
+try {
+        String line = null;
+        Matcher match = null;
+        while (( line = input.readLine()) != null) {
+             match = pattern.matcher(line);
+            if (match.find()) {
+                //self.log("Line containg " + search + " is = " + line + " returned vaue = " + match.group(1));
+                output = output + match.group(1) + ",";
+            }
+        }
+    } catch (IOException ex) {
+      ex.printStackTrace();
+    }
+    project.setNewProperty(attributes.get("output") , output);
+
+]]>
+    </scriptdef>
 
     <!-- This task allow to dump the content of a text file to the shell. -->
     <scriptdef name="echoFileMacro" language="beanshell" uri="http://www.nokia.com/helium">
@@ -158,15 +220,9 @@
         <attribute name="emacsmode" default="false"/>
         <sequential>
             <if>
-                <available file="${build.log}"/>
-                <then>
-                    <record name="${build.log}" action="stop" append="true"/>
-                </then>
-            </if>
-            <if>
                 <available file="${build.log.dir}" type="dir"/>
                 <then>
-                    <record name="${build.log.dir}/@{name}" action="start" append="true" emacsmode="@{emacsmode}"/>
+                    <hlm:record name="${build.log.dir}/@{name}" action="start" append="true" emacsmode="@{emacsmode}" loglevel="${ant.loglevel}"/>
                 </then>
             </if>
         </sequential>
@@ -180,13 +236,7 @@
             <if>
                 <available file="${build.log.dir}/@{name}"/>
                 <then>
-                    <record name="${build.log.dir}/@{name}" action="stop" append="true"/>
-                </then>
-            </if>
-            <if>
-                <available file="${build.log}"/>
-                <then>
-                    <record name="${build.log}" action="start" append="true"/>
+                    <hlm:record name="${build.log.dir}/@{name}" action="stop" append="true"/>
                 </then>
             </if>
         </sequential>
@@ -196,15 +246,12 @@
     <!--Macro to stop recording to the main log file (if present) and record to
         a separate log file that is filtered after logging is stopped. -->
     <macrodef name="filterRecordStartMacro" uri="http://www.nokia.com/helium">
+        <attribute name="pattern" default=""/>
+        <attribute name="category" default=""/>
         <sequential>
-            <if>
-                <available file="${build.log}"/>
-                <then>
-                    <record name="${build.log}" action="stop" append="true"/>
-                </then>
-            </if>
-            <echo>Start of filtering ${build.log} for passwords</echo>
-            <record name="${build.cache.log.dir}/temp_ant_build.log" action="start" loglevel="info"/>
+            <hlm:record name="${build.cache.log.dir}/temp_ant_build.log" action="start" loglevel="${ant.loglevel}">
+                <hlm:recordfilter category="@{category}" regexp="@{pattern}" />
+            </hlm:record>
         </sequential>
     </macrodef>
     
@@ -212,26 +259,14 @@
     <!--Macro to stop recording the seperate filtered log file, filter the passwords
     and start recording in main log file -->
     <macrodef name="filterRecordStopMacro" uri="http://www.nokia.com/helium">
-        <attribute name="pattern"/>
         <attribute name="log" default="${build.log}"/>
         <attribute name="append" default="true"/>
         <sequential>
-            <record name="${build.cache.log.dir}/temp_ant_build.log" action="stop"/>                    
+            <hlm:record name="${build.cache.log.dir}/temp_ant_build.log" action="stop"/>                    
             <concat destfile="@{log}" append="@{append}">
                 <filelist dir="${build.cache.log.dir}" files="temp_ant_build.log"/>                        
-                <filterchain>
-                    <tokenfilter>
-                        <replaceregex pattern="@{pattern}" replace="****" flags="gi"/>
-                    </tokenfilter>
-                </filterchain>                        
             </concat>
             <delete file="${build.cache.log.dir}/temp_ant_build.log" failonerror="false"/>
-            <if>
-                <available file="${build.log}"/>
-                <then>
-                    <record name="${build.log}" action="start" append="true"/>
-                </then>
-            </if>
             <echo>End of filtering @{log} for passwords</echo>
         </sequential>
     </macrodef>
@@ -404,15 +439,12 @@
         raise Exception("No entry found for Type: %s" % str(attributes.get("type")))
     (n_username, n_account, n_password) = netrc_info
     if attributes.get('output-prop') != None:
-        self.log("Output: %s" % attributes.get('output-prop'))
         project.setProperty(str(attributes.get('output-prop')), str(n_password))
 except Exception, e:
     result = "-1"
-    print "ERROR: %s" % e
+    print "Warning: %s" % e
 if attributes.get('result-prop') != None:
-    self.log("Result: %s" % attributes.get('result-prop'))
     project.setProperty(str(attributes.get('result-prop')), str(result))
-    self.log("%s: %s" % (attributes.get('result-prop'), project.getProperty(str(attributes.get('result-prop')))))
         ]]>
     </scriptdef>
 
@@ -433,16 +465,12 @@
         raise Exception("No entry found for Type: %s" % str(attributes.get("type")))
     (n_username, n_account, n_password) = netrc_info
     if attributes.get('output-prop') != None:
-        self.log("Output: %s" % attributes.get('output-prop'))
         project.setProperty(str(attributes.get('output-prop')), str(n_username))
 except Exception, e:
     result = "-1"
-    print "ERROR: %s" % e
+    print "Warning: %s" % e
 if attributes.get('result-prop') != None:
-
-    self.log("Result: %s" % attributes.get('result-prop'))
     project.setProperty(str(attributes.get('result-prop')), str(result))
-    self.log("%s: %s" % (attributes.get('result-prop'), project.getProperty(str(attributes.get('result-prop')))))
         ]]>
     </scriptdef>
      
@@ -482,7 +510,8 @@
         session = provider.get(username, password, database=database, reuse=False)
     else:
         session = provider.get(username, password, engine, dbpath, reuse=False)
-    del(session)
+    session.close()
+    provider.close()
 except Exception, e:
     print "ERROR: %s" % e
     if str(e).find("access denied") != -1:
@@ -495,7 +524,9 @@
      </scriptdef>
 
     <!-- Extract logs from text file and process error/warnings/components name etc
-    into xml file.-->
+    into xml file.
+    <deprecated>Please consider using the metadata framework.</deprecated>
+    -->
     <scriptdef name="logextract" language="jython"  uri="http://www.nokia.com/helium">
         <attribute name="file" />
         <attribute name="outputfile" />
@@ -561,13 +592,7 @@
         <attribute name="name"/>
         <sequential>
             <mkdir dir="${build.cache.log.dir}"/>
-            <if>
-                <available file="${build.log}"/>
-                <then>
-                    <record name="${build.log}" action="stop" append="true"/>
-                </then>
-            </if>
-            <record name="${build.cache.log.dir}/@{name}" action="start" loglevel="verbose"/>
+            <hlm:record name="${build.cache.log.dir}/@{name}" action="start" loglevel="${ant.loglevel}"/>
         </sequential>
     </macrodef>
 
@@ -578,12 +603,14 @@
         build area preparation. -->
     <macrodef name="tempRecordStopMacro" uri="http://www.nokia.com/helium">
         <attribute name="name"/>
+        <attribute name="phase" default=""/>
         <attribute name="database" default="${metadata.dbfile}"/>
         <attribute name="filterref" default="filterset.temprecord"/>
         <sequential>
             <mkdir dir="${build.cache.log.dir}"/>
+            <mkdir dir="${build.log.dir}"/>
             <mkdir dir="${build.cache.log.dir}/signals"/>
-            <record name="${build.cache.log.dir}/@{name}" action="stop" loglevel="verbose"/>
+            <hlm:record name="${build.cache.log.dir}/@{name}" action="stop" loglevel="${ant.loglevel}"/>
             <!--Temporary solution, the logextract in general 
                 needs to be handled in a better way (not all logs needs to be processed,
                 logextract / counting errors could be merged and logextract should be
@@ -596,24 +623,30 @@
                 </hlm:antmetadatainput>
             </hlm:metadatarecord>
             <hlm:generateBuildStatus dbfile="@{database}" output-dir="${build.cache.log.dir}/signals" file="@{name}" />
-            <copy todir="${build.log.dir}" failonerror="false">
-                <fileset casesensitive="false" file="${build.cache.log.dir}/@{name}" />
-            </copy>
+            <if>
+                <isset property="@{phase}.log.dir" />
+                <then>
+                    <mkdir dir="${@{phase}.log.dir}"/>
+                    <copy todir="${@{phase}.log.dir}" failonerror="false">
+                        <fileset casesensitive="false" file="${build.cache.log.dir}/@{name}" />
+                    </copy>
+                </then>
+                <else>
+                    <copy todir="${build.log.dir}" failonerror="false">
+                        <fileset casesensitive="false" file="${build.cache.log.dir}/@{name}" />
+                    </copy>
+                </else>
+            </if>            
             <copy todir="${build.signal.status.dir}" failonerror="false">
                 <fileset casesensitive="false" dir="${build.cache.log.dir}/signals" />
             </copy>
-            <if>
-                <available file="${build.log}"/>
-                <then>
-                    <record name="${build.log}" action="start" append="true"/>
-                </then>
-            </if>
         </sequential>
     </macrodef>
     
 
     <macrodef name="signalMacro" uri="http://www.nokia.com/helium">
         <attribute name="logfile"/>
+        <attribute name="phase" default=""/>
         <attribute name="signal.input" />
         <attribute name="skip.count" default="false" />
         <attribute name="result" default="not-set"/>
@@ -638,13 +671,29 @@
                     <var name="signal.errors.total" value="@{result}" />
                 </else>
             </if>
+            <if>
+                <isset property="@{phase}.log.dir" />
+                <then>
+                    <var name="signal.log.dir" value="" unset="true"/>
+                    <property name="signal.log.dir" value="${@{phase}.log.dir}"/>
+                    <echo>signal.log.dir = ${signal.log.dir}</echo>
+                </then>
+                <else>
+                    <var name="signal.log.dir" value="" unset="true"/>
+                    <property name="signal.log.dir" value="${build.log.dir}"/>
+                </else>
+            </if>
             <hlm:generateBuildStatus output-dir="${build.signal.status.dir}/" 
                 file="${base.signal.log.file}" />
             <!-- signal for errors -->
             <hlm:signal name="@{signal.input}" result="${signal.errors.total}" >
                 <signalNotifierInput>
                     <signalInput refid="@{signal.input}" />
-                    <notifierInput file = "${build.signal.status.dir}/${base.signal.log.file}.status.html" />
+                    <notifierInput>
+                        <fileset dir="${build.log.dir}" >
+                            <include name="**/${base.signal.log.file}*" />
+                        </fileset>
+                    </notifierInput>
                 </signalNotifierInput>
             </hlm:signal>
         </sequential>
@@ -658,17 +707,19 @@
         <attribute name="name"/>
         <attribute name="regexp" default=""/>
         <attribute name="backup" default="false"/>
+        <attribute name="phase" default=""/>
         
         <sequential>
             <if>
-                <available file="${build.log}"/>
+                <isset property="@{phase}.log.dir" />
                 <then>
-                    <echo>Stopping recording to main Ant build log.</echo>
-                    <record name="${build.log}" action="stop" append="true"/>
+                    <mkdir dir="${@{phase}.log.dir}"/>
                 </then>
-            </if>
+            </if> 
             <mkdir dir="@{name}/.."/>
-            <hlm:logrecord name="@{name}" action="start" loglevel="verbose" regexp="@{regexp}" backup="@{backup}"/>
+            <hlm:record name="@{name}" action="start" loglevel="verbose" >
+                <hlm:recordfilter category="@{phase}" regexp="@{regexp}" />
+            </hlm:record>
         </sequential>
     </macrodef>
 
@@ -677,15 +728,9 @@
         a separate log file. -->
     <macrodef name="stopSpecificLogMacro">
         <attribute name="name"/>
+        <attribute name="phase" default=""/>
         <sequential>
-            <hlm:logrecord name="@{name}" action="stop" loglevel="verbose"/>
-            <if>
-                <available file="${build.log}"/>
-                <then>
-                    <record name="${build.log}" action="start" append="true"/>
-                    <echo>Starting recording to main Ant build log again.</echo>
-                </then>
-            </if>
+            <hlm:record name="@{name}" action="stop" loglevel="verbose"/>
         </sequential>
     </macrodef>
 
--- a/buildframework/helium/tools/common/docs.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/docs.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -110,10 +110,10 @@
             <fileset refid="python.library.files"/>
         </pathconvert>
         <echo>Python modules path: ${epydoc.python.modules.path}</echo>
-        <exec osfamily="windows" executable="python" dir="${helium.build.dir}" failonerror="true">        
-            <arg line="${python.tools}\epydoc"/>
+        <exec executable="python" dir="${helium.build.dir}" failonerror="true">        
+            <arg line="${python.tools}/epydoc"/>
             <arg value="-v"/>
-            <arg value="--config=${helium.dir}\config\epydoc.conf"/>
+            <arg value="--config=${helium.dir}/config/epydoc.conf"/>
             <arg value="--exclude=sgmllib"/>
             <arg line="${epydoc.python.modules.path}"/>
         </exec>
@@ -258,7 +258,7 @@
         <attribute name="src" default="${helium.build.dir}/temp/doc"/>
         <attribute name="output" default="${helium.build.dir}/doc"/>
         <sequential>
-            <property name="sphinx.lib.dir" location="${helium.dir}/external/python/lib/2.5/Sphinx-0.5.1-py2.5.egg/sphinx" />
+            <property name="sphinx.lib.dir" location="${helium.dir}/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx" />
             <if>
                 <available file="${nokia.python.tools}/sphinxfixsearch.diff"/>
                 <then>
@@ -266,7 +266,7 @@
                 </then>
             </if>
             <exec executable="python" failonerror="${failonerror}">        
-                <arg file="${python.dir}/sphinx-build.py"/>
+                <arg file="${python.dir}/common/sphinx-build.py"/>
                 <arg value="-b" />
                 <arg value="html" />            
                 <arg value="-D" />
@@ -645,6 +645,7 @@
 import amara
 import codecs
 import ant
+import docs
 
 setpath = r'${helium.dir}'+'/tools'
 
@@ -654,43 +655,11 @@
 dbPath = 'file:///'+ dbPath.replace('\\','/')
 dbPrj = amara.parse(dbPath)
 
-for root, dirs, files in os.walk(setpath, topdown=False):
-    for fname in files:
-        filePattern = re.compile('.ant.xml$')
-        fileMatch = filePattern.search(fname)
-        modulelist = []
-        if (fileMatch):
-            filePath = os.path.abspath(os.path.join(root, fname))
-            with open(filePath) as f:
-                filePathAmara = 'file:///'+ filePath.replace('\\','/')
-                curPrj=amara.parse(filePathAmara)
-                for line in f:
-                    linePattern = re.compile('^import')
-                    lineMatch = linePattern.search(line)
-                    if ((lineMatch) and (line.find('.')==-1)):
-                        newLine = line.replace('import','')
-                        newLine = newLine.replace(',','')
-                        moduleArray = newLine.split()
-                        for curModule in moduleArray:
-                            try:
-                                importModule = __import__(curModule)
-                                modulePath=importModule.__file__
-                                if (modulePath.find('\\helium\\tools')!= -1):
-                                    for projectList in dbPrj.antDatabase.project:
-                                        if (projectList.name==curPrj.project.name):
-                                            if not (curModule in modulelist):
-                                                print " Python module : " +curModule
-                                                moduleElement = projectList.pythonDependency.xml_create_element(u'module', content=u''+curModule)
-                                                projectList.pythonDependency.xml_append(moduleElement)
-                                            modulelist = modulelist + [curModule]
-                            except Exception, e:
-                                error ="yes"
-
+docs.find_python_dependencies(setpath, dbPath, dbPrj)
 
 file_object = codecs.open(r'${database.file}', 'w', "utf_8")
 file_object.write(dbPrj.xml(indent=u"yes"))
 file_object.close()
-    
         </hlm:python>
     </target>
     
@@ -841,12 +810,6 @@
         
     </target>
     
-    <!-- Download data listening logs and extract data -->
-    <target name="parse-datalistening">
-        <exec executable="python" dir="${helium.dir}/tools/common/python/lib" failonerror="${failonerror}">
-            <arg value="parsedatalistening.py"/>
-        </exec>
-    </target>
 
     <!-- Creates user flow diagram -->
     <target name="helium-user-graph">
Binary file buildframework/helium/tools/common/java/lib/nokia_ant.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/AtsCondition.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,113 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+ 
+package com.nokia.ant;
+
+import com.nokia.helium.core.ant.types.ConditionType;
+import com.nokia.helium.core.ant.types.*;
+import com.nokia.helium.signal.ant.taskdefs.*;
+import com.nokia.helium.signal.ant.types.*;
+
+import org.apache.log4j.Logger;
+import java.util.Iterator;
+import java.net.URL;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+/**
+ * Condition to read check from diamonds and tell if ats has failed
+ * @ant.type name="hasAtsPassed"
+ */
+public class AtsCondition extends ConditionType
+{
+    private Logger log = Logger.getLogger(AtsCondition.class);
+    private int sleeptimesecs = 60;
+    
+    public void setSleeptime(int seconds)
+    {
+        sleeptimesecs = seconds;
+    }
+    
+    /** Read from diamonds and signal if ats failed */
+    public boolean eval()
+    {
+        String bid = project.getProperty("diamonds.build.id");
+        if (bid == null)
+            log.info("Diamonds not enabled");
+        else
+        {
+            boolean testsfound = false;
+            log.info("Looking for tests in diamonds");
+            SAXReader xmlReader = new SAXReader();
+            
+            while (!testsfound)
+            {
+                Document antDoc = null;
+                
+                try {
+                    URL url = new URL("http://" + project.getProperty("diamonds.host") + bid + "?fmt=xml");
+                    antDoc = xmlReader.read(url);
+                } catch (Exception e) {
+                    // We are Ignoring the errors as no need to fail the build.
+                    log.error("Not able to read the Diamonds URL http://" + project.getProperty("diamonds.host") + bid + "?fmt=xml" + e.getMessage());
+                }
+                  
+                for (Iterator iterator = antDoc.selectNodes("//test/failed").iterator(); iterator.hasNext();)
+                {
+                    testsfound = true;
+                    Element e = (Element) iterator.next();
+                    String failed = e.getText();
+                    if (!failed.equals("0"))
+                    {
+                        log.error("ATS tests failed");
+                        
+                        for (Iterator iterator2 = antDoc.selectNodes("//actual_result").iterator(); iterator2.hasNext();)
+                        {
+                            Element e2 = (Element) iterator2.next();
+                            log.error(e2.getText());
+                        }
+                        return false;
+                    }
+                }
+                
+                int noofdrops = Integer.parseInt(project.getProperty("drop.file.counter"));
+                if (noofdrops > 0)
+                {
+                    int testsrun = antDoc.selectNodes("//test").size();
+                    if (testsrun < noofdrops)
+                    {
+                        log.info(testsrun + " test completed, " + noofdrops + " total");
+                        testsfound = false;
+                    }
+                }
+                if (!testsfound)
+                {
+                    log.info("Tests not found sleeping for " + sleeptimesecs + " seconds");
+                    try {
+                    Thread.sleep(sleeptimesecs * 1000);
+                    } catch (InterruptedException e) {
+                        // This will not affect the build process so ignoring.
+                        log.debug("Interrupted while reading ATS build status " + e.getMessage());
+                    }
+                }
+            }
+        }
+        return true;
+    }
+}
\ No newline at end of file
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/BSFJepEngine.java	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
- 
-package com.nokia.ant;
-
-import java.io.*;
-import org.apache.bsf.BSFException;
-import org.apache.bsf.BSFManager;
-
-/**
- * Override default implementation to support source with are not files.
- * 
- * @author Helium Team
- * @see jep.BSFJepEngine
- */
-public class BSFJepEngine extends jep.BSFJepEngine
-{
-
-    static
-    {
-        BSFManager.registerScriptingEngine("jep", "com.nokia.ant.BSFJepEngine", new String[]
-        { "py" });
-    }
-
-    /**
-     * Execute a script.
-     * 
-     * @param source
-     *            a <code>String</code> value
-     * @param lineNo
-     *            an <code>int</code> value
-     * @param columnNo
-     *            an <code>int</code> value
-     * @param script
-     *            an <code>Object</code> value
-     * @exception BSFException
-     *                if an error occurs
-     */
-    public final void exec(final String source, final int lineNo, final int columnNo, final Object script) throws BSFException
-    {
-        boolean deleteTemp = false;
-        File file = null;
-        try
-        {
-            file = new File(script.toString());
-            if (file.exists() && file.isFile())
-            {
-                super.exec(source, lineNo, columnNo, script);
-            }
-            else
-            {
-                deleteTemp = true;
-                file = File.createTempFile("helium", null);
-                PrintWriter output = new PrintWriter(new FileOutputStream(file));
-                output.write(script.toString());
-                output.close();
-                super.exec(source, lineNo, columnNo, file.getAbsolutePath());
-            }
-        }
-        catch (Exception e)
-        {
-            throw new BSFException(BSFException.REASON_EXECUTION_ERROR, e.toString(), e);
-        }
-        finally
-        {
-            terminate();
-            if (deleteTemp && file != null && file.exists()) {
-                file.delete();
-            }
-        }
-    }
-}
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/BuildStatusDef.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/BuildStatusDef.java	Wed Dec 23 19:29:07 2009 +0200
@@ -67,9 +67,9 @@
         
         if (!output.isEmpty())
         {
-            System.out.println("*** Configuration report ***");
+            log("*** Configuration report ***", Project.MSG_INFO);
             for (String x : output)
-                System.out.println(x);
+                log(x, Project.MSG_INFO);
         }
     }
     
@@ -143,6 +143,8 @@
                 Target depTarget = findTarget(depTargetString, project, array);
                 targetCallsHeliumTarget(depTarget, project);
                 } catch (BuildException x) { 
+                    // We are Ignoring the errors as no need to fail the build.
+                    log("Exception occured while target defined outside helium are calling a private Helium target " + x.toString(), Project.MSG_DEBUG);
                     x = null;
                     }
             }
@@ -155,7 +157,9 @@
                 try {
                 Target depTarget = findTarget(depTargetString, project, array);
                 targetCallsHeliumTarget(depTarget, project);
-                } catch (BuildException x) { 
+                } catch (BuildException x) {
+                    //We are Ignoring the errors as no need to fail the build.
+                    log("Exception occured while target defined outside helium are calling a private Helium target " + x.toString(), Project.MSG_DEBUG);
                     x = null;
                     }
             }
@@ -165,7 +169,11 @@
             checkIfTargetPrivate(target, project);
         }
 
-        } catch (Exception e) { e.printStackTrace(); }
+        } catch (Exception e) {
+            //We are Ignoring the errors as no need to fail the build.
+            log("Exception occured while target defined outside helium are calling a private Helium target " + e.getMessage(), Project.MSG_DEBUG);
+            e.printStackTrace();
+        }
     }
 
     private class AntTargetVisitor extends VisitorSupport
@@ -212,7 +220,10 @@
         try {
         File file = new File(location);
         antDoc = xmlReader.read(file);
-        } catch (Exception e) { e.printStackTrace(); }
+        } catch (Exception e) {
+            // We are Ignoring the errors as no need to fail the build.
+            log("Not able read the XML file. " + e.getMessage(), Project.MSG_WARN);
+        }
           
         String projectName = antDoc.valueOf("/project/@name");
         for (Iterator iterator = antDoc.selectNodes("//target").iterator(); iterator.hasNext();)
@@ -283,7 +294,10 @@
             try {
             File model = new File(project.getProperty("data.model.file"));
             antDoc = xmlReader.read(model);
-            } catch (Exception e) { e.printStackTrace(); }
+            } catch (Exception e) {
+                // We are Ignoring the errors as no need to fail the build.
+                log("Not able read the data model file. " + e.getMessage(), Project.MSG_WARN);
+            }
             
             List<Node> statements = antDoc.selectNodes("//property");
             
@@ -326,7 +340,10 @@
                 }
             }
         }
-        } catch (Exception e) { e.printStackTrace(); }
+        } catch (Exception e) {
+            // We are Ignoring the errors as no need to fail the build.
+            log("Not able read the Customer Properties " + e.getMessage(), Project.MSG_WARN);
+        }
           
         return props;
     }
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/Database.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/Database.java	Wed Dec 23 19:29:07 2009 +0200
@@ -27,20 +27,21 @@
 import java.io.StringReader;
 import java.util.ArrayList;
 import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
-import java.util.HashMap;
 import java.util.Map;
-import java.util.regex.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.Target;
 import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.Reference;
 import org.apache.tools.ant.types.ResourceCollection;
-import org.apache.tools.ant.types.Reference;
 import org.apache.tools.ant.types.resources.FileResource;
-
 import org.dom4j.Attribute;
 import org.dom4j.CDATA;
 import org.dom4j.Comment;
@@ -52,10 +53,11 @@
 import org.dom4j.Text;
 import org.dom4j.Visitor;
 import org.dom4j.VisitorSupport;
+import org.dom4j.XPath;
 import org.dom4j.io.OutputFormat;
 import org.dom4j.io.SAXReader;
 import org.dom4j.io.XMLWriter;
-import org.dom4j.XPath;
+
 
 /**
  * Reads the current ant project and a fileset and generates a xml file with a summary of targets,
@@ -71,7 +73,7 @@
     private HashMap<String, List<String>> globalSignalList = new HashMap<String, List<String>>();
     private HashMap map = new HashMap();
     private Document signaldoc;
-
+    
     public Database(Project project, ResourceCollection rc, Task task)
     {
         this.project = project;
@@ -83,20 +85,20 @@
     public Project getProject() {
         return project;
     }
-    
+
     public void setDebug(boolean debug) {
         this.debug = debug;
     }
-    
+
     public void setHomeFilesOnly(boolean homeFilesOnly) {
         this.homeFilesOnly = homeFilesOnly;
     }
-    
+
     public void log(String msg, int level) {
         if (task != null) {
             task.log(msg, level);
         } else if (debug) {            
-            System.out.println(msg);
+            project.log(msg, level);
         }
     }
 
@@ -129,9 +131,12 @@
             String antFile = (String) antFilesIter.next();
             parseAntFile(root, antFile);
         }
+
+        buildTaskDefs( root );
+
         return outDoc;
     }
-    
+
     public void createXMLFile(File outputFile) {
         try {
             Document outDoc = createDOM();
@@ -142,27 +147,25 @@
             XMLWriter out = new XMLWriter(outStream, OutputFormat.createPrettyPrint());
             out.write(outDoc);
         } catch (Exception e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
             throw new BuildException(e.getMessage());
         }
     }
-    
+
     private void readSignals(Element root, String antFile) throws DocumentException, IOException
     {
         SAXReader xmlReader = new SAXReader();
         Document antDoc = xmlReader.read(new File(antFile));
-        
+
         XPath xpath = DocumentHelper.createXPath("//hlm:signalConfig");
         xpath.setNamespaceURIs(map);
-        
+
         List signalNodes = xpath.selectNodes(antDoc);
         for (Iterator iterator = signalNodes.iterator(); iterator.hasNext();)
         {
             signaldoc = antDoc;
             Element propertyNode = (Element) iterator.next();
             String signalid = propertyNode.attributeValue("id");
-            
+
             String signaltarget = signalName(signalid, signaldoc);
             List existinglist = globalSignalList.get(signaltarget);
             String failbuild = signalType(signalid, signaldoc);
@@ -171,7 +174,7 @@
             existinglist.add(signalid + "," + failbuild);
             globalSignalList.put(signaltarget, existinglist);
         }
-        
+
         xpath = DocumentHelper.createXPath("//hlm:signalListenerConfig");
         xpath.setNamespaceURIs(map);
         signalNodes = xpath.selectNodes(antDoc);
@@ -180,7 +183,7 @@
             signaldoc = antDoc;
             Element propertyNode = (Element) iterator.next();
             String signalid = propertyNode.attributeValue("id");
-            
+
             String signaltarget = propertyNode.attributeValue("target");
             List existinglist = globalSignalList.get(signaltarget);
             String failbuild = signalType(signalid, signaldoc);
@@ -190,7 +193,7 @@
             globalSignalList.put(signaltarget, existinglist);
         }
     }
-    
+
     private String signalName(String signalid, Document antDoc)
     {
         XPath xpath = DocumentHelper.createXPath("//hlm:signalConfig[@id='" + signalid + "']/hlm:targetCondition");
@@ -204,18 +207,18 @@
         }
         return null;
     }
-    
+
     private String signalType(String signalid, Document antDoc)
     {
         XPath xpath2 = DocumentHelper.createXPath("//hlm:signalConfig[@id='" + signalid + "']/hlm:inputRef|//hlm:signalListenerConfig[@id='" + signalid + "']/signalNotifierInput/signalInput");
         xpath2.setNamespaceURIs(map);
         List signalNodes3 = xpath2.selectNodes(antDoc);
-        
+
         for (Iterator iterator3 = signalNodes3.iterator(); iterator3.hasNext();)
         {
             Element propertyNode3 = (Element) iterator3.next();
             String signalinputid = propertyNode3.attributeValue("refid");
-            
+
             XPath xpath3 = DocumentHelper.createXPath("//hlm:signalInput[@id='" + signalinputid + "']");
             xpath3.setNamespaceURIs(map);
             List signalNodes4 = xpath3.selectNodes(antDoc);
@@ -227,7 +230,7 @@
         }
         return null;
     }
-    
+
     /**
      * @param root
      * @param antFile
@@ -280,10 +283,10 @@
         {
             Element argNode = (Element) iterator.next();
             String argValue = argNode.attributeValue("value");
-            
+
             if (argValue == null)
                 argValue = argNode.attributeValue("line");
-            
+
             if (argValue != null)
             {
                 Pattern filePattern = Pattern.compile(".pl|.py|.bat|.xml|.txt");
@@ -324,7 +327,7 @@
     {
         return getAntFiles(getProject(), true);
     }
-    
+
     public ArrayList getAntFiles(Project project)
     {
         return getAntFiles(project, true);
@@ -342,16 +345,16 @@
 
         Map targets = project.getTargets();
         Iterator targetsIter = targets.values().iterator();
-        
+
         String projectHome = null;
         try {
             projectHome = new File(project.getProperty("helium.dir")).getCanonicalPath();
-          
+
             while (targetsIter.hasNext())
             {
                 Target target = (Target) targetsIter.next();
                 String projectPath = new File(target.getLocation().getFileName()).getCanonicalPath();
-                
+
                 if (!antFiles.contains(projectPath))
                 {
                     if (homeOnly)
@@ -365,7 +368,7 @@
                         antFiles.add(projectPath);
                 }
             }
-    
+
             if (rc != null)
             {
                 Iterator extraFilesIter = rc.iterator();
@@ -373,7 +376,7 @@
                 {
                     FileResource f = (FileResource) extraFilesIter.next();
                     String extrafile = f.getFile().getCanonicalPath();
-                    
+
                     if (!antFiles.contains(f.toString()) && !f.getFile().getName().startsWith("test_"))
                     {
                         if (homeOnly)
@@ -388,13 +391,18 @@
                     }
                 }
             }
-        
-        } catch (Exception e) { e.printStackTrace(); }
+
+        } catch (Exception e) { 
+            log(e.getMessage(), Project.MSG_ERR); 
+            e.printStackTrace();
+            }
         return antFiles;
     }
 
+    //--------------------------------- PRIVATE METHODS ------------------------------------------
+
     private void processMacro(Element macroNode, Element outProjectNode, String antFile)
-            throws IOException, DocumentException
+    throws IOException, DocumentException
     {
         String macroName = macroNode.attributeValue("name");
         log("Processing macro: " + macroName, Project.MSG_DEBUG);
@@ -416,7 +424,7 @@
         // number.
         // TODO - Later we should find the line number from the XML input.
         addTextElement(outmacroNode, "location", antFile + ":1:");
-        
+
         List<Node> statements = macroNode.selectNodes("//scriptdef[@name='" + macroName + "']/attribute | //macrodef[@name='" + macroName + "']/attribute");
         String usage = "";
         for (Node statement : statements)
@@ -428,7 +436,7 @@
                 defaultval = "<i>" + defaultval + "</i>";
             usage = usage + " " + statement.valueOf("@name") + "=\"" + defaultval + "\"";
         }
-        
+
         String macroElements = "";
         statements = macroNode.selectNodes("//scriptdef[@name='" + macroName + "']/element | //macrodef[@name='" + macroName + "']/element");
         for (Node statement : statements)
@@ -439,8 +447,8 @@
             addTextElement(outmacroNode, "usage", "&lt;hlm:" + macroName + " " + usage + "/&gt;");
         else
             addTextElement(outmacroNode, "usage", "&lt;hlm:" + macroName + " " + usage + "&gt;\n" + macroElements + "&lt;/hlm:" + macroName + "&gt;");
-        
-        
+
+
         // Add dependencies
         // Enumeration dependencies = antmacro.getDependencies();
         // while (dependencies.hasMoreElements())
@@ -495,7 +503,7 @@
             addTextElement(outmacroNode, "propertyDependency", property);
         }
     }
-    
+
     private void callAntTargetVisitor(Element targetNode, Element outTargetNode, Element outProjectNode)
     {
         // Add antcall/runtarget dependencies
@@ -511,26 +519,26 @@
             Element dependencyElement = addTextElement(outTargetNode, "dependency", antcallTarget);
             dependencyElement.addAttribute("type", "exec");
         }
-        
+
         for (String log : logs)
         {
             addTextElement(outTargetNode, "log", log);
         }
-        
+
         if (globalSignalList.get(targetNode.attributeValue("name")) != null)
             signals.addAll(globalSignalList.get(targetNode.attributeValue("name")));
-        
+
         for (String signal : signals)
         {
             addTextElement(outTargetNode, "signal", signal);
         }
-        
+
         for (String executable : executables)
         {
             addTextElement(outTargetNode, "executable", executable);
         }
     }
-    
+
     private void processTarget(Element targetNode, Element outProjectNode) throws IOException, DocumentException
     {
         String targetName = targetNode.attributeValue("name");
@@ -556,7 +564,7 @@
             {
                 Comment targetComment = (Comment) child;
                 commentText = targetComment.getStringValue().trim();
-                
+
                 log(targetName + " comment: " + commentText, Project.MSG_DEBUG);
             }
             else
@@ -566,26 +574,26 @@
 
             Node previousNode = (Node) children.get(children.size() - 1);
         }
-        
+
         if (!commentText.contains("Private:"))
         {
             Element outTargetNode = outProjectNode.addElement("target");
-            
+
             addTextElement(outTargetNode, "name", targetNode.attributeValue("name"));
             addTextElement(outTargetNode, "ifDependency", targetNode.attributeValue("if"));
             addTextElement(outTargetNode, "unlessDependency", targetNode.attributeValue("unless"));
             addTextElement(outTargetNode, "description", targetNode.attributeValue("description"));
             addTextElement(outTargetNode, "tasks", String.valueOf(targetNode.elements().size()));
-    
+
             // Add location
             Project project = getProject();
             Target antTarget = (Target) project.getTargets().get(targetName);
-            
+
             if (antTarget == null)
                 return;
-            
+
             addTextElement(outTargetNode, "location", antTarget.getLocation().toString());
-    
+
             // Add dependencies
             Enumeration dependencies = antTarget.getDependencies();
             while (dependencies.hasMoreElements())
@@ -594,12 +602,12 @@
                 Element dependencyElement = addTextElement(outTargetNode, "dependency", dependency);
                 dependencyElement.addAttribute("type", "direct");
             }
-            
+
             callAntTargetVisitor(targetNode, outTargetNode, outProjectNode);
-            
+
             // Process the comment text as MediaWiki syntax and convert to HTML
             insertDocumentation(outTargetNode, commentText);
-    
+
             // Get names of all properties used in this target
             ArrayList properties = new ArrayList();
             Visitor visitor = new AntPropertyVisitor(properties);
@@ -609,12 +617,12 @@
                 String property = (String) iterator.next();
                 addTextElement(outTargetNode, "propertyDependency", property);
             }
-            
+
             // Add the raw XML content of the element
             String targetXml = targetNode.asXML();
             // Replace the CDATA end notation to avoid nested CDATA sections
             targetXml = targetXml.replace("]]>", "] ]>");
-            
+
             addTextElement(outTargetNode, "source", targetXml, true);
         }
     }
@@ -649,11 +657,11 @@
             if (commentText.startsWith("-"))
                 commentText = commentText.replace("-", "");
             commentText = commentText.trim();
-            
+
             String commentTextCheck = commentText.replace("deprecated>", "").replace("tt>", "").replace("todo>", "");
             if (commentTextCheck.contains(">") && !commentTextCheck.contains("</pre>"))
                 log("Warning: Comment code needs <pre> tags around it: " + commentText, Project.MSG_WARN);
-            
+
             commentText = filterTextNewlines(commentText);
             commentText = wikiModel.render(commentText);
 
@@ -683,7 +691,7 @@
         }
         // Get the documentation element as a document
         String documentationText = "<documentation>" + commentText +
-                                    "</documentation>";
+                                 "</documentation>";
         Document docDoc = DocumentHelper.parseText(documentationText);
         outNode.add(docDoc.getRootElement());
         log("HTML comment: " + commentText, Project.MSG_DEBUG);
@@ -727,6 +735,78 @@
         return out.toString();
     }
 
+    /**
+     * Method adds taskdef nodes to the specified project.
+     * 
+     * @param outProjectNode
+     * @throws IOException
+     */
+    private void buildTaskDefs( Element root ) throws DocumentException, IOException
+    {
+        Element projectElement = root.addElement("project");
+        projectElement.addElement("name");
+        insertDocumentation(projectElement, "");
+        HashMap < String, String > tasks = getHeliumAntTasks();
+
+        for ( String taskName : tasks.keySet() ) {
+            String className = tasks.get( taskName );
+            log("Processing TaskDef: " + taskName, Project.MSG_DEBUG);
+
+            Element outTaskDefNode = projectElement.addElement("taskdef");
+            addTextElement( outTaskDefNode, "name", taskName );
+            addTextElement( outTaskDefNode, "classname",  className );
+        }
+    }
+
+    /**
+     * Method returns all the helium ant tasks in the project.
+     * 
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    private HashMap < String, String > getHeliumAntTasks() {
+
+        // 1. Get all the task definitions from the project
+        Hashtable <String, Class<?> > allTaskdefs = getProject().getTaskDefinitions();
+        // 2. Filter the list by applying criteria
+        return filterTasks( allTaskdefs );
+    }
+
+    /**
+     * Method is used to filter tasks. 
+     * 
+     * @param allTaskdefs
+     * @param criteria
+     */
+    private HashMap < String, String > filterTasks ( Hashtable<String, Class<?> > allTaskdefs ) {
+        HashMap <String, String> tasks = new HashMap <String, String>();
+
+        Enumeration <String> taskdefsenum = allTaskdefs.keys();
+        while ( taskdefsenum.hasMoreElements () ) {
+            String key = taskdefsenum.nextElement();
+            Class<?> clazz = allTaskdefs.get(key);
+            String className = clazz.getName();
+            if ( key.contains("nokia.com") && className.startsWith("com.nokia") && 
+                    className.contains("ant.taskdefs") ) {
+                tasks.put( getTaskName( key ), clazz.getName() );
+            }
+        }
+        return tasks;
+    }
+
+    /**
+     * Returns the task name delimiting the helium namespace.
+     * 
+     * @param text
+     * @return
+     */
+    private String getTaskName( String text ) {
+        int lastIndex = text.lastIndexOf(':');
+        return text.substring( lastIndex + 1 );
+    }
+
+    //----------------------------------- PRIVATE CLASSES -----------------------------------------
+
     private class AntPropertyVisitor extends VisitorSupport
     {
         private List propertyList;
@@ -753,7 +833,7 @@
             String text = node.getText();
             extractUsedProperties(text);
         }
-        
+
         public void visit(Element node)
         {
             if (node.getName().equals("property"))
@@ -762,7 +842,7 @@
                 if (!propertyList.contains(propertyName))
                 {
                     propertyList.add(propertyName);
-                   log("property matches :" + propertyName, Project.MSG_DEBUG);
+                    log("property matches :" + propertyName, Project.MSG_DEBUG);
                 }
             }
         }
@@ -821,7 +901,7 @@
         {
             this.targetList = targetList;
         }
-        
+
         public AntTargetVisitor(List targetList, List logList, List signalList, List executableList)
         {
             this.targetList = targetList;
@@ -838,7 +918,7 @@
                 String text = node.attributeValue("target");
                 extractTarget(text);
             }
-            
+
             if (!name.equals("include") && !name.equals("exclude"))
             {
                 String text = node.attributeValue("name");
@@ -854,12 +934,12 @@
                 text = node.attributeValue("file");
                 addLog(text);
             }
-            
+
             if (name.equals("signal") || name.equals("execSignal"))
             {
                 String signalid = getProject().replaceProperties(node.attributeValue("name"));
                 String failbuild = signalType(signalid, signaldoc);
-                
+
                 if (signalList != null)
                 {
                     if (failbuild != null)
@@ -868,7 +948,7 @@
                         signalList.add(signalid);
                 }
             }
-            
+
             if (name.equals("exec") || name.equals("preset.exec"))
             {
                 String text = node.attributeValue("executable");
@@ -876,7 +956,7 @@
                 log("Executable: " + text, Project.MSG_DEBUG);
             }
         }
-        
+
         private void addLog(String text)
         {
             if (text != null && logList != null)
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/HeliumLogger.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/HeliumLogger.java	Wed Dec 23 19:29:07 2009 +0200
@@ -25,9 +25,8 @@
 import java.util.Date;
 import java.util.concurrent.TimeUnit;
 import java.util.Hashtable;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.Vector;
+import java.util.ArrayList;
+import java.util.Calendar;
 
 import org.apache.tools.ant.BuildEvent;
 import org.apache.tools.ant.Project;
@@ -71,7 +70,7 @@
 
     private Date targetStartTime;
 
-    private Hashtable targetTable;
+    private ArrayList<String> targetTable;
 
     private Hashtable tempStartTime;
 
@@ -88,7 +87,7 @@
         buildStartTime = new Date();
         endOfPreviousTarget = new Date();
 
-        targetTable = new Hashtable();
+        targetTable = new ArrayList<String>();
         tempStartTime = new Hashtable();
 
         // For Stage start time
@@ -140,12 +139,13 @@
      * Triggered when a target finishes.
      */
     public void targetFinished(BuildEvent event) {
-        String targetName = event.getTarget().getName();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String time = sdf.format(Calendar.getInstance().getTime());
+        
+        String targetName = time + "," + event.getTarget().getName();
 
         logTargetEvent(targetName, "finish");
-
         logTargetTime(targetName);
-
     }
 
     private void logTargetTime(String targetName) {
@@ -153,7 +153,7 @@
         long targetLengthMSecs = targetFinishTime.getTime()
                 - targetStartTime.getTime();
         Long outputSecs = TimeUnit.MILLISECONDS.toSeconds(targetLengthMSecs);
-        targetTable.put(outputSecs, targetName);
+        targetTable.add(targetName + "," + outputSecs.toString());
     }
 
     /**
@@ -164,27 +164,19 @@
             if (directory != null && new File(directory).exists()) {
                 try {
                     // Log target times to file
-                    String timesLogFileName = directory + File.separator
-                            + "targetTimesLog.csv";
+                    String timesLogFileName = directory + File.separator + project.getProperty("build.id") + "_targetTimesLog.csv";
                     File timesLogFile = new File(timesLogFileName);
 
-                    // Sort hashtable.
-                    Vector v = new Vector(targetTable.keySet());
-                    Collections.sort(v);
-
                     FileOutputStream timesLogFileStream = new FileOutputStream(
                             timesLogFileName, true);
                     DataOutputStream timesLogOut = new DataOutputStream(
                             timesLogFileStream);
                     // Display (sorted) hashtable.
-                    for (Enumeration e = v.elements(); e.hasMoreElements();) {
-                        Long key = (Long) e.nextElement();
-                        String val = (String) targetTable.get(key);
-                        timesLogOut.writeBytes(val + "," + key.toString()
-                                + "\n");
-                    }
+                    for (String s : targetTable)
+                        timesLogOut.writeBytes(s + "\n");
                     timesLogOut.close();
                 } catch (Exception ex) {
+                    // We are Ignoring the errors as no need to fail the build.
                     log.fatal("Exception has occurred", ex);
                     ex.printStackTrace();
                 }
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/ModelPropertiesParser.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/ModelPropertiesParser.java	Wed Dec 23 19:29:07 2009 +0200
@@ -31,6 +31,7 @@
 import org.dom4j.io.OutputFormat;
 import org.dom4j.io.SAXReader;
 import org.dom4j.io.XMLWriter;
+import org.apache.log4j.Logger;
 
 
 /**
@@ -42,6 +43,7 @@
     private String inputPath;
     private String outputPath;
     private Document doc;
+    private Logger log = Logger.getLogger(ModelPropertiesParser.class);
     
     public ModelPropertiesParser(String inputPath, String outputPath)
     {
@@ -78,7 +80,8 @@
             out.write(doc);
           }
         } catch (Exception e) {
-            e.printStackTrace();
+            //We are Ignoring the errors as no need to fail the build.
+            log.debug("Not able to write into XML Document " + e.getMessage());
         }
     }
     
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/XmlLogger.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/XmlLogger.java	Wed Dec 23 19:29:07 2009 +0200
@@ -111,7 +111,7 @@
         try {
             return DocumentBuilderFactory.newInstance().newDocumentBuilder();
         } catch (Exception exc) {
-            throw new ExceptionInInitializerError(exc);
+            throw new ExceptionInInitializerError(exc.getMessage());
         }
     }
 
@@ -191,12 +191,14 @@
             (new DOMElementWriter()).write(buildElement.element, out, 0, "\t");
             out.flush();
         } catch (IOException exc) {
-            throw new BuildException("Unable to write log file", exc);
+            throw new BuildException("Unable to write log file" + exc.getMessage());
         } finally {
             if (out != null) {
                 try {
                     out.close();
                 } catch (IOException e) {
+                    // We are Ignoring the errors as no need to fail the build.
+                    event.getProject().log("Not able to close the file handler " + e.getMessage(), Project.MSG_WARN);
                     e = null; // ignore
                 }
             }
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/antlib.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/antlib.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -30,7 +30,7 @@
     <taskdef name="database" classname="com.nokia.ant.taskdefs.DatabaseTask"/>
     <taskdef name="deconfigure" classname="com.nokia.ant.taskdefs.DeconfigureTask"/>
     <taskdef name="fastcopy" classname="com.nokia.ant.taskdefs.CopyParallelTask"/>
-    <taskdef name="getVariableValue" classname="com.nokia.ant.taskdefs.GetValueFromVariableSet"/>
+    <!-- <taskdef name="getVariableValue" classname="com.nokia.ant.taskdefs.GetValueFromVariableSet"/> -->
     <taskdef name="logrecord" classname="com.nokia.ant.taskdefs.LogRecorderTask"/>
     <taskdef name="logtoconsole" classname="com.nokia.ant.taskdefs.StopLogToConsole"/>
     <taskdef name="parsemodel" classname="com.nokia.ant.taskdefs.ModelPropertiesTask"/>
@@ -38,26 +38,26 @@
     <taskdef name="rebaseline" classname="com.nokia.ant.taskdefs.RebaselineTask"/>
     <taskdef name="hlmassertmessage" classname="com.nokia.ant.taskdefs.HlmAssertMessage"/>
     <taskdef name="retry" classname="com.nokia.ant.taskdefs.RetryTask"/>
+    <taskdef name="rebaseanddeconf" classname="com.nokia.ant.taskdefs.RBTTask"/>
     <typedef name="ldap" classname="com.nokia.ant.taskdefs.LDAP" />
     
-    <typedef name="arg" classname="com.nokia.ant.types.Variable"/>
-    <typedef name="cmdVar" classname="com.nokia.ant.types.Variable"/>
-    <typedef name="makeOption" classname="com.nokia.ant.types.Variable"/>
+    <!-- <typedef name="arg" classname="com.nokia.ant.types.Variable"/> -->
+    <!-- <typedef name="cmdVar" classname="com.nokia.ant.types.Variable"/> -->
+    <!-- <typedef name="makeOption" classname="com.nokia.ant.types.Variable"/> -->
     
-    <typedef name="argSet" classname="com.nokia.ant.types.VariableSet"/> 
-    <typedef name="cmdVarSet" classname="com.nokia.ant.types.VariableSet"/>
+    <!-- <typedef name="argSet" classname="com.nokia.ant.types.VariableSet"/> --> 
+    <!-- <typedef name="cmdVarSet" classname="com.nokia.ant.types.VariableSet"/> -->
     
-    <typedef name="imakerconfiguration" classname="com.nokia.ant.types.imaker.Configuration"/>
-    <typedef name="imakerconfigurationset" classname="com.nokia.ant.types.imaker.ConfigurationSet"/>
     <typedef name="logfilter" classname="com.nokia.ant.types.LogFilter"/> 
     <typedef name="logfilterset" classname="com.nokia.ant.types.LogFilterSet"/>
     
     <typedef name="prettyprintxml" classname="com.nokia.ant.filters.PrettyPrintXmlFilter"/>
-    <typedef name="sbsMakeOptions" classname="com.nokia.ant.types.SBSMakeOptions"/>
+    <!-- <typedef name="sbsMakeOptions" classname="com.nokia.ant.types.SBSMakeOptions"/> -->
     <typedef name="session" classname="com.nokia.ant.types.ccm.Session"/> 
     <typedef name="sessionset" classname="com.nokia.ant.types.ccm.SessionSet"/> 
     <typedef name="typedef" classname="com.nokia.ant.TypedefURIFix"/>
-    <typedef name="variable" classname="com.nokia.ant.types.imaker.Variable"/> 
-    <typedef name="variableset" classname="com.nokia.ant.types.imaker.VariableSet"/>
+    
+    <typedef name="hasAtsPassed" classname="com.nokia.ant.AtsCondition"/>
+    <typedef name="exec" classname="com.nokia.ant.taskdefs.HlmExecTask"/>
 
 </antlib>
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/TracingLogger.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/TracingLogger.java	Wed Dec 23 19:29:07 2009 +0200
@@ -81,9 +81,7 @@
         }
         catch (FileNotFoundException e)
         {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-            throw new BuildException(e.getMessage());
+            throw new BuildException(e.getMessage(), e);
         }
     }
 
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/EmailDataSender.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/EmailDataSender.java	Wed Dec 23 19:29:07 2009 +0200
@@ -106,7 +106,8 @@
             log.debug("Sending data.");
             Transport.send(message);
         } catch (Exception e) {
-            log.error("Internal data failure: " + e.getMessage());
+            // We are Ignoring the errors as no need to fail the build.
+            log.debug("Internal data failure: " + e.getMessage(), e);
         }        
     }
 
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/Listener.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/Listener.java	Wed Dec 23 19:29:07 2009 +0200
@@ -46,11 +46,11 @@
     // Root node.
     private BuildNode buildNode;
     
-    // Ant build Stack. Usefull to associate with current parent.
+    // Ant build Stack. Useful to associate with current parent.
     private EndLessStack<DataNode> buildEventStack = new EndLessStack<DataNode>();
     
     // default list of properties to extract.
-    private String[] propList = {"os.name", "user.name", "build.name", "build.number", "build.id", "build.system", "env.NUMBER_OF_PROCESSORS", "helium.version", "env.SYMSEE_VERSION", "diamonds.build.id"};
+    private String[] propList = {"os.name", "user.name", "build.name", "build.number", "build.id", "build.family", "build.system", "env.NUMBER_OF_PROCESSORS", "helium.version", "env.SYMSEE_VERSION", "diamonds.build.id"};
 
     // Memory bean 
     private MemoryMXBean mbean;
@@ -71,7 +71,8 @@
                     Database antDB = new Database((Project)buildNode.getReference(), null, null);
                     database = antDB.createDOM();
                 } catch (Exception e) {
-                    System.out.println("Warning: couldn't generate Ant DB.");
+                    // We are Ignoring the errors as no need to fail the build.
+                    log.debug("Error: couldn't generate Ant DB.", e);
                     database = null;
                 }
             }
@@ -88,8 +89,8 @@
                 log.debug(xml);
                 sender.sendData(xml);
             } catch (Exception e) {
-                log.debug("Warning: error generating the XML.");
-                e.printStackTrace();
+                // We are Ignoring the errors as no need to fail the build.
+                log.debug("Error: error generating the InterData database XML.", e);
             }
         }
     }
@@ -104,10 +105,10 @@
         Hashtable<String, String> properties = new Hashtable<String, String>();
         if (buildNode != null) {
             Project project = (Project)buildNode.getReference();
-            Hashtable projProps = project.getProperties();
+            Hashtable<String, String> projProps = project.getProperties();
             for (int i = 0; i < propList.length; i++) {
                 if (projProps.containsKey(propList[i])) {
-                    properties.put(propList[i], (String)projProps.get(propList[i]));
+                    properties.put(propList[i], projProps.get(propList[i]));
                 }
             }
         }
@@ -133,7 +134,6 @@
     }
 
     public synchronized void buildStarted(BuildEvent event) {
-        log.debug("buildStarted");
         if (buildNode == null) {
             // Create data node for a build
             buildNode = new BuildNode(null, event.getProject());
@@ -143,7 +143,6 @@
     }
 
     public synchronized void subBuildFinished(BuildEvent event) {
-        log.debug("subBuildFinished");
         if (buildNode != null) {
             BuildNode node = (BuildNode)buildNode.find(event.getProject());
             if (node != null) {
@@ -158,7 +157,6 @@
     }
 
     public synchronized void subBuildStarted(BuildEvent event) {
-        log.debug("subBuildStarted");
         DataNode parentNode = buildEventStack.peek();
         if (parentNode != null) {
             BuildNode node = new BuildNode(parentNode, event.getProject());
@@ -171,7 +169,6 @@
     }
 
     public synchronized void targetFinished(BuildEvent event) {
-        //log.debug("targetFinished");
         if (buildNode != null) {
             DataNode node = buildNode.find(event.getTarget());
             if (node != null) {
@@ -189,7 +186,6 @@
     }
 
     public synchronized void targetStarted(BuildEvent event) {
-        //log.debug("targetStarted");
         DataNode parentNode = buildEventStack.peek();
         if (parentNode != null) {
             TargetNode node = new TargetNode(parentNode, event.getTarget());
@@ -203,30 +199,11 @@
     }
 
     public synchronized void taskFinished(BuildEvent event) {
-        //log.debug("taskFinished");
-        if (buildNode != null) {
-            DataNode node = buildNode.find(event.getTask());
-            if (node != null) {
-                node.setEndTime(new Date());
-                node.setReference(null);
-            } else {
-                log.debug("taskFinished - could not find task.");
-            }
-        }
+        // Ignoring task information
     }
 
     public synchronized void taskStarted(BuildEvent event) {
-        //log.debug("taskStarted");
-        if (buildNode != null) {
-            DataNode parentNode = buildNode.find(event.getTask().getOwningTarget());
-            if (parentNode != null) {
-                //log.debug("taskStarted - pushing using owning parent");
-                new TaskNode(parentNode, event.getTask());
-            } else {
-                //log.debug("taskStarted - pushing using stack");
-                new TaskNode(buildEventStack.peek(), event.getTask());
-            }
-        }
+        // Ignoring task information
     }
     
     public void addAssertTask(HlmAssertMessage assertTask) { 
@@ -240,5 +217,4 @@
         }
         
     }
-    
 }
\ No newline at end of file
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/TaskNode.java	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
- 
-package com.nokia.ant.listener.internaldata;
-
-import org.apache.tools.ant.Task;
-import java.util.Date;
-/**
- * Object to set end time for a task.
- *
- */
-public class TaskNode extends DataNode {
-
-    private String name;
-
-    // location
-    private String filename;
-    private int line = -1;
-
-    public TaskNode(DataNode parent, Task task) {
-        super(parent, task);
-        this.setFilename(task.getLocation().getFileName());
-        this.setLine(task.getLocation().getLineNumber());        
-        name = task.getTaskName();
-    }
-
-    public String getName() {
-        return name;
-    } 
-
-    public String getFilename() {
-        return filename;
-    }
-
-    public void setFilename(String filename) {
-        this.filename = filename;
-    }
-
-    public int getLine() {
-        return line;
-    }
-
-    public void setLine(int line) {
-        this.line = line;
-    }
-
-    public void setEndTime(Date endTime) {
-        super.setEndTime(endTime);
-        if ((endTime.getTime() - getStartTime().getTime() < 1000) && isEmpty() && getParent() != null) {
-            getParent().remove(this);
-        }
-    }
-
-}
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/XMLRenderer.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/listener/internaldata/XMLRenderer.java	Wed Dec 23 19:29:07 2009 +0200
@@ -24,7 +24,6 @@
 import java.io.ByteArrayOutputStream;
 
 import org.dom4j.Document;
-//import org.dom4j.DefaultDocumentType;
 import org.dom4j.DocumentHelper;
 import org.dom4j.Element;
 import org.dom4j.io.XMLWriter;
@@ -48,21 +47,17 @@
     private Hashtable<String, String> properties;
     // the toplevel node.
     private BuildNode root;
-    private BuildEvent buildEvent;
-    
     // Helium content database. 
     private Document database;
     
     // Deps hashes: helper to remove duplicates.
     private Vector<String> targetList = new Vector<String>();
-    private Vector<String> taskList = new Vector<String>();
     private Vector<String> assertList = new Vector<String>();
     
     public XMLRenderer(BuildNode root, Document database, Hashtable<String, String> properties, BuildEvent event) {
         this.root = root; 
         this.database = database;
         this.properties = properties;
-        this.buildEvent = event;
     }
 
     /**
@@ -97,37 +92,6 @@
             createTarget(root, targets);
         }
     }
-
-    /**
-     * Generating task only for TargetNode type of node
-     * @param node
-     * @param targets
-     */
-    protected void createTask(DataNode node, Element targets) {
-        if (node instanceof TaskNode) {            
-            TaskNode taskNode = (TaskNode)node;
-            if (!taskList.contains(taskNode.getName())) {
-                taskList.add(taskNode.getName());
-                Element target = targets.addElement("task");
-                target.addAttribute("id", "task@" + taskList.indexOf(taskNode.getName()));
-                target.addAttribute("name", taskNode.getName());                
-            }
-        }
-        for (Iterator<DataNode> i = node.iterator() ; i.hasNext() ; ) {
-            createTask(i.next(), targets);
-        }
-    }    
-    
-    /**
-     * Creating the task section.
-     * @param statistics
-     */
-    protected void createTasks(Element statistics) {
-        Element tasks = statistics.addElement("tasks");
-        if (root != null) {
-            createTask(root, tasks);
-        }
-    }
     
     /**
      * Creating the assert section.
@@ -154,7 +118,6 @@
                 Element target = targets.addElement("assert");
                 target.addAttribute("id", "assert@" + assertList.indexOf(assertNode.getAssertName()));
                 target.addAttribute("name", assertNode.getAssertName());
-                //target.addAttribute("assertname", assertNode.getAssertName());
                 target.addAttribute("file", assertNode.getFilename());
                 target.addAttribute("line", "" + assertNode.getLine());
                 target.addAttribute("message", "" + assertNode.getMessage());
@@ -192,13 +155,6 @@
             elt.addAttribute("startCommittedHeap", "" + targetNode.getStartCommittedHeap());
             elt.addAttribute("endUsedHeap", "" + targetNode.getEndUsedHeap());
             elt.addAttribute("endCommittedHeap", "" + targetNode.getEndCommittedHeap());
-        } else if (node instanceof TaskNode) {
-            TaskNode taskNode = (TaskNode)node;
-            elt = tree.addElement("taskRef");
-            elt.addAttribute("reference", "task@" + taskList.indexOf(taskNode.getName()));
-            elt.addAttribute("startTime", "" + taskNode.getStartTime().getTime());
-            elt.addAttribute("endTime", "" + taskNode.getEndTime().getTime());
-            elt.addAttribute("thread", "" + taskNode.getThreadId());
         } else if (node instanceof AssertNode) {
             AssertNode assertNode = (AssertNode)node;
             if (assertNode.getAssertName() != null) {
@@ -257,15 +213,12 @@
     public String toString() {
         // Creating the XML document
         Document document = DocumentHelper.createDocument();
-        // DefaultDocumentType(String elementName, String publicID, String systemID) 
-        //document.setDocType(new DefaultDocumentType());
         Element statistics = document.addElement( "statistics" );
-        statistics.addAttribute("version", "1.0");
+        statistics.addAttribute("version", "1.1");
         
         // Creating the document content.
         insertDatabase(statistics);
         createTargets(statistics);
-        createTasks(statistics);
         createAsserts(statistics);
         createExecutionTree(statistics);
         createProperties(statistics);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AbstractScmBaseTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,451 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: 
+ *
+ */
+package com.nokia.ant.taskdefs;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+
+/**
+ * <code>AbstractScmBaseTask</code> is an abstract class for GSCM related tasks
+ * such as rebaseline and deconfigure.
+ * 
+ * @author hacs
+ * @ant.task category="SCM"
+ * 
+ */
+public abstract class AbstractScmBaseTask extends Task {
+
+  // common attributes
+  private String database; // -d dbname = Database name (or database path)
+  private String password; // -U password = UNIX password
+  private String ccmProject; // -p projectname = Project name (incompatible
+  // with -B)
+
+  private Integer verbosity;
+
+  private StringBuffer commandString = new StringBuffer();
+  private List<SCMCommandArgument> commands = new ArrayList<SCMCommandArgument>();
+
+  /**
+   * Return the Synergy project name.
+   * 
+   * @return the Synergy project name.
+   */
+  public String getCcmProject() {
+    return ccmProject;
+  }
+
+  /**
+   * Set Synergy Project Name to be used.
+   * 
+   * @param ccmProject
+   *            is the Synergy project name to set
+   * @ant.required
+   */
+  public void setCcmProject(String ccmProject) {
+    this.ccmProject = ccmProject;
+    log("Set ccmProject to " + ccmProject);
+  }
+
+  /**
+   * Return the database name.
+   * 
+   * @return the database name.
+   */
+  public String getDatabase() {
+    return database;
+  }
+
+  /**
+   * Set Synergy Database name to be used.
+   * 
+   * @param database
+   *            is the name of the Synergy database to set.
+   * @ant.required
+   */
+  public void setDatabase(String database) {
+    this.database = database;
+    log("Set database to " + database);
+  }
+
+  /**
+   * Return the Synergy password.
+   * 
+   * @return the Synergy password.
+   */
+  public String getPassword() {
+    return password;
+  }
+
+  /**
+   * Set Synergy Password to be used.
+   * 
+   * @param password
+   *            is the password to set.
+   * @ant.required
+   */
+  public void setPassword(String password) {
+    this.password = password;
+    log("Set password to ****** ");
+  }
+
+  /**
+   * Return the verbosity.
+   * 
+   * @return the verbosity.
+   */
+  public Integer getVerbosity() {
+    return verbosity;
+  }
+
+  /**
+   * Set verbosity level to be used. Verbosity level ( 0 - quiet, 1 - verbose,
+   * 2 - very verbose). Exception will be raised for any other value.
+   * 
+   * @param verbosity
+   *            is the verbosity level to set.
+   * @ant.not-required
+   */
+  public void setVerbosity(Integer verbosity) {
+    this.verbosity = verbosity;
+    log("Set verbosity to " + verbosity);
+  }
+
+  /**
+   * Method executes the current task.
+   * 
+   */
+  @Override
+  public void execute() {
+    try {
+      // Set execution script
+      setExecutionScript();
+
+      // Build command argument list
+      buildCommandList();
+
+      // handle the command arguments
+      handleCommandArguments();
+
+      // configure verbosity
+      configureVerbosity();
+
+      // Execute the command-line launching as a separate process
+      runCommand();
+      log("Completed successfully.");
+    } catch (Throwable th) {
+      th.printStackTrace();
+      if (th instanceof BuildException) {
+        throw (RuntimeException) th;
+      } else {
+        raiseError("Script execution failure.");
+      }
+    }
+  }
+
+  /**
+   * Method appends the given prefix and the command to the command string if
+   * the input cmd string is not null.
+   * 
+   * @param prefix
+   *            is the prefix of the cmd string input.
+   * @param cmd
+   *            is the cmd string to be appended to main command string.
+   */
+  protected void append2CommandString(String prefix, Object cmd) {
+    if (cmd != null) {
+      commandString.append(prefix);
+      commandString.append(" ");
+      commandString.append(cmd);
+      commandString.append(" ");
+    }
+  }
+
+  /**
+   * Method appends the given prefix to the command string if the boolean
+   * value input is set true.
+   * 
+   * @param prefix
+   *            is the prefix to be appended to the command string.
+   * @param bool
+   *            indicates whether to append the prefix or not.
+   */
+  protected void append2CommandString(String prefix, Boolean bool) {
+    if (bool != null && bool) {
+      append2CommandString(prefix);
+    }
+  }
+
+  /**
+   * Method appends the given cmd to the command string.
+   * 
+   * @param cmd
+   *            is the command string to be appended.
+   */
+  protected void append2CommandString(String cmd) {
+    commandString.append(cmd);
+    commandString.append(" ");
+  }
+
+  /**
+   * Method is used to throw a {@link BuildException} with the specified error
+   * message.
+   * 
+   * @param errorMessage
+   *            is the error message.
+   */
+  protected void raiseError(String errorMessage) {
+    StringBuffer buffer = new StringBuffer("[").append(getTaskName())
+        .append("] Error: ").append(errorMessage);
+    throw new BuildException(buffer.toString());
+  }
+
+  /**
+   * Add the given command argument to the command list.
+   * 
+   * @param fieldName
+   *            is the name of the task field.
+   * @param cmdArg
+   *            is the command argument to be added to the command list.
+   * @param required
+   *            indicates whether the command argument is mandatory or not.
+   * @param fieldValue is the value of the given field           
+   */
+  protected void addCommandArg(String fieldName, String cmdArg,
+      Boolean required, Object fieldValue ) {
+    SCMCommandArgument cmdObj = new SCMCommandArgument(fieldName, cmdArg,
+        required, fieldValue );
+    commands.add(cmdObj);
+  }
+
+  /**
+   * Add the given command argument to the command list. By default, the input
+   * command argument will be optional.
+   * 
+   * @param fieldName
+   *            is the name of the task field.
+   * @param cmdArg
+   *            is the command argument to be added to the command list.
+   * @param fieldValue is the value of the given field           
+   */
+  protected void addCommandArg(String fieldName, String cmdArg, Object fieldValue ) {
+    addCommandArg(fieldName, cmdArg, false, fieldValue);
+  }
+
+  /**
+   * Method validates the given arguments.
+   */
+  protected abstract void validateArguments();
+
+  /**
+   * Set the execution script.
+   * 
+   */
+  protected abstract void setExecutionScript();
+
+  /**
+   * Build a command list consisting of all the required and optional command
+   * arguments of the current task.
+   */
+  protected abstract void buildCommandList();
+
+  /**
+   * Method returns the correct verbosity level for the input choice.
+   * 
+   * @param choice
+   *            is the verbosity choice set by user.
+   * @return the verbosity level to set.
+   */
+  protected abstract String getVerbosity(int choice);
+
+  // ----------------------------------- PRIVATE METHODS  --------------------------------------
+
+  /**
+   * Method returns the requested {@link Field} object from the input
+   * {@link Class}. If the requested field is not found in the given
+   * {@link Class} then all its super classes are searched recursively.
+   * 
+   * @param clazz
+   *            is the {@link Class} of which the field is requested.
+   * @param fieldName
+   *            is the name of the requested field.
+   * @return the requested field.
+   */
+  private Field getField(Class<?> clazz, String fieldName) {
+    Field field = null;
+    if (clazz != null) {
+      try {
+        field = clazz.getDeclaredField(fieldName);
+      } catch (NoSuchFieldException nsfe) {
+        field = getField(clazz.getSuperclass(), fieldName);
+      }
+    }
+    return field;
+  }
+
+  /**
+   * Method process the command arguments set in the command list.
+   * 
+   * @throws Exception
+   *             if any error occurs while processing the command arguments.
+   */
+  private void handleCommandArguments() throws Exception {
+    StringBuffer missingArgs = new StringBuffer();
+    Field field = null;
+    for (SCMCommandArgument cmdObj : commands) {
+      field = getField(getClass(), cmdObj.fieldName);
+      if (field != null) {
+        Object fieldValue = field.getType().cast( cmdObj.fieldValue );
+        check4MandatoryCmdArguments(cmdObj, fieldValue, missingArgs);
+        buildCommand(cmdObj, fieldValue);
+      }
+    }
+    // handle missing args if any
+    handleMissingArguments(missingArgs);
+    validateArguments();
+  }
+
+  /**
+   * Method checks for the mandatory command arguments.
+   * 
+   * @param cmdObj
+   *            is the {@link SCMCommandArgument} used in verification
+   * @param fieldValue
+   *            is the field value to verify
+   * @param missingArgs
+   *            contains the mandatory command arguments which are missing.
+   */
+  private void check4MandatoryCmdArguments(SCMCommandArgument cmdObj,
+      Object fieldValue, StringBuffer missingArgs) {
+    if (cmdObj.required && fieldValue == null) {
+      missingArgs.append(cmdObj.fieldName);
+      missingArgs.append(" ");
+    }
+  }
+
+  /**
+   * Method is used to construct an executable command string.
+   * 
+   * @param cmdObj
+   *            is the {@link SCMCommandArgument}
+   * @param fieldValue
+   *            is the fieldValue containing the actual command argument.
+   */
+  private void buildCommand(SCMCommandArgument cmdObj, Object fieldValue) {
+    if (fieldValue instanceof Boolean) {
+      append2CommandString(cmdObj.commandArgument, (Boolean) fieldValue);
+    } else {
+      append2CommandString(cmdObj.commandArgument, fieldValue);
+    }
+  }
+
+  /**
+   * Method throws a {@link BuildException} if any mandatory command arguments
+   * are missing.
+   * 
+   * @param missingArgs
+   *            is the {@link StringBuffer} consisting of mandatory command
+   *            arguments which are missing.
+   */
+  private void handleMissingArguments(StringBuffer missingArgs) {
+    if (missingArgs.length() > 0) {
+      raiseError("mandatory attributes are not defined - "
+          + missingArgs.toString());
+    }
+  }
+
+  /**
+   * Configure the verbosity set by the user.
+   */
+  private void configureVerbosity() {
+    if (verbosity != null) {
+      append2CommandString(getVerbosity(verbosity));
+    }
+  }
+
+  /**
+   * Execute the specified command.
+   * 
+   * @throws Exception
+   *             if execution fails or any error occurs while execution of the
+   *             command.
+   */
+  private void runCommand() throws Exception {
+    String[] cmdline = commandString.toString().split(" ");
+    /*
+     * Note: static method call to Execute.runCommand doesnot run the given
+     * perl script here due to the setting of vmLauncher which acutally
+     * tries executing the script using Runtime.getRuntime().exec() method
+     * and this method cannot run the script without reference to the cmd or
+     * shell. (Similar with ExecTask)
+     * 
+     * So creating an instance of Execute class helps to disable the
+     * vmLauncher and an OS dependent shellLauncher will be available for
+     * the execution of the script.
+     */
+    Execute exe = new Execute(new LogStreamHandler(this, Project.MSG_INFO,
+        Project.MSG_ERR));
+    exe.setAntRun(getProject());
+    exe.setCommandline(cmdline);
+    exe.setVMLauncher(false);
+    int retval = exe.execute();
+    if (Execute.isFailure(retval)) {
+      throw new RuntimeException(cmdline[0] + " failed with return code "
+          + retval);
+    }
+  }
+
+  // ************************************* PRIVATE CLASSES ***************************************
+
+  /**
+   * <code>SCMCommandArgument</code> is a private class and represents a
+   * normal java bean which is used to hold the information related to SCM
+   * command arguments.
+   */
+  private class SCMCommandArgument {
+
+    private String fieldName;
+    private Object fieldValue;
+    private String commandArgument;
+    private Boolean required;
+
+    /**
+     * Create an instance of {@link SCMCommandArgument}.
+     * 
+     * @param fieldName
+     *            is the name of the task field
+     * @param commandArg
+     *            is the SCM command argument
+     * @param reqd
+     *            indicates the input command argument is mandatory or not.
+     */
+    protected SCMCommandArgument(String fieldName, String commandArg,
+        Boolean reqd, Object fieldValue ) {
+      this.fieldName = fieldName;
+      this.commandArgument = commandArg;
+      this.required = reqd;
+      this.fieldValue = fieldValue;
+    }
+  }
+}
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AntConfigurationTask.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AntConfigurationTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -20,7 +20,6 @@
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Iterator;
-
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Task;
 import org.apache.tools.ant.types.FileSet;
@@ -94,7 +93,6 @@
                 while (resourceIter.hasNext())
                 {
                     FileResource filepath = (FileResource) resourceIter.next();
-                    log(filepath.toString());
                     importFile(filepath.getFile());
                 }
             }
@@ -119,15 +117,12 @@
             while (keysIter.hasNext())
             {
                 String key = (String) keysIter.next();
-                log(key);
                 getProject().setProperty(key, config.getString(key));
             }
         }
         catch (ConfigurationException e)
         {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-            throw new BuildException(e.getMessage());
+            throw new BuildException("Not able to import the ANT file " + e.getMessage());
         }
     }
 }
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AntDependencyTask.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AntDependencyTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -39,7 +39,7 @@
 {
     private ArrayList antFileSetList = new ArrayList();
     private String outputFile;
-
+    
     public AntDependencyTask()
     {
         setTaskName("AntDependencyTask");
@@ -87,10 +87,13 @@
                     if (jar.getJarEntry(name) != null)
                         return fileName;
                 }
-                catch (IOException e) { e.printStackTrace(); }
+                catch (IOException e) { 
+                    // We are Ignoring the errors as no need to fail the build.
+                    log(e.getMessage(), Project.MSG_DEBUG);
+                }
             }
         }
-        log(name + " not found");
+        log(name + " not found", Project.MSG_DEBUG);
         return null;
     }
     
@@ -116,7 +119,8 @@
                 }
             }
         } catch (IOException e) {
-            e.printStackTrace();
+            // We are Ignoring the errors as no need to fail the build.
+            log("Not able to get the JAR file attribute information. " + e.getMessage(), Project.MSG_DEBUG);
         }
         return null;
     }
@@ -160,7 +164,10 @@
                         vendor = "";
                     classlist.add(name + " [style=filled,shape=record,label=\"" + nameandversion + "|" + vendor + "\"];");
                 }
-                catch (IOException e) { e.printStackTrace(); }
+                catch (IOException e) { 
+                    // We are Ignoring the errors as no need to fail the build.
+                    e.printStackTrace(); 
+                }
             }
         }
 
@@ -176,15 +183,14 @@
             if (entry != null)
             {
               /**/
-                System.out.println(name);
-            
+                log("File in " + name + " in jar file ", Project.MSG_DEBUG);
                 byte[] data = new byte[1024];
                 jar.getInputStream(entry).read(data);
                 for (String line : new String(data).split("\n"))
                 {
                     if (line.contains("License") || line.contains("LICENSE ") || line.contains("Copyright"))
                     {
-                        System.out.println(line.replace("*", "").trim());
+                        log("Replace License information with * " + line.replace("*", "").trim(), Project.MSG_INFO);
                         break;
                     }
                 }
@@ -216,7 +222,6 @@
                                 url = new URL(mavenUrl + filename + "maven-metadata.xml");
                                 connection = (HttpURLConnection) url.openConnection();
                             }
-                            //System.out.println(url);
                             if (connection.getResponseCode() == HttpURLConnection.HTTP_OK)
                             {   
                                 
@@ -232,7 +237,6 @@
                                 {
                                     String version = ((Element)tmpversion).getText();
                                     URL url2 = new URL(mavenUrl + specialfilename + "/" + version + "/" + end + "-" + version + ".pom");
-                                    //System.out.println(url2);
                                     HttpURLConnection connection2 = (HttpURLConnection) url2.openConnection();
                                     if (connection2.getResponseCode() == HttpURLConnection.HTTP_OK)
                                     {
@@ -249,9 +253,6 @@
                                         String license = antDoc2.valueOf("/project/licenses/license/name");
                                         if (!license.equals(""))
                                         {
-                                            System.out.println(name);
-                                            //System.out.println(antDoc2.valueOf("/project/name"));
-                                            System.out.println(license);
                                             found = true;
                                             break;
                                         }
@@ -264,10 +265,13 @@
                     
                 }
                 if (!found)
-                    System.out.println(name + " not found");
+                    log(name + " not found in " + jar, Project.MSG_INFO);
             }
         }
-        catch (Exception e) { e.printStackTrace(); }
+        catch (Exception e) {
+            // We are Ignoring the errors as no need to fail the build.
+            e.printStackTrace(); 
+        }
     }
     
     public boolean digitInString(String s) {
@@ -328,7 +332,9 @@
                 output.write(value + "\n");
             
             output.close();
-        } catch (Exception e) { e.printStackTrace();
+        } catch (Exception e) {
+            // We are Ignoring the errors as no need to fail the build.
+            log("Exception occured while getting the ANT task dependency information. " + e.getMessage(), Project.MSG_DEBUG);
         }
     }
 
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AntLintTask.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/AntLintTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -173,7 +173,6 @@
     {
         try
         {
-            log("Running antlint..", Project.MSG_DEBUG);
             Project project = getProject();
             
             getConfiguration();//loads configuration file
@@ -214,7 +213,7 @@
         }
         catch (Exception e)
         {
-            e.printStackTrace();
+            throw new BuildException("Exception occured while running AntLint task " + e.getMessage());
         }
         
         for (AntFile s : antFilelist)
@@ -263,7 +262,7 @@
         }
         catch (Exception e)
         {
-            e.printStackTrace();
+            throw new BuildException("W: INVALID File Name: " + text + e.getMessage());
         }
     }
     
@@ -319,7 +318,7 @@
         }
         catch (Exception e)
         {
-            e.printStackTrace();
+            throw new BuildException("Not able to read the ANT lint Configuration file " + configurationPath );
         }
 
     }
@@ -357,6 +356,15 @@
                 {
                     checkDefName(text);
                 }
+                
+                List attributeList = node.elements("attribute");
+                for (Iterator iterator = attributeList.iterator(); iterator.hasNext();)
+                {
+                    Element attributeElement = (Element) iterator.next();
+                    String attributeName = attributeElement.attributeValue("name");
+                    checkDefName(attributeName);
+                }
+                
             }
             
             if (name.equals("scriptdef"))
@@ -464,10 +472,17 @@
             new File(heliumpath + File.separator + "python").mkdirs();
             File file = new File(heliumpath + File.separator + "python" + File.separator + "target" + scriptdefname + ".py");
             PrintWriter output = new PrintWriter(new FileOutputStream(file));
-            output.write(text);
+            if (!text.equals(""))
+            {
+                output.write("def abc():");
+                for (String t : text.split("\n"))
+                    output.write("    " + t + "\n");
+            }
             output.close();
             checkPropertiesInText(text);
-            } catch (Exception e) { e.printStackTrace(); }
+            } catch (Exception e) { 
+                throw new BuildException("Not able to write python file " + scriptdefname + ".py" );
+             }
         }
         
         private void writeBeanshellFile(String scriptdefname, String text)
@@ -495,7 +510,9 @@
             }
             output.write("} }");
             output.close();
-            } catch (Exception e) { e.printStackTrace(); }
+            } catch (Exception e) {
+                throw new BuildException("Not able to write Beanshell File " + scriptdefname + ".java" );
+            }
         }
         
         private void writeJepFile(String scriptdefname, String text)
@@ -511,13 +528,14 @@
             new File(heliumpath + File.separator + "jep").mkdirs();
             File file = new File(heliumpath + File.separator + "jep" + File.separator + scriptdefname + "_jep.py");
             PrintWriter output = new PrintWriter(new FileOutputStream(file));
-            output.write("attributes = {} # pylint: disable-msg=C0103\n");
-            output.write("elements = {} # pylint: disable-msg=C0103\n");
-            output.write("project = None # pylint: disable-msg=C0103\n");
-            output.write("self = None # pylint: disable-msg=C0103\n");
+            output.write("def abc():\n");
+            output.write("    attributes = {} # pylint: disable-msg=C0103\n");
+            output.write("    elements = {} # pylint: disable-msg=C0103\n");
+            output.write("    project = None # pylint: disable-msg=C0103\n");
+            output.write("    self = None # pylint: disable-msg=C0103\n");
             text = text.replace(" File(", " self.File(");
-            
-            output.write(text);
+            for (String t : text.split("\n"))
+                output.write("    " + t + "\n");
             output.close();
             
             if (text.contains("import "))
@@ -535,7 +553,9 @@
                 output2.write("    print '" + scriptdefname + " failed: ' + str(e)\n");
                 output2.close();
             }
-            } catch (Exception e) { e.printStackTrace(); }
+            } catch (Exception e) { 
+                throw new BuildException("Not able to write JEP File " + scriptdefname + "_jep.py" ); 
+              }
         }
         
         private void checkJepPropertiesInText(String text)
@@ -618,7 +638,9 @@
             try {
             File model = new File(project.getProperty("data.model.parsed"));
             antDoc = xmlReader.read(model);
-            } catch (Exception e) { e.printStackTrace(); }
+            } catch (Exception e) { 
+                throw new BuildException("Not able to read data model file " + project.getProperty("data.model.parsed")); 
+             }
             
             List<Node> statements = antDoc.selectNodes("//property");
             
@@ -647,31 +669,35 @@
             }
             catch (Exception e)
             {
-                e.printStackTrace();
+                throw new BuildException("Not able to match the target name for " + text);
             }
         }
         
         private void checkUseOfIf(Element node)
         {
             String target = node.attributeValue("name");
-            String targetxpath = "//target[@name='" + target + "']/if";
+            String targetxpath = "//target[@name='" + target + "']//if";
             
-            List conditiontest = node.selectNodes(targetxpath + "/then/property");
-            if (conditiontest != null && conditiontest.size() == 1)
+            List<Node> statements2 = node.selectNodes(targetxpath);
+            for (Node statement : statements2)
             {
-                if (node.selectSingleNode(targetxpath + "/else") == null)
+                List conditiontest = statement.selectNodes("./then/property");
+                if (conditiontest != null && conditiontest.size() == 1)
                 {
-                    log("W: Target " + target + " poor use of if-then-property statement, use condition task");
-                    currentFile.incWarningCount();
-                }
-                else
-                {
-                    List conditiontest2 = node.selectNodes(targetxpath + "/else/property");
+                    List conditiontest2 = statement.selectNodes("./else/property");
                     if (conditiontest2 != null && conditiontest2.size() == 1)
                     {
                         log("W: Target " + target + " poor use of if-else-property statement, use condition task");
                         currentFile.incWarningCount();
                     }
+                    else
+                    {
+                        if (statement.selectNodes("./else").size() == 0)
+                        {
+                            log("W: Target " + target + " poor use of if-then-property statement, use condition task");
+                            currentFile.incWarningCount();
+                        }
+                    }
                 }
             }
             
@@ -741,7 +767,7 @@
             }
             catch (Exception e)
             {
-                e.printStackTrace();
+                throw new BuildException("Not able to match the Property Name for " + text);
             }
         }
         
@@ -759,7 +785,7 @@
             }
             catch (Exception e)
             {
-                e.printStackTrace();
+                throw new BuildException("Not able to match the MacroDef Name for " + text);
             }
         }
         
@@ -779,7 +805,7 @@
             }
             catch (Exception e)
             {
-                e.printStackTrace();
+                throw new BuildException("Not able to get Target Dependency for " + text);
             }
             finally
             {
@@ -827,7 +853,7 @@
             }
             catch (Exception e)
             {
-                e.printStackTrace();
+                throw new BuildException("Not able to match Project Name for " + text);
             }
         }
     }
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/CopyParallelTask.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/CopyParallelTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -71,7 +71,10 @@
             }
             catch (InterruptedException e)
             {
-                e.printStackTrace();
+                if (failonerror) {
+                    throw new BuildException("Copy parallel task has been interrupted " + e.getMessage());
+                }
+                log("Copy parallel task has been interrupted " + e.getMessage(), Project.MSG_ERR);
             }
        }
        
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/CoverageRecorderEntry.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/CoverageRecorderEntry.java	Wed Dec 23 19:29:07 2009 +0200
@@ -111,7 +111,7 @@
         try {
             return DocumentBuilderFactory.newInstance().newDocumentBuilder();
         } catch (Exception exc) {
-            throw new ExceptionInInitializerError(exc);
+            throw new ExceptionInInitializerError(exc.getMessage());
         }
     }
     
@@ -430,7 +430,7 @@
             (new DOMElementWriter()).write(buildElement.element, out, 0, "\t");
             out.flush();
         } catch (IOException exc) {
-            throw new BuildException("Unable to write log file", exc);
+            throw new BuildException("Unable to write log file " + exc.getMessage(), exc);
         } finally {
             if (out != null) {
                 try {
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/DatabaseTask.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/DatabaseTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -76,9 +76,7 @@
         }
         catch (Exception e)
         {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-            throw new BuildException(e.getMessage());
+            throw new BuildException("Not able to build the ANT project Database " + e.getMessage());
         }
     }
 
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/DeconfigureTask.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/DeconfigureTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -1,135 +1,103 @@
 /*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: 
+ *
+ */
 
 package com.nokia.ant.taskdefs;
 
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Execute;
 
 /**
  * ANT wrapper task for the GSCM deconfigure.pl script.
+ * 
  * @ant.task category="SCM"
  */
-public class DeconfigureTask extends Task
-{
-    // The attributes of this task
-    private String database;
-    private String projectName;
-    private String password;
-    private Boolean considerBranchReleases;
-    private Integer verbosity;
+public class DeconfigureTask extends AbstractScmBaseTask {
+  // The attributes of this task
+  private Boolean considerBranchReleases;
 
-    /**
-     * Set Synergy Database name to be used by deconfigure.pl script.
-     * @param database
-     * @ant.required
-     */
-    public void setdatabase(String database) {
-        this.database = database;
-        log("Set database to " + database, Project.MSG_DEBUG); 
-    }
+  /**
+   * Return the considerBranchReleases.
+   * 
+   * @return the considerBranchReleases.
+   */
+  public Boolean getConsiderBranchReleases() {
+    return considerBranchReleases;
+  }
 
-    /**
-     * Set Synergy Project Name to be used by deconfigure.pl script.
-     * @param projectName
-     * @ant.required
-     */
-    public void setprojectName(String projectName) {
-        this.projectName = projectName;
-        log("Set projectName to " + projectName, Project.MSG_DEBUG); 
-    }
+  /**
+   * Set if we want deconfigure.pl script to check for branch differences
+   * based on the 'included_releases' attribute of project.
+   * 
+   * @param considerBranchReleases
+   * @ant.not-required Default is no.
+   */
+  public void setconsiderBranchReleases(Boolean considerBranchReleases) {
+    this.considerBranchReleases = considerBranchReleases;
+    log("Set considerBranchReleases to " + considerBranchReleases);
+  }
 
-    /**
-     * Set Synergy Password to be used by deconfigure.pl script.
-     * @param password
-     * @ant.required
-     */    
-    public void setpassword(String password) {
-        this.password = password;
-        log("Set password to " + password, Project.MSG_DEBUG);
-    }
-
-    /**
-     * Set if we want deconfigure.pl script to check for branch differences based on the 'included_releases' attribute of project.
-     * @param considerBranchReleases 
-     * @ant.not-required  Default is no.
-     */    
-    public void setconsiderBranchReleases(Boolean considerBranchReleases) {
-        this.considerBranchReleases = considerBranchReleases;
-        log("Set considerBranchReleases to " + considerBranchReleases, Project.MSG_DEBUG);
-    }
+  /**
+   * Build a command list consisting of all the required and optional command
+   * arguments of the current task.
+   */
+  protected void buildCommandList() {
+    addCommandArg("database", "-d", true, getDatabase());
+    addCommandArg("password", "-P", true, getPassword());
+    addCommandArg("ccmProject", "-p", true, getCcmProject());
+    addCommandArg("considerBranchReleases", "-b", getConsiderBranchReleases());
+  }
 
-   /**
-     * Set verbosity level to be used by deconfigure.pl script. Verbosity level ( 0 - quiet, 1 - verbose, 2 - very verbose). Exception will be raised for any other value.
-     * @param verbosity
-     * @ant.not-required
-     */     
-    public void setverbosity(Integer verbosity) {
-        this.verbosity = verbosity;
-        log("Set verbosity to " + verbosity, Project.MSG_DEBUG);
-    }
-    
-    public void execute() {
-        String missingArgs = "";
-        String commandArgs = "cmd /c deconfigure.pl ";
+  /**
+   * Method validates the given arguments.
+   */
+  protected void validateArguments() {
+    // Do nothing
+  }
 
-        /* Handle mandatory arguments */
-        if (database == null)
-            missingArgs += "database ";
-        else
-            commandArgs += "-d " + database + " "; 
-
-        if (projectName == null)
-            missingArgs += "projectName ";
-        else
-            commandArgs += "-p " + projectName + " "; 
+  /**
+   * Set the execution script.
+   * 
+   */
+  protected void setExecutionScript() {
+    append2CommandString("deconfigure.pl");
+  }
 
-        if (password == null)
-            missingArgs += "password ";
-        else
-            commandArgs += "-P " + password + " "; 
-
-        if (!missingArgs.equals(""))
-            throw new BuildException("[" + getTaskName() + "] Error: mandatory attributes are not defined - " + missingArgs);
-
-        /* Handle optional arguments */
-        if (considerBranchReleases != null)
-            if (considerBranchReleases)
-                commandArgs += "-b ";
-
-        if (verbosity != null)
-            switch(verbosity) {
-              case 0: commandArgs += "-q ";
-                      break;
-              case 1: commandArgs += "-V ";
-                      break;
-              case 2: commandArgs += "-W ";
-                      break;
-              default: throw new BuildException("[" + getTaskName() + "] Error: Verbosity level is not recognised. Legal values are: 0 - quiet, 1 - verbose or 2 - very verbose");
-            }
-
-        try {
-            Execute exe = new Execute();
-            exe.runCommand(this, commandArgs.split(" "));
-        } catch (BuildException e) {
-            throw new BuildException("[" + getTaskName() + "] Error: Script execution failure.");
-        }
-        log("Completed successfully.");
+  /**
+   * Method returns the correct verbosity level for the input choice.
+   * 
+   * @param choice
+   *            is the verbosity choice set by user.
+   * @return the verbosity level to set.
+   */
+  protected String getVerbosity(int choice) {
+    String cmd = "";
+    switch (choice) {
+    case 0:
+      cmd = "-q ";
+      break;
+    case 1:
+      cmd = "-V ";
+      break;
+    case 2:
+      cmd = "-W ";
+      break;
+    default:
+      raiseError("Verbosity level is not recognised. "
+          + "Legal values are: 0 - quiet, 1 - verbose or 2 - very verbose");
     }
+    return cmd;
+  }
+  
 }
\ No newline at end of file
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/GetValueFromVariableSet.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/GetValueFromVariableSet.java	Wed Dec 23 19:29:07 2009 +0200
@@ -91,7 +91,7 @@
             }
         }
 
-        throw new BuildException("Could not find '" + name + "' variable.");
+        //throw new BuildException("Could not find '" + name + "' variable.");
     }
 
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/HlmExecTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,111 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.ant.taskdefs;
+
+import org.apache.tools.ant.taskdefs.ExecTask;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.BuildException;
+
+import java.util.concurrent.*;
+
+/**
+ * Exec task using shared thread pool
+ * @ant.task name="exec"
+ */
+public class HlmExecTask extends ExecTask
+{   
+    private static int poolSize = Runtime.getRuntime().availableProcessors();
+    private static int maxPoolSize = poolSize * 2;
+    private static ExecutorService threadPool = Executors.newFixedThreadPool(maxPoolSize);
+    private final Object semaphore = new Object();
+    
+    /**
+      * Submit exec into pool and throw exceptions
+      */
+    public void execute()
+    {
+        String p = project.getProperty("number.of.threads");
+        if (p != null)
+        {
+            ((ThreadPoolExecutor)threadPool).setCorePoolSize(Integer.parseInt(p));
+            ((ThreadPoolExecutor)threadPool).setMaximumPoolSize(Integer.parseInt(p));
+        }
+        TaskRunnable tr = new TaskRunnable();
+        threadPool.submit(tr);
+        try {
+            synchronized (semaphore) {
+                while (!tr.isFinished())
+                    semaphore.wait();
+            }
+        } catch (InterruptedException e) { e.printStackTrace(); }
+          
+        Throwable t = tr.getException();
+        if (t != null)
+        {
+            if (t instanceof BuildException)
+                throw (BuildException)t;
+            else
+                t.printStackTrace();
+        }
+    }
+    
+    private class TaskRunnable implements Runnable {
+        private Task task;
+        private boolean finished;
+        private volatile Thread thread;
+        private Throwable exception;
+
+        /**
+         * Executes the task within a thread and takes care about
+         * Exceptions raised within the task.
+         */
+        public void run() {
+            try {
+                thread = Thread.currentThread();
+                HlmExecTask.super.execute();
+            } catch (Throwable t) {
+                exception = t;
+            } finally {
+                synchronized (semaphore) {
+                    finished = true;
+                    semaphore.notifyAll();
+                }
+            }
+        }
+        
+        /**
+         * get any exception that got thrown during execution;
+         * @return an exception or null for no exception/not yet finished
+         */
+        public Throwable getException() {
+            return exception;
+        }
+        
+        /**
+         * Provides the indicator that the task has been finished.
+         * @return Returns true when the task is finished.
+         */
+        boolean isFinished() {
+            return finished;
+        }
+
+        void interrupt() {
+            thread.interrupt();
+        }
+    }
+}
\ No newline at end of file
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/LDAP.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/LDAP.java	Wed Dec 23 19:29:07 2009 +0200
@@ -35,6 +35,7 @@
     private String filter;
     private String key;
     private String property;
+    
         
     public void execute()
     {
@@ -72,7 +73,12 @@
         } 
         catch (NamingException exc) 
         {
-            throw new BuildException(exc);
+            throw new BuildException(exc.getMessage());
+        }
+        catch (NullPointerException e) 
+        {
+            // As uer will not get affected due to this error not failing build.
+            log("Not able to retrive LDAP information for " + filter);
         }
     }
 
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/LogRecorderTask.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/LogRecorderTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -315,6 +315,7 @@
             }
             catch (Exception e)
             {
+                // We are Ignoring the errors as no need to fail the build.
                 entry = new TextLogRecorderEntry(name);
             }
 
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ModelPropertiesTask.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/ModelPropertiesTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -36,7 +36,7 @@
     private String outputFile;
 
     private String inputFile;
-
+    
     public ModelPropertiesTask()
     {
         setTaskName("ModelPropertiesTask");
@@ -66,15 +66,11 @@
         }
         catch (IOException ioe)
         {
-            log("Couldn't find model file");
-            ioe.printStackTrace();
-            throw new BuildException(ioe.getMessage());
+            throw new BuildException("Couldn't find model file" + ioe.getMessage());
         }
         catch (DocumentException be)
         {
-            log("Error in creating model dom object");
-            be.printStackTrace();
-            throw new BuildException(be.getMessage());
+            throw new BuildException("Error in creating model dom object " + be.getMessage());
         }
     }
 }
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/PythonTask.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/PythonTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -162,14 +162,17 @@
             
                 // Delete temporary script file
                 boolean fileDeleted = tempfile.delete();
-                if (!fileDeleted)
+                if (!fileDeleted && iFailonerror)
                 {
                     throw new BuildException("Could not delete script file!");
                 }            
             }
             catch (IOException e)
             {
-                throw new BuildException(e.getMessage());
+                if (iFailonerror) {
+                    throw new BuildException(e.getMessage());
+                }
+                log("Error while running python task " + e.getMessage());
             }
             finally
             {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/RBTTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,503 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: 
+ *
+ */
+
+package com.nokia.ant.taskdefs;
+
+
+/**
+ * ANT wrapper task for the GSCM rbt.pl script.
+ * 
+ * <pre>
+ * Deconfigure Only:
+ * 
+ * Usage: &lt;hlm:rebaseanddeconf database=&quot;${dbname}&quot;
+ *                              password=&quot;${UNIX-password}&quot; 
+ *                              verbosity=&quot;${0-3}&quot;
+ *                              ccmProject=&quot;${ccm.project.name}&quot; 
+ *                              release=&quot;${release.name}&quot;
+ *                              deconfigure=&quot;yes&quot; /&gt;
+ * </pre>
+ * 
+ * <pre>
+ * Rebaseline Only:
+ * 
+ * Usage:   &lt;hlm:rebaseanddeconf database=&quot;${dbname}&quot;
+ *                              password=&quot;${UNIX-password}&quot; 
+ *                              verbosity=&quot;${0-3}&quot;
+ *                              ccmProject=&quot;${ccm.project.name}&quot;
+ *                              release=&quot;${release.name}&quot; 
+ *                              releaseBaseline=&quot;yes&quot; 
+ *                              skipDeconfigure=&quot;yes&quot; /&gt;
+ * </pre>
+ * 
+ * <pre>
+ * Rebaseline with deconfigure:
+ * 
+ * Usage:   &lt;hlm:rebaseanddeconf database=&quot;${dbname}&quot;
+ *                              password=&quot;${UNIX-password}&quot; 
+ *                              verbosity=&quot;${0-3}&quot;
+ *                              ccmProject=&quot;${ccm.project.name}&quot;
+ *                              release=&quot;${release.name}&quot; 
+ *                              releaseBaseline=&quot;yes&quot; 
+ *                              deconfigure=&quot;yes&quot; /&gt;
+ * </pre>
+ * 
+ * @author hacs
+ * @ant.task category="SCM"
+ */
+public class RBTTask extends AbstractScmBaseTask {
+
+  // The attributes of this task
+  private String baseline; // -B baselinename = Four-part name of existing
+  // baseline (incompatible with -p and -n)
+  private String version; // -v version = New project hierarchy version
+  private String release; // -r release = New release object name (Two-part
+  // name)
+  private String newBaselineName; // -n name = New baseline name
+
+  private Boolean releaseBaseline; // -R = Release the newly created baseline
+  private Boolean publish; // -P = Publish the newly created baseline
+  private Boolean deconfigure; // -s = Replace subprojects only (NO
+  // REBASELINE)
+  private Boolean leaveFoldersWritable; // -F = Don't freeze folders (Leave
+  // folders writable)
+  private Boolean enableTaskRebadgingGenericRelease; // -t = Enable task
+  // rebadging (associated
+  // modifiable tasks with
+  // generic release only)
+  private Boolean enableTaskRebadging; // -T = Enable task rebadging (all
+  // associated modifiable tasks)
+  private Boolean rebadgeObjectVersions; // -o = Rebadge object versions
+  // (requires ccm_admin)
+  private Boolean createBaselineForRollingReleaseTag; // -i = Create
+  // additional
+  // integration baseline
+  // for rolling-release
+  // tag
+  private Boolean skipDeconfigure; // -S = Do NOT replace subprojects (NO
+  // DECONFIGURE)
+  private Boolean active; // -a = Specified release remains active
+  private Boolean useBranchReleaseMethodology; // -b = Utilize branch release
+
+  // methodology
+
+  /**
+   * Return the baseline.
+   * 
+   * @return the baseline.
+   */
+  public String getBaseline() {
+    return baseline;
+  }
+
+  /**
+   * Set four-part name of existing baseline (incompatible with 'projectName'
+   * and 'baselineName' attributes) to be used by rebaseline.pl script.
+   * 
+   * @param baseline
+   *            is the baseline to set
+   * @ant.not-required
+   */
+  public void setBaseline(String baseline) {
+    this.baseline = baseline;
+    log("Set baseline to " + baseline);
+  }
+
+  /**
+   * Return the version.
+   * 
+   * @return the version.
+   */
+  public String getVersion() {
+    return version;
+  }
+
+  /**
+   * Set version of new project created.
+   * 
+   * @param version
+   *            is the version to set.
+   * @ant.not-required
+   */
+  public void setVersion(String version) {
+    this.version = version;
+    log("Set version to " + version);
+  }
+
+  /**
+   * Return the leaveFoldersWritable.
+   * 
+   * @return the leaveFoldersWritable.
+   */
+  public Boolean getLeaveFoldersWritable() {
+    return leaveFoldersWritable;
+  }
+
+  /**
+   * Set whether to leave the folders writable in the baseline project
+   * created.
+   * 
+   * @param leaveFolderswritable
+   *            indicates whether to leave folders writable.
+   * @ant.not-required Default is no.
+   */
+  public void setLeaveFoldersWritable(Boolean leaveFoldersWritable) {
+    this.leaveFoldersWritable = leaveFoldersWritable;
+    log("Set leaveFoldersWritable to " + leaveFoldersWritable);
+  }
+
+  /**
+   * Return the rebadgeObjectVersions
+   * 
+   * @return the rebadgeObjectVersions.
+   */
+  public Boolean getRebadgeObjectVersions() {
+    return rebadgeObjectVersions;
+  }
+
+  /**
+   * Set whether to rebadge object versions in the rebaseline.pl script.
+   * 
+   * @param password
+   *            Synergy Password
+   * @ant.not-required Default is no.
+   */
+  public void setRebadgeObjectVersions(Boolean rebadgeObjectVersions) {
+    this.rebadgeObjectVersions = rebadgeObjectVersions;
+    log("Set rebadgeObjectVersions to " + rebadgeObjectVersions);
+  }
+
+  /**
+   * Returnt the releaseBaseline.
+   * 
+   * @return the releaseBaseline.
+   */
+  public Boolean getReleaseBaseline() {
+    return releaseBaseline;
+  }
+
+  /**
+   * Set whether to release the newly created baseline or not.
+   * 
+   * @param release
+   *            the release to set
+   */
+  public void setReleaseBaseline(Boolean releaseBaseline) {
+    this.releaseBaseline = releaseBaseline;
+    log("Set releaseBaseline to " + releaseBaseline);
+  }
+
+  /**
+   * Return the publish.
+   * 
+   * @return the publish.
+   */
+  public Boolean getPublish() {
+    return publish;
+  }
+
+  /**
+   * Set whether to publish the newly created baseline or not.
+   * 
+   * @param publish
+   *            the publish to set
+   */
+  public void setPublish(Boolean publish) {
+    this.publish = publish;
+    log("Set publish to " + publish);
+  }
+
+  /**
+   * Return the createBaselineForRollingReleaseTag.
+   * 
+   * @return the createBaselineForRollingReleaseTag.
+   */
+  public Boolean getCreateBaselineForRollingReleaseTag() {
+    return createBaselineForRollingReleaseTag;
+  }
+
+  /**
+   * Set whether to create additional integration baseline for rolling-release
+   * tag.
+   * 
+   * @param createBaselineForRollingReleaseTag
+   * @ant.not-required Default is no.
+   */
+  public void setCreateBaselineForRollingReleaseTag(
+      Boolean createBaselineForRollingReleaseTag) {
+    this.createBaselineForRollingReleaseTag = createBaselineForRollingReleaseTag;
+    log("Set createBaselineForRollingReleaseTag to "
+        + createBaselineForRollingReleaseTag);
+  }
+
+  /**
+   * Return the enableTaskRebadgingGenericRelease.
+   * 
+   * @return the enableTaskRebadgingGenericRelease.
+   */
+  public Boolean getEnableTaskRebadgingGenericRelease() {
+    return enableTaskRebadgingGenericRelease;
+  }
+
+  /**
+   * Set enable task rebadging (associated modifiable tasks with generic
+   * release only). Not supported in rebaseline.pl
+   * 
+   * @param enableTaskRebadgingGenericRelease
+   *            the enableTaskRebadgingGenericRelease to set
+   */
+  public void setEnableTaskRebadgingGenericRelease(
+      Boolean enableTaskRebadgingGenericRelease) {
+    this.enableTaskRebadgingGenericRelease = enableTaskRebadgingGenericRelease;
+    log("Set enableTaskRebadgingGenericRelease to "
+        + enableTaskRebadgingGenericRelease);
+  }
+
+  /**
+   * Return the enableTaskRebadging
+   * 
+   * @return the enableTaskRebadging.
+   */
+  public Boolean getEnableTaskRebadging() {
+    return enableTaskRebadging;
+  }
+
+  /**
+   * Set enable task rebadging (all associated modifiable tasks). Not supported in rebaseline.pl
+   * 
+   * @param enableTaskRebadging
+   *            the enableTaskRebadging to set
+   */
+  public void setEnableTaskRebadging(Boolean enableTaskRebadging) {
+    this.enableTaskRebadging = enableTaskRebadging;
+    log("Set enableTaskRebadging to " + enableTaskRebadging);
+  }
+
+  /**
+   * Return the skipDeconfigure.
+   * 
+   * @return the skipDeconfigure.
+   */
+  public Boolean getSkipDeconfigure() {
+    return skipDeconfigure;
+  }
+
+  /**
+   * Set to skip deconfigure.
+   * 
+   * @param skipDeconfigure
+   *            the skipDeconfigure to set
+   */
+  public void setSkipDeconfigure(Boolean skipDeconfigure) {
+    this.skipDeconfigure = skipDeconfigure;
+    log("Set skipDeconfigure to " + skipDeconfigure);
+  }
+
+  /**
+   * Return the deconfigure
+   * 
+   * @return the deconfigure.
+   */
+  public Boolean getDeconfigure() {
+    return deconfigure;
+  }
+
+  /**
+   * Set deconfigure.
+   * 
+   * @param deconfigure
+   *            the deconfigure to set
+   */
+  public void setDeconfigure(Boolean deconfigure) {
+    this.deconfigure = deconfigure;
+    log("Set deconfigure to " + deconfigure);
+  }
+
+  /**
+   * Return the active.
+   * 
+   * @return the active.
+   */
+  public Boolean getActive() {
+    return active;
+  }
+
+  /**
+   * Set whether the current release is active or not.
+   * 
+   * @param active
+   *            the active to set
+   */
+  public void setActive(Boolean active) {
+    this.active = active;
+    log("Set active to " + active);
+  }
+
+  /**
+   * Return useBranchReleaseMethodology.
+   * 
+   * @return the useBranchReleaseMethodology.
+   */
+  public Boolean getUseBranchReleaseMethodology() {
+    return useBranchReleaseMethodology;
+  }
+
+  /**
+   * Set whether to utilize branch release methodology or not.
+   * 
+   * @param useBranchReleaseMethodology
+   *            is the boolean value to set.
+   * @ant.not-required Default is no.
+   */
+  public void setUseBranchReleaseMethodology(
+      Boolean useBranchReleaseMethodology) {
+    this.useBranchReleaseMethodology = useBranchReleaseMethodology;
+    log("Set useBranchReleaseMethodology to " + useBranchReleaseMethodology);
+  }
+
+  /**
+   * Return the release tag.
+   * 
+   * @return the release tag.
+   */
+  public String getRelease() {
+    return release;
+  }
+
+  /**
+   * Set release tag (Two-part name) for the release project created.
+   * 
+   * @param release
+   *            is the release tag to set
+   * @ant.not-required
+   */
+  public void setRelease(String release) {
+    this.release = release;
+    log("Set release to " + release);
+  }
+
+  /**
+   * Return the newBaselineName.
+   * 
+   * @return the newBaselineName.
+   */
+  public String getNewBaselineName() {
+    return newBaselineName;
+  }
+
+  /**
+   * Set new baseline name to use.
+   * 
+   * @param baselineName
+   *            is the new baseline name to set.
+   * @ant.not-required
+   */
+  public void setNewBaselineName(String newBaselineName) {
+    this.newBaselineName = newBaselineName;
+    log("Set newBaselineName to " + newBaselineName);
+  }
+
+  /**
+   * Set the execution script.
+   * 
+   */
+  protected void setExecutionScript() {
+    append2CommandString("rbt.pl");
+  }
+
+  /**
+   * Build a command list consisting of all the required and optional command
+   * arguments of the current task.
+   */
+  protected void buildCommandList() {
+    addCommandArg("database", "-d", true, getDatabase());
+    addCommandArg("password", "-U", true, getPassword());
+    addCommandArg("ccmProject", "-p", getCcmProject());
+    addCommandArg("baseline", "-B", getBaseline());
+    addCommandArg("version", "-v", getVersion());
+    addCommandArg("releaseBaseline", "-R", getReleaseBaseline());
+    addCommandArg("publish", "-P", getPublish());
+    addCommandArg("deconfigure", "-s", getDeconfigure());
+    addCommandArg("leaveFoldersWritable", "-F", getLeaveFoldersWritable());
+    addCommandArg("enableTaskRebadgingGenericRelease", "-t", getEnableTaskRebadgingGenericRelease());
+    addCommandArg("enableTaskRebadging", "-T", getEnableTaskRebadging());
+    addCommandArg("rebadgeObjectVersions", "-o", getRebadgeObjectVersions());
+    addCommandArg("createBaselineForRollingReleaseTag", "-i", getCreateBaselineForRollingReleaseTag());
+    addCommandArg("active", "-a", getActive());
+    addCommandArg("skipDeconfigure", "-S", getSkipDeconfigure());
+    addCommandArg("useBranchReleaseMethodology", "-b", getUseBranchReleaseMethodology());
+    addCommandArg("release", "-r", getRelease());
+    addCommandArg("newBaselineName", "-n", getNewBaselineName());
+  }
+
+  /**
+   * Method validates the given arguments.
+   */
+  protected void validateArguments() {
+
+    if (baseline != null && (getCcmProject() != null || newBaselineName != null)) {
+      raiseError("Option 'baseline' cannot be used with 'ccmProject' and 'newBaselineName'");
+    }
+
+    if (deconfigure != null && deconfigure && skipDeconfigure != null
+        && skipDeconfigure) {
+      raiseError("Use option either 'deconfigure' or 'skipDeconfigure'");
+    }
+
+    if (deconfigure != null && deconfigure && release == null) {
+      raiseError("Option 'release' is mandatory if 'deconfigure' is set");
+    }
+
+    if (publish != null && publish && releaseBaseline != null
+        && releaseBaseline) {
+      raiseError("Use Option either 'publish' or 'releaseBaseline'");
+    }
+
+    if (enableTaskRebadging != null && enableTaskRebadging
+        && enableTaskRebadgingGenericRelease != null
+        && enableTaskRebadgingGenericRelease) {
+      raiseError("Use Option either 'enableTaskRebadging' or 'enableTaskRebadgingGenericRelease'");
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  protected String getVerbosity(int choice) {
+    String cmd = "";
+    switch (choice) {
+    case 0:
+      cmd = "-Q";
+      break;
+    case 1:
+      cmd = "-V";
+      break;
+    case 2:
+      cmd = "-I";
+      break;
+    case 3:
+      cmd = "-W";
+      break;
+    default:
+      raiseError("Verbosity level is not recognised. "
+          + "Legal values are: 0 - quiet, 1 - verbose, 2 - Interactive "
+          + "or 3 - Walk-through Rehearsal");
+    }
+    return cmd;
+  }
+
+}
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/RebaselineTask.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/RebaselineTask.java	Wed Dec 23 19:29:07 2009 +0200
@@ -1,264 +1,109 @@
 /*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: 
+ *
+ */
 
 package com.nokia.ant.taskdefs;
 
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Execute;
 
 /**
  * ANT wrapper task for the GSCM rebaseline.pl script.
+ * 
  * @ant.task category="SCM"
  */
-public class RebaselineTask extends Task
-{
-    // The attributes of this task
-    private String database;
-    private String projectName;
-    private String password;
-    private String release;   
-    private String baseline;
-    private String version;
-    private Boolean releaseBaseline;
-    private Boolean leaveFolderswritable;   
-    private Boolean disableTaskRebadging;   
-    private Boolean rebadgeObjectVersions;
-    private String baselineName;
-    private Boolean useBranchReleaseMethodology;
-    private Boolean createBaselineForRollingReleaseTag;
-    private Integer verbosity;
-
-    /**
-     * Set Synergy Database name to be used by rebaseline.pl script.
-     * @param database
-     * @ant.required
-     */
-    public void setdatabase(String database) {
-        this.database = database;
-        log("Set database to " + database, Project.MSG_DEBUG); 
-    }
+public class RebaselineTask extends RBTTask {
+  // The attributes of this task
+  private Boolean disableTaskRebadging;
 
-    /**
-     * Set Synergy Project Name to be used by rebaseline.pl script.
-     * @param projectName
-     * @ant.required
-     */
-    public void setprojectName(String projectName) {
-        this.projectName = projectName;
-        log("Set projectName to " + projectName, Project.MSG_DEBUG); 
-    }
-
-    /**
-     * Set Synergy Password to be used by rebaseline.pl script.
-     * @param password
-     * @ant.required
-     */    
-    public void setpassword(String password) {
-        this.password = password;
-        log("Set password to " + password, Project.MSG_DEBUG);
-    }
-
-    /**
-     * Set release tag (Two-part name) for the release project created by reconfigure.pl script.
-     * @param release
-     * @ant.not-required
-     */    
-    public void setrelease(String release) {
-        this.release = release;
-        log("Set release to " + release, Project.MSG_DEBUG);
-    }
+  /**
+   * Return disableTaskRebadging
+   * 
+   * @return the disableTaskRebadging.
+   */
+  public Boolean getDisableTaskRebadging() {
+    return disableTaskRebadging;
+  }
 
-    /**
-     * Set four-part name of existing baseline (incompatible with 'projectName' and 'baselineName' attributes) to be used by rebaseline.pl script.
-     * @param baseline 
-     * @ant.not-required
-     */    
-    public void setbaseline(String baseline) {
-        this.baseline = baseline;
-        log("Set baseline to " + baseline, Project.MSG_DEBUG);
-    }
-
-    /**
-     * Set version of new project created by rebaseline.pl script.
-     * @param version
-     * @ant.not-required
-     */    
-    public void setversion(String version) {
-        this.version = version;
-        log("Set version to " + version, Project.MSG_DEBUG);
-    }
-
-    /**
-     * Set whether to release the baseline project created by rebaseline.pl script.
-     * @param releaseBaseline
-     * @ant.not-required Default is no.
-     */    
-    public void setreleaseBaseline(Boolean releaseBaseline) {
-        this.releaseBaseline = releaseBaseline;
-        log("Set releaseBaseline to " + releaseBaseline, Project.MSG_DEBUG);
-    }
+  /**
+   * Set whether to disable task rebadging (incompatible with
+   * 'rebadgeObjectVersions' attribute) in the rebaseline.pl script.
+   * 
+   * @param disableTaskRebadging
+   * @ant.not-required Default is no.
+   */
+  public void setdisableTaskRebadging(Boolean disableTaskRebadging) {
+    this.disableTaskRebadging = disableTaskRebadging;
+    log("Set disableTaskRebadging to " + disableTaskRebadging);
+  }
 
-    /**
-     * Set whether to leave the folders writable in the baseline project created by rebaseline.pl script.
-     * @param leaveFolderswritable
-     * @ant.not-required  Default is no.
-     */    
-    public void setleaveFolderswritable(Boolean leaveFolderswritable) {
-        this.leaveFolderswritable = leaveFolderswritable;
-        log("Set leaveFolderswritable to " + leaveFolderswritable, Project.MSG_DEBUG);
-    }
-
-    /**
-     * Set whether to disable task rebadging (incompatible with 'rebadgeObjectVersions' attribute) in the rebaseline.pl script.
-     * @param disableTaskRebadging
-     * @ant.not-required  Default is no.
-     */    
-    public void setdisableTaskRebadging(Boolean disableTaskRebadging) {
-        this.disableTaskRebadging = disableTaskRebadging;
-        log("Set disableTaskRebadging to " + disableTaskRebadging, Project.MSG_DEBUG);
-    }
-
-    /**
-     * Set whether to rebadge object versions in the rebaseline.pl script.
-     * @param password Synergy Password
-     * @ant.not-required Default is no.
-     */    
-    public void setrebadgeObjectVersions(Boolean rebadgeObjectVersions) {
-        this.rebadgeObjectVersions = rebadgeObjectVersions;
-        log("Set rebadgeObjectVersions to " + rebadgeObjectVersions, Project.MSG_DEBUG);
-    }
+  /**
+   * Set the execution script.
+   * 
+   */
+  protected void setExecutionScript() {
+    append2CommandString("rebaseline.pl");
+  }
 
-    /**
-     * Set new baseline name to use in rebaseline.pl script.
-     * @param baselineName
-     * @ant.not-required
-     */    
-    public void setbaselineName(String baselineName) {
-        this.baselineName = baselineName;
-        log("Set baselineName to " + baselineName, Project.MSG_DEBUG);
-    }
-
-    /**
-     * Set whether to utilize branch release methodology in the rebaseline.pl script.
-     * @param useBranchReleaseMethodology
-     * @ant.not-required Default is no.
-     */    
-    public void setuseBranchReleaseMethodology(Boolean useBranchReleaseMethodology) {
-        this.useBranchReleaseMethodology = useBranchReleaseMethodology;
-        log("Set useBranchReleaseMethodology to " + useBranchReleaseMethodology, Project.MSG_DEBUG);
-    }
-
-    /**
-     * Set whether to create additional integration baseline for rolling-release tag.
-     * @param createBaselineForRollingReleaseTag
-     * @ant.not-required Default is no.
-     */    
-    public void setcreateBaselineForRollingReleaseTag(Boolean createBaselineForRollingReleaseTag) {
-        this.createBaselineForRollingReleaseTag = createBaselineForRollingReleaseTag;
-        log("Set createBaselineForRollingReleaseTag to " + createBaselineForRollingReleaseTag, Project.MSG_DEBUG);
-    }
-
-   /**
-     * Set verbosity level to be used by rebaseline.pl script. Verbosity level ( 0 - quiet, 1 - verbose). Exception will be raised for any other value.
-     * @param verbosity 
-     * @ant.not-required
-     */     
-    public void setverbosity(Integer verbosity) {
-        this.verbosity = verbosity;
-        log("Set verbosity to " + verbosity, Project.MSG_DEBUG);
-    }
-    
-    public void execute() {
-        String missingArgs = "";
-        String commandArgs = "cmd /c rebaseline.pl ";
-
-        /* Handle mandatory arguments */
-        if (database == null)
-            missingArgs += "database ";
-        else
-            commandArgs += "-d " + database + " "; 
-
-        if (projectName == null)
-            missingArgs += "projectName ";
-        else
-            commandArgs += "-p " + projectName + " "; 
+  /**
+   * Build a command list consisting of all the required and optional command
+   * arguments of the current task.
+   */
+  protected void buildCommandList() {
+    addCommandArg("database", "-d", true, getDatabase());
+    addCommandArg("password", "-P", true, getPassword());
+    addCommandArg("ccmProject", "-p", true, getCcmProject());
+    addCommandArg("release", "-r", getRelease());
+    addCommandArg("baseline", "-B", getBaseline());
+    addCommandArg("version", "-v", getVersion());
+    addCommandArg("newBaselineName", "-n", getNewBaselineName());
+    addCommandArg("releaseBaseline", "-R", getReleaseBaseline());
+    addCommandArg("leaveFolderswritable", "-w", getLeaveFoldersWritable());
+    addCommandArg("disableTaskRebadging", "-x", getDisableTaskRebadging());
+    addCommandArg("rebadgeObjectVersions", "-a", getRebadgeObjectVersions());
+    addCommandArg("useBranchReleaseMethodology", "-b", getUseBranchReleaseMethodology());
+    addCommandArg("createBaselineForRollingReleaseTag", "-i", getCreateBaselineForRollingReleaseTag());
+  }
 
-        if (password == null)
-            missingArgs += "password ";
-        else
-            commandArgs += "-P " + password + " "; 
-
-        if (!missingArgs.equals(""))
-            throw new BuildException("[" + getTaskName() + "] Error: mandatory attributes are not defined - " + missingArgs);
-
-        /* Handle optional arguments */
-        if (release != null)
-             commandArgs += "-r " + release + " "; 
-
-        if (baseline != null)
-             commandArgs += "-B " + baseline + " "; 
-
-        if (version != null)
-             commandArgs += "-v " + version + " "; 
-
-        if (baselineName != null)
-             commandArgs += "-n " + baselineName + " "; 
-
-        if (releaseBaseline != null)
-            if (releaseBaseline)
-                commandArgs += "-R ";
+  /**
+   * Method returns the correct verbosity level for the input choice.
+   * 
+   * @param choice
+   *            is the verbosity choice set by user.
+   * @return the verbosity level to set.
+   */
+  protected String getVerbosity(int choice) {
+    String cmd = "";
+    switch (choice) {
+    case 0:
+      cmd = "-q ";
+      break;
+    case 1:
+      cmd = "-V ";
+      break;
+    default:
+      raiseError("Verbosity level is not recognised. "
+          + "Legal values are: 0 - quiet, 1 - verbose.");
+    }
+    return cmd;
+  }
 
-        if (leaveFolderswritable != null)
-            if (leaveFolderswritable)
-                commandArgs += "-w ";
-                
-        if (disableTaskRebadging != null)
-            if (disableTaskRebadging)
-                commandArgs += "-x ";
-
-        if (rebadgeObjectVersions != null)
-            if (rebadgeObjectVersions)
-                commandArgs += "-a ";
-
-        if (useBranchReleaseMethodology != null)
-            if (useBranchReleaseMethodology)
-                commandArgs += "-b ";
-
-        if (createBaselineForRollingReleaseTag != null)
-            if (createBaselineForRollingReleaseTag)
-                commandArgs += "-i ";
-
-        if (verbosity != null)
-            switch(verbosity) {
-              case 0: commandArgs += "-q ";
-                      break;
-              case 1: commandArgs += "-V ";
-                      break;
-              default: throw new BuildException("[" + getTaskName() + "] Error: Verbosity level is not recognised. Legal values are: 0 - quiet, 1 - verbose.");
-            }
-
-        try {
-            Execute exe = new Execute();
-            exe.runCommand(this, commandArgs.split(" "));
-        } catch (BuildException e) {
-            throw new BuildException("[" + getTaskName() + "] Error: Script execution failure.");
-        }
-        log("Completed successfully.");
-    }
+  /**
+   * Method validates the given arguments.
+   */
+  protected void validateArguments() {
+    // Do nothing
+  }
+  
 }
\ No newline at end of file
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/TextLogRecorderEntry.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/taskdefs/TextLogRecorderEntry.java	Wed Dec 23 19:29:07 2009 +0200
@@ -116,7 +116,6 @@
     
     public void setFilterSet(LogFilterSet o)
     {
-        System.out.println("setFilterSet: " + o);
         filterset = o;
     }
 
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/types/SBSMakeOptions.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/types/SBSMakeOptions.java	Wed Dec 23 19:29:07 2009 +0200
@@ -29,6 +29,9 @@
     private Vector variables = new Vector();
     
     private String engine;
+
+    private String ppThreads;
+
     /**
      * Constructor
      */
@@ -69,4 +72,12 @@
     public String getEngine() {
         return engine;
     }
+    public void setPPThreads(String threads) {
+        ppThreads = threads;
+    }
+    
+    public String getPPThreads() {
+        return ppThreads;
+    }
+
 }
\ No newline at end of file
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/types/imaker/Configuration.java	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,101 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
- 
-package com.nokia.ant.types.imaker;
-import org.apache.tools.ant.types.DataType;
-import org.apache.tools.ant.types.PatternSet;
-import java.util.Vector;
-
-/**
- * This object represent a iMaker configuration.
- * @ant.type name="imakerconfiguration" category="Imaker"
- */
-public class Configuration extends DataType {
-    
-    private Vector makefiles = new Vector();
-    private Vector targets = new Vector();
-    private Vector variables = new Vector();
-    private boolean regionalVariation;
-    
-    public Configuration() {
-    }    
-
-    /**
-     * Create a makefileset element.
-     * Makefileset elements are based on regular Ant PatternSet.
-     * @return a PatternSet object.
-     */
-    public PatternSet createMakefileSet() {
-        PatternSet makefile =  new PatternSet();
-        makefiles.add(makefile);
-        return makefile;
-    }
-    
-    /**
-     * Get the list of makefileset element.
-     * @return a vector of PatternSet objects.
-     */
-    public Vector getMakefileSet() {
-        return makefiles;
-    }
-    
-    /**
-     * Create a targetset element.
-     * Targetset elements are based on regular Ant PatternSet.
-     * @return a PatternSet object.
-     */
-    public PatternSet createTargetSet() {
-        PatternSet target =  new PatternSet();
-        targets.add(target);
-        return target;
-    }
-    
-    /**
-     * Get the list of targetset.
-     * @return a vector of PatternSet objects.
-     */
-    public Vector getTargetSet() {
-        return targets;
-    }
-
-    /**
-     * Create a VariableSet element.
-     * @return a VariableSet object.
-     */
-    public VariableSet createVariableSet() {
-        VariableSet var =  new VariableSet();
-        variables.add(var);
-        return var;
-    }
-        
-    /**
-     * Get the list of variableset.
-     * @return a vector of VariableSet objects.
-     */
-    public Vector getVariableSet() {
-        return variables;
-    }
-
-    public void setRegionalVariation(boolean value) {
-        regionalVariation = value;
-    }
-
-    public boolean getRegionalVariation() {
-        return regionalVariation;
-    }
-    
-}
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/types/imaker/ConfigurationSet.java	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
- 
-package com.nokia.ant.types.imaker;
-
-import org.apache.tools.ant.types.DataType;
-import java.util.Vector;
-
-/**
- * Set of iMaker configuration.
- *
- * <pre>
- * &lt;hlm:imakerconfigurationset&gt;
- *     &lt;imakerconfiguration regionalVariation="true"&gt;
- *         &lt;makefileset&gt;
- *             &lt;include name="*&#42;/product/*ui.mk"/&gt;
- *         &lt;/makefileset&gt;
- *         &lt;targetset&gt;
- *             &lt;include name="^core$" /&gt;
- *             &lt;include name="langpack_\d+" /&gt;
- *             &lt;include name="^custvariant_.*$" /&gt;
- *             &lt;include name="^udaerase$" /&gt;
- *         &lt;/targetset&gt;
- *         &lt;variableset&gt;
- *             &lt;variable name="TYPE" value="rnd"/&gt;
- *             &lt;variable name="USE_FOTI" value="0"/&gt;
- *             &lt;variable name="USE_FOTA" value="1"/&gt;
- *         &lt;/variableset&gt;
- *     &lt;/imakerconfiguration&gt;
- * &lt;/hlm:imakerconfigurationset&gt;
- * </pre>
- * @ant.type name="imakerconfigurationset" category="Imaker"
- */
-public class ConfigurationSet extends DataType {
-
-    private Vector configurations = new Vector();
-
-    public ConfigurationSet() {
-    }
-
-    /**
-     * This method create an iMaker Configuration element. 
-     */
-    public Configuration createImakerConfiguration() {
-        Configuration config = new Configuration();
-        configurations.add(config);
-        return config;
-    }
-
-    /**
-     * Get the list of iMaker configuration. 
-     */
-    public Vector getImakerConfiguration() {
-        return configurations;
-    }
-}
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/types/imaker/Variable.java	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
- 
-package com.nokia.ant.types.imaker;
-
-import org.apache.tools.ant.types.DataType;
-
-/**
- * Helper class to store the command line variables for imaker.
- * @ant.type name="variable" category="Imaker"
- */
-public class Variable extends DataType
-{
-    private String mName;
-    private String mValue;
-    
-    public Variable() {
-    }
-    
-    /**
-     * Set the name of the variable.
-     * @param name
-     */
-    public void setName(String name) {
-        mName = name;
-    }
-
-    
-    /**
-     * Get the name of the variable.
-     * @return name.
-     */
-    public String getName() {
-        return mName;
-    }
-
-    /**
-     * Set the value of the variable.
-     * @param value
-     */
-    public void setValue(String value) {
-        mValue = value;
-    }
-
-    
-    /**
-     * Get the value of the variable.
-     * @return value.
-     */
-    public String getValue() {
-        return mValue;
-    }
-
-}
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/types/imaker/VariableSet.java	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
- 
-package com.nokia.ant.types.imaker;
-import org.apache.tools.ant.types.DataType;
-import java.util.Vector;
-
-/**
- * This object stores a set of Variable object.
- * @ant.type name="variableset" category="Imaker"
- */
-public class VariableSet extends DataType {
-    
-    private Vector variables = new Vector();
-    
-    public VariableSet() {
-    }    
-
-    /**
-     * Creates a Variable object.
-     * @return a Variable object.
-     */
-    public Variable createVariable() {
-        Variable var =  new Variable();
-        add(var);
-        return var;
-    }
-    
-    /**
-     * Support the addition of a Variable object.
-     * @param a Variable object.
-     */
-    public void add(Variable var) {
-        variables.add(var);
-    }
-    
-    /**
-     * Get the list of Variable object.
-     * @return a vector of Variable objects
-     */
-    public Vector getVariables() {
-        return variables;
-    }
-    
-}
--- a/buildframework/helium/tools/common/java/src/com/nokia/ant/util/ToolsProcess.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/ant/util/ToolsProcess.java	Wed Dec 23 19:29:07 2009 +0200
@@ -48,14 +48,11 @@
             log.debug("Found tool" + reqTool);
             return tool;
         } catch (ClassNotFoundException e1) {
-            log.debug("Tool not found exception:", e1);
             throw new ToolsProcessException("tool not supported: " + className);
         } catch (InstantiationException e2) {
-            log.debug("Tool instantiation exception: ", e2);
             throw new ToolsProcessException("tool " + toolClass
                     + "cannot be instantiated");
         } catch (IllegalAccessException e3) {
-            log.debug("Tool illegal access exception: ", e3);
             throw new ToolsProcessException("tool " + toolClass
                     + " cannot be accessed");
         }
--- a/buildframework/helium/tools/common/java/src/com/nokia/fmpp/SqlDataLoader.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/fmpp/SqlDataLoader.java	Wed Dec 23 19:29:07 2009 +0200
@@ -14,10 +14,16 @@
 import fmpp.Engine;
 import fmpp.tdd.DataLoader;
 
+import org.apache.log4j.Logger;
+
+
+
 /**
  * 
  */
 public class SqlDataLoader implements DataLoader {
+    
+    private Logger log = Logger.getLogger(SqlDataLoader.class);
 
     private Engine engine;
 
@@ -61,7 +67,7 @@
         ResultSet rs = connection.getMetaData().getTables(this.database, null,
                 null, null);
         while (rs.next()) {
-            System.out.println(rs.getString(3));
+            log.info(rs.getString(3));
             database.put(rs.getString(3), new ArrayList());
         }
         rs.close();
@@ -77,19 +83,18 @@
                     tableName, null);
             List tableStructure = new ArrayList();
             while (rs.next()) {
-                //System.out.println("string4:"+rs.getString(4));
                 tableStructure.add(rs.getString(4));
             }
             String[] fieldNames = (String[]) tableStructure
                     .toArray(new String[] { });
             ArrayList list = new ArrayList();
             ArrayList rowList = new ArrayList();
-            System.out.println("offset" + offset);
+            log.info("offset" + offset);
             // recuperation des donnees
             String sql = "SELECT COUNT(*) AS COUNT FROM " + tableName + " where priority='WARNING';";
             Statement stmt = connection.createStatement();
             rs = stmt.executeQuery(sql);
-            System.out.println("record size of warning:" + rs.getInt("COUNT"));
+            log.info("record size of warning:" + rs.getInt("COUNT"));
             stmt.close();
             sql = "SELECT * FROM " + tableName + " limit 5 offset " + offset + ";";
             stmt = connection.createStatement();
@@ -99,7 +104,6 @@
                     HashMap row = new HashMap();
                     for (int i = 0; i < fieldNames.length; i++) {
                         String fieldName = fieldNames[i];
-                        //System.out.println("fieldName:"+fieldName);
                         list.add(rs.getObject(i + 1));
                         //row.put(fieldName, rs.getObject(i + 1));
                     }
--- a/buildframework/helium/tools/common/java/src/com/nokia/log4j.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/log4j.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -31,7 +31,7 @@
     <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
         <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" 
-                            value="%d{HH:mm:ss,SSS}  %-2p - %m  %n"/>
+                            value="%d{HH:mm:ss,SSS}  %-2p - %-20c{1} - %m  %n"/>
         </layout>
     <filter class="org.apache.log4j.varia.LevelMatchFilter">
       <param name="LevelToMatch" value="DEBUG" />
@@ -45,7 +45,7 @@
         <param name="append" value="false"/>
         <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" 
-                            value="%d{HH:mm:ss,SSS}  %-2p - %m  %n"/>
+                            value="%d{HH:mm:ss,SSS}  %-2p - %-20c{1} - %m  %n "/>
         </layout>
     <filter class="org.apache.log4j.varia.LevelMatchFilter">
       <param name="LevelToMatch" value="DEBUG" />
@@ -60,7 +60,7 @@
         <param name="append" value="false"/>
         <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" 
-                            value="%d{HH:mm:ss,SSS}  %-2p - %m  %n"/>
+                            value="%d{HH:mm:ss,SSS}  %-2p - %-20c{1} - %m  %n"/>
         </layout>
     <filter class="org.apache.log4j.varia.LevelMatchFilter">
       <param name="LevelToMatch" value="DEBUG" />
--- a/buildframework/helium/tools/common/java/src/com/nokia/tools/Tool.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/tools/Tool.java	Wed Dec 23 19:29:07 2009 +0200
@@ -17,7 +17,7 @@
  
 package com.nokia.tools;
 
-import com.nokia.ant.types.VariableSet;
+import com.nokia.helium.core.ant.types.VariableSet;
 import org.apache.tools.ant.Project;
 /**
  * Common interface for the command line tool wrapper
--- a/buildframework/helium/tools/common/java/src/com/nokia/tools/cmt/CMTTool.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/tools/cmt/CMTTool.java	Wed Dec 23 19:29:07 2009 +0200
@@ -17,9 +17,8 @@
  
 package com.nokia.tools.cmt;
 
-import java.util.Enumeration;
-import com.nokia.ant.types.VariableSet;
-import com.nokia.ant.types.Variable;
+import com.nokia.helium.core.ant.types.VariableSet;
+import com.nokia.helium.core.ant.types.Variable;
 import com.nokia.tools.*;
 import java.io.File;
 import org.apache.tools.ant.Project;
@@ -27,11 +26,16 @@
 import java.io.FileWriter;
 import java.io.BufferedWriter;
 import org.apache.tools.ant.DirectoryScanner;
+import org.apache.log4j.Logger;
+
+
 
 /**
  * Command Line wrapper for configuration tools
  */
 public class CMTTool implements Tool {
+    
+    private Logger log = Logger.getLogger(CMTTool.class);
 
     /**
      * Sets the command line variables to be used to execute and validates
@@ -46,10 +50,7 @@
         String keepGoing = "false";
         String varName;
         String value;
-        Enumeration e = varSet.getVariables().elements();
-        Variable variable;
-        while (e.hasMoreElements()) {
-            variable = (Variable)e.nextElement();
+        for (Variable variable : varSet.getVariables()) {
             varName = variable.getName();
             value = variable.getValue();
             if (varName.equals("input")) {
@@ -62,8 +63,16 @@
                 pattern = value;
             }
         }
-           if (input == null || output == null || pattern == null) {
-               throw new ToolsProcessException("CMTTool Parameter missing");
+           if (input == null ) {
+               throw new ToolsProcessException("CMTTool 'input' Parameter missing");
+           }
+           
+           if ( output == null ) {
+               throw new ToolsProcessException("CMTTool 'output' Parameter missing");
+           }
+           
+           if ( pattern == null) {
+               throw new ToolsProcessException("CMTTool 'pattern' Parameter missing");
            }
            generateFileList(input, output,pattern, prj);
            try {
@@ -77,7 +86,9 @@
              task.createArg().setValue(output);
              task.execute();
              org.apache.tools.ant.taskdefs.ExecTask cmt2task = new org.apache.tools.ant.taskdefs.ExecTask();
-             cmt2task.setDir(new File(output).getParentFile()); 
+             File outputdir = new File(output.replace(".txt", "_cmt"));
+             outputdir.mkdir();
+             cmt2task.setDir(outputdir); 
              cmt2task.setTaskName("cmt2html");
              cmt2task.setExecutable("cmt2html.bat");
              cmt2task.createArg().setValue("-i");
@@ -85,7 +96,8 @@
              cmt2task.createArg().setValue("-nsb");
              cmt2task.execute();
         } catch (Exception e1) {
-            e1.printStackTrace();
+         // We are Ignoring the errors as no need to fail the build.
+            log.error(e1.getMessage());
         }       
     }
     
@@ -107,6 +119,8 @@
             }
             outputFile.close();
         } catch (Exception e) {
+            // We are Ignoring the errors as no need to fail the build.
+            log.error(e.getMessage());
             e.printStackTrace();
         }
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/tools/cone/CONETool.java	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,81 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.tools.cone;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tools.ant.Project;
+
+import com.nokia.helium.core.ant.types.VariableSet;
+import com.nokia.tools.Tool;
+import com.nokia.tools.ToolsProcessException;
+
+
+/**
+ * To generate the cenrep files using ConE tool.
+ * 
+ *
+ */
+public class CONETool implements Tool {
+    
+    private Map<String, String> varMapping = new HashMap<String, String>();
+
+    public void execute(VariableSet varSet, Project prj)
+            throws ToolsProcessException {
+        // TODO Auto-generated method stub
+
+    }
+    
+    
+    /**
+     * Run the cone command with arguments from hashmap.
+     * @param prj
+     * @throws ToolsProcessException
+     */
+    public void execute(Project prj) throws ToolsProcessException {
+        
+        org.apache.tools.ant.taskdefs.ExecTask task = new org.apache.tools.ant.taskdefs.ExecTask();
+        task.setTaskName("ConE");
+        task.setDir(new java.io.File(varMapping.get("path")));
+        task.setExecutable("cmd.exe");
+        task.setOutput(new File(varMapping.get("output")));
+        task.createArg().setValue("/c");
+        task.setAppend(true);
+        task.createArg().setValue("cone.cmd");
+        task.createArg().setValue("generate");
+        for (Map.Entry<String, String> varEntry : varMapping.entrySet() ) {
+            if ( !varEntry.getKey().equals("path") && !varEntry.getKey().equals("output")) {
+                task.createArg().setValue(varEntry.getKey());
+                task.createArg().setValue(varEntry.getValue());
+            }
+        }
+        task.execute();
+    }
+    
+    /**
+     * To Store the variable and it value into hashmap to read them later.
+     * @param name
+     * @param value
+     */
+    public void storeVariables(String name, String value) {
+        varMapping.put(name, value);
+    }
+
+}
--- a/buildframework/helium/tools/common/java/src/com/nokia/tools/configuration/CONFIGURATIONTool.java	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/java/src/com/nokia/tools/configuration/CONFIGURATIONTool.java	Wed Dec 23 19:29:07 2009 +0200
@@ -17,10 +17,8 @@
 
 package com.nokia.tools.configuration;
 
-import java.util.Vector;
-import java.util.Enumeration;
-import com.nokia.ant.types.VariableSet;
-import com.nokia.ant.types.Variable;
+import com.nokia.helium.core.ant.types.VariableSet;
+import com.nokia.helium.core.ant.types.Variable;
 import com.nokia.tools.*;
 import org.apache.tools.ant.Project;
 
@@ -47,11 +45,7 @@
         String report = null;
         String varName;
         String value;
-        Vector configSet = varSet.getVariables();
-        Enumeration e = configSet.elements();
-        Variable variable;
-        while (e.hasMoreElements()) {
-            variable = (Variable) e.nextElement();
+        for (Variable variable : varSet.getVariables()) {
             varName = variable.getName();
             value = variable.getValue();
             if (varName.equals("path")) {
--- a/buildframework/helium/tools/common/java/src/com/nokia/tools/sbs/SBSTool.java	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,515 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
- 
-package com.nokia.tools.sbs;
-
-import java.util.Vector;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Enumeration;
-import com.nokia.ant.types.VariableSet;
-import com.nokia.ant.types.SBSMakeOptions;
-import com.nokia.ant.types.Variable;
-import com.nokia.tools.*;
-import org.apache.tools.ant.Project;
-import java.util.Set;
-import org.apache.tools.ant.taskdefs.ExecTask;
-import org.apache.log4j.Logger;
-import java.io.File;
-import org.apache.tools.ant.types.Reference;
-import org.w3c.dom.*;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.transform.*;
-import javax.xml.transform.dom.*;
-import javax.xml.transform.stream.*;
-import java.io.FileWriter;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-//import org.apache.tools.ant.types.Environment;
-/**
- * Command Line wrapper for configuration tools
- */
-public class SBSTool implements Tool {
-    private final String prefix = "--mo=";
-    private final String equalSign = "=";
-    
-    private Logger log;
-    private String layers;
-    private String config;
-    private String skipBuild;
-    private String singleJob;
-    private String layerOrder;
-    private String components;
-    private String command;
-    private String varName;
-    private String sysdefBase;
-    private String enableFilter;
-    private String checkOption;
-    private String whatOption;
-    private String retryOption;
-    private SimpleDateFormat timeFormat;
-    private Date startTime;
-    private Date endTime;
-    
-    
-    public SBSTool() {
-        log = Logger.getLogger(SBSTool.class);
-        timeFormat = new SimpleDateFormat("HH:mm:ss");
-        
-    }
-    /**
-     * Sets the command line variables to be used to execute and validates 
-     * for the required parameters (as Tool interface) 
-     * @param VariableSet variable(name / value list)
-     */    
-    public void execute(VariableSet varSet, Project prj)throws ToolsProcessException {
-        layers = null;
-        config = null;
-        skipBuild = null;
-        singleJob = null;
-        layerOrder = null;
-        components = null;
-        command = null;
-        varName = null;
-        String value = null;
-        sysdefBase = null;
-        enableFilter = null;
-        checkOption = null;
-        whatOption = null;
-        retryOption = null;
-        Vector configSet = varSet.getVariables();
-        log.debug("SBSTool:configSet.size:" + configSet.size());
-        Enumeration e = configSet.elements();
-        Variable variable;
-        while (e.hasMoreElements()) {
-            variable = (Variable)e.nextElement();
-            varName = variable.getName();
-            value = variable.getValue();
-            log.debug("SBSTool:varName:" + varName);
-            log.debug("SBSTool:value:" + value);
-            if (varName.equals("layers")) {
-                layers = value;
-            } else if (varName.equals("config")) {
-                config = value;
-            } else if (varName.equals("skipbuild")) {
-                skipBuild = value;
-            } else if (varName.equals("singlejob")) {
-                singleJob = value;
-            } else if (varName.equals("layer-order")) {
-                layerOrder = value;
-            } else if (varName.equals("command")) {
-                command = value;
-            } else if (varName.equals("components")) {
-                components = value;
-            } else if (varName.equals("sysdef-base")) {
-                sysdefBase = value;
-            } else if (varName.equals("enable-filter")) {
-                enableFilter = value;
-            } else if (varName.equals("run-check")) {
-                checkOption = value;
-            } else if (varName.equals("run-what")) {
-                whatOption = value;
-            } else if (varName.equals("retry-limit")) {
-                retryOption = value;
-            }
-            
-        }
-        execTask(prj);
-    }
-
-    /**
-     * Sets the command line variables to be used to execute and validates 
-     * for the required parameters (as SBSTask) 
-     * @param VariableSet variable(name / value list)
-     */    
-    public void execute(HashMap attributes, Project project)throws ToolsProcessException {
-        layers = null;
-        config = null;
-        skipBuild = null;
-        singleJob = null;
-        layerOrder = null;
-        command = null;
-        components = null;
-        sysdefBase = null;
-        enableFilter = null;
-        retryOption = null;
-        String value = (String)attributes.get("layers");
-        if ( value != null) {
-            layers = value;
-            System.out.println("layers:" + value);
-        }
-        value = (String)attributes.get("config");
-        if (value != null) {
-            config = value;
-            System.out.println("config:" + value);
-        }
-        value = (String)attributes.get("skipbuild");
-        if (value != null) {
-            skipBuild = value;
-            System.out.println("skipbuild:" + value);
-        }
-        value = (String)attributes.get("singlejob");
-        if (value != null) {
-            singleJob = value;
-            System.out.println("singlejob:" + value);
-        }
-        value = (String)attributes.get("layer-order");
-        if (value != null) {
-            layerOrder = value;
-            System.out.println("layer-order:" + value);
-        }
-        value = (String)attributes.get("command");
-        if (value != null) {
-            command = value;
-            System.out.println("command:" + value);
-        }
-        value = (String)attributes.get("components");
-        if (value != null) {
-            components = value;
-        }
-        value = (String)attributes.get("sysdef-base");
-        if (value != null) {
-            sysdefBase = value;
-        }
-        value = (String)attributes.get("enable-filter");
-        if (value != null) {
-            enableFilter = value;
-        } else if (varName.equals("retry")) {
-            retryOption = value;
-        }
-
-        execTask(project);
-    }
-    
-    /**
-     * Task to execute the SBS command 
-     * Updates all the default values for the command, in case
-     * if the options are not provided. 
-     * @param engine - make engine for sbs command
-     * @param layers - layers for sbs commands has to be executed
-     * @param config - configuration to be built (armv5 / winscw) 
-     * @param singleJob - no. of concurrent jobs
-     * @param layerOrder - whether the layer execution should be based on order
-     * @param command - sbs make targets to execute(CLEAN, REALLYCLEAN, TARGET etc.,) 
-     * @param prj - Ant project reference. 
-     */    
-    public void execTask(Project prj) throws ToolsProcessException {
-
-        log.info("SBSTask:executing for SBS task");
-        String partialLogPath = prj.getProperty("build.log.dir") + "/" + prj.getProperty("build.id");
-        String sysdefConfig = prj.getProperty("sysdef.configuration");
-        String sbsLogName = "";
-        ExecTask task = new ExecTask();
-        task.setTaskName("sbs");
-        String osType = System.getProperty("os.name");
-        log.debug("SBSTask:ostype:" + osType);
-        if (osType.toLowerCase().startsWith("win")) {
-            task.setExecutable("sbs.bat");
-        } else {
-            task.setExecutable("sbs");
-        }
-        task.setFailonerror(true);
-        task.setDir(new java.io.File(prj.getProperty("build.drive") + "/"));
-        log.debug("SBSTask:root dir:" + prj.getProperty("build.drive") + "/");
-        task.createArg().setValue("-s");
-        String sysdefFile = prj.getProperty("build.output.dir") + "/build/canonical_system_definition_" + sysdefConfig + ".xml";
-        task.createArg().setValue(sysdefFile);
-        if (layerOrder != null) {
-            task.createArg().setValue("-o");
-        }
-        task.createArg().setValue("-k");
-        sbsLogName += setLayerArgs(task);
-        sbsLogName += setConfigArgs(task);
-        Object makeOptReference = prj.getReference("sbs.internal.make.options");
-        sbsLogName += updateSBSMakeOptions(makeOptReference, prj, task);
-        if ( skipBuild != null ) {
-            log.debug("SBSTask:makeOptions.skipping build:" + skipBuild);
-            sbsLogName += "_nobuild";
-            if (skipBuild.equals("true")) {
-                task.createArg().setValue("-n");
-            }
-        }
-        if (command != null) {
-            log.debug("SBSTask:command:" + command);
-            sbsLogName += command;
-            task.createArg().setValue(command);
-        }
-        if (sysdefBase != null) {
-            log.debug("SBSTask:sysdefBase:" + sysdefBase);
-            task.createArg().setValue("-a");
-            task.createArg().setValue(sysdefBase);
-        }
-        String logFileName = partialLogPath + "." + sysdefConfig + "_compile.log";
-        sbsLogName = convertSpecialCharacters(sbsLogName);
-        String tempPath = partialLogPath + "_" + sbsLogName + "_" + sysdefConfig;
-        task.createArg().setValue("-m");
-        task.createArg().setValue(tempPath + "_Makefile");
-        String additionalFilters = "";
-        /*
-         * commented as changes from raptor is required and is not there yet. Further 
-         * discussions on to handle in a better way.
-         */
-        if (whatOption != null && whatOption.equals("true")) {
-            task.createArg().setValue("--what");
-        }
-        /*
-        //When whatOption is set to true, then it uses the filterWhat plugin to generate the 
-        // what log (which is generated during the build phase)
-        if (whatOption != null && whatOption.equals("true")) {
-            Environment.Variable var = new Environment.Variable();
-            var.setKey("FILTERWHAT_FILE");
-            var.setValue(partialLogPath + "." + sysdefConfig + "_what.log");
-            log.debug("SBSTask:filterwhatlog file:" + (partialLogPath + "." + sysdefConfig + "_what.log"));
-            task.addEnv(var);
-            additionalFilters = ",filterWhat";
-        }
-        //When checkOption is set to true, then in filterHeliumLog during summary file generation
-        // what log is read and checked for the existance of the file in what log. If the file doesn't exists
-        // then it writes it to the check log. Requested this operation to be in raptor plugin rather than
-        // in helium plugin, but 
-        // what log (which is generated during the build phase)
-        if (checkOption != null && checkOption.equals("true")) {
-            Environment.Variable var = new Environment.Variable();
-            var.setKey("FILTERCHECK_FILE");
-            var.setValue(partialLogPath + "." + sysdefConfig + "_check.log");
-            log.debug("SBSTask:filterchecklog file:" + (partialLogPath + "." + sysdefConfig + "_check.log"));
-            task.addEnv(var);
-            additionalFilters = ",filterWhat";
-        }
-        */
-        if (checkOption != null && checkOption.equals("true")) {
-            task.createArg().setValue("--check");
-        }
-        task.createArg().setValue("--filters=FilterMetadataLog" + additionalFilters);
-        String sbsStatsFile = partialLogPath + "." + sysdefConfig + "_sbs_info.xml";
-        if (retryOption != null) {
-            //the problem could be that if the failure happened for some other reason
-            //it would still retry
-            log.debug("building with retry:");
-            task.createArg().setValue("--tries");
-            task.createArg().setValue(retryOption);
-        }
-        task.createArg().setValue("-f");
-        task.createArg().setValue(tempPath + "_compile.log");
-        String outputFileName = tempPath + ".sbs_ant_output.log";
-        log.debug("SBSTask:outputfilename:" + outputFileName);
-        log.debug("SBSTask:sbsLogName:" + sbsLogName);
-        task.setOutput(new File(outputFileName));
-        startTime = new Date();
-        
-        try {
-            task.execute();
-        } catch (Exception ex) {
-            //Sometime null pointer exception is thrown in linux
-            log.debug("Warning: exception during executing sbs task", ex);
-        }
-        try {
-            log.debug("SBSTask:sbs.log.file:" + tempPath + "_compile.log");
-            prj.setProperty("sbs.log.file", tempPath + "_compile.log");
-        } catch (Exception e) {
-            log.debug("SBSTask:sysdefBase:copying the log file with sbs config failed");
-        }
-        endTime = new Date();
-        updateSBSLogStatistics(sbsStatsFile, tempPath + "_compile.log");
-    }
-
-    private String updateSBSMakeOptions(Object makeOptReference, Project prj, ExecTask task) {
-        String retValue = "";
-        if (makeOptReference != null && makeOptReference instanceof SBSMakeOptions) {
-            Object makeOptObject = ((Reference)((SBSMakeOptions)makeOptReference).getRefid()).getReferencedObject();
-            if (makeOptObject != null && makeOptObject instanceof SBSMakeOptions) {
-                log.debug("SBSTask:makeOptReference: not null");
-                SBSMakeOptions sbsMakeOptions = (SBSMakeOptions)makeOptObject;
-                String engine = sbsMakeOptions.getEngine();
-                log.info("SBSTask:with engine:" + engine);
-                if (engine != null && engine.equals("emake")) {
-                    emake(task, sbsMakeOptions, prj);
-                } else if (engine != null && engine.equals("gmake")) {
-                    retValue += gmake(task, prj);
-                }
-            }
-        }
-        return retValue;
-    }
-    
-    private void updateSBSLogStatistics(String infoFileName, 
-            String logFileName) {
-
-        try {
-            DocumentBuilderFactory sbsInfo = DocumentBuilderFactory.newInstance();
-            DocumentBuilder docBuilder = sbsInfo.newDocumentBuilder();
-            Document doc = docBuilder.newDocument();
-            Element root = doc.createElement("sbsinfo");
-            doc.appendChild(root);
-            Element child = doc.createElement("logfile");
-            child.setAttribute("name", logFileName);
-            root.appendChild(child);
-            
-            child = doc.createElement("duration");
-            //Todo: handle if the time difference is greater than 24 hours
-            child.setAttribute("time", timeFormat.format(new Date(endTime.getTime() - startTime.getTime())));
-            root.appendChild(child);
-            Transformer transformer = TransformerFactory.newInstance().newTransformer();
-            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
-            FileWriter sbsWriter = new FileWriter(infoFileName);
-            StreamResult result = new StreamResult(sbsWriter);
-            DOMSource sbsSource = new DOMSource(doc);
-            transformer.transform(sbsSource, result);
-        } catch (Exception ex) {
-            log.debug("exception while xml writing sbs log info", ex);
-        }
-        
-    }
-
-    
-    private String setLayerArgs(ExecTask task)
-    {
-        String logName = "";
-        if (layers != null) { 
-            String[] lList = layers.split(","); 
-            for (int i = 0;i < lList.length; i++) { 
-                log.debug("SBSTask:llist:" + lList[i]); 
-                logName += "_" + lList[i]; 
-                task.createArg().setValue("-l"); 
-                task.createArg().setValue(lList[i]); 
-            } 
-        }
-        return logName;
-    }
-    
-    private String setConfigArgs(ExecTask task)
-    {
-        String logName = "";
-        if (config != null) {
-            String[] configList = config.split(",");
-            for (int i = 0; i < configList.length; i++) {
-                logName += "_" + configList[i];
-                task.createArg().setValue("-c");
-                task.createArg().setValue(configList[i]);
-            }
-        }
-        return logName;
-    }
-    
-    private String gmake(ExecTask task, Project prj)
-    {
-        log.info("SBSTask:normal gmake");
-        if (singleJob == null) {
-            log.debug("SBSTask:building using multiple thread");
-            task.createArg().setValue("-j");
-            task.createArg().setValue(prj.getProperty("number.of.threads"));
-            return "_multiple_thread";
-        } else if (singleJob.equals("true")) {
-            task.createArg().setValue("-j");
-            task.createArg().setValue("1");
-            return "_single_thread";
-        }
-        return "";
-    }
-    
-    private void emake(ExecTask task, SBSMakeOptions sbsMakeOptions, Project prj)
-    {
-        HashMap makeOptMap = new HashMap();
-        Vector makeOptions = sbsMakeOptions.getVariables();
-        Enumeration makeOptEnum = makeOptions.elements();
-        Variable variable = null;
-        while (makeOptEnum.hasMoreElements()) {
-            variable = (Variable)makeOptEnum.nextElement();
-            log.debug("SBSTask:makeOptions.variable-name:" + variable.getName());
-            log.debug("SBSTask:makeOptions.variable-name:" + variable.getValue());
-            makeOptMap.put(variable.getName(),variable.getValue());
-        }
-        updatedMakeOptions(sbsMakeOptions.getEngine(), makeOptMap, prj);
-        log.info("SBSTask:updating all make options");
-        
-        String makeOpt = null;
-        task.createArg().setValue("-e");
-        task.createArg().setValue("emake");
-        Set keys = makeOptMap.keySet();
-        for ( Iterator listIter = keys.iterator(); listIter.hasNext(); ) {
-            makeOpt = (String)listIter.next();
-            String param = prefix + makeOpt;
-            String paramValue = (String)makeOptMap.get(makeOpt);
-            if (paramValue != null ) {
-                param += equalSign + paramValue;
-            }
-            task.createArg().setValue( param );
-            log.debug("SBSTask:makeOptions.variable-name:" + param);
-        }
-    }
-    
-        /**
-         * Updates the make options with default values if not provided. 
-         * @param engine - make engine for sbs command
-         * @param prj - Ant project reference. 
-        */
-    private void updatedMakeOptions(String engine, HashMap makeOptsMap, Project prj) {
-        log.info("Updating default make options along with passed options");
-        if (engine.equals("emake")) {
-            if (makeOptsMap.get("--emake-root") == null) {
-                String emakeRoot = prj.getProperty("env.EMAKE_ROOT") + ";" + prj.getProperty("helium.dir") + ";" +
-                        prj.getProperty("build.drive") + "/;" + prj.getProperty("env.SBS_HOME");
-                makeOptsMap.put("--emake-root",emakeRoot);
-                log.debug("SBSTask:adding --emake-root:" + emakeRoot);
-            }
-            if (makeOptsMap.get("--emake-annodetail") == null) {
-                log.debug("SBSTask:adding --emake-annodetail:");
-                makeOptsMap.put("--emake-annodetail","basic,history,waiting");
-            }
-            if (makeOptsMap.get("--emake-historyfile") == null) {
-                log.debug("SBSTask:adding --emake-historyfile");
-                String emakeHistoryDIR = prj.getProperty("build.log.dir") + "/ec_history/";
-                File emakeHistoryDIRFile = new File(emakeHistoryDIR);
-                if (!emakeHistoryDIRFile.exists()) {
-                    boolean successus = emakeHistoryDIRFile.mkdir();
-                    log.debug("SBSTask:history dir created status :" + emakeHistoryDIRFile + ":" + successus);
-                }
-                String emakeHistoryFile = emakeHistoryDIR + "emake_" + prj.getProperty("sysdef.configuration") + ".data";
-                makeOptsMap.put("--emake-historyfile",emakeHistoryFile);
-                log.debug("SBSTask:adding --emake-historyfile" + emakeHistoryFile);
-            }
-            if (makeOptsMap.get("--emake-annofile") == null) {
-                log.debug("SBSTask:adding --emake-annofile");
-                String annofile = prj.getProperty("build.log.dir") + "/" + 
-                                prj.getProperty("build.id") + ".xml";
-                makeOptsMap.put("--emake-annofile",annofile);
-                log.debug("SBSTask:adding --emake-annofile" + annofile);
-            }
-            if (makeOptsMap.get("--emake-emulation") == null) {
-                makeOptsMap.put("--emake-emulation", "gmake");
-                log.debug("SBSTask:adding --emake-emulation:gmake");
-            }
-        }
-    }
-    
-    private String convertSpecialCharacters(String inputFileName) {
-        int colonIndex = 0;
-        String resultString;
-        colonIndex = inputFileName.indexOf(':');
-        if ((colonIndex != -1) && (inputFileName.substring(0, colonIndex + 2)).endsWith(":\\")) {
-            resultString = inputFileName.substring(0, colonIndex + 2);
-            String remainingString = inputFileName.substring(colonIndex + 2);
-            remainingString = remainingString.replaceAll(":","_");
-            resultString += remainingString;
-        } else {
-            resultString = inputFileName.replaceAll(":", "_");
-        }
-        return resultString;
-    }
-}
--- a/buildframework/helium/tools/common/libs.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/libs.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -47,18 +47,5 @@
     
     <!-- Nokia internal tasks. -->
     <taskdef resource="com/nokia/ant/antlib.xml" classpathref="lib.path" uri="http://www.nokia.com/helium"/>
-
-
-    <!-- This step load the com.nokia.ant.BSFJepEngine class and activate the BSF 
-       registration mechanism.
-    -->
-    <if>
-        <not>
-            <available classname="com.nokia.ant.BSFJepEngine"/>
-        </not>
-        <then>
-            <echo>Jepp is not installed.</echo>    
-        </then>    
-    </if>    
         
 </project>
--- a/buildframework/helium/tools/common/logging.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/logging.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -26,10 +26,10 @@
     </description>
     <!-- Merges all XML log files ending in ".log2.xml" in the build log directory
     into a single summary log file. -->
-    <target name="log-merge" unless="metadata.enable" >
+    <target name="log-merge"  unless="metadata.enable">
         <mkdir dir="${build.log.dir}"/>
         <dependset>
-            <srcfileset dir="${build.log.dir}" includes="${build.id}*.log.xml"/>
+            <srcfileset dir="${build.log.dir}" includes="**/${build.id}*.log.xml"/>
             <targetfileset file="${build.summary.file}"/>
         </dependset>
         <if>
@@ -49,7 +49,10 @@
                 <for param="file">
                     <path>
                         <fileset dir="${build.log.dir}">
-                            <include name="${build.id}*.log.xml"/>
+                            <include name="**/${build.id}*.log.xml"/>
+                        </fileset>
+                        <fileset dir="${temp.build.dir}">
+                            <include name="**/${build.id}*.log.xml"/>
                         </fileset>
                     </path>
                     <sequential>
@@ -76,17 +79,33 @@
     
     <!-- Outputs an HTML readable version of the summary log. -->
     <target name="render-log-summary">
-        <fmpp sourceFile="${helium.dir}/tools/common/templates/log/summary_metadata.html.ftl"
-                     outputfile="${build.log.dir}/summary/${build.id}_summary.html">
-            <freemarkerLinks expandProperties="yes">
-                macro: ${helium.dir}/tools/common/templates/macro
-            </freemarkerLinks>
-            <data expandProperties="yes">
-                dbPath: ${metadata.dbfile}
-                loginfo: xml(${build.log.dir}/${build.id}_info.log.xml)
-                ant: antProperties()
-            </data>
-        </fmpp>
+        <if>
+            <and>
+                <available file="${build.log.dir}/${build.id}_info.log.xml"/>
+                <available file="${metadata.dbfile}"/>
+            </and>
+            <then>
+                <fmpp sourceFile="${helium.dir}/tools/common/templates/log/summary_metadata.html.ftl"
+                             outputfile="${build.log.dir}/${build.id}_summary.html">
+                    <freemarkerLinks expandProperties="yes">
+                        macro: ${helium.dir}/tools/common/templates/macro
+                    </freemarkerLinks>
+                    <data expandProperties="yes">
+                        dbPath: ${metadata.dbfile}
+                        loginfo: xml(${build.log.dir}/${build.id}_info.log.xml)
+                        ant: antProperties()
+                    </data>
+                </fmpp>
+                <if>
+                    <not>
+                        <available file="${build.log.dir}/${build.id}_summary.html"/>
+                    </not>
+                    <then>
+                        <echo message="Error: failed to generate Summary file" />
+                    </then>
+                </if>
+            </then>
+        </if>
     </target>
     
     <!-- Prepare email for build summary -->
--- a/buildframework/helium/tools/common/python/lib/ant.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/ant.py	Wed Dec 23 19:29:07 2009 +0200
@@ -27,7 +27,7 @@
 
 def get_property(property_name):
     """ This function return None if a property has not been replaced by Ant. """
-    if len(property_name) > 0 and property_name.startswith('${'):
+    if len(property_name) > 0 and (property_name.startswith('${') or property_name.startswith('@{')):
         return None
     return property_name
 
@@ -42,7 +42,9 @@
             bn_num_int = int(bn_num)
             if bn_num_int > 1:
                 previous_bn_num_int = bn_num_int - 1
-                previous_bn_num = str(previous_bn_num_int).rjust(len(bn_num), '0')
+                previous_bn_num = str(previous_bn_num_int)
+                if bn_num.startswith('0'):
+                    previous_bn_num = previous_bn_num.rjust(len(bn_num), '0')
                 previous_bn = previous_bn_num
                 if bn_txt != None:
                     previous_bn = '%s%s' % (bn_txt, previous_bn_num)
--- a/buildframework/helium/tools/common/python/lib/archive/builders.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/archive/builders.py	Wed Dec 23 19:29:07 2009 +0200
@@ -215,3 +215,4 @@
 
         writer = buildtools.get_writer(self.writerType, outputname)
         writer.write(self.create_command_list(commands))
+        writer.close()
--- a/buildframework/helium/tools/common/python/lib/archive/mappers.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/archive/mappers.py	Wed Dec 23 19:29:07 2009 +0200
@@ -24,7 +24,6 @@
 
 import buildtools
 import os
-import sys
 import codecs
 import fileutils
 import logging
@@ -288,16 +287,30 @@
                     break
             
             value = self._config.get('policy.default.value', MISSING_POLICY)
-            if policyfile != None:
+            if policyfile != None:      #policy file present
                 try:
                     value = fileutils.read_policy_content(policyfile)
-                    if value not in self._binary.keys():
+                    if value not in self._binary.keys():    #check policy file is valid
                         _logger.error("POLICY_ERROR: policy file found %s but policy %s value not exists in csv" % (policyfile, value))
                 except Exception, exc:
                     _logger.error("POLICY_ERROR: %s" % exc)         
                     value = self._config.get('policy.default.value', MISSING_POLICY)
-            else:
-                _logger.error("POLICY_ERROR: could not find a policy file under: '%s'" % dirname)
+            else:       #no policy file present
+                filePresent = False
+                dirPresent = False
+                for ftype in os.listdir(dirname):   #see if files or directories are present
+                    if os.path.isdir(os.path.join(dirname, ftype)):
+                        dirPresent = True
+                    if os.path.isfile(os.path.join(dirname, ftype)):
+                        filePresent = True
+                        
+                if filePresent:    #files present : error     
+                    _logger.error("POLICY_ERROR: could not find a policy file under: '%s'" % dirname)
+                elif dirPresent and not filePresent:  #directories only : warning
+                    _logger.error("POLICY_WARNING: no policy file, no files present, but sub-folder present in : '%s'" % dirname)
+                else:       #no files no dirs : warning
+                    _logger.error("POLICY_WARNING: empty directory at : '%s'" % dirname)
+                
             # saving the policy value for that directory.
             self._policy_cache[dirname] = value
         return self._policy_cache[dirname]
--- a/buildframework/helium/tools/common/python/lib/ats3/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -66,12 +66,12 @@
         self.obey_pkgfiles = to_bool(self._opts.obey_pkgfiles)
         self.tsrc_paths_dict = {}
 
-        ats_nd = self._opts.ats_network_drive.strip()
+        ats_nd = self._opts.ctc_run_process_params.strip()
         if ats_nd != "":
             ats_nd = ats_nd.split("#")[0].strip()
             if ats_nd == "":
-                self._opts.ats_network_drive = ""
-                _logger.warning("Property \'ats.atsnetwork.drive\' is not set. Code coverage measurement report(s) will not be created.")
+                self._opts.ctc_run_process_params = ""
+                _logger.warning("Property \'ats.ctc.host\' is not set. Code coverage measurement report(s) will not be created.")
                 
         main_comps = []
                 
@@ -128,7 +128,7 @@
 
     def __init__(self, config):
         self.diamonds_build_url = config.diamonds_build_url
-        self.ats_network_drive = config.ats_network_drive
+        self.ctc_run_process_params = config.ctc_run_process_params
         self.testrun_name = config.testrun_name
         self.harness = config.harness
         self.device_type = config.device_type
@@ -233,33 +233,35 @@
         """ATS3 post actions."""
         actions = []
         temp_var = ""
+        include_ctc_runprocess = False
         report_path = self.file_store.joinpath(self.REPORT_PATH)
         
-        if self.ctc_enabled and adg.CTC_PATHS_LIST != [] and self.monsym_files != "":
+        if self.ctc_enabled and adg.CTC_PATHS_LIST != [] and self.monsym_files != "" and not "${" in self.monsym_files:
+            include_ctc_runprocess = True
             ctc_params = "--ctcdata_files="
             for cdl in adg.CTC_PATHS_LIST:
-                ctc_params += cdl + ";"
+                ctc_params += cdl + '\\ctcdata.txt' + ";"
                 temp_var = cdl
             
-            network_path = r"\\" + self.ats_network_drive.rsplit("#", 1)[0]
+            network_path = r"\\" + self.ctc_run_process_params.rsplit("#", 2)[0]
+            drop_count = self.ctc_run_process_params.rsplit("#", 1)[1]
             temp_var = temp_var.split("ctc_helium"+os.sep)[1]
             diamonds_id = temp_var.split(os.sep)[0]
             drop_id = temp_var.split(os.sep)[1].split(os.sep)[0]
+            drop_id = re.findall(".*drop(\d*)", drop_id.lower())[0] #extracting int part of drop name
+           
             output_path = os.path.join(network_path, "ctc_helium_http_root", diamonds_id, drop_id)
-            ctc_params += r" --output_dir_html=" + output_path  
+ 
             ctc_params += r" --monsym_files=" + self.monsym_files
             ctc_params += r" --diamonds_build_id=" + diamonds_id
-            
-            #ctc_params += r" --monsym_files=\\10.11.3.2\ctc_helium\<diamonds>\mon_syms\<number>\mon.sym"  
+            ctc_params += r" --drop_id=" + drop_id
+            ctc_params += r" --total_amount_of_drops=" + drop_count
             
             runprocess_action = ("RunProcessAction", 
-                            (("file", r"c:/apps/catsctc2html/catsctc2html.exe"),
-                             ("dir", r"c:/apps/catsctc2html/"),
+                            (("file", r"catsctc2html/catsctc2html.exe"), #this line will be executing on Windows machine.
                              ("parameters", ctc_params)))
             
-            #"&lt;a href=&quot;http://" + self.ats_network_drive.rsplit("#", 1)[0] + "/" + diamonds_id + "/" + drop_id + "/index.html&quot;&gt;CTC Coverage Reports&lt;/a&gt;"
-            email_url = " CTC report can be found from: http://" + self.ats_network_drive.rsplit("#", 1)[0] + "/" + diamonds_id + "/" + drop_id + "/index.html"
-            
+            email_url = " CTC report can be found from: " + self.diamonds_build_url
 
             email_action = ("SendEmailAction", 
                             (("subject", self.EMAIL_SUBJECT),
@@ -293,7 +295,7 @@
         diamonds_action = ("DiamondsAction", ())
 
         
-        if self.ctc_enabled == "True" and adg.CTC_PATHS_LIST != [] and self.monsym_files != "":
+        if include_ctc_runprocess:
             actions.append(runprocess_action)
             
         if self.diamonds_build_url:
@@ -360,7 +362,30 @@
 
     test_plan.set_plan_harness()
 
-    generator = adg.Ats3TestDropGenerator()
+
+    #Checking if any non executable set exists
+    #if yes, delete the set
+    tesplan_counter = 0
+    for plan_sets in test_plan.sets:
+        tesplan_counter += 1
+        exe_flag = False
+        for srcanddst in plan_sets['src_dst']:
+            _ext = srcanddst[0].rsplit(".")[1]
+            #the list below are the files which are executable
+            #if none exists, set is not executable
+            for mat in ["dll", "ini", "cfg", "exe", "script"]:
+                if mat == _ext.lower():
+                    exe_flag = True
+                    break
+            if exe_flag: break
+        
+        if not exe_flag: #the set does not have executable, deleting the set
+            del test_plan.sets[tesplan_counter - 1]
+        
+    if config.ats4_enabled.lower() == 'true':
+        generator = adg.Ats3TemplateTestDropGenerator()
+    else:
+        generator = adg.Ats3TestDropGenerator()
     _logger.info("generating drop file: %s" % config.drop_file)
     generator.generate(test_plan, output_file=config.drop_file, config_file=config.config_file)
 
@@ -392,7 +417,7 @@
     cli.add_option("--ctc-enabled", help="CTC enabled", default="False")
     cli.add_option("--multiset-enabled", help="Multiset enabled", default="False")
     cli.add_option("--diamonds-build-url", help="Diamonds build url")
-    cli.add_option("--ats-network-drive", help="ATS Network drive where MON.sym files are stored")
+    cli.add_option("--ctc-run-process-params", help="ctc parameters include ctc host, drop id and total number of drops, separated by '#'")
     cli.add_option("--drop-file", help="Name for the final drop zip file",
                    default="ATS3Drop.zip")
     cli.add_option("--file-store", help="Destination path for reports.",
@@ -421,6 +446,7 @@
                    default="run")
     cli.add_option("--config", help="Path to the config file",
                    default="")
+    cli.add_option("--ats4-enabled", help="ATS4 enabled", default="False")
     cli.add_option("--obey-pkgfiles", help="If this option is True, then only test components having PKG file are executable and if the compnents don't have PKG files they will be ignored.", default="False")
     cli.add_option("--verbose", help="Increase output verbosity", 
                    action="store_true", default=False)
--- a/buildframework/helium/tools/common/python/lib/ats3/aste.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/aste.py	Wed Dec 23 19:29:07 2009 +0200
@@ -34,6 +34,8 @@
 
 from path import path
 import amara
+import ntpath as atspath
+import jinja2
 
 _logger = logging.getLogger('ats3')
 
@@ -355,6 +357,26 @@
         test_plan.insert_set(image_files=self.flash_images,
                              test_timeout=list(self.test_timeout))
                                 
+class AsteTemplateTestDropGenerator(AsteTestDropGenerator):
+    def getlogdir(self, setd):
+        return self.ASTE_LOG_DIR
+    
+    def aslfiles(self, test_plan):
+        files = []
+        
+        testasset_location = path(test_plan["testasset_location"])
+        for file_ in list(testasset_location.walkfiles()):
+            if file_.endswith('.asl'):
+                files.append(file_.replace(testasset_location + os.sep, ""))
+        return files
+    
+    def generate_xml(self, test_plan):
+        loader = jinja2.ChoiceLoader([jinja2.FileSystemLoader(os.path.join(os.environ['HELIUM_HOME'], 'tools/common/python/lib/ats3/templates'))])
+        env = jinja2.Environment(loader=loader)
+        template = env.from_string(open(os.path.join(os.environ['HELIUM_HOME'], 'tools/common/python/lib/ats3/aste_template.xml')).read())
+        
+        xmltext = template.render(test_plan=test_plan, os=os, atspath=atspath, atsself=self).encode('ISO-8859-1')
+        return et.ElementTree(et.XML(xmltext))
 
 def create_drop(config):
     """Create a test drop."""    
@@ -363,7 +385,10 @@
     test_plan = AsteTestPlan(config)
     parser = AsteComponentParser(config)
     parser.insert_test_set(test_plan) ######check here if something goes wrong, removed ", path(tsrc)"
-    generator = AsteTestDropGenerator()
+    if config.ats4_enabled.lower() == 'true':
+        generator = AsteTemplateTestDropGenerator()
+    else:
+        generator = AsteTestDropGenerator()
     _logger.info("generating drop file: %s" % config.drop_file)
     generator.generate(test_plan, output_file=config.drop_file)
 
@@ -405,6 +430,7 @@
                    default="English")     
     cli.add_option("--software-release", help="Software release or product name e.g. PPD 52.50",
                    default="")     
+    cli.add_option("--ats4-enabled", help="ATS4 enabled", default="False")
     cli.add_option("--verbose", help="Increase output verbosity",
                    action="store_true", default=False)
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/aste_template.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
+<!-- 
+============================================================================ 
+Name        : aste_template.xml
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+Contains the template for the test.xml file output. The test.xml file contains
+information on the files used to create the drop file.
+============================================================================
+-->
+
+{% import 'ats4_macros.xml' as macros with context %}
+
+<testrun>
+    <metadata>
+        {% if test_plan['diamonds_build_url'] -%}
+        <meta name="diamonds-buildid">{{ test_plan['diamonds_build_url'] }}</meta> 
+        <meta name="diamonds-testtype">Smoke</meta>
+        {% endif %}
+        <meta name="name">{{ test_plan['testrun_name'] }}</meta> 
+    </metadata>
+    
+    <agents>
+        <agent alias="DEFAULT_{{ test_plan['harness'] }}">
+            <property name="hardware" value="{{ test_plan["device_type"] }}"/>
+        </agent>
+    </agents>
+    
+    {% include 'preset_custom.xml' ignore missing %}
+    
+    {% for setd in test_plan.sets -%}
+    <execution defaultAgent="DEFAULT_{{ test_plan['harness'] }}">        
+        <initialization>
+            {% include 'prestep_custom.xml' ignore missing %}
+        
+            {% if setd.image_files -%}
+            <task>
+                <type>FlashTask</type>
+                <parameters>
+                {% set i = 1 %}
+                {% for img in setd.image_files -%}
+                    <parameter name="image-{{ i }}" value="ATS3Drop\images\{{ os.path.basename(img) }}" />
+                    {% set i = i + 1 %}
+                {% endfor -%}
+                </parameters>
+            </task>
+            {% endif %}
+            
+            {% if setd["ctc_enabled"] == "True" -%}
+            {{ macros.ctc_initialization() }}
+            {% endif %}
+            
+            <task>
+                <type>CreateDirTask</type>
+                <parameters>                
+                    <parameter value="{{ atsself.getlogdir(setd) }}" name="dir"/>
+                </parameters>
+            </task>
+                      
+          {% if setd.has_key("sis_files") and setd["sis_files"] -%}
+              {% for sis_file in setd["sis_files"] -%}
+            <task>
+                <type>FileUploadTask</type>
+                <parameters>
+                    <parameter name="src" value="ATS3Drop\{{ setd.name }}\sis\{{ os.path.basename(sis_file) }}"/>
+                    <parameter name="dst" value="c:\testframework\{{ os.path.basename(sis_file) }}"/>
+                </parameters>
+            </task>
+              {% endfor -%}
+          {% else %}
+              {% if setd['src_dst'] != [] -%}
+                {% for file in setd['src_dst'] -%}            
+            <task>
+                <type>FileUploadTask</type>
+                <parameters>
+                    <parameter value="ATS3Drop\{{ setd.name }}\{{ file[1].replace(":", "") }}" name="src"/>
+                    <parameter value="{{ file[1] }}" name="dst"/>
+                </parameters>
+            </task>
+                {% endfor -%}
+              {% else %}
+                  {% for data_file in setd["data_files"] -%}
+            <task>
+                <type>FileUploadTask</type>
+                <parameters>
+                    <parameter name="src" value="ATS3Drop\{{ setd.name }}\data\{{ os.path.basename(data_file) }}"/>
+                    <parameter name="dst" value="e:\testing\data\{{ os.path.basename(data_file) }}"/>
+                </parameters>
+            </task>
+                  {% endfor -%}
+                  {% for data_file in setd["config_files"] -%}
+            <task>
+                <type>FileUploadTask</type>
+                <parameters>
+                    <parameter name="src" value="ATS3Drop\{{ setd.name }}\conf\{{ os.path.basename(data_file) }}"/>
+                    <parameter name="dst" value="e:\testing\conf\{{ os.path.basename(data_file) }}"/>
+                </parameters>
+            </task>
+                  {% endfor -%}
+                  {% for data_file in setd["testmodule_files"] -%}
+            <task>
+                <type>FileUploadTask</type>
+                <parameters>
+                    <parameter name="src" value="ATS3Drop\{{ setd.name }}\testmodules\{{ os.path.basename(data_file) }}"/>
+                    <parameter name="dst" value="c:\sys\bin\{{ os.path.basename(data_file) }}"/>
+                </parameters>
+            </task>
+                  {% endfor -%}
+              {% endif %}
+          {% endif %}
+          
+          {% if setd.engine_ini_file -%}
+              {% if (setd.has_key("sis_files") and setd["sis_files"]) or setd["src_dst"] == [] -%}
+            <task>
+                <type>FileUploadTask</type>
+                <parameters>
+                    <parameter name="src" value="ATS3Drop\{{ setd.name }}\init\{{ os.path.basename(setd["engine_ini_file"]) }}"/>
+                    <parameter name="dst" value="c:\testframework\{{ os.path.basename(setd["engine_ini_file"]) }}"/>
+                </parameters>
+            </task>
+              {% endif %}
+          {% endif %}
+          
+          {% for sis_file in setd["sis_files"] -%}
+            <task>
+               <type>InstallSisTask</type>
+               <parameters>
+                    <parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
+                    <parameter name="upgrade-data " value="true"/>
+                    <parameter name="ignore-ocsp-warnings" value="true"/>
+                    <parameter name="ocsp-done" value="true"/>
+                    <parameter name="software-package" value="c:\testframework\{{ os.path.basename(sis_file) }}"/>
+               </parameters>
+            </task>
+          {% endfor -%}
+        </initialization>    
+        
+        {% include 'prerun_custom.xml' ignore missing %}
+
+        <task>
+           <type>SetTestAssetPackageTask</type>
+           <parameters>
+              <parameter name="file" value="ATS3Drop\TestAssets\TestAsset.zip"/>
+           </parameters>
+        </task>
+        
+        <task>
+           <type>ExecuteTestAssetTask</type>
+           <parameters>
+          {% set i = 1 %}     
+          {% for name in atsself.aslfiles(test_plan) -%}
+              <parameter name="script_{{ i }}" value="{{ name }}"/>
+              {% set i = i + 1 %}
+          {% endfor -%}
+           </parameters>
+        </task>
+        
+        {% include 'postrun_custom.xml' ignore missing %}
+        
+        <finalization>
+        {% if setd["ctc_enabled"] == "True" -%}
+        {{ macros.ctc_finalization(setd) }}
+        {% endif %}
+
+            <task>
+                <type>FileDownloadTask</type>
+                <parameters>
+                    <parameter value="{{ atsself.getlogdir(setd) }}\*" name="dir"/>
+                </parameters>
+            </task>
+        {% include 'poststep_custom.xml' ignore missing %}
+        </finalization>
+        
+    </execution>    
+    {% endfor -%}
+    
+    {% include 'postset_custom.xml' ignore missing %}
+    
+    <postActions>
+        {% include 'prepostaction.xml' ignore missing %}
+        {% for action_type, parameters in test_plan.post_actions -%}
+            {% if action_type == 'RunProcessAction' %}
+        <action>
+            <type>{{ action_type }}</type>
+            <parameters>
+                {% for name, value in parameters -%}
+                <parameter name="{{ name }}" value="{{ value }}"/>
+                {% endfor -%}
+            </parameters>
+        </action>
+            {% endif %}
+        {% endfor -%}
+        {% if test_plan['report_email'] -%}
+        <action>
+            <type>EmailAction</type>
+            <parameters>
+                <parameter value="Release testing" name="subject"/>
+                <parameter value="{{ test_plan['report_email'] }}" name="to"/>
+                <parameter value="simplelogger" name="format"/>
+            </parameters>
+        </action>
+        {% endif %}
+        {% if test_plan['diamonds_build_url'] -%}
+        <action>
+            <type>DiamondsAction</type>
+        </action>
+        {% endif %}
+        {% include 'postpostaction.xml' ignore missing %}
+    </postActions>
+    
+</testrun>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/ats4_template.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,264 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
+<!-- 
+============================================================================ 
+Name        : ats_template.xml
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+Contains the template for the test.xml file output. The test.xml file contains
+information on the files used to create the drop file.
+============================================================================
+-->
+
+{% import 'ats4_macros.xml' as macros with context %}
+
+<testrun>
+    <metadata>
+        {% if test_plan['diamonds_build_url'] -%}
+        <meta name="diamonds-buildid">{{ test_plan['diamonds_build_url'] }}</meta> 
+        <meta name="diamonds-testtype">Smoke</meta>
+        {% endif %}
+        <meta name="name">{{ test_plan['testrun_name'] }}</meta> 
+    </metadata>
+    
+    <agents>
+        <agent alias="DEFAULT_{{ test_plan['harness'] }}">
+            <property name="hardware" value="{{ test_plan["device_type"] }}"/>
+        </agent>
+    </agents>
+    
+    {% include 'preset_custom.xml' ignore missing %}
+    
+    {% for setd in test_plan.sets -%}
+    <execution defaultAgent="DEFAULT_{{ test_plan['harness'] }}">        
+        <initialization>
+            {% include 'prestep_custom.xml' ignore missing %}
+        
+            {% if setd.image_files -%}
+            <task>
+                <type>FlashTask</type>
+                <parameters>
+                {% set i = 1 %}
+                {% for img in atsself.get_sorted_images(setd) -%}
+                    <parameter name="image-{{ i }}" value="ATS3Drop\images\{{ os.path.basename(img) }}" />
+                    {% set i = i + 1 %}
+                {% endfor -%}
+                </parameters>
+            </task>
+            {% endif %}
+            
+            {% if setd["ctc_enabled"] == "True" -%}
+            {{ macros.ctc_initialization() }}
+            {% endif %}
+            
+            <task>
+                <type>CreateDirTask</type>
+                <parameters>                
+                    <parameter value="{{ atsself.getlogdir(setd) }}" name="dir"/>
+                </parameters>
+            </task>
+                      
+          {% if setd.has_key("sis_files") and setd["sis_files"] -%}
+              {% for sis_file in setd["sis_files"] -%}
+            <task>
+                <type>FileUploadTask</type>
+                <parameters>
+                    <parameter name="src" value="ATS3Drop\{{ setd.name }}\sis\{{ os.path.basename(sis_file) }}"/>
+                    <parameter name="dst" value="c:\testframework\{{ os.path.basename(sis_file) }}"/>
+                </parameters>
+            </task>
+              {% endfor -%}
+          {% else %}
+              {% if setd['src_dst'] != [] -%}
+                {% for file in setd['src_dst'] -%}            
+            <task>
+                <type>FileUploadTask</type>
+                <parameters>
+                    <parameter value="ATS3Drop\{{ setd.name }}\{{ file[1].replace(":", "") }}" name="src"/>
+                    <parameter value="{{ file[1] }}" name="dst"/>
+                </parameters>
+            </task>
+                {% endfor -%}
+              {% else %}
+                  {% for data_file in setd["data_files"] -%}
+            <task>
+                <type>FileUploadTask</type>
+                <parameters>
+                    <parameter name="src" value="ATS3Drop\{{ setd.name }}\data\{{ os.path.basename(data_file) }}"/>
+                    <parameter name="dst" value="e:\testing\data\{{ os.path.basename(data_file) }}"/>
+                </parameters>
+            </task>
+                  {% endfor -%}
+                  {% for data_file in setd["config_files"] -%}
+            <task>
+                <type>FileUploadTask</type>
+                <parameters>
+                    <parameter name="src" value="ATS3Drop\{{ setd.name }}\conf\{{ os.path.basename(data_file) }}"/>
+                    <parameter name="dst" value="e:\testing\conf\{{ os.path.basename(data_file) }}"/>
+                </parameters>
+            </task>
+                  {% endfor -%}
+                  {% for data_file in setd["testmodule_files"] -%}
+            <task>
+                <type>FileUploadTask</type>
+                <parameters>
+                    <parameter name="src" value="ATS3Drop\{{ setd.name }}\testmodules\{{ os.path.basename(data_file) }}"/>
+                    <parameter name="dst" value="c:\sys\bin\{{ os.path.basename(data_file) }}"/>
+                </parameters>
+            </task>
+                  {% endfor -%}
+              {% endif %}
+          {% endif %}
+          
+          {% if setd.engine_ini_file -%}
+              {% if (setd.has_key("sis_files") and setd["sis_files"]) or setd["src_dst"] == [] -%}
+            <task>
+                <type>FileUploadTask</type>
+                <parameters>
+                    <parameter name="src" value="ATS3Drop\{{ setd.name }}\init\{{ os.path.basename(setd["engine_ini_file"]) }}"/>
+                    <parameter name="dst" value="c:\testframework\{{ os.path.basename(setd["engine_ini_file"]) }}"/>
+                </parameters>
+            </task>
+              {% endif %}
+          {% endif %}
+          
+          {% for sis_file in setd["sis_files"] -%}
+            <task>
+               <type>InstallSisTask</type>
+               <parameters>
+                    <parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
+                    <parameter name="upgrade-data " value="true"/>
+                    <parameter name="ignore-ocsp-warnings" value="true"/>
+                    <parameter name="ocsp-done" value="true"/>
+                    <parameter name="software-package" value="c:\testframework\{{ os.path.basename(sis_file) }}"/>
+               </parameters>
+            </task>
+          {% endfor -%}
+        </initialization>    
+        
+        {% include 'prerun_custom.xml' ignore missing %}
+
+        {% if setd['src_dst'] -%}
+            {{ macros.generate_runsteps_stif(setd) }}
+            
+            {% for file in setd['src_dst'] -%}
+                {% if setd["test_harness"] == "GENERIC" -%}
+                    {% if 'testscript' in file[2] -%}
+        <task>
+            <type>TEFTask</type>
+            <parameters>
+                <parameter name="file" value="testexecute.exe"/>
+                <parameter name="parameters" value="{{ file[1] }}"/>
+                <parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
+                <parameter name="result-file" value="{{ atsself.TEF_LOG_DIR }}\{{ os.path.basename(file[1]).replace('.script', '.htm') }}"/>
+            </parameters>
+        </task>
+                    {% endif %}
+                    
+                    {% if 'testmodule' in file[2] -%}
+        <task>
+            <type>ExecutableTestCaseTask</type>
+            <parameters>
+                <parameter name="file" value="{{ file[1] }}"/>
+                <parameter name="parser" value="RTestResultParser" />
+                <parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
+                <parameter name="result-file" value="{{ atsself.TEF_LOG_DIR }}\{{ os.path.basename(file[1]).replace('.exe', '.htm') }}"/>
+            </parameters>
+        </task>
+                    {% endif %}
+                {% endif %}
+                {% if setd["test_harness"] == "EUNIT" -%}
+                    {% if file[2] == "testmodule" -%}
+        <task>
+            <type>EUnitTask</type>
+            <parameters>
+                <parameter value="z:\sys\bin\EUNITEXERUNNER.EXE" name="file"/>
+                <parameter name="result-file" value="{{ atsself.EUNIT_LOG_DIR }}\{{ atspath.basename(file[1]).replace('.' + file[1].rsplit(".")[1], '_log.xml') }}"/>
+                <parameter name="parameters" value="{{ test_plan["eunitexerunner_flags"] }} /F {{ atspath.basename(file[1]).replace('.dll', '').replace('.exe', '') }} /l xml {{ atspath.basename(file[1]) }}"/>
+                <parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
+            </parameters>
+        </task>
+                    {% endif %}
+                    {% if file[2] == "testmodule:qt" -%}
+        <task>
+            <type>QTestTask</type>
+            <parameters>
+                <parameter name="file" value="{{ file[1] }}"/>                      
+                <parameter name="parameters" value="-lightxml -o {{ atsself.QT_LOG_DIR }}\{{ os.path.basename(file[1]).replace('.' + file[1].rsplit(".")[1], '_log.xml') }}"/>
+                <parameter name="result-file" value="{{ atsself.QT_LOG_DIR }}\{{ os.path.basename(file[1]).replace('.' + file[1].rsplit(".")[1], '_log.xml') }}"/>
+                <parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
+            </parameters>
+        </task>
+                    {% endif %}
+                {% endif %}
+            {% endfor -%}
+        {% else %}
+            {{ macros.generate_runsteps_stif_single_set(setd) }}
+        {% endif %}
+        
+        {% include 'postrun_custom.xml' ignore missing %}
+        
+        <finalization>
+        {% if setd["ctc_enabled"] == "True" -%}
+        {{ macros.ctc_finalization(setd) }}
+        {% endif %}
+
+            <task>
+                <type>FileDownloadTask</type>
+                <parameters>
+                    <parameter value="{{ atsself.getlogdir(setd) }}\*" name="dir"/>
+                </parameters>
+            </task>
+        {% include 'poststep_custom.xml' ignore missing %}
+        </finalization>
+        
+    </execution>    
+    {% endfor -%}
+    
+    {% include 'postset_custom.xml' ignore missing %}
+    
+    <postActions>
+        {% include 'prepostaction.xml' ignore missing %}
+        {% for action_type, parameters in test_plan.post_actions -%}
+            {% if action_type == 'RunProcessAction' %}
+        <action>
+            <type>{{ action_type }}</type>
+            <parameters>
+                {% for name, value in parameters -%}
+                <parameter name="{{ name }}" value="{{ value }}"/>
+                {% endfor -%}
+            </parameters>
+        </action>
+            {% endif %}
+        {% endfor -%}
+        {% if test_plan['report_email'] -%}
+        <action>
+            <type>EmailAction</type>
+            <parameters>
+                <parameter value="Release testing" name="subject"/>
+                <parameter value="{{ test_plan['report_email'] }}" name="to"/>
+                <parameter value="simplelogger" name="format"/>
+            </parameters>
+        </action>
+        {% endif %}
+        {% if test_plan['diamonds_build_url'] -%}
+        <action>
+            <type>DiamondsAction</type>
+        </action>
+        {% endif %}
+        {% include 'postpostaction.xml' ignore missing %}
+    </postActions>
+    
+</testrun>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/ats_template.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,274 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- 
+============================================================================ 
+Name        : ats_template.xml
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+Contains the template for the test.xml file output. The test.xml file contains
+information on the files used to create the drop file.
+============================================================================
+-->
+<test>
+    <name>{{ test_plan['testrun_name'] }}</name>
+    <buildid>{{ test_plan['diamonds_build_url'] }}</buildid>
+    <target>
+    {% if test_plan["harness"] == "MULTI_HARNESS" -%}
+        <device alias="DEFAULT_STIF" rank="none">        
+            <property name="HARNESS" value="STIF"/>
+            <property name="TYPE" value="{{ test_plan['device_type'] }}"/>
+            {% if test_plan["device_hwid"] != "" -%}
+            <property name="HWID" value="{{ test_plan["device_hwid"] }}"/>
+            {% endif %}
+        </device>
+        <device alias="DEFAULT_EUNIT" rank="none">        
+            <property name="HARNESS" value="EUNIT"/>
+            <property name="TYPE" value="{{ test_plan['device_type'] }}"/>
+            {% if test_plan["device_hwid"] != "" -%}
+            <property name="HWID" value="{{ test_plan["device_hwid"] }}"/>
+            {% endif %}
+        </device>
+    {% else %}
+        <device alias="DEFAULT_{{ test_plan['harness'] }}" rank="none">        
+            <property name="HARNESS" value="{{ test_plan['harness'] }}"/>
+            <property name="TYPE" value="{{ test_plan['device_type'] }}"/>
+            {% if test_plan["device_hwid"] != "" -%}
+            <property name="HWID" value="{{ test_plan["device_hwid"] }}"/>
+            {% endif %}
+        </device>
+    {% endif %}
+    </target>
+    
+    <plan passrate="100" enabled="true" name="{{ test_plan['testrun_name'] }} Plan" significant="false" harness="{{ test_plan['harness'] }}">
+        <session name="session" harness="{{ test_plan['harness'] }}" enabled="true" passrate="100" significant="false">
+            {% for setd in test_plan.sets -%}
+            <set name="{{ setd["name"] }}-{{ setd["component_path"] }}" harness="{{ test_plan['harness'] }}" enabled="true" passrate="100">
+              <target>
+                  <device alias="DEFAULT_{{ test_plan['harness'] }}" rank="master"/>
+              </target>
+              <case name="{{ setd.name }} case" passrate="100" harness="{{ setd.test_harness }}" enabled="true" significant="false"> 
+              
+              {% if setd["ctc_enabled"] == "True" -%}
+              <step name="Create CTC log dir" harness="{{ setd.test_harness }}" enabled="true" passrate="100" significant="false">
+                  <command>makedir</command>
+                  <params>
+                      <param dir="{{ atsself.CTC_LOG_DIR }}"/>
+                  </params>
+              </step>
+              <step name="CTC start" passrate="100" harness="{{ setd.test_harness }}" enabled="true" significant="false">
+                    <command>execute</command>
+                    <params>
+                        <param file="z:\sys\bin\ctcman.exe"/>
+                    </params>
+              </step>
+              {% endif %}
+              {% if setd.image_files -%}
+                {% for img in setd.image_files -%}
+                <flash target-alias="DEFAULT_{{ setd.test_harness }}" images="ATS3Drop\images\{{ os.path.basename(img) }}" />
+                {% endfor -%}
+              {% endif %}
+              <step name="Create logs folder" harness="{{ setd.test_harness }}" enabled="true" passrate="100" significant="false">
+                  <command>makedir</command>
+                  <params>
+                  {% if setd["test_harness"] == "GENERIC" -%}
+                      {% if atsself.check_mtf_harness(setd) -%}
+                      <param dir="{{ atsself.MTF_LOG_DIR }}"/>
+                      {% else %}
+                      <param dir="{{ atsself.TEF_LOG_DIR }}"/>
+                      {% endif %}
+                  {% endif %}
+                  {% if setd["test_harness"] == "EUNIT" -%}
+                      {% if atsself.check_qt_harness(setd) -%}
+                      <param dir="{{ atsself.QT_LOG_DIR }}"/>
+                      {% else %}
+                      <param dir="{{ atsself.EUNIT_LOG_DIR }}"/>
+                      {% endif %}
+                  {% endif %}
+                  </params>
+              </step>
+              
+              {% for sis_file in setd["sis_files"] -%}
+              <step name="Install sis: {{ os.path.basename(sis_file) }}" harness="{{ setd.test_harness }}" enabled="true" passrate="100" significant="false">
+                    <command>install</command>
+                    <params>
+                        <param src="ATS3Drop\{{ setd.name }}\sis\{{ os.path.basename(sis_file) }}"/>
+                        <param dst="c:\testframework\{{ os.path.basename(sis_file) }}"/>
+                    </params>
+              </step>
+              {% endfor -%}
+              
+              {% for data_file in setd["data_files"] -%}
+              <step name="Install data: {{ os.path.basename(data_file) }}" harness="{{ setd.test_harness }}" enabled="true" passrate="100" significant="false">
+                    <command>install</command>
+                    <params>
+                        <param src="ATS3Drop\{{ setd.name }}\{{ os.path.basename(data_file) }}"/>
+                        <param dst="e:\testing\data"/>
+                    </params>
+              </step>
+              {% endfor -%}
+              {% for data_file in setd["testmodule_files"] -%}
+              <step name="Install testmodule: {{ os.path.basename(data_file) }}" harness="{{ setd.test_harness }}" enabled="true" passrate="100" significant="false">
+                    <command>install</command>
+                    <params>
+                        <param src="ATS3Drop\{{ setd.name }}\{{ os.path.basename(data_file) }}"/>
+                        <param dst="c:\sys\bin"/>
+                    </params>
+              </step>
+              {% endfor -%}
+              {% for data_file in setd["config_files"] -%}
+              <step name="Install conf: {{ os.path.basename(data_file) }}" harness="{{ setd.test_harness }}" enabled="true" passrate="100" significant="false">
+                    <command>install</command>
+                    <params>
+                        <param src="ATS3Drop\{{ setd.name }}\{{ os.path.basename(data_file) }}"/>
+                        <param dst="e:\testing\conf"/>
+                    </params>
+              </step>
+              {% endfor -%}
+              
+              {% if setd.engine_ini_file -%}
+              <step name="Install engine: {{ os.path.basename(setd["engine_ini_file"]) }}" harness="{{ setd.test_harness }}" enabled="true" passrate="100" significant="false">
+                    <command>install</command>
+                    <params>
+                        <param src="ATS3Drop\{{ setd.name }}\{{ os.path.basename(setd["engine_ini_file"]) }}"/>
+                        <param dst="c:\testframework\{{ setd["test_harness"] }}"/>
+                    </params>
+              </step>
+              {% endif %}
+
+              {% for sis_file in setd["sis_files"] -%}
+              <step name="Install SIS to the device: {{ os.path.basename(sis_file) }}" harness="{{ setd.test_harness }}" enabled="true" passrate="100" significant="false">
+                  <command>install-software</command>
+                  <params>
+                      <param timeout="{{ test_plan["test_timeout"] }}"/>
+                      <param overWriteAllowed="true"/>
+                      <param upgradeData="true"/>
+                      <param downloadAllowed="false"/>
+                      <param packageInfoAllowed="true"/>
+                      <param untrustedAllowed="true"/>
+                      <param ignoreOCSPWarnings="true"/>
+                      <param userCapGranted="true"/>
+                      <param optionalItemsAllowed="true"/>
+                      <param killApp="true"/>
+                      <param installDrive="C"/>
+                      <param upgradeAllowed="true"/>
+                      <param OCSP_Done="true"/>
+                      <param sisPackageName="c:\testframework\{{ os.path.basename(sis_file) }}"/>
+                  </params>
+              </step>
+              {% endfor -%}
+               
+              {% if setd.src_dst -%}
+                {% for file in setd.src_dst -%}
+                <step name="Install {{ os.path.basename(file[1]) }}" harness="{{ setd.test_harness }}" enabled="true" passrate="100" significant="false">
+                    <command>install</command>
+                    <params>
+                        <param src="ATS3Drop\{{ setd.name }}\{{ file[1].replace(":","") }}"/>
+                        <param dst="{{ file[1] }}"/>
+                    </params>
+                </step>
+                
+                  {% if setd["test_harness"] == "GENERIC" -%}
+                <step passrate="100" harness="{{ setd.test_harness }}" enabled="true" name="Execute test: {{ os.path.basename(file[1]) }}" significant="false">
+                    <command>execute</command>
+                    <params>
+                      {% if 'testscript' in file[2] -%}
+                          {% if file[2] == "testscript:mtf" -%}
+                      <param file="testframework.exe"/>
+                      <param parser="MTFResultParser"/>
+                      <param result-file="{{ atsself.MTF_LOG_DIR  }}\{{ os.path.basename(file[1]).replace('.script', '.htm') }}"/>
+                          {% else %}
+                      <param file="testexecute.exe"/>
+                      <param parser="TEFTestResultParser"/>
+                      <param result-file="{{ atsself.TEF_LOG_DIR }}\{{ os.path.basename(file[1]).replace('.script', '.htm') }}"/>
+                          {% endif %}
+                      <param parameters="{{ file[1] }}"/>
+                      <param timeout="{{ test_plan["test_timeout"] }}"/>
+                      {% endif %}
+                      
+                      {% if 'testmodule' in file[2] -%}
+                      <param file="{{ file[1] }}"/>
+                      <param parser="RTestResultParser"/>
+                      <param result-file="{{ atsself.TEF_LOG_DIR  }}\{{ os.path.basename(file[1]).replace('.exe', '.htm') }}"/>
+                      <param timeout="{{ test_plan["test_timeout"] }}"/>
+                      {% endif %}
+                    </params>
+                </step>
+                  {% endif %}
+                  {% if setd["test_harness"] == "EUNIT" -%}
+                      {% if file[2] == "testmodule:qt" -%}
+                <step passrate="100" harness="{{ setd.test_harness }}" enabled="true" name="Execute test: {{ os.path.basename(file[1]) }}" significant="false">
+                    <command>execute</command>
+                    <params>
+                      <param file="{{ file[1] }}"/>                      
+                      <param parameters="-lightxml -o {{ atsself.QT_LOG_DIR }}\{{ os.path.basename(file[1]).replace('.' + file[1].rsplit(".")[1], '_log.xml') }}"/>
+                      <param result-file="{{ atsself.QT_LOG_DIR }}\{{ os.path.basename(file[1]).replace('.' + file[1].rsplit(".")[1], '_log.xml') }}"/>
+                      <param parser="QTestResultParser"/>
+                      <param delete-result="true"/>
+                      <param async="false"/>
+                      <param timeout="{{ test_plan["test_timeout"] }}"/>
+                    </params>
+                </step>
+                      {% endif %}
+                  {% endif %}
+                    
+                {% endfor -%}
+              {% endif %}
+                <step passrate="100" harness="{{ setd.test_harness }}" enabled="true" name="Fetch test module logs" significant="false">
+                  <command>fetch-log</command>
+                  <params>
+                    <param type="text"/>
+                    <param delete="true"/>
+                {% if setd["test_harness"] == "GENERIC" -%}
+                    {% if atsself.check_mtf_harness(setd) -%}
+                    <param path="{{ atsself.MTF_LOG_DIR }}\*"/>
+                    {% else %}
+                    <param path="{{ atsself.TEF_LOG_DIR }}\*"/>
+                    {% endif %}
+                {% endif %}
+                {% if setd["test_harness"] == "EUNIT" -%}
+                    {% if atsself.check_qt_harness(setd) -%}
+                    <param path="{{ atsself.QT_LOG_DIR }}\*"/>
+                    {% else %}
+                    <param path="{{ atsself.EUNIT_LOG_DIR }}\*"/>
+                    {% endif %}
+                {% endif %}
+                  </params>
+                </step>
+              </case>
+          </set>
+          {% endfor -%}
+        </session>
+    </plan>
+    
+    {% if test_plan.post_actions %}
+        {% for action_type, parameters in test_plan.post_actions -%}
+    <postAction>
+        <type>{{ action_type }}</type>
+        <params>
+            {% for name, value in parameters -%}
+            <param name="{{ name }}" value="{{ value }}"/>
+            {% endfor -%}
+        </params>
+    </postAction>
+        {% endfor -%}
+    {% endif %}
+  
+    <files>
+        {% for drop_file, _ in atsself.drop_files(test_plan) -%}
+        <file>{{ drop_file }}</file>
+        {% endfor -%}
+    </files>
+  
+</test>
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/ats3/dropgenerator.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/dropgenerator.py	Wed Dec 23 19:29:07 2009 +0200
@@ -40,7 +40,8 @@
 # pylint: disable-msg=W0404
 from ntpath import sep as atssep
 import ntpath as atspath
-from ntpath import sep as sossep
+
+import jinja2
 
 _logger = logging.getLogger('ats')
 
@@ -172,7 +173,7 @@
     def generate_steps_logdir(self, setd, case):
         """generates STIF log dir."""
         
-        _qt_test_ = check_qt_harness(setd)
+        _qt_test_ = self.check_qt_harness(setd)
         if _qt_test_:
             step = SE(case, "step", name="Create QT log dir", harness=setd["test_harness"], **self.defaults)
         else:
@@ -181,7 +182,7 @@
         if setd["test_harness"] == "STIF":
             SE(SE(step, "params"), "param", dir=self.STIF_LOG_DIR)
         if setd["test_harness"] == "GENERIC":
-            if check_mtf_harness(setd):
+            if self.check_mtf_harness(setd):
                 SE(SE(step, "params"), "param", dir=self.MTF_LOG_DIR)
             else:
                 SE(SE(step, "params"), "param", dir=self.TEF_LOG_DIR)
@@ -362,7 +363,7 @@
         SE(params, "param", parameters="writefile")
         SE(params, "param", file=path(r"z:\sys\bin\ctcman.exe"))
             
-        if test_plan["ats_network_drive"].strip() != "":
+        if test_plan["ctc_run_process_params"].strip() != "":
             #preparing local-path for CTC step
             #getting '39865' as diamonds ID out of 'http://diamonds.nmp.nokia.com/diamonds/builds/39865/'
             if test_plan["diamonds_build_url"].rfind("/", 0):
@@ -370,12 +371,15 @@
             else:
                 diamonds_id = test_plan["diamonds_build_url"].rsplit(r"/", 1)[1]
             
-            #separating network id and drop number from 10.11.3.2\share#ats\drop2.zip
+            #separating network id and drop number from 10.11.3.2\share#ats\drop2.zip#3
             #'drop2' from the other part of the string conjuncted with a # sign
-            ats_network = r"\\" + test_plan["ats_network_drive"].rsplit("#", 1)[0] #network host
-            temp_drop_id = path(test_plan["ats_network_drive"].rsplit("#", 1)[1].rsplit(".", 1)[0]).normpath() #drop ID
-            drop_id = temp_drop_id.rsplit(atssep, 1)[1]
-            
+            ats_network = r"\\" + test_plan["ctc_run_process_params"].rsplit("#", 2)[0] #network host
+            temp_drop_id = path(test_plan["ctc_run_process_params"].rsplit("#", 2)[1].rsplit(".", 1)[0]).normpath() #drop ID
+            if atssep in temp_drop_id:
+                drop_id = temp_drop_id.rsplit(atssep, 1)[1]
+            else:
+                drop_id = temp_drop_id
+
             ats_network_path = atspath.join(ats_network, "ctc_helium" , diamonds_id, drop_id, setd["name"], "ctcdata")
             ctc_helium_path_list.append(ats_network_path)
             
@@ -405,24 +409,20 @@
         if setd["test_harness"] == "STIF":
             SE(params, "param", path=path(self.STIF_LOG_DIR).joinpath(r"*"))
         if setd["test_harness"] == "GENERIC":
-            if check_mtf_harness(setd):
+            if self.check_mtf_harness(setd):
                 SE(params, "param", path=path(self.MTF_LOG_DIR).joinpath(r"*"))
             else:
                 SE(params, "param", path=path(self.TEF_LOG_DIR).joinpath(r"*"))
         elif setd["test_harness"] == "STIFUNIT":
             SE(params, "param", path=path(self.STIFUNIT_LOG_DIR).joinpath(r"*"))
         elif setd["test_harness"] == "EUNIT":
-            if check_qt_harness(setd):
+            if self.check_qt_harness(setd):
                 SE(params, "param", path=path(self.QT_LOG_DIR).joinpath(r"*"))
             else:
                 SE(params, "param", path=path(self.EUNIT_LOG_DIR).joinpath(r"*"))
 
-    def generate_steps(self, setd, case, test_plan):
-        """Generate the test plan <step>s."""
-        # Flash images.
-        images = self.drop_path_root.joinpath("images")
-        pmds = self.drop_path_root.joinpath("pmds")
-        
+    
+    def get_sorted_images(self, setd):
         sorted_images = []
         for image_file in setd["image_files"]:
             if 'core' in image_file.name:
@@ -436,11 +436,21 @@
         for image_file in setd["image_files"]:
             if 'core' not in image_file.name and 'rofs2' not in image_file.name and 'rofs3' not in image_file.name:
                 sorted_images.append(image_file.name)
-                
+        if "rofs" in sorted_images[0]:
+            return setd["image_files"]
+        return sorted_images
+    
+    def generate_steps(self, setd, case, test_plan):
+        """Generate the test plan <step>s."""
+        # Flash images.
+        images = self.drop_path_root.joinpath("images")
+        pmds = self.drop_path_root.joinpath("pmds")
+        
+        sorted_images = self.get_sorted_images(setd)
         for image_file in sorted_images:
             flash = SE(case, "flash", images=images.joinpath(image_file))
             flash.set("target-alias", "DEFAULT_%s" % setd["test_harness"])
-
+            
         if not test_plan.custom_dir is None:
             insert_custom_file(case, test_plan.custom_dir.joinpath("prestep_custom.xml"))
 
@@ -515,8 +525,11 @@
                 else:
                     SE(params, "param", {'result-file': self.TEF_LOG_DIR + os.sep + filename.replace('.script', '.htm')})
                 SE(params, "param", timeout=time_out)
-                SE(params, "param", parser="TEFTestResultParser")
-            if 'testmodule' in file1[2]:
+                if file1[2] == "testscript:mtf":
+                    SE(params, "param", parser="MTFResultParser")
+                else:
+                    SE(params, "param", parser="TEFTestResultParser")
+            if file1[2] == 'testmodule:rtest':
                 filename = file1[1]
                 filename = filename[file1[1].rfind(os.sep)+1:]
                 step = SE(case, "step", 
@@ -754,7 +767,7 @@
                             drop_set.add(drop_file)
                             yield (drop_file, file_path.normpath())
             for drop_dir, sub_dir, files in pkg_files:
-                drop_file = drop_dir.joinpath(sub_dir)
+                drop_file = drop_dir.joinpath(sub_dir.replace('\\', os.sep))
                 drop_file = drop_file.normpath()
                 file_path = path(files)
                 if drop_file not in drop_set:
@@ -767,6 +780,25 @@
         for drop_file, _ in self.drop_files(test_plan):
             SE(files_elem, "file").text = drop_file
         return files_elem
+        
+    def check_mtf_harness(self, _setd_):
+        for _srcdst_ in _setd_['src_dst']:
+            if _srcdst_[2] == "testscript:mtf":
+                return True
+        return False
+
+    def check_qt_harness(self, _setd_):
+        _setd_ = _setd_
+        is_qt_test = False
+        if _setd_.has_key("sis_files"):
+            _dict_key_ = "sis_files"
+        else:
+            _dict_key_ = "src_dst"
+            
+        for _srcdst_ in _setd_[_dict_key_]:
+            if "testmodule:qt" == _srcdst_[2]:
+                is_qt_test = True
+        return is_qt_test 
 
 def generate_target(test_plan, root):
     """Generate targets"""
@@ -839,28 +871,8 @@
     else: 
         _logger.info("Included file %s" % ( filename))
 
-def check_qt_harness(_setd_):
-    _setd_ = _setd_
-    is_qt_test = False
-    if _setd_.has_key("sis_files"):
-        _dict_key_ = "sis_files"
-    else:
-        _dict_key_ = "src_dst"
-        
-    for _srcdst_ in _setd_[_dict_key_]:
-        if "testmodule:qt" == _srcdst_[2]:
-            is_qt_test = True
-    return is_qt_test 
-
-def check_mtf_harness(_setd_):
-    for _srcdst_ in _setd_['src_dst']:
-        if _srcdst_[2] == "testscript:mtf":
-            return True
-    return False
-
 def generate_post_actions(test_plan):
     """Generate post actions."""
-    import string
     actions = []
     
     if not test_plan.custom_dir is None:
@@ -877,4 +889,77 @@
     if not test_plan.custom_dir is None:
         insert_custom_file(actions, test_plan.custom_dir.joinpath("postpostaction.xml"))
 
-    return actions
\ No newline at end of file
+    return actions
+    
+    
+class Ats3TemplateTestDropGenerator(Ats3TestDropGenerator):
+
+    STIF_LOG_DIR = r"c:\logs\testframework"
+    TEF_LOG_DIR = r"c:\logs\testexecute"
+    MTF_LOG_DIR = r"c:\logs\testresults"
+    STIFUNIT_LOG_DIR = r"c:\logs\testframework"
+    EUNIT_LOG_DIR = r"c:\Shared\EUnit\logs"
+    #QT_LOG_DIR = r"c:\private\Qt\logs"
+    QT_LOG_DIR = r"c:\shared\EUnit\logs"
+    CTC_LOG_DIR = r"c:\data\ctc"
+
+    def stif_init_file(self, src_dst):
+        ini = cfg = dll = has_tf_ini = False
+        ini_file = None
+        cfg_files = dll_files = []
+
+        for tf_ini in src_dst:
+            if "testframework.ini" in tf_ini[1].lower():
+                has_tf_ini = True
+        
+        for file1 in src_dst:
+            if "testframework.ini" in file1[1].lower() and file1[2] == "engine_ini" and has_tf_ini:
+                ini_file = file1
+            elif file1[2] == "engine_ini" and not has_tf_ini:
+                pipe_ini = open(file1[0], 'r')
+                if "[engine_defaults]" in str(pipe_ini.readlines()).lower():
+                    ini_file = file1
+        return ini_file
+
+    def ctcnetworkpath(self, setd, test_plan):
+        #preparing local-path for CTC step
+        #getting '39865' as diamonds ID out of 'http://diamonds.nmp.nokia.com/diamonds/builds/39865/'
+        if test_plan["diamonds_build_url"].rfind("/", 0):
+            diamonds_id = test_plan["diamonds_build_url"].rsplit(r"/", 2)[1]
+        else:
+            diamonds_id = test_plan["diamonds_build_url"].rsplit(r"/", 1)[1]
+        
+        #separating network id and drop number from 10.11.3.2\share#ats\drop2.zip#3
+        #'drop2' from the other part of the string conjuncted with a # sign
+        ats_network = r"\\" + test_plan["ctc_run_process_params"].rsplit("#", 2)[0] #network host
+        temp_drop_id = path(test_plan["ctc_run_process_params"].rsplit("#", 2)[1].rsplit(".", 1)[0]).normpath() #drop ID
+        if atssep in temp_drop_id:
+            drop_id = temp_drop_id.rsplit(atssep, 1)[1]
+        else:
+            drop_id = temp_drop_id
+
+        return atspath.join(ats_network, "ctc_helium" , diamonds_id, drop_id, setd["name"], "ctcdata")
+
+    def getlogdir(self, setd):
+        if setd["test_harness"] == "STIF":
+            return self.STIF_LOG_DIR
+        elif setd["test_harness"] == "STIFUNIT":
+            return self.STIFUNIT_LOG_DIR
+        elif setd["test_harness"] == "GENERIC":
+            if self.check_mtf_harness(setd):
+                return self.MTF_LOG_DIR
+            else:
+                return self.TEF_LOG_DIR
+        elif setd["test_harness"] == "EUNIT":
+            if self.check_qt_harness(setd):
+                return self.QT_LOG_DIR
+            else:
+                return self.EUNIT_LOG_DIR
+
+    def generate_xml(self, test_plan):
+        loader = jinja2.ChoiceLoader([jinja2.FileSystemLoader(os.path.join(os.environ['HELIUM_HOME'], 'tools/common/python/lib/ats3/templates')), jinja2.FileSystemLoader(test_plan.custom_dir)])
+        env = jinja2.Environment(loader=loader)
+        template = env.from_string(open(os.path.join(os.environ['HELIUM_HOME'], 'tools/common/python/lib/ats3/ats4_template.xml')).read())
+        
+        xmltext = template.render(test_plan=test_plan, os=os, atspath=atspath, atsself=self).encode('ISO-8859-1')
+        return et.ElementTree(et.XML(xmltext))
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/ats3/matti/MattiDrops.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/matti/MattiDrops.py	Wed Dec 23 19:29:07 2009 +0200
@@ -20,6 +20,8 @@
 #ATS3-system
 #===============================================================================
 
+""" create the MATTI test drop file for use on the test server """
+
 import os
 import re
 import sys
@@ -28,9 +30,7 @@
 import logging 
 from optparse import OptionParser
 from xml.etree import ElementTree as et
-from xml.sax.saxutils import quoteattr
-from xml.dom.minidom import Document
-from jinja2 import Template, Environment, PackageLoader
+from jinja2 import Environment, PackageLoader
 
 # Shortcuts
 E = et.Element
@@ -56,7 +56,6 @@
             self.flash_images = self._opts.flash_images.split(',')
         else:
             self.flash_images = []
-            logging.error("No flash files defined!")
         if not re.search(r'\A\s*?\Z', self._opts.sis_files):
             self.sis_files = self._opts.sis_files.split(',')
         else:
@@ -115,10 +114,10 @@
 #        tmp_image_list = []
         os.chdir(os.path.normpath(self.configuration.matti_scripts))
         try:
-            for path, subdirs, names in os.walk(os.getcwd()):
+            for path, _, names in os.walk(os.getcwd()):
                 for name in names:
                     if re.search(r'.*?[.]rb\Z', name):
-                        tmp_case_list.append((os.path.normpath(os.path.join(path, name)), os.path.join("ATS3Drop", "MATTISCRIPTS", name)))
+                        tmp_case_list.append((os.path.normpath(os.path.join(path, name)), os.path.join("ats3", "matti", "script", name)))
             if tmp_case_list:
                 for tmp_case in tmp_case_list:
                     self.configuration.step_list.append(dict(path=os.path.join("&#x00A7;TEST_RUN_ROOT&#x00A7;", str(tmp_case[1])), name="Test case"))
@@ -147,12 +146,15 @@
     def create_testxml(self):
         """This method will use Jinja2 template engine for test.xml creation"""
         os.chdir(self.tmp_path)
-        env = Environment(loader=PackageLoader('MattiDrops', 'template'))
-        template = env.from_string(open(self.configuration.template_location).read())
-        xml_file = open("test.xml", 'w')
-        xml_file.write(template.render(configuration=self.configuration))
-        xml_file.close()
-    
+        env = Environment(loader=PackageLoader('ats3.matti', 'template'))
+        if os.path.isfile(self.configuration.template_location):
+            template = env.from_string(open(self.configuration.template_location).read())
+            xml_file = open("test.xml", 'w')
+            xml_file.write(template.render(configuration=self.configuration))
+            xml_file.close()
+        else:
+            logging.error("No template file found")
+                
     def create_testdrop(self, output_file=None, file_list=None):
         """Creates testdrop zip-file to given location."""
         #env = Environment(loader=PackageLoader('MattiDrops', 'template'))
@@ -163,20 +165,29 @@
                 logging.info("Adding files to testdrop:")
                 for src_file, drop_file in file_list:
                     logging.info("   + Adding: %s" % src_file.strip())
-                    zfile.write(str(src_file.strip()), str(drop_file))
+                    if os.path.isfile(src_file):
+                        zfile.write(str(src_file.strip()), str(drop_file))
+                    else:
+                        logging.error("invalid test file name supplied %s " % drop_file)
                 if self.configuration.flash_images:
                     for image in self.configuration.flash_images:
                         tmp = string.rsplit(image, os.sep)
                         image_name = tmp[len(tmp)-1] 
                         logging.info("   + Adding: %s" % image_name)
-                        zfile.write(image, os.path.join("ATS3Drop", "images", image_name))
+                        if  os.path.isfile(image):
+                            zfile.write(image, os.path.join("ATS3Drop", "images", image_name))
+                        else:
+                            logging.error("invalid flash file name supplied %s " % image_name)
                 if self.configuration.sis_enabled:
                     if self.configuration.sis_files:
                         for sis in self.configuration.sis_files:
                             tmp = string.rsplit(sis, os.sep)
                             sis_name = tmp[len(tmp)-1] 
                             logging.info("   + Adding: %s" % sis_name)
-                            zfile.write(sis, os.path.join("ATS3Drop", "sis", sis_name))
+                            if os.path.isfile(sis):
+                                zfile.write(sis, os.path.join("ATS3Drop", "sis", sis_name))
+                            else:
+                                logging.error("invalid sis file name supplied %s " % sis_name)
                 zfile.write(os.path.normpath(os.path.join(os.getcwd(),"test.xml")), "test.xml")
             finally:
                 logging.info("Testdrop created! %s" % output_file)            	   
@@ -186,10 +197,10 @@
 def create_drop(configuration):
     """Testdrop creation"""
     if configuration:
-        md = MattiDrop(configuration)
-        md.fetch_testfiles()
-        md.create_testxml()
-        return md.create_testdrop(configuration.drop_file, md.fetch_testfiles())
+        m_drop = MattiDrop(configuration)
+        m_drop.fetch_testfiles()
+        m_drop.create_testxml()
+        return m_drop.create_testdrop(configuration.drop_file, m_drop.fetch_testfiles())
     else:
         logging.error("No configuration available for test drop creation")        
         
@@ -227,7 +238,7 @@
                    default="60")
     cli.add_option("--verbose", help="Increase output verbosity", 
                    action="store_true", default=True)
-    opts, tsrc_paths = cli.parse_args()
+    opts, _ = cli.parse_args()
 
     if opts.verbose:
         logging.basicConfig(level=logging.DEBUG)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/matti/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,20 @@
+# -*- coding: latin-1 -*-
+
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/ats3/parsers.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/parsers.py	Wed Dec 23 19:29:07 2009 +0200
@@ -540,6 +540,9 @@
 
     def __init__(self, platform = None):
         self.platform = platform
+        if self.platform is not None and "_" in self.platform:
+            plat_tar = re.search(r"(.*)_(.*).pkg", self.platform)
+            self.build_platform, self.build_target = plat_tar.groups() 
 
     def get_pkg_files(self, location = None, with_full_path = True):
         """
@@ -640,6 +643,14 @@
         val1, val2 = result.groups()
 
         if val1 != "":
+            
+            #replacing delimiters (${platform} and ${target}) in PKG file templates, 
+            #for instance, QT tests PKG files have delimeters 
+            if "$(platform)" in val1.lower() and self.build_platform is not None:
+                val1 = val1.lower().replace("$(platform)", self.build_platform)
+            if "$(target)" in val1.lower() and self.build_target is not None:
+                val1 = val1.lower().replace("$(target)", self.build_target)
+
             if path.isabs(path(val1).normpath()):
                 map_src = str(path.joinpath(self.drive, val1).normpath())
             elif re.search(r"\A\w", val1, 1):
@@ -678,8 +689,13 @@
             if _test_type_ == "dependent":
                 file_type = "data" + ":%s" % _test_type_
             else:
-                file_type = "testmodule"
-        
+                if "qttest.lib" in _libraries_:
+                    file_type = "data" + ":qt:dependent" 
+                else:
+                    file_type = "testmodule"
+                    
+        elif ext == 'exe' and 'rtest' in _libraries_:
+            file_type = "testmodule:rtest"
         elif ext == "exe":
             if _test_type_ == "dependent":
                 file_type = "data" + ":%s" % _test_type_
@@ -700,8 +716,6 @@
                 file_type = "testscript:mtf"
             else:
                 file_type = "testscript"
-        elif ext == 'bat' and 'rtest' in _libraries_:
-            file_type = "testmodule"
         else:
             file_type = "data"
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/templates/ats4_macros.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,147 @@
+<!-- 
+============================================================================ 
+Name        : ats_template.xml
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+
+{% macro ctc_initialization() -%}
+            <task>
+                <type>CreateDirTask</type>
+                <parameters>
+                    <parameter value="{{ atsself.CTC_LOG_DIR }}" name="dir"/>
+                </parameters>
+            </task>
+            <task>
+                <type>NonTestExecuteTask</type>
+                <parameters>
+                    <parameter value="z:\sys\bin\ctcman.exe" name="file" />
+                </parameters>
+            </task>
+{%- endmacro %}
+
+{% macro ctc_finalization(setd) -%}
+            <task>
+                <type>NonTestExecuteTask</type>
+                <parameters>
+                    <parameter value="writelocal" name="parameters" />
+                    <parameter value="z:\sys\bin\ctcman.exe" name="file" />
+                </parameters>
+            </task>
+            <task>
+                <type>NonTestExecuteTask</type>
+                <parameters>
+                    <parameter value="writefile" name="parameters" />
+                    <parameter value="z:\sys\bin\ctcman.exe" name="file" />
+                </parameters>
+            </task>
+            
+            {% if test_plan["ctc_run_process_params"].strip() != "" -%}            
+            <task>
+              <type>FileDownloadTask</type>
+              <parameters>
+                  <parameter name="src" value="{{ atsself.CTC_LOG_DIR }}\ctcdata.txt"/>
+                  <parameter name="dst" value="{{ atsself.ctcnetworkpath(setd, test_plan) }}"/>
+              </parameters>
+            </task>
+            {% endif %}
+            
+            <task>
+              <type>FileDownloadTask</type>
+              <parameters>
+                  <parameter name="src" value="{{ atsself.CTC_LOG_DIR }}\ctcdata.txt"/>
+              </parameters>
+            </task>
+{%- endmacro %}
+
+{% macro generate_runsteps_stif(setd) -%}
+            {% set ini_file = atsself.stif_init_file(setd['src_dst']) %}
+            {% if ini_file -%}
+        <task>
+            <type>StifRunCasesTask</type>
+            <parameters>
+              	<parameter name="filter" value="*"/>
+              	<parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
+              	<parameter name="engineini" value="{{ ini_file[1] }}"/>
+            </parameters>
+        </task>
+            {% else %}
+                {% for file in setd['src_dst'] -%}
+                    {% if setd["test_harness"] == "STIF" or setd["test_harness"] == "STIFUNIT" -%}
+                        {% if file[2] == "conf" and ".dll" not in file[1].lower() -%}
+        <task>
+            <type>StifRunCasesTask</type>
+            <parameters>
+              	<parameter name="module" value="TESTSCRIPTER"/>
+              	<parameter name="filter" value="*"/>
+              	<parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
+              	<parameter name="testcase-file" value="{{ file[1] }}"/>
+            </parameters>
+        </task>
+                        {% endif %}
+                        {% if file[2] == "testmodule" -%}
+        <task>
+            <type>StifRunCasesTask</type>
+            <parameters>
+              	<parameter name="module" value="{{ os.path.basename(file[1]) }}"/>
+              	<parameter name="filter" value="*"/>
+              	<parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
+            </parameters>
+        </task>
+                        {% endif %}
+                    {% endif %}
+                {% endfor -%}
+            {% endif %}
+{%- endmacro %}
+
+
+{% macro generate_runsteps_stif_single_set(setd) -%}
+            {% if setd["engine_ini_file"] != None -%}
+        <task>
+            <type>StifRunCasesTask</type>
+            <parameters>
+              	<parameter name="filter" value="*"/>
+              	<parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
+              	<parameter name="engineini" value="c:\testframework\{{ os.path.basename(setd["engine_ini_file"]) }}"/>
+            </parameters>
+        </task>
+            {% elif setd["config_files"] != [] -%}
+                 {% for config_file in setd["config_files"] -%}
+        <task>
+            <type>StifRunCasesTask</type>
+            <parameters>
+              	<parameter name="module" value="TESTSCRIPTER"/>
+              	<parameter name="filter" value="*"/>
+              	<parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
+              	<parameter name="testcase-file" value="e:\testing\conf\{{ os.path.basename(config_file) }}"/>
+            </parameters>
+        </task>
+                {% endfor -%}
+            {% else %}
+                {% for testmodule_file in setd["testmodule_files"] -%}
+        <task>
+            <type>StifRunCasesTask</type>
+            <parameters>
+              	<parameter name="module" value="{{ os.path.basename(testmodule_file) }}"/>
+              	<parameter name="filter" value="*"/>
+              	<parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
+            </parameters>
+        </task>
+                {% endfor -%}
+            {% endif %}
+{%- endmacro %}
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/ats3/testconfigurator.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/ats3/testconfigurator.py	Wed Dec 23 19:29:07 2009 +0200
@@ -98,7 +98,7 @@
         src_dst = []
         pmd_files = []
         trace_activation_files = []
-
+        
         if not os.path.exists( self.tsrc_dir ):
             _logger.error("Missing test source directory: %s", self.tsrc_dir)
         else:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/atsant.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,67 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================ 
+#Name        : atsant.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import re
+import sysdef.api
+import os
+
+def files_to_test(canonicalsysdeffile, excludetestlayers, idobuildfilter, builddrive):
+    sdf = sysdef.api.SystemDefinition(canonicalsysdeffile)
+    
+    modules = {}
+    paths_list = []
+    for la in sdf.layers:
+        if re.match(r".*_test_layer$", la):
+            try:
+                if re.search(r"\b%s\b" % la, excludetestlayers):
+                    continue
+            except TypeError, exp:
+                pass
+
+            layer = sdf.layers[la]
+            for mod in layer.modules:
+                if mod.name not in modules:
+                    modules[mod.name] = []
+                for unit in mod.units:
+                    include_unit = True
+                    if idobuildfilter != None:
+                        if idobuildfilter != "":
+                            include_unit = False
+                            if hasattr(unit, 'filters'):
+                                if len(unit.filters) > 0:
+                                    for filter in unit.filters:
+                                        if re.search(r"\b%s\b" % filter, idobuildfilter):
+                                            include_unit = True
+                                        else:
+                                            include_unit = False
+                                elif len(unit.filters) == 0:
+                                    include_unit = True
+                            else:
+                                include_unit = False
+                        else:
+                            include_unit = False
+                            if hasattr(unit, 'filters'):                            
+                                if len(unit.filters) == 0:
+                                    include_unit = True
+                    if include_unit:
+                        modules[mod.name].append(os.path.join(builddrive + os.sep, unit.path))
+
+    return modules
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/bomtofile.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,75 @@
+#============================================================================ 
+#Name        : bomtofile.py
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import amara
+import nokia.nokiaccm
+import ant
+
+class BOMWriter(object):
+    """
+    Read BOM and output in text
+    """
+    def __init__(self, session, project_name, project, output_dir):
+        self.project_name = project_name
+        self.project = project
+        self.output_dir = output_dir
+        self.session = session
+      
+    def writeprojects(self):
+        fileout = file(self.output_dir + '/' + self.project_name + '_projects.txt', 'w')
+        
+        i = 1
+        for project in self.project.baseline:
+            fileout.write(str(i) + ") " + str(project) + "\n")
+            
+            i += 1
+        fileout.close()
+        
+    def writebaselines(self):
+        fileout = file(self.output_dir + '/' + self.project_name + '_baselines.txt', 'w')    
+        
+        i = 1
+        for project in self.project.baseline:
+            fileout.write(str(i) + ") " + str(project) + "\n")
+            
+            cmproject = self.session.create(str(project))
+            
+            try:
+                baseline = str(cmproject.baseline).strip()
+                if baseline == "None":
+                    fileout.write(str(i) + ") " + str(project) + "\n")
+                else:
+                    fileout.write(str(i) + ") " + baseline + "\n")
+                i += 1
+            except Exception, ex:
+                print ex
+        fileout.close()
+            
+    def writetasks(self):
+        if self.project.xml_properties.has_key("task"):
+            fileout = file(self.output_dir + '/' + self.project_name + '_tasks.txt', 'w')
+            
+            i = 1
+            for task in self.project.task:
+                fileout.write(str(i) + ") Task " + str(task) + "\n")
+                i += 1
+            fileout.close()
+
+
+
--- a/buildframework/helium/tools/common/python/lib/build/io.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/build/io.py	Wed Dec 23 19:29:07 2009 +0200
@@ -43,7 +43,9 @@
         self.parse()
 
     def __iter__(self):
-        for key in self._releasable.keys():
+        keys = self._releasable.keys()
+        keys.sort()
+        for key in keys:
             yield (key, self._releasable[key])
     
     def task(self, name, cmdline, path, output):
--- a/buildframework/helium/tools/common/python/lib/build/model.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/build/model.py	Wed Dec 23 19:29:07 2009 +0200
@@ -23,10 +23,7 @@
 import logging
 import re
 import os
-
-from amara import bindery
 import amara
-
 import ccm
 import ccm.extra
 import configuration
@@ -59,47 +56,20 @@
 
 class BOM(object):
     """ The Bill of Materials for a build. """
-    def __init__(self, config, ccm_project=None, username=None, password=None, provider=None):
+    def __init__(self, config):
         """ Initialization.
         
         :param config: The build configuration properties.
         :param ccm_project: The Synergy project used for reading the BOM.
         """
         self.config = config
-        self._sessioncreator = SessionCreator(username=username, password=password, provider=provider)
-        self.ccm_project = ccm_project
         self.build = ""
         self._projects = []
-        if self.ccm_project != None: 
-            self._projects = [Project(ccm_project, config)]
         self._icd_icfs = []
         self._flags = []
         
-        self._capture_projects()
         self._capture_icd_icfs()
         self._capture_flags()
-    
-    def _capture_projects(self):
-        # grab data from new format of delivery.xml
-        configBuilder = configuration.NestedConfigurationBuilder(open(self.config['delivery'], 'r'))
-        for config in configBuilder.getConfiguration().getConfigurations():            
-            _logger.debug('Importing project %s from delivery config.' % str(config.name))            
-            ccm_project = self._sessioncreator.session(config['database']).create(config.name)
-            project = Project(self.__find_project(ccm_project, config), config)
-            self._projects.append(project)
-
-    def __find_project(self, project, config):
-        if (os.path.exists(os.path.join(config['dir'], project.name, "project.version"))):
-            return project
-        
-        path = os.path.join(config['dir'], project.name, project.name)
-        if (not os.path.exists(path)):
-            return project
-        try:
-            result = project.session.get_workarea_info(path)
-            return result['project']           
-        except ccm.CCMException:            
-            return project
         
     def _capture_icd_icfs(self):
         prep_xml_path = self.config['prep.xml']
@@ -153,6 +123,57 @@
             
     def __str__(self):
         return str(self._projects)
+
+class SimpleProject(object):
+    def __init__(self, tasks):
+        self.tasks = tasks
+        self.folders = []
+
+class SimpleBOM(BOM):
+    def __init__(self, config, bomxml):
+        BOM.__init__(self, config)
+        self._baselines = {}
+        bom = amara.parse(open(bomxml))
+        for p in bom.bom.content.project:
+            tasks = []
+            self._baselines[str(p.baseline)] = {}
+            for t in p.task:
+                tasks.append(str(t.id) + ': ' + str(t.synopsis))
+            self._projects.append(SimpleProject(tasks))
+    
+    def all_baselines(self):
+        return self._baselines
+
+class SynergyBOM(BOM):
+    def __init__(self, config, ccm_project=None, username=None, password=None, provider=None):
+        BOM.__init__(self, config)
+        self._sessioncreator = SessionCreator(username=username, password=password, provider=provider)
+        self.ccm_project = ccm_project
+        if self.ccm_project != None: 
+            self._projects = [Project(ccm_project, config)]
+        self._capture_projects()
+            
+    def __find_project(self, project, config):
+        if (os.path.exists(os.path.join(config['dir'], project.name, "project.version"))):
+            return project
+        
+        path = os.path.join(config['dir'], project.name, project.name)
+        if (not os.path.exists(path)):
+            return project
+        try:
+            result = project.session.get_workarea_info(path)
+            return result['project']           
+        except ccm.CCMException:            
+            return project
+            
+    def _capture_projects(self):
+        # grab data from new format of delivery.xml
+        configBuilder = configuration.NestedConfigurationBuilder(open(self.config['delivery'], 'r'))
+        for config in configBuilder.getConfiguration().getConfigurations():            
+            _logger.debug('Importing project %s from delivery config.' % str(config.name))            
+            ccm_project = self._sessioncreator.session(config['database']).create(config.name)
+            project = Project(self.__find_project(ccm_project, config), config)
+            self._projects.append(project)
         
     def close(self):
         self._sessioncreator.close()
@@ -182,7 +203,7 @@
         if bproject != None:        
             self._baselines[unicode(bproject)] = {u'overridden':u'true'}
             # This section finds the baselines of all of the checked out projects
-            if project_status == "prep" or project_status == "working":
+            if project_status == "prep" or project_status == "working" or project_status == "shared":
                 for subproject in self._ccm_project.subprojects:
                     overridden = u'false'
                     subprojbaseline = subproject.baseline
@@ -239,7 +260,7 @@
         if project == None:
             return []
         project_status = project['status']
-        if project_status == "prep" or project_status == "working":
+        if project_status == "prep" or project_status == "working" or project_status == "shared":
             result = [project]
             baseline = project.baseline
             if baseline != None:
@@ -597,18 +618,19 @@
                     fix_node = doc.xml_create_element(u'fix', content=(unicode(task)), attributes = {u'type': unicode(fix.__class__.__name__)})
                     project_node.xml_append(fix_node)
 
-        # Add ICD info to BOM
-        doc.bom.content.xml_append(doc.xml_create_element(u'input'))
-
-        # Add default values to unused fields so icds are visible in the BOM
-        empty_bom_str = u'N/A'
-        empty_bom_tm = u'0'
-        doc.bom.content.input.xml_append(doc.xml_create_element(u'name', content=(unicode(empty_bom_str))))
-        doc.bom.content.input.xml_append(doc.xml_create_element(u'year', content=(unicode(empty_bom_tm))))
-        doc.bom.content.input.xml_append(doc.xml_create_element(u'week', content=(unicode(empty_bom_tm))))
-        doc.bom.content.input.xml_append(doc.xml_create_element(u'version', content=(unicode(empty_bom_str))))
-
-        doc.bom.content.input.xml_append(doc.xml_create_element(u'icds'))
+        if self._bom._icd_icfs != []:
+            # Add ICD info to BOM
+            doc.bom.content.xml_append(doc.xml_create_element(u'input'))
+    
+            # Add default values to unused fields so icds are visible in the BOM
+            empty_bom_str = u'N/A'
+            empty_bom_tm = u'0'
+            doc.bom.content.input.xml_append(doc.xml_create_element(u'name', content=(unicode(empty_bom_str))))
+            doc.bom.content.input.xml_append(doc.xml_create_element(u'year', content=(unicode(empty_bom_tm))))
+            doc.bom.content.input.xml_append(doc.xml_create_element(u'week', content=(unicode(empty_bom_tm))))
+            doc.bom.content.input.xml_append(doc.xml_create_element(u'version', content=(unicode(empty_bom_str))))
+    
+            doc.bom.content.input.xml_append(doc.xml_create_element(u'icds'))
 
         # pylint: disable-msg=R0914
         for i, icd in enumerate(self._bom._icd_icfs):
@@ -631,6 +653,12 @@
             else:
                 s60_year = u'0'
                 s60_week = u'0'
+                if s60_version == None:
+                    res = re.match(r'.*\.(.*)_(\d{4})(\d{2})_(.*)', release)
+                    if res != None:
+                        s60_release = res.group(1) + '_' + res.group(4)
+                        s60_year = res.group(2)
+                        s60_week = res.group(3)
             s60_input_node.xml_append(doc.xml_create_element(u'name', content=(unicode("s60"))))
             s60_input_node.xml_append(doc.xml_create_element(u'year', content=(unicode(s60_year))))
             s60_input_node.xml_append(doc.xml_create_element(u'week', content=(unicode(s60_week))))
@@ -653,4 +681,4 @@
             _completed_line = _log_array[2]
             return _completed_line[:_completed_line.rfind(':')].strip()
         else:
-            return u'None'
\ No newline at end of file
+            return u'None'
--- a/buildframework/helium/tools/common/python/lib/buildtools.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/buildtools.py	Wed Dec 23 19:29:07 2009 +0200
@@ -48,27 +48,25 @@
     def __init__(self, configSet):
         self.configSet = configSet
         # Select the first configuration as a default, for referencing common properties
-        self.config = configSet.getConfigurations()[0]
+        self.config = None
+        configs = configSet.getConfigurations()
+        if len(configs) > 0:
+            self.config = configs[0]
 
     def writeBuildFile(self, taskList, buildFilePath, output='ant'):
         """ Converting a task list into output format and writing it into buildFilePath file. """
         writer = None
-        #if 'build.tool' in self.config:
-            # Choose appropriate build tool
-        #    print 'choosing build tool!'
-        #    pass
-        #else:
-        # Choose Ant by default for now
-        print self.config.keys()
         buildFileDir = os.path.dirname(buildFilePath)
-        if not os.path.exists(buildFileDir):
+        if len(buildFileDir) > 0 and not os.path.exists(buildFileDir):
             os.makedirs(buildFileDir)
         writer = get_writer(output, open(buildFilePath, 'w'))
         writer.write(taskList)
 
+
 class Task(object):
     """ Abstract Task object. """
     pass
+
         
 class Command(Task):
     """
@@ -127,6 +125,7 @@
         argsString = ' '.join(self._args)
         return "%s: %s: %s" % (self.name(), self.path(), argsString)
 
+
 class AntTask(Task):
     """ Interface that defines supports for an Ant task rendering. """
     
@@ -135,7 +134,8 @@
             e.g: Delete Class will use delete task from Ant, else convert into perl ... remove filename.__getCommandByStage
         """ 
         pass
-    
+
+
 class Delete(AntTask, Command):
     """ Implements file/directory deleletion mechanism. """
     
@@ -185,6 +185,7 @@
         node.setAttributeNS("", "failonerror", "false")
         node.setAttributeNS("", "file", self.srcFile)
         node.setAttributeNS("", "todir", self.todir)
+        node.setAttributeNS("", "overwrite", "true")
         return node
          
 
@@ -241,6 +242,7 @@
     def __del__(self):
         self.close()
 
+
 class StringWriter(AbstractOutputWriter):
     """ Implements a Writer which is able to directly write to the output stream. """
     
@@ -295,6 +297,7 @@
         projectnode = doc.createElementNS("", "project")
         projectnode.setAttributeNS("", "name", '')
         projectnode.setAttributeNS("", "default", "all")
+        projectnode.setAttributeNS("", "xmlns:hlm", "http://www.nokia.com/helium")
         doc.appendChild(projectnode)
         target = doc.createElementNS("", "target")
         target.setAttributeNS("", "name", "all")
@@ -308,7 +311,7 @@
         for config in config_list:
             sequential = doc.createElementNS("", "sequential")
             outputfile = os.path.normpath(os.path.join(output_path, config + ".xml"))
-            exec_element = doc.createElementNS("", "exec")
+            exec_element = doc.createElementNS("", "hlm:exec")
             exec_element.setAttributeNS("", "executable", "python")
             exec_element.setAttributeNS("", "failonerror", "true")
 
@@ -347,6 +350,7 @@
         projectnode = doc.createElementNS("", "project")
         projectnode.setAttributeNS("", "name", '')
         projectnode.setAttributeNS("", "default", "all")
+        projectnode.setAttributeNS("", "xmlns:hlm", "http://www.nokia.com/helium")
         doc.appendChild(projectnode)
 
         stages = self.__getCommandByStage(cmdList)
@@ -384,7 +388,7 @@
         if issubclass(type(cmd), AntTask):
             return cmd.toAntTask(doc)
         else:
-            execnode = doc.createElementNS("", "exec")
+            execnode = doc.createElementNS("", "hlm:exec")
             execnode.setAttributeNS("", "executable", cmd.executable())
             execnode.setAttributeNS("", "dir", cmd.path())
             arg = doc.createElementNS("", "arg")
@@ -460,7 +464,6 @@
                 self.__commandToTarget(cmd)
                 return "id%s" % cmd.jobId()
             self._fileOut.write("stage%s : %s\n" % (stage, ' '.join([__toId(task) for task in stages[stage]])))
-        
 
     def __commandToTarget(self, cmd):
         """ Converting a Command into a Makefile target. """
@@ -481,6 +484,7 @@
                          'make': MakeWriter,
                          'ebs': EBSWriter }
 
+
 def convert(cmdList, filename, outputtype="ant"):
     """ Helper to directly convert a command list into a specific runnable command format.
         e.g:
@@ -491,6 +495,7 @@
     writer = __writerConstructors[outputtype](filename)
     writer(cmdList)
 
+
 def get_writer(buildTool, fileOut):
     """ Get a Writer for a specific format. """
     return __writerConstructors[buildTool](fileOut)
--- a/buildframework/helium/tools/common/python/lib/ccm/__init__.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/ccm/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -516,6 +516,7 @@
 CHECKOUT_LOG_RULES = [[r'^Derive failed for', logging.ERROR],
                       [r'^Serious:', logging.ERROR],
                       [r'^Warning: .* failed.', logging.ERROR],
+                      [r'^Invalid work area', logging.ERROR],
                       [r'^WARNING:', logging.WARNING],
                       [r'^Warning:', logging.WARNING],]
 
@@ -1191,9 +1192,9 @@
             raise CCMException("Error retrieving content from object %s in %s (error status: %s)\n%s" % (self, path, result.status, result.output), result)
     
     def merge(self, ccm_object, task):
-        assert(ccm_object != None, "object must be defined.")
-        assert(task != None, "task must be defined.")
-        assert(task.type == "task", "task parameter must be of 'task' type.")
+        assert ccm_object != None, "object must be defined."
+        assert task != None, "task must be defined."
+        assert task.type == "task", "task parameter must be of 'task' type."
         result = self._session.execute("merge -task %s \"%s\" \"%s\"" % (task['displayname'], self, ccm_object))
         
         validity = 0
@@ -1343,7 +1344,7 @@
     
     def snapshot(self, targetdir, recursive=False):
         """ Take a snapshot of the project. """
-        assert(targetdir != None, "targetdir must be defined.")
+        assert targetdir != None, "targetdir must be defined."
         if recursive:
             recursive = "-recurse"
         else:
@@ -1847,6 +1848,8 @@
     """  return role needed to modify project with a specific status. """
     if status == 'prep':
         return 'build_mgr'
+    elif status == 'shared':
+        return 'developer'
     elif status == 'working':
         return 'developer'
     else:
--- a/buildframework/helium/tools/common/python/lib/ccm/conflict.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,262 +0,0 @@
-#============================================================================ 
-#Name        : conflict.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-""" CCM conflict detection module. """
-
-
-import threading
-
-import ccm
-import threadpool
-
-
-def get_tasks_from_project(project):
-    result = []
-    for folder in project.folders:
-        result.extend(get_tasks(folder))    
-    result.extend(project.tasks)    
-    return result
-
-
-def get_tasks_information_from_project(project):
-    result = []
-    for folder in project.folders:
-        result.extend(get_tasks_information(folder))    
-    for task in project.tasks:
-        query = ccm.Query(folder.session, "name= '%s'and version='%s' and type='%s'and instance='%s'" % (task.name, task.version, task.type, task.instance),
-                          ['objectname', 'owner', 'task_synopsis', 'displayname'],
-                          ['ccmobject', 'string', 'string', 'string'])
-        result.extend(query.execute().output)
-    return result
-
-
-def get_tasks_information(folder):
-    """ Get tasks from folder. If the folder is query based it uses the query to determine the list of task.
-        But the folder contents itself remains untouch.
-    """
-    query = None
-    if folder.is_query_based:
-        query = ccm.Query(folder.session, "type='task' and " + folder.query,
-                          ['objectname', 'owner', 'task_synopsis', 'displayname'],
-                          ['ccmobject', 'string', 'string', 'string'])
-    else:
-        query = ccm.Query(folder.session, folder.objectname,
-                          ['objectname', 'owner', 'task_synopsis', 'displayname'],
-                          ['ccmobject', 'string', 'string', 'string'],
-                          "folder -show tasks")        
-    # executing the query
-    return query.execute().output
-
-
-
-def get_tasks(folder):
-    """ Get tasks from folder. If the folder is query based it uses the query to determine the list of task.
-        But the folder contents itself remains untouch.
-    """
-    if folder.is_query_based:
-        r = folder.session.execute("query -u -t task \"%s\" -f \"%%objectname\"" % folder.query, ccm.ObjectListResult(folder.session))
-        return r.output
-    else:
-        return folder.tasks
-
-
-class ObjectAndTask:
-    """ Wrapper object which link an object to a task. """
-    def __init__(self, object, task):
-        self.object = object
-        self.task = task
-        self.overridenby = []
-    
-    def has_successor_in_list(self, oatl):
-        """ Has our object any successor in the list. """
-        for oat in oatl:
-            if self.object.__ne__(oat.object) and oat.object.is_recursive_successor_of_fast(self.object):
-                self.overridenby.append(oat)
-                return True
-        return False
-    
-    def __repr__(self):
-        return "<ObjectAndTask %s, %s>" % (self.object.objectname, self.task.objectname)
-
-
-class TaskModel:
-    """ Task wrapper object which contains objectandtask object. """
-    
-    def __init__ (self, task):
-        """ Init from task object. """
-        self.task = task
-        self.objectandtasks = {}        
-        for object in self.task.objects:
-            self.objectandtasks[str(object)] = ObjectAndTask(object, task)
-
-    def is_useless(self):
-        """ Is the task containing any usable objects. """
-        count = 0
-        for object in self.objectandtasks.keys():
-            oat = self.objectandtasks[object]
-            if len(oat.overridenby) > 0:
-                count += 1
-        if len(self.objectandtasks.keys()) == 0 or count == len(self.objectandtasks.keys()):
-            return True
-        return False
-                
-    
-def tasks_to_objectandtask(tasks):
-    object_families = {}
-    for task in tasks:
-        for object in task.objects:
-            if not object.family in object_families:
-                object_families[object.family] = []
-            object_families[object.family].append(ObjectAndTask(object, task))
-    return object_families
-
-
-def tasks_to_families_and_taskmodels(tasks, size=1):
-    object_families = {}
-    taskmodels = []
-    lock = threading.Lock()
-
-    def __work(task):
-        tm = TaskModel(task)
-        
-        lock.acquire()
-        taskmodels.append(tm)
-        lock.release()
-        
-        for oatk in tm.objectandtasks.keys():
-            oat = tm.objectandtasks[oatk]
-            lock.acquire()
-            if not oat.object.family in object_families:                
-                object_families[oat.object.family] = []            
-            object_families[oat.object.family].append(oat)
-            lock.release()
-
-    
-    if size > 1:
-        pool = threadpool.ThreadPool(size)
-        for task in tasks:
-            pool.addWork(__work, args=[task])
-        pool.wait()
-    else:
-        for task in tasks:
-            __work(task)
-    
-    return (object_families, taskmodels)
-
-
-def check_task_conflicts(tasks, size=1):
-    """ Validates objects a list of task.
-        It returns a list of list of conflicting ObjectAndTask.
-    """
-    
-    object_families, taskmodels = tasks_to_families_and_taskmodels(tasks, size)
-    conflicts = []
-    lock = threading.Lock()
-
-    pool = threadpool.ThreadPool(size)
-
-    def __work(family):
-        result = []
-        for oat in object_families[family]:
-            if oat.has_successor_in_list(object_families[family]) == False:
-                add = True
-                for roat in result:
-                    if roat.object == oat.object:
-                        add = False
-                        break
-                if add: 
-                    result.append(oat)
-                     
-        if len(result)>1:
-            lock.acquire()
-            conflicts.append(result)
-            lock.release()
-
-    for family in object_families.keys():        
-        pool.addWork(__work, args=[family])
-    
-    pool.wait()
-    
-    return conflicts, taskmodels
-
-
-class Conflict:
-    def __init__(self, baseline, comment):
-        self.baseline = baseline
-        self._comment = comment
-
-    def comment(self):
-        return self._comment
-
-
-class MultipleObjectInBaselineConflict(Conflict):
-    def __init__(self, baseline, objectlist):
-        Conflict.__init__(self, baseline, "")        
-        self.objectlist = objectlist
-        
-    def comment(self):
-        output = "Multiple objects from the same family found under the baseline (%s).\n" % self.baseline.objectname
-        output += "\n".join(lambda x: x.objectname, self.objectlist)
-        return output
-
-
-class ObjectAndBaselineConflict(Conflict):
-    def __init__(self, baseline, object, oat):
-        Conflict.__init__(self, baseline, "")
-        self.object = object
-        self.oat = oat
-    
-    def comment(self):
-        pass
-    
-    
-class ObjectNotFoundInBaselineConflict(Conflict):
-    def __init__(self, baseline, object):
-        Conflict.__init__(self, baseline, "")
-        self.object = object
-    
-    def comment(self):
-        return "No object fom '%s' family found under the baseline." % self.object.family
-
-
-def check_task_and_baseline_conflicts(tasks, baseline):
-    """ Validates objects a list of task.
-        It returns a list of list of conflicting ObjectAndTask.
-    """
-    
-    object_families = tasks_to_objectandtask(tasks)
-    conflicts = []
-
-    for family in object_families:
-        result = family[0].session.execute("query \"name='%s' and type='%s' and instance='%s'\" and recursive_is_member_of('%s', none) " % 
-                                                        (family[0].name, family[0].type, family[0].instance, baseline.objectname),
-                                                        ccm.ObjectListResult(family[0].session))
-        if len(result.output) == 1:
-            bo = result.output[0]
-            potential_conflicts = []
-            for oat in family:
-                if bo.recursive_predecessor_of(oat.object):
-                    potential_conflicts.append(ObjectAndBaselineConflict(baseline, bo, oat, "Conflict between baseline object and task object"))
-            if len(family) == len(potential_conflicts):
-                conflicts.extend(potential_conflicts)
-        elif len(result.output) > 1:
-            conflicts.append(MultipleObjectInBaselineConflict(baseline, result.output))
-        else:
-            conflicts.append(ObjectNotFoundInBaselineConflict(baseline, family[0]))
-
--- a/buildframework/helium/tools/common/python/lib/ccm/extra.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/ccm/extra.py	Wed Dec 23 19:29:07 2009 +0200
@@ -46,8 +46,8 @@
 
 def Snapshot(project, targetdir, dir=None):
     """ This function can snapshot anything from Synergy, even prep/working projects """
-    assert (project != None, "a project object must be supplied")
-    assert (project.type == "project", "project must be of project type")
+    assert project != None, "a project object must be supplied"
+    assert project.type == "project", "project must be of project type"
     if not dir:
         dir = project.root_dir()
     targetdir = os.path.join(targetdir, dir.name)
@@ -60,68 +60,59 @@
         else:
             object.to_file(os.path.join(targetdir, object.name))
 
-class __FileSnapshot:
-    def __init__(self, object, targetdir):
-        self.object = object
-        self.targetdir = targetdir
-    def __call__(self):
-        _logger.info("Getting %s (%s)" % (os.path.join(self.targetdir, self.object.name), self.object))
-        self.object.to_file(os.path.join(self.targetdir, self.object.name))
-        return "Getting %s (%s)" % (os.path.join(self.targetdir, self.object.name), self.object)
 
-class __ProjectSnapshot:
-    def __init__(self, project, targetdir):
+class _FastSnapshot:
+    """ Snapshot Job executed by the thread pool. """
+    def __init__(self, pool, project, targetdir, callback, exc_hld):
+        """ Construtor, will store the parameter for the checkout. """
+        self.pool = pool
         self.project = project
         self.targetdir = targetdir
-    def __call__(self):
-        _logger.info("Snapshotting '%s' under '%s'" % (self.project, self.targetdir))
-        status = self.project['status']
-        if status == 'released' or status == 'sqa' or status == 'test' or status == 'integrate':
-            _logger.info("Using Synergy wa_snapshot")
-            return self.project.snapshot(self.targetdir, True)
-        else:
-            _logger.info("Non static project, using custom snapshot.")
-            Snapshot(self.project, self.targetdir)
-            return ""
+        self.callback = callback
+        self.exc_hld = exc_hld
 
-def __FastSnapshot(pool, project, targetdir, callback, exc_hld, dir=None):
-    if not dir:
-        dir = project.root_dir()
-    targetdir = os.path.join(targetdir, dir.name)    
-    os.makedirs(targetdir)
-    for object in dir.children(project):
-        if isinstance(object, ccm.Dir):
-            __FastSnapshot(pool, project, targetdir, callback, exc_hld, object)
-        elif isinstance(object, ccm.Project):
-            pool.addWork(__ProjectSnapshot(object, targetdir), callback=callback, exc_callback=exc_hld)
-        else:
-            _logger.info("Getting %s (%s)" % (os.path.join(targetdir, object.name), object))
-            object.to_file(os.path.join(targetdir, object.name))            
-            # Can't snapshot files in parallel.
-            #pool.addWork(__FileSnapshot(object, targetdir), callback=callback, exc_callback=exc_hld)
-    
+    def __call__(self):
+        """ Do the checkout, and then walkthrough the project hierarchy to find subproject to snapshot. """
+        _logger.info("Snapshotting %s under %s" % (self.project, self.targetdir))
+        self.project.snapshot(self.targetdir, False)
+        def walk(dir, targetdir):
+            for object in dir.children(self.project):
+                if isinstance(object, ccm.Dir):
+                    walk(object, os.path.join(targetdir, object.name))
+                elif isinstance(object, ccm.Project):
+                    _logger.info("Adding project %s" % object.objectname)
+                    self.pool.addWork(_FastSnapshot(self.pool, object, targetdir, self.callback, self.exc_hld))
+                    
+        if len(self.project.subprojects) > 0:
+            rootdir = self.project.root_dir()
+            walk(rootdir, os.path.join(self.targetdir, rootdir.name))
+        return ""
+
 def FastSnapshot(project, targetdir, threads=4):
-    """ Create snapshot running by running sbsnapshot concurently. """
-    assert (threads > 0, "Number of threads must be > 0.")
-    assert (project != None, "a project object must be supplied.")
-    assert (project.type == "project", "project must be of project type.")    
+    """ Create snapshot running by running snapshots concurrently.
+        Snapshot will be made recursively top-down, and each sub project will
+        be snapshotted in parallel. 
+    """
+    assert threads > 0, "Number of threads must be > 0."
+    assert project != None, "a project object must be supplied."
+    assert project.type == "project", "project must be of project type."
     
     # error handling
     exceptions = []
     results = []
     def handle_exception(request, exc_info):
-        _logger.error( "Exception occured in request #%s: %s" % (request.requestID, exc_info[1]))
+        _logger.error( "Exception occurred in request #%s: %s" % (request.requestID, exc_info[1]))
         exceptions.append(exc_info[1])                        
 
     def handle_result(request, result):        
         results.append(result)
    
     pool = threadpool.ThreadPool(threads)
-    __FastSnapshot(pool, project, targetdir, handle_result, handle_exception)
+    pool.addWork(_FastSnapshot(pool, project, targetdir, handle_result, handle_exception))
     pool.wait()
     
     if len(exceptions):
-        raise CCMExtraException("Errors occured during snapshot.", exceptions)
+        raise CCMExtraException("Errors occurred during snapshot.", exceptions)
 
     return "\n".join(results)
 
@@ -129,8 +120,8 @@
 
 def FastMaintainWorkArea(project, path, pst=None, threads=4, wat=False):
     """ Maintain the workarea of a project in parallel. """
-    assert (threads > 0, "Number of threads must be > 0.")
-    assert (isinstance(project, ccm.Project), "a valid project object must be supplied.")
+    assert threads > 0, "Number of threads must be > 0."
+    assert isinstance(project, ccm.Project), "a valid project object must be supplied."
             
     # error handling
     exceptions = []
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/ccmutil.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,52 @@
+#============================================================================ 
+#Name        : ccmutil.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" utility module related to ccm """
+
+import nokia.nokiaccm
+import configuration
+import ccm.extra
+
+def get_session(database, username, password, engine, dbpath):
+    """ Returns a user session """
+    session = None
+    if database != None:
+        session = nokia.nokiaccm.open_session(username, password, database=database)
+    else:
+        session = nokia.nokiaccm.open_session(username, password, engine, dbpath)
+    return session    
+
+def get_ccm_cache(ccm_cache_xml):
+    cache = None
+    if ccm_cache_xml is not None:
+        cache = str(ccm_cache_xml)
+    return cache
+    
+def get_ccm_project(session, deliveryfile, waroot):
+    """ Returns top level ccm project """
+    configBuilder = configuration.NestedConfigurationBuilder(open(deliveryfile, 'r'))
+    configSet = configBuilder.getConfiguration()
+    for config in configSet.getConfigurations():
+        waroot = config['dir']
+        print "Found wa for project %s" % waroot
+    return ccm.extra.get_toplevel_project(session, waroot)
+    
+
+
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/compilation.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,60 @@
+#============================================================================ 
+#Name        : compilation.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Package contains compilation phase related modules """
+
+import logging
+import build.io
+import sysdef.api
+import sysdef.io
+
+logging.basicConfig(level=logging.INFO)
+
+class BinarySizeLogger(object):
+    """ Read Binary size from rom output logs """
+    def __init__(self, sysDef):
+        self.sysDef = sysDef
+        
+    def read_output_binaries_per_unit(self, build_logs):
+        # Read in the output binaries of each unit
+        logging.info('Reading the output binaries created by each unit.')
+        if len(build_logs) == 0:
+            raise Exception('List of build logs is empty!')
+        logging.info("The list of log files:\n")
+        logging.info("\n".join(build_logs))
+        for logpath in build_logs:
+            binaries_reader = build.io.AbldLogWhatReader(logpath)
+            self.sysDef.merge_binaries(binaries_reader)
+        
+    def read_binary_sizes_in_rom_output_logs(self, rom_logs):    
+        # Read in the binary sizes listed in the ROM output logs
+        logging.info('Reading the binary sizes of each binary from ROM logs.')
+        if len(rom_logs) == 0:
+            raise Exception('List of ROM logs is empty!')
+        logging.info("The list of log files:\n")
+        logging.info("\n".join(rom_logs))
+        for log in rom_logs:
+            binary_sizes_reader = build.io.RombuildLogBinarySizeReader(log)
+            self.sysDef.merge_binary_sizes(binary_sizes_reader)
+    
+    def write2csvfile(self, binary_sizes_output_file, sysdef_config_list):
+        # Write out a .csv file containing
+        size_writer = sysdef.io.FlashImageSizeWriter(binary_sizes_output_file)
+        size_writer.write(self.sysDef, sysdef_config_list)
+        size_writer.close()
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/configuration.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/configuration.py	Wed Dec 23 19:29:07 2009 +0200
@@ -43,16 +43,17 @@
 logging.basicConfig(level=logging.INFO)
 
 class Configuration(object, UserDict.DictMixin):
-    """ Base Configuration objects. """
+    """ Base Configuration object. """
     
     key_re = re.compile(r'\${(?P<name>[._a-zA-Z0-9]+)}', re.M)
     
     def __init__(self, data=None):
         """ Initialization. """
-        if data == None:
-            data = {}
+        #super(UserDict.DictMixin, self).__init__(data)
         self.name = None
-        self.data = data
+        self.data = {}
+        if data is not None:
+            self.data.update(data)
 
     def __contains__(self, key):
         """ Check if a keys is defined in the dict. """
@@ -75,6 +76,10 @@
     def keys(self):
         """ Get the list of item keys. """
         return self.data.keys()
+    
+    def has_key(self, key):
+        """ Check if key exists. """
+        return self.data.has_key(key)
 
     def match_name(self, name):
         """ See if the given name matches the name of this configuration. """
@@ -88,6 +93,7 @@
             return default_value
 
     def get_list(self, key, default_value):
+        """ Get a value as a list. """
         try:
             itemlist = self.__getitem__(key)
             if not isinstance(itemlist, types.ListType):
@@ -97,6 +103,7 @@
             return default_value
         
     def get_int(self, key, default_value):
+        """ Get a value as an int. """
         try:
             value = self.__getitem__(key)
             return int(value)
@@ -104,6 +111,7 @@
             return default_value
         
     def get_boolean(self, key, default_value):
+        """ Get a value as a boolean. """
         try:
             value = self.__getitem__(key)
             return value == "true" or value == "yes" or value == "1"
@@ -121,6 +129,20 @@
                 for match in self.key_re.finditer(value):
                     for property_name in match.groups():
                         if self.has_key(property_name):
+                            # See if interpolation may cause infinite recursion
+                            raw_property_value = self.__getitem__(property_name, False)
+                            #print 'raw_property_value: ' + raw_property_value
+                            if raw_property_value == None:
+                                raw_property_value = ''
+                            if isinstance(raw_property_value, types.ListType):
+                                for prop in raw_property_value:
+                                    if re.search('\${' + property_name + '}', prop) != None:
+                                        raise Exception("Key '%s' will cause recursive interpolation with value %s" % (property_name, raw_property_value))
+                            else:
+                                if re.search('\${' + property_name + '}', raw_property_value) != None:
+                                    raise Exception("Key '%s' will cause recursive interpolation with value %s" % (property_name, raw_property_value))
+                                    
+                            # Get the property value
                             property_value = self.__getitem__(property_name)
                             if isinstance(property_value, types.ListType):
                                 property_value = ",".join(property_value)
@@ -130,9 +152,11 @@
         return value
     
     def __str__(self):
+        """ A string representation. """
         return self.__class__.__name__ + '[' + str(self.name) + ']'
         
     def __cmp__(self, other):
+        """ Compare with another object. """
         return cmp(self.__str__, other.__str__)
        
        
@@ -368,6 +392,7 @@
             
 
 class NestedConfiguration(Configuration):
+    """ A nested configuration that may have a parent or child configurations. """
     def __init__(self):
         """ Initialization. """
         Configuration.__init__(self, None)
@@ -376,6 +401,7 @@
         self.abstract = None
 
     def isBuildable(self):
+        """ Is this a buildable configuration? """
         return self.abstract == None
 
     def _addPropertyValue(self, key, value, parseList=True):
@@ -411,6 +437,7 @@
             self.data[key] = value
 
     def __getitem__(self, key, interpolate=True):
+        """ Get an item. """
         #print "__getitem__(%s, %s)" % (self.name, key)
         if self.data.has_key(key):
             value = super(NestedConfiguration, self).__getitem__(key, False)
@@ -425,9 +452,11 @@
         raise KeyError('Cannot find key: ' + key)
 
     def __setitem__(self, key, item):
+        """ Set the value of an item. """
         self.data[key] = item
 
     def __delitem__(self, key):
+        """ Remove an item. """
         del self.data[key]
 
     def __contains__(self, key):
@@ -439,6 +468,7 @@
         return False
             
     def keys(self):
+        """ Get the list of item keys. """
         myKeys = self.data.keys()
         if self.parent != None:
             parentKeys = self.parent.keys()
@@ -446,8 +476,17 @@
                 if not key in myKeys:
                     myKeys.append(key)
         return myKeys
+        
+    def has_key(self, key):
+        """ Check if key exists. """
+        if self.data.has_key(key):
+            return True
+        if self.parent != None:
+            return self.parent.has_key(key)
+        return False
 
     def match_name(self, name):
+        """ See if the configuration name matches the argument. """
         if self.name == name:
             return True
         if self.parent != None:
@@ -665,13 +704,13 @@
                 else:
                     raise Exception('Bad configuration xml element: ' + child.nodeName)
 
-        for childConfigNode in configChildNodes:
-            self.parseConfiguration(childConfigNode, configs, config)
-
         # Only save the buildable configurations
         if config.isBuildable():
             _logger.debug('Adding config to buildable set: ' + str(config))
             configs.append(config)
+            
+        for childConfigNode in configChildNodes:
+            self.parseConfiguration(childConfigNode, configs, config)
 
     def getNodeByReference(self, refName):
         """ Find a node based on a reference to it. """
@@ -700,6 +739,13 @@
             value = self.interpolate(value)
         return value
         
+    def has_key(self, key):
+        """ Check if key exists. """
+        elements = self._root.xpath(_Key(key).to_xpath())
+        if len(elements) > 0:
+            return True
+        return False
+        
     
 class _Key(object):
     """ A hierarchical configuration key. """
@@ -709,6 +755,7 @@
         self.string = string
         
     def to_xpath(self):
+        """ Convert the key to XPath syntax. """
         return self.string.replace('.', '/')
         
         
--- a/buildframework/helium/tools/common/python/lib/configuration_model.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/configuration_model.py	Wed Dec 23 19:29:07 2009 +0200
@@ -18,7 +18,6 @@
 #===============================================================================
 
 import amara
-from amara import bindery
 import logging
 import types
 import copy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/__init__.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,19 @@
+#============================================================================ 
+#Name        : __init__.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_archive.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,994 @@
+#============================================================================ 
+#Name        : test_archive.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""Test the archive.py module."""
+
+from __future__ import with_statement
+import os
+import amara
+import unittest
+import sys
+
+import archive
+import configuration
+import logging
+import fileutils
+import xml.dom.minidom
+
+import test_fileutils
+
+
+_logger = logging.getLogger('test.archive')
+    
+    
+root_test_dir = test_fileutils.root_test_dir
+
+def setup_module():
+    """ Creates some test data files for file-related testing. """
+    test_fileutils.setup_module()
+    
+def teardown_module():
+    """ Cleans up test data files for file-related testing. """
+    test_fileutils.teardown_module()
+    
+    
+class ArchivePreBuilderTest(unittest.TestCase):
+    """Tests that an archive configuration file successfully creates an Ant exec file."""
+    EXEC_FILE = "archive_create.ant.xml"
+
+    def test_ant_exec(self):
+        """Tests that an archive configuration file successfully creates an Ant exec file."""
+        builder = configuration.NestedConfigurationBuilder('tests/data/archive_test_input.cfg.xml')
+        archiveConfigSet = builder.getConfiguration()
+        archivePreBuilder = archive.ArchivePreBuilder(archiveConfigSet, "config", index=0)
+        buildFilePath = os.path.join(root_test_dir, r'archive_test.ant.xml')
+        archivePreBuilder.write(buildFilePath)
+        build_file = open(buildFilePath)
+        build_file_content = build_file.read()
+        _logger.debug(build_file_content)
+        resultDoc = amara.parse(build_file_content)
+        build_file.close()
+        # The last target in the Ant file should be called 'all'. Other targets
+        # are named stage1, stage2, etc.
+        assert resultDoc.project.target[-1].name == 'all'
+        os.remove(buildFilePath)
+        
+
+
+class LogicalArchiveTest(unittest.TestCase):
+    """tests Logical Archive feature"""
+##    def setup(self):
+##        """Test setup."""
+#        builder = configuration.NestedConfigurationBuilder('tests/data/archive_test.cfg.xml')
+#        self.archiveConfigSet = builder.getConfiguration()
+#        self.config = self.archiveConfigSet.getConfigurations()[0]
+#        self.archivePreBuilder = archive.ArchivePreBuilder(self.archiveConfigSet)
+
+    def test_manifest_files(self):
+        """ A LogicalArchive can create a correct manifest. """
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 'manifest_test',
+                  'include': 'dir1/*.txt',
+                  'archive.tool': '7za'
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        builder.build_manifest(config)
+
+        expectedPaths = [os.path.normpath('dir1/file1.txt')]
+
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_includefile.txt')
+
+        with open(includeFilePath) as f:
+            content = f.readlines()
+        print content
+        print expectedPaths
+        content = [s.strip().lower() for s in content]
+        assert content == expectedPaths
+    
+    def test_empty_manifest_file(self):
+        """ A LogicalArchive can handle empty manifest. """
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 'manifest_test',
+                  'include': 'nothing',
+                  'archive.tool': '7za'
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        builder.build_manifest(config)
+
+        expectedPaths = []
+
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_includefile.txt')
+
+        with open(includeFilePath) as f:
+            content = f.readlines()
+        print content
+        print expectedPaths
+        content = [s.strip().lower() for s in content]
+        assert content == expectedPaths
+
+    def test_manifest_files_with_exclude_list(self):
+        """ A LogicalArchive can create a correct manifest. """
+        excludelst = os.path.join(root_test_dir, 'exclude.lst')
+        flh = open(excludelst, 'w+')
+        flh.write("/epoc32/tools/variant/variant.cfg\n")
+        flh.write("\\epoc32\\tools\\abld.pl\n")
+        flh.write(os.path.join(root_test_dir, 'dir1', 'file1.txt') + "\n")
+        flh.write(os.path.join(root_test_dir, 'dir1/subdir1/subdir1_file.txt') + "\n")
+        flh.close()
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 'manifest_test',
+                  'include': 'dir1/**',
+                  'exclude.lst': excludelst,
+                  'archive.tool': '7za'
+                }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        builder.build_manifest(config)
+
+        expectedPaths = [os.path.normpath('dir1/file2.doc'),
+                         os.path.normpath('dir1/file3_no_extension'),
+                         os.path.normpath('dir1/subdir2/subdir2_file_no_extension'),
+                         os.path.normpath('dir1/subdir3/'),
+                         ]
+        expectedPaths.sort()
+        
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_includefile.txt')
+
+        with open(includeFilePath) as f:
+            content = f.readlines()
+        print content
+        print expectedPaths
+        content = [s.strip().lower() for s in content]
+        content.sort()
+        assert content == expectedPaths
+
+    def test_manifest_files_with_exclude_list_abs_nodrive(self):
+        """ A LogicalArchive can create a correct manifest with external list and drive. """
+        rtd = os.path.splitdrive(os.path.abspath(root_test_dir))[1]
+        excludelst = os.path.join(root_test_dir, 'exclude.lst')
+        flh = open(excludelst, 'w+')
+        flh.write("/epoc32/tools/variant/variant.cfg\n")
+        flh.write("\\epoc32\\tools\\abld.pl\n")
+        flh.write(os.path.join(rtd, 'dir1', 'file1.txt') + "\n")
+        flh.write(os.path.join(rtd, 'dir1/subdir1/subdir1_file.txt') + "\n")
+        flh.close()
+        configDict = {'root.dir': os.path.abspath(root_test_dir),
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 'manifest_test',
+                  'include': 'dir1/**',
+                  'exclude.lst': excludelst,
+                  'archive.tool': '7za'
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        builder.build_manifest(config)
+
+        expectedPaths = [os.path.normpath('dir1/file2.doc'),
+                         os.path.normpath('dir1/file3_no_extension'),
+                         os.path.normpath('dir1/subdir2/subdir2_file_no_extension'),
+                         os.path.normpath('dir1/subdir3/'),
+                         ]
+        expectedPaths.sort()
+        
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_includefile.txt')
+
+        with open(includeFilePath) as f:
+            content = f.readlines()
+        if os.sep == '\\':
+            content = [s.strip().lower() for s in content]
+        else:
+            content = [s.strip() for s in content]
+        content.sort()
+        print content
+        print expectedPaths
+        assert content == expectedPaths
+
+    
+    def test_distribution_policy_config(self):
+        """ tests the distribution policy files configuration"""
+        expected_paths = [os.path.normpath('s60/component_public/component_public_file.txt'),
+                         os.path.normpath('s60/component_public/Distribution.Policy.S60'),
+                         os.path.normpath('s60/Distribution.Policy.S60'),
+                         os.path.normpath('s60/missing/subdir/Distribution.Policy.S60'),
+                         os.path.normpath('s60/missing/subdir/not_to_be_removed_0.txt'),
+                         os.path.normpath('s60/UPPERCASE_MISSING/subdir/Distribution.Policy.S60'),
+                         os.path.normpath('s60/UPPERCASE_MISSING/subdir/not_to_be_removed_0.txt'),]
+        if os.sep == '\\':
+            for i in range(len(expected_paths)):
+                expected_paths[i] = expected_paths[i].lower()
+        self.do_distribution_policy_config(expected_paths, policy='0')
+         
+        expected_paths = [os.path.normpath('s60/component_private/component_private_file.txt'),
+                         os.path.normpath('s60/component_private/Distribution.Policy.S60'),]
+        if os.sep == '\\':
+            for i in range(len(expected_paths)):
+                expected_paths[i] = expected_paths[i].lower()
+        self.do_distribution_policy_config(expected_paths, policy='1')
+
+        expected_paths = [os.path.normpath('s60/missing/subdir/another_subdir/to_be_removed_9999.txt'),
+                          os.path.normpath('s60/missing/to_be_removed_9999.txt'),
+                          os.path.normpath('s60/UPPERCASE_MISSING/subdir/another_subdir/to_be_removed_9999.txt'),
+                          os.path.normpath('s60/UPPERCASE_MISSING/to_be_removed_9999.txt')]
+        if os.sep == '\\':
+            for i in range(len(expected_paths)):
+                expected_paths[i] = expected_paths[i].lower()
+        self.do_distribution_policy_config(expected_paths, policy=archive.mappers.MISSING_POLICY)
+        
+    def do_distribution_policy_config(self, expected_paths, policy):
+        """ . """
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 's60_policy_test',
+                  'include': 's60/',
+                  'distribution.policy.s60': policy,
+                  'selectors': 'policy',
+                  'archive.tool': '7za'
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        builder.build_manifest(config)
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/s60_policy_test_includefile.txt')
+        
+        with open(includeFilePath) as f:
+            content = f.readlines()
+        if os.sep == '\\':
+            content = [s.strip().lower() for s in content]
+        else:
+            content = [s.strip() for s in content]
+        content.sort()
+
+        print content
+        if os.sep == '\\':
+            expected_paths = [s.strip().lower() for s in expected_paths]
+        else:
+            expected_paths = [s.strip() for s in expected_paths]
+        expected_paths.sort()
+        print expected_paths
+        assert content == expected_paths
+        
+    def test_split_manifest_file_unicode(self):
+        """ A LogicalArchive can split a manifest correctly. """
+        configDict = {'root.dir': os.path.abspath(root_test_dir),
+                  'temp.build.dir': os.path.abspath(os.path.join(root_test_dir, 'temp_build_files')),
+                  'archives.dir': os.path.abspath(root_test_dir),
+                  'name': 'manifest_test_unicode',
+                  'max.files.per.archive': '1',
+                  'include': 'test_unicode/',
+                  'archive.tool': '7za'
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        manifest_file_path = builder.build_manifest(config)        
+        builder.manifest_to_commands(config, manifest_file_path)
+        
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_unicode_includefile.txt')
+        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/manifest_test_unicode_part01.txt')
+        includeFilePath2 = os.path.join(root_test_dir, 'temp_build_files/manifest_test_unicode_part02.txt')
+        includeFilePath3 = os.path.join(root_test_dir, 'temp_build_files/manifest_test_unicode_part03.txt')
+
+        with open(includeFilePath) as f:
+            content = f.readlines()
+        with open(includeFilePath1) as f:
+            content1 = f.readlines()
+        with open(includeFilePath2) as f:
+            content2 = f.readlines()
+        with open(includeFilePath3) as f:
+            content3 = f.readlines()
+        print "content: ", content
+        print "content1: ", content1
+        print "content2: ", content2
+        print "content3: ", content2
+        content = [s.strip() for s in content]
+        assert len(content) == 3
+        assert len(content1) == 1
+        assert len(content2) == 1
+        assert len(content3) == 1
+
+    def test_distribution_policy_mapper_config(self):
+        """ Testing the policy mapper. """
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 's60_policy_mapper_test',
+                  'include': 's60/',
+                  'archive.tool': '7za',
+                  'policy.zip2zip': 'true',
+                  'mapper': 'policy',
+                  'policy.csv': os.path.join(os.environ['HELIUM_HOME'], 'tests/data/distribution.policy.id_status.csv'),
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        manifest_file_path = builder.build_manifest(config)
+        cmds = builder.manifest_to_commands(config, manifest_file_path)
+
+        
+        expected_paths = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'Distribution.Policy.S60',                           
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
+                           's60' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',]
+        if os.sep == '\\':
+            for i in range(len(expected_paths)):
+                expected_paths[i] = expected_paths[i].lower()
+        expected_paths0 = ['s60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',]
+        if os.sep == '\\':
+            for i in range(len(expected_paths0)):
+                expected_paths0[i] = expected_paths0[i].lower()
+        expected_paths1 = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60']
+        if os.sep == '\\':
+            for i in range(len(expected_paths1)):
+                expected_paths1[i] = expected_paths1[i].lower()
+        expected_paths9999 = ['s60' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
+                              's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
+                              's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                              's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt']
+        if os.sep == '\\':
+            for i in range(len(expected_paths9999)):
+                expected_paths9999[i] = expected_paths9999[i].lower()
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_includefile.txt')
+        includeFilePath0 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_0.txt')
+        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_1.txt')
+        includeFilePath9999 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_9999.txt')
+        includeFilePathInternal = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test.internal.txt')
+        
+        content = self.__read_manifest(includeFilePath)
+        expected_paths.sort()
+        print "Content"
+        print content
+        print "Expected"
+        print expected_paths
+        assert content == expected_paths
+
+        content = self.__read_manifest(includeFilePath0)
+        expected_paths0.sort()
+        print content
+        print expected_paths0
+        assert content == expected_paths0
+
+        content = self.__read_manifest(includeFilePath1)
+        expected_paths1.sort()
+        print content
+        print expected_paths1
+        assert content == expected_paths1
+        
+        content = self.__read_manifest(includeFilePath9999)
+        expected_paths9999.sort()
+        print content
+        print expected_paths9999
+        assert content == expected_paths9999
+
+        assert os.path.exists(includeFilePathInternal) == True
+        print "Commands : ", cmds
+        assert len(cmds) == 3
+
+
+    def test_distribution_policy_mapper_config_no_zip2zip(self):
+        """ Testing the policy mapper. """
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 's60_policy_mapper_test_noz2z',
+                  'include': 's60/',
+                  'archive.tool': '7za',
+                  'policy.zip2zip': 'false',
+                  'mapper': 'policy'
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        manifest_file_path = builder.build_manifest(config)
+        cmds = builder.manifest_to_commands(config, manifest_file_path)
+
+        
+        expected_paths = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'Distribution.Policy.S60',                           
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
+                           's60' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',]
+        if os.sep == '\\':
+            for i in range(len(expected_paths)):
+                expected_paths[i] = expected_paths[i].lower()
+        expected_paths0 = ['s60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',]
+        if os.sep == '\\':
+            for i in range(len(expected_paths0)):
+                expected_paths0[i] = expected_paths0[i].lower()
+        expected_paths1 = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60']
+        if os.sep == '\\':
+            for i in range(len(expected_paths1)):
+                expected_paths1[i] = expected_paths1[i].lower()
+        expected_paths9999 = ['s60' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
+                              's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
+                              's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                              's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt']
+        if os.sep == '\\':
+            for i in range(len(expected_paths9999)):
+                expected_paths9999[i] = expected_paths9999[i].lower()
+
+        expected_paths.sort()
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_includefile.txt')
+        includeFilePath0 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_0.txt')
+        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_1.txt')
+        includeFilePath9999 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_9999.txt')
+        includeFilePathInternal = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_noz2z.internal.txt')
+        
+        content = self.__read_manifest(includeFilePath)
+        expected_paths.sort()
+        print content
+        print expected_paths
+        assert content == expected_paths
+
+        content = self.__read_manifest(includeFilePath0)
+        expected_paths0.sort()
+        print content
+        print expected_paths0
+        assert content == expected_paths0
+
+        content = self.__read_manifest(includeFilePath1)
+        expected_paths1.sort()
+        print content
+        print expected_paths1
+        assert content == expected_paths1
+        
+        content = self.__read_manifest(includeFilePath9999)
+        expected_paths9999.sort()
+        print content
+        print expected_paths9999
+        assert content == expected_paths9999
+
+        assert os.path.exists(includeFilePathInternal) == False
+        print "Commands : ", cmds
+        assert len(cmds) == 1
+
+
+    def test_distribution_policy_mapper_remover_config(self):
+        """ Testing the policy remover mapper. """
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 's60_policy_mapper_test',
+                  'include': 's60/',
+                  'policy.root.dir': os.path.join(root_test_dir, 's60'),
+                  'archive.tool': '7za',
+                  'mapper': 'policy.remover',
+                  'policy.zip2zip': 'true',
+                  'policy.csv': os.path.join(os.environ['HELIUM_HOME'], 'tests/data/distribution.policy.id_status.csv'),
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        manifest_file_path = builder.build_manifest(config)
+        cmds = builder.manifest_to_commands(config, manifest_file_path)
+        
+        expected_paths = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',                           
+                           's60' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',                           
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',                           
+                           's60' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',]
+        if os.sep == '\\':
+            for i in range(len(expected_paths)):
+                expected_paths[i] = expected_paths[i].lower()
+        expected_paths.sort()
+        expected_paths0 = ['s60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',                           
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt']
+        if os.sep == '\\':
+            for i in range(len(expected_paths0)):
+                expected_paths0[i] = expected_paths0[i].lower()
+        expected_paths1 = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60']
+        if os.sep == '\\':
+            for i in range(len(expected_paths1)):
+                expected_paths1[i] = expected_paths1[i].lower()
+        expected_paths1.sort()
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_includefile.txt')
+        includeFilePath0 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_0.txt')
+        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_1.txt')
+        
+        content = self.__read_manifest(includeFilePath)
+        expected_paths.sort()
+        print content
+        print expected_paths
+        assert content == expected_paths
+
+        content = self.__read_manifest(includeFilePath0)
+        expected_paths0.sort()
+        print content
+        print expected_paths0
+        assert content == expected_paths0
+
+        content = self.__read_manifest(includeFilePath1)
+        expected_paths1.sort()
+        print content
+        print expected_paths1
+        assert content == expected_paths1
+
+        print cmds        
+        assert len(cmds[3]) == 7
+
+
+    def test_distribution_policy_mapper_sf_remover_config(self):
+        """ Testing the policy SFL remover mapper. """
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 'sf_policy_sf_mapper_test',
+                  'include': 'sf/',
+                  'policy.root.dir': os.path.join(root_test_dir, 'sf'),
+                  'archive.tool': '7za',
+                  'mapper': 'sfl.policy.remover',
+                  'policy.zip2zip': 'false',
+                  'policy.csv': os.path.join(os.environ['HELIUM_HOME'], 'tests/data/distribution.policy.extended_for_sf.id_status.csv'),
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        manifest_file_path = builder.build_manifest(config)
+        cmds = builder.manifest_to_commands(config, manifest_file_path)
+        
+        expected_paths = ['sf' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           'sf' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           'sf' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',                           
+                           'sf' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'subdir_nofiles' + os.sep + 'subdir_nofiles2',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'subdir_nopolicy' + os.sep + 'component_private_file.txt',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'component_sfl' + os.sep + 'component_sfl_file.txt',
+                           'sf' + os.sep + 'component_sfl' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'component_epl' + os.sep + 'component_epl_file.txt',
+                           'sf' + os.sep + 'component_epl' + os.sep + 'Distribution.Policy.S60',]
+        if os.sep == '\\':
+            for i in range(len(expected_paths)):
+                expected_paths[i] = expected_paths[i].lower()
+        expected_paths0 = ['sf' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           'sf' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt']
+        if os.sep == '\\':
+            for i in range(len(expected_paths0)):
+                expected_paths0[i] = expected_paths0[i].lower()
+        expected_paths1 = ['sf' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           'sf' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60']
+        if os.sep == '\\':
+            for i in range(len(expected_paths1)):
+                expected_paths1[i] = expected_paths1[i].lower()
+        expected_paths3 = ['sf' + os.sep + 'component_sfl' + os.sep + 'component_sfl_file.txt',
+                           'sf' + os.sep + 'component_sfl' + os.sep + 'Distribution.Policy.S60',]
+        if os.sep == '\\':
+            for i in range(len(expected_paths3)):
+                expected_paths3[i] = expected_paths3[i].lower()
+        expected_paths7 = ['sf' + os.sep + 'component_epl' + os.sep + 'component_epl_file.txt',
+                           'sf' + os.sep + 'component_epl' + os.sep + 'Distribution.Policy.S60',]
+        if os.sep == '\\':
+            for i in range(len(expected_paths7)):
+                expected_paths7[i] = expected_paths7[i].lower()
+        expected_paths9 = ['sf' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'subdir_nofiles' + os.sep + 'subdir_nofiles2',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'subdir_nopolicy' + os.sep + 'component_private_file.txt',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',]
+        if os.sep == '\\':
+            for i in range(len(expected_paths9)):
+                expected_paths9[i] = expected_paths9[i].lower()
+ 
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_includefile.txt')
+        includeFilePath0 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_0.txt')
+        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_1.txt')
+        includeFilePath3 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_3.txt')
+        includeFilePath7 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_7.txt')
+        includeFilePath9 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_9999.txt')
+        
+        
+        content = self.__read_manifest(includeFilePath)
+        expected_paths.sort()
+        print content
+        print expected_paths
+        assert content == expected_paths
+
+        content = self.__read_manifest(includeFilePath0)
+        expected_paths0.sort()
+        print content
+        print expected_paths0
+        assert content == expected_paths0
+
+        content = self.__read_manifest(includeFilePath1)
+        expected_paths1.sort()
+        print content
+        print expected_paths1
+        assert content == expected_paths1
+
+        content = self.__read_manifest(includeFilePath3)
+        expected_paths3.sort()
+        print content
+        print expected_paths3
+        assert content == expected_paths3
+
+        content = self.__read_manifest(includeFilePath7)
+        expected_paths7.sort()
+        print content
+        print expected_paths7
+        assert content == expected_paths7
+
+        content = self.__read_manifest(includeFilePath9)
+        expected_paths9.sort()
+        print content
+        print expected_paths9
+        assert content == expected_paths9
+        
+        # checking the number of command generated
+        assert len(cmds) == 2, "Must only have 2 steps in the archiving (archiving, removing)."
+        assert len(cmds[0]) == 5, "Must only have 5 output files."
+        print len(cmds[1])
+        for cmd in cmds[1]:
+            print cmd
+        assert len(cmds[1]) == len(expected_paths)-len(expected_paths3), "Remore must be equal to len(expected_paths) - len(expected_paths3)"
+
+    def test_distribution_policy_mapper_epl_remover_config(self):
+        """ Testing the policy EPL remover mapper. """
+        configDict = {'root.dir': root_test_dir,
+                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                  'archives.dir': root_test_dir,
+                  'name': 'sf_policy_epl_mapper_test',
+                  'include': 'sf/',
+                  'policy.root.dir': os.path.join(root_test_dir, 'sf'),
+                  'archive.tool': '7za',
+                  'mapper': 'epl.policy.remover',
+                  'policy.zip2zip': 'false',
+                  'policy.csv': os.path.join(os.environ['HELIUM_HOME'], 'tests/data/distribution.policy.extended_for_sf.id_status.csv'),
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        manifest_file_path = builder.build_manifest(config)
+        cmds = builder.manifest_to_commands(config, manifest_file_path)
+        
+        expected_paths = ['sf' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           'sf' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           'sf' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'subdir_nofiles' + os.sep + 'subdir_nofiles2',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'subdir_nopolicy' + os.sep + 'component_private_file.txt',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'component_sfl' + os.sep + 'component_sfl_file.txt',
+                           'sf' + os.sep + 'component_sfl' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'component_epl' + os.sep + 'component_epl_file.txt',
+                           'sf' + os.sep + 'component_epl' + os.sep + 'Distribution.Policy.S60',]
+        if os.sep == '\\':
+            for i in range(len(expected_paths)):
+                expected_paths[i] = expected_paths[i].lower()
+        expected_paths0 = ['sf' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
+                           'sf' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',]
+        if os.sep == '\\':
+            for i in range(len(expected_paths0)):
+                expected_paths0[i] = expected_paths0[i].lower()
+        expected_paths1 = ['sf' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
+                           'sf' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',]
+        if os.sep == '\\':
+            for i in range(len(expected_paths1)):
+                expected_paths1[i] = expected_paths1[i].lower()
+        expected_paths3 = ['sf' + os.sep + 'component_sfl' + os.sep + 'component_sfl_file.txt',
+                           'sf' + os.sep + 'component_sfl' + os.sep + 'Distribution.Policy.S60',]
+        if os.sep == '\\':
+            for i in range(len(expected_paths3)):
+                expected_paths3[i] = expected_paths3[i].lower()
+        expected_paths7 = ['sf' + os.sep + 'component_epl' + os.sep + 'component_epl_file.txt',
+                           'sf' + os.sep + 'component_epl' + os.sep + 'Distribution.Policy.S60',]
+        if os.sep == '\\':
+            for i in range(len(expected_paths7)):
+                expected_paths7[i] = expected_paths7[i].lower()
+        expected_paths9 = ['sf' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'subdir_nofiles' + os.sep + 'subdir_nofiles2',
+                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'subdir_nopolicy' + os.sep + 'component_private_file.txt',
+                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
+                           'sf' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',]
+        if os.sep == '\\':
+            for i in range(len(expected_paths9)):
+                expected_paths9[i] = expected_paths9[i].lower()
+
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_includefile.txt')
+        includeFilePath0 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_0.txt')
+        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_1.txt')
+        includeFilePath3 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_3.txt')
+        includeFilePath7 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_7.txt')
+        includeFilePath9 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_9999.txt')
+        
+        
+        content = self.__read_manifest(includeFilePath)
+        expected_paths.sort()
+        print content
+        print expected_paths
+        assert content == expected_paths
+
+        content = self.__read_manifest(includeFilePath0)
+        expected_paths0.sort()
+        print content
+        print expected_paths0
+        assert content == expected_paths0
+
+        content = self.__read_manifest(includeFilePath1)
+        expected_paths1.sort()
+        print content
+        print expected_paths1
+        assert content == expected_paths1
+
+        content = self.__read_manifest(includeFilePath3)
+        expected_paths3.sort()
+        print content
+        print expected_paths3
+        assert content == expected_paths3
+
+        content = self.__read_manifest(includeFilePath7)
+        expected_paths7.sort()
+        print content
+        print expected_paths7
+        assert content == expected_paths7
+
+        content = self.__read_manifest(includeFilePath9)
+        expected_paths9.sort()
+        print content
+        print expected_paths9
+        assert content == expected_paths9
+        
+        # checking the number of command generated
+        assert len(cmds) == 2, "Must only have 2 steps in the archiving (archiving, removing)."
+        assert len(cmds[0]) == 5, "Must only have 5 output files."
+        assert len(cmds[1]) == len(expected_paths)-len(expected_paths3), "Remore must be equal to len(expected_paths) - len(expected_paths3)"
+
+
+
+
+    def __read_manifest(self, manifest):
+        """ read the file and sort"""
+        with open(manifest) as f:
+            content = f.readlines()
+        if os.sep == '\\':
+            content = [s.strip().lower() for s in content]
+        else:
+            content = [s.strip() for s in content]
+        content.sort()
+        return content
+        
+
+    def test_split_manifest_file(self):
+        """ A LogicalArchive can split a manifest correctly. """
+        configDict = {'root.dir': os.path.abspath(root_test_dir),
+                  'temp.build.dir': os.path.abspath(os.path.join(root_test_dir, 'temp_build_files')),
+                  'archives.dir': os.path.abspath(root_test_dir),
+                  'name': 'manifest_test',
+                  'max.files.per.archive': '1',
+                  'include': 'dir/',
+                  'exclude': 'dir/emptysubdir3',
+                  'archive.tool': '7za'
+                 }
+        config = configuration.Configuration(configDict)
+
+        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+        manifest_file_path = builder.build_manifest(config)
+        builder.manifest_to_commands(config, manifest_file_path)
+
+        expectedPaths = ['dir' + os.sep + 'emptysubdir1','dir' + os.sep + 'emptysubdir2']
+        expectedPaths1 = ['dir' + os.sep + 'emptysubdir1\n']
+        expectedPaths2 = ['dir' + os.sep + 'emptysubdir2\n']
+        
+        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_includefile.txt')
+        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/manifest_test_part01.txt')
+        includeFilePath2 = os.path.join(root_test_dir, 'temp_build_files/manifest_test_part02.txt')
+
+        with open(includeFilePath) as f:
+            content = f.readlines()
+        with open(includeFilePath1) as f:
+            content1 = f.readlines()
+        with open(includeFilePath2) as f:
+            content2 = f.readlines()
+        print "content: ", content
+        print "content1: ", content1
+        print "content2: ", content2
+        print "expectedPaths: ", expectedPaths
+        print "expectedPaths1: ", expectedPaths1
+        print "expectedPaths2: ", expectedPaths2
+        content = [s.strip().lower() for s in content]
+        assert content == expectedPaths
+        assert content1 == expectedPaths1
+        assert content2 == expectedPaths2
+
+class CheckRootDirValueTest(unittest.TestCase):
+    """test root drive value"""
+    def test_checkRootDirValue(self):
+        """ Testing the root drive value. """
+        configDict = {'root.dir': root_test_dir,
+                'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                'archives.dir': root_test_dir,
+                'name': 'regular_path_test',
+                'include': 'dir1/*.txt',
+                'archive.tool': '7za'
+               }
+        configDictUnc = {'root.dir': "\\\\server\\share\\dir",
+                'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
+                'archives.dir': root_test_dir,
+                'name': 'unc_test',
+                'include': 'dir1/*.txt',
+                'archive.tool': '7za'
+               }
+        config = configuration.Configuration(configDict)
+        configUnc = configuration.Configuration(configDictUnc)
+        builder = MockedArchivePreBuilder(configuration.ConfigurationSet([config, configUnc]), "config", writerType='make', index=0)
+        builder.rewriteXMLFile(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/zip_checkDrive_test.cfg.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/zip_checkDrive_test.cfg.xml.parsed'))
+        (build_drive, _) = os.path.splitdrive(os.path.normpath(os.environ['TEMP']))
+        rootList = builder.checkRootDirValue(MockedConfigBuilder(), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/zip_checkDrive_test.cfg.xml.parsed'), build_drive, 'wvdo_sources')
+        assert rootList is not None
+        if os.sep == '\\':
+            roots = builder.getCommonUncRoots(['\\\\server\\share\\dir', 
+                                               '\\\\server\\share', 
+                                               '\\\\server\\share1\\dir',
+                                               '\\\\server2\\share\\somedir'])
+            assert len(roots) == 3
+            assert '\\\\server\\share\\' in roots
+            assert '\\\\server\\share1\\' in roots
+            assert '\\\\server2\\share\\' in roots
+
+class MockedConfigBuilder:
+    """."""
+            
+    def writeToXML(self, xml_file, configs, parse_xml_file):
+        """writeToXML"""
+        pass
+    
+
+class MockedArchivePreBuilder(archive.ArchivePreBuilder):
+    """ ."""
+    def substUncPath(self, _):
+        """ subst the unc path"""
+        if os.sep != '\\':
+            return None
+        return fileutils.get_next_free_drive()
+          
+    def unSubStituteDrives(self, drive):
+        """ unsubstitute the drive"""
+        pass
+    
+    def rewriteXMLFile(self, xml_file, parse_xml_file):
+        """re-write XML file"""
+        doc = xml.dom.minidom.parse(xml_file)
+        out = open(parse_xml_file, 'w')
+        doc.writexml(out, indent='')
+        out.close()
+            
+  
+class ZipArchiverTest(unittest.TestCase):
+
+    def test_extension(self):
+        t = archive.tools.SevenZipArchiver()
+        assert t.extension() == ".zip"
+    
+
+#class ZipArchiverTest(unittest.TestCase):
+#    def setUp(self):
+#        archiveConfig = amara.parse(open('tests/data/zip_archive_test.cfg.xml'))
+#        self.archivePreBuilder = archive.ArchivePreBuilder(archiveConfig)
+#
+#    def testZipArchiverCommand(self):
+#        """Zip archiver creates correct command."""
+#        archiver = archive.ZipArchiver(self.archivePreBuilder)
+#        archiver._start_archive('foo')
+#        archiver.end_archive()
+#        commands = archiver.commandList.allCommands()
+#        assert len(commands) == 1
+#        command = commands[0]
+#        assert command.executable() == 'zip.exe'
+#        assert command.cmd() == '-R . c:\\temp\\foo.zip'
+#
+#    def testZipArchiverOperation(self):
+#        """Zip archiver runs zip operation correctly."""
+#        buildFilePath = self.archivePreBuilder.createArchiveBuildFile('zip_exec.ant.xml')
+#        result = run(r'ant -f c:\temp\output\temp_build_files\zip_exec.ant.xml all -Dnumber.of.threads=1')
+#        print result
+
+def run( command ):
+    """ run the code"""
+    #print "Run command: " + command
+    ( _, stdout ) = os.popen4( command )
+    result = stdout.read()
+    return result
+
+
+if __name__ == "__main__":
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_ats3.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1657 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================ 
+#Name        : test_ats3.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Testing ATS3 framework. """
+# pylint: disable-msg=E1101,C0302,w0142,w0603,R0912,F0401,R0902,R0903,R0201,W0404
+#w0142 => * and ** were used
+#w0603 => global variables used TSRC_PATH etc
+#R*    => will be fixed while refactoring
+#F0401 => pylint didn't find "path" module
+#E1101 => Mocker shows mockery
+
+
+from cStringIO import StringIO
+from pprint import pprint
+from xml.etree.ElementTree import fromstring, tostring
+from xml.etree import ElementTree as et
+import difflib
+import logging
+logging.getLogger().setLevel(logging.ERROR)
+import tempfile
+import zipfile
+import os
+import re
+import subprocess
+
+from path import path
+import amara
+import mocker
+
+from ntpath import sep as atssep
+from ntpath import sep as sossep
+
+
+import ats3
+import ats3.testconfigurator as atc
+import ats3.dropgenerator as adg
+import ats3.parsers as parser
+
+
+TEST_PATH = None
+TEST_FILES = {}
+TSRC = None
+OUTPUT = None
+
+# Shortcuts
+E = et.Element
+SE = et.SubElement
+
+class Bunch(object):
+    """ Configuration object. Argument from constructor are converted into class attributes. """
+    def __init__(self, **kwargs):
+        self.__dict__.update(kwargs)
+        
+def equal_xml(xml1, xml2):
+    """Check the equality of the given XML snippets.
+    
+    Tag name equality:
+    
+    >>> equal_xml('<a/>', '<a/>')
+    True
+    >>> equal_xml('<a/>', '<b/>')
+    False
+    
+    Attribute equality:
+    
+    >>> equal_xml('<a k="v"/>', '<a k="v"/>')
+    True
+    >>> equal_xml('<a k="v"/>', '<a k="w"/>')
+    False
+    
+    Text content equality:
+    
+    >>> equal_xml('<a>v</a>', '<a>v</a>')
+    True
+    >>> equal_xml('<a>v</a>', '<a>w</a>')
+    False
+    >>> equal_xml('<a>v</a>', '<a></a>')
+    False
+    
+    Text content equality when whitespace differs:
+    >>> equal_xml('<a>v</a>', '<a>v </a>')
+    True
+
+    Equality of child elements:
+    
+    >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="v"/></b></a>')
+    True
+    >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="w"/></b></a>')
+    False
+    >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>w</b></a>')
+    False
+    >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>v </b></a>')
+    True
+    
+    """
+    def __init__():
+        check_instance(xml1, xml2)
+    
+    def check_instance(xml1, xml2):
+        """if xml1 and xml2 are instances, converts to strings"""
+        if isinstance(xml1, basestring):
+            xml1 = fromstring(xml1)
+        if isinstance(xml2, basestring):
+            xml2 = fromstring(xml2)
+        check_tags(xml1, xml2)
+
+    def check_tags(xml1, xml2):
+        """check xml tags and text equality"""
+        if xml1.tag != xml2.tag:
+            return False
+        if xml1.attrib != xml2.attrib:
+            return False
+        if xml1.text:
+            if not xml2.text:
+                return False
+        if xml2.text:
+            if not xml1.text:
+                return False
+
+        produce_xml_children(xml1, xml2)
+
+    def produce_xml_children(xml1, xml2):
+        """checks if xml children are of same length and are equal?"""
+        if xml1.text and xml2.text and xml1.text.strip() != xml2.text.strip():
+            return False
+        if xml1.tail is not None and xml2.tail is not None:
+            if xml1.tail.strip() != xml2.tail.strip():
+                return False
+        elif xml1.tail != xml2.tail:
+            return False
+        
+        children1 = list(xml1.getchildren())
+        children2 = list(xml2.getchildren())
+        if len(children1) != len(children2):
+            return False
+        for child1, child2 in zip(children1, children2):
+            return equal_xml(child1, child2)
+    return True        
+
+
+def setup_module():
+    """ Setup test environment. """
+    global TEST_PATH, TSRC, OUTPUT
+    TEST_PATH = path(tempfile.mkdtemp())
+    OUTPUT = TEST_PATH.joinpath(r"output")
+    component = TEST_PATH
+    component.joinpath("group").makedirs()
+    for path_parts in (("tsrc", "group", "bld.inf"),
+                       ("tsrc", "group", "test.pkg"),
+                       ("tsrc", "testmodules", "file1.dll"),
+                       ("tsrc", "testmodules", "file2.dll"),
+                       ("tsrc", "data", "file1"),
+                       ("tsrc", "data", "file2"),
+                       ("tsrc", "data", "file3"),
+                       ("tsrc", "data", "mmc", "file4"),
+                       ("tsrc", "data", "c", "file5"),
+                       ("tsrc", "conf", "file1.cfg"),
+                       ("tsrc", "conf", "file2.cfg"),
+                       ("tsrc", "init", "TestFramework.ini"),
+                       ("tsrc", "custom", "prepostaction.xml"),
+                       ("tsrc", "custom", "postpostaction.xml"),
+                       # These do not have to be under 'tsrc':
+                       ("tsrc", "output", "images", "file1.fpsx"),
+                       ("tsrc", "output", "images", "file2.fpsx"),
+                       ("tsrc", "sis", "file1.sisx"),
+                       ("tsrc", "sis", "file2.sisx"),
+                       ("tsrc", "sis", "file3.sisx"),
+                       ("tsrc", "trace_init", "trace_activation_1.xml")):
+        filepath = component.joinpath(*path_parts)
+        if not filepath.parent.exists():
+            filepath.parent.makedirs()
+        filepath.touch()
+        TEST_FILES.setdefault(path_parts[1], []).append(filepath)
+    TSRC = component.joinpath("tsrc")
+    filepath = OUTPUT.joinpath("pmd", "pmd_file.pmd")
+    if not filepath.parent.exists():
+        filepath.parent.makedirs()
+    filepath.touch()
+    TEST_FILES.setdefault("pmd_file", []).append(filepath)
+    tracing = component.joinpath("tsrc", "trace_init")
+    root = E('ConfigurationFile')
+    confs = E("Configurations")
+    trace_act = SE(confs, "TraceActivation")
+    conf = SE(trace_act, "Configuration")
+    conf.set('Name', 'MCU')
+    mcu = SE(conf, "MCU")
+    sett = SE(mcu, "settings")
+    SE(sett, "timestamp")
+    root.append(confs)
+    ettree = et.ElementTree(root)
+    doc = amara.parse(et.tostring(ettree.getroot()))
+    handle = open(tracing.joinpath("trace_activation_1.xml"), "w")
+    handle.write(doc.xml(indent="yes"))
+    handle.close()
+#    tracing.writestr("trace_activation_1.xml", doc.xml(indent=u"yes"))
+    group = component.joinpath("tsrc", "group")
+    group.joinpath("bld.inf").write_text(
+        r"""
+        PRJ_TESTMMPFILES
+        stif.mmp /* xyz.mmp */ abcd.mmp
+        /*xyz.mmp*/
+        eunit.mmp /* xyz.mmp */
+        both.mmp
+        ..\sub-component\group\sub-component.mmp
+        """.replace('\\', os.sep))
+
+    group.joinpath("test.pkg").write_text(
+        r"""
+        ;Language - standard language definitions
+        &EN
+        
+        ; standard SIS file header
+        #{"BTEngTestApp"},(0x04DA27D5),1,0,0
+        
+        ;Supports Series 60 v 3.0
+        (0x101F7961), 0, 0, 0, {"Series60ProductID"}
+        
+        ;Localized Vendor Name
+        %{"BTEngTestApp"}
+        
+        ;Unique Vendor name
+        :"Nokia"
+        
+        ; Files to copy
+        "\tsrc\testmodules\file1.dll"-"c:\sys\bin\file1.dll"
+        "\tsrc\testmodules\file2.dll"-"c:\sys\bin\file2.dll"
+        "\tsrc\data\file1"-"e:\sys\bin\file1"
+        "\tsrc\data\file2"-"e:\sys\bin\file2"
+        "\tsrc\data\file3"-"e:\sys\bin\file3"
+        "\tsrc\conf\file1.cfg"-"!:\sys\bin\file1.cfg"
+        "\tsrc\conf\file2.cfg"-"!:\sys\bin\file2.cfg"
+        "\tsrc\init\TestFramework.ini"-"!:\sys\bin\TestFramework.ini"
+        "\tsrc\sis\file1.sisx"-"!:\sys\bin\file1.sisx"
+        "\tsrc\sis\file2.sisx"-"!:\sys\bin\file2.sisx"
+        """.replace('\\', os.sep))
+    group.joinpath("stif.mmp").write_text("LIBRARY stiftestinterface.lib")
+    group.joinpath("eunit.mmp").write_text("LIBRARY eunit.lib")
+    group.joinpath("both.mmp").write_text("LIBRARY stiftestinterface.lib eunit.lib")
+    init = component.joinpath("tsrc", "init")
+    
+    init.joinpath("TestFramework.ini").write_text(
+        r"""
+#     - Sets a device reset module's dll name(Reboot).
+#        + If Nokia specific reset module is not available or it is not correct one
+#          StifHWResetStub module may use as a template for user specific reset
+#          module. 
+
+[Engine_Defaults]
+
+TestReportMode= FullReport        # Possible values are: 'Empty', 'Summary', 'Environment',
+                                                               'TestCases' or 'FullReport'
+
+CreateTestReport= YES            # Possible values: YES or NO
+
+TestReportFilePath= C:\LOGS\TestFramework\
+TestReportFileName= TestReport
+
+TestReportFormat= TXT            # Possible values: TXT or HTML
+        
+        """)
+
+
+def teardown_module():
+    """ Cleanup environment after testing. """    
+    def __init__():
+        path(TEST_PATH).rmtree()
+
+# CTC related functions    
+def check_ctc_write(steps):
+    """Checks if CTC data is written on the CTC log"""
+    step = steps.next()
+    assert step.get("name") == "Save CTC data"
+    assert step.findtext("./command") == "execute"
+    params = step.findall("./params/param")
+    assert params[0].get("parameters") == "writelocal"
+    assert params[1].get("file") == path(r"z:\sys\bin\ctcman.exe")
+    step = steps.next()
+    assert step.get("name") == "Save CTC data"
+    assert step.findtext("./command") == "execute"
+    params = step.findall("./params/param")
+    assert params[0].get("parameters") == "writefile"
+    assert params[1].get("file") == path(r"z:\sys\bin\ctcman.exe")
+
+def check_ctc_log(steps, testtype=""):
+    """Fetches CTC Log"""
+    #For the ctcdata.txt to be published on the ATS network drive
+    step = steps.next()
+    assert step.get("name") == "Fetch CTC data for post commands execution" #"Fetch and clean CTC data"
+    assert step.findtext("./command") == "fetch-log"
+    params = step.findall("./params/param")
+    assert params[0].get("delete") == "false"
+    if testtype == "withpkgfiles":
+        assert params[1].get("local-path") == r"\\10.0.0.1\ctc_helium\builds\drop0\set1\ctcdata"
+    else:
+        assert params[1].get("local-path") == r"\\10.0.0.1\ctc_helium\builds\drop0\set0\ctcdata"
+    assert params[2].get("path") == path(r"c:" + os.sep + "data" + os.sep + "ctc" + os.sep + "ctcdata.txt")
+    
+    #For the ctcdata.txt to be published on the build network drive
+    step = steps.next()
+    assert step.get("name") == "Fetch and clean CTC data" #"Fetch and clean CTC data"
+    assert step.findtext("./command") == "fetch-log"
+    params = step.findall("./params/param")
+    assert params[0].get("delete") == "true"
+    assert params[1].get("path") == path(r"c:" + os.sep + "data" + os.sep + "ctc" + os.sep + "ctcdata.txt")
+
+def check_ctc_start(steps):
+    """Checks if CTC starts in ATS"""
+    step = steps.next()
+    assert step.get("name") == "Create CTC log dir"
+    assert step.findtext("./command") == "makedir"
+    params = step.findall("./params/param")
+    assert params[0].get("dir") == path(r"c:" + os.sep + "data" + os.sep + "ctc")
+    step = steps.next()
+    assert step.get("name") == "CTC start"
+    assert step.findtext("./command") == "execute"
+    params = step.findall("./params/param")
+    assert params[0].get("file") == path(r"z:\sys\bin\ctcman.exe")   
+
+def check_fetch_logs(steps):
+    """Checks fetching log directory is created"""
+    step = steps.next()
+    if "Fetch test" in step.get("name"):
+        assert step.get("name") == "Fetch test module logs"
+        assert step.findtext("./command") == "fetch-log"
+        params = step.findall("./params/param")
+        assert params[0].get("type") == "text"
+        assert params[1].get("delete") == "true"
+        if step.get("harness") == "STIF":
+            assert params[2].get("path") == path(r"c:" + os.sep + "logs" + os.sep + "testframework" + os.sep + "*")
+        elif step.get("harness") == "EUNIT":
+            assert params[2].get("path") == path(r"c:" + os.sep + "Shared" + os.sep + "EUnit" + os.sep + "logs" + os.sep + "*")
+    else:
+        step = steps.next()
+        assert step.get("name") == "Fetch test module logs"
+        assert step.findtext("./command") == "fetch-log"
+        params = step.findall("./params/param")
+        assert params[0].get("type") == "text"
+        assert params[1].get("delete") == "true"
+        assert params[2].get("path") == path(r"c:" + os.sep + "logs" + os.sep + "testframework" + os.sep + "*")  
+
+def check_diamonds_action(action):
+    """ Testing Diamonds action. """
+    assert action.findtext("./type") == "DiamondsAction"
+    assert not action.findall("./params/param") 
+
+def check_send_email_action(action, reportemail):
+    """verifies if sening email option works"""
+    assert action.findtext("./type") == "SendEmailAction"
+    params = action.findall("./params/param")
+    assert params[0].get("name") == "subject"
+    assert params[0].get("value") == "email subject"
+    assert params[1].get("name") == "type"
+    assert params[1].get("value") == "ATS3_REPORT"
+    assert params[2].get("name") == "send-files"
+    assert params[2].get("value") == "true"
+    assert params[3].get("name") == "to"
+    assert params[3].get("value") == reportemail
+    
+def check_ctc_run_process_action(action):
+    """verifies if CTC run process action works"""
+    #The parameters for this test are intended to execute on a windows machine
+    assert action.findtext("./type") == "RunProcessAction"
+    params = action.findall("./params/param")
+    assert params[0].get("name") == "file"
+    assert params[0].get("value") == "catsctc2html/catsctc2html.exe"
+    assert params[1].get("name") == "parameters"
+    assert params[1].get("value") == r"--ctcdata_files=\\10.0.0.1\ctc_helium\1234\drop0\set0\ctcdata --monsym_files=\\10.0.0.1\ctc_helium\1234\mon_syms\1\MON.sym --diamonds_build_id=1234 --drop_id=0 --total_amount_of_drops=1"
+
+def check_ats_report_action(action, filestore):
+    """verifies if sening ATS report option works"""
+    assert action.findtext("./type") == "FileStoreAction"
+    params = action.findall("./params/param")
+    assert params[0].get("name") == "to-folder"
+    assert params[0].get("value") == filestore
+    assert params[1].get("name") == "report-type"
+    assert params[1].get("value") == "ATS_REPORT"
+    assert params[2].get("name") == "date-format"
+    assert params[2].get("value") == "yyyyMMdd"
+    assert params[3].get("name") == "time-format"
+    assert params[3].get("value") == "HHmmss"
+
+def check_stif_report_action(action, filestore):
+    """verifies if sening STIF report option works"""
+    assert action.findtext("./type") == "FileStoreAction"
+    params = action.findall("./params/param")
+    assert params[0].get("name") == "to-folder"
+    assert params[0].get("value") == filestore
+    assert params[1].get("name") == "report-type"
+    assert params[1].get("value") == "STIF_COMPONENT_REPORT_ALL_CASES"
+    assert params[2].get("name") == "run-log"
+    assert params[2].get("value") == "true"
+    assert params[3].get("name") == "date-format"
+    assert params[3].get("value") == "yyyyMMdd"
+    assert params[4].get("name") == "time-format"
+    assert params[4].get("value") == "HHmmss"
+
+def check_log_dir(steps):
+    """ Test the log dir. """
+    step = steps.next()
+    if step.get("harness") is "STIF":
+        assert step.get("name") == "Create STIF log dir"
+    elif step.get("harness") is "EUNIT":
+        assert step.get("name") == "Create EUNIT log dir"
+    assert step.findtext("./command") == "makedir"
+
+def check_trace_start(steps, filestore):
+    """Checks if tracing is started on the ATS"""
+    step = steps.next()
+    assert step.get("name") == "Start tracing"
+    assert step.findtext("./command") == "trace-start"
+    params = step.findall("./params/param")
+    assert params[0].get("ta") == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "trace_activation" + os.sep + "trace_activation_1.xml")
+    assert params[1].get("tgrp") == "MCU"
+    assert params[2].get("pmd") == path(r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd")
+    assert params[3].get("log") == filestore.joinpath("traces", "set0", "tracelog.blx")
+    assert params[4].get("timeout") == "60"
+    assert params[5].get("date-format") == "yyyyMMdd"
+    assert params[6].get("time-format") == "HHmmss"
+    
+def check_trace_end_steps(steps, filestore):
+    """ Test trace end step. """
+    step = steps.next()
+    assert step.get("name") == "Stop tracing"
+    assert step.findtext("./command") == "trace-stop"
+    params = step.findall("./params/param")
+    assert params[0].get("timeout") == "60"
+    step = steps.next()
+    assert step.get("name") == "Convert tracing"
+    assert step.findtext("./command") == "trace-convert"
+    params = step.findall("./params/param")
+    assert params[0].get("pmd") == path(r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd")
+    assert params[1].get("log") == filestore.joinpath("traces", "set0", "tracelog.blx")
+    assert params[2].get("timeout") == "60"
+    assert params[3].get("date-format") == "yyyyMMdd"
+    assert params[4].get("time-format") == "HHmmss"
+
+class TestTestPlan(mocker.MockerTestCase):
+    """Creates TestPlan mocker setup"""
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)  
+          
+    def setUp(self):
+        """ Setup TestTestPlan testsuite. """
+        opts = Bunch(testrun_name="testrun", harness="STIF", 
+                     device_type="product", plan_name="ats3_test_plan",
+                     diamonds_build_url="", report_email="", file_store=path(), test_timeout="60",
+                     device_hwid="5425", trace_enabled="True", ctc_enabled="True", eunitexerunner_flags="/E S60AppEnv /R Off", 
+                     multiset_enabled=False, ctc_run_process_params=r"10.0.0.1#drop0.zip#1", monsym_files="")
+        self.atp = ats3.Ats3TestPlan(opts)
+        self.config_files = TEST_FILES["conf"]
+        self.data_files = TEST_FILES["data"]
+        self.engine_ini_file = TEST_FILES["init"][0]
+        self.image_files = TEST_FILES["output"]
+        self.sis_files = TEST_FILES["sis"]
+        self.testmodule_files = TEST_FILES["testmodules"]
+        self.ctc_enabled = self.atp["ctc_enabled"]
+        self.custom_dir = "CustomD"
+        self.eunitexerunner_flags = self.atp["eunitexerunner_flags"]
+        if self.atp["trace_enabled"].lower() == "true":
+            self.trace_activation_files = TEST_FILES["trace_init"]    
+            self.pmd_files = TEST_FILES["pmd_file"]
+        else:
+            self.trace_activation_files = []    
+            self.pmd_files = []
+        self.test_timeout = self.atp["test_timeout"]
+        self.eunitexerunner_flags = self.atp["eunitexerunner_flags"]
+        self.device_hwid = self.atp["device_hwid"]
+        self.test_harness = self.atp["harness"]
+        self.src_dst = [("" + os.sep + "tsrc" + os.sep + "testmodules" + os.sep + "file1.dll", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll", "testmodule"),
+            ("" + os.sep + "tsrc" + os.sep + "testmodules" + os.sep + "file2.dll", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll", "testmodule"),
+            ("" + os.sep + "tsrc" + os.sep + "data" + os.sep + "file1", "e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1", "data"),
+            ("" + os.sep + "tsrc" + os.sep + "data" + os.sep + "file2", "e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2", "data"),
+            ("" + os.sep + "tsrc" + os.sep + "data" + os.sep + "file3", "e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3", "data"),
+            ("" + os.sep + "tsrc" + os.sep + "conf" + os.sep + "file1.cfg", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg", "conf"),
+            ("" + os.sep + "tsrc" + os.sep + "conf" + os.sep + "file2.cfg", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg", "conf"),
+            ("" + os.sep + "tsrc" + os.sep + "init" + os.sep + "TestFramework.ini", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini", "engine_ini"),
+            ("" + os.sep + "tsrc" + os.sep + "sis" + os.sep + "file1.sisx", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.sisx", ""),
+            ("" + os.sep + "tsrc" + os.sep + "sis" + os.sep + "file2.sisx", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.sisx", ""),]
+        self.component_path = str(TEST_PATH.joinpath("tsrc", "group"))
+
+    def test_creation(self):
+        """ Testing creation. """        
+        assert self.atp["testrun_name"] == "testrun"
+        assert self.atp["harness"] == "STIF"
+        assert self.atp["device_type"] == "product"
+    
+    def test_insert_set(self):
+        """ Inserting a set of file. """        
+        self.atp.insert_set(data_files=self.data_files,
+                           config_files=self.config_files,
+                           engine_ini_file=self.engine_ini_file,
+                           image_files=self.image_files,
+                           testmodule_files=self.testmodule_files,
+                           test_timeout=self.test_timeout,
+                           eunitexerunner_flags=self.eunitexerunner_flags,
+                           pmd_files=self.pmd_files,                            
+                           trace_activation_files=self.trace_activation_files,
+                           component_path=self.component_path)
+        self.atp.insert_set(image_files=self.image_files,                           
+                           engine_ini_file=self.engine_ini_file,
+                           sis_files=self.sis_files,
+                           test_timeout=self.test_timeout,
+                           eunitexerunner_flags=self.eunitexerunner_flags,
+                           pmd_files=self.pmd_files,                            
+                           trace_activation_files=self.trace_activation_files,
+                           component_path=self.component_path)
+        self.atp.insert_set(data_files=self.data_files,
+                           config_files=self.config_files,
+                           engine_ini_file=self.engine_ini_file,
+                           image_files=self.image_files,
+                           testmodule_files=self.testmodule_files,
+                           test_timeout=self.test_timeout,
+                           eunitexerunner_flags=self.eunitexerunner_flags,
+                           src_dst=self.src_dst,
+                           pmd_files=self.pmd_files,                            
+                           trace_activation_files=self.trace_activation_files,
+                           component_path=self.component_path)
+        self.atp.insert_set(engine_ini_file=self.engine_ini_file,
+                           test_timeout=self.test_timeout,
+                           eunitexerunner_flags=self.eunitexerunner_flags,
+                           image_files=self.image_files,
+                           test_harness=self.test_harness,
+                           src_dst=self.src_dst,
+                           pmd_files=self.pmd_files,                            
+                           trace_activation_files=self.trace_activation_files,
+                           component_path=self.component_path)
+        self.atp.insert_set(test_timeout=self.test_timeout,      
+                           eunitexerunner_flags=self.eunitexerunner_flags,               
+                           image_files=self.image_files,                        
+                           test_harness=self.test_harness,                      
+                           src_dst=self.src_dst,                                
+                           pmd_files=self.pmd_files,                            
+                           trace_activation_files=self.trace_activation_files,
+                           component_path=self.component_path)  
+
+        assert self.atp.sets[0] == dict(name="set0",
+                                       data_files=self.data_files,
+                                       config_files=self.config_files,
+                                       engine_ini_file=self.engine_ini_file,
+                                       image_files=self.image_files,
+                                       testmodule_files=self.testmodule_files,
+                                       test_timeout=self.test_timeout,
+                                       eunitexerunner_flags=self.eunitexerunner_flags,
+                                       test_harness=self.test_harness,
+                                       src_dst=[],
+                                       pmd_files=self.pmd_files,
+                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set0", "tracelog.blx"),
+                                       trace_activation_files=self.trace_activation_files,
+                                       ctc_enabled=self.atp["ctc_enabled"],
+                                       custom_dir=None,
+                                       component_path=self.component_path)
+        assert self.atp.sets[1] == dict(name="set1",
+                                       image_files=self.image_files,
+                                       engine_ini_file=self.engine_ini_file,
+                                       sis_files=self.sis_files,
+                                       test_timeout=self.test_timeout,
+                                       eunitexerunner_flags=self.eunitexerunner_flags,
+                                       test_harness=self.test_harness,
+                                       pmd_files=self.pmd_files,
+                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set1", "tracelog.blx"),
+                                       trace_activation_files=self.trace_activation_files,
+                                       ctc_enabled=self.atp["ctc_enabled"],
+                                       custom_dir=None,
+                                       component_path=self.component_path)
+
+        assert self.atp.sets[2] == dict(name="set2",
+                                       data_files=self.data_files,
+                                       config_files=self.config_files,
+                                       engine_ini_file=self.engine_ini_file,
+                                       image_files=self.image_files,
+                                       testmodule_files=self.testmodule_files,
+                                       test_timeout=self.test_timeout,
+                                       eunitexerunner_flags=self.eunitexerunner_flags,
+                                       test_harness=self.test_harness,
+                                       src_dst=self.src_dst,
+                                       pmd_files=self.pmd_files,
+                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set2", "tracelog.blx"),
+                                       trace_activation_files=self.trace_activation_files,
+                                       ctc_enabled=self.atp["ctc_enabled"],
+                                       custom_dir=None,
+                                       component_path=self.component_path)
+        assert self.atp.sets[3] == dict(name="set3",
+                                       data_files=[],
+                                       config_files=[],
+                                       engine_ini_file=self.engine_ini_file,
+                                       image_files=self.image_files,
+                                       testmodule_files=[],
+                                       test_timeout=self.test_timeout,
+                                       eunitexerunner_flags=self.eunitexerunner_flags,
+                                       test_harness=self.test_harness,
+                                       src_dst=self.src_dst,
+                                       pmd_files=self.pmd_files,
+                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set3", "tracelog.blx"),
+                                       trace_activation_files=self.trace_activation_files,
+                                       ctc_enabled=self.atp["ctc_enabled"],
+                                       custom_dir=None,
+                                       component_path=self.component_path)
+
+        assert self.atp.sets[4] == dict(name="set4",
+                                       data_files=[],
+                                       config_files=[],
+                                       engine_ini_file=None,
+                                       image_files=self.image_files,
+                                       testmodule_files=[],
+                                       test_timeout=self.test_timeout,
+                                       eunitexerunner_flags=self.eunitexerunner_flags,
+                                       test_harness=self.test_harness,
+                                       src_dst=self.src_dst,
+                                       pmd_files=self.pmd_files,
+                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set4", "tracelog.blx"),
+                                       trace_activation_files=self.trace_activation_files,
+                                       ctc_enabled=self.atp["ctc_enabled"],
+                                       custom_dir=None,
+                                       component_path=self.component_path)
+        
+    def test_post_actions_email(self):
+        """ Testing the send email post-action. """        
+        assert not self.atp.post_actions
+        receiver = "joe.average@example.com"
+        self.atp.report_email = receiver
+        assert len(self.atp.post_actions) == 1
+        action, items = self.atp.post_actions[0]
+        items = dict(items)
+        assert action == "SendEmailAction"
+        assert items["to"] == receiver
+    
+    def test_post_actions_ats3_report_only(self):
+        """ Testing the ats3 report only post-action. """        
+        file_store = path("path/to/files")
+        self.atp.file_store = file_store
+        self.atp.harness = "EUNIT"
+        assert len(self.atp.post_actions) == 2
+        action, items = self.atp.post_actions[0]
+        items = dict(items)
+        assert action == "FileStoreAction"
+        assert items["report-type"] == "ATS3_REPORT"
+        assert items["to-folder"].startswith(file_store)
+        assert items["to-folder"].endswith("ATS3_REPORT")
+    
+    def test_post_actions_stif(self):
+        """ Testing STIF post-actions. """        
+        file_store = path("path/to/files")
+        self.atp.file_store = file_store
+        assert len(self.atp.post_actions) == 2
+        action, items = self.atp.post_actions[1]
+        items = dict(items)
+        assert action == "FileStoreAction"
+        assert items["report-type"] == "STIF_COMPONENT_REPORT_ALL_CASES"
+        assert items["to-folder"].startswith(file_store)
+        assert items["to-folder"].endswith("STIF_REPORT")
+        
+    def test_post_actions_diamonds(self):
+        """ Testing Diamonds post-actions. """        
+        self.atp.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        assert len(self.atp.post_actions) == 1
+        action, items = self.atp.post_actions[0]
+        assert action == "DiamondsAction"
+        assert not items
+
+
+class TestComponentParser(mocker.MockerTestCase):
+    """ Testing the Ats3ComponentParser component parser. """
+    
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+    
+    def assert_paths(self, path1, path2):
+        """ Checking the path. Validates that path1 and path2 are instance of path and they are equals. """
+        if not isinstance(path1, path):
+            path1 = path(path1)
+        if not isinstance(path2, path):
+            path2 = path(path2)            
+        return self.assertEqual(path1.normpath(), path2.normpath())
+    
+    def setUp(self):
+        """ Setting up TestComponentParser testsuite."""
+        opts = Bunch(build_drive=path(TEST_PATH+os.sep), target_platform="target platform", eunitexerunner_flags="/E S60AppEnv /R Off",
+                     data_dir=["data"], flash_images=[], sis_files=[], test_timeout="60", harness="STIF", trace_enabled="True")
+        self.acp = atc.Ats3ComponentParser(opts)
+        self.acp.tsrc_dir = TSRC
+      
+    def test_detect_dlls(self):
+        """ Testing dlls detection. """
+        # Setup mock objects.
+        logging.getLogger().setLevel(logging.DEBUG)
+        process = self.mocker.mock()
+        process.communicate()
+        self.mocker.result(["lib1.dll\npath/to/another/library.dll\nsome/other/file.txt\nlib2.dll\nlib3.dll\n"])
+        obj = self.mocker.replace("subprocess.Popen")
+        obj("abld -w test build target platform", shell=True, stdout=subprocess.PIPE)
+        self.mocker.result(process)
+        
+        exists = self.mocker.replace("os.path.exists")
+        exists()
+        self.mocker.result(True)
+        exists()
+        self.mocker.result(True)
+        exists()
+        self.mocker.result(True)
+        exists()
+        self.mocker.result(False)
+        
+        self.mocker.replay()
+        
+        self.assertEqual([u"lib1.dll", u"library.dll", u"lib2.dll"],
+                         [dll.name for dll in self.acp.tsrc_dll_files()])
+        logging.getLogger().setLevel(logging.ERROR)
+
+    def test_harness(self):
+        """ Detect test harness."""
+        mmp_parser = parser.MmpFileParser()
+        group = TSRC.joinpath("group")
+        for harness, mmp in [
+            ("STIF", group / "stif.mmp"),
+            ("EUNIT", group / "eunit.mmp"),
+            ("STIF", group / "both.mmp"),
+            ]:
+            self.assertEqual(harness, mmp_parser.get_harness(mmp))
+
+class TestXMLGeneration(mocker.MockerTestCase):
+    """
+    Unit tests for the test.xml generation.
+    """
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+        self.data_files = None
+        self.config_files = None
+        self.testmodule_files = None
+        self.image_files = None
+        self.engine_ini_file = None
+        self.report_email = None
+        self.file_store = None
+        self.diamonds_build_url = None
+        self.test_harness = None     
+        self.src_dst = []
+        self.trace_enabled = None
+        self.pmd_files = None
+        self.trace_activation_files = None
+        self.ctc_enabled = None
+        self.eunitexerunner_flags = None
+        self.test_plan = None
+        self.gen = None
+        self.custom_dir = None
+            
+    def generate_xml(self, trace_enabled="False"):
+        """ Generating the XML. """
+        def files(*paths):
+            """creating tsrc path list"""
+            return [TEST_PATH.joinpath("tsrc", tpath) for tpath in paths]
+        self.testmodule_files = files("testmodules/file1.dll", "testmodules/file2.dll")
+        self.data_files = files("data/file1", "data/file2", "data/file3")
+        self.config_files = files("conf/file1.cfg", "conf/file2.cfg")
+        self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
+        self.engine_ini_file = files("init/TestFramework.ini")[0]
+        self.report_email = "test.receiver@company.com"
+        self.file_store = path(r"path/to/reports")
+        self.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        self.test_harness = "STIF"        
+        self.src_dst = []
+        self.trace_enabled = trace_enabled
+        self.pmd_files = TEST_FILES["pmd_file"]
+        self.trace_activation_files = files("trace_init/trace_activation_1.xml")
+        self.ctc_enabled = "True"
+        self.eunitexerunner_flags = "/E S60AppEnv /R Off"
+        self.custom_dir = "CustomB"
+        self.component_path = str(TEST_PATH.joinpath("tsrc", "group"))
+        self.ctc_run_process_params = r"10.0.0.1#x:\ats\drop0.zip#1"
+        
+        self.ctc_network = self.ctc_run_process_params.rsplit("#", 2)[0]
+        self.drop_id = re.findall(".*drop(\d*).zip.*", self.ctc_run_process_params.lower())[0] #extracting int part of drop name
+        self.drop_count = self.ctc_run_process_params.rsplit("#", 1)[1]
+        self.diamonds_id = self.diamonds_build_url.rsplit(r"/", 1)[1]
+
+        self.mocker.restore()
+        test_plan = self.mocker.mock(count=False)
+        mocker.expect(test_plan["testrun_name"]).result("test")
+        mocker.expect(test_plan["harness"]).result("STIF")
+        mocker.expect(test_plan["device_type"]).result("product")
+        mocker.expect(test_plan["plan_name"]).result("test plan")
+        mocker.expect(test_plan["diamonds_build_url"]).result(self.diamonds_build_url)
+        mocker.expect(test_plan["test_timeout"]).result("60")
+        mocker.expect(test_plan["eunitexerunner_flags"]).result("/E S60AppEnv /R Off")
+        mocker.expect(test_plan["device_hwid"]).result("5425")
+        mocker.expect(test_plan["custom_dir"]).result("custom")
+        mocker.expect(test_plan.custom_dir).result(path(r"self.custom_dir"))
+        
+        mocker.expect(test_plan["ctc_run_process_params"]).result(self.ctc_run_process_params)
+                
+        if self.trace_enabled.lower() == "true":
+            mocker.expect(test_plan["trace_enabled"]).result("True")
+        else:
+            mocker.expect(test_plan["trace_enabled"]).result("False")
+        if self.trace_enabled == "False":
+            mocker.expect(test_plan.sets).result([
+                dict(name="set0", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness="STIF", src_dst=self.src_dst,
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir=self.custom_dir, component_path=self.component_path),
+                dict(name="set1", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file,test_harness="STIF", src_dst=self.src_dst,
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir=self.custom_dir, component_path=self.component_path),
+            ])
+        elif self.trace_enabled == "True":
+            mocker.expect(test_plan.sets).result([
+                dict(name="set0", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness="STIF", src_dst=self.src_dst,
+                     pmd_files=self.pmd_files, trace_activation_files=self.trace_activation_files,
+                     trace_path=self.file_store.joinpath("traces", "set0", "tracelog.blx"),
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags, component_path=self.component_path),
+                dict(name="set1", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file,test_harness="STIF", src_dst=self.src_dst,
+                     pmd_files=self.pmd_files, trace_activation_files=self.trace_activation_files,
+                     trace_path=self.file_store.joinpath("traces", "set1", "tracelog.blx"),
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags, component_path=self.component_path),
+            ])
+
+        ctc_file_name = "catsctc2html/catsctc2html.exe"
+        ctc_data_path = str(os.path.normpath(r"\\%s\ctc_helium\%s\drop0\set0\ctcdata" % (self.ctc_network, self.diamonds_id)))
+        mon_files = str(os.path.normpath(r"\\%s\ctc_helium\%s\mon_syms\1\MON.sym" % (self.ctc_network, self.diamonds_id)))
+        self.ctc_test_data = [ctc_file_name, self.ctc_network, self.drop_id, self.drop_count, self.diamonds_id, ctc_data_path, mon_files] 
+        
+        mocker.expect(test_plan.post_actions).result([
+            ("RunProcessAction", (("file", ctc_file_name ),
+                                  ("parameters", r"--ctcdata_files=" + ctc_data_path + " --monsym_files=" + mon_files + " --diamonds_build_id=" + self.diamonds_id + " --drop_id=" + self.drop_id + " --total_amount_of_drops=" + self.drop_count ))),
+            ("SendEmailAction", (("subject", "email subject"),
+                                 ("type", "ATS3_REPORT"),
+                                 ("send-files", "true"),
+                                 ("to", self.report_email))),
+            ("FileStoreAction", (("to-folder", self.file_store),
+                                 ("report-type", "ATS_REPORT"),
+                                 ("date-format", "yyyyMMdd"),
+                                 ("time-format", "HHmmss"))),
+            ("FileStoreAction", (("to-folder", self.file_store),
+                                 ("report-type", "STIF_COMPONENT_REPORT_ALL_CASES"),
+                                 ("run-log", "true"),
+                                 ("date-format", "yyyyMMdd"),
+                                 ("time-format", "HHmmss"))),
+            ("DiamondsAction", ())
+        ])
+        
+        self.mocker.replay()
+        self.test_plan = test_plan
+        
+        self.gen = adg.Ats3TestDropGenerator()
+        return self.gen.generate_xml(test_plan)
+
+    def test_basic_structure(self):
+        """ Check that the overall test.xml structure is valid. """
+        xml = self.generate_xml()
+        # Check basics.
+        assert xml.find(".").tag == "test"
+        assert xml.find("./name").text == "test"
+        assert xml.find("./buildid").text == self.diamonds_build_url
+        assert xml.find("./target").tag
+        assert xml.find("./target/device").tag
+        harness, type_, device_hwid = xml.findall("./target/device/property")
+        assert harness.get("value") == "STIF"
+        assert type_.get("value") == "product"
+        assert device_hwid.get("value") == "5425"
+        
+        # Check generation of the test plan.
+        assert xml.find("./plan").get("name") == "test Plan"
+        assert xml.find("./plan/session").tag 
+        sets = xml.findall("./plan/session/set")
+        assert len(sets) == 2
+        assert sets[0].get("name") == "set0-"+str(TEST_PATH.joinpath("tsrc", "group"))
+        assert sets[0].find("./target/device").tag
+    
+    def test_set_structure(self):
+        """ Check that a <set> element's structure is valid. """
+        xml = self.generate_xml()
+        tstset = xml.find("./plan/session/set")
+        assert tstset.tag
+        case = tstset.find("./case")
+        assert case.tag
+        assert case.get("name") == "set0 case"
+        
+    def test_case_flash_elems(self):
+        """ Test case flash elems. """
+        xml = self.generate_xml()
+        case = xml.find("./plan/session/set/case")
+        flashes = case.findall("./flash")
+        assert len(flashes) == len(self.image_files)
+        for i, flash_file in enumerate(self.image_files):
+            assert flashes[i].get("target-alias") == "DEFAULT_STIF"
+            assert flashes[i].get("images") == path(r"ATS3Drop" + os.sep + "images") / flash_file.name
+        
+    def test_case_steps(self):
+        """ Test case steps. """
+        xml = self.generate_xml()
+        steps = iter(xml.findall("./plan/session/set/case/step"))
+        check_ctc_start(steps)
+        check_log_dir(steps)
+        self.check_install_data(steps)
+        self.check_install_configuration(steps)
+        self.check_install_tmodules(steps)
+        self.check_install_engine_ini(steps)
+        self.check_run_cases(steps)
+        check_ctc_write(steps)
+        check_ctc_log(steps)
+        check_fetch_logs(steps)
+
+    def check_install_data(self, steps):
+        """ Test install data. """
+        for filename in self.data_files:
+            step = steps.next()
+            assert step.get("name") == "Install data: %s" % filename.name
+            assert step.findtext("./command") == "install"
+            params = step.findall("./params/param")            
+            src = params[0].get("src")
+            assert src.name == filename.name
+            assert src.parent == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "data")            
+            dst = params[1].get("dst")
+            assert dst.name == filename.name
+            assert dst.parent == path(r"e:\testing\data")
+    
+    def check_install_configuration(self, steps):
+        """ Test install configuration. """
+        for filepath in self.config_files:
+            step = steps.next()
+            assert step.get("name") == "Install conf: %s" % filepath.name
+            assert step.findtext("./command") == "install"
+            params = step.findall("./params/param")
+            assert params[0].get("src") == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "conf") / filepath.name
+            assert params[1].get("dst") == path(r"e:\testing\conf") / filepath.name
+
+    def check_install_tmodules(self, steps):
+        """ Test install tmodules. """
+        for filepath in self.testmodule_files:
+            step = steps.next()
+            assert step.get("name") == "Install testmodule: %s" % filepath.name
+            assert step.findtext("./command") == "install"
+            params = step.findall("./params/param")
+            assert params[0].get("src") == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules") / filepath.name
+            assert params[1].get("dst") == path(r"c:\sys\bin") / filepath.name            
+    
+    def check_install_engine_ini(self, steps):
+        """ Test install engine ini. """
+        filepath = self.engine_ini_file
+        step = steps.next()
+        assert step.get("name") == "Install engine_ini: %s" % filepath.name
+        assert step.findtext("./command") == "install"
+        params = step.findall("./params/param")
+        assert params[0].get("src") == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "init") / filepath.name
+        assert params[1].get("dst") == path(r"c:" + os.sep + "testframework") / filepath.name
+    
+    def check_run_cases(self, steps):
+        """ Test run cases. """
+        step = steps.next()
+        filepath = self.engine_ini_file
+        assert step.get("name") == "Execute test: %s" % filepath.name
+        assert step.findtext("./command") == "run-cases"
+        params = step.findall("./params/param")
+        assert params[0].get("filter") == "*"
+        assert params[1].get("timeout") == "60"
+        assert params[2].get("engineini") == path(r"c:" + os.sep + "testframework") / self.engine_ini_file.name
+
+    def test_steps_trace_enabled(self):
+        """ Test steps trace enabled. """
+        xml = self.generate_xml(trace_enabled="True")
+        steps = iter(xml.findall("./plan/session/set/case/step"))
+        check_ctc_start(steps)
+        check_log_dir(steps)
+        self.check_install_data(steps)
+        self.check_install_configuration(steps)
+        self.check_install_tmodules(steps)
+        self.check_install_engine_ini(steps)
+        check_trace_start(steps, self.file_store)
+        self.check_run_cases(steps)
+        check_trace_end_steps(steps, self.file_store)
+        check_ctc_write(steps)
+        check_ctc_log(steps)
+        check_fetch_logs(steps) 
+    
+    def test_post_actions(self):
+        """ Post actions are inserted into XML. """
+        xml = self.generate_xml()        
+        post_actions = xml.findall("./postAction")
+        check_ctc_run_process_action(post_actions[0])
+        check_send_email_action(post_actions[1], self.report_email)
+        check_ats_report_action(post_actions[2], self.file_store)
+        check_stif_report_action(post_actions[3], self.file_store)
+        check_diamonds_action(post_actions[4])
+    
+    def test_files(self):
+        """ Testing files. """
+        xml = self.generate_xml()
+        files = iter(xml.findall("./files/file"))
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file1"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file2"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file3"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file1.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file2.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file1.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file2.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "init" + os.sep + "TestFramework.ini"        
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file1"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file2"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file3"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file1.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file2.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file1.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file2.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "init" + os.sep + "TestFramework.ini"        
+        self.assertRaises(StopIteration, files.next)
+        xml = self.generate_xml(trace_enabled="True")
+        files = iter(xml.findall("./files/file"))
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file1"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file2"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file3"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file1.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file2.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file1.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file2.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "init" + os.sep + "TestFramework.ini"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file1"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file2"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file3"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file1.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file2.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file1.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file2.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "init" + os.sep + "TestFramework.ini"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml"        
+        self.assertRaises(StopIteration, files.next)
+        
+    def test_generate_drop(self):
+        """ Manifest for ATS3Drop directory structure is generated. """
+        xml = self.generate_xml()
+        strbuffer = StringIO()
+        
+        self.gen.generate_drop(self.test_plan, xml, strbuffer)
+        zfile = zipfile.ZipFile(strbuffer, "r")
+        try:
+            contents = sorted(path(tpath).normpath() for tpath in zfile.namelist())
+            expected = sorted(path(tpath).normpath()
+                           for tpath in [r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "init" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file2.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "init" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file2.dll",
+                                     r"test.xml"])
+            diff = difflib.context_diff(expected, contents)
+            assert contents == expected, "\n".join(diff)
+        finally:
+            zfile.close()
+
+    def test_generate_drop_trace (self):
+        "Manifest for ATS3Drop directory structure is generated when trace enabled."
+        xml = self.generate_xml(trace_enabled="True")
+        strbuffer = StringIO()
+        
+        self.gen.generate_drop(self.test_plan, xml, strbuffer)
+        zfile = zipfile.ZipFile(strbuffer, "r")
+        try:
+            contents = sorted(path(tpath).normpath() for tpath in zfile.namelist())
+            expected = sorted(path(tpath).normpath()
+                           for tpath in [r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "init" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file2.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "init" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file2.dll",
+                                     r"test.xml"])
+            diff = difflib.context_diff(expected, contents)
+            assert contents == expected, "\n".join(diff)
+        finally:
+            zfile.close()
+
+
+class TestXMLGenerationWithPKG(mocker.MockerTestCase):
+    """
+    Unit tests for the test.xml generation.
+    """
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+        self.src_dst1 = []
+        self.data_files = None
+        self.config_files = None
+        self.testmodule_files = None
+        self.image_files = None
+        self.engine_ini_file = None
+        self.report_email = None
+        self.file_store = None
+        self.diamonds_build_url = None
+        self.trace_enabled = None
+        self.pmd_files = None
+        self.trace_activation_files = None
+        self.ctc_enabled = None
+        self.eunitexerunner_flags = None
+        self.test_plan = None
+        self.gen = None
+        self.src_dst0 = []
+        self.custom_dir = None
+        
+    def generate_xml(self, harness, trace_enabled="False"):
+        """Generates XML"""
+        def files(*paths):
+            """generates paths for the files"""
+            return [TEST_PATH.joinpath("tsrc", tpath) for tpath in paths]
+        self.src_dst1 = []
+        self.data_files = files("data/file1", "data/file2", "data/file3")
+        self.config_files = files("conf/file1.cfg", "conf/file2.cfg")
+        self.testmodule_files = files("testmodules/file1.dll", "testmodules/file2.dll")
+        self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
+        self.engine_ini_file = files("init/TestFramework.ini")[0]
+        self.report_email = "test.receiver@company.com"
+        self.file_store = path("path/to/reports")
+        self.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        self.trace_enabled = trace_enabled
+        self.pmd_files = TEST_FILES["pmd_file"]
+        self.trace_activation_files = files("trace_init/trace_activation_1.xml")
+        self.ctc_enabled = "True"
+        self.eunitexerunner_flags = "/E S60AppEnv /R Off"
+        self.custom_dir = "custom"
+        self.custom_files = files("custom/postpostaction.xml", "custom/prepostaction.xml")
+        self.component_path = str(TEST_PATH.joinpath("tsrc", "group"))
+        self.ctc_run_process_params = r"10.0.0.1#drop0.zip#1"
+        
+        
+        self.src_dst0 = [
+            (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file1.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"), "testmodule"),
+            (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file2.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"), "testmodule"),
+            (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file1"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"), "data"),
+            (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file2"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"), "data"),
+            (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file3"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"), "data"),
+            ]
+        if harness == "STIF" or harness == "MULTI_HARNESS":
+            harness0 = harness1 = "STIF"
+            if "MULTI_HARNESS" in harness:
+                harness1 = "EUNIT"
+                self.src_dst1 = [
+                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file1.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"), "testmodule"),
+                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file2.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"), "testmodule"),
+                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file1"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"), "data"),
+                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file2"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"), "data"),
+                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file3"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"), "data"),
+                    ] 
+            self.src_dst0 = [
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file1.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"), "testmodule"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file2.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"), "testmodule"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file1"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"), "data"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file2"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"), "data"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file3"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"), "data"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "conf" + os.sep + "file1.cfg"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg"), "conf"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "conf" + os.sep + "file2.cfg"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg"), "conf"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "init" + os.sep + "TestFramework.ini"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini"), "engine_ini"),
+                ]
+            if "STIF" in harness:
+                self.src_dst1 = self.src_dst0
+            
+        elif harness == "EUNIT":
+            harness0 = harness1 = harness
+            self.src_dst1 = self.src_dst0
+            
+        self.mocker.restore()
+        test_plan = self.mocker.mock(count=False)
+        mocker.expect(test_plan["testrun_name"]).result("test")
+        mocker.expect(test_plan["harness"]).result(harness)
+        mocker.expect(test_plan["device_type"]).result("product")
+        mocker.expect(test_plan["plan_name"]).result("test plan")
+        mocker.expect(test_plan["diamonds_build_url"]).result(self.diamonds_build_url)
+        mocker.expect(test_plan["test_timeout"]).result("60")
+        mocker.expect(test_plan["eunitexerunner_flags"]).result("/E S60AppEnv /R Off")
+        mocker.expect(test_plan["eunitexerunner?flags"]).result(self.eunitexerunner_flags)
+        mocker.expect(test_plan["device_hwid"]).result("5425")
+        mocker.expect(test_plan["trace_enabled"]).result(self.trace_enabled)
+        mocker.expect(test_plan["ctc_enabled"]).result(self.ctc_enabled)
+        mocker.expect(test_plan["custom_dir"]).result("custom1A")
+        mocker.expect(test_plan.custom_dir).result(path(r"self.custom_dir"))
+        mocker.expect(test_plan["ctc_run_process_params"]).result(self.ctc_run_process_params)
+        if self.trace_enabled == "False":
+            mocker.expect(test_plan.sets).result([
+                dict(name="set0", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness=harness0,src_dst=self.src_dst0,
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir = self.custom_dir, component_path=self.component_path),
+                dict(name="set1", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness=harness1, src_dst=self.src_dst1,
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir = self.custom_dir, component_path=self.component_path),
+            ])
+        else:
+            mocker.expect(test_plan.sets).result([
+                dict(name="set0", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness=harness0, src_dst=self.src_dst0,
+                     pmd_files=self.pmd_files, trace_activation_files=self.trace_activation_files,
+                     trace_path=self.file_store.joinpath("traces", "set0", "tracelog.blx"),
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir = self.custom_dir, component_path=self.component_path),
+                dict(name="set1", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness=harness1, src_dst=self.src_dst1,
+                     pmd_files=self.pmd_files, trace_activation_files=self.trace_activation_files,
+                     trace_path=self.file_store.joinpath("traces", "set1", "tracelog.blx"),
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir = self.custom_dir, component_path=self.component_path),
+            ])
+        mocker.expect(test_plan.post_actions).result([
+            ("SendEmailAction", (("subject", "email subject"),
+                                 ("type", "ATS3_REPORT"),
+                                 ("send-files", "true"),
+                                 ("to", self.report_email))),
+            ("FileStoreAction", (("to-folder", self.file_store),
+                                 ("report-type", "ATS_REPORT"),
+                                 ("date-format", "yyyyMMdd"),
+                                 ("time-format", "HHmmss"))),
+            ("FileStoreAction", (("to-folder", self.file_store),
+                                 ("report-type", "STIF_COMPONENT_REPORT_ALL_CASES"),
+                                 ("run-log", "true"),
+                                 ("date-format", "yyyyMMdd"),
+                                 ("time-format", "HHmmss"))),
+            ("DiamondsAction", ())
+        ])
+        
+        self.mocker.replay()
+        self.test_plan = test_plan
+        
+        self.gen = adg.Ats3TestDropGenerator()
+        return self.gen.generate_xml(test_plan)
+
+    def test_basic_structure(self):
+        "Check that the overall test.xml structure is valid."
+        
+        test_harness = ["STIF", "EUNIT", "MULTI_HARNESS"]
+        
+        for thar in test_harness:
+            xml = self.generate_xml(thar)
+            # Check basics.
+            assert xml.find(".").tag == "test"
+            assert xml.find("./name").text == "test"
+            assert xml.find("./buildid").text == self.diamonds_build_url
+            assert xml.find("./target").tag
+            assert xml.find("./target/device").tag
+            if self.test_plan["harness"] == "MULTI_HARNESS":
+                harness_1, type_1, device_hwid_1, harness_2, type_2, device_hwid_2 = xml.findall("./target/device/property")
+            else:
+                harness_1, type_1, device_hwid_1 = xml.findall("./target/device/property")
+            
+            if self.test_plan["harness"] == "MULTI_HARNESS":
+                assert harness_1.get("value") == "STIF"
+                assert type_1.get("value") == "product"
+                assert device_hwid_1.get("value") == "5425"
+                assert harness_2.get("value") == "EUNIT"
+                assert type_2.get("value") == "product"
+                assert device_hwid_2.get("value") == "5425"
+            else:
+                assert harness_1.get("value") == thar
+                assert type_1.get("value") == "product"
+                assert device_hwid_1.get("value") == "5425"
+
+        # Check generation of the test plan.
+        assert xml.find("./plan").get("name") == "test Plan"
+        assert xml.find("./plan/session").tag 
+        sets = xml.findall("./plan/session/set")
+        assert len(sets) == 2
+        assert sets[0].get("name") == "set0-"+str(TEST_PATH.joinpath("tsrc", "group"))
+        assert sets[0].find("./target/device").tag
+    
+    def test_set_structure(self):
+        "Check that a <set> element's structure is valid."
+        xml = self.generate_xml("STIF")
+        tstset = xml.find("./plan/session/set")
+        assert tstset.tag
+        case = tstset.find("./case")
+        assert case.tag
+        assert case.get("name") == "set0 case"
+        
+    def test_case_flash_elems(self):
+        """Checks flash target element in the test.xml file"""
+        xml = self.generate_xml("STIF")
+        case = xml.find("./plan/session/set/case")
+        flashes = case.findall("./flash")
+        assert len(flashes) == len(self.image_files)
+        for i, flash_file in enumerate(self.image_files):
+            assert flashes[i].get("target-alias") == "DEFAULT_STIF"
+            assert flashes[i].get("images") == path(r"ATS3Drop" + os.sep + "images") / flash_file.name
+        
+    def test_case_steps(self):
+        """Checks cases in steps in the test.xml file"""
+        test_harness = ["STIF", "EUNIT", "MULTI_HARNESS"]
+        for thar in test_harness:
+            xml = self.generate_xml(thar)
+            steps = iter(xml.findall("./plan/session/set/case/step"))
+            check_ctc_start(steps)
+            check_log_dir(steps)
+            if "MULTI_HARNESS" in thar:            
+                self.check_install_step(steps, "STIF")
+                self.check_run_cases(steps)
+                check_ctc_write(steps)
+                check_ctc_log(steps)
+                check_fetch_logs(steps)
+                check_ctc_start(steps)
+                check_log_dir(steps)
+                self.check_install_step(steps, "EUNIT", set_count="1")
+                self.check_run_cases(steps)
+                check_ctc_write(steps)
+                check_ctc_log(steps, "withpkgfiles")
+                check_fetch_logs(steps)
+            else:
+                self.check_install_step(steps, thar)
+                self.check_run_cases(steps)
+                check_ctc_write(steps)
+                check_ctc_log(steps)
+                check_fetch_logs(steps)
+
+    def check_install_step(self, steps, harness, set_count="0"):
+        """Checks install steps in the test.xml file"""
+        if harness == "MULTI_HARNESS":
+            dst = [self.src_dst0, self.src_dst1]
+        else:
+            dst = [self.src_dst0]
+        if set_count == "1":
+            dst = [self.src_dst1]
+        
+        for dest in dst:
+            for file1 in dest:
+                step = steps.next()
+                filename = file1[1]
+                letter = filename[filename.rfind(":")-1:filename.rfind(":")]
+                filename = filename[filename.rfind(os.sep)+1:]
+                if "Install" in step.get("name"):
+                    assert step.get("name") == "Install %s: %s" %  (file1[2], filename)
+                    assert step.findtext("./command") == "install"
+                    params = step.findall("./params/param")            
+                    src = params[0].get("src")
+                    assert src.name == filename
+                    assert src.parent == path(r"ATS3Drop" + os.sep + "set" + set_count + os.sep + letter + os.sep + "sys" + os.sep + "bin")
+                    dst = params[1].get("dst")
+                    assert dst.name == filename
+                    assert dst.parent == path(letter + ":" + os.sep + "sys" + os.sep + "bin")
+            
+    
+    def check_run_cases(self, steps):
+        """Checks run cases in the test.xml file"""
+        step = steps.next()
+        if step.get("harness") == "STIF":
+            file_ = self.engine_ini_file 
+            assert step.get("name") == "Execute test: %s" % file_.name
+            assert step.findtext("./command") == "run-cases"
+            params = step.findall("./params/param")
+            assert params[0].get("filter") == "*"
+            assert params[1].get("timeout") == "60"
+            assert params[2].get("engineini") == path(r"c:" + os.sep + "sys" + os.sep + "bin") / self.engine_ini_file.name
+        elif step.get("harness") == "EUNIT":
+            file_ = self.testmodule_files[0]
+            if "Execute" in step.get("name"):
+                assert step.get("name") == "Execute test: %s" % file_.name
+                assert step.findtext("./command") == "execute"
+                params = step.findall("./params/param")
+                assert params[0].get("file") == path(r"z:" + os.sep + "sys" + os.sep + "bin" + os.sep + "EUNITEXERUNNER.EXE")
+                assert params[1].get("result-file") == path(r"c:" + os.sep + "Shared" + os.sep + "EUnit" + os.sep + "logs" + os.sep + "file1_log.xml")
+                assert params[2].get("parameters") == "/E S60AppEnv /R Off /F file1 /l xml file1.dll"
+                assert params[3].get("timeout") == "60"
+                step = steps.next()
+                file_ = self.testmodule_files[1]
+                assert step.get("name") == "Execute test: %s" % file_.name
+                assert step.findtext("./command") == "execute"
+                params = step.findall("./params/param")
+                assert params[0].get("file") == path(r"z:" + os.sep + "sys" + os.sep + "bin" + os.sep + "EUNITEXERUNNER.EXE")
+                assert params[1].get("result-file") == path(r"c:" + os.sep + "Shared" + os.sep + "EUnit" + os.sep + "logs" + os.sep + "file2_log.xml")
+                assert params[2].get("parameters") == "/E S60AppEnv /R Off /F file2 /l xml file2.dll"
+                assert params[3].get("timeout") == "60"
+
+    def test_steps_trace_enabled(self):
+        """checks if traing is enabled"""
+        test_harness = ["STIF"]
+        for thar in test_harness:
+            xml = self.generate_xml(thar, trace_enabled="True")
+            steps = iter(xml.findall("./plan/session/set/case/step"))
+            check_ctc_start(steps)
+            check_log_dir(steps)
+            self.check_install_step(steps, thar)
+            check_trace_start(steps, self.file_store)
+            self.check_run_cases(steps)
+            check_trace_end_steps(steps, self.file_store)
+            check_ctc_write(steps)
+            check_ctc_log(steps)
+            check_fetch_logs(steps)
+        
+    def test_post_actions(self):
+        "Post actions are inserted into XML."
+        xml = self.generate_xml("STIF")
+        post_actions = xml.findall("./postAction")
+        check_send_email_action(post_actions[0], self.report_email)
+        check_ats_report_action(post_actions[1], self.file_store)
+        check_stif_report_action(post_actions[2], self.file_store)
+        check_diamonds_action(post_actions[3])
+        
+    def test_files(self):
+        """Tests if the files are created for mock"""
+        xml = self.generate_xml("STIF")
+        files = iter(xml.findall("./files/file"))
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg"        
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini"
+        self.assertRaises(StopIteration, files.next)
+        xml = self.generate_xml(harness="STIF", trace_enabled="True")
+        files = iter(xml.findall("./files/file"))
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg"
+        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini"
+
+        self.assertRaises(StopIteration, files.next)
+        
+    def test_generate_drop(self):
+        "Manifest for ATS3Drop directory structure is generated."        
+        xml = self.generate_xml("STIF")
+        strbuffer = StringIO()
+        self.gen.generate_drop(self.test_plan, xml, strbuffer)
+        
+        zfile = zipfile.ZipFile(strbuffer, "r")
+        try:
+            contents = sorted(path(tpath).normpath() for tpath in zfile.namelist())
+            expected = sorted(path(tpath).normpath()
+                           for tpath in [r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll",
+                                     r"test.xml"])
+            diff = difflib.context_diff(expected, contents)
+            assert contents == expected, "\n".join(diff)
+        finally:
+            zfile.close()
+
+    def test_generate_drop_trace_enabled(self):
+        "Manifest for ATS3Drop directory structure is generated when trace enabled."
+        xml = self.generate_xml(harness="STIF", trace_enabled="True")
+        strbuffer = StringIO()
+        
+        self.gen.generate_drop(self.test_plan, xml, strbuffer)
+        zfile = zipfile.ZipFile(strbuffer, "r")
+        try:
+            contents = sorted(path(tpath).normpath() for tpath in zfile.namelist())
+            expected = sorted(path(tpath).normpath()
+                           for tpath in [r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
+                                     r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll",
+                                     r"test.xml"])
+            diff = difflib.context_diff(expected, contents)
+            assert contents == expected, "\n".join(diff)
+        finally:
+            zfile.close()
+            
+class TestDropGenerationWithSis(mocker.MockerTestCase):
+    """
+    Unit tests for the test.xml generation with sis files.
+    """
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+        self.sis_files = None
+        self.image_files = None
+        self.engine_ini_file = None
+        self.report_email = None
+        self.file_store = None
+        self.diamonds_build_url = None
+        self.harness = None
+        self.test_plan = None
+        self.gen = None
+        self.src_dst = []
+        
+    def generate_xml(self):
+        """Geberates XML if sis files"""
+        def files(*paths):
+            """generates paths for the files"""
+            return [TEST_PATH.joinpath("tsrc", tpath) for tpath in paths]
+        self.sis_files = files("sis/file1.sisx", "sis/file2.sisx", "sis/file3.sisx")
+        self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
+        self.engine_ini_file = files("init/TestFramework.ini")[0]
+        self.report_email = "test.receiver@company.com"
+        self.file_store = path("path/to/reports")
+        self.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        self.harness = "STIF"
+        self.component_path = str(TEST_PATH.joinpath("tsrc", "group"))
+        self.ctc_run_process_params = r"10.0.0.1#x:\ats\drop0.zip#1"
+        
+        test_plan = self.mocker.mock(count=False)
+        mocker.expect(test_plan["testrun_name"]).result("test")
+        mocker.expect(test_plan["harness"]).result("STIF")
+        mocker.expect(test_plan["device_type"]).result("product")
+        mocker.expect(test_plan["plan_name"]).result("test plan")
+        mocker.expect(test_plan["diamonds_build_url"]).result(self.diamonds_build_url)
+        mocker.expect(test_plan["test_timeout"]).result("60")
+        mocker.expect(test_plan["device_hwid"]).result("5425")
+        mocker.expect(test_plan["ctc_enabled"]).result("False")
+        mocker.expect(test_plan["trace_enabled"]).result("False")
+        mocker.expect(test_plan["custom_dir"]).result("CustomC")
+        mocker.expect(test_plan.custom_dir).result(path(r"self.custom_dir"))
+        mocker.expect(test_plan["ctc_run_process_params"]).result(self.ctc_run_process_params)
+        mocker.expect(test_plan.sets).result([
+            dict(name="set0", image_files=self.image_files, sis_files=self.sis_files,
+                 engine_ini_file=self.engine_ini_file, test_harness=self.harness, ctc_enabled="False", component_path=self.component_path),
+             ])
+        mocker.expect(test_plan.post_actions).result([])
+        self.mocker.replay()
+        self.test_plan = test_plan
+        
+        self.gen = adg.Ats3TestDropGenerator()
+        return self.gen.generate_xml(test_plan)
+
+    def test_case_steps(self):
+        """Checks cases in steps in the test.xml file"""
+        xml = self.generate_xml()
+        #print doc.xml(indent="yes")        
+        steps = iter(xml.findall("./plan/session/set/case/step"))
+        steps.next() # Stif log dir creation.
+        self.check_install_sis_files(steps)
+        steps.next() # Install engine ini.
+        self.check_install_sis_to_device(steps)
+        steps.next() # Run cases.
+        steps.next() # Fetch logs.
+        self.assertRaises(StopIteration, steps.next)
+
+    def check_install_sis_files(self, steps):
+        """Checks sis files install steps in the test.xml file"""
+        for filename in self.sis_files:
+            step = steps.next()
+            assert step.get("name") == "Install sis: %s" % filename.name
+            assert step.findtext("./command") == "install"
+            params = step.findall("./params/param")
+            # TO DO: Should sis files be specified outside of the set?
+            assert params[0].get("src") == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "sis") / filename.name
+            assert params[1].get("dst") == path(r"c:" + os.sep + "testframework") / filename.name
+
+    def check_install_sis_to_device(self, steps):
+        """Checks sis files installation on the device"""
+        for filename in self.sis_files:
+            step = steps.next()
+            assert step.get("name") == "Install SIS to the device: %s" % filename.name
+            assert step.findtext("./command") == "install-software"
+            params = step.findall("./params/param")
+            assert params[-1].get("sisPackageName") == path(r"c:" + os.sep + "testframework") / filename.name
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_ats3_aste.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,495 @@
+# -*- coding: latin-1 -*-
+
+#============================================================================ 
+#Name        : test_ats3_aste.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Testing ATS3 ASTE framework. """
+
+# pylint: disable-msg=E1101,W0603,W0142
+
+from cStringIO import StringIO
+from pprint import pprint
+from xml.etree.ElementTree import fromstring, tostring
+from xml.etree import ElementTree as et
+import difflib
+import logging
+logging.getLogger().setLevel(logging.ERROR)
+import re
+import tempfile
+import zipfile
+import os
+
+from path import path
+import amara
+import mocker
+
+import ats3.aste
+
+TEST_PATH = None
+TEST_FILES = {}
+TEST_ASSET_FILES = {}
+TSRC = None
+OUTPUT = None
+TEST_ZIP_PATH = None
+
+# Shortcuts
+E = et.Element
+SE = et.SubElement
+
+_logger = logging.getLogger("test_ast3_aste")
+
+class Bunch(object):
+    
+    def __init__(self, **kwargs): 
+        self.__dict__.update(kwargs)
+    
+
+def equal_xml(xml1, xml2):
+    """Check the equality of the given XML snippets.
+    
+    Tag name equality:
+    
+    >>> equal_xml('<a/>', '<a/>')
+    True
+    >>> equal_xml('<a/>', '<b/>')
+    False
+    
+    Attribute equality:
+    
+    >>> equal_xml('<a k="v"/>', '<a k="v"/>')
+    True
+    >>> equal_xml('<a k="v"/>', '<a k="w"/>')
+    False
+    
+    Text content equality:
+    
+    >>> equal_xml('<a>v</a>', '<a>v</a>')
+    True
+    >>> equal_xml('<a>v</a>', '<a>w</a>')
+    False
+    >>> equal_xml('<a>v</a>', '<a></a>')
+    False
+    
+    Text content equality when whitespace differs:
+    >>> equal_xml('<a>v</a>', '<a>v </a>')
+    True
+
+    Equality of child elements:
+    
+    >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="v"/></b></a>')
+    True
+    >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="w"/></b></a>')
+    False
+    >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>w</b></a>')
+    False
+    >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>v </b></a>')
+    True
+    
+    """
+    if isinstance(xml1, basestring):
+        xml1 = fromstring(xml1)
+    if isinstance(xml2, basestring):
+        xml2 = fromstring(xml2)
+    if xml1.tag != xml2.tag:
+        return False
+    if xml1.attrib != xml2.attrib:
+        return False
+    if xml1.text:
+        if not xml2.text:
+            return False
+    if xml2.text:
+        if not xml1.text:
+            return False
+    if xml1.text and xml2.text and xml1.text.strip() != xml2.text.strip():
+        return False
+    if xml1.tail is not None and xml2.tail is not None:
+        if xml1.tail.strip() != xml2.tail.strip():
+            return False
+    elif xml1.tail != xml2.tail:
+        return False
+    children1 = list(xml1.getchildren())
+    children2 = list(xml2.getchildren())
+    if len(children1) != len(children2):
+        return False
+    for child1, child2 in zip(children1, children2):
+        return equal_xml(child1, child2)
+    return True        
+
+
+def setup_module():
+    global TEST_PATH, OUTPUT, TEST_ZIP_PATH
+    TEST_PATH = path(tempfile.mkdtemp())
+    OUTPUT = TEST_PATH.joinpath("TestAsset")
+    TEST_ZIP_PATH = TEST_PATH.joinpath("test_zip")
+    asset = TEST_PATH
+    component = TEST_PATH
+    component.joinpath("group").makedirs()
+    for path_parts in (("output", "images", "file1.fpsx"),
+                       ("output", "images", "file2.fpsx")):
+        filename = component.joinpath(*path_parts)
+        if not filename.parent.exists():
+            filename.parent.makedirs()
+        filename.touch()
+        TEST_FILES.setdefault(path_parts[1], []).append(file)
+    for path_parts in (("TestAsset", "Localisation", "S60", "localisation.txt"),
+                       ("TestAsset", "TestCases", "TC_100_Test0", "file1.sis"),
+                       ("TestAsset", "TestCases", "TC_100_Test0", "file2.tcf"),
+                       ("TestAsset", "Tools", "TestCaseCreator", "test_creator.ini"),
+                       ("TestAsset", "testdrop.xml"),):
+        filename = asset.joinpath(*path_parts)
+        if not filename.parent.exists():
+            filename.parent.makedirs()
+        filename.touch()
+        TEST_ASSET_FILES.setdefault(path_parts[1], []).append(file)
+    try:
+        zip_component = TEST_ZIP_PATH
+        filename = zip_component.joinpath("TestAsset.zip")
+        if not filename.parent.exists():
+            filename.parent.makedirs()
+        filename.touch()
+        zfile = zipfile.ZipFile(zip_component.joinpath("TestAsset.zip"), "w", zipfile.ZIP_DEFLATED)
+        for p in TEST_ASSET_FILES:
+            print p
+            zfile.write(p)
+        zfile.close()
+        TEST_ASSET_FILES.setdefault("ZIP", []).append(file)
+    except OSError:
+        print "Got except OSError. Continuing...\n"  
+        
+    
+def teardown_module():
+    path(TEST_PATH).rmtree()
+    
+    
+class TestTestPlan(mocker.MockerTestCase):
+
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+             
+    def setUp(self):
+        opts = Bunch(testrun_name="testrun", harness="ASTE", 
+                     device_type="product", plan_name="ats3_test_plan", diamonds_build_url="",
+                     software_version="W810", software_release="SPP 51.32", device_language="English",
+                     testasset_location=TEST_PATH.joinpath("TestAsset"), testasset_caseids="100",repeat="1", report_email="",
+                     file_store=path(), test_timeout="60", device_hwid="5425", test_type="smoke")
+        self.tp = ats3.aste.AsteTestPlan(opts)
+        self.image_files = TEST_FILES["images"]
+        self.test_timeout = self.tp["test_timeout"]
+        self.device_hwid = self.tp["device_hwid"]
+        self.test_harness = self.tp["harness"]
+        self.device_language = self.tp["device_language"]
+        self.software_release = self.tp["software_release"]
+        self.software_version = self.tp["software_version"]
+        self.testasset_caseids = self.tp["testasset_caseids"]
+        self.testasset_location = self.tp["testasset_location"]
+        self.test_type = self.tp["test_type"]
+        
+        if self.testasset_location != "":
+            self.test_asset_testcases = [self.testasset_location.joinpath("TestCases", "TC_100_Test0", "file1.sis"), self.testasset_location.joinpath("TestCases", "TC_100_Test0", "file2.tcf")]
+            self.test_asset_tools = [self.testasset_location.joinpath("Tools", "TestCaseCreator", "test_creator.ini")]
+            self.test_asset_localisation = [self.testasset_location.joinpath("Localisation", "S60", "localisation.txt")]
+            self.test_asset_testdrop = self.testasset_location.joinpath("testdrop.xml")
+        else:
+            self.test_asset_testcases = TEST_ASSET_FILES["TestCases"]
+            self.test_asset_tools = TEST_ASSET_FILES["Tools"]
+            self.test_asset_localisation = TEST_ASSET_FILES["Localisation"]
+            self.test_asset_testdrop = TEST_ASSET_FILES["testdrop.xml"]
+
+            
+    def test_creation(self):        
+        assert self.tp["testrun_name"] == "testrun"
+        assert self.tp["harness"] == "ASTE"
+        assert self.tp["device_type"] == "product"
+    
+    def test_insert_set(self):
+        
+        self.tp.insert_set(image_files=self.image_files,
+                           test_timeout=self.test_timeout)
+        
+        assert self.tp.sets[0] == dict(name="set0",
+                                       image_files=self.image_files,
+                                       test_timeout=self.test_timeout,
+                                       test_harness=self.test_harness)
+
+    def test_post_actions_email(self):
+        assert not self.tp.post_actions
+        receiver = "joe.average@example.com"
+        self.tp.report_email = receiver
+        assert len(self.tp.post_actions) == 1
+        action, items = self.tp.post_actions[0]
+        items = dict(items)
+        assert action == "SendEmailAction"
+        assert items["to"] == receiver
+    
+    def test_post_actions_ats3_report_only(self):
+        file_store = path("path/to/files")
+        self.tp.file_store = file_store
+        self.tp.harness = "EUNIT"
+        assert len(self.tp.post_actions) == 2
+        action, items = self.tp.post_actions[0]
+        items = dict(items)
+        assert action == "FileStoreAction"
+        assert items["report-type"] == "ATS_REPORT"
+        assert items["to-folder"].startswith(file_store)
+        assert items["to-folder"].endswith("ATS3_REPORT")
+    
+    def test_post_actions_aste(self):
+        file_store = path("path/to/files")
+        self.tp.file_store = file_store
+        assert len(self.tp.post_actions) == 2
+        action, items = self.tp.post_actions[1]
+        items = dict(items)
+        assert action == "FileStoreAction"
+        assert items["report-type"] == "ASTE_REPORT"
+        assert items["to-folder"].startswith(file_store)
+        assert items["to-folder"].endswith("ASTE_REPORT")
+        
+    def test_post_actions_diamonds(self):
+        self.tp.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        assert len(self.tp.post_actions) == 1
+        action, items = self.tp.post_actions[0]
+        assert action == "DiamondsAction"
+        assert not items
+
+
+            
+class TestXMLGeneration(mocker.MockerTestCase):
+    """
+    Unit tests for the test.xml generation.
+    """    
+
+    def __init__(self, methodName="runTest"):
+        self.image_files = None
+        self.report_email = None
+        self.diamonds_build_url = None
+        self.test_harness = None
+        self.file_store = None
+        self.testasset_location = None
+        self.test_plan = None
+        self.gen = None
+        mocker.MockerTestCase.__init__(self, methodName)
+        
+        
+    def generate_xml(self):
+        def files(*paths):
+            return [TEST_PATH.joinpath(p) for p in paths]
+        self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
+        self.report_email = "test.receiver@company.com"
+        self.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        self.test_harness = "ASTE"
+        self.file_store = path(r"path/to/reports")
+        self.testasset_location = OUTPUT
+        
+        self.mocker.restore()
+        test_plan = self.mocker.mock(count=False)
+        mocker.expect(test_plan["testrun_name"]).result("test")
+        mocker.expect(test_plan["harness"]).result("ASTE")
+        mocker.expect(test_plan["device_type"]).result("product")
+        mocker.expect(test_plan["plan_name"]).result("test plan")
+        mocker.expect(test_plan["diamonds_build_url"]).result(self.diamonds_build_url)
+        mocker.expect(test_plan["test_timeout"]).result("60")
+        mocker.expect(test_plan["device_hwid"]).result("5425")
+        mocker.expect(test_plan["testasset_location"]).result(self.testasset_location)
+        mocker.expect(test_plan["testasset_caseids"]).result("100")
+        mocker.expect(test_plan["software_release"]).result("SPP 51.32")
+        mocker.expect(test_plan["software_version"]).result("W810")
+        mocker.expect(test_plan["device_language"]).result("English")
+        mocker.expect(test_plan["test_type"]).result("smoke")
+        mocker.expect(test_plan["temp_directory"]).result(TEST_PATH)
+        mocker.expect(test_plan.sets).result([
+            dict(name="set0", image_files=self.image_files, test_harness="ASTE")])
+        mocker.expect(test_plan.post_actions).result([
+            ("SendEmailAction", (("subject", "email subject"),
+                                 ("type", "ATS3_REPORT"),
+                                 ("send-files", "true"),
+                                 ("to", self.report_email))),
+            ("FileStoreAction", (("to-folder", self.file_store),
+                                 ("report-type", "ATS_REPORT"),
+                                 ("date-format", "yyyyMMdd"),
+                                 ("time-format", "HHmmss"))),
+            ("FileStoreAction", (("to-folder", self.file_store),
+                                 ("report-type", "ASTE_REPORT"),
+                                 ("run-log", "true"),
+                                 ("date-format", "yyyyMMdd"),
+                                 ("time-format", "HHmmss"))),
+            ("DiamondsAction", ())
+        ])
+        
+        self.mocker.replay()
+        self.test_plan = test_plan
+        
+        self.gen = ats3.aste.AsteTestDropGenerator()
+        return self.gen.generate_xml(test_plan)
+
+    def test_basic_structure(self):
+        "Check that the overall test.xml structure is valid."
+        xml = self.generate_xml()
+        # Check basics.
+        assert xml.find(".").tag == "test"
+        assert xml.find("./name").text == "test"
+        assert xml.find("./buildid").text == self.diamonds_build_url
+        assert xml.find("./target").tag
+        assert xml.find("./target/device").tag
+        harness, hardware, device_hwid = xml.findall("./target/device/property")
+        softwareVersion, softwareRelease, deviceLanguage = xml.findall("./target/device/setting")
+        assert harness.get("value") == "ASTE"
+        assert hardware.get("value") == "product"
+        assert softwareVersion.get("value") == "W810"
+        assert softwareRelease.get("value") == "SPP 51.32"
+        assert deviceLanguage.get("value") == "English"
+        assert device_hwid.get("value") == "5425"
+        
+        # Check generation of the test plan.
+        assert xml.find("./plan").get("name") == "Plan smoke product"
+        assert xml.find("./plan/session").tag 
+        sets = xml.findall("./plan/session/set")
+        assert len(sets) == 1
+        assert sets[0].get("name") == "set0"
+        assert sets[0].find("./target/device").tag
+    
+    def test_set_structure(self):
+        "Check that a <set> element's structure is valid."
+        xml = self.generate_xml()
+        tstset = xml.find("./plan/session/set")
+        assert tstset.tag
+        case = tstset.find("./case")
+        assert case.tag
+        assert case.get("name") == "set0 case"                
+        
+    def test_case_flash_elems(self):
+        xml = self.generate_xml()
+        case = xml.find("./plan/session/set/case")
+        flashes = case.findall("./flash")
+        assert len(flashes) == len(self.image_files)
+        for i, flash_file in enumerate(self.image_files):
+            assert flashes[i].get("target-alias") == "DEFAULT"
+            assert flashes[i].get("images") == path(r"ATS3Drop" + os.sep + "images") / flash_file.name
+    
+    def test_steps(self):
+        xml = self.generate_xml()
+        steps = iter(xml.findall("./plan/session/set/case/step"))
+        self.check_executeasset_step(steps)
+
+    def check_executeasset_step(self, steps):
+        step = steps.next()
+        assert step.get("name") == "Execute asset zip step"
+        assert step.findtext("./command") == "execute-asset"
+        params = step.findall("./params/param")
+        assert params[0].get("repeat") == "1"
+        assert params[1].get("asset-source") == "ATS3Drop" + os.sep + "TestAssets" + os.sep + "TestAsset.zip"
+        assert params[2].get("testcase-ids") == "100"
+
+    def test_post_actions(self):
+        "Post actions are inserted into XML."
+        xml = self.generate_xml()        
+        post_actions = xml.findall("./postAction")
+        self.check_send_email_action(post_actions[0])
+        self.check_ats_report_action(post_actions[1])
+        self.check_aste_report_action(post_actions[2])
+        self.check_diamonds_action(post_actions[3])
+
+    def check_send_email_action(self, action):
+        assert action.findtext("./type") == "SendEmailAction"
+        params = action.findall("./params/param")
+        assert params[0].get("name") == "subject"
+        assert params[0].get("value") == "email subject"
+        assert params[1].get("name") == "type"
+        assert params[1].get("value") == "ATS3_REPORT"
+        assert params[2].get("name") == "send-files"
+        assert params[2].get("value") == "true"
+        assert params[3].get("name") == "to"
+        assert params[3].get("value") == self.report_email
+
+    def check_ats_report_action(self, action):
+        assert action.findtext("./type") == "FileStoreAction"
+        params = action.findall("./params/param")
+        assert params[0].get("name") == "to-folder"
+        assert params[0].get("value") == self.file_store
+        assert params[1].get("name") == "report-type"
+        assert params[1].get("value") == "ATS_REPORT"
+        assert params[2].get("name") == "date-format"
+        assert params[2].get("value") == "yyyyMMdd"
+        assert params[3].get("name") == "time-format"
+        assert params[3].get("value") == "HHmmss"
+
+    def check_aste_report_action(self, action):
+        assert action.findtext("./type") == "FileStoreAction"
+        params = action.findall("./params/param")
+        assert params[0].get("name") == "to-folder"
+        assert params[0].get("value") == self.file_store
+        assert params[1].get("name") == "report-type"
+        assert params[1].get("value") == "ASTE_REPORT"
+        assert params[2].get("name") == "run-log"
+        assert params[2].get("value") == "true"
+        assert params[3].get("name") == "date-format"
+        assert params[3].get("value") == "yyyyMMdd"
+        assert params[4].get("name") == "time-format"
+        assert params[4].get("value") == "HHmmss"
+        
+    def check_diamonds_action(self, action):
+        assert action.findtext("./type") == "DiamondsAction"
+        assert not action.findall("./params/param")
+    
+    def test_files(self):
+        xml = self.generate_xml()
+        files = iter(xml.findall("./files/file"))
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx"
+        assert files.next().text == r"ATS3Drop" + os.sep + "TestAssets" + os.sep + "TestAsset.zip"
+        self.assertRaises(StopIteration, files.next)
+        
+    def test_generate_testasset_zip(self):
+        self.generate_xml()
+        if re.search(r"[.]zip", self.test_plan["testasset_location"]):
+            pass
+        else:
+            strbuffer = StringIO()
+            assert strbuffer == self.gen.generate_testasset_zip(self.test_plan, strbuffer)
+            zfile = zipfile.ZipFile(strbuffer, "r")
+            try:
+                contents = sorted(path(p).normpath() for p in zfile.namelist())
+                expected = sorted(path(p).normpath()
+                               for p in [(r"Localisation" + os.sep + "S60" + os.sep + "localisation.txt"),
+                                         (r"TestCases" + os.sep + "TC_100_Test0" + os.sep + "file1.sis"),
+                                         (r"TestCases" + os.sep + "TC_100_Test0" + os.sep + "file2.tcf"),
+                                         (r"Tools" + os.sep + "TestCaseCreator" + os.sep + "test_creator.ini"),
+                                         (r"testdrop.xml")])
+                diff = difflib.context_diff(expected, contents)
+                assert contents == expected, "\n".join(diff)
+            finally:
+                zfile.close()
+        
+    def test_generate_drop(self):
+        "Manifest for ATS3Drop directory structure is generated."
+        xml = self.generate_xml()
+        strbuffer = StringIO()
+
+        self.gen.generate_drop(self.test_plan, xml, strbuffer)
+        zfile = zipfile.ZipFile(strbuffer, "r")
+        try:
+            contents = sorted(path(p).normpath() for p in zfile.namelist())
+            expected = sorted(path(p).normpath()
+                           for p in [r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
+                                     r"ATS3Drop" + os.sep + "TestAssets" + os.sep + "TestAsset.zip",
+                                     r"test.xml"])
+            diff = difflib.context_diff(expected, contents)
+            assert contents == expected, "\n".join(diff)
+        finally:
+            zfile.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_ats4.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,1614 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================ 
+#Name        : test_ats4.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Testing ats4 framework. """
+# pylint: disable-msg=E1101
+#E1101 => Mocker shows mockery
+
+from cStringIO import StringIO
+from pprint import pprint
+from xml.etree.ElementTree import fromstring, tostring
+from xml.etree import ElementTree as et
+import difflib
+import logging
+logging.getLogger().setLevel(logging.ERROR)
+import tempfile
+import zipfile
+import os
+import re
+import subprocess
+
+from path import path
+import amara
+import mocker
+
+import ntpath
+
+import ats3
+import ats3.testconfigurator as atc
+import ats3.dropgenerator as adg
+import ats3.parsers as parser
+
+
+TEST_PATH = None
+TEST_FILES = {}
+TSRC = None
+OUTPUT = None
+
+# Shortcuts
+E = et.Element
+SE = et.SubElement
+
+class Bunch(object):
+    """ Configuration object. Argument from constructor are converted into class attributes. """
+    def __init__(self, **kwargs):
+        self.__dict__.update(kwargs)
+        
+def equal_xml(xml1, xml2):
+    """Check the equality of the given XML snippets.
+    
+    Tag name equality:
+    
+    >>> equal_xml('<a/>', '<a/>')
+    True
+    >>> equal_xml('<a/>', '<b/>')
+    False
+    
+    Attribute equality:
+    
+    >>> equal_xml('<a k="v"/>', '<a k="v"/>')
+    True
+    >>> equal_xml('<a k="v"/>', '<a k="w"/>')
+    False
+    
+    Text content equality:
+    
+    >>> equal_xml('<a>v</a>', '<a>v</a>')
+    True
+    >>> equal_xml('<a>v</a>', '<a>w</a>')
+    False
+    >>> equal_xml('<a>v</a>', '<a></a>')
+    False
+    
+    Text content equality when whitespace differs:
+    >>> equal_xml('<a>v</a>', '<a>v </a>')
+    True
+
+    Equality of child elements:
+    
+    >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="v"/></b></a>')
+    True
+    >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="w"/></b></a>')
+    False
+    >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>w</b></a>')
+    False
+    >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>v </b></a>')
+    True
+    
+    """
+    def __init__():
+        check_instance(xml1, xml2)
+    
+    def check_instance(xml1, xml2):
+        """if xml1 and xml2 are instances, converts to strings"""
+        if isinstance(xml1, basestring):
+            xml1 = fromstring(xml1)
+        if isinstance(xml2, basestring):
+            xml2 = fromstring(xml2)
+        check_tags(xml1, xml2)
+
+    def check_tags(xml1, xml2):
+        """check xml tags and text equality"""
+        if xml1.tag != xml2.tag:
+            return False
+        if xml1.attrib != xml2.attrib:
+            return False
+        if xml1.text:
+            if not xml2.text:
+                return False
+        if xml2.text:
+            if not xml1.text:
+                return False
+
+        produce_xml_children(xml1, xml2)
+
+    def produce_xml_children(xml1, xml2):
+        """checks if xml children are of same length and are equal?"""
+        if xml1.text and xml2.text and xml1.text.strip() != xml2.text.strip():
+            return False
+        if xml1.tail is not None and xml2.tail is not None:
+            if xml1.tail.strip() != xml2.tail.strip():
+                return False
+        elif xml1.tail != xml2.tail:
+            return False
+        
+        children1 = list(xml1.getchildren())
+        children2 = list(xml2.getchildren())
+        if len(children1) != len(children2):
+            return False
+        for child1, child2 in zip(children1, children2):
+            return equal_xml(child1, child2)
+    return True        
+
+
+def setup_module():
+    """ Setup test environment. """
+    global TEST_PATH, TSRC, OUTPUT
+    TEST_PATH = path(tempfile.mkdtemp())
+    OUTPUT = TEST_PATH.joinpath(r"output")
+    component = TEST_PATH
+    component.joinpath("group").makedirs()
+    for path_parts in (("tsrc", "group", "bld.inf"),
+                       ("tsrc", "group", "test.pkg"),
+                       ("tsrc", "testmodules", "file1.dll"),
+                       ("tsrc", "testmodules", "file2.dll"),
+                       ("tsrc", "data", "file1"),
+                       ("tsrc", "data", "file2"),
+                       ("tsrc", "data", "file3"),
+                       ("tsrc", "data", "mmc", "file4"),
+                       ("tsrc", "data", "c", "file5"),
+                       ("tsrc", "conf", "file1.cfg"),
+                       ("tsrc", "conf", "file2.cfg"),
+                       ("tsrc", "init", "TestFramework.ini"),
+                       ("tsrc", "custom", "prepostaction.xml"),
+                       ("tsrc", "custom", "postpostaction.xml"),
+                       # These do not have to be under 'tsrc':
+                       ("tsrc", "output", "images", "file1.fpsx"),
+                       ("tsrc", "output", "images", "file2.fpsx"),
+                       ("tsrc", "sis", "file1.sisx"),
+                       ("tsrc", "sis", "file2.sisx"),
+                       ("tsrc", "sis", "file3.sisx"),
+                       ("tsrc", "trace_init", "trace_activation_1.xml")):
+        filepath = component.joinpath(*path_parts)
+        if not filepath.parent.exists():
+            filepath.parent.makedirs()
+        filepath.touch()
+        TEST_FILES.setdefault(path_parts[1], []).append(filepath)
+    TSRC = component.joinpath("tsrc")
+    filepath = OUTPUT.joinpath("pmd", "pmd_file.pmd")
+    if not filepath.parent.exists():
+        filepath.parent.makedirs()
+    filepath.touch()
+    TEST_FILES.setdefault("pmd_file", []).append(filepath)
+    tracing = component.joinpath("tsrc", "trace_init")
+    root = E('ConfigurationFile')
+    confs = E("Configurations")
+    trace_act = SE(confs, "TraceActivation")
+    conf = SE(trace_act, "Configuration")
+    conf.set('Name', 'MCU')
+    mcu = SE(conf, "MCU")
+    sett = SE(mcu, "settings")
+    SE(sett, "timestamp")
+    root.append(confs)
+    ettree = et.ElementTree(root)
+    doc = amara.parse(et.tostring(ettree.getroot()))
+    handle = open(tracing.joinpath("trace_activation_1.xml"), "w")
+    handle.write(doc.xml(indent="yes"))
+    handle.close()
+#    tracing.writestr("trace_activation_1.xml", doc.xml(indent=u"yes"))
+    group = component.joinpath("tsrc", "group")
+    group.joinpath("bld.inf").write_text(
+        r"""
+        PRJ_TESTMMPFILES
+        stif.mmp /* xyz.mmp */ abcd.mmp
+        /*xyz.mmp*/
+        eunit.mmp /* xyz.mmp */
+        both.mmp
+        ..\sub-component\group\sub-component.mmp
+        """.replace('\\', os.sep))
+
+    group.joinpath("test.pkg").write_text(
+        r"""
+        ;Language - standard language definitions
+        &EN
+        
+        ; standard SIS file header
+        #{"BTEngTestApp"},(0x04DA27D5),1,0,0
+        
+        ;Supports Series 60 v 3.0
+        (0x101F7961), 0, 0, 0, {"Series60ProductID"}
+        
+        ;Localized Vendor Name
+        %{"BTEngTestApp"}
+        
+        ;Unique Vendor name
+        :"Nokia"
+        
+        ; Files to copy
+        "\tsrc\testmodules\file1.dll"-"c:\sys\bin\file1.dll"
+        "\tsrc\testmodules\file2.dll"-"c:\sys\bin\file2.dll"
+        "\tsrc\data\file1"-"e:\sys\bin\file1"
+        "\tsrc\data\file2"-"e:\sys\bin\file2"
+        "\tsrc\data\file3"-"e:\sys\bin\file3"
+        "\tsrc\conf\file1.cfg"-"!:\sys\bin\file1.cfg"
+        "\tsrc\conf\file2.cfg"-"!:\sys\bin\file2.cfg"
+        "\tsrc\init\TestFramework.ini"-"!:\sys\bin\TestFramework.ini"
+        "\tsrc\sis\file1.sisx"-"!:\sys\bin\file1.sisx"
+        "\tsrc\sis\file2.sisx"-"!:\sys\bin\file2.sisx"
+        """.replace('\\', os.sep))
+    group.joinpath("stif.mmp").write_text("LIBRARY stiftestinterface.lib")
+    group.joinpath("eunit.mmp").write_text("LIBRARY eunit.lib")
+    group.joinpath("both.mmp").write_text("LIBRARY stiftestinterface.lib eunit.lib")
+    init = component.joinpath("tsrc", "init")
+    
+    init.joinpath("TestFramework.ini").write_text(
+        r"""
+#     - Sets a device reset module's dll name(Reboot).
+#        + If Nokia specific reset module is not available or it is not correct one
+#          StifHWResetStub module may use as a template for user specific reset
+#          module. 
+
+[Engine_Defaults]
+
+TestReportMode= FullReport        # Possible values are: 'Empty', 'Summary', 'Environment',
+                                                               'TestCases' or 'FullReport'
+
+CreateTestReport= YES            # Possible values: YES or NO
+
+TestReportFilePath= C:\LOGS\TestFramework\
+TestReportFileName= TestReport
+
+TestReportFormat= TXT            # Possible values: TXT or HTML
+        
+        """)
+
+
+def teardown_module():
+    """ Cleanup environment after testing. """    
+    def __init__():
+        path(TEST_PATH).rmtree()
+
+# CTC related functions    
+def check_ctc_write(steps):
+    """Checks if CTC data is written on the CTC log"""
+    step = steps.next()
+    assert step.findtext("./type") == "NonTestExecuteTask"
+    params = step.findall("./parameters/parameter")
+    assert params[0].get("value") == "writelocal"
+    assert params[1].get("value") == path(r"z:\sys\bin\ctcman.exe")
+    step = steps.next()
+    assert step.findtext("./type") == "NonTestExecuteTask"
+    params = step.findall("./parameters/parameter")
+    assert params[0].get("value") == "writefile"
+    assert params[1].get("value") == path(r"z:\sys\bin\ctcman.exe")
+
+def check_ctc_log(steps, testtype=""):
+    """Fetches CTC Log"""
+    #For the ctcdata.txt to be published on the ATS network drive
+    step = steps.next()
+    assert step.findtext("./type") == "FileDownloadTask"
+    params = step.findall("./parameters/parameter")
+    #assert params[0].get("value") == "false"
+    assert params[0].get("value") == path(r"c:\data\ctc\ctcdata.txt")
+    if testtype == "withpkgfiles":
+        assert params[1].get("value") == r"\\10.0.0.1\ctc_helium\builds\drop0\set1\ctcdata"
+    else:
+        assert params[1].get("value") == r"\\10.0.0.1\ctc_helium\builds\drop0\set0\ctcdata"
+    
+    #For the ctcdata.txt to be published on the build network drive
+    step = steps.next()
+    assert step.findtext("./type") == "FileDownloadTask"
+    params = step.findall("./parameters/parameter")
+    #assert params[0].get("value") == "true"
+    assert params[0].get("value") == path(r"c:\data\ctc\ctcdata.txt")
+
+def check_ctc_start(steps):
+    """Checks if CTC starts in ATS"""
+    step = steps.next()
+    assert step.findtext("./type") == "CreateDirTask"
+    params = step.findall("./parameters/parameter")
+    assert params[0].get("value") == path(r"c:\data\ctc")
+    step = steps.next()
+    assert step.findtext("./type") == "NonTestExecuteTask"
+    params = step.findall("./parameters/parameter")
+    assert params[0].get("value") == path(r"z:\sys\bin\ctcman.exe")   
+
+def check_fetch_logs(steps, harness="STIF"):
+    """Checks fetching log directory is created"""
+    step = steps.next()
+    assert step.findtext("./type") == "FileDownloadTask"
+    params = step.findall("./parameters/parameter")
+    if harness == "STIF":
+        assert params[0].get("value") == path(r"c:\logs\testframework\*")  
+    else:
+        assert params[0].get("value") == path(r"c:\Shared\EUnit\logs\*")
+
+def check_diamonds_action(action):
+    """ Testing Diamonds action. """
+    assert action.findtext("./type") == "DiamondsAction"
+    assert not action.findall("./parameters/parameter") 
+
+def check_send_email_action(action, reportemail):
+    """verifies if sening email option works"""
+    assert action.findtext("./type") == "EmailAction"
+    params = action.findall("./parameters/parameter")
+    assert params[0].get("name") == "subject"
+    #assert params[0].get("value") == "email subject"
+    assert params[1].get("name") == "to"
+    assert params[1].get("value") == reportemail
+    
+def check_ctc_run_process_action(action):
+    """verifies if CTC run process action works"""
+    #The parameters for this test are intended to execute on a windows machine
+    assert action.findtext("./type") == "RunProcessAction"
+    params = action.findall("./parameters/parameter")
+    assert params[0].get("name") == "file"
+    assert params[0].get("value") == "catsctc2html/catsctc2html.exe"
+    assert params[1].get("name") == "parameters"
+    assert params[1].get("value") == r"--ctcdata_files=\\10.0.0.1\ctc_helium\1234\drop0\set0\ctcdata --monsym_files=\\10.0.0.1\ctc_helium\1234\mon_syms\1\MON.sym --diamonds_build_id=1234 --drop_id=0 --total_amount_of_drops=1"
+
+def check_ats_report_action(action, filestore):
+    """verifies if sening ATS report option works"""
+    assert action.findtext("./type") == "FileStoreAction"
+    params = action.findall("./parameters/parameter")
+    assert params[0].get("name") == "to-folder"
+    assert params[0].get("value") == filestore
+    assert params[1].get("name") == "report-type"
+    assert params[1].get("value") == "ATS_REPORT"
+    assert params[2].get("name") == "date-format"
+    assert params[2].get("value") == "yyyyMMdd"
+    assert params[3].get("name") == "time-format"
+    assert params[3].get("value") == "HHmmss"
+
+def check_stif_report_action(action, filestore):
+    """verifies if sening STIF report option works"""
+    assert action.findtext("./type") == "FileStoreAction"
+    params = action.findall("./parameters/parameter")
+    assert params[0].get("name") == "to-folder"
+    assert params[0].get("value") == filestore
+    assert params[1].get("name") == "report-type"
+    assert params[1].get("value") == "STIF_COMPONENT_REPORT_ALL_CASES"
+    assert params[2].get("name") == "run-log"
+    assert params[2].get("value") == "true"
+    assert params[3].get("name") == "date-format"
+    assert params[3].get("value") == "yyyyMMdd"
+    assert params[4].get("name") == "time-format"
+    assert params[4].get("value") == "HHmmss"
+
+def check_log_dir(steps):
+    """ Test the log dir. """
+    step = steps.next()
+    assert step.findtext("./type") == "CreateDirTask"
+
+def check_trace_start(steps, filestore):
+    """Checks if tracing is started on the ATS"""
+    step = steps.next()
+    assert step.findtext("./type") == "trace-start"
+    params = step.findall("./parameters/parameter")
+    assert params[0].get("value") == path(r"ATS3Drop\set0\trace_activation\trace_activation_1.xml")
+    assert params[1].get("value") == "MCU"
+    assert params[2].get("value") == path(r"ATS3Drop\pmds\pmd_file.pmd")
+    assert params[3].get("value") == filestore.joinpath("traces", "set0", "tracelog.blx")
+    assert params[4].get("value") == "60"
+    assert params[5].get("value") == "yyyyMMdd"
+    assert params[6].get("value") == "HHmmss"
+    
+def check_trace_end_steps(steps, filestore):
+    """ Test trace end step. """
+    step = steps.next()
+    assert step.findtext("./type") == "trace-stop"
+    params = step.findall("./parameters/parameter")
+    assert params[0].get("value") == "60"
+    step = steps.next()
+    assert step.findtext("./type") == "trace-convert"
+    params = step.findall("./parameters/parameter")
+    assert params[0].get("value") == path(r"ATS3Drop\pmds\pmd_file.pmd")
+    assert params[1].get("value") == filestore.joinpath("traces", "set0", "tracelog.blx")
+    assert params[2].get("value") == "60"
+    assert params[3].get("value") == "yyyyMMdd"
+    assert params[4].get("value") == "HHmmss"
+
+class TestTestPlan(mocker.MockerTestCase):
+    """Creates TestPlan mocker setup"""
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)  
+          
+    def setUp(self):
+        """ Setup TestTestPlan testsuite. """
+        opts = Bunch(testrun_name="testrun", harness="STIF", 
+                     device_type="product", plan_name="ats3_test_plan",
+                     diamonds_build_url="", report_email="", file_store=path(), test_timeout="60",
+                     device_hwid="5425", trace_enabled="True", ctc_enabled="True", eunitexerunner_flags="/E S60AppEnv /R Off", 
+                     multiset_enabled=False, ctc_run_process_params=r"10.0.0.1#x:\ats\drop0.zip#1", monsym_files="")
+        self.atp = ats3.Ats3TestPlan(opts)
+        self.config_files = TEST_FILES["conf"]
+        self.data_files = TEST_FILES["data"]
+        self.engine_ini_file = TEST_FILES["init"][0]
+        self.image_files = TEST_FILES["output"]
+        self.sis_files = TEST_FILES["sis"]
+        self.testmodule_files = TEST_FILES["testmodules"]
+        self.ctc_enabled = self.atp["ctc_enabled"]
+        self.custom_dir = "CustomD"
+        self.eunitexerunner_flags = self.atp["eunitexerunner_flags"]
+        if self.atp["trace_enabled"].lower() == "true":
+            self.trace_activation_files = TEST_FILES["trace_init"]    
+            self.pmd_files = TEST_FILES["pmd_file"]
+        else:
+            self.trace_activation_files = []    
+            self.pmd_files = []
+        self.test_timeout = self.atp["test_timeout"]
+        self.eunitexerunner_flags = self.atp["eunitexerunner_flags"]
+        self.device_hwid = self.atp["device_hwid"]
+        self.test_harness = self.atp["harness"]
+        self.src_dst = [("" + os.sep + "tsrc" + os.sep + "testmodules" + os.sep + "file1.dll", "c:\sys\bin\file1.dll", "testmodule"),
+            ("" + os.sep + "tsrc" + os.sep + "testmodules" + os.sep + "file2.dll", "c:\sys\bin\file2.dll", "testmodule"),
+            ("" + os.sep + "tsrc" + os.sep + "data" + os.sep + "file1", "e:\sys\bin\file1", "data"),
+            ("" + os.sep + "tsrc" + os.sep + "data" + os.sep + "file2", "e:\sys\bin\file2", "data"),
+            ("" + os.sep + "tsrc" + os.sep + "data" + os.sep + "file3", "e:\sys\bin\file3", "data"),
+            ("" + os.sep + "tsrc" + os.sep + "conf" + os.sep + "file1.cfg", "c:\sys\bin\file1.cfg", "conf"),
+            ("" + os.sep + "tsrc" + os.sep + "conf" + os.sep + "file2.cfg", "c:\sys\bin\file2.cfg", "conf"),
+            ("" + os.sep + "tsrc" + os.sep + "init" + os.sep + "TestFramework.ini", "c:\sys\bin\TestFramework.ini", "engine_ini"),
+            ("" + os.sep + "tsrc" + os.sep + "sis" + os.sep + "file1.sisx", "c:\sys\bin\file1.sisx", ""),
+            ("" + os.sep + "tsrc" + os.sep + "sis" + os.sep + "file2.sisx", "c:\sys\bin\file2.sisx", ""),]
+        self.component_path = str(TEST_PATH.joinpath("tsrc", "group"))
+
+    def test_creation(self):
+        """ Testing creation. """        
+        assert self.atp["testrun_name"] == "testrun"
+        assert self.atp["harness"] == "STIF"
+        assert self.atp["device_type"] == "product"
+    
+    def test_insert_set(self):
+        """ Inserting a set of file. """        
+        self.atp.insert_set(data_files=self.data_files,
+                           config_files=self.config_files,
+                           engine_ini_file=self.engine_ini_file,
+                           image_files=self.image_files,
+                           testmodule_files=self.testmodule_files,
+                           test_timeout=self.test_timeout,
+                           eunitexerunner_flags=self.eunitexerunner_flags,
+                           pmd_files=self.pmd_files,                            
+                           trace_activation_files=self.trace_activation_files,
+                           component_path=self.component_path)
+        self.atp.insert_set(image_files=self.image_files,                           
+                           engine_ini_file=self.engine_ini_file,
+                           sis_files=self.sis_files,
+                           test_timeout=self.test_timeout,
+                           eunitexerunner_flags=self.eunitexerunner_flags,
+                           pmd_files=self.pmd_files,                            
+                           trace_activation_files=self.trace_activation_files,
+                           component_path=self.component_path)
+        self.atp.insert_set(data_files=self.data_files,
+                           config_files=self.config_files,
+                           engine_ini_file=self.engine_ini_file,
+                           image_files=self.image_files,
+                           testmodule_files=self.testmodule_files,
+                           test_timeout=self.test_timeout,
+                           eunitexerunner_flags=self.eunitexerunner_flags,
+                           src_dst=self.src_dst,
+                           pmd_files=self.pmd_files,                            
+                           trace_activation_files=self.trace_activation_files,
+                           component_path=self.component_path)
+        self.atp.insert_set(engine_ini_file=self.engine_ini_file,
+                           test_timeout=self.test_timeout,
+                           eunitexerunner_flags=self.eunitexerunner_flags,
+                           image_files=self.image_files,
+                           test_harness=self.test_harness,
+                           src_dst=self.src_dst,
+                           pmd_files=self.pmd_files,                            
+                           trace_activation_files=self.trace_activation_files,
+                           component_path=self.component_path)
+        self.atp.insert_set(test_timeout=self.test_timeout,      
+                           eunitexerunner_flags=self.eunitexerunner_flags,               
+                           image_files=self.image_files,                        
+                           test_harness=self.test_harness,                      
+                           src_dst=self.src_dst,                                
+                           pmd_files=self.pmd_files,                            
+                           trace_activation_files=self.trace_activation_files,
+                           component_path=self.component_path)  
+
+        assert self.atp.sets[0] == dict(name="set0",
+                                       data_files=self.data_files,
+                                       config_files=self.config_files,
+                                       engine_ini_file=self.engine_ini_file,
+                                       image_files=self.image_files,
+                                       testmodule_files=self.testmodule_files,
+                                       test_timeout=self.test_timeout,
+                                       eunitexerunner_flags=self.eunitexerunner_flags,
+                                       test_harness=self.test_harness,
+                                       src_dst=[],
+                                       pmd_files=self.pmd_files,
+                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set0", "tracelog.blx"),
+                                       trace_activation_files=self.trace_activation_files,
+                                       ctc_enabled=self.atp["ctc_enabled"],
+                                       custom_dir=None,
+                                       component_path=self.component_path)
+        assert self.atp.sets[1] == dict(name="set1",
+                                       image_files=self.image_files,
+                                       engine_ini_file=self.engine_ini_file,
+                                       sis_files=self.sis_files,
+                                       test_timeout=self.test_timeout,
+                                       eunitexerunner_flags=self.eunitexerunner_flags,
+                                       test_harness=self.test_harness,
+                                       pmd_files=self.pmd_files,
+                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set1", "tracelog.blx"),
+                                       trace_activation_files=self.trace_activation_files,
+                                       ctc_enabled=self.atp["ctc_enabled"],
+                                       custom_dir=None,
+                                       component_path=self.component_path)
+
+        assert self.atp.sets[2] == dict(name="set2",
+                                       data_files=self.data_files,
+                                       config_files=self.config_files,
+                                       engine_ini_file=self.engine_ini_file,
+                                       image_files=self.image_files,
+                                       testmodule_files=self.testmodule_files,
+                                       test_timeout=self.test_timeout,
+                                       eunitexerunner_flags=self.eunitexerunner_flags,
+                                       test_harness=self.test_harness,
+                                       src_dst=self.src_dst,
+                                       pmd_files=self.pmd_files,
+                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set2", "tracelog.blx"),
+                                       trace_activation_files=self.trace_activation_files,
+                                       ctc_enabled=self.atp["ctc_enabled"],
+                                       custom_dir=None,
+                                       component_path=self.component_path)
+        assert self.atp.sets[3] == dict(name="set3",
+                                       data_files=[],
+                                       config_files=[],
+                                       engine_ini_file=self.engine_ini_file,
+                                       image_files=self.image_files,
+                                       testmodule_files=[],
+                                       test_timeout=self.test_timeout,
+                                       eunitexerunner_flags=self.eunitexerunner_flags,
+                                       test_harness=self.test_harness,
+                                       src_dst=self.src_dst,
+                                       pmd_files=self.pmd_files,
+                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set3", "tracelog.blx"),
+                                       trace_activation_files=self.trace_activation_files,
+                                       ctc_enabled=self.atp["ctc_enabled"],
+                                       custom_dir=None,
+                                       component_path=self.component_path)
+
+        assert self.atp.sets[4] == dict(name="set4",
+                                       data_files=[],
+                                       config_files=[],
+                                       engine_ini_file=None,
+                                       image_files=self.image_files,
+                                       testmodule_files=[],
+                                       test_timeout=self.test_timeout,
+                                       eunitexerunner_flags=self.eunitexerunner_flags,
+                                       test_harness=self.test_harness,
+                                       src_dst=self.src_dst,
+                                       pmd_files=self.pmd_files,
+                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set4", "tracelog.blx"),
+                                       trace_activation_files=self.trace_activation_files,
+                                       ctc_enabled=self.atp["ctc_enabled"],
+                                       custom_dir=None,
+                                       component_path=self.component_path)
+        
+    def test_post_actions_email(self):
+        """ Testing the send email post-action. """        
+        assert not self.atp.post_actions
+        receiver = "joe.average@example.com"
+        self.atp.report_email = receiver
+        assert len(self.atp.post_actions) == 1
+        action, items = self.atp.post_actions[0]
+        items = dict(items)
+        #assert action == "EmailAction"
+        assert items["to"] == receiver
+    
+    def test_post_actions_ats4_report_only(self):
+        """ Testing the ats4 report only post-action. """        
+        file_store = path("path/to/files")
+        self.atp.file_store = file_store
+        self.atp.harness = "EUNIT"
+        assert len(self.atp.post_actions) == 2
+        action, items = self.atp.post_actions[0]
+        items = dict(items)
+        assert action == "FileStoreAction"
+        assert items["report-type"] == "ATS3_REPORT"
+        assert items["to-folder"].startswith(file_store)
+        assert items["to-folder"].endswith("ATS3_REPORT")
+    
+    def test_post_actions_stif(self):
+        """ Testing STIF post-actions. """        
+        file_store = path("path/to/files")
+        self.atp.file_store = file_store
+        assert len(self.atp.post_actions) == 2
+        action, items = self.atp.post_actions[1]
+        items = dict(items)
+        assert action == "FileStoreAction"
+        assert items["report-type"] == "STIF_COMPONENT_REPORT_ALL_CASES"
+        assert items["to-folder"].startswith(file_store)
+        assert items["to-folder"].endswith("STIF_REPORT")
+        
+    def test_post_actions_diamonds(self):
+        """ Testing Diamonds post-actions. """        
+        self.atp.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        assert len(self.atp.post_actions) == 1
+        action, items = self.atp.post_actions[0]
+        assert action == "DiamondsAction"
+        assert not items
+
+
+class TestComponentParser(mocker.MockerTestCase):
+    """ Testing the Ats3ComponentParser component parser. """
+    
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+    
+    def assert_paths(self, path1, path2):
+        """ Checking the path. Validates that path1 and path2 are instance of path and they are equals. """
+        if not isinstance(path1, path):
+            path1 = path(path1)
+        if not isinstance(path2, path):
+            path2 = path(path2)            
+        return self.assertEqual(path1.normpath(), path2.normpath())
+    
+    def setUp(self):
+        """ Setting up TestComponentParser testsuite."""
+        opts = Bunch(build_drive=path(TEST_PATH+os.sep), target_platform="target platform", eunitexerunner_flags="/E S60AppEnv /R Off",
+                     data_dir=["data"], flash_images=[], sis_files=[], test_timeout="60", harness="STIF", trace_enabled="True")
+        self.acp = atc.Ats3ComponentParser(opts)
+        self.acp.tsrc_dir = TSRC
+      
+    def test_detect_dlls(self):
+        """ Testing dlls detection. """
+        # Setup mock objects.
+        process = self.mocker.mock()
+        process.communicate()
+        self.mocker.result(["lib1.dll\npath/to/another/library.dll\nsome/other/file.txt\nlib2.dll\nlib3.dll\n"])
+        obj = self.mocker.replace("subprocess.Popen")
+        obj("abld -w test build target platform", shell=True, stdout=subprocess.PIPE)
+        self.mocker.result(process)
+        
+        exists = self.mocker.replace("os.path.exists")
+        exists()
+        self.mocker.result(True)
+        exists()
+        self.mocker.result(True)
+        exists()
+        self.mocker.result(True)
+        exists()
+        self.mocker.result(False)
+        
+        self.mocker.replay()
+        
+        self.assertEqual([u"lib1.dll", u"library.dll", u"lib2.dll"],
+                         [dll.name for dll in self.acp.tsrc_dll_files()])
+
+    def test_harness(self):
+        """ Detect test harness."""
+        mmp_parser = parser.MmpFileParser()
+        group = TSRC.joinpath("group")
+        for harness, mmp in [
+            ("STIF", group / "stif.mmp"),
+            ("EUNIT", group / "eunit.mmp"),
+            ("STIF", group / "both.mmp"),
+            ]:
+            self.assertEqual(harness, mmp_parser.get_harness(mmp))
+
+class TestXMLGeneration(mocker.MockerTestCase):
+    """
+    Unit tests for the test.xml generation.
+    """
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+        self.data_files = None
+        self.config_files = None
+        self.testmodule_files = None
+        self.image_files = None
+        self.engine_ini_file = None
+        self.report_email = None
+        self.file_store = None
+        self.diamonds_build_url = None
+        self.test_harness = None     
+        self.src_dst = []
+        self.trace_enabled = None
+        self.pmd_files = None
+        self.trace_activation_files = None
+        self.ctc_enabled = None
+        self.eunitexerunner_flags = None
+        self.test_plan = None
+        self.gen = None
+        self.custom_dir = None
+            
+    def generate_xml(self, trace_enabled="False"):
+        """ Generating the XML. """
+        def files(*paths):
+            """creating tsrc path list"""
+            return [TEST_PATH.joinpath("tsrc", tpath) for tpath in paths]
+        self.testmodule_files = files("testmodules/file1.dll", "testmodules/file2.dll")
+        self.data_files = files("data/file1", "data/file2", "data/file3")
+        self.config_files = files("conf/file1.cfg", "conf/file2.cfg")
+        self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
+        self.engine_ini_file = files("init/TestFramework.ini")[0]
+        self.report_email = "test.receiver@company.com"
+        self.file_store = path(r"path/to/reports")
+        self.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        self.test_harness = "STIF"        
+        self.src_dst = []
+        self.trace_enabled = trace_enabled
+        self.pmd_files = TEST_FILES["pmd_file"]
+        self.trace_activation_files = files("trace_init/trace_activation_1.xml")
+        self.ctc_enabled = "True"
+        self.eunitexerunner_flags = "/E S60AppEnv /R Off"
+        self.custom_dir = "CustomB"
+        self.component_path = str(TEST_PATH.joinpath("tsrc", "group"))
+        self.ctc_run_process_params = r"10.0.0.1#x:\ats\drop0.zip#1"
+        
+        self.ctc_network = self.ctc_run_process_params.rsplit("#", 2)[0]
+        self.drop_id = re.findall(".*drop(\d*).zip.*", self.ctc_run_process_params.lower())[0] #extracting int part of drop name
+        self.drop_count = self.ctc_run_process_params.rsplit("#", 1)[1]
+        self.diamonds_id = self.diamonds_build_url.rsplit(r"/", 1)[1]
+
+        self.mocker.restore()
+        test_plan = self.mocker.mock(count=False)
+        mocker.expect(test_plan["testrun_name"]).result("test")
+        mocker.expect(test_plan["harness"]).result("STIF")
+        mocker.expect(test_plan["device_type"]).result("product")
+        mocker.expect(test_plan["plan_name"]).result("test plan")
+        mocker.expect(test_plan["diamonds_build_url"]).result(self.diamonds_build_url)
+        mocker.expect(test_plan["test_timeout"]).result("60")
+        mocker.expect(test_plan["eunitexerunner_flags"]).result("/E S60AppEnv /R Off")
+        mocker.expect(test_plan["device_hwid"]).result("5425")
+        mocker.expect(test_plan["custom_dir"]).result("custom")
+        mocker.expect(test_plan.custom_dir).result(path(r"self.custom_dir"))
+        mocker.expect(test_plan["report_email"]).result(self.report_email)
+        mocker.expect(test_plan["ctc_run_process_params"]).result(self.ctc_run_process_params)
+                
+        if self.trace_enabled.lower() == "true":
+            mocker.expect(test_plan["trace_enabled"]).result("True")
+        else:
+            mocker.expect(test_plan["trace_enabled"]).result("False")
+        if self.trace_enabled == "False":
+            mocker.expect(test_plan.sets).result([
+                dict(name="set0", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness="STIF", src_dst=self.src_dst,
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir=self.custom_dir, component_path=self.component_path),
+                dict(name="set1", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file,test_harness="STIF", src_dst=self.src_dst,
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir=self.custom_dir, component_path=self.component_path),
+            ])
+        elif self.trace_enabled == "True":
+            mocker.expect(test_plan.sets).result([
+                dict(name="set0", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness="STIF", src_dst=self.src_dst,
+                     pmd_files=self.pmd_files, trace_activation_files=self.trace_activation_files,
+                     trace_path=self.file_store.joinpath("traces", "set0", "tracelog.blx"),
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags, component_path=self.component_path),
+                dict(name="set1", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file,test_harness="STIF", src_dst=self.src_dst,
+                     pmd_files=self.pmd_files, trace_activation_files=self.trace_activation_files,
+                     trace_path=self.file_store.joinpath("traces", "set1", "tracelog.blx"),
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags, component_path=self.component_path),
+            ])
+
+        ctc_file_name = "catsctc2html/catsctc2html.exe"
+        ctc_data_path = str(os.path.normpath(r"\\%s\ctc_helium\%s\drop0\set0\ctcdata" % (self.ctc_network, self.diamonds_id)))
+        mon_files = str(os.path.normpath(r"\\%s\ctc_helium\%s\mon_syms\1\MON.sym" % (self.ctc_network, self.diamonds_id)))
+        self.ctc_test_data = [ctc_file_name, self.ctc_network, self.drop_id, self.drop_count, self.diamonds_id, ctc_data_path, mon_files] 
+        
+        mocker.expect(test_plan.post_actions).result([
+            ("RunProcessAction", (("file", ctc_file_name ),
+                                  ("parameters", r"--ctcdata_files=" + ctc_data_path + " --monsym_files=" + mon_files + " --diamonds_build_id=" + self.diamonds_id + " --drop_id=" + self.drop_id + " --total_amount_of_drops=" + self.drop_count ))),
+            ("EmailAction", (("subject", "Release testing"),
+                                 ("to", self.report_email))),
+#            ("FileStoreAction", (("to-folder", self.file_store),
+#                                 ("report-type", "ATS_REPORT"),
+#                                 ("date-format", "yyyyMMdd"),
+#                                 ("time-format", "HHmmss"))),
+#            ("FileStoreAction", (("to-folder", self.file_store),
+#                                 ("report-type", "STIF_COMPONENT_REPORT_ALL_CASES"),
+#                                 ("run-log", "true"),
+#                                 ("date-format", "yyyyMMdd"),
+#                                 ("time-format", "HHmmss"))),
+            ("DiamondsAction", ())
+        ])
+        
+        self.mocker.replay()
+        self.test_plan = test_plan
+        
+        self.gen = adg.Ats3TemplateTestDropGenerator()
+        return self.gen.generate_xml(test_plan)
+
+    def test_basic_structure(self):
+        """ Check that the overall test.xml structure is valid. """
+        xml = self.generate_xml()
+        # Check basics.
+#        assert xml.find(".").tag == "test"
+#        assert xml.find("./name").text == "test"
+#        assert xml.find("./buildid").text == self.diamonds_build_url
+#        assert xml.find("./target").tag
+#        assert xml.find("./target/device").tag
+#        harness, type_, device_hwid = xml.findall("./target/device/property")
+#        assert harness.get("value") == "STIF"
+#        assert type_.get("value") == "product"
+#        assert device_hwid.get("value") == "5425"
+#        
+#        # Check generation of the test plan.
+#        assert xml.find("./plan").get("name") == "test Plan"
+#        assert xml.find("./plan/session").tag 
+#        sets = xml.findall("./execution")
+#        assert len(sets) == 2
+#        assert sets[0].get("name") == "set0-"+str(TEST_PATH.joinpath("tsrc", "group"))
+#        assert sets[0].find("./target/device").tag
+    
+    def test_set_structure(self):
+        """ Check that a <set> element's structure is valid. """
+        xml = self.generate_xml()
+        tstset = xml.find("./execution")
+        assert tstset.tag
+        
+    def test_case_flash_elems(self):
+        """ Test case flash elems. """
+        xml = self.generate_xml()
+        found = False
+        for case in xml.findall(".//task"):
+            if case.find('type').text == 'FlashTask':
+                found = True
+                flashes = case.findall("./parameters/parameter")
+                assert len(flashes) == len(self.image_files)
+                for i, flash_file in enumerate(self.image_files):
+                    assert flashes[i].get("name") == "image-" + str(i + 1)
+                    assert flashes[i].get("value") == "ATS3Drop\\images\\" + flash_file.name
+        assert found
+        
+    def test_case_steps(self):
+        """ Test case steps. """
+        xml = self.generate_xml()
+        steps = iter(xml.findall(".//task"))
+        steps.next() # Flash images
+        check_ctc_start(steps)
+        check_log_dir(steps)
+        self.check_install_data(steps)
+        self.check_install_configuration(steps)
+        self.check_install_tmodules(steps)
+        self.check_install_engine_ini(steps)
+        self.check_run_cases(steps)
+        check_ctc_write(steps)
+        check_ctc_log(steps)
+        check_fetch_logs(steps)
+
+    def check_install_data(self, steps):
+        """ Test install data. """
+        for filename in self.data_files:
+            step = steps.next()
+            assert step.findtext("./type") == "FileUploadTask"
+            params = step.findall("./parameters/parameter")            
+            src = params[0].get("value")
+            assert ntpath.basename(src) == ntpath.basename(filename)
+            assert ntpath.dirname(src) == "ATS3Drop\\set0\\data"
+            dst = params[1].get("value")
+            assert ntpath.basename(dst) == ntpath.basename(filename)
+            assert ntpath.dirname(dst) == r"e:\testing\data"
+    
+    def check_install_configuration(self, steps):
+        """ Test install configuration. """
+        for filepath in self.config_files:
+            step = steps.next()
+            assert step.findtext("./type") == "FileUploadTask"
+            params = step.findall("./parameters/parameter")
+            assert params[0].get("value") == "ATS3Drop\\set0\\conf\\" + ntpath.basename(filepath)
+            assert params[1].get("value") == "e:\\testing\\conf\\" + ntpath.basename(filepath)
+
+    def check_install_tmodules(self, steps):
+        """ Test install tmodules. """
+        for filepath in self.testmodule_files:
+            step = steps.next()
+            assert step.findtext("./type") == "FileUploadTask"
+            params = step.findall("./parameters/parameter")
+            assert params[0].get("value") == "ATS3Drop\\set0\\testmodules\\" + ntpath.basename(filepath)
+            assert params[1].get("value") == "c:\\sys\\bin\\" + ntpath.basename(filepath)
+    
+    def check_install_engine_ini(self, steps):
+        """ Test install engine ini. """
+        filepath = self.engine_ini_file
+        step = steps.next()
+        assert step.findtext("./type") == "FileUploadTask"
+        params = step.findall("./parameters/parameter")
+        assert params[0].get("value") == "ATS3Drop\\set0\\init\\" + ntpath.basename(filepath)
+        assert params[1].get("value") == "c:\\testframework\\" + ntpath.basename(filepath)
+    
+    def check_run_cases(self, steps):
+        """ Test run cases. """
+        step = steps.next()
+        filepath = self.engine_ini_file
+        assert step.findtext("./type") == "StifRunCasesTask"
+        params = step.findall("./parameters/parameter")
+        assert params[0].get("value") == "*"
+        assert params[1].get("value") == "60"
+        assert params[2].get("value") == "c:\\testframework\\" + ntpath.basename(self.engine_ini_file)
+
+    def test_steps_trace_enabled(self):
+        """ Test steps trace enabled. """
+        xml = self.generate_xml(trace_enabled="True")
+        steps = iter(xml.findall(".//task"))
+        steps.next() # Flash images
+        check_ctc_start(steps)
+        check_log_dir(steps)
+        self.check_install_data(steps)
+        self.check_install_configuration(steps)
+        self.check_install_tmodules(steps)
+        self.check_install_engine_ini(steps)
+        #check_trace_start(steps, self.file_store)
+        self.check_run_cases(steps)
+        #check_trace_end_steps(steps, self.file_store)
+        check_ctc_write(steps)
+        check_ctc_log(steps)
+        check_fetch_logs(steps) 
+    
+    def test_post_actions(self):
+        """ Post actions are inserted into XML. """
+        xml = self.generate_xml()        
+        post_actions = xml.findall(".//action")
+        check_ctc_run_process_action(post_actions[0])
+        check_send_email_action(post_actions[1], self.report_email)
+        #check_ats_report_action(post_actions[2], self.file_store)
+        #check_stif_report_action(post_actions[3], self.file_store)
+        check_diamonds_action(post_actions[2])
+    
+#    def test_files(self):
+#        """ Testing files. """
+#        xml = self.generate_xml()
+#        files = iter(xml.findall("./files/file"))
+#        assert files.next().text == r"ATS3Drop/images/file1.fpsx"
+#        assert files.next().text == r"ATS3Drop/images/file2.fpsx"
+#        assert files.next().text == r"ATS3Drop/set0/data/file1"
+#        assert files.next().text == r"ATS3Drop/set0/data/file2"
+#        assert files.next().text == r"ATS3Drop/set0/data/file3"
+#        assert files.next().text == r"ATS3Drop/set0/conf/file1.cfg"
+#        assert files.next().text == r"ATS3Drop/set0/conf/file2.cfg"
+#        assert files.next().text == r"ATS3Drop/set0/testmodules/file1.dll"
+#        assert files.next().text == r"ATS3Drop/set0/testmodules/file2.dll"
+#        assert files.next().text == r"ATS3Drop/set0/init/TestFramework.ini"        
+#        assert files.next().text == r"ATS3Drop/set1/data/file1"
+#        assert files.next().text == r"ATS3Drop/set1/data/file2"
+#        assert files.next().text == r"ATS3Drop/set1/data/file3"
+#        assert files.next().text == r"ATS3Drop/set1/conf/file1.cfg"
+#        assert files.next().text == r"ATS3Drop/set1/conf/file2.cfg"
+#        assert files.next().text == r"ATS3Drop/set1/testmodules/file1.dll"
+#        assert files.next().text == r"ATS3Drop/set1/testmodules/file2.dll"
+#        assert files.next().text == r"ATS3Drop/set1/init/TestFramework.ini"        
+#        self.assertRaises(StopIteration, files.next)
+#        xml = self.generate_xml(trace_enabled="True")
+#        files = iter(xml.findall("./files/file"))
+#        assert files.next().text == r"ATS3Drop/images/file1.fpsx"
+#        assert files.next().text == r"ATS3Drop/images/file2.fpsx"
+#        assert files.next().text == r"ATS3Drop/pmds/pmd_file.pmd"
+#        assert files.next().text == r"ATS3Drop/set0/data/file1"
+#        assert files.next().text == r"ATS3Drop/set0/data/file2"
+#        assert files.next().text == r"ATS3Drop/set0/data/file3"
+#        assert files.next().text == r"ATS3Drop/set0/conf/file1.cfg"
+#        assert files.next().text == r"ATS3Drop/set0/conf/file2.cfg"
+#        assert files.next().text == r"ATS3Drop/set0/testmodules/file1.dll"
+#        assert files.next().text == r"ATS3Drop/set0/testmodules/file2.dll"
+#        assert files.next().text == r"ATS3Drop/set0/init/TestFramework.ini"
+#        assert files.next().text == r"ATS3Drop/set0/trace_init/trace_activation_1.xml"
+#        assert files.next().text == r"ATS3Drop/set1/data/file1"
+#        assert files.next().text == r"ATS3Drop/set1/data/file2"
+#        assert files.next().text == r"ATS3Drop/set1/data/file3"
+#        assert files.next().text == r"ATS3Drop/set1/conf/file1.cfg"
+#        assert files.next().text == r"ATS3Drop/set1/conf/file2.cfg"
+#        assert files.next().text == r"ATS3Drop/set1/testmodules/file1.dll"
+#        assert files.next().text == r"ATS3Drop/set1/testmodules/file2.dll"
+#        assert files.next().text == r"ATS3Drop/set1/init/TestFramework.ini"
+#        assert files.next().text == r"ATS3Drop/set1/trace_init/trace_activation_1.xml"        
+#        self.assertRaises(StopIteration, files.next)
+        
+    def test_generate_drop(self):
+        """ Manifest for ATS3Drop directory structure is generated. """
+        xml = self.generate_xml()
+        strbuffer = StringIO()
+        
+        self.gen.generate_drop(self.test_plan, xml, strbuffer)
+        zfile = zipfile.ZipFile(strbuffer, "r")
+        try:
+            contents = sorted(path(tpath).normpath() for tpath in zfile.namelist())
+            expected = sorted(path(tpath).normpath()
+                           for tpath in [r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "init" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file2.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "init" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file2.dll",
+                                     r"test.xml"])
+            diff = difflib.context_diff(expected, contents)
+            assert contents == expected, "\n".join(diff)
+        finally:
+            zfile.close()
+
+    def test_generate_drop_trace (self):
+        "Manifest for ATS3Drop directory structure is generated when trace enabled."
+        xml = self.generate_xml(trace_enabled="True")
+        strbuffer = StringIO()
+        
+        self.gen.generate_drop(self.test_plan, xml, strbuffer)
+        zfile = zipfile.ZipFile(strbuffer, "r")
+        try:
+            contents = sorted(path(tpath).normpath() for tpath in zfile.namelist())
+            expected = sorted(path(tpath).normpath()
+                           for tpath in [r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "init" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file2.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file1.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file2.cfg",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file1",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file2",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file3",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "init" + os.sep + "TestFramework.ini",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file1.dll",
+                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file2.dll",
+                                     r"test.xml"])
+            diff = difflib.context_diff(expected, contents)
+            assert contents == expected, "\n".join(diff)
+        finally:
+            zfile.close()
+
+
+class TestXMLGenerationWithPKG(mocker.MockerTestCase):
+    """
+    Unit tests for the test.xml generation.
+    """
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+        self.src_dst1 = []
+        self.data_files = None
+        self.config_files = None
+        self.testmodule_files = None
+        self.image_files = None
+        self.engine_ini_file = None
+        self.report_email = None
+        self.file_store = None
+        self.diamonds_build_url = None
+        self.trace_enabled = None
+        self.pmd_files = None
+        self.trace_activation_files = None
+        self.ctc_enabled = None
+        self.eunitexerunner_flags = None
+        self.test_plan = None
+        self.gen = None
+        self.src_dst0 = []
+        self.custom_dir = None
+        
+    def generate_xml(self, harness, trace_enabled="False"):
+        """Generates XML"""
+        def files(*paths):
+            """generates paths for the files"""
+            return [TEST_PATH.joinpath("tsrc", tpath) for tpath in paths]
+        self.src_dst1 = []
+        self.data_files = files("data/file1", "data/file2", "data/file3")
+        self.config_files = files("conf/file1.cfg", "conf/file2.cfg")
+        self.testmodule_files = files("testmodules/file1.dll", "testmodules/file2.dll")
+        self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
+        self.engine_ini_file = files("init/TestFramework.ini")[0]
+        self.report_email = "test.receiver@company.com"
+        self.file_store = path("path/to/reports")
+        self.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        self.trace_enabled = trace_enabled
+        self.pmd_files = TEST_FILES["pmd_file"]
+        self.trace_activation_files = files("trace_init/trace_activation_1.xml")
+        self.ctc_enabled = "True"
+        self.eunitexerunner_flags = "/E S60AppEnv /R Off"
+        self.custom_dir = "custom"
+        self.custom_files = files("custom/postpostaction.xml", "custom/prepostaction.xml")
+        self.component_path = str(TEST_PATH.joinpath("tsrc", "group"))
+        self.ctc_run_process_params = r"10.0.0.1#x:\ats\drop0.zip#1"
+        
+        
+        self.src_dst0 = [
+            (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file1.dll"), path(r"c:\sys\bin\file1.dll"), "testmodule"),
+            (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file2.dll"), path(r"c:\sys\bin\file2.dll"), "testmodule"),
+            (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file1"), path(r"e:\sys\bin\file1"), "data"),
+            (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file2"), path(r"e:\sys\bin\file2"), "data"),
+            (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file3"), path(r"e:\sys\bin\file3"), "data"),
+            ]
+        if harness == "STIF" or harness == "MULTI_HARNESS":
+            harness0 = harness1 = "STIF"
+            if "MULTI_HARNESS" in harness:
+                harness1 = "EUNIT"
+                self.src_dst1 = [
+                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file1.dll"), path(r"c:\sys\bin\file1.dll"), "testmodule"),
+                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file2.dll"), path(r"c:\sys\bin\file2.dll"), "testmodule"),
+                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file1"), path(r"e:\sys\bin\file1"), "data"),
+                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file2"), path(r"e:\sys\bin\file2"), "data"),
+                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file3"), path(r"e:\sys\bin\file3"), "data"),
+                    ] 
+            self.src_dst0 = [
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file1.dll"), path(r"c:\sys\bin\file1.dll"), "testmodule"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file2.dll"), path(r"c:\sys\bin\file2.dll"), "testmodule"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file1"), path(r"e:\sys\bin\file1"), "data"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file2"), path(r"e:\sys\bin\file2"), "data"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file3"), path(r"e:\sys\bin\file3"), "data"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "conf" + os.sep + "file1.cfg"), path(r"c:\sys\bin\file1.cfg"), "conf"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "conf" + os.sep + "file2.cfg"), path(r"c:\sys\bin\file2.cfg"), "conf"),
+                (TEST_PATH.joinpath(r"tsrc" + os.sep + "init" + os.sep + "TestFramework.ini"), path(r"c:\sys\bin\TestFramework.ini"), "engine_ini"),
+                ]
+            if "STIF" in harness:
+                self.src_dst1 = self.src_dst0
+            
+        elif harness == "EUNIT":
+            harness0 = harness1 = harness
+            self.src_dst1 = self.src_dst0
+            
+        self.mocker.restore()
+        test_plan = self.mocker.mock(count=False)
+        mocker.expect(test_plan["testrun_name"]).result("test")
+        mocker.expect(test_plan["harness"]).result(harness)
+        mocker.expect(test_plan["device_type"]).result("product")
+        mocker.expect(test_plan["plan_name"]).result("test plan")
+        mocker.expect(test_plan["diamonds_build_url"]).result(self.diamonds_build_url)
+        mocker.expect(test_plan["test_timeout"]).result("60")
+        mocker.expect(test_plan["eunitexerunner_flags"]).result("/E S60AppEnv /R Off")
+        mocker.expect(test_plan["eunitexerunner?flags"]).result(self.eunitexerunner_flags)
+        mocker.expect(test_plan["device_hwid"]).result("5425")
+        mocker.expect(test_plan["trace_enabled"]).result(self.trace_enabled)
+        mocker.expect(test_plan["ctc_enabled"]).result(self.ctc_enabled)
+        mocker.expect(test_plan["custom_dir"]).result("custom1A")
+        mocker.expect(test_plan.custom_dir).result(path(r"self.custom_dir"))
+        mocker.expect(test_plan["ctc_run_process_params"]).result(self.ctc_run_process_params)
+        mocker.expect(test_plan["report_email"]).result(self.report_email)
+        if self.trace_enabled == "False":
+            mocker.expect(test_plan.sets).result([
+                dict(name="set0", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness=harness0,src_dst=self.src_dst0,
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir = self.custom_dir, component_path=self.component_path),
+                dict(name="set1", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness=harness1, src_dst=self.src_dst1,
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir = self.custom_dir, component_path=self.component_path),
+            ])
+        else:
+            mocker.expect(test_plan.sets).result([
+                dict(name="set0", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness=harness0, src_dst=self.src_dst0,
+                     pmd_files=self.pmd_files, trace_activation_files=self.trace_activation_files,
+                     trace_path=self.file_store.joinpath("traces", "set0", "tracelog.blx"),
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir = self.custom_dir, component_path=self.component_path),
+                dict(name="set1", image_files=self.image_files, data_files=self.data_files,
+                     config_files=self.config_files, testmodule_files=self.testmodule_files,
+                     engine_ini_file=self.engine_ini_file, test_harness=harness1, src_dst=self.src_dst1,
+                     pmd_files=self.pmd_files, trace_activation_files=self.trace_activation_files,
+                     trace_path=self.file_store.joinpath("traces", "set1", "tracelog.blx"),
+                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
+                     custom_dir = self.custom_dir, component_path=self.component_path),
+            ])
+        mocker.expect(test_plan.post_actions).result([
+            ("EmailAction", (("subject", "Release testing"),
+                                 ("to", self.report_email))),
+#            ("FileStoreAction", (("to-folder", self.file_store),
+#                                 ("report-type", "ATS_REPORT"),
+#                                 ("date-format", "yyyyMMdd"),
+#                                 ("time-format", "HHmmss"))),
+#            ("FileStoreAction", (("to-folder", self.file_store),
+#                                 ("report-type", "STIF_COMPONENT_REPORT_ALL_CASES"),
+#                                 ("run-log", "true"),
+#                                 ("date-format", "yyyyMMdd"),
+#                                 ("time-format", "HHmmss"))),
+            ("DiamondsAction", ())
+        ])
+        
+        self.mocker.replay()
+        self.test_plan = test_plan
+        
+        self.gen = adg.Ats3TemplateTestDropGenerator()
+        return self.gen.generate_xml(test_plan)
+
+    def test_basic_structure(self):
+        "Check that the overall test.xml structure is valid."
+        
+        test_harness = ["STIF", "EUNIT", "MULTI_HARNESS"]
+        
+#        for thar in test_harness:
+#            xml = self.generate_xml(thar)
+#            # Check basics.
+#            assert xml.find(".").tag == "test"
+#            assert xml.find("./name").text == "test"
+#            assert xml.find("./buildid").text == self.diamonds_build_url
+#            assert xml.find("./target").tag
+#            assert xml.find("./target/device").tag
+#            if self.test_plan["harness"] == "MULTI_HARNESS":
+#                harness_1, type_1, device_hwid_1, harness_2, type_2, device_hwid_2 = xml.findall("./target/device/property")
+#            else:
+#                harness_1, type_1, device_hwid_1 = xml.findall("./target/device/property")
+#            
+#            if self.test_plan["harness"] == "MULTI_HARNESS":
+#                assert harness_1.get("value") == "STIF"
+#                assert type_1.get("value") == "product"
+#                assert device_hwid_1.get("value") == "5425"
+#                assert harness_2.get("value") == "EUNIT"
+#                assert type_2.get("value") == "product"
+#                assert device_hwid_2.get("value") == "5425"
+#            else:
+#                assert harness_1.get("value") == thar
+#                assert type_1.get("value") == "product"
+#                assert device_hwid_1.get("value") == "5425"
+#
+#        # Check generation of the test plan.
+#        assert xml.find("./plan").get("name") == "test Plan"
+#        assert xml.find("./plan/session").tag 
+#        sets = xml.findall("./execution")
+#        assert len(sets) == 2
+#        assert sets[0].get("name") == "set0-"+str(TEST_PATH.joinpath("tsrc", "group"))
+#        assert sets[0].find("./target/device").tag
+    
+    def test_set_structure(self):
+        "Check that a <set> element's structure is valid."
+        xml = self.generate_xml("STIF")
+        tstset = xml.find("./execution")
+        assert tstset.tag
+        
+    def test_case_flash_elems(self):
+        """Checks flash target element in the test.xml file"""
+        xml = self.generate_xml("STIF")
+        found = False
+        for case in xml.findall(".//task"):
+            if case.find('type').text == 'FlashTask':
+                found = True
+                flashes = case.findall("./parameters/parameter")
+                assert len(flashes) == len(self.image_files)
+                for i, flash_file in enumerate(self.image_files):
+                    assert flashes[i].get("name") == "image-" + str(i + 1)
+                    assert flashes[i].get("value") == "ATS3Drop\\images\\" + flash_file.name
+        assert found
+
+    def test_case_steps(self):
+        """Checks cases in steps in the test.xml file"""
+        test_harness = ["STIF", "EUNIT", "MULTI_HARNESS"]
+        for thar in test_harness:
+            xml = self.generate_xml(thar)
+            #print et.tostring(xml.getroot())
+            steps = iter(xml.findall(".//task"))
+            steps.next() # Flash images
+            check_ctc_start(steps)
+            check_log_dir(steps)
+            if "MULTI_HARNESS" in thar:            
+                self.check_install_step(steps, "STIF")
+                self.check_run_cases(steps, "STIF")
+                check_ctc_write(steps)
+                check_ctc_log(steps)
+                check_fetch_logs(steps, "STIF")
+                
+                steps.next() # Flash images
+                check_ctc_start(steps)
+                check_log_dir(steps)
+                self.check_install_step(steps, "EUNIT", set_count="1")
+                self.check_run_cases(steps, "EUNIT")
+                check_ctc_write(steps)
+                check_ctc_log(steps, "withpkgfiles")
+                check_fetch_logs(steps, "EUNIT")
+            else:
+                self.check_install_step(steps, thar)
+                self.check_run_cases(steps, thar)
+                check_ctc_write(steps)
+                check_ctc_log(steps)
+                check_fetch_logs(steps, thar)
+
+    def check_install_step(self, steps, harness, set_count="0"):
+        """Checks install steps in the test.xml file"""
+        if harness == "MULTI_HARNESS":
+            dst = [self.src_dst0, self.src_dst1]
+        else:
+            dst = [self.src_dst0]
+        if set_count == "1":
+            dst = [self.src_dst1]
+        
+        for dest in dst:
+            for file1 in dest:
+                step = steps.next()
+                (drive, _) = ntpath.splitdrive(file1[1])
+                filename = ntpath.basename(file1[1])
+                letter = drive[0]
+                #if "FileUploadTask" in step.get("type"):
+                assert step.findtext("./type") == "FileUploadTask"
+                params = step.findall("./parameters/parameter")            
+                src = params[0].get("value")
+                assert ntpath.basename(src) == filename
+                assert ntpath.dirname(src) == "ATS3Drop\\set" + set_count + '\\' + letter + '\\' + "sys\\bin"
+                dst = params[1].get("value")
+                assert ntpath.basename(dst) == filename
+                assert ntpath.dirname(dst) == drive + "\\sys\\bin"
+            
+    
+    def check_run_cases(self, steps, harness="STIF"):
+        """Checks run cases in the test.xml file"""
+        step = steps.next()
+        if harness == "STIF":
+            file_ = self.engine_ini_file 
+            assert step.findtext("./type") == "StifRunCasesTask"
+            params = step.findall("./parameters/parameter")
+            assert params[0].get("value") == "*"
+            assert params[1].get("value") == "60"
+            assert params[2].get("value") == "c:\\sys\\bin\\" + ntpath.basename(self.engine_ini_file)
+        elif harness == "EUNIT":
+            file_ = self.testmodule_files[0]
+            assert step.findtext("./type") == "EUnitTask"
+            params = step.findall("./parameters/parameter")
+            assert params[0].get("value") == path(r"z:\sys\bin\EUNITEXERUNNER.EXE")
+            assert params[1].get("value") == path(r"c:\Shared\EUnit\logs\file1_log.xml")
+            assert params[2].get("value") == "/E S60AppEnv /R Off /F file1 /l xml file1.dll"
+            assert params[3].get("value") == "60"
+            step = steps.next()
+            file_ = self.testmodule_files[1]
+            assert step.findtext("./type") == "EUnitTask"
+            params = step.findall("./parameters/parameter")
+            assert params[0].get("value") == path(r"z:\sys\bin\EUNITEXERUNNER.EXE")
+            assert params[1].get("value") == path(r"c:\Shared\EUnit\logs\file2_log.xml")
+            assert params[2].get("value") == "/E S60AppEnv /R Off /F file2 /l xml file2.dll"
+            assert params[3].get("value") == "60"
+
+    def test_steps_trace_enabled(self):
+        """checks if traing is enabled"""
+        test_harness = ["STIF"]
+        for thar in test_harness:
+            xml = self.generate_xml(thar, trace_enabled="True")
+            steps = iter(xml.findall(".//task"))
+            steps.next() # Flash images
+            check_ctc_start(steps)
+            check_log_dir(steps)
+            self.check_install_step(steps, thar)
+            #check_trace_start(steps, self.file_store)
+            self.check_run_cases(steps)
+            #check_trace_end_steps(steps, self.file_store)
+            check_ctc_write(steps)
+            check_ctc_log(steps)
+            check_fetch_logs(steps)
+        
+    def test_post_actions(self):
+        "Post actions are inserted into XML."
+        xml = self.generate_xml("STIF")
+        post_actions = xml.findall(".//action")
+        check_send_email_action(post_actions[0], self.report_email)
+        #check_ats_report_action(post_actions[1], self.file_store)
+        #check_stif_report_action(post_actions[2], self.file_store)
+        check_diamonds_action(post_actions[1])
+        
+#    def test_files(self):
+#        """Tests if the files are created for mock"""
+#        xml = self.generate_xml("STIF")
+#        files = iter(xml.findall("./files/file"))
+#        assert files.next().text == r"ATS3Drop/images/file1.fpsx"
+#        assert files.next().text == r"ATS3Drop/images/file2.fpsx"
+#        assert files.next().text == r"ATS3Drop/set0/c/sys/bin/file1.dll"
+#        assert files.next().text == r"ATS3Drop/set0/c/sys/bin/file2.dll"
+#        assert files.next().text == r"ATS3Drop/set0/e/sys/bin/file1"
+#        assert files.next().text == r"ATS3Drop/set0/e/sys/bin/file2"
+#        assert files.next().text == r"ATS3Drop/set0/e/sys/bin/file3"
+#        assert files.next().text == r"ATS3Drop/set0/c/sys/bin/file1.cfg"
+#        assert files.next().text == r"ATS3Drop/set0/c/sys/bin/file2.cfg"        
+#        assert files.next().text == r"ATS3Drop/set0/c/sys/bin/TestFramework.ini"
+#        assert files.next().text == r"ATS3Drop/set1/c/sys/bin/file1.dll"
+#        assert files.next().text == r"ATS3Drop/set1/c/sys/bin/file2.dll"
+#        assert files.next().text == r"ATS3Drop/set1/e/sys/bin/file1"
+#        assert files.next().text == r"ATS3Drop/set1/e/sys/bin/file2"
+#        assert files.next().text == r"ATS3Drop/set1/e/sys/bin/file3"
+#        assert files.next().text == r"ATS3Drop/set1/c/sys/bin/file1.cfg"
+#        assert files.next().text == r"ATS3Drop/set1/c/sys/bin/file2.cfg"
+#        assert files.next().text == r"ATS3Drop/set1/c/sys/bin/TestFramework.ini"
+#        self.assertRaises(StopIteration, files.next)
+#        xml = self.generate_xml(harness="STIF", trace_enabled="True")
+#        files = iter(xml.findall("./files/file"))
+#        assert files.next().text == r"ATS3Drop/images/file1.fpsx"
+#        assert files.next().text == r"ATS3Drop/images/file2.fpsx"
+#        assert files.next().text == r"ATS3Drop/pmds/pmd_file.pmd"
+#        assert files.next().text == r"ATS3Drop/set0/trace_init/trace_activation_1.xml"
+#        assert files.next().text == r"ATS3Drop/set0/c/sys/bin/file1.dll"
+#        assert files.next().text == r"ATS3Drop/set0/c/sys/bin/file2.dll"
+#        assert files.next().text == r"ATS3Drop/set0/e/sys/bin/file1"
+#        assert files.next().text == r"ATS3Drop/set0/e/sys/bin/file2"
+#        assert files.next().text == r"ATS3Drop/set0/e/sys/bin/file3"
+#        assert files.next().text == r"ATS3Drop/set0/c/sys/bin/file1.cfg"
+#        assert files.next().text == r"ATS3Drop/set0/c/sys/bin/file2.cfg"
+#        assert files.next().text == r"ATS3Drop/set0/c/sys/bin/TestFramework.ini"
+#        assert files.next().text == r"ATS3Drop/set1/trace_init/trace_activation_1.xml"
+#        assert files.next().text == r"ATS3Drop/set1/c/sys/bin/file1.dll"
+#        assert files.next().text == r"ATS3Drop/set1/c/sys/bin/file2.dll"
+#        assert files.next().text == r"ATS3Drop/set1/e/sys/bin/file1"
+#        assert files.next().text == r"ATS3Drop/set1/e/sys/bin/file2"
+#        assert files.next().text == r"ATS3Drop/set1/e/sys/bin/file3"
+#        assert files.next().text == r"ATS3Drop/set1/c/sys/bin/file1.cfg"
+#        assert files.next().text == r"ATS3Drop/set1/c/sys/bin/file2.cfg"
+#        assert files.next().text == r"ATS3Drop/set1/c/sys/bin/TestFramework.ini"
+#
+#        self.assertRaises(StopIteration, files.next)
+        
+    def test_generate_drop(self):
+        "Manifest for ATS3Drop directory structure is generated."        
+        xml = self.generate_xml("STIF")
+        strbuffer = StringIO()
+        self.gen.generate_drop(self.test_plan, xml, strbuffer)
+        
+        zfile = zipfile.ZipFile(strbuffer, "r")
+        try:
+            contents = sorted(tpath for tpath in zfile.namelist())
+            expected = sorted(tpath
+                           for tpath in [r"ATS3Drop/set0/c/sys/bin/file1.cfg",
+                                     r"ATS3Drop/set0/c/sys/bin/file2.cfg",
+                                     r"ATS3Drop/set0/e/sys/bin/file1",
+                                     r"ATS3Drop/set0/e/sys/bin/file2",
+                                     r"ATS3Drop/set0/e/sys/bin/file3",
+                                     r"ATS3Drop/images/file1.fpsx",
+                                     r"ATS3Drop/images/file2.fpsx",
+                                     r"ATS3Drop/set0/c/sys/bin/TestFramework.ini",
+                                     r"ATS3Drop/set0/c/sys/bin/file1.dll",
+                                     r"ATS3Drop/set0/c/sys/bin/file2.dll",
+                                     r"ATS3Drop/set1/c/sys/bin/file1.cfg",
+                                     r"ATS3Drop/set1/c/sys/bin/file2.cfg",
+                                     r"ATS3Drop/set1/e/sys/bin/file1",
+                                     r"ATS3Drop/set1/e/sys/bin/file2",
+                                     r"ATS3Drop/set1/e/sys/bin/file3",
+                                     r"ATS3Drop/set1/c/sys/bin/TestFramework.ini",
+                                     r"ATS3Drop/set1/c/sys/bin/file1.dll",
+                                     r"ATS3Drop/set1/c/sys/bin/file2.dll",
+                                     r"test.xml"])
+            diff = difflib.context_diff(expected, contents)
+            assert contents == expected, "\n".join(diff)
+        finally:
+            zfile.close()
+
+    def test_generate_drop_trace_enabled(self):
+        "Manifest for ATS3Drop directory structure is generated when trace enabled."
+        xml = self.generate_xml(harness="STIF", trace_enabled="True")
+        strbuffer = StringIO()
+        
+        self.gen.generate_drop(self.test_plan, xml, strbuffer)
+        zfile = zipfile.ZipFile(strbuffer, "r")
+        try:
+            contents = sorted(tpath for tpath in zfile.namelist())
+            expected = sorted(tpath
+                           for tpath in [r"ATS3Drop/set0/c/sys/bin/file1.cfg",
+                                     r"ATS3Drop/set0/c/sys/bin/file2.cfg",
+                                     r"ATS3Drop/set0/e/sys/bin/file1",
+                                     r"ATS3Drop/set0/e/sys/bin/file2",
+                                     r"ATS3Drop/set0/e/sys/bin/file3",
+                                     r"ATS3Drop/set0/trace_init/trace_activation_1.xml",
+                                     r"ATS3Drop/images/file1.fpsx",
+                                     r"ATS3Drop/images/file2.fpsx",
+                                     r"ATS3Drop/pmds/pmd_file.pmd",
+                                     r"ATS3Drop/set0/c/sys/bin/TestFramework.ini",
+                                     r"ATS3Drop/set0/c/sys/bin/file1.dll",
+                                     r"ATS3Drop/set0/c/sys/bin/file2.dll",
+                                     r"ATS3Drop/set1/c/sys/bin/file1.cfg",
+                                     r"ATS3Drop/set1/c/sys/bin/file2.cfg",
+                                     r"ATS3Drop/set1/e/sys/bin/file1",
+                                     r"ATS3Drop/set1/e/sys/bin/file2",
+                                     r"ATS3Drop/set1/e/sys/bin/file3",
+                                     r"ATS3Drop/set1/trace_init/trace_activation_1.xml",
+                                     r"ATS3Drop/set1/c/sys/bin/TestFramework.ini",
+                                     r"ATS3Drop/set1/c/sys/bin/file1.dll",
+                                     r"ATS3Drop/set1/c/sys/bin/file2.dll",
+                                     r"test.xml"])
+            diff = difflib.context_diff(expected, contents)
+            assert contents == expected, "\n".join(diff)
+        finally:
+            zfile.close()
+            
+class TestDropGenerationWithSis(mocker.MockerTestCase):
+    """
+    Unit tests for the test.xml generation with sis files.
+    """
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+        self.sis_files = None
+        self.image_files = None
+        self.engine_ini_file = None
+        self.report_email = None
+        self.file_store = None
+        self.diamonds_build_url = None
+        self.harness = None
+        self.test_plan = None
+        self.gen = None
+        self.src_dst = []
+        
+    def generate_xml(self):
+        """Geberates XML if sis files"""
+        def files(*paths):
+            """generates paths for the files"""
+            return [TEST_PATH.joinpath("tsrc", tpath) for tpath in paths]
+        self.sis_files = files("sis/file1.sisx", "sis/file2.sisx", "sis/file3.sisx")
+        self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
+        self.engine_ini_file = files("init/TestFramework.ini")[0]
+        self.report_email = "test.receiver@company.com"
+        self.file_store = path("path/to/reports")
+        self.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        self.harness = "STIF"
+        self.component_path = str(TEST_PATH.joinpath("tsrc", "group"))
+        self.ctc_run_process_params = r"10.0.0.1#x:\ats\drop0.zip#1"
+        
+        test_plan = self.mocker.mock(count=False)
+        mocker.expect(test_plan["testrun_name"]).result("test")
+        mocker.expect(test_plan["harness"]).result("STIF")
+        mocker.expect(test_plan["device_type"]).result("product")
+        mocker.expect(test_plan["plan_name"]).result("test plan")
+        mocker.expect(test_plan["diamonds_build_url"]).result(self.diamonds_build_url)
+        mocker.expect(test_plan["test_timeout"]).result("60")
+        mocker.expect(test_plan["device_hwid"]).result("5425")
+        mocker.expect(test_plan["ctc_enabled"]).result("False")
+        mocker.expect(test_plan["trace_enabled"]).result("False")
+        mocker.expect(test_plan["custom_dir"]).result("CustomC")
+        mocker.expect(test_plan.custom_dir).result(path(r"self.custom_dir"))
+        mocker.expect(test_plan["ctc_run_process_params"]).result(self.ctc_run_process_params)
+        mocker.expect(test_plan["report_email"]).result(self.report_email)
+        mocker.expect(test_plan.sets).result([
+            dict(name="set0", image_files=self.image_files, sis_files=self.sis_files,
+                 engine_ini_file=self.engine_ini_file, test_harness=self.harness, ctc_enabled="False", component_path=self.component_path),
+             ])
+        mocker.expect(test_plan.post_actions).result([])
+        self.mocker.replay()
+        self.test_plan = test_plan
+        
+        self.gen = adg.Ats3TemplateTestDropGenerator()
+        return self.gen.generate_xml(test_plan)
+
+    def test_case_steps(self):
+        """Checks cases in steps in the test.xml file"""
+        xml = self.generate_xml()
+        steps = iter(xml.findall(".//task"))
+        steps.next() # Flash images
+        steps.next() # Stif log dir creation.
+        self.check_install_sis_files(steps)
+        steps.next() # Install engine ini.
+        self.check_install_sis_to_device(steps)
+        steps.next() # Run cases.
+        steps.next() # Fetch logs.
+        self.assertRaises(StopIteration, steps.next)
+
+    def check_install_sis_files(self, steps):
+        """Checks sis files install steps in the test.xml file"""
+        for filename in self.sis_files:
+            step = steps.next()
+            assert step.findtext("./type") == "FileUploadTask"
+            params = step.findall("./parameters/parameter")
+            # TO DO: Should sis files be specified outside of the set?
+            assert params[0].get("value") == "ATS3Drop\\set0\\sis\\" + ntpath.basename(filename)
+            assert params[1].get("value") == "c:\\testframework\\" + ntpath.basename(filename)
+
+    def check_install_sis_to_device(self, steps):
+        """Checks sis files installation on the device"""
+        for filename in self.sis_files:
+            step = steps.next()
+            assert step.findtext("./type") == "InstallSisTask"
+            params = step.findall("./parameters/parameter")
+            assert params[-1].get("value") == "c:\\testframework\\" + ntpath.basename(filename)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_ats4_aste.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,500 @@
+# -*- coding: latin-1 -*-
+
+#============================================================================ 
+#Name        : test_ats4_aste.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Testing ATS4 ASTE framework. """
+
+# pylint: disable-msg=E1101
+
+from cStringIO import StringIO
+from pprint import pprint
+from xml.etree.ElementTree import fromstring, tostring
+from xml.etree import ElementTree as et
+import difflib
+import logging
+logging.getLogger().setLevel(logging.ERROR)
+import re
+import tempfile
+import zipfile
+import os
+
+from path import path
+import amara
+import mocker
+
+import ats3.aste
+
+TEST_PATH = None
+TEST_FILES = {}
+TEST_ASSET_FILES = {}
+TSRC = None
+OUTPUT = None
+TEST_ZIP_PATH = None
+
+# Shortcuts
+E = et.Element
+SE = et.SubElement
+
+_logger = logging.getLogger("test.ats4_aste")
+
+class Bunch(object):
+    
+    def __init__(self, **kwargs): 
+        self.__dict__.update(kwargs)
+    
+
+def equal_xml(xml1, xml2):
+    """Check the equality of the given XML snippets.
+    
+    Tag name equality:
+    
+    >>> equal_xml('<a/>', '<a/>')
+    True
+    >>> equal_xml('<a/>', '<b/>')
+    False
+    
+    Attribute equality:
+    
+    >>> equal_xml('<a k="v"/>', '<a k="v"/>')
+    True
+    >>> equal_xml('<a k="v"/>', '<a k="w"/>')
+    False
+    
+    Text content equality:
+    
+    >>> equal_xml('<a>v</a>', '<a>v</a>')
+    True
+    >>> equal_xml('<a>v</a>', '<a>w</a>')
+    False
+    >>> equal_xml('<a>v</a>', '<a></a>')
+    False
+    
+    Text content equality when whitespace differs:
+    >>> equal_xml('<a>v</a>', '<a>v </a>')
+    True
+
+    Equality of child elements:
+    
+    >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="v"/></b></a>')
+    True
+    >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="w"/></b></a>')
+    False
+    >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>w</b></a>')
+    False
+    >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>v </b></a>')
+    True
+    
+    """
+    if isinstance(xml1, basestring):
+        xml1 = fromstring(xml1)
+    if isinstance(xml2, basestring):
+        xml2 = fromstring(xml2)
+    if xml1.tag != xml2.tag:
+        return False
+    if xml1.attrib != xml2.attrib:
+        return False
+    if xml1.text:
+        if not xml2.text:
+            return False
+    if xml2.text:
+        if not xml1.text:
+            return False
+    if xml1.text and xml2.text and xml1.text.strip() != xml2.text.strip():
+        return False
+    if xml1.tail is not None and xml2.tail is not None:
+        if xml1.tail.strip() != xml2.tail.strip():
+            return False
+    elif xml1.tail != xml2.tail:
+        return False
+    children1 = list(xml1.getchildren())
+    children2 = list(xml2.getchildren())
+    if len(children1) != len(children2):
+        return False
+    for child1, child2 in zip(children1, children2):
+        return equal_xml(child1, child2)
+    return True        
+
+
+def setup_module():
+    global TEST_PATH, OUTPUT, TEST_ZIP_PATH
+    TEST_PATH = path(tempfile.mkdtemp())
+    OUTPUT = TEST_PATH.joinpath("TestAsset")
+    TEST_ZIP_PATH = TEST_PATH.joinpath("test_zip")
+    asset = TEST_PATH
+    component = TEST_PATH
+    component.joinpath("group").makedirs()
+    for path_parts in (("output", "images", "file1.fpsx"),
+                       ("output", "images", "file2.fpsx")):
+        filename = component.joinpath(*path_parts)
+        if not filename.parent.exists():
+            filename.parent.makedirs()
+        filename.touch()
+        TEST_FILES.setdefault(path_parts[1], []).append(file)
+    for path_parts in (("TestAsset", "Localisation", "S60", "localisation.txt"),
+                       ("TestAsset", "TestCases", "TC_100_Test0", "file1.sis"),
+                       ("TestAsset", "TestCases", "TC_100_Test0", "file2.tcf"),
+                       ("TestAsset", "Tools", "TestCaseCreator", "test_creator.ini"),
+                       ("TestAsset", "testdrop.xml"),):
+        filename = asset.joinpath(*path_parts)
+        if not filename.parent.exists():
+            filename.parent.makedirs()
+        filename.touch()
+        TEST_ASSET_FILES.setdefault(path_parts[1], []).append(file)
+    try:
+        zip_component = TEST_ZIP_PATH
+        filename = zip_component.joinpath("TestAsset.zip")
+        if not filename.parent.exists():
+            filename.parent.makedirs()
+        filename.touch()
+        zfile = zipfile.ZipFile(zip_component.joinpath("TestAsset.zip"), "w", zipfile.ZIP_DEFLATED)
+        for p in TEST_ASSET_FILES:
+            print p
+            zfile.write(p)
+        zfile.close()
+        TEST_ASSET_FILES.setdefault("ZIP", []).append(file)
+    except OSError:
+        print "Got except OSError. Continuing...\n"  
+        
+    
+def teardown_module():
+    path(TEST_PATH).rmtree()
+    
+    
+class TestTestPlan(mocker.MockerTestCase):
+
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+             
+    def setUp(self):
+        opts = Bunch(testrun_name="testrun", harness="ASTE", 
+                     device_type="product", plan_name="ats3_test_plan", diamonds_build_url="",
+                     software_version="W810", software_release="SPP 51.32", device_language="English",
+                     testasset_location=TEST_PATH.joinpath("TestAsset"), testasset_caseids="100",repeat="1", report_email="",
+                     file_store=path(), test_timeout="60", device_hwid="5425", test_type="smoke")
+        self.tp = ats3.aste.AsteTestPlan(opts)
+        self.image_files = TEST_FILES["images"]
+        self.test_timeout = self.tp["test_timeout"]
+        self.device_hwid = self.tp["device_hwid"]
+        self.test_harness = self.tp["harness"]
+        self.device_language = self.tp["device_language"]
+        self.software_release = self.tp["software_release"]
+        self.software_version = self.tp["software_version"]
+        self.testasset_caseids = self.tp["testasset_caseids"]
+        self.testasset_location = self.tp["testasset_location"]
+        self.test_type = self.tp["test_type"]
+        
+        if self.testasset_location != "":
+            self.test_asset_testcases = [self.testasset_location.joinpath("TestCases", "TC_100_Test0", "file1.sis"), self.testasset_location.joinpath("TestCases", "TC_100_Test0", "file2.tcf")]
+            self.test_asset_tools = [self.testasset_location.joinpath("Tools", "TestCaseCreator", "test_creator.ini")]
+            self.test_asset_localisation = [self.testasset_location.joinpath("Localisation", "S60", "localisation.txt")]
+            self.test_asset_testdrop = self.testasset_location.joinpath("testdrop.xml")
+        else:
+            self.test_asset_testcases = TEST_ASSET_FILES["TestCases"]
+            self.test_asset_tools = TEST_ASSET_FILES["Tools"]
+            self.test_asset_localisation = TEST_ASSET_FILES["Localisation"]
+            self.test_asset_testdrop = TEST_ASSET_FILES["testdrop.xml"]
+
+            
+    def test_creation(self):        
+        assert self.tp["testrun_name"] == "testrun"
+        assert self.tp["harness"] == "ASTE"
+        assert self.tp["device_type"] == "product"
+    
+    def test_insert_set(self):
+        
+        self.tp.insert_set(image_files=self.image_files,
+                           test_timeout=self.test_timeout)
+        
+        assert self.tp.sets[0] == dict(name="set0",
+                                       image_files=self.image_files,
+                                       test_timeout=self.test_timeout,
+                                       test_harness=self.test_harness)
+
+    def test_post_actions_email(self):
+        assert not self.tp.post_actions
+        receiver = "joe.average@example.com"
+        self.tp.report_email = receiver
+        assert len(self.tp.post_actions) == 1
+        action, items = self.tp.post_actions[0]
+        items = dict(items)
+        assert action == "SendEmailAction"
+        assert items["to"] == receiver
+    
+    def test_post_actions_ats3_report_only(self):
+        file_store = path("path/to/files")
+        self.tp.file_store = file_store
+        self.tp.harness = "EUNIT"
+        assert len(self.tp.post_actions) == 2
+        action, items = self.tp.post_actions[0]
+        items = dict(items)
+        assert action == "FileStoreAction"
+        assert items["report-type"] == "ATS_REPORT"
+        assert items["to-folder"].startswith(file_store)
+        assert items["to-folder"].endswith("ATS3_REPORT")
+    
+    def test_post_actions_aste(self):
+        file_store = path("path/to/files")
+        self.tp.file_store = file_store
+        assert len(self.tp.post_actions) == 2
+        action, items = self.tp.post_actions[1]
+        items = dict(items)
+        assert action == "FileStoreAction"
+        assert items["report-type"] == "ASTE_REPORT"
+        assert items["to-folder"].startswith(file_store)
+        assert items["to-folder"].endswith("ASTE_REPORT")
+        
+    def test_post_actions_diamonds(self):
+        self.tp.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        assert len(self.tp.post_actions) == 1
+        action, items = self.tp.post_actions[0]
+        assert action == "DiamondsAction"
+        assert not items
+
+
+            
+class TestXMLGeneration(mocker.MockerTestCase):
+    """
+    Unit tests for the test.xml generation.
+    """    
+
+    def __init__(self, methodName="runTest"):
+        self.image_files = None
+        self.report_email = None
+        self.diamonds_build_url = None
+        self.test_harness = None
+        self.file_store = None
+        self.testasset_location = None
+        self.test_plan = None
+        self.gen = None
+        mocker.MockerTestCase.__init__(self, methodName)
+        
+        
+    def generate_xml(self):
+        def files(*paths):
+            return [TEST_PATH.joinpath(p) for p in paths]
+        self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
+        self.report_email = "test.receiver@company.com"
+        self.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
+        self.test_harness = "ASTE"
+        self.file_store = path(r"path/to/reports")
+        self.testasset_location = OUTPUT
+        
+        self.mocker.restore()
+        test_plan = self.mocker.mock(count=False)
+        mocker.expect(test_plan["testrun_name"]).result("test")
+        mocker.expect(test_plan["harness"]).result("ASTE")
+        mocker.expect(test_plan["device_type"]).result("product")
+        mocker.expect(test_plan["plan_name"]).result("test plan")
+        mocker.expect(test_plan["diamonds_build_url"]).result(self.diamonds_build_url)
+        mocker.expect(test_plan["test_timeout"]).result("60")
+        mocker.expect(test_plan["device_hwid"]).result("5425")
+        mocker.expect(test_plan["testasset_location"]).result(self.testasset_location)
+        mocker.expect(test_plan["testasset_caseids"]).result("100")
+        mocker.expect(test_plan["report_email"]).result(self.report_email)
+        mocker.expect(test_plan["software_release"]).result("SPP 51.32")
+        mocker.expect(test_plan["software_version"]).result("W810")
+        mocker.expect(test_plan["device_language"]).result("English")
+        mocker.expect(test_plan["test_type"]).result("smoke")
+        mocker.expect(test_plan["temp_directory"]).result(TEST_PATH)
+        mocker.expect(test_plan.sets).result([
+            dict(name="set0", image_files=self.image_files, test_harness="ASTE")])
+        mocker.expect(test_plan.post_actions).result([
+            ("EmailAction", (("subject", "Release testing"),
+                                 ("to", self.report_email))),
+#            ("FileStoreAction", (("to-folder", self.file_store),
+#                                 ("report-type", "ATS_REPORT"),
+#                                 ("date-format", "yyyyMMdd"),
+#                                 ("time-format", "HHmmss"))),
+#            ("FileStoreAction", (("to-folder", self.file_store),
+#                                 ("report-type", "ASTE_REPORT"),
+#                                 ("run-log", "true"),
+#                                 ("date-format", "yyyyMMdd"),
+#                                 ("time-format", "HHmmss"))),
+            ("DiamondsAction", ())
+        ])
+        
+        self.mocker.replay()
+        self.test_plan = test_plan
+        
+        self.gen = ats3.aste.AsteTemplateTestDropGenerator()
+        return self.gen.generate_xml(test_plan)
+
+    def test_basic_structure(self):
+        "Check that the overall test.xml structure is valid."
+        xml = self.generate_xml()
+        # Check basics.
+#        assert xml.find(".").tag == "test"
+#        assert xml.find("./name").text == "test"
+#        assert xml.find("./buildid").text == self.diamonds_build_url
+#        assert xml.find("./target").tag
+#        assert xml.find("./target/device").tag
+#        harness, hardware, device_hwid = xml.findall("./target/device/property")
+#        softwareVersion, softwareRelease, deviceLanguage = xml.findall("./target/device/setting")
+#        assert harness.get("value") == "ASTE"
+#        assert hardware.get("value") == "product"
+#        assert softwareVersion.get("value") == "W810"
+#        assert softwareRelease.get("value") == "SPP 51.32"
+#        assert deviceLanguage.get("value") == "English"
+#        assert device_hwid.get("value") == "5425"
+#        
+#        # Check generation of the test plan.
+#        assert xml.find("./plan").get("name") == "Plan smoke product"
+#        assert xml.find("./plan/session").tag 
+#        sets = xml.findall("./plan/session/set")
+#        assert len(sets) == 1
+#        assert sets[0].get("name") == "set0"
+#        assert sets[0].find("./target/device").tag
+    
+    def test_set_structure(self):
+        "Check that a <set> element's structure is valid."
+        xml = self.generate_xml()
+#        tstset = xml.find("./plan/session/set")
+#        assert tstset.tag
+#        case = tstset.find("./case")
+#        assert case.tag
+#        assert case.get("name") == "set0 case"                
+        
+    def test_case_flash_elems(self):
+        """ Test case flash elems. """
+        xml = self.generate_xml()
+        found = False
+        for case in xml.findall(".//task"):
+            if case.find('type').text == 'FlashTask':
+                found = True
+                flashes = case.findall("./parameters/parameter")
+                assert len(flashes) == len(self.image_files)
+                for i, flash_file in enumerate(self.image_files):
+                    assert flashes[i].get("name") == "image-" + str(i + 1)
+                    assert flashes[i].get("value") == "ATS3Drop\\images\\" + flash_file.name
+        assert found
+    
+    def test_steps(self):
+        xml = self.generate_xml()
+        steps = iter(xml.findall(".//task"))
+        step = steps.next()
+        step = steps.next()
+        self.check_executeasset_step(steps)
+
+    def check_executeasset_step(self, steps):
+        step = steps.next()
+        assert step.findtext("./type") == "SetTestAssetPackageTask"
+        params = step.findall("./parameters/parameter")
+        #assert params[0].get("repeat") == "1"
+        assert params[0].get("value") == "ATS3Drop\\TestAssets\\TestAsset.zip"
+        #assert params[2].get("testcase-ids") == "100"
+
+    def test_post_actions(self):
+        "Post actions are inserted into XML."
+        xml = self.generate_xml()        
+        post_actions = xml.findall(".//action")
+        self.check_send_email_action(post_actions[0])
+#        self.check_ats_report_action(post_actions[1])
+#        self.check_aste_report_action(post_actions[2])
+        self.check_diamonds_action(post_actions[1])
+
+    def check_send_email_action(self, action):
+        assert action.findtext("./type") == "EmailAction"
+        params = action.findall("./parameters/parameter")
+        assert params[0].get("name") == "subject"
+        #assert params[0].get("value") == "email subject"
+        #assert params[1].get("name") == "type"
+        #assert params[1].get("value") == "ATS3_REPORT"
+        #assert params[2].get("name") == "send-files"
+        #assert params[2].get("value") == "true"
+        assert params[1].get("name") == "to"
+        assert params[1].get("value") == self.report_email
+
+    def check_ats_report_action(self, action):
+        assert action.findtext("./type") == "FileStoreAction"
+        params = action.findall("./parameters/parameter")
+        assert params[0].get("name") == "to-folder"
+        assert params[0].get("value") == self.file_store
+        assert params[1].get("name") == "report-type"
+        assert params[1].get("value") == "ATS_REPORT"
+        assert params[2].get("name") == "date-format"
+        assert params[2].get("value") == "yyyyMMdd"
+        assert params[3].get("name") == "time-format"
+        assert params[3].get("value") == "HHmmss"
+
+    def check_aste_report_action(self, action):
+        assert action.findtext("./type") == "FileStoreAction"
+        params = action.findall("./parameters/parameter")
+        assert params[0].get("name") == "to-folder"
+        assert params[0].get("value") == self.file_store
+        assert params[1].get("name") == "report-type"
+        assert params[1].get("value") == "ASTE_REPORT"
+        assert params[2].get("name") == "run-log"
+        assert params[2].get("value") == "true"
+        assert params[3].get("name") == "date-format"
+        assert params[3].get("value") == "yyyyMMdd"
+        assert params[4].get("name") == "time-format"
+        assert params[4].get("value") == "HHmmss"
+        
+    def check_diamonds_action(self, action):
+        assert action.findtext("./type") == "DiamondsAction"
+        assert not action.findall("./parameters/parameter")
+    
+    def test_files(self):
+        xml = self.generate_xml()
+#        files = iter(xml.findall("./files/file"))
+#        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx"
+#        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx"
+#        assert files.next().text == r"ATS3Drop" + os.sep + "TestAssets" + os.sep + "TestAsset.zip"
+#        self.assertRaises(StopIteration, files.next)
+        
+    def test_generate_testasset_zip(self):
+        self.generate_xml()
+        if re.search(r"[.]zip", self.test_plan["testasset_location"]):
+            pass
+        else:
+            strbuffer = StringIO()
+            assert strbuffer == self.gen.generate_testasset_zip(self.test_plan, strbuffer)
+            zfile = zipfile.ZipFile(strbuffer, "r")
+            try:
+                contents = sorted(path(p).normpath() for p in zfile.namelist())
+                expected = sorted(path(p).normpath()
+                               for p in [(r"Localisation" + os.sep + "S60" + os.sep + "localisation.txt"),
+                                         (r"TestCases" + os.sep + "TC_100_Test0" + os.sep + "file1.sis"),
+                                         (r"TestCases" + os.sep + "TC_100_Test0" + os.sep + "file2.tcf"),
+                                         (r"Tools" + os.sep + "TestCaseCreator" + os.sep + "test_creator.ini"),
+                                         (r"testdrop.xml")])
+                diff = difflib.context_diff(expected, contents)
+                assert contents == expected, "\n".join(diff)
+            finally:
+                zfile.close()
+        
+    def test_generate_drop(self):
+        "Manifest for ATS3Drop directory structure is generated."
+        xml = self.generate_xml()
+        strbuffer = StringIO()
+
+        self.gen.generate_drop(self.test_plan, xml, strbuffer)
+        zfile = zipfile.ZipFile(strbuffer, "r")
+        try:
+            contents = sorted(path(p).normpath() for p in zfile.namelist())
+            expected = sorted(path(p).normpath()
+                           for p in [r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
+                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
+                                     r"ATS3Drop" + os.sep + "TestAssets" + os.sep + "TestAsset.zip",
+                                     r"test.xml"])
+            diff = difflib.context_diff(expected, contents)
+            assert contents == expected, "\n".join(diff)
+        finally:
+            zfile.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_atsant.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,30 @@
+#============================================================================ 
+#Name        : test_atsant.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" atsant.py module tests. """
+
+import os
+import logging
+_logger = logging.getLogger('test.atsant')
+
+import atsant
+
+def test_atsant():
+    files = atsant.files_to_test(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/packageiad/layers.sysdef.xml'), None, None, 'z:')
+    assert len(files) == 3
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_atsconfigparser.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,101 @@
+#============================================================================ 
+#Name    : test_atsconfigparser.py
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Testing the ATS configuration file """
+
+import os
+import logging
+import tempfile
+import unittest
+
+import ats3.atsconfigparser
+
+_logger = logging.getLogger('test.atsconfigparser')
+logging.basicConfig(level=logging.INFO)
+
+class AtsConfigParserTest(unittest.TestCase):
+      
+    def test_x(self):
+        spectext = """<ATSConfigData>
+    <config name="common" abstract="true">
+
+        <!-- Properties to add/modify -->
+        <config type="properties">
+           <set name="HARNESS" value="STIFx" />
+           <set name="HARNESS2" value="STIF2"/>
+           <set name="HARNESS3" value="STIF2"/>
+           <set name="2" value="3" />
+        </config>
+
+        <!-- Attributes to modify -->
+        <config type="attributes">
+           <set name="xyz" value="2" />
+           <set name="significant" value="true" />
+        </config>
+
+        <!-- Settings to add/modify -->
+        <config type="settings">
+           <set name="HARNESS" value="STIF" />
+           <set name="2" value="3" />
+        </config>
+
+    </config>
+</ATSConfigData>
+        """
+
+        testxmldata = """<test>
+  <name>helium_clock</name>
+  <target>
+    <device alias="DEFAULT_STIF" rank="none">
+      <property name="HARNESS" value="STIF"/>
+      <property name="HARNESS2" value="STIF"/>
+      <property name="HARNESS3" value="STIF"/>
+    </device>
+    <device alias="DEFAULT_EUIT" rank="none">
+      <property name="HARNESS" value="STIF"/>
+      <property name="HARNESS2" value="STIF3"/>
+    </device>
+  </target>
+  <plan passrate="100" harness="STIF" enabled="true" name="helium_clock Plan" significant="false">
+    <session passrate="100" harness="STIF" enabled="true" name="session" significant="false">
+      <set passrate="100" harness="STIF" enabled="true" name="set0" significant="false">
+        <target>
+          <device alias="DEFAULT_STIF" rank="master"/>
+        </target>
+      </set>
+    </session>
+  </plan>
+</test>
+        """
+        
+        (fd, filename) = tempfile.mkstemp()
+        f = os.fdopen(fd, 'w')
+        f.write(spectext)
+        f.close()
+        
+        output = ats3.atsconfigparser.converttestxml(filename, testxmldata)
+        os.remove(filename)
+        _logger.info(output)
+        assert '<property name="2" value="3"/>' in output
+        assert '<property name="HARNESS" value="STIFx"/>' in output
+        assert '<property name="HARNESS" value="STIF"/>' not in output
+        assert '<property name="HARNESS2" value="STIF2"/>' in output
+        assert '<property name="HARNESS2" value="STIF3"/>' not in output
+        assert '<property name="HARNESS3" value="STIF2"/>' in output
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_atsconfiguration.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,120 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================ 
+#Name    : test_ATSconfiguration.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Testing the ATS configuration file """
+
+import logging
+import StringIO
+import unittest
+
+import configuration
+import ats3.parsers
+
+_logger = logging.getLogger('test.atsconfiguration')
+logging.basicConfig(level=logging.INFO)
+
+
+
+def test_ATS_element():
+    """ ATS elements can be used in configuration. """
+    config_text = """
+<ATSConfigData>
+    <config name="properties">
+    <set name="PA" value="foo"/>
+    </config>
+    <config name="attributes">
+    <set name="attrs" value="foo"/>
+    <set name="AB" value="100"/>
+    <set name="AC" value="101"/>
+    </config>
+</ATSConfigData>"""
+
+    builder = configuration.NestedConfigurationBuilder(StringIO.StringIO(config_text))
+    config = builder.getConfiguration().getConfigurations()
+    assert config[0]['PA'] == 'foo'
+    assert config[1]['AB'] == '100'
+
+
+
+def test_ATS_config_attirbutes():
+    """ ATS elements can be used attributes only. """
+    config_text = """
+<ATSConfigData>
+    <config name="attributes">
+    <set name="attrs" value="foo"/>
+    <set name="AB" value="100"/>
+    <set name="AC" value="101"/>
+    </config>
+</ATSConfigData>"""
+    (params, attrs) = ats3.parsers.split_config_to_attributes_and_properties(StringIO.StringIO(config_text))
+
+    print attrs
+    print params
+    assert params ==  {}
+    assert attrs ==  {u'attrs': u'foo', u'AC': u'101', u'AB': u'100'}
+
+def test_ATS_config_properties():
+    """ ATS elements can be used properties only. """
+    config_text = """
+<ATSConfigData>
+    <config name="noattributes">
+    <set name="attrs" value="foo"/>
+    <set name="AB" value="100"/>
+    <set name="AC" value="101"/>
+    </config>
+    <config name="properties">
+    <set name="HW" value="foo"/>
+    </config>
+</ATSConfigData>"""
+    (params, attrs) = ats3.parsers.split_config_to_attributes_and_properties(StringIO.StringIO(config_text))
+
+    print attrs
+    print params
+    assert params ==  {u'HW': u'foo' }
+    assert attrs ==  { }
+
+
+def test_ATS_element3():
+    """ All alements can be used and several times. """
+    config_text = """
+<ATSConfigData>
+    <config name="attributes">
+    <set name="attrs" value="foo"/>
+    <set name="AB" value="100"/>
+    <set name="AC" value="101"/>
+    </config>
+    <config name="properties">
+    <set name="PA" value="foo"/>
+    </config>
+    <config name="properties">
+    <set name="HW" value="bar"/>
+    </config>
+</ATSConfigData>"""
+    	
+    (params, attrs) = ats3.parsers.split_config_to_attributes_and_properties(StringIO.StringIO(config_text))
+
+    print attrs
+    print params
+    assert params ==  {u'PA': u'foo' , u'HW': u'bar'}
+    assert attrs ==  {u'attrs': u'foo', u'AC': u'101', u'AB': u'100'}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_buildmodel.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,141 @@
+#============================================================================ 
+#Name        : test_buildmodel.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test build.model module. """
+
+import os
+import sys
+import tempfile
+import unittest
+
+import build.model
+import configuration
+import ccm
+import amara
+import logging
+
+_logger = logging.getLogger('test.bom')
+
+database = "to1tobet"
+
+class BOMMockFolder:    
+    def __init__(self, name, instance, description, tasks):
+        self.name = name
+        self.instance = instance
+        self.description = description
+        self.tasks = tasks
+        
+class BOMMockProject:
+    def __init__(self, name):
+        self.name = name
+    
+    def __str__(self):
+        return self.name
+    
+    @property
+    def tasks(self):
+        return []
+    
+    @property
+    def folders(self):
+        return [BOMMockFolder('5856', 'tr1s60', "all completed tasks for release ABS_domain/abs.mcl for collaborative projects", [])] 
+    
+class BOMMock:
+    
+    def __init__(self):
+        self.config = {}
+        self.config['build.id'] = "mock"
+    
+    @property
+    def projects(self):    
+        return [BOMMockProject('ABS_domain-abs.mcl_200843:project:tr1s60#1')] 
+
+    def all_baselines(self):
+        return []
+
+# Refactor required: See http://delivery.nmp.nokia.com/trac/helium/ticket/1517
+class BOMTest(unittest.TestCase):
+    """ Test BOM and related classes. """
+    
+# TODO - removed until non-Synergy dependent tests can be provided.
+
+#    def test_bom_output(self):
+#        """ Test basic BOM execution. Only new spec format will be covered!"""
+#        try:
+#            session = ccm.open_session(database=database)
+#        except ccm.CCMException:
+#            print "Skipping BOMTest test cases."
+#            return
+#            
+#        project = session.create('helium-helium_0.1:project:vc1s60p1#1')
+#        config_dict = {'delivery': 'tests/data/test_delivery.xml',
+#                       'prep.xml': 'tests/data/test_prep.xml',
+#                       'build.id': "test_0.0",
+#                       'ccm.database': session.database()}
+#        config = configuration.Configuration(config_dict)
+#        bom = build.model.BOM_new_spec_config(config, project)
+#        writer = build.model.BOMHTMLWriter(bom)
+#        writer.write("bom2.html")
+#        session.close()
+#        os.remove("bom2.html")
+#        os.remove("bom2.html.xml")
+
+    def test_bom_delta(self):
+        """ Testing BOM delta creation... """
+        delta = build.model.BOMDeltaXMLWriter(BOMMock(), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/build_model_bom.xml'))
+        delta.write(os.path.join(os.environ['HELIUM_HOME'], 'build','delta.xml'))
+        xml = amara.parse(open(os.path.join(os.environ['HELIUM_HOME'], 'build','delta.xml'), 'r'))
+        assert xml.bomDelta[0].buildFrom[0] == "ido_raptor_mcl_abs_MCL.52.57"
+        assert xml.bomDelta[0].buildTo[0] == "mock"
+
+        print "baselines: ", len(xml.bomDelta.content.baseline)
+        print "folders: ", len(xml.bomDelta.content.folder)
+        print "tasks: ", len(xml.bomDelta.content.task)
+        print "baseline[@overridden='false']:", len(xml.bomDelta.content.xml_xpath("baseline[@overridden='false']"))
+        print "baseline[@overridden='true']: ", len(xml.bomDelta.content.xml_xpath("baseline[@overridden='true']"))
+        print "folder[@status='deleted']: ", len(xml.bomDelta.content.xml_xpath("folder[@status='deleted']"))
+        print "task[@status='deleted']: ", len(xml.bomDelta.content.xml_xpath("task[@status='deleted']"))
+
+        assert len(xml.bomDelta.content.baseline) == 156
+        assert len(xml.bomDelta.content.folder) == 1
+        assert len(xml.bomDelta.content.task) == 1
+        assert len(xml.bomDelta.content.xml_xpath("baseline[@overridden='false']")) == 155
+        assert len(xml.bomDelta.content.xml_xpath("baseline[@overridden='true']")) == 1
+
+        assert len(xml.bomDelta.content.xml_xpath("folder[@status='deleted']")) == 1
+
+        assert len(xml.bomDelta.content.xml_xpath("task[@status='deleted']")) == 1
+        
+    def test_validate_bom_delta(self):
+        """ Testing BOM delta validation... """
+        bom_delta_validate = build.model.BOMDeltaXMLWriter((os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_102_bom.xml')), (os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_101_bom.xml')))
+        delta_bom_content_validity = bom_delta_validate.validate_delta_bom_contents(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_102_bom_delta.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_102_bom.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_101_bom.xml'))
+        self.assertEqual(True, delta_bom_content_validity) 
+        delta_bom_content_validity = bom_delta_validate.validate_delta_bom_contents(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_104_bom_delta.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_102_bom.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_101_bom.xml'))
+        self.assertEqual(False, delta_bom_content_validity) 
+        delta_bom_content_validity = bom_delta_validate.validate_delta_bom_contents(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_103_bom_delta.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_103_bom.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_102_bom.xml'))
+        self.assertEqual(None, delta_bom_content_validity) 
+
+    def test_BOMXMLWriter(self):
+        config_data = {'delivery': 'tests/data/test_delivery.xml', 'prep.xml': 'tests/data/test_prep.xml', 'build.id': 'buildid', 'symbian_rel_week': r'${symbian.version.week}', 'symbian_rel_ver': r'${symbian.version}', 'symbian_rel_year': r'${symbian.version.year}', 's60_version': r'${s60.version}', 's60_release': r'${s60.release}', 'currentRelease.xml': "tests/data/symrec/generated_release_metadata.xml"}
+        bom = build.model.BOM(configuration.Configuration(config_data))
+        xml_writer = build.model.BOMXMLWriter(bom)
+        (_, filename) = tempfile.mkstemp()
+        xml_writer.write(filename)
+        #_logger.info(open(filename).read())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_ccm.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,85 @@
+#============================================================================ 
+#Name        : test_ccm.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for ccm python toolkit.
+
+"""
+
+# pylint: disable-msg=E1101
+
+import logging
+import os
+import subprocess
+import sys
+import unittest
+
+import mocker
+
+import ccm
+import nokia.nokiaccm
+
+
+_logger = logging.getLogger('test.ccm')
+
+
+class CcmTest(mocker.MockerTestCase):
+    """ Tests the ccm module using mocker to prevent accessing a real Synergy database. """
+
+    def test_running_sessions(self):
+        """ Running sessions can be checked. """
+        obj = self.mocker.replace(ccm._execute)
+        if sys.platform == "win32":
+            obj('c:\\apps\\ccm65\\bin\\ccm.exe status')
+        else:
+            obj('/nokia/fa_nmp/apps/cmsynergy/6.5/bin/ccm status')
+        self.mocker.result(("""Sessions for user pmackay:
+
+Command Interface @ 1CAL01176:1553:10.241.72.23
+Database: /nokia/vc_nmp/groups/gscm/dbs/vc1s60p1
+
+Current project could not be identified.
+""", 0))
+
+        self.mocker.replay()
+
+        sessions = ccm.running_sessions()
+        print sessions
+
+#    def test_open_session(self):
+#        """ ccm session can be opened. """
+#        gscm_obj = self.mocker.replace(nokia.gscm._execute)
+#        gscm_obj('perl f:\\helium\\svn\\trunk\\helium\\tools/common/bin/get_gscm_info.pl get_router_address /nokia/vc_nmp/groups/gscm/dbs/vc1s60p1')
+#        self.mocker.result(("vccmsr65:55414:172.18.95.98:172.18.95.61:172.18.95.95:172.18.95.96:172.18.95.97", 0))
+#        
+#        obj = self.mocker.replace(ccm._execute)
+#        obj('c:\\apps\\ccm65\\bin\\ccm.exe start -m -q -nogui -n username -pw foobar -h vccmsweh.americas.company.com -d /nokia/vc_nmp/groups/gscm/dbs/vc1s60p1')
+#        self.mocker.result(("1CAL01176:1333:10.186.216.77:10.241.72.68", 0))
+#        
+#        self.mocker.replay()
+#        session = nokia.nokiaccm.open_session(password='foobar', engine='vccmsweh.americas.company.com', dbpath='/nokia/vc_nmp/groups/gscm/dbs/vc1s60p1', database='/nokia/vc_nmp/groups/gscm/dbs/vc1s60p1')
+        
+        
+    def test_timeout_launcher(self):
+        sys.path.append(os.path.join(os.environ['HELIUM_HOME'], 'tools/common/python/scripts'))
+        import timeout_launcher
+        #backup = sys.argv
+        #sys.argv = ['--', 'echo 1']
+        #timeout_launcher.main()
+        #sys.argv = backup
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_comments.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,78 @@
+#============================================================================ 
+#Name        : test_comments.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for Comments.py. """
+import unittest
+import comments
+import logging
+import amara
+
+
+class CommentParserTest(unittest.TestCase):
+    """ Test cases for Comments.py. """
+    
+    def setUp(self):
+        # Initialize the sample files into two Comment Parsers.
+        self.parser1 = comments.CommentParser( [r'tests/data/comments_test.txt'], 'branchInfo' )
+        self.parser2 = comments.CommentParser( [r'tests/data/comments_test.cpp', r'tests/data/comments_test.bat',
+                                                r'tests/data/comments_test.h', r'tests/data/comments_test.hrh',
+                                                r'tests/data/comments_test.iby', r'tests/data/comments_test.inf',
+                                                r'tests/data/comments_test.mk', r'tests/data/comments_test.mmp',
+                                                r'tests/data/comments_test.pl', r'tests/data/comments_test.xml',
+                                                r'tests/data/comments_test.py', r'tests/data/comments_test.java',
+                                                r'tests/data/comments_test1.cmd', r'tests/data/comments_test2.cmd'], 'branchInfo' )
+     #   self.parser3 = comments.CommentParser( [r'tests/data/comments_test2.cmd'], 'branchInfo' )
+     
+        
+
+    """ Unit test for method scan() in comments.py. It also tested scan_content by using scan()
+    """
+    def test_scan(self):
+        #doc1 for only one txt file. 
+        doc1 = amara.parse(self.parser1.scan().xml())
+        #doc2 for all other 14 types of files. It also included two types of cmd files.
+        doc2 = amara.parse(self.parser2.scan().xml())
+        
+        # doc1's test verifies all the information the xml comment provides.
+        self.assertEquals(doc1.commentLog.branchInfo.originator, "sanummel")
+        self.assertEquals(doc1.commentLog.branchInfo.category, "")
+        self.assertEquals(doc1.commentLog.branchInfo.since, "07-03-22")
+        self.assertEquals(doc1.commentLog.branchInfo.file, r'tests/data/comments_test.txt')
+        self.assertEquals(doc1.commentLog.branchInfo.error, "kkk")
+        self.assertEquals(str(doc1.commentLog.branchInfo).strip(),"Add rofsfiles for usage in paged images")
+        # s = (str(doc1.commentLog.xml()))
+        # print s
+        # doc2's test only verifies the main comment content.
+        self.assertEquals(str(doc2.commentLog.branchInfo[0]).strip(), "We need TwistOpen and TwistClose to cause display to change between\n landscape and portrait, but SysAp is consuming the key events.  Try\n treating them as Flip events are handled already by SysAp.")
+        self.assertEquals(str(doc2.commentLog.branchInfo[1]).strip(), "Testing if it's good~~~")
+        self.assertEquals(str(doc2.commentLog.branchInfo[2]).strip(), "We need TwistOpen and TwistClose to cause display to change between\n landscape and portrait, but SysAp is consuming the key events.  Try\n treating them as Flip events are handled already by SysAp.")
+        self.assertEquals(str(doc2.commentLog.branchInfo[3]).strip(), "puikko ME SCD DeSW: wk21 Flag fix")
+        self.assertEquals(str(doc2.commentLog.branchInfo[4]).strip(), "Since Catalogs is not compiling at this point, and we are not building it, don't try to\n pull it into the rom.  Also, tfxserver is crashing, so don't build or pull it in either.")
+        self.assertEquals(str(doc2.commentLog.branchInfo[5]).strip(), "Fix target export, which cause issue when cleanexport.")
+        self.assertEquals(str(doc2.commentLog.branchInfo[6]).strip(), "Move command to makmake as EBS does not call abld build")
+        self.assertEquals(str(doc2.commentLog.branchInfo[7]).strip(), "Activate PCFW for Screensaver")
+        self.assertEquals(str(doc2.commentLog.branchInfo[8]).strip(), "Support SPP mechanism for flags support.")
+        self.assertEquals(str(doc2.commentLog.branchInfo[9]).strip(), "Enabling all the HWRM light zones target for product")
+        self.assertEquals(str(doc2.commentLog.branchInfo[10]).strip(), "Again, it is just a test")
+        self.assertEquals(str(doc2.commentLog.branchInfo[11]).strip(), "Test info, so whatever~")
+        self.assertEquals(str(doc2.commentLog.branchInfo[12]).strip(), "k")
+        self.assertEquals(str(doc2.commentLog.branchInfo[13]).strip(), "")
+          
+    
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_configuration_model.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,120 @@
+#============================================================================ 
+#Name        : test_configuration_model.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import logging
+import os
+import sys
+import unittest
+import nose
+
+import configuration
+import configuration_model
+
+
+logger = logging.getLogger('test.configuration_model')
+#logging.basicConfig(level=logging.DEBUG)
+
+class GroupDefTest(unittest.TestCase):
+    """ Check config model groups are correctly defined. """
+    
+    def setUp(self):
+        """ Create model. """
+        self.model = configuration_model.DataModel('tests/data/data_model_test.xml')
+        
+    def test_init_model(self):
+        """ Test groups can be created. """
+        assert len(self.model.properties.keys()) == 3
+        assert len(self.model.groups.keys()) == 1
+        
+        prop1 = self.model.properties['test.property.1']
+        assert prop1.description == 'Test property one.'
+        
+        prop2 = self.model.properties['test.property.2']
+        assert prop2.description == 'Test property two.'
+        
+        assert self.model.groups['testGroup'] != None
+
+    def test_property_not_in_model(self):
+        """ Property not in model is identified. """
+        data = {'missing.property': 'foobar', 'test.property.1': '1'}
+        config = configuration.Configuration(data)
+        items = self.model.validate_config(config)
+        
+        assert len(items) == 2
+        assert isinstance(items[0], configuration_model.MissingFromDataModelItem)
+    
+    def test_required_property_in_group_not_defined(self):
+        """ Required property in a group missing from config is identified. """
+        config = configuration.Configuration({'test.property.1': '1', 'test.property.3': '3'})
+        items = self.model.validate_config(config)
+        
+        assert len(items) == 1
+        assert isinstance(items[0], configuration_model.UndefinedRequiredInGroupItem)
+ 
+        
+class MissingFromDataModelItemTest(unittest.TestCase):
+    """ Item class operations. """
+    def test_create(self):
+        """ Basic validation item usage. """
+        item = configuration_model.MissingFromDataModelItem('test.property')
+        assert str(item) == 'Property not in data model: test.property'
+        item.log(logger)
+        
+        
+class DataModelTest(unittest.TestCase):
+    """ Checks Data Model is properly defined """
+    
+    def setUp(self):
+        """ Create model. """
+        self.model = configuration_model.DataModel('tests/data/data_model_validation_test.xml')    
+       
+    def test_init_model(self):
+        """ Test groups can be created. """
+        assert len(self.model.properties.keys()) == 3
+        assert len(self.model.groups.keys()) == 1
+        
+        prop1 = self.model.properties['test.property.1']
+        assert prop1.type == 'string'
+        assert prop1.description == 'Test property one.'
+        
+        prop2 = self.model.properties['test.property.2']
+        assert prop2.type == 'string'
+        assert prop2.description == 'Test property two.'
+        
+        assert self.model.groups['testGroup'] != None
+        
+        
+class DataModelPropertyTest(unittest.TestCase):
+    """ Checks Data Model that an exception is thrown if properties are not properly defined """
+    
+    @nose.tools.raises(Exception)
+    def setUp(self):
+        """ Create model. """
+        self.model = configuration_model.DataModel('tests/data/data_model_validation__property_test.xml')
+        
+        
+class DataModelGroupTest(unittest.TestCase):
+    """ Checks Data Model that an exception is thrown if there is a required property in groups is missing"""
+    
+    @nose.tools.raises(Exception)
+    def setUp(self):
+        """ Create model. """
+        self.model = configuration_model.DataModel('tests/data/data_model_validation_group_test.xml')
+        
+             
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_dependancygraph.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,36 @@
+#============================================================================ 
+#Name        : test_dependancygraph.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import unittest
+import dependancygraph
+import logging
+import tempfile
+import os
+
+_logger = logging.getLogger('test.dependancygraph')
+logging.basicConfig(level=logging.INFO)
+
+class DependancygraphTest(unittest.TestCase):
+        
+    def test_dependancygraph(self):
+        (fd, filename) = tempfile.mkstemp()
+        f = os.fdopen(fd, 'w')
+        f.write('test')
+        f.close()
+        dependancygraph.createGraph(os.path.join(os.environ['HELIUM_HOME'], 'config/ivy/ivy.xml'), filename, os.path.join(os.environ['HELIUM_HOME'], 'external/python/lib'), os.path.join(os.environ['HELIUM_HOME'], 'extensions/nokia/external/python/lib'), False)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_fileutils.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,670 @@
+#============================================================================ 
+#Name        : test_fileutils.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test fileutils module. """
+
+import unittest
+import logging
+import os
+import shutil
+import time
+import sys
+import fileutils
+import archive
+
+_logger = logging.getLogger('test.fileutils')
+
+
+_test_file_paths = [
+    'root_file1.txt',
+    'root_file2.doc',
+    'root_file3_no_extension',
+
+    'dir1/file1.txt',
+    'dir1/file2.doc',
+    'dir1/file3_no_extension',
+    'dir1/subdir1/subdir1_file.txt',
+    'dir1/subdir2/subdir2_file_no_extension',
+    'dir1/subdir3/',
+
+    'dir2/',
+    'dir3/subdir/',
+    
+    'wildcard1.txt',
+    'wildcard2.doc',
+    'wildcard3',
+    'wildcard4/',
+    'wildcard5/file.txt',
+    
+    'dir/emptysubdir1/',
+    'dir/emptysubdir2/',
+    'dir/emptysubdir3/',
+
+    'emptydirerror/dir/',
+    'emptydirerror/dir/emptysubdir/',
+    'emptydirerror/dir/subdir/file.txt',
+    
+    u'test_unicode/test_\u00e9.txt',
+    u'test_unicode/test_\u00e7.txt',
+    u'test_unicode/test_\u00e4.txt',
+    
+    's60/Distribution.Policy.S60',
+    's60/component_public/Distribution.Policy.S60',
+    's60/component_public/component_public_file.txt',
+    's60/component_private/Distribution.Policy.S60',
+    's60/component_private/component_private_file.txt',
+    's60/missing/to_be_removed_9999.txt',    
+    's60/missing/subdir/Distribution.Policy.S60',
+    's60/missing/subdir/not_to_be_removed_0.txt',    
+    's60/missing/subdir/another_subdir/to_be_removed_9999.txt',    
+    's60/UPPERCASE_MISSING/to_be_removed_9999.txt',
+    's60/UPPERCASE_MISSING/subdir/Distribution.Policy.S60',
+    's60/UPPERCASE_MISSING/subdir/not_to_be_removed_0.txt',
+    's60/UPPERCASE_MISSING/subdir/another_subdir/to_be_removed_9999.txt',
+    's60/not_in_cvs/Distribution.Policy.S60',
+    'test_policies/1/Distribution.Policy.S60',
+    'test_policies/2/Distribution.Policy.S60',
+    'test_policies/3/Distribution.Policy.S60',
+    'test_policies/4/Distribution.Policy.S60',
+    'test_policies/5/Distribution.Policy.S60',
+    'test_policies/6/Distribution.Policy.S60',
+    'test_policies/7/Distribution.Policy.S60',
+    'test_policies/8/Distribution.Policy.S60',
+    'test_policies/9/Distribution.Policy.S60',
+    'symbian/distribution.policy',
+    'symbian/dir1/distribution.policy',
+    'symbian/dir2/distribution.policy',
+    'symbian/dir3/distribution.policy',
+    'symbian/dir4/distribution.policy',
+    'symbian/dir5/distribution.policy',
+    's60src/src-a/distribution.policy',
+    's60src/src-b/distribution.policy',
+    's60src/src-c/distribution.policy',
+
+    'sf/Distribution.Policy.S60',
+    'sf/component_public/Distribution.Policy.S60',
+    'sf/component_public/component_public_file.txt',
+    'sf/component_epl/Distribution.Policy.S60',
+    'sf/component_epl/component_epl_file.txt',
+    'sf/component_sfl/Distribution.Policy.S60',
+    'sf/component_sfl/component_sfl_file.txt',
+    'sf/component_private/Distribution.Policy.S60',
+    'sf/component_private/component_private_file.txt',
+    'sf/missing/to_be_removed_9999.txt',
+    'sf/missing/subdir/Distribution.Policy.S60',
+    'sf/missing/subdir/to_be_removed_9999.txt',
+    'sf/missing/subdir/subdir_nofiles/subdir_nofiles2/',    
+    'sf/missing/subdir/subdir_nopolicy/',    
+    'sf/missing/subdir/subdir_nopolicy/component_private_file.txt',
+    'sf/UPPERCASE_MISSING/to_be_removed_9999.txt',
+    'sf/UPPERCASE_MISSING/subdir/Distribution.Policy.S60',
+    'sf/UPPERCASE_MISSING/subdir/to_be_removed_9999.txt',
+    'sf/not_in_cvs/Distribution.Policy.S60',
+    ]
+
+_test_file_content = {
+    's60/Distribution.Policy.S60': '0',
+    's60/missing/subdir/Distribution.Policy.S60' : '0',
+    's60/UPPERCASE_MISSING/subdir/Distribution.Policy.S60': '0',
+    's60/component_public/Distribution.Policy.S60': '0',
+    's60/component_private/Distribution.Policy.S60': '1\r\n',
+    'test_policies/1/Distribution.Policy.S60': '\xFF\xFE\x30\x00\x0D\x00\x0D\x00\x0D\x00\x0A\x00',
+    'test_policies/2/Distribution.Policy.S60': '\xEF\xBB\xBF\x30\x0D\x0D\x0A',
+    'test_policies/3/Distribution.Policy.S60': '0 ; %version: 1 %',
+    'test_policies/4/Distribution.Policy.S60': '10 ; %version: 1 %',
+    'test_policies/5/Distribution.Policy.S60': '10ABC10',
+    'test_policies/6/Distribution.Policy.S60': '10ABC10 ; %version: 1 %',
+    'test_policies/7/Distribution.Policy.S60': '08421A2', # good
+    'test_policies/8/Distribution.Policy.S60': '08421A2 ; %version: 1 %', # bad
+    'test_policies/9/Distribution.Policy.S60': '1110A12', # bad
+    's60/not_in_cvs/Distribution.Policy.S60': '77777',
+    'symbian/distribution.policy': 'Category A',
+    'symbian/dir1/distribution.policy': 'Category B',
+    'symbian/dir2/distribution.policy': 'Line one \r\nAnother one \r\nCategory C',
+    'symbian/dir3/distribution.policy': 'Line one \r\nAnother one \r\nAnother one \r\nCategory D',
+    'symbian/dir4/distribution.policy': 'Line one \r\nAnother one \r\nNo Category',
+    'symbian/dir5/distribution.policy': 'Line one \r\nAnother one \r\nagain no category',
+    's60src/src-a/distribution.policy': 'Category A',
+    's60src/src-b/distribution.policy': 'Category B',
+    's60src/src-c/distribution.policy': 'Category C',
+    'sf/Distribution.Policy.S60': '0',
+    'sf/missing/subdir/Distribution.Policy.S60' : '0',
+    'sf/UPPERCASE_MISSING/subdir/Distribution.Policy.S60': '0',
+    'sf/component_public/Distribution.Policy.S60': '0',
+    'sf/component_sfl/Distribution.Policy.S60': '3',
+    'sf/component_epl/Distribution.Policy.S60': '7',
+    'sf/component_private/Distribution.Policy.S60': '1',
+    }
+    
+""" Used by test_archive. """
+root_test_dir = "build/_test_" + str(time.strftime("%H.%M.%S"))
+    
+def _testpath(subpath):
+    """ Normalised path for test paths. """
+    return os.path.normpath(os.path.join(root_test_dir, subpath))
+    
+def setup_module():
+    """ Setup files test config. 
+    
+    This creates a number of empty files in a temporary directory structure
+    for testing various file selection and archiving operations.
+    """
+    #print 'setup_module()'
+    #print _test_file_content.keys()
+    for child_path in _test_file_paths:
+        path = os.path.join(root_test_dir, child_path)
+        path_dir = path
+        path_dir = os.path.dirname(path)
+        
+        if (not os.path.exists(path_dir)):
+            _logger.debug('Creating dir:  ' + path_dir)
+            os.makedirs(path_dir)
+
+        if(not path.endswith('/') and not path.endswith('\\')):
+            _logger.debug('Creating file: ' + path)
+            handle = open(path, 'w')
+            # Write any file content that is needed
+            if _test_file_content.has_key(child_path):
+                handle.write(_test_file_content[child_path])
+            handle.close()
+
+def teardown_module():
+    """ Teardown test config. """
+    if os.path.exists(root_test_dir):
+        fileutils.rmtree(root_test_dir)
+    
+
+class FileScannerTest(unittest.TestCase):
+    """ Test FileScanner class. """
+    def test_1_scanner_paths(self):
+        """1) String representation of a constructed FileScanner is correct."""
+        scanner = fileutils.FileScanner(_testpath('test'))
+        scanner.add_include('python/')
+        # new implementation of the scanner doesn't convert modify the pattern strings...
+        expected_result = _testpath('test') + ';include:' + os.path.normpath('python/**')
+        assert str(scanner) == expected_result
+
+    def test_2_include_1(self):
+        """Files from root are included, no subdirs."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir1/*')
+        testpaths = [_testpath('dir1/file1.txt'),
+                     _testpath('dir1/file2.doc'),
+                     _testpath('dir1/file3_no_extension'),
+                     _testpath('dir1/subdir3')]
+        result = []
+        for path in scanner.scan():
+            result.append(path)
+        _logger.debug(result)
+        
+        # sorting the resuts
+        testpaths.sort()
+        result.sort()
+        
+        print result
+        print testpaths
+        assert result == testpaths
+        
+    def test_include_single_file(self):
+        """A single file from root is included."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir1/file1.txt')
+        testpaths = [_testpath('dir1/file1.txt')]
+        result = []
+        for path in scanner.scan():
+            result.append(path)
+        _logger.debug(result)
+        
+        print result
+        print testpaths
+        assert result == testpaths
+        
+    def test_include_single_file_and_glob_path(self):
+        """A single file from root and a glob path are included."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir1/file1.txt')
+        scanner.add_include('s60/component_public/')
+        testpaths = [_testpath(u'dir1/file1.txt'),
+                     _testpath(u's60/component_public/Distribution.Policy.S60'),
+                     _testpath(u's60/component_public/component_public_file.txt'),]
+        result = []
+        for path in scanner.scan():
+            result.append(path)
+        
+        if sys.platform == "win32":
+            testpaths = [s.lower() for s in testpaths]
+            result = [s.lower() for s in result]
+        result.sort()
+        testpaths.sort()
+        print result
+        print testpaths
+        assert result == testpaths
+
+    def test_3_include_2(self):
+        """Files and subdirs are included."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir1/**')
+        testpaths = [_testpath('dir1/file1.txt'),
+                     _testpath('dir1/file2.doc'),
+                     _testpath('dir1/file3_no_extension'),
+                     _testpath('dir1/subdir1/subdir1_file.txt'),
+                     _testpath('dir1/subdir2/subdir2_file_no_extension'),
+                     _testpath('dir1/subdir3')]
+        result = []
+        for path in scanner.scan():
+            result.append(path)
+        _logger.debug(result)
+        result.sort()
+        testpaths.sort()
+        print result
+        print testpaths
+        assert result == testpaths
+
+    def test_4_include_3(self):
+        """Wildcard includes in root."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('wild*')
+        testpaths = [_testpath('wildcard1.txt'),
+                     _testpath('wildcard2.doc'),
+                     _testpath('wildcard3'),
+                     _testpath('wildcard4')]
+        result = []
+        for path in scanner.scan():
+            result.append(path)
+        _logger.debug(result)
+        result.sort()
+        testpaths.sort()        
+        print result
+        print testpaths
+        assert result == testpaths
+
+    def test_5_include_4(self):
+        """Include empty dirs."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir2/')
+        scanner.add_include('dir3/**')
+        testpaths = [_testpath('dir2'),
+                     _testpath('dir3/subdir')]
+        result = []
+        for path in scanner.scan():
+            result.append(path)
+        _logger.debug(result)
+        result.sort()
+        testpaths.sort()        
+        print result
+        print testpaths
+        assert result == testpaths
+
+    def test_6_include_exclude_1(self):
+        """Wildcard excludes."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('root*')
+        scanner.add_include('wild*')
+        scanner.add_exclude('root_*')
+        testpaths = [_testpath('wildcard1.txt'),
+                     _testpath('wildcard2.doc'),
+                     _testpath('wildcard3'),
+                     _testpath('wildcard4')]
+        result = []
+        for path in scanner.scan():
+            result.append(path)
+        _logger.debug(result)
+        result.sort()
+        testpaths.sort()
+        
+        print result
+        print testpaths
+        assert result == testpaths
+
+    def test_7_include_exclude_2(self):
+        """Directory can be excluded."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir1/')
+        scanner.add_exclude('dir1/subdir1/')
+        scanner.add_exclude('dir1/subdir2/')
+        result = []
+        [result.append(path) for path in scanner.scan()]
+        testpaths = [_testpath('dir1/file1.txt'),
+                     _testpath('dir1/file2.doc'),
+                     _testpath('dir1/file3_no_extension'),
+                     _testpath('dir1/subdir3')]                   
+        result.sort()
+        testpaths.sort()
+        
+        print result
+        print testpaths
+        assert result == testpaths
+        
+    def test_8_include_exclude_3(self):
+        """Wildcard exclude."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir1/')
+        scanner.add_exclude('**/*.doc')
+        scanner.add_exclude('**/*.txt')
+        result = []
+        testpaths = [_testpath('dir1/file3_no_extension'),
+                     _testpath('dir1/subdir2/subdir2_file_no_extension'),
+                     _testpath('dir1/subdir3')]                   
+        [result.append(path) for path in scanner.scan()]
+        result.sort()
+        testpaths.sort()
+        
+        print result
+        print testpaths
+        assert result == testpaths
+
+    def test_case_sensitivity(self):
+        """ Test if returned list has correct case. """
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('s60/UPPERCASE_MISSING/')
+        result = []
+        testpaths = [_testpath('s60/UPPERCASE_MISSING/to_be_removed_9999.txt'),
+                     _testpath('s60/UPPERCASE_MISSING/subdir/Distribution.Policy.S60'),
+                     _testpath('s60/UPPERCASE_MISSING/subdir/not_to_be_removed_0.txt'),
+                     _testpath('s60/UPPERCASE_MISSING/subdir/another_subdir/to_be_removed_9999.txt')
+                     ]                   
+        [result.append(path) for path in scanner.scan()]
+        
+        testpaths.sort()
+        result.sort()
+        print result
+        print testpaths
+        assert result == testpaths
+
+
+    def test_emptydir(self):
+        """Empty dir."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir/emptysubdir1/')
+        result = []
+        testpaths = [_testpath('dir/emptysubdir1')]                   
+        [result.append(path) for path in scanner.scan()]
+        
+        result.sort()
+        testpaths.sort()
+
+        print result
+        print testpaths
+        assert result == testpaths
+
+    def test_emptydir_subdir(self):
+        """ Empty dir (with excluded subdirs). """
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('emptydirerror/dir/')
+        scanner.add_exclude('emptydirerror/dir/subdir/')
+        scanner.add_exclude('emptydirerror/dir/emptysubdir/')
+        result = []
+        testpaths = []                   
+        [result.append(path) for path in scanner.scan()]
+        
+        result.sort()
+        testpaths.sort()
+
+        print result
+        print testpaths
+        assert result == testpaths
+        
+    def test_emptydirs(self):
+        """Empty dirs."""
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir/')
+        scanner.add_exclude('dir/emptysubdir3/')
+        result = []
+        testpaths = [_testpath('dir/emptysubdir1'),
+                     _testpath('dir/emptysubdir2')]                   
+        [result.append(path) for path in scanner.scan()]
+        
+        print result
+        print testpaths
+        assert result == testpaths
+        
+    def test_distribution_policy_include(self):
+        """ Distribution policy files can determine file selection - include. """
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('s60/component_public/')
+        selector = archive.selectors.DistributionPolicySelector(['Distribution.policy.s60'], '0')
+        scanner.add_selector(selector)
+        
+        result = []
+        [result.append(path) for path in scanner.scan()]
+        testpaths = [_testpath('s60/component_public/component_public_file.txt'),
+                     _testpath('s60/component_public/distribution.policy.s60')]                   
+        
+        result = [s.lower() for s in result]
+        result.sort()
+        testpaths.sort()
+        print result
+        print testpaths
+        assert result == testpaths
+        
+        
+    def test_distribution_policy_exclude(self):
+        """ Distribution policy files can determine file selection - exclude. """
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('s60/component_private/')
+        selector = archive.selectors.DistributionPolicySelector(['Distribution.policy.s60'], '0')
+        scanner.add_selector(selector)
+        
+        result = []
+        [result.append(path) for path in scanner.scan()]
+        testpaths = []                   
+        
+        assert result == testpaths
+        
+        
+    def test_symbian_distribution_policy_cat_a(self):
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('s60src/src-a/')
+        selector = archive.selectors.SymbianPolicySelector(['distribution.policy'], 'A')
+        scanner.add_selector(selector)
+                
+        result = []
+        [result.append(path) for path in scanner.scan()]
+        testpaths = [_testpath('s60src/src-a/distribution.policy')] 
+ 
+        assert result == testpaths
+        
+    def test_symbian_distribution_policy_cat_b(self):        
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('s60src/src-b/')
+        selector = archive.selectors.SymbianPolicySelector(['distribution.policy'], 'B')
+        scanner.add_selector(selector)
+                       
+        result = []
+        [result.append(path) for path in scanner.scan()]
+        testpaths = [_testpath('s60src/src-b/distribution.policy')] 
+              
+        assert result == testpaths     
+        
+    def test_symbian_distribution_policy_cat_not_a_not_b(self):        
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('s60src/src-c/')
+        selector = archive.selectors.SymbianPolicySelector(['distribution.policy'], '!A,!B')
+        scanner.add_selector(selector)
+                       
+        result = []
+        [result.append(path) for path in scanner.scan()]
+                  
+        testpaths = [_testpath('s60src/src-c/distribution.policy')] 
+        
+        assert result == testpaths     
+    
+        
+    def test_find_subroots(self):
+        """ Testing the find_subroots method. """
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir/emptysubdir1')
+        scanner.add_include('dir/**/dir')
+        scanner.add_include('foo/**/dir')
+        scanner.add_include('bar/subdir/dir1/**')
+        scanner.add_include('bar/subdir/dir2/**')
+        scanner.add_include('bar/subdir/dir3/x/**')
+        scanner.add_include('bar/subdir/dir3/**')
+        result = scanner.find_subroots()
+        _logger.debug(result)
+        print result              
+        assert result == [_testpath('dir'), _testpath('foo'), 
+                          _testpath('bar/subdir/dir1'), 
+                          _testpath('bar/subdir/dir2'), 
+                          _testpath('bar/subdir/dir3')]
+
+        scanner = fileutils.FileScanner(_testpath(''))
+        scanner.add_include('dir/emptysubdir1')
+        scanner.add_include('**/dir')
+        scanner.add_include('foo/**/dir')
+        result = scanner.find_subroots()
+        _logger.debug(result)              
+        assert result == [_testpath('')]
+
+
+    def test_load_policy_content(self):
+        try:
+            fileutils.load_policy_content(_testpath('test_policies/1/Distribution.Policy.S60'))
+            assert "Should fail while loading 'test_policies/1/Distribution.Policy.S60'."
+        except:
+            pass
+        
+        try:
+            fileutils.load_policy_content(_testpath('s60/Distribution.Policy.S60'))
+        except:
+            assert "Should not fail while loading 's60/Distribution.Policy.S60'."
+
+
+    def assert_policy_file(self, filename, value=None, exception=False):
+        if exception:
+            try:
+                fileutils.read_policy_content(filename)
+                assert "Should fail while loading '%s'." % filename
+            except:
+                pass
+        else:
+            assert fileutils.read_policy_content(filename) == value
+    def assert_symbian_policy_file(self, filename, value=None, exception=False):
+        if exception:
+            try:
+                fileutils.read_symbian_policy_content(filename)
+                assert "Should fail while loading '%s'." % filename
+            except:
+                pass
+        else:
+            assert fileutils.read_symbian_policy_content(filename) == value
+        
+    def test_read_policy_content_strict(self):
+        """ Test policy content using strict rules. """
+
+        self.assert_policy_file(_testpath('s60/Distribution.Policy.S60'), value='0')
+        self.assert_policy_file(_testpath('s60/component_private/Distribution.Policy.S60'), value='1')
+        self.assert_policy_file(_testpath('test_policies/1/Distribution.Policy.S60'), exception=True)
+        self.assert_policy_file(_testpath('test_policies/2/Distribution.Policy.S60'), exception=True)
+        self.assert_policy_file(_testpath('test_policies/3/Distribution.Policy.S60'), exception=True)
+        self.assert_policy_file(_testpath('test_policies/4/Distribution.Policy.S60'), exception=True)
+        self.assert_policy_file(_testpath('test_policies/5/Distribution.Policy.S60'), exception=True)
+        self.assert_policy_file(_testpath('test_policies/6/Distribution.Policy.S60'), exception=True)
+
+    def test_read_policy_content_strict_focalid(self):
+        """ Testing Focal ID support. """
+        self.assert_policy_file(_testpath('test_policies/7/Distribution.Policy.S60'), value='08421A2')
+        self.assert_policy_file(_testpath('test_policies/8/Distribution.Policy.S60'), exception=True)
+        self.assert_policy_file(_testpath('test_policies/9/Distribution.Policy.S60'), exception=True)
+
+    def test_read_symbian_policy_content_strict(self):
+        """ Test symbian policy content using strict rules. """
+
+        self.assert_symbian_policy_file(_testpath('symbian/distribution.policy'), value='A')
+        self.assert_symbian_policy_file(_testpath('symbian/dir1/distribution.policy'), value='B')
+        self.assert_symbian_policy_file(_testpath('symbian/dir2/distribution.policy'), value='C')
+        self.assert_symbian_policy_file(_testpath('symbian/dir3/distribution.policy'), value='D')
+        self.assert_symbian_policy_file(_testpath('symbian/dir4/distribution.policy'), exception=True)
+        self.assert_symbian_policy_file(_testpath('symbian/dir5/distribution.policy'), exception=True)
+
+class TestLongPath(unittest.TestCase):
+
+    long_path = os.path.join(root_test_dir, '01234567890123456789012345678901234567890123456789', 
+                     '01234567890123456789012345678901234567890123456789', '01234567890123456789012345678901234567890123456789',
+                     '01234567890123456789012345678901234567890123456789', '01234567890123456789012345678901234567890123456789')
+    def setUp(self):
+        self.mkdirs(os.path.join(self.long_path, r'dir1'))
+        self.mkdirs(os.path.join(self.long_path, r'dir2'))
+        if not '\\\\?\\' + os.path.abspath((os.path.join( self.long_path, r'foo.txt'))):
+            import win32file
+            win32file.CreateFileW('\\\\?\\' + os.path.abspath(os.path.join(self.long_path, r'foo.txt')), 0, 0, None, win32file.CREATE_NEW, 0, None)
+
+    def mkdirs(self, path):
+        if not os.path.isabs(path):
+            path = os.path.join(os.path.abspath('.'), os.path.normpath(path))
+        if not os.path.exists(os.path.dirname(path)):
+            self.mkdirs(os.path.dirname(path))
+        self.mkdir(path)
+
+    def mkdir(self, path):
+        if 'java' in sys.platform:
+            import java.io
+            f = java.io.File(path)
+            if not f.exists():
+                os.mkdir(path)
+        elif not os.path.exists(path):
+            if sys.platform == "win32":
+                try:
+                    import win32file
+                    win32file.CreateDirectoryW('\\\\?\\' + path, None)
+                except:
+                    pass
+            else:
+                os.mkdir(path)
+
+    def test_rmtree_long_path(self):
+        fileutils.rmtree(root_test_dir)
+        assert not os.path.exists(self.long_path)
+        assert not os.path.exists(root_test_dir)
+
+    def test_rmtree_long_path_unc_format(self):
+        if sys.platform == "win32":
+            fileutils.rmtree(u"\\\\?\\" + os.path.join(os.path.abspath('.'), root_test_dir))
+            assert not os.path.exists(self.long_path)
+            assert not os.path.exists(root_test_dir)
+        
+class DestInSrcTest(unittest.TestCase):
+    
+    def test_destinsrc(self):
+        """ Verify that Z:/a/b/c/d is under Z:/a/b/c """
+        src = r"Z:/a/b/c"
+        dst = r"Z:/a/b/c/d"
+        assert fileutils.destinsrc(src, dst) is True
+    
+    def test_destinsrc2(self):
+        """ Verify that Z:/a/b/c/d is not under Z:/a/b/cc """
+        src = r"Z:/a/b/cc"
+        dst = r"Z:/a/b/c/d"
+        assert fileutils.destinsrc(src, dst) is False
+
+    def test_destinsrc_nt(self):
+        """ Verify that Z:/a/b/c/d is under Z:/a/b/C """
+        src = r"Z:/a/b/C"
+        dst = r"Z:/a/b/c/d"
+        if os.sep == '\\':
+            assert fileutils.destinsrc(src, dst) is True
+        else:
+            assert fileutils.destinsrc(src, dst) is False
+
+    def test_destinsrc2_nt(self):
+        """ Verify that Z:/a/b/c/d is not under Z:/a/b/CC """
+        if os.sep == '\\':
+            src = r"Z:/a/b/CC"
+            dst = r"Z:/a/b/c/d"
+            assert fileutils.destinsrc(src, dst) is False
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_iqrf.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,45 @@
+#============================================================================ 
+#Name        : test_iqrf.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for iqrf module. """
+import unittest
+import os
+import imaker.iqrf
+
+
+class Test_iQRF(unittest.TestCase):
+    """ Test for iQRF data access. """
+    
+    def test_file_parsing_5250(self):
+        """ Testing if the iqrf module is able to load the 5250 configuration. """
+        root = imaker.iqrf.load(os.path.join(os.environ['HELIUM_HOME'], "tests/data/iqrf/imaker_5250.xml"))        
+        assert root.result != None
+        assert len(root.result.targets) == 228
+        assert len(root.result.interfaces) == 1
+        assert len(root.result.configurations) == 6
+        
+        # testing a configurations
+        assert root.result.configurations[0].name == "image_conf_product52.mk"
+        assert root.result.configurations[0].filePath == r"\epoc32\rom\config\platform\product52\image_conf_product52.mk"
+        assert len(root.result.configurations[0].targetrefs) == 38
+        assert root.result.configurations[0].targetrefs[0].name == "all"
+        
+        # testing interfaces
+        print "root.result.configurations[0].filePath: %s" % root.result.configurations[0].filePath
+        assert len(root.result.interfaces[0].configurationElements) == 516
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_logger.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,100 @@
+#============================================================================ 
+#Name        : test_logger.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import logging
+import os
+import unittest
+
+import helium.logger
+import helium.outputer
+
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+#logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger('test.helium.logger')
+
+
+class TestHeliumLogger(unittest.TestCase):
+            
+    def test_mc_logger_xml_generation(self):
+        """ Test simple XML logging generation. """
+        mclogger = helium.logger.Logger()
+        mclogger.SetInterface("http://fawww.europe.company.com/isis/isis_interface/")
+        mclogger.SetTitle("Validate Overlay")
+        mclogger.SetSubTitle("Validating: ")
+        mclogger.OpenMainContent("test")
+        mclogger.PrintRaw("<a href=\"google.com\">test</a>")
+        mclogger.Print("test")
+        mclogger.Print(u"\u00A9")
+        mclogger.error("test")
+        mclogger.CloseMainContent()
+        mclogger.OpenMainContent("test2")
+        mclogger.OpenEvent("test2")
+        mclogger.Print("test2")
+        mclogger.error("test2")
+        mclogger.CloseEvent()
+        mclogger.CloseMainContent()
+        mclogger.WriteToFile('log.xml')
+        
+        logger.info(mclogger)
+        
+        os.unlink('log.xml')
+        
+        #out = helium.outputer.XML2XHTML("log.xml")
+        #out.generate()
+        #out.WriteToFile("log.html")
+
+    def test_helium_logger_unicode_handling(self):
+        """ Test simple XML logging generation with unicode handling. """
+        mclogger = helium.logger.Logger()
+        mclogger.SetInterface("http://fawww.europe.company.com/isis/isis_interface/")
+        mclogger.SetTitle("Validate Overlay")
+        mclogger.SetSubTitle("Validating: ")
+        mclogger.OpenMainContent("test")
+        mclogger.Print(u"Test unicode handling: \u00A9")
+        mclogger.CloseMainContent()
+        mclogger.WriteToFile('log.xml')
+        
+        logger.info(mclogger)
+        
+        os.unlink('log.xml')
+
+    def test_helium_logger_outputer(self):
+        """ Test simple XML logging generation with unicode handling and XHTML generation. """
+        mclogger = helium.logger.Logger()
+        mclogger.SetInterface("http://fawww.europe.company.com/isis/isis_interface/")
+        mclogger.SetTitle("Validate Overlay")
+        mclogger.SetSubTitle("Validating: ")
+        mclogger.OpenMainContent("test")
+        mclogger.Print(u"Test unicode handling: \u00A9")
+        mclogger.CloseMainContent()
+        mclogger.WriteToFile('log.xml')
+        
+        logger.info(mclogger)
+        
+        out = helium.outputer.XML2XHTML('log.xml')
+        out.generate()
+        out.WriteToFile('log.html')
+        
+        os.unlink('log.xml')
+        os.unlink('log.html')
+
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_matti.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,216 @@
+# -*- coding: latin-1 -*-
+
+#============================================================================ 
+#Name        : test_matti.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Testing MATTI framework. """
+
+# pylint: disable-msg=E1101,W0603,W0142
+
+import logging
+logging.getLogger().setLevel(logging.ERROR)
+import os
+#import shutil
+
+from path import path
+
+import ats3.aste
+import ats3.matti.MattiDrops
+#from lxml import objectify
+#from lxml import etree
+
+
+
+# Shortcuts
+HELIUM_ADDR = os.environ['HELIUM_HOME']
+TEST_FILE_NAME = os.path.join(HELIUM_ADDR, 'test.xml')
+ZIP_FILE_NAME = os.path.join(HELIUM_ADDR, 'MATTIDrop.zip')
+
+class Bunch(object):
+    """do something with the paramerters passed to it"""    
+    def __init__(self, **kwargs): 
+        self.__dict__.update(kwargs)
+    
+
+def equal_xml(result, expect):
+    """Check the equality of the given XML snippets. """
+#    logging.info(" expect %s" % expect)
+#    xml1 = objectify.fromstring(expect)
+#    expect1 = etree.tostring(xml1)
+#    logging.info(" expect1 %s" % expect1)
+#    logging.info(" expect2 -------------%s" % expect2)
+#            
+#    xml2 = objectify.fromstring(result)
+#    result2 = etree.tostring(xml2)        
+#    self.assertEquals(expect1, result1)
+#
+#    if xml1.tag != xml2.tag:
+#        return False
+#    if xml1.attrib != xml2.attrib:
+#        return False
+#    if xml1.text:
+#        if not xml2.text:
+#            return False
+#    if xml2.text:
+#        if not xml1.text:
+#            return False
+#    if xml1.text and xml2.text and xml1.text.strip() != xml2.text.strip():
+#        return False
+#    if xml1.tail is not None and xml2.tail is not None:
+#        if xml1.tail.strip() != xml2.tail.strip():
+#            return False
+#    elif xml1.tail != xml2.tail:
+#        return False
+#    children1 = list(xml1.getchildren())
+#    children2 = list(xml2.getchildren())
+#    if len(children1) != len(children2):
+#        return False
+#    for child1, child2 in zip(children1, children2):
+#        return equal_xml(child1, child2)
+#    return True
+    if expect:
+        return result   
+
+
+def setup_module():
+    """ stuff to do before running the tests """
+    pass    
+    
+def teardown_module():
+    """ stuff to do after running the tests """
+    if os.path.exists(TEST_FILE_NAME):
+        os.remove(TEST_FILE_NAME)
+    if os.path.exists(ZIP_FILE_NAME):
+        os.remove(ZIP_FILE_NAME)
+    
+    
+class TestPlanMatti():
+    """ test MattiDrop.py """
+    def __init__(self): 
+        self.config = None
+        self.tp_result = None
+            
+    def test_all_present(self):
+        """ test mattiDrops.py with all parameters present and correct"""
+        teardown_module()
+        opts = Bunch(build_drive="z:", 
+             matti_scripts=os.path.join(HELIUM_ADDR, 'testconfig/ats3/matti/script/'), 
+             flash_images = HELIUM_ADDR + os.sep + "testconfig/ats3/matti/variant_images/test_file.fpsx," \
+                + HELIUM_ADDR + os.sep + "testconfig/ats3/matti/variant_images/test_file_3rd.fpsx," \
+                + HELIUM_ADDR + os.sep + "testconfig/ats3/matti/variant_images/test_file_another.fpsx",
+             report_email="", harness="STIF", 
+             file_store=path(), testrun_name="testrun",  
+             device_type="product", device_hwid="5425", diamonds_build_url="", drop_file="MATTIDrop.zip", 
+             minimum_flash_images="2", plan_name="matti_test_plan", 
+             sis_files= HELIUM_ADDR + os.sep + "testconfig/ats3/matti/sis/test_file_matti_install.sis," \
+                + HELIUM_ADDR + os.sep + "testconfig/ats3/matti/sis/another_test_file_matti_install.sis", 
+             template_loc=os.path.join(HELIUM_ADDR, 'tools/common/python/lib/ats3/matti/template/matti_demo.xml'), 
+             test_timeout="60", verbose="false")
+       
+        self.config = ats3.matti.MattiDrops.Configuration(opts)
+        self.tp_result = ats3.matti.MattiDrops.create_drop(self.config)
+        assert os.path.exists(ZIP_FILE_NAME)
+        assert os.path.exists(TEST_FILE_NAME)
+        #shutil.copy(TEST_FILE_NAME, os.path.join(HELIUM_ADDR, 'testconfig/ats3/matti/test_all_present.xml'))
+        #equal_xml(TEST_FILE_NAME, os.path.join(HELIUM_ADDR, 'testconfig/ats3/matti/test_all_present.xml'))
+        
+    def test_no_sis_or_flash_files(self):
+        """test mattiDrops.py with no sis or flash files in the parameters"""
+        teardown_module()
+        opts = Bunch(build_drive="z:", 
+             matti_scripts=os.path.join(HELIUM_ADDR, 'testconfig/ats3/matti/script/'), 
+             flash_images = "",
+             report_email="", harness="STIF", 
+             file_store=path(), testrun_name="testrun",  
+             device_type="product", device_hwid="5425", diamonds_build_url="", drop_file="MATTIDrop.zip", 
+             minimum_flash_images="2", plan_name="matti_test_plan", 
+             sis_files= "", 
+             template_loc=os.path.join(HELIUM_ADDR, 'tools/common/python/lib/ats3/matti/template/matti_demo.xml'), 
+             test_timeout="60", verbose="true")
+       
+        self.config = ats3.matti.MattiDrops.Configuration(opts)
+        self.tp_result = ats3.matti.MattiDrops.create_drop(self.config)
+        assert os.path.exists(ZIP_FILE_NAME)
+        assert os.path.exists(TEST_FILE_NAME)
+        #shutil.copy(TEST_FILE_NAME, os.path.join(HELIUM_ADDR, 'testconfig/ats3/matti/test_no_sis_or_flash.xml'))
+        #equal_xml(TEST_FILE_NAME, os.path.join(HELIUM_ADDR, 'testconfig/ats3/matti/test_no_sis_or_flash.xml'))
+
+
+    def test_no_files(self):
+        """ test mattiDtops.py with no filespresent at all"""
+        teardown_module()
+        opts = Bunch(build_drive="z:", 
+             matti_scripts=os.path.join(HELIUM_ADDR, 'testconfig/ats3/matti/variant_images/'), 
+             flash_images = "",
+             report_email="", harness="STIF", 
+             file_store=path(), testrun_name="testrun",  
+             device_type="product", device_hwid="5425", diamonds_build_url="", drop_file="MATTIDrop.zip", 
+             minimum_flash_images="2", plan_name="matti_test_plan", 
+             sis_files= "", 
+             template_loc=os.path.join(HELIUM_ADDR, 'tools/common/python/lib/ats3/matti/template/matti_demo.xml'), 
+             test_timeout="60", verbose="true")
+        self.config = ats3.matti.MattiDrops.Configuration(opts)
+        self.tp_result = ats3.matti.MattiDrops.create_drop(self.config)
+        assert not os.path.exists(ZIP_FILE_NAME)
+        assert os.path.exists(TEST_FILE_NAME)
+        #shutil.copy(TEST_FILE_NAME, os.path.join(HELIUM_ADDR, 'testconfig/ats3/matti/test_no_files.xml'))
+        #equal_xml(TEST_FILE_NAME, os.path.join(HELIUM_ADDR, 'testconfig/ats3/matti/test_no_files.xml'))
+
+    def test_no_params(self):
+        """test MattiDrops.py with no parameters present at all"""
+        teardown_module()
+        opts = Bunch(build_drive="", 
+             matti_scripts="", 
+             flash_images = "",
+             report_email="", harness="", 
+             file_store="", testrun_name="",  
+             device_type="", device_hwid="", diamonds_build_url="", drop_file="", 
+             minimum_flash_images="", plan_name="", 
+             sis_files= "", 
+             template_loc="", 
+             test_timeout="", verbose="true")
+       
+        self.config = ats3.matti.MattiDrops.Configuration(opts)
+        self.tp_result = ats3.matti.MattiDrops.create_drop(self.config)
+        assert not os.path.exists(ZIP_FILE_NAME)
+        assert not os.path.exists(TEST_FILE_NAME)
+
+    def test_some_not_present(self):
+        """ test MattiDrops.py with an extra file not present in the dir"""
+        teardown_module()
+        opts = Bunch(build_drive="z:", 
+             matti_scripts=os.path.join(HELIUM_ADDR, 'testconfig/ats3/matti/script/'), 
+             flash_images = HELIUM_ADDR + os.sep + "testconfig/ats3/matti/variant_images/test_file.fpsx," \
+                + HELIUM_ADDR + os.sep + "testconfig/ats3/matti/variant_images/test_file_3rd.fpsx," \
+                + HELIUM_ADDR + os.sep + "testconfig/ats3/matti/variant_images/test_file_different.fpsx",
+             report_email="", harness="STIF", 
+             file_store=path(), testrun_name="testrun",  
+             device_type="product", device_hwid="5425", diamonds_build_url="", drop_file="MATTIDrop.zip", 
+             minimum_flash_images="2", plan_name="matti_test_plan", 
+             sis_files= HELIUM_ADDR + os.sep + "testconfig/ats3/matti/sis/test_file_matti_install.sis," \
+                + HELIUM_ADDR + os.sep + "testconfig/ats3/matti/sis/another_test_file.sis", 
+             template_loc=os.path.join(HELIUM_ADDR, 'tools/common/python/lib/ats3/matti/template/matti_demo.xml'), 
+             test_timeout="60", verbose="false")
+       
+        self.config = ats3.matti.MattiDrops.Configuration(opts)
+        self.tp_result = ats3.matti.MattiDrops.create_drop(self.config)
+        assert os.path.exists(ZIP_FILE_NAME)
+        assert os.path.exists(TEST_FILE_NAME)
+        #shutil.copy(TEST_FILE_NAME, os.path.join(HELIUM_ADDR, 'testconfig/ats3/matti/test_some_not_present.xml'))
+        #equal_xml(TEST_FILE_NAME, os.path.join(HELIUM_ADDR, 'testconfig/ats3/matti/test_some_not_present.xml'))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_packageiad.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,91 @@
+#============================================================================ 
+#Name        : test_packageiad.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for packageiad.
+
+"""
+import sys
+import os
+import filecmp
+import xml.dom.minidom
+import logging
+
+
+logger = logging.getLogger('test.ccm_results')
+logging.basicConfig(level=logging.INFO)
+
+
+def setup_module():
+    """ Creates some test data files for file-related testing. """
+    
+    
+def teardown_module():
+    """ Cleans up test data files for file-related testing. """
+    if os.path.exists('testPackage.zip') and os.path.isfile('testPackage.zip'): 
+        os.remove('testPackage.zip')
+
+    
+#def test_package_main(self):
+    """ Test the package IAD class.
+    sys.path.append(os.path.join(os.environ['HELIUM_HOME'], 'tools', 'iad'))
+    iad = __import__('packageiad')
+    sysdef = os.path.join(os.environ['HELIUM_HOME'], 'tests', 'data', 'packageiad', 'layers.sysdef.xml')
+    sysdefconfigs = "developer_mc_4032"
+    builddrive = os.path.join(os.environ['HELIUM_HOME'], 'tests', 'data', 'packageiad')
+    result = iad.main(sysdef, sysdefconfigs, builddrive) """
+
+#def test_package_processSisDir(self):
+    """ Test the packageiad test_package_processSisDir method.
+    sys.path.append(os.path.join(os.environ['HELIUM_HOME'], 'tools', 'iad'))
+    iad = __import__('packageiad')
+    packager = iad.IADPackager()    #init the packager
+    builddrive = os.path.join(os.environ['HELIUM_HOME'], 'tests', 'data', 'packageiad')
+    buildDirs = os.path.join(os.environ['HELIUM_HOME'], 'tests', 'data', 'packageiad', 'sis\\')
+    packager.processSisDir(buildDirs, builddrive + "\\epoc32\\tools\\makesis.exe") """
+    
+def test_createPackage():
+    """ test the create package method """
+    #load up the python file
+    sys.path.append(os.path.join(os.environ['HELIUM_HOME'], 'tools', 'iad'))
+    iad = __import__('packageiad')
+    packager = iad.IADPackager()    #init the packager
+    topDir = os.path.join(os.environ['HELIUM_HOME'], 'tests', 'data', 'packageiad', 'sis')
+    packageName = 'testPackage'
+    currentDir = os.getcwd()
+    packager.createPackage(topDir, packageName)
+    if not os.path.exists('testPackage.zip') and not os.path.isfile('testPackage.zip'):
+        logger.info("testPackage.zip file not created")
+        assert (os.path.exists('testPackage.zip') and os.path.isfile('testPackage.zip'))
+    os.chdir(currentDir)
+    
+def test_getLayers():
+    """ test getLayers in packageIAD """
+    sys.path.append(os.path.join(os.environ['HELIUM_HOME'], 'tools', 'iad'))
+    iad = __import__('packageiad')
+    sysdefFile = os.path.join(os.environ['HELIUM_HOME'], 'tests', 'data', 'packageiad', 'layers.sysdef.xml')
+    sysdef = xml.dom.minidom.parse (sysdefFile)
+    configurations = sysdef.getElementsByTagName ("configuration")
+    layers = sysdef.getElementsByTagName ("layer")
+
+    bldDirs = []
+    
+    packager = iad.IADPackager()
+    
+    for configuration in configurations :
+        packager.getLayer (configuration, layers, bldDirs)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_parsers.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,687 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================ 
+#Name        : test_parsers.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import os
+import sys
+import tempfile
+import mocker
+from path import path
+import StringIO
+
+import ats3.parsers
+import ats3.testconfigurator
+
+import logging
+logging.getLogger().setLevel(logging.ERROR)
+
+TSRC_DIR = None
+
+def setup_module():
+    """Setup the test environment. The testing of the test parser script requires spesific
+    structure to be available with bld.inf files (with the content written into those)."""
+    global TSRC_DIR
+    TSRC_DIR = path(tempfile.mkdtemp()).normpath()
+    test_component = TSRC_DIR
+    for path_parts in (("tsrc", "group"),
+                       ("tsrc", "tc1", "group"),
+                       ("tsrc", "tc1", "data"),
+                       ("tsrc", "tc1", "dependent_1", "group"),
+                       ("tsrc", "tc1", "dependent_2", "group"),
+                       ("tsrc", "tc1", "subtest", "group"),
+                       ("tsrc", "tc1", "subtest", "data"),
+                       ("tsrc", "tc1", "subtest", "if_test", "group"),
+                       ("tsrc", "tc2", "group"),
+                       ("tsrc", "tc2", "data"),
+                       ("tsrc", "tc3", "group"),
+                       ("tsrc", "tc3", "data"),
+                       ("tmp", "macros"),
+                       ):
+        filepath = path.joinpath(test_component, *path_parts).normpath()
+        if not filepath.exists():
+            os.makedirs(filepath)
+    
+        
+    tsrc = open(path.joinpath(TSRC_DIR, "tsrc", "group", "bld.inf"), 'w')
+    tsrc.write(
+            r"""
+#include "../tc1/group/bld.inf"
+#include "../tc2/group/bld.inf"
+#include "../tc3/group/bld.inf" 
+
+PRJ_TESTMMPFILES
+
+            """)
+    tsrc.close()
+    
+    tc1 = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "group", "bld.inf"), 'w')
+    tc1.write(
+            r"""
+#include "../dependent_1/group/bld.inf"
+#include "../dependent_2/group/bld.inf"
+#include "../subtest/group/bld.inf"
+
+PRJ_TESTMMPFILES
+tc1.mmp
+
+PRJ_MMPFILES
+not_included.mmp
+            """)
+    tc1.close()
+    
+    tc1_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "group", "tc1.mmp"), 'w')
+    tc1_mmp.write(
+            r"""
+TARGET          tc1.dll
+TARGETTYPE      dll
+LIBRARY         stiftestinterface.lib
+LIBRARY         user.lib
+            """)
+    tc1_mmp.close()
+    
+    tc1_sub = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "subtest", "group", "bld.inf"), "w")
+    tc1_sub.write(
+            r"""
+PRJ_TESTMMPFILES
+sub_test.mmp    
+#ifndef RD_TEST1
+#include "../if_test/group/bld.inf"
+#endif
+            """)
+    tc1_sub.close()
+    tc1_sub_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "subtest", "group", "sub_test.mmp"), 'w')
+    tc1_sub_mmp.write(
+            r"""
+TARGET          sub_test.dll
+TARGETTYPE      dll
+LIBRARY         stiftestinterface.lib
+            """)
+    tc1_sub_mmp.close()
+
+    
+    tc1_if = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "subtest", "if_test", "group", "bld.inf"), "w")
+    tc1_if.write(
+            r"""
+PRJ_TESTMMPFILES
+if_test.mmp
+            """)
+    tc1_if.close()
+    tc1_if_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "subtest", "if_test", "group", "if_test.mmp"), 'w')
+    tc1_if_mmp.write(
+            r"""
+TARGET          tc1_if.dll
+TARGETTYPE      dll
+LIBRARY         stifunit.lib
+            """)
+    tc1_if_mmp.close()
+
+    tc1_dep1 = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "dependent_1", "group", "bld.inf"), "w")
+    tc1_dep1.write(
+            r"""
+PRJ_TESTMMPFILES
+dependent_1.mmp
+onemore.mmp
+            """)
+    tc1_dep1.close()
+
+    tc1_dep1_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "dependent_1", "group", "dependent_1.mmp"), 'w')
+    tc1_dep1_mmp.write(
+            r"""
+TARGET          dependent_1.dll
+TARGETTYPE      PLUGIN
+            """)
+    tc1_dep1_mmp.close()
+        
+    tc1_dep2 = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "dependent_2", "group", "bld.inf"), "w")
+    tc1_dep2.write(
+            r"""
+PRJ_TESTMMPFILES
+dependent_2.mmp
+            """)
+    tc1_dep2.close()
+    
+    tc1_dep2_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "dependent_2", "group", "dependent_2.mmp"), 'w')
+    tc1_dep2_mmp.write(
+            r"""
+TARGET          dependent_2.dll
+TARGETTYPE      PLUGIN
+            """)
+    tc1_dep2_mmp.close()
+    
+    tc1_pkg = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "group", "tc1.pkg"), 'w')
+    tc1_pkg.write(
+                  r"""
+;Language - standard language definitions
+&EN
+
+; standard SIS file header
+#{"BTEngTestApp"},(0x04DA27D5),1,0,0
+
+;Supports Series 60 v 3.0
+(0x101F7961), 0, 0, 0, {"Series60ProductID"}
+
+;Localized Vendor Name
+%{"BTEngTestApp"}
+
+;Unique Vendor name
+:"Nokia"
+
+; Files to copy
+"..\data\file1.dll"-"c:\sys\bin\file1.dll"
+"..\data\file1.txt"-"e:\sys\bin\file1.txt" , FF   ; FF stands for Normal file
+"..\data\file2.mp3"-"e:\sys\bin\file2.mp3"
+"..\data\TestFramework.ini"-"c:\sys\bin\TestFramework.ini"
+;"..\xyz\TestFramework.ini"-"!:\sys\bin\TestFramework.ini" (commented line)
+"../data/temp.ini"-"!:/sys/bin/temp.ini" , FF ; "something here"
+"..\data\tc1.cfg"-"e:\sys\bin\tc1.cfg"
+"..\data\tc1.sisx"-"e:\sys\bin\tc1.sisx"
+"..\data\DUMP.xyz"-"e:\sys\bin\DUMP.xyz"
+
+            
+        """.replace('\\', os.sep))
+    tc1_pkg.close()
+    
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "file1.dll"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "file1.txt"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "file2.mp3"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "TestFramework.ini"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "temp.ini"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "DUMP.xyz"), 'w').close()
+    
+    tc2 = open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "group", "bld.inf"), "w")
+    tc2.write(
+            r"""
+PRJ_TESTMMPFILES
+tc2.mmp
+            """)
+    tc2.close()
+    tc2_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "group", "tc2.mmp"), 'w')
+    tc2_mmp.write(
+            r"""
+TARGET          tc2.dll
+TARGETTYPE      dll
+LIBRARY         EUnit.lib
+            """)
+    tc2_mmp.close()
+    
+    tc2_pkg = open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "group", "tc2.pkg"), 'w')
+    tc2_pkg.write(
+                  r"""
+;Language - standard language definitions
+&EN
+
+; standard SIS file header
+#{"BTEngTestApp"},(0x04DA27D5),1,0,0
+
+;Supports Series 60 v 3.0
+(0x101F7961), 0, 0, 0, {"Series60ProductID"}
+
+;Localized Vendor Name
+%{"BTEngTestApp"}
+
+;Unique Vendor name
+:"Nokia"
+
+; Files to copy
+"..\data\file1.dll"-"c:\sys\bin\file1.dll"
+"..\data\file1.txt"-"e:\sys\bin\file1.txt"
+"..\data\file2.mp3"-"e:\sys\bin\file2.mp3"
+"..\data\TestFramework.ini"-"!:\sys\bin\TestFramework.ini" , FF   ; FF stands for Normal file
+"..\data\tc2.cfg"-"!:\sys\bin\tc2.cfg"
+        """.replace('\\', os.sep))
+    tc2_pkg.close()
+    
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "data", "file1.dll"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "data", "file1.txt"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "data", "file2.mp3"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "data", "TestFramework.ini"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "data", "tc2.cfg"), 'w').close()
+
+    
+    tc3 = open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "group", "bld.inf"), "w")
+    tc3.write(
+            r"""
+PRJ_TESTMMPFILES
+tc3.mmp
+            """)
+    tc3.close()
+    tc3_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "group", "tc3.mmp"), 'w')
+    tc3_mmp.write(
+            r"""
+TARGET          tc3.dll
+TARGETTYPE      dll
+LIBRARY         EUnit.lib
+            """)
+    tc3_mmp.close()
+    
+    tc3_pkg = open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "group", "tc2.pkg"), 'w')
+    tc3_pkg.write(
+                  r"""
+;Language - standard language definitions
+&EN
+
+; standard SIS file header
+#{"BTEngTestApp"},(0x04DA27D5),1,0,0
+
+;Supports Series 60 v 3.0
+(0x101F7961), 0, 0, 0, {"Series60ProductID"}
+
+;Localized Vendor Name
+%{"BTEngTestApp"}
+
+;Unique Vendor name
+:"Nokia"
+
+; Files to copy
+"..\data\file1.dll"-"c:\sys\bin\file1.dll"
+"..\data\file1.txt"-"e:\sys\bin\file1.txt"
+"..\data\file2.mp3"-"e:\sys\bin\file2.mp3" , FF   ; FF stands for Normal file
+"..\data\TestFramework.ini"-"!:\sys\bin\TestFramework.ini"
+"..\data\temp.ini"-"!:\sys\bin\temp.ini"
+"..\data\tc2.cfg"-"!:\sys\bin\tc2.cfg"
+        """.replace('\\', os.sep))
+    tc3_pkg.close()
+    
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "file1.dll"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "file1.txt"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "file2.mp3"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "TestFramework.ini"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "temp.ini"), 'w').close()
+    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "tc2.cfg"), 'w').close()
+    
+    macros = open(path.joinpath(TSRC_DIR, "tmp", "macros", "bldcodeline.hrh"), 'w')
+    macros.write(
+              r"""
+#ifndef __BLDCODELINE_HRH
+#define __BLDCODELINE_HRH
+
+/** #RD_TEST */
+#define RD_TEST1
+
+/** #RD_TEST2 */
+#define RD_TEST2
+
+/** #RD_TEST3 */
+#define RD_TEST3
+
+#endif  // __BLDCODELINE_HRH
+
+    """)
+    macros.close()
+
+    
+def teardown_module():
+    """ Cleanup environment after testing. """    
+    def __init__():
+        TSRC_DIR.rmtree()
+        
+        
+#        list_of_paths = []
+#        list_of_paths = path.walk(TSRC_DIR)
+#        for file in list_of_paths[2]:
+#            continue
+#        for dir in list_of_paths[1]:
+#            continue
+        
+
+class TestPkgFileParser(mocker.MockerTestCase):
+    """Testing Package file parser"""
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+
+    def setUp(self):
+        """Setup for PkgFile parser"""
+        self.pkg_file_path1 = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "tc1", "group"))
+        self.pkg_file_path2 = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "tc2", "group"))
+        self.pkg_file_path3 = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "tc3", "group"))
+        self.tcp = ats3.parsers.PkgFileParser("tc1.pkg")        
+        
+        self.data_files = [
+            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "file1.dll").normpath(), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll").normpath(), "testmodule", 'tc1.pkg'),
+            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "file1.txt").normpath(), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.txt").normpath(), "data", 'tc1.pkg'),
+            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "file2.mp3").normpath(), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.mp3").normpath(), "data", 'tc1.pkg'),
+            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "TestFramework.ini").normpath(), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini").normpath(), "engine_ini", 'tc1.pkg'),
+            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "temp.ini").normpath(), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "temp.ini").normpath(), "engine_ini", 'tc1.pkg'),
+            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "tc1.cfg").normpath(), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "tc1.cfg").normpath(), "conf", 'tc1.pkg'),
+            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "tc1.sisx").normpath(), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "tc1.sisx").normpath(), "", 'tc1.pkg'),
+            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "DUMP.xyz").normpath(), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "DUMP.xyz").normpath(), "data", 'tc1.pkg'),
+            ]
+
+    def test_get_pkg_files(self):
+        """Test if pkg files are returned from a specified location"""
+        assert self.tcp.get_pkg_files(self.pkg_file_path1, False) == ["tc1.pkg"]
+
+
+
+    def test_parser_receives_path(self):      
+        """Test if None is returned when a path to PKG file is incorrect"""
+        assert self.tcp.get_data_files("string") == []
+            
+    def test_data_files_creation_without_exclude(self):
+        """ Tests if PKG file parser creates data files list as expected without exclude"""
+        assert self.tcp.get_data_files(self.pkg_file_path1, "d:") == self.data_files
+        
+    def test_data_files_creation_with_exclude(self):
+        """ Tests if PKG file parser creates data files list as expected with exclude"""
+        self.data_files.pop()
+        assert self.tcp.get_data_files(self.pkg_file_path1, "d:", "\.xyz") == self.data_files
+
+    def test_data_files_creation_without_drive_with_exclude(self):
+        """ Tests if PKG file parser creates data files list as expected without drive with exclude"""
+        
+        self.data_files.pop()
+        assert self.tcp.get_data_files(self.pkg_file_path1, "", "\.xyz") == self.data_files
+
+    def test_data_files_creation_without_drive_without_exclude(self):
+        """ Tests if PKG file parser creates data files list as expected without drive without exclude"""
+        
+        assert self.tcp.get_data_files(self.pkg_file_path1, "") == self.data_files
+            
+
+class TestCppParser(mocker.MockerTestCase):
+    """Testing CPP parser"""
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+
+    def setUp(self):
+        self.bld_path = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "group"))
+        self.bld_path_comp1 = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "tc1", "group"))
+        self.tcp = ats3.parsers.CppParser()
+        upper_bld_path = os.path.dirname(self.bld_path)
+        
+        self.dependent_paths_dictionary = {(os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/subtest/if_test/group"))): {'content': {(os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/subtest/if_test/group"))): {'pkg_files': [], 'mmp_files': ['if_test.mmp'], 'harness': 'STIFUNIT', 'type': ''}}},
+                                            (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc2//group"))): {'content': {(os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc2/group"))): {'pkg_files': ['tc2.pkg'], 'mmp_files': ['tc2.mmp'], 'harness': 'EUNIT', 'type': 'executable'}}}, 
+                                            (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc3/group"))): {'content': {(os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc3/group"))): {'pkg_files':[], 'mmp_files': ['tc3.mmp'], 'harness': 'EUNIT', 'type': 'executable'}}},
+                                            (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group"))): {'content': {(os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/subtest/group"))): {'pkg_files': [], 'mmp_files': ['sub_test.mmp'], 'harness': 'STIF', 'type': 'executable'}, 
+                                                                                                                                (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/dependent_1/group"))): {'pkg_files': [], 'mmp_files': ['dependent_1.mmp', 'onemore.mmp'], 'harness': "", 'type':''}, 
+                                                                                                                                (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/dependent_2/group"))): {'pkg_files': [], 'mmp_files': ['dependent_2.mmp'], 'harness': "", 'type': 'dependent'}, 
+                                                                                                                                (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group"))): {'pkg_files': ['tc1.pkg'], 'mmp_files': ['tc1.mmp'],'harness': 'STIF', 'type': 'executable'}}}} 
+        
+        self.extended_path_list = [(os.path.normpath(upper_bld_path), upper_bld_path),
+                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group")), upper_bld_path),
+                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../dependent_1/group")), os.path.normpath(os.path.join(upper_bld_path, "../tc1/group"))),
+                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../dependent_2/group")), os.path.normpath(os.path.join(upper_bld_path, "../tc1/group"))),
+                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../subtest/group")), os.path.normpath(os.path.join(upper_bld_path, "../tc1/group"))),
+                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../subtest/group/../if_test/group")), os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../subtest/group"))),
+                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc2/group")), upper_bld_path),
+                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc3/group")), upper_bld_path),
+                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/group/group")), upper_bld_path),
+                           ]
+        self.path_list = [os.path.normpath(os.path.join(upper_bld_path, "group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../dependent_1/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../dependent_2/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../subtest/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../subtest/group/../if_test/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc2/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc3/group")),
+                           ]
+        self.path_list_without_undefined = [os.path.normpath(upper_bld_path),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../dependent_1/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../dependent_2/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../subtest/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc2/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc3/group")),
+                           ]
+        self.cpp_output = ['# 1 "bld.inf"', 
+                           '# 1 "../tc1/group/bld.inf" 1', 
+                           '# 1 "../tc1/group/../dependent_1/group/bld.inf" 1', 
+                           '# 4 "../tc1/group/bld.inf" 2', 
+                           '# 1 "../tc1/group/../dependent_2/group/bld.inf" 1', 
+                           '# 5 "../tc1/group/bld.inf" 2', 
+                           '# 1 "../tc1/group/../subtest/group/bld.inf" 1', 
+                           '# 1 "../tc1/group/../subtest/group/../if_test/group/bld.inf" 1', 
+                           '# 4 "../tc1/group/../subtest/group/bld.inf" 2', 
+                           '# 6 "../tc1/group/bld.inf" 2', 
+                           '# 3 "bld.inf" 2', 
+                           '# 1 "../tc2/group/bld.inf" 1', 
+                           '# 4 "bld.inf" 2', 
+                           '# 1 "../tc3/group/bld.inf" 1', 
+                           '# 5 "bld.inf" 2']
+        
+        
+         
+    def test_pathlist_output(self):
+        """Test get_cpp_output-method using "n" -parameter"""
+        assert self.path_list.sort() == self.tcp.get_cpp_output(self.bld_path, "n").sort()
+        
+    def test_extended_pathlist_output(self):
+        """Test get_cpp_output-method using "e" -parameter"""
+        assert self.extended_path_list.sort() == self.tcp.get_cpp_output(self.bld_path, "e").sort()
+
+    def test_dictionary_pathlist_output(self):
+        """Test get_cpp_output-method using "d" -parameter (dependent paths)"""
+        output = """# 1 "bld.inf"
+
+# 1 "../tc1/group/bld.inf" 1
+
+# 1 "../tc1/group/../dependent_1/group/bld.inf" 1
+
+PRJ_TESTMMPFILES
+dependent_1.mmp
+onemore.mmp
+            
+# 2 "../tc1/group/bld.inf" 2
+
+# 1 "../tc1/group/../dependent_2/group/bld.inf" 1
+
+PRJ_TESTMMPFILES
+dependent_2.mmp
+            
+# 3 "../tc1/group/bld.inf" 2
+
+# 1 "../tc1/group/../subtest/group/bld.inf" 1
+
+PRJ_TESTMMPFILES
+sub_test.mmp    
+
+# 1 "../tc1/group/../subtest/group/../if_test/group/bld.inf" 1
+
+PRJ_TESTMMPFILES
+if_test.mmp
+            
+# 5 "../tc1/group/../subtest/group/bld.inf" 2
+
+
+            
+# 4 "../tc1/group/bld.inf" 2
+
+
+PRJ_TESTMMPFILES
+tc1.mmp
+
+PRJ_MMPFILES
+not_included.mmp
+            
+# 2 "bld.inf" 2
+
+# 1 "../tc2/group/bld.inf" 1
+
+PRJ_TESTMMPFILES
+tc2.mmp
+            
+# 3 "bld.inf" 2
+
+# 1 "../tc3/group/bld.inf" 1
+
+PRJ_TESTMMPFILES
+tc3.mmp
+            
+# 4 "bld.inf" 2
+
+
+PRJ_TESTMMPFILES
+
+            
+"""
+        
+        result = self.tcp.create_dependency_dictionary(StringIO.StringIO(output), self.bld_path)
+        print "INPUT :", self.dependent_paths_dictionary
+        print "OUTPUT:", result 
+
+        assert self.dependent_paths_dictionary == result
+        
+    def test_conditional_cpp_parsing(self):
+        """Test functionality of cpp parser when removing conditionals"""
+        assert self.path_list_without_undefined.sort() == self.tcp.get_cpp_output(bld_path=self.bld_path, output_parameter="n", imacros=os.path.normpath(os.path.join(TSRC_DIR, "tmp", "macros", "bldcodeline.hrh"))).sort()
+
+class TestBldFileParser(mocker.MockerTestCase):
+    """Testing BldFileParser Class"""
+    
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+    
+    def setUp(self):
+        """Setup for BldFile parser"""
+
+        self.bld_path = path.joinpath(TSRC_DIR, "tsrc", "group", "bld.inf").normpath()
+        upper_bld_path = self.bld_path.dirname()
+        self.tcp = ats3.parsers.BldFileParser()
+        
+        self.test_mmp_files = [
+                               ['tc1.mmp'], 
+                               ['dependent_1.mmp', 'onemore.mmp'], 
+                               ['dependent_2.mmp'], 
+                               ['sub_test.mmp'], 
+                               ['if_test.mmp'], 
+                               ['tc2.mmp'], 
+                               ["tc3.mmp"],
+                               ]
+
+        self.path_list = [path.joinpath(upper_bld_path, "../tc1/group").normpath(),
+                           path.joinpath(upper_bld_path, "../tc1/group/../dependent_1/group").normpath(),
+                           path.joinpath(upper_bld_path, "../tc1/group/../dependent_2/group").normpath(),
+                           path.joinpath(upper_bld_path, "../tc1/group/../subtest/group").normpath(),
+                           path.joinpath(upper_bld_path, "../tc1/group/../subtest/group/../if_test/group").normpath(),
+                           path.joinpath(upper_bld_path, "../tc2/group").normpath(),
+                           path.joinpath(upper_bld_path, "../tc3/group").normpath(),
+                           ]
+
+
+    def test_testmmp_files_with_full_path(self):
+        """Test if mmp file is returned with its full path"""
+        self.mmp_file_path = [path.joinpath(TSRC_DIR, "tsrc", "tc1", "group", "tc1.mmp").normpath()]
+        assert self.tcp.get_test_mmp_files(os.path.normpath(os.path.join(self.path_list[0], "bld.inf"))) == self.mmp_file_path
+        
+        
+
+    def test_testmmp_files(self):
+        """Tests if test mmp files are included"""
+        self.lst_test_mmp = []
+        
+        for p in self.path_list:
+            self.lst_test_mmp.append(self.tcp.get_test_mmp_files(os.path.normpath(os.path.join(p, "bld.inf")), False))
+
+        assert self.lst_test_mmp == self.test_mmp_files
+        
+    def test_ignore_comments(self):
+        """ Test if comments are ignored correctly. """
+        for input_, output in [
+            ("abc.mmp /* apuva.mmp */ xyz.mmp", ("abc.mmp xyz.mmp")),
+            ("abc.mmp /* apuva.mmp */", ("abc.mmp")),
+            ("/* apuva.mmp */", ""),
+            ("  // apuva.mmp", ""),
+            ("   apuva.mmp", "apuva.mmp"),
+            ("xyz.mmp // apuva.mmp", "xyz.mmp"),
+            ("abc.mmp /* apuva.mmp */ xyz.mmp //rst.mmp", ("abc.mmp xyz.mmp")),
+            ]:
+            assert self.tcp.ignore_comments_from_input(input_) == output
+        
+    def test_broken_path(self):
+        """Tests if 'None' is returned when path is broken"""
+        upper_bld_path = os.path.dirname(self.bld_path)
+        assert self.tcp.get_test_mmp_files(os.path.normpath(os.path.join(upper_bld_path, "../tc99/group"))) == None
+    
+    def test_empty_parameter(self):
+        """Tests if 'None' is returned when bld file path is empty"""
+        upper_bld_path = os.path.dirname(self.bld_path)
+        assert self.tcp.get_test_mmp_files("") == None
+
+    
+class TestMmpFileParser(mocker.MockerTestCase):
+    """Testing MmpFileParser Class"""
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+        
+    def setUp(self):
+        self.bld_path = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "group", "bld.inf"))
+        upper_bld_path = os.path.dirname(self.bld_path)
+        self.tcp = ats3.parsers.MmpFileParser()
+        self.tc1_type = "dll"
+        self.tc1_name = "tc1.dll"
+        self.tc1_dll_type = "executable"
+        self.tc1_harness = "STIF"
+        self.tc1_libraries = ['stiftestinterface.lib', 'user.lib']
+        self.tc1_all = (self.tc1_name, self.tc1_type, self.tc1_libraries, self.tc1_harness)
+        self.tc1_no_harness = (self.tc1_name, self.tc1_type, self.tc1_libraries)
+        self.tc1_name_type = (self.tc1_name, self.tc1_type) 
+        self.tc1_iftest_harness = "STIFUNIT"
+        self.tc1_iftest_name = "tc1_if.dll"
+        self.tc1_iftest_type = "dll"
+        
+        self.test_mmp_files = [['tc1.mmp'], ['dependent_1.mmp', 'onemore.mmp'], ['dependent_2.mmp'], ['sub_test.mmp'], ['if_test.mmp'], 
+                               ['tc2.mmp'], ["tc3.mmp"]]
+
+        self.path_list = [os.path.normpath(os.path.join(upper_bld_path, "../tc1/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../dependent_1/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../dependent_2/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../subtest/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../subtest/group/../if_test/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc2/group")),
+                           os.path.normpath(os.path.join(upper_bld_path, "../tc3/group")),
+                           ]
+    
+    def test_get_dlltype(self):
+        """Test if get_filetype returns right type for given mmp"""
+        assert self.tc1_dll_type == self.tcp.get_dll_type(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp'))) 
+    
+    def test_get_target_filename(self):
+        """Test if get_filename returns right name for dll for given mmp"""
+        assert self.tc1_name == self.tcp.get_target_filename(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')))
+    
+    def test_get_libraries(self):
+        """Test if get_harness returns right harness for given mmp"""
+        assert self.tc1_libraries == self.tcp.get_libraries(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')))
+    
+    def test_get_harness(self):
+        """Test if get_harness returns right harness for given mmp"""
+        assert self.tc1_harness == self.tcp.get_harness(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')))
+    
+    def test_read_information_method(self):
+        """Test if read_information_from_mmp returns wanted output for given parameter and mmp-file"""
+        assert self.tc1_all == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 0)
+        assert self.tc1_no_harness == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 1)
+        assert self.tc1_name_type == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 2)
+        assert self.tc1_name == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 3)
+        assert self.tc1_type == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 4) 
+        assert self.tc1_libraries == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 5)
+        assert self.tc1_harness == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 6)
+        assert self.tc1_iftest_name == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[4], 'if_test.mmp')), 3)
+        assert self.tc1_iftest_type == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[4], 'if_test.mmp')), 4) 
+        assert self.tc1_iftest_harness == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[4], 'if_test.mmp')), 6)
+
+class TestParsers(mocker.MockerTestCase):
+    """Testing Parsers functionality"""
+    def __init__(self, methodName="runTest"):
+        mocker.MockerTestCase.__init__(self, methodName)
+        
+    def setUp(self):
+        pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_policy_validator.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,150 @@
+#============================================================================ 
+#Name        : test_policy_validator.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""Test the integration.quality module."""
+
+import os
+import unittest
+import sys
+import time
+import shutil
+
+import integration.quality
+import logging
+
+_logger = logging.getLogger('test.archive')
+    
+    
+_test_file_paths = [
+    's60/Distribution.Policy.S60',
+    's60/ADO/Distribution.Policy.S60',
+    's60/ADO/group/Distribution.Policy.S60',
+    's60/ADO/internal/Distribution.Policy.S60',
+    's60/ADO/internal/good/Distribution.Policy.S60',
+    's60/ADO/internal/bad/Distribution.Policy.S60',
+    's60/ADO/tsrc/Distribution.Policy.S60',
+    's60/ADO/tsrc/group/Distribution.Policy.S60',
+    's60/ADO/tsrc/private/Distribution.Policy.S60',
+    's60/component_public/Distribution.Policy.S60',
+    's60/component_public/component_public_file.txt',
+    's60/component_private/Distribution.Policy.S60',
+    's60/component_private/component_private_file.txt',    
+    's60/missing/to_be_removed_9999.txt',
+    's60/missing/subdir/Distribution.Policy.S60',
+    's60/missing/subdir/to_be_removed_9999.txt',
+    's60/invalid/Distribution.Policy.S60',
+    's60/invalid/comment/Distribution.Policy.S60',
+    's60/invalid/utf16/Distribution.Policy.S60',
+    's60/invalid/letter/Distribution.Policy.S60',
+    's60/new_rules/',
+    's60/new_rules/subdir1/invalid.txt',
+    's60/new_rules/subdir2/',
+    ]
+
+_test_file_content = {
+    's60/Distribution.Policy.S60': '0',
+    's60/missing/subdir/Distribution.Policy.S60' : '0',
+    's60/component_public/Distribution.Policy.S60': '0',
+    's60/component_private/Distribution.Policy.S60': '1',
+    's60/ADO/Distribution.Policy.S60': '0',
+    's60/ADO/group/Distribution.Policy.S60': '0',
+    's60/ADO/internal/Distribution.Policy.S60': '1',
+    's60/ADO/internal/good/Distribution.Policy.S60': '1',
+    's60/ADO/internal/bad/Distribution.Policy.S60': '0',
+    's60/ADO/tsrc/Distribution.Policy.S60': '950',
+    's60/ADO/tsrc/group/Distribution.Policy.S60': '0',
+    's60/ADO/tsrc/private/Distribution.Policy.S60': '0',
+    's60/invalid/Distribution.Policy.S60': '0',
+    's60/invalid/comment/Distribution.Policy.S60': '0 ; some comment',
+    's60/invalid/utf16/Distribution.Policy.S60': '\xFF\xFE\x30\x00\x0D\x00\x0D\x00\x0D\x00\x0A\x00',
+    's60/invalid/letter/Distribution.Policy.S60': '9A0',
+    }
+    
+class PolicyValidatorTest(unittest.TestCase):
+    EXEC_FILE = "archive_create.ant.xml"
+    
+    def _testpath(self, subpath):
+        """ Normalised path for test paths. """
+        return os.path.normpath(os.path.join(self.root_test_dir, subpath))
+
+    def setUp(self):
+        """ Setup files test config. 
+        
+        This creates a number of empty files in a temporary directory structure
+        for testing various file selection and archiving operations.
+        """
+        #print 'setup_module()'
+        #print _test_file_content.keys()
+        self.root_test_dir = "_test_" + str(time.strftime("%H.%M.%S"))
+        for child_path in _test_file_paths:
+            path = os.path.join(self.root_test_dir, child_path)
+            path_dir = path
+            path_dir = os.path.dirname(path)
+            
+            if (not os.path.exists(path_dir)):
+                _logger.debug('Creating dir:  ' + path_dir)
+                os.makedirs(path_dir)
+    
+            if(not path.endswith('/') and not path.endswith('\\')):
+                _logger.debug('Creating file: ' + path)
+                handle = open(path, 'w')
+                # Write any file content that is needed
+                if _test_file_content.has_key(child_path):
+                    handle.write(_test_file_content[child_path])
+                handle.close()
+    
+    def tearDown(self):
+        """ Teardown test config. """
+        shutil.rmtree(self.root_test_dir)
+
+    def test_policy_validator(self):
+        """ Testing the policy validator behaviour. """
+        validator = integration.quality.PolicyValidator()
+        errors = [] 
+        errors.extend(validator.validate(self._testpath('s60')))
+        errors.sort()
+        print errors
+        assert len(errors) == 5
+
+        
+        # Invalid encoding: contains other stuff than policy id.
+        assert errors[0][0] == "invalidencoding"
+        assert errors[0][1].lower() == self._testpath('s60' + os.sep + 'invalid' + os.sep + 'comment' + os.sep + 'distribution.policy.s60')
+        assert errors[0][2] == None
+        
+        # Invalid encoding: ID contains a letter.
+        assert errors[1][0] == "invalidencoding"
+        assert errors[1][1].lower() == self._testpath('s60' + os.sep + 'invalid' + os.sep + 'letter' + os.sep + 'distribution.policy.s60')
+        assert errors[1][2] == None
+        
+        # Invalid encoding: not ascii.
+        assert errors[2][0] == "invalidencoding"
+        assert errors[2][1].lower() == self._testpath('s60' + os.sep + 'invalid' + os.sep + 'utf16' + os.sep + 'distribution.policy.s60')
+        assert errors[2][2] == None
+        
+        # Policy file is missing
+        assert errors[3][0] == "missing"
+        assert errors[3][1].lower() == self._testpath('s60' + os.sep + 'missing')
+        assert errors[3][2] == None
+
+        # Policy file is missing
+        assert errors[4][0] == "missing"
+        assert errors[4][1].lower() == self._testpath('s60' + os.sep + 'new_rules' + os.sep + 'subdir1')
+        assert errors[4][2] == None
+        
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_relnotes.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,93 @@
+#============================================================================ 
+#Name        : test_relnotes.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Unit tests for the relnotes tool.
+
+"""
+import unittest
+import StringIO
+import rtfutils
+import logging
+import os
+
+def test_initialization():
+    "Modules are imported properly, i.e. PyRTF is there etc."
+    import PyRTF
+
+def test_pyrtf():
+    import PyRTF
+    
+    DR = PyRTF.Renderer()
+    doc     = PyRTF.Document()
+    ss      = doc.StyleSheet
+    section = PyRTF.Section()
+    doc.Sections.append( section )
+    
+    string = StringIO.StringIO()
+    DR.Write(doc, string)
+    assert string.getvalue() != ""
+    string.close()
+    
+class RelNotesTest( unittest.TestCase ):
+    
+    def setUp(self):
+        self.helium_home = os.environ["HELIUM_HOME"]
+        self.logger = logging.getLogger('test.relnotes')
+        logging.basicConfig(level=logging.INFO)
+      
+    def test_rtfconvert(self):
+        props = {r'my.val1=hello world' : r'my.val1=hello world',
+        r'my.val2=http://www.company.com/a' : r'my.val2={\\field{\\*\\fldinst HYPERLINK http://www.company.com/a}}',
+        r'my.val3=ftp://ftp.company.com/a' : r'my.val3={\\field{\\*\\fldinst HYPERLINK ftp://ftp.company.com/a}}',
+        r'my.val4=\\server\share1\dir' : r'my.val4={\\field{\\*\\fldinst HYPERLINK \\\\\\\\\\\\\\\\server\\\\\\\\share1\\\\\\\\dir}}',
+        r'my.val5=.\projects' : r'my.val5={\\field{\\*\\fldinst HYPERLINK .\\\\\\\\projects}}'}
+        
+        for p, output in props.iteritems():
+            self._check_rtfconvert(p, output)
+        
+    def _check_rtfconvert(self, value, correctoutput):
+        output = StringIO.StringIO()
+        rtfu = rtfutils.RTFUtils('')
+        rtfu._rtfconvert([value], output)
+        self.logger.info(output.getvalue())
+        self.logger.info(correctoutput) 
+        assert output.getvalue() == correctoutput #.strip()
+        output.close()
+
+    def test_rtftable(self):
+        output = StringIO.StringIO()
+        errors = ["component,error,warning", "app2,1,2"]
+        input = ["text <tag> text"]
+        
+        rtfu = rtfutils.RTFUtils('')
+        rtfu._rtftable(errors, output, '<tag>', input)
+        
+        self.logger.info(output.getvalue())
+        output.close()
+        
+    def test_rtfimage(self):
+        output = StringIO.StringIO()
+        image = os.path.join(self.helium_home, 'extensions', 'nokia', 'config', 'relnotes', 'logo.png')
+        input = ["text <tag> text"]
+        
+        rtfu = rtfutils.RTFUtils('')
+        rtfu._rtfimage(image, output, '<tag>', input)
+        
+        self.logger.info(output.getvalue())
+        output.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_sis.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,75 @@
+#============================================================================ 
+#Name        : test_sis.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test sis module. """
+
+import logging
+import unittest
+
+from lxml import etree
+
+import configuration
+import sis
+
+_logger = logging.getLogger('test.sis')
+
+
+class ArchivePreBuilderTest(unittest.TestCase):
+    """ Tests for sis module. """
+    
+    def test_sis_v1(self):
+        """ V1 config format. """
+        data = {'name': 'foo',
+                'path': 'bar'}
+        tree = self._setup_test_case(data)
+        assert tree.xpath("/project/target[@name='stage1']/parallel/*/arg/@line")[0] == '-v foo.pkg foo.sis'
+        
+    def test_sis_v2(self):
+        """ V2 config format. """
+        data = {'input': 'foo.pkg'}
+        tree = self._setup_test_case(data)
+        assert tree.xpath("/project/target[@name='stage1']/parallel/*/arg/@line")[0] == '-v foo.pkg foo.sis'
+
+    def test_sis_v2_1(self):
+        """ V2 config format for sisx. """
+        data = {'input': 'foo.pkg', 'output': 'foo.sisx'}
+        tree = self._setup_test_case(data)
+        assert tree.xpath("/project/target[@name='stage1']/parallel/*/arg/@line")[0] == '-v foo.pkg foo.sis'
+        assert tree.xpath("/project/target[@name='stage2']/parallel/*/arg/@line")[0] == '-v foo.sis foo.sisx cert1 key1'
+        
+    def _setup_test_case(self, additional_data):
+        """ Setup test case based on varying inputs. """
+        data = {'makesis.tool': 'makesis',
+                'signsis.tool': 'signsis',
+                'key': 'key1',
+                'cert': 'cert1',
+                'build.sisfiles.dir': 'dir'}
+        data.update(additional_data)
+        config = configuration.ConfigurationSet([configuration.Configuration(data)])
+        sis_prebuilder = sis.SisPreBuilder(config)
+        sis_prebuilder.write('test.xml')
+        
+        tree = etree.parse('test.xml')
+        return tree
+    
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_timeout_launcher.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,174 @@
+#============================================================================ 
+#Name        : test_timeout_launcher.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+""" unit tests the timeout launcher """
+
+# pylint: disable-msg=E1101
+
+import logging
+import unittest
+import tempfile
+import sys
+import mocker
+import subprocess
+
+
+_logger = logging.getLogger('test.configuration')
+logging.basicConfig(level=logging.INFO)
+
+# Platform
+WINDOWS = False
+if sys.platform == "win32":
+    import win32process
+    import win32con
+    import win32api
+    WINDOWS = True
+
+
+
+class os(object):
+    """ dummy the os function call"""
+    def kill(self, pid, value):
+        """dummy OS class"""
+        pid = value #just for pylint
+        return 1
+
+class TimeoutLauncherTest(mocker.MockerTestCase):
+    """class containing methods to test the timeout launcher"""
+
+    def test_cmdlineIsEmpty(self):
+        """test_cmdlineIsEmpty: nothing in the command line"""
+        import timeout_launcher
+        obj = self.mocker.replace(timeout_launcher.sys)
+        obj.exit(-1)
+        self.mocker.result(1)
+        self.mocker.replay()
+        
+        sys.argv = ['timeout_launcher.py', '--timeout=1', 'version']
+        timeout_launcher.main()
+
+    def test_valid_with_timeout(self):
+        """test_valid_with_timeout: initial test with valid values and timeout."""
+        import timeout_launcher
+        cmdline =  ['dir']
+        shell = True
+        if WINDOWS:
+            shell = False
+        process = self.mocker.mock()
+        process.poll()
+        self.mocker.result(None)
+        process.poll()
+        self.mocker.result(1)
+
+        obj = self.mocker.replace("subprocess.Popen")
+        obj(' '.join(cmdline), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=shell)
+        self.mocker.result(process)
+
+        obj2 = self.mocker.replace(timeout_launcher.sys)
+        obj2.exit(mocker.ANY)
+        self.mocker.result(1)
+
+        process.communicate()[0]
+        self.mocker.result(None)
+        process.returncode
+        self.mocker.result(1)
+
+        self.mocker.replay()
+        
+        sys.argv = ['--timeout=1', '--', ' '.join(cmdline)]
+        timeout_launcher.main()
+
+    def test_valid_no_timeout(self):
+        """test_valid_no_timeout: initial test with valid values and no timeout."""
+        import timeout_launcher
+        cmdline =  ['dir']
+        process = self.mocker.mock()
+
+        obj = self.mocker.replace("subprocess.Popen")
+        obj(' '.join(cmdline), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
+        self.mocker.result(process)
+
+        process.communicate()[0]
+        self.mocker.result(None)
+        process.returncode
+        self.mocker.result(1)
+
+        obj2 = self.mocker.replace(timeout_launcher.sys)
+        obj2.exit(mocker.ANY)
+        self.mocker.result(1)
+        self.mocker.replay()
+
+        sys.argv = ['--', ' '.join(cmdline)]
+        timeout_launcher.main()
+
+    def test_timedout(self):
+        """test_timedout: initial test with valid values but times out."""
+        import timeout_launcher
+        cmdline =  ['dir']
+        shell = True
+        if WINDOWS:
+            shell = False
+        process = self.mocker.mock()
+
+        timeValue = self.mocker.replace("time.time")
+        timeValue()
+        self.mocker.result(1)
+        #if debug not set then it won't call the logger functions and so these are not needed
+        if logging.DEBUG:
+            timeValue()
+            self.mocker.result(1)
+            timeValue()
+            self.mocker.result(1)
+            timeValue()
+            self.mocker.result(1)
+            timeValue()
+            self.mocker.result(1)
+
+        obj = self.mocker.replace("subprocess.Popen")
+        obj(' '.join(cmdline), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=shell)
+        self.mocker.result(process)
+
+        self.mocker.order()
+        process.poll()
+        self.mocker.result(None)
+        timeValue()
+        self.mocker.result(5)
+        self.mocker.unorder()
+
+        process.pid
+        self.mocker.result(0x0129B460)
+
+        if WINDOWS:
+            handle = self.mocker.mock()
+            handle_1 = self.mocker.replace("win32api.OpenProcess")
+            handle_1(True, win32con.PROCESS_TERMINATE, mocker.ANY)
+            self.mocker.result(handle)
+            handle_1 = self.mocker.replace("win32process.TerminateProcess")
+            handle_1(handle, -1)
+            
+
+        self.mocker.replay()
+
+        sys.argv = ['--timeout=3', '--', ' '.join(cmdline)]
+        failed = False
+        try:
+            timeout_launcher.main()
+        except:
+            failed = True
+        assert failed
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/cpythontest/test_vbaconf.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,87 @@
+#============================================================================ 
+#Name        : test_vbaconf.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Some test cases for VBA config generation.
+"""
+import unittest
+import logging
+import os
+import vbaconf
+import vbaconf.new_delivery
+import amara
+
+# Uncomment this line to enable logging in this module, or configure logging elsewhere
+#logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger('test.vbaconf')
+
+
+class TestVBAConf(unittest.TestCase):
+    """ Implementation of VBA test cases. """
+    
+    def test_vba_conf_generation(self):
+        """ Testing all methods from VBA config generation.
+        """
+        delivery = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/delivery.xml.parsed')
+        prep = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/prep.xml.parsed')
+        doc = vbaconf.generate_config(delivery, prep)
+        
+        logger.info(doc.toprettyxml())
+        
+        doc = amara.parse(str(doc.toprettyxml()))
+        assert len(doc.xml_xpath("/virtualBuildArea/add")) == 24 
+        
+    def test_vba_conf_generation_new_delivery_format(self):
+        """ Testing all methods from VBA config generation.
+        """
+        delivery = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/new_delivery/delivery.xml.parsed')
+        prep = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/new_delivery/prep.xml.parsed')
+        doc = vbaconf.new_delivery.generate_config(delivery, prep)
+        
+        logger.info(doc.toprettyxml())
+        
+        doc = amara.parse(str(doc.toprettyxml()))
+        ##assert len(doc.xml_xpath("/virtualBuildArea/add")) == 24 
+        
+    def test_vba_conf_generation_new_api(self):
+        """ Testing all methods from VBA config generation.
+        """
+        delivery = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/delivery.xml.parsed')
+        prep = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/prep.xml.parsed')
+        conv = vbaconf.ConfigConverter(delivery, prep)
+        doc = conv.generate_config()
+        
+        logger.info(doc.toprettyxml())
+        
+        doc = amara.parse(str(doc.toprettyxml()))
+        assert len(doc.xml_xpath("/virtualBuildArea/add")) == 24 
+
+    def test_vba_conf_generation_new_api_new_delivery_format(self):
+        """ Testing all methods from VBA config generation.
+        """
+        delivery = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/new_delivery/delivery.xml.parsed')
+        prep = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/new_delivery/prep.xml.parsed')
+        conv = vbaconf.ConfigConverterNewDelivery(delivery, prep)
+        doc = conv.generate_config()
+        
+        logger.info(doc.toprettyxml())
+        
+        doc = amara.parse(str(doc.toprettyxml()))
+        assert len(doc.xml_xpath("/virtualBuildArea/add")) == 24 
+
+ 
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/delta_zip.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/delta_zip.py	Wed Dec 23 19:29:07 2009 +0200
@@ -18,6 +18,7 @@
 #===============================================================================
 
 import os
+import shutil
 import re
 import fileutils
 import buildtools
@@ -329,3 +330,46 @@
             string = string + filename + " " + str(both) + " " + " " + str(only_old) + " " + str(only_new) + " " + self[filename][0] + " " + self[filename][1] + "\n"
         
         return string
+
+def readEvalid(dir):
+    filesdict = {}
+    for root, _, files in os.walk(dir):
+        for name in files:
+            f = os.path.join(root, name)
+            directory = None
+            for md5line in open(f):
+                if md5line.startswith('Directory:'):
+                    directory = md5line.replace('Directory:', '').replace('\n', '')
+                if 'MD5=' in md5line:
+                    info = re.search(r'([ \S]+) TYPE=.*MD5=(\S+)', md5line)
+                    if info != None:
+                        assert directory
+                        filesdict[os.path.join(directory, info.group(1))] = info.group(2)
+    return filesdict
+    
+def changedFiles(atsevalidpre, atsevalidpost):
+    filesbefore = readEvalid(atsevalidpre)
+    filesafter = readEvalid(atsevalidpost)
+    
+    changedfiles = []
+    
+    for key in filesafter.keys():
+        if key not in filesbefore:
+            changedfiles.append(key)
+        else:
+            if filesafter[key] != filesbefore[key]:
+                changedfiles.append(key)
+    
+    return changedfiles
+    
+def evalidAdomapping(builddrive, dest, adomappingfile):
+    os.chdir(builddrive)
+    i = 0
+    if os.path.exists(dest):
+        shutil.rmtree(dest)
+    os.mkdir(dest)
+    for line in open(adomappingfile):
+        dir = line.split('=')[0].replace(r'\:', ':')
+        tmpfile = os.path.join(dest, str(i))
+        os.system('evalid -g ' + dir + ' ' + tmpfile)
+        i = i + 1
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/dependancygraph.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/dependancygraph.py	Wed Dec 23 19:29:07 2009 +0200
@@ -21,7 +21,6 @@
 import amara
 import codecs
 import zipfile
-from Ft.Lib import Uri
 
 class Library:
     def __init__(self, name, license, version=''):
@@ -56,7 +55,7 @@
 class ReadIvyConfig:
     def __init__(self, ivyfilename):
         self.ivyfilename = ivyfilename
-        self.ivyxml = amara.parse(Uri.OsPathToUri(ivyfilename))
+        self.ivyxml = amara.parse(open(ivyfilename))
         self.group = ModuleGroup()
 
     def readConfigurations(self):
@@ -84,7 +83,7 @@
                     ivydir = os.path.dirname(self.ivyfilename)
                     ivydir = os.path.join(ivydir, 'modules')
                     ivyjarfile = os.path.join(ivydir, module.name + '-1.0.ivy.xml')
-                    ivymodulexml = amara.parse(Uri.OsPathToUri(ivyjarfile))
+                    ivymodulexml = amara.parse(open(ivyjarfile))
                     license = ''
                     for artifact in ivymodulexml['ivy-module'].publications.xml_children:
                         if hasattr(artifact, 'data'):
@@ -280,7 +279,7 @@
 
 def externalDependancies(database, output):
     out = open(output, 'w')
-    db = amara.parse(Uri.OsPathToUri(database))
+    db = amara.parse(open(database))
     out.write('digraph G {\n')
     for p in db.antDatabase.project:
         items = []
@@ -333,7 +332,7 @@
 
 def findLogFiles(database, output):
     out = open(output, 'w')
-    db = amara.parse(Uri.OsPathToUri(database))
+    db = amara.parse(open(database))
     out.write('digraph G {\n')
     output = []
     
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/docs.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,61 @@
+#============================================================================ 
+#Name        : docs.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Modules related to documentation """
+
+from __future__ import with_statement
+import re
+import os
+import string
+import amara
+import ant
+
+def find_python_dependencies(setpath, dbPath, dbPrj):
+    """ Search python dependencies """
+    for root, dirs, files in os.walk(setpath, topdown=False):
+        for fname in files:
+            filePattern = re.compile('.ant.xml$')
+            fileMatch = filePattern.search(fname)
+            modulelist = []
+            if (fileMatch):
+                filePath = os.path.abspath(os.path.join(root, fname))
+                with open(filePath) as f:
+                    filePathAmara = 'file:///'+ filePath.replace('\\','/')
+                    curPrj=amara.parse(filePathAmara)
+                    for line in f:
+                        linePattern = re.compile('^import')
+                        lineMatch = linePattern.search(line)
+                        if ((lineMatch) and (line.find('.')==-1)):
+                            newLine = line.replace('import','')
+                            newLine = newLine.replace(',','')
+                            moduleArray = newLine.split()
+                            for curModule in moduleArray:
+                                try:
+                                    importModule = __import__(curModule)
+                                    modulePath=importModule.__file__
+                                    if (modulePath.find('\\helium\\tools')!= -1):
+                                        for projectList in dbPrj.antDatabase.project:
+                                            if (projectList.name==curPrj.project.name):
+                                                if not (curModule in modulelist):
+                                                    print " Python module : " +curModule
+                                                    moduleElement = projectList.pythonDependency.xml_create_element(u'module', content=u''+curModule)
+                                                    projectList.pythonDependency.xml_append(moduleElement)
+                                                modulelist = modulelist + [curModule]
+                                except Exception, e:
+                                    error ="yes"
--- a/buildframework/helium/tools/common/python/lib/fileutils.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/fileutils.py	Wed Dec 23 19:29:07 2009 +0200
@@ -205,6 +205,8 @@
         LOGGER.debug('Scanning sub-root directories')
         for root_dir in self.find_subroots():
             for dirpath, subdirs, files in os.walk(unicode(root_dir)):
+                # Let's save the len before it's getting modified.
+                subdirsLen = len(subdirs)
                 subroot = dirpath[len(self.root_dir):]
 
                 dirs_to_remove = []
@@ -226,7 +228,8 @@
                 LOGGER.debug('Checking for empty directory: ' + dirpath)
                 # Check for including empty directories
                 if self.is_included(subroot) and not self.is_excluded(subroot):
-                    if len(files) == 0 and len(subdirs) == 0:
+                    if len(files) == 0 and subdirsLen == 0:
+                        LOGGER.debug('Including empty dir: ' + dirpath)
                         yield dirpath
                     
 
@@ -334,7 +337,14 @@
             remove(path)
         else:
             fcn(path)
-    return shutil.rmtree(rootdir, onerror=cb_handle_error)
+    
+    if 'java' in sys.platform:
+        import java.io
+        import org.apache.commons.io.FileUtils
+        f = java.io.File(rootdir)
+        org.apache.commons.io.FileUtils.deleteDirectory(f)
+    else:
+        return shutil.rmtree(rootdir, onerror=cb_handle_error)
 
 def destinsrc(src, dst):
     """ Fixed version of destinscr, that doesn't match dst with same root name."""
@@ -481,7 +491,9 @@
             match = re.match(r'^Category\s+([A-Z])\s*$', line, re.M|re.DOTALL)
             if match != None:
                 value = match.group(1)
+                fileh.close()
                 return value
+        fileh.close()
         if match == None:
             error = "Content of '%s' doesn't match r'^Category\s+([A-Z])\s*$'." % filename
     except Exception, exc:
--- a/buildframework/helium/tools/common/python/lib/helium/documentation.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/helium/documentation.py	Wed Dec 23 19:29:07 2009 +0200
@@ -49,6 +49,13 @@
         old_project_names = set([project[0].text for project in old_db.findall('/project')])
         new_project_names = set([project[0].text for project in new_db.findall('/project')])
         
+        dict_old_taskdef_names  = {}
+        dict_new_taskdef_names  = {}
+        for taskdef in old_db.findall('/project/taskdef'):
+            dict_old_taskdef_names[taskdef[0].text] = taskdef[1].text
+        for taskdef in new_db.findall('/project/taskdef'):
+            dict_new_taskdef_names[taskdef[0].text] = taskdef[1].text
+
         projects_removed = old_project_names.difference(new_project_names)
         for project in projects_removed:
             project_element = etree.SubElement(root, 'project', attrib={'state': 'removed'})
@@ -84,6 +91,17 @@
         for target in targets_added:
             target_element = etree.SubElement(root, 'target', attrib={'state': 'added'})
             target_element.text = target
+
+        taskdefs_removed = set(dict_old_taskdef_names.keys()) - set(dict_new_taskdef_names.keys()) 
+        for taskdefKey in taskdefs_removed:
+            taskdef_element = etree.SubElement(root, 'taskdef', attrib={'state': 'removed'})
+            taskdef_element.text = taskdefKey
+            taskdef_element.attrib['classname'] =  dict_old_taskdef_names[taskdefKey]
+        taskdefs_added = set(dict_new_taskdef_names.keys()) - set(dict_old_taskdef_names.keys())
+        for taskdefKey in taskdefs_added:
+            taskdef_element = etree.SubElement(root, 'taskdef', attrib={'state': 'added'})
+            taskdef_element.text = taskdefKey
+            taskdef_element.attrib['classname'] =  dict_new_taskdef_names[taskdefKey]
             
         etree.dump(root)
         tree = etree.ElementTree(root)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/idoprep.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,151 @@
+#============================================================================ 
+#Name        : idoprep.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Modules related to ido-prep """
+
+import re
+import os
+import symrec
+import logging
+import traceback
+import ant
+import sys
+import ido
+
+logging.basicConfig(level=logging.INFO)
+logger = logging.getLogger("check_latest_release")
+
+def validate(grace, service, product, release):
+    """ Validate s60 grace server, s60 grace service, s60 grace product and 
+        s60 grace release are set.
+    """    
+    if not grace:
+        raise Exception("Property 's60.grace.server' is not defined.")
+    if not service:
+        raise Exception("Property 's60.grace.service' is not defined.")
+    if not product:
+        raise Exception("Property 's60.grace.product' is not defined.")
+    if not release:
+        raise Exception("Property 's60.grace.release' is not defined.")
+            
+def get_s60_env_details(grace, service, product, release, rev, cachefilename, s60gracecheckmd5, s60graceusetickler):
+    """ Return s60 environ details """
+    validate(grace, service, product, release)
+    revision = r'(_\d{3})?'
+    if rev != None:
+        revision = rev
+
+    if cachefilename:
+        logger.info(str("Using cache file: %s" % cachefilename))
+    
+    checkmd5 = False
+    if s60gracecheckmd5 != None:
+        checkmd5 = str(s60gracecheckmd5).lower()
+        checkmd5 = ((checkmd5 == "true") or (checkmd5 == "1") or (checkmd5 == "on"))
+                
+    branch = os.path.join(grace, service, product)
+    if not os.path.exists(branch):
+        raise Exception("Error occurred: Could not find directory %s" % branch)
+        
+    result = []
+    for rel in os.listdir(branch):
+        relpath = os.path.join(branch, rel)
+        logger.info("Checking: %s" % str(relpath))
+        res = re.match(r"%s%s$" % (release, revision), rel, re.I)
+        if res != None:
+            logger.info("Found: %s" % str(relpath))
+            result.append(relpath)
+    result.sort(reverse=True)
+    use_tickler = False
+    tickler_validation = str(s60graceusetickler).lower()
+    if tickler_validation != None:
+        use_tickler = ((tickler_validation == "true") or (tickler_validation == "1"))
+    validresults = []
+    for rel in result:
+        try:
+            metadata_filename = symrec.find_latest_metadata(str(rel))
+            if metadata_filename is not None and os.path.exists(metadata_filename):
+                logger.info(str("Validating: %s" % metadata_filename))
+                if (use_tickler):
+                    validator = symrec.ValidateTicklerReleaseMetadata(metadata_filename, cachefilename)
+                else:
+                    validator = symrec.ValidateReleaseMetadataCached(metadata_filename, cachefilename)
+                if validator.is_valid(checkmd5):
+                    logger.info(str("%s is valid." % rel))
+                    validresults.append(rel)
+                    break
+                else:
+                    logger.info(str("%s is not a valid release." % rel))
+            elif metadata_filename is None:
+                logger.info(str("Could not find the release metadata file under %s" % rel))
+        except Exception, e:
+            logger.warning(str("WARNING: %s: %s" % (rel , e)))
+            logger.warning(("%s is not a valid release." % rel))
+            traceback.print_exc()
+    
+    result = validresults
+    if len(result) == 0:
+        raise Exception("Error finding GRACE release.")
+    print result[0]
+    return result
+    
+def get_version(buiddrive, resultname):
+    """ Return s60 version """
+    vfile = os.path.join(buiddrive + os.sep, 's60_version.txt')
+    version = None
+    if (os.path.exists(vfile)):
+        logger.info("Are we still up-to-date compare to %s" % str(vfile))
+        f = open(str(vfile), 'r')
+        version = f.readline()
+        logger.info(str("'%s' == '%s'" % (version, resultname)))
+        f.close()
+    else:
+        logger.info("Version file not found getting new environment...")
+    return version
+        
+def create_ado_mapping(sysdefconfig, adomappingfile, adoqualitymappingfile, builddrive, adoqualitydirs):
+    """ Creates ado mapping and ado quality mapping files """
+    input = open(sysdefconfig, 'r')
+    output = open(adomappingfile, 'w')
+    outputquality = open(adoqualitymappingfile, 'w')
+    components = {}
+    for sysdef in input.readlines():
+        sysdef = sysdef.strip()
+        if len(sysdef) > 0:
+            print "Checking %s" % sysdef
+            os.path.dirname(sysdef)
+            location = ido.get_sysdef_location(sysdef)
+            if location != None:
+                sysdef = os.path.dirname(sysdef).replace('\\','/').replace(':','\\:')
+                component = os.path.normpath(os.path.join(builddrive, os.environ['EPOCROOT'], location)).replace('\\','/').replace(':','\\:')
+                print "%s=%s\n" % (sysdef, component)
+                output.write("%s=%s\n" % (sysdef, component))
+                
+                if adoqualitydirs == None:
+                    outputquality.write("%s=%s\n" % (sysdef, component))
+                else:
+                    for dir in adoqualitydirs.split(','):
+                        if os.path.normpath(dir) == os.path.normpath(os.path.join(builddrive), os.environ['EPOCROOT'], location):
+                            outputquality.write("%s=%s\n" % (sysdef, component))
+    outputquality.close()
+    output.close()
+    input.close()
+
+
+    
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/imaker/ant.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/imaker/ant.py	Wed Dec 23 19:29:07 2009 +0200
@@ -135,6 +135,10 @@
 
     configs = imaker.api.scan_configs(includes, excludes)
     targets = {}
+    if len(configs) == 0:
+        for inc in includes:
+            task.log("WARNING: Could not find configurations to build roms for '%s'" % inc)
+        
     for config in configs:
         task.log("Configuration: %s" % config)
         if config not in targets:
--- a/buildframework/helium/tools/common/python/lib/integration/quality.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/integration/quality.py	Wed Dec 23 19:29:07 2009 +0200
@@ -46,7 +46,7 @@
     def __init__(self, _file):
         """The constructor """
         symbian.log.Parser.__init__(self, _file)
-        self.__match_what = re.compile("abld(\.bat)?(\s+.*)*\s+-w(hat)?", re.I)
+        self.__match_what = re.compile("abld(\.bat)?(\s+.*)*\s+-(check)?w(hat)?", re.I)
         self.internalexports = {}
         
     def task(self, name, _cmd, _dir, content):
@@ -68,7 +68,7 @@
     def __init__(self, _file):
         """The constructor """
         symbian.log.Parser.__init__(self, _file)
-        self.__match_what = re.compile(r"abld(\.bat)?(\s+.*)*\s+-w(hat)?", re.I)
+        self.__match_what = re.compile(r"abld(\.bat)?(\s+.*)*\s+-(check)?w(hat)?", re.I)
         self.__match_cmaker_what = re.compile(r"cmaker(\.cmd)?(\s+.*)*\s+ACTION=what", re.I)
         self.files_per_component = {}
         self.components_per_file = {}
@@ -180,5 +180,10 @@
                 for result in self.validate_content(filename):
                     yield result
             else:
-                yield ['missing', dirpath, None]
+                # report an error is the directory has no DP file
+                # and any files underneith.
+                for item in os.listdir(dirpath):
+                    if os.path.isfile(os.path.join(dirpath, item)):
+                        yield ['missing', dirpath, None]
+                        break
 
--- a/buildframework/helium/tools/common/python/lib/integration/templatebuilder.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-#============================================================================ 
-#Name        : templatebuilder.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-""" The template builder. """
-import logging
-
-# Uncomment this line to enable logging in this module, or configure logging elsewhere
-#logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger('integration.templatebuilder')
-
-class TemplateBuilder:
-    """ This class implements a template builder.
-    """
-    
-    def __init__(self, config, product):
-        self._config = config
-        self._product = product
-        
-    def build(self):
-        """ Render all the templates for the current product. """
-        for config in self._config.getConfigurations(self._product, 'TemplateBuilder'):
-            self._build_config(config)
-
-    def __read_template(self, config):
-        """ Read the whole file content.
-        """
-        logger.info("Using template '%s'..." % config['template.file'])
-        ftr = open(config['template.file'], "r")
-        content = ftr.read()
-        ftr.close()
-        return content
-
-            
-    def _build_config(self, config):
-        """ Open config and render the template. """
-        if config.name != None:
-            logger.info("Building config '%s'..." % config.name)
-        logger.info("Creating file '%s'..." % config['output.file'])
-        output = open(config['output.file'], 'w+')        
-        output.write(config.interpolate(self.__read_template(config)))
-        output.close()
-        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/minidomamara.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,101 @@
+#============================================================================ 
+#Name        : minidomamara.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+# pylint: disable-msg=E1103
+
+import xml.dom.minidom
+from xml.etree.ElementTree import ElementTree
+
+def parse(f):
+    return MinidomAmara(f)
+
+def create_document(name):
+    impl = xml.dom.minidom.getDOMImplementation()
+    newdoc = impl.createDocument(None, name, None).toxml()
+    return MinidomAmara(newdoc)
+
+class MinidomAmara(object):
+    """ amara api using minidom """
+    
+    def __init__(self, dom, parent=None):
+        self.parent = parent
+        if isinstance(dom, file):
+            self.dom = xml.dom.minidom.parse(dom)
+        elif isinstance(dom, basestring):
+            self.dom = xml.dom.minidom.parseString(dom)
+        else:
+            self.dom = dom
+    
+    def __getitem__(self, name):
+        if type(self.dom).__name__ == 'instance':
+            return self
+        return MinidomAmara(self.dom[name])
+    
+    def __getattr__(self, attr):
+        self.attr = attr
+        res = self.dom.getElementsByTagName(attr)
+        if len(res) == 0:
+            return self.dom.getAttribute(attr)
+        return MinidomAmara(res[0], self.dom)
+
+    def __iter__(self):
+        for entry in self.parent.getElementsByTagName(self.dom.tagName):
+            yield MinidomAmara(entry)
+
+    def __str__(self):
+        text = ''
+        for t in self.dom.childNodes:
+            if t.nodeType == t.TEXT_NODE and t.data != None:
+                text = text + t.data
+        return text
+    
+    def xml(self):
+        return self.dom.toxml()
+    
+    def xml_append_fragment(self, text):
+        self.dom.appendChild(xml.dom.minidom.parseString(text).documentElement)
+
+    def xml_set_attribute(self, name, value):
+        self.dom.setAttribute(name, value)
+    
+    def _getxml_children(self):
+        return [MinidomAmara(entry) for entry in self.dom.childNodes]
+        
+    def xml_append(self, value):
+        pass
+    
+    def xml_create_element(self, name, content=None, attributes=None):
+        pass
+    
+    xml_children = property(_getxml_children)
+    
+#    def xml_xpath(self, xpath):
+#        tree = ElementTree()
+#        tree.parse(self.dom.toxml())
+#        return tree.findall(xpath)
+
+def test():
+    x = parse(r'<commentLog><branchInfo category="" error="kkk" file="tests/data/comments_test.txt" originator="sanummel" since="07-03-22">Add rofsfiles for usage in paged images</branchInfo></commentLog>')
+    assert str(x.commentLog.branchInfo) == 'Add rofsfiles for usage in paged images'
+    
+    x = parse(r'<commentLog><branchInfo>1</branchInfo><branchInfo>2</branchInfo></commentLog>')
+    for y in x.commentLog.branchInfo:
+        assert str(y) == '1'
+        break
+    
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/parsedatalistening.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,143 +0,0 @@
-#============================================================================ 
-#Name        : parsedatalistening.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-import urllib
-import gzip
-import tempfile
-import os
-import sys
-import xml.etree.ElementTree as ElementTree
-from processing import Pool, freezeSupport
-
-class Target:
-    def __init__(self, name, start, end):
-        self.name = name
-        self.start = start
-        self.end = end
-      
-class Build:
-    def __init__(self, id, user, success, targets):
-        self.id = id
-        self.user = user
-        self.success = success
-        self.targets = targets
-
-def parseXml(infile):
-    f = gzip.open(infile, 'r')
-    success = True
-    username = ''
-    targets = []
-    for event, elem in ElementTree.iterparse(f):
-        if elem.tag == 'build':
-            name = elem.get('status')
-            if name != 'successful':
-                success = False
-        if elem.tag == 'target':
-            name = elem.get('name')
-            id = elem.get('id')
-            if name != None:
-                targets.append(Target(name, id, 0))
-        if elem.tag == 'targetRef':
-            ref = elem.get('reference')
-            if ref != None:
-                for t in targets:
-                    if t.start == ref:
-                        t.start = int(elem.get('startTime'))
-                        t.end = int(elem.get('endTime'))
-        if elem.tag == 'property':
-            if elem.get('name') == 'user.name':
-                username = elem.get('value')
-            
-        elem.clear()
-    
-    f.close()
-
-    return Build(infile, username, success, targets)
-
-if __name__ == '__main__':
-    freezeSupport()
-        
-    outdir = os.path.join(tempfile.gettempdir(), 'helium_data')
-    if not os.path.exists(outdir):
-        os.mkdir(outdir)
-    
-    files = []
-    pool = Pool()
-    
-    for n in range(1, 100):
-    
-        try:
-            #r'C:\USERS\helium\helium_data'
-            infile = os.path.join(outdir, '%(#)08d_data.xml.gz' % {"#": n})
-            #print infile
-            if not os.path.exists(infile):
-                urllib.urlretrieve("http://helium.nmp.nokia.com/data/internaldata/%(#)08d_data.xml.gz" % {"#": n}, infile)
-            
-            files.append(infile)
-    
-        except Exception, e:
-            print e
-    
-    builds = pool.map(parseXml, files)
-    
-    targets = {}
-    targetsfailing = {}
-    users = {}
-    
-    for build in builds:
-
-        if users.has_key(build.user):
-            users[build.user] = users[build.user] + 1
-        else:
-            users[build.user] = 1
-        
-        for value in build.targets:
-            #print build.targets
-            #value = build.targets.pop()
-            #print value.name
-            #print (value.end - value.start)/1000
-                
-            if targets.has_key(value.name):
-                #targets[value.name] = targets[value.name] + 1
-                (no, time) = targets[value.name]
-                targets[value.name] = (no + 1, time + (value.end - value.start))
-            else:
-                targets[value.name] = (1, (value.end - value.start))
-            
-            if not build.success:
-                if targetsfailing.has_key(value.name):
-                    targetsfailing[value.name] = targetsfailing[value.name] + 1
-                else:
-                    targetsfailing[value.name] = 1
-    
-    print 'Users:'
-        
-    for key in users.keys():
-        print '%05d' % users[key] + ' ' + key
-    
-    print 'Calls,Targets,TimeSeconds'
-    
-    for key in targets.keys():
-        (no, time) = targets[key]
-        print '%05d' % no + ',' + key + ',%07d' % int(time/1000)
-    
-    print 'Targets failing:'
-    
-    for key in targetsfailing.keys():
-        print '%05d' % targetsfailing[key] + ' ' + key
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/precompile.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-#============================================================================ 
-#Name        : precompile.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-import os
-import py_compile
-import sys
-from optparse import OptionParser
-
-module_list = ['buildtools.py', 'CreateZipInput.py', 'fileutils.py', 'configuration.py', 'archive\\tools.py', 'archive\\selectors.py', 
-				'archive\\scanners.py', 'archive\\mappers.py', 'archive\\builders.py', 'archive\\__init__.py' ]
-def main():
-    """ The application main. """
-    cli = OptionParser(usage="%prog [options]")
-    cli.add_option("--modulepath", help="input text to display") 
-                   
-    opts, dummy_args = cli.parse_args()
-    if not opts.modulepath:
-        cli.print_help()
-        sys.exit(-1)
-    
-    for module in module_list:
-        py_compile.compile(os.path.join(opts.modulepath, module))
-    
-
-if __name__ == "__main__":
-    main()
--- a/buildframework/helium/tools/common/python/lib/preparation.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/preparation.py	Wed Dec 23 19:29:07 2009 +0200
@@ -170,6 +170,7 @@
     def __init__(self, config, builder):
         """ Initialization. """
         PreparationAction.__init__(self, config, builder)
+        self.__role = None
 
     def check(self):
         """ Checks if all synergy resources are available. """
@@ -236,26 +237,33 @@
                 _logger.info("Using version: '%s'" % version)
 
             try:
+                self.__setRole(session)
                 result = project.checkout(session.create(self._config['release']), version=version, purpose=purpose)
                 ccm.log_result(result, ccm.CHECKOUT_LOG_RULES, _logger)
             except ccm.CCMException, exc:
                 ccm.log_result(exc.result, ccm.CHECKOUT_LOG_RULES, _logger)
                 raise exc
+            finally:
+                self.__restoreRole(session)
             _logger.info('Checkout complete')
             
             if result.project != None and result.project.exists():                
                 _logger.info("Project checked out: '%s'" % result.project)
                 
-                
-                _logger.info("Maintaining the workarea...")
-                if self.get_threads() == 1:
-                    _logger.info(result.project.work_area(True, True, True, self._config['dir'], result.project.name))
-                else:
-                    #pool = self._builder.session(self._config['database'], self.get_threads())
-                    _logger.info(ccm.extra.FastMaintainWorkArea(result.project, self._config['dir'], result.project.name, self.get_threads()))
+                try:
+                    self.__setRole(session)
+                    _logger.info("Maintaining the workarea...")
+                    if self.get_threads() == 1:
+                        output = result.project.work_area(True, True, True, self._config['dir'], result.project.name)
+                    else:
+                        output = ccm.extra.FastMaintainWorkArea(result.project, self._config['dir'], result.project.name, self.get_threads())
+                    ccm.log_result(output, ccm.CHECKOUT_LOG_RULES, _logger)
+                finally:
+                    self.__restoreRole(session)
                 self.__setup_project(project, result.project)
             else:
                 raise Exception("Error checking out '%s'" % project)
+
         _logger.info("++ Finished at %s" % time.strftime("%H:%M:%S", time.localtime()))
 
     def __find_project(self, project):
@@ -278,14 +286,30 @@
                 fileutils.rmtree(os.path.dirname(path))
             return None
 
-    def __setup_project(self, project, coproject):
-        """ Private method. """
-        session = self.get_session()
-        role = session.role
+    def __setRole(self, session):
+        """ Updating the role of a session. """
+        self.__role = session.role
         if self._config.has_key('purpose'):
             co_role = ccm.get_role_for_purpose(session, self._config['purpose'])
             _logger.info("Switching user to role: %s" % co_role)
             session.role = co_role
+            _logger.info("Switched user to role: %s" % session._get_role())
+
+    
+    def __restoreRole(self, session):
+        """ Restoring to default user role. """
+        if self.__role:
+            _logger.info("Switching user to role: %s" % self.__role)
+
+            session.role = self.__role
+            self.__role = None
+            _logger.info("Switched user to role: %s" % session._get_role())
+
+            
+    def __setup_project(self, project, coproject):
+        """ Private method. """
+        session = self.get_session()
+        self.__setRole(session)
         
         newprojs = []
         if not self._config.get_boolean('use.reconfigure.template', False):
@@ -335,8 +359,7 @@
         # Running check conflicts
         self._check_conflicts(coproject)
         
-        _logger.info("Switching user to role: %s" % role)
-        session.role = role
+        self.__restoreRole(session)
 
     def _sync(self, coproject):
         """ Run the sync if the 'sync' property is defined to true in the 
--- a/buildframework/helium/tools/common/python/lib/sis.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/sis.py	Wed Dec 23 19:29:07 2009 +0200
@@ -24,39 +24,90 @@
 
 
 class SisPreBuilder(buildtools.PreBuilder):
-    """"""
-    def __init__(self, config):
-        buildtools.PreBuilder.__init__(self, config)
+    """ Generates a set of build commands for processing a SIS/X build
+    configuration file. """
+    def __init__(self, config_set, config_name=None):
+        """ Initialisation. """
+        buildtools.PreBuilder.__init__(self, config_set)
+        self._config_name = config_name
 
     def write(self, buildFilePath):
-        sisConfigs = self.configSet.getConfigurations()
+        """ Generate the build file that will run the actual commands. """
+        sisConfigs = self.configSet.getConfigurations(self._config_name)
         commandList = buildtools.CommandList()
         for config in sisConfigs:
-            sis_filename = config['name'] + '.sis'
-            if config.get('sis.name', None) != None:
-                sis_filename = config['sis.name'] + '.sis'
-            makeSisArgs = ['-v', config['name'] + '.pkg', sis_filename]
-            makeSisCommand = buildtools.Command(config['makesis.tool'], config['path'], makeSisArgs)
-            commandList.addCommand(makeSisCommand)
-            
-            if config.get_boolean('publish.unsigned', False):
-                # This is hardcoded xcopy operation that should be replaced by a more generic
-                # definition of tasks that can be created in build files
-                srcFile = os.path.join(config['path'], sis_filename)
-                todir = config['build.sisfiles.dir']
-                copyCommand = buildtools.Copy(srcFile, todir)
-                commandList.addCommand(copyCommand, newstage=True)
-
-            sisx_filename = sis_filename + 'x'
-            signSisArgs = ['-v', sis_filename, sisx_filename, config['cert'], config['key']]
-            signSisCommand = buildtools.Command(config['signsis.tool'], config['path'], signSisArgs)
-            commandList.addCommand(signSisCommand, newstage=True)
-
-            # This is hardcoded xcopy operation that should be replaced by a more generic
-            # definition of tasks that can be created in build files
-            srcFile = os.path.join(config['path'], sisx_filename)
+            if 'input' in config:
+                SisPreBuilder._write_v2(config, commandList)
+            else:
+                SisPreBuilder._write_v1(config, commandList)
+                
+        self.writeBuildFile(commandList, buildFilePath)
+                
+    @staticmethod
+    def _write_v1(config, commandList):
+        """ v1 config that uses name and path properties. """
+        sis_filename = config['name'] + '.sis'
+        if config.get('sis.name', None) != None:
+            sis_filename = config['sis.name'] + '.sis'
+        makeSisArgs = ['-v', config['name'] + '.pkg', sis_filename]
+        makeSisCommand = buildtools.Command(config['makesis.tool'], config['path'], makeSisArgs)
+        commandList.addCommand(makeSisCommand)
+        
+        if config.get_boolean('publish.unsigned', False):
+            srcFile = os.path.join(config['path'], sis_filename)
             todir = config['build.sisfiles.dir']
             copyCommand = buildtools.Copy(srcFile, todir)
             commandList.addCommand(copyCommand, newstage=True)
 
-        self.writeBuildFile(commandList, buildFilePath)
+        sisx_filename = sis_filename + 'x'
+        signSisArgs = ['-v', sis_filename, sisx_filename, config['cert'], config['key']]
+        signSisCommand = buildtools.Command(config['signsis.tool'], config['path'], signSisArgs)
+        commandList.addCommand(signSisCommand, newstage=True)
+
+        # Copy content to SIS files directory
+        srcFile = os.path.join(config['path'], sisx_filename)
+        todir = config['build.sisfiles.dir']
+        copyCommand = buildtools.Copy(srcFile, todir)
+        commandList.addCommand(copyCommand, newstage=True)
+
+    @staticmethod
+    def _write_v2(config, commandList):
+        """ v2 config that uses input and output properties. """ 
+        # Check for invalid old parameters
+        v1_properties = ['name', 'path', 'sis.name']
+        for property_ in v1_properties:
+            if property_ in config:
+                raise Exception("Invalid property %s if using new 'input' SIS configuration" % property_)
+        
+        input_ = config['input']
+        (input_path, input_name) = os.path.split(input_)
+        (input_root, input_ext) = os.path.splitext(input_)
+        valid_extensions = ['.pkg', '.sis', '.sisx']
+        if input_ext not in valid_extensions:
+            raise Exception('Invalid extension for SIS configuration.')
+        
+        # See if makesis needs to be run
+        if input_ext == '.pkg':
+            output = config.get('output', input_root + '.sis')
+            if output.endswith('.sisx'):
+                output = output[:-1]
+            # Set input for the next stage
+            makesis_args = ['-v', input_, output]
+            makesis_command = buildtools.Command(config['makesis.tool'], input_path, makesis_args)
+            commandList.addCommand(makesis_command)
+            input_ = output
+            
+        # See if signsis needs to be run
+        if 'key' in config:
+            output = config.get('output', input_root + '.sisx')
+            signsis_args = ['-v', input_, output, config['cert'], config['key']]
+            signsis_command = buildtools.Command(config['signsis.tool'], input_path, signsis_args)
+            commandList.addCommand(signsis_command, newstage=True)
+            
+        # Copy content to SIS files directory
+        copyCommand = buildtools.Copy(output, config['build.sisfiles.dir'])
+        commandList.addCommand(copyCommand, newstage=True)
+        
+
+
+
--- a/buildframework/helium/tools/common/python/lib/symrec.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/symrec.py	Wed Dec 23 19:29:07 2009 +0200
@@ -40,6 +40,51 @@
     """ Create the attribute if needed. """
     node.setAttribute(attr, value)
 
+def is_child_text_only(node):
+    """ Returns true if child node are all from TEXT_NODE type. """
+    for child in node.childNodes:
+        if child.nodeType != xml.dom.minidom.Node.TEXT_NODE:
+            return False
+    return True
+
+
+def ignore_whitespace_writexml(self, writer, indent="", addindent="", newl=""):
+    """ This version of writexml will ignore whitespace text to alway render
+    the output in a structure way.
+    indent = current indentation
+    addindent = indentation to add to higher levels
+    newl = newline string
+    """
+    writer.write(indent + "<" + self.tagName)
+
+    attrs = self._get_attributes()
+    a_names = attrs.keys()
+    a_names.sort()
+
+    for a_name in a_names:
+        writer.write(" %s=\"" % a_name)
+        xml.dom.minidom._write_data(writer, attrs[a_name].value)
+        writer.write("\"")
+    if self.childNodes:
+        writer.write(">")
+        if is_child_text_only(self):
+            for node in self.childNodes:
+                node.writexml(writer, '', '', '')
+            writer.write("</%s>%s" % (self.tagName, newl))
+        else:
+            writer.write(newl)
+            for node in self.childNodes:
+                if node.nodeType == xml.dom.minidom.Node.TEXT_NODE and node.data.isspace():
+                    pass
+                else:
+                    node.writexml(writer, indent + addindent, addindent, newl)
+            writer.write("%s</%s>%s" % (indent, self.tagName, newl))
+    else:
+        writer.write("/>%s" % (newl))
+
+xml.dom.minidom.Element.writexml = ignore_whitespace_writexml
+
+
 class ServicePack(object):
     
     def __init__(self, node):
@@ -68,7 +113,7 @@
     
     def __init__(self, filename, service=None, product=None, release=None):
         self._filename = filename
-        if os.path.exists(filename):
+        if filename and os.path.exists(filename):
             self._xml = xml.dom.minidom.parse(open(filename, "r"))
             releaseInformation = self._xml.getElementsByTagName(u"releaseInformation")
             if releaseInformation != []:
@@ -238,7 +283,7 @@
 
     def xml(self):
         """ Returning the XML as a string. """
-        return self._xml.toxml()
+        return self._xml.toprettyxml()
         
     def save(self, filename = None):
         """ Saving the XML into the provided filename. """
@@ -413,15 +458,19 @@
 
 def find_latest_metadata(releasedir):
     """ Finding the release latest release metadata file. """ 
-    metadatas = []
-    for filename in os.listdir(releasedir):
-        if re.match(r'^release_metadata(_\d+)?\.xml$', filename, re.I) is not None:
-            LOGGER.debug("Found %s" % filename)
-            metadatas.append(filename)
-    # reverse the order...
-    metadatas.sort(reverse=True)
-    if len(metadatas) > 0:
-        return os.path.normpath(os.path.join(releasedir, metadatas[0]))
+    try:
+        metadatas = []
+        for filename in os.listdir(releasedir):
+            if re.match(r'^release_metadata(_\d+)?\.xml$', filename, re.I) is not None:
+                LOGGER.debug("Found %s" % filename)
+                metadatas.append(filename)
+        # reverse the order...
+        metadatas.sort(reverse=True)
+        if len(metadatas) > 0:
+            return os.path.normpath(os.path.join(releasedir, metadatas[0]))
+    except Exception, exc:
+        LOGGER.error(exc)
+        return None
     return None
 
 class ValidateReleaseMetadataCached(ValidateReleaseMetadata):
@@ -470,8 +519,10 @@
 
     def update_cache(self, metadatas):
         if self.__cachefile is not None and os.path.exists(os.path.dirname(self.__cachefile)):
-            writer = csv.writer(open(self.__cachefile, "wb"))
+            f = open(self.__cachefile, "wb")
+            writer = csv.writer(f)
             writer.writerows(metadatas)
+            f.close()
 
 class ValidateTicklerReleaseMetadata(ValidateReleaseMetadataCached):
     """ This class validate if a metadata file is stored in the correct location and
--- a/buildframework/helium/tools/common/python/lib/sysdef/api.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/sysdef/api.py	Wed Dec 23 19:29:07 2009 +0200
@@ -125,7 +125,9 @@
     
     def __getpath(self):
         """ Path getter. """
-        return os.path.join(os.path.sep, self.__xml.getAttribute('bldFile'))
+        if self.__xml.hasAttribute('bldFile'):
+            return os.path.join(os.path.sep, self.__xml.getAttribute('bldFile'))
+        return os.path.join(os.sep, os.path.dirname(self.__xml.getAttribute('mrp')))
             
     def __getfilters(self):
         """ filter getter. """
@@ -172,7 +174,7 @@
             self._units.append(unit)
             self._sysDef.addElement(unit)
 
-        for moduleNode in recursive_node_scan(self._xml, 'module') + recursive_node_scan(self._xml, 'component'):
+        for moduleNode in recursive_node_scan(self._xml, 'module') + recursive_node_scan(self._xml, 'collection'):
             module = Module(moduleNode, self._sysDef)
             self._modules.append(module)
             self._module_count += 1
--- a/buildframework/helium/tools/common/python/lib/test/test_ant.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_ant.py	Wed Dec 23 19:29:07 2009 +0200
@@ -32,6 +32,15 @@
     
     # Property was defined, should provide value
     assert ant.get_property('foo') == 'foo'
+
+
+def test_get_property_macro():
+    """ Test the support of get_property inside macro. """
+    # Property was not defined in Ant
+    assert ant.get_property('@{foo}') == None
+    
+    # Property was defined, should provide value
+    assert ant.get_property('foo') == 'foo'
     
     
 def test_get_previous_build_number():
@@ -50,4 +59,9 @@
     
     assert ant.get_previous_build_number('oci.12') == 'oci.11'
     
-    assert ant.get_previous_build_number('oci.patch.02') == 'oci.patch.01'
\ No newline at end of file
+    assert ant.get_previous_build_number('oci.patch.02') == 'oci.patch.01'
+    
+    assert ant.get_previous_build_number('oci.patch.10') == 'oci.patch.9'
+
+    assert ant.get_previous_build_number('oci.patch.010') == 'oci.patch.009'
+    
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/test/test_archive.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,957 +0,0 @@
-#============================================================================ 
-#Name        : test_archive.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-"""Test the archive.py module."""
-
-import os
-import amara
-import unittest
-import sys
-
-import archive
-import configuration
-import logging
-import fileutils
-import xml.dom.minidom
-
-import test.test_fileutils
-
-
-_logger = logging.getLogger('test.archive')
-    
-    
-root_test_dir = test.test_fileutils.root_test_dir
-
-def setup_module():
-    """ Creates some test data files for file-related testing. """
-    test.test_fileutils.setup_module()
-    
-def teardown_module():
-    """ Cleans up test data files for file-related testing. """
-    test.test_fileutils.teardown_module()
-    
-    
-class ArchivePreBuilderTest(unittest.TestCase):
-    EXEC_FILE = "archive_create.ant.xml"
-
-    def test_ant_exec(self):
-        """Tests that an archive configuration file successfully creates an Ant exec file."""
-        builder = configuration.NestedConfigurationBuilder('tests/data/archive_test.cfg.xml')
-        archiveConfigSet = builder.getConfiguration()
-        archivePreBuilder = archive.ArchivePreBuilder(archiveConfigSet, "config", index=0)
-        buildFilePath = os.path.join(root_test_dir, r'archive_test.ant.xml')
-        archivePreBuilder.write(buildFilePath)
-        build_file = open(buildFilePath, 'r')
-        build_file_content = build_file.read()
-        _logger.debug(build_file_content)
-        resultDoc = amara.parse(build_file_content)
-        build_file.close()
-        # The last target in the Ant file should be called 'all'. Other targets
-        # are named stage1, stage2, etc.
-        assert resultDoc.project.target[-1].name == 'all'
-        os.remove(buildFilePath)
-        
-
-
-class LogicalArchiveTest(unittest.TestCase):
-##    def setup(self):
-##        """Test setup."""
-#        builder = configuration.NestedConfigurationBuilder('tests/data/archive_test.cfg.xml')
-#        self.archiveConfigSet = builder.getConfiguration()
-#        self.config = self.archiveConfigSet.getConfigurations()[0]
-#        self.archivePreBuilder = archive.ArchivePreBuilder(self.archiveConfigSet)
-
-    def test_manifest_files(self):
-        """ A LogicalArchive can create a correct manifest. """
-        configDict = {'root.dir': root_test_dir,
-                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
-                  'archives.dir': root_test_dir,
-                  'name': 'manifest_test',
-                  'include': 'dir1/*.txt',
-                  'archive.tool': '7za'
-                 }
-        config = configuration.Configuration(configDict)
-
-        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
-        builder.build_manifest(config)
-
-        expectedPaths = [os.path.normpath('dir1/file1.txt')]
-
-        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_includefile.txt')
-
-        content = open(includeFilePath, 'r').readlines()
-        print content
-        print expectedPaths
-        content = [s.strip().lower() for s in content]
-        assert content == expectedPaths
-    
-    def test_empty_manifest_file(self):
-        """ A LogicalArchive can handle empty manifest. """
-        configDict = {'root.dir': root_test_dir,
-                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
-                  'archives.dir': root_test_dir,
-                  'name': 'manifest_test',
-                  'include': 'nothing',
-                  'archive.tool': '7za'
-                 }
-        config = configuration.Configuration(configDict)
-
-        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
-        builder.build_manifest(config)
-
-        expectedPaths = []
-
-        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_includefile.txt')
-
-        content = open(includeFilePath, 'r').readlines()
-        print content
-        print expectedPaths
-        content = [s.strip().lower() for s in content]
-        assert content == expectedPaths
-
-    def test_manifest_files_with_exclude_list(self):
-        """ A LogicalArchive can create a correct manifest. """
-        excludelst = os.path.join(root_test_dir, 'exclude.lst')
-        flh = open(excludelst, 'w+')
-        flh.write("/epoc32/tools/variant/variant.cfg\n")
-        flh.write("\\epoc32\\tools\\abld.pl\n")
-        flh.write(os.path.join(root_test_dir, 'dir1', 'file1.txt') + "\n")
-        flh.write(os.path.join(root_test_dir, 'dir1/subdir1/subdir1_file.txt') + "\n")
-        flh.close()
-        configDict = {'root.dir': root_test_dir,
-                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
-                  'archives.dir': root_test_dir,
-                  'name': 'manifest_test',
-                  'include': 'dir1/**',
-                  'exclude.lst': excludelst,
-                  'archive.tool': '7za'
-                 }
-        config = configuration.Configuration(configDict)
-
-        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
-        builder.build_manifest(config)
-
-        expectedPaths = [os.path.normpath('dir1/file2.doc'),
-                         os.path.normpath('dir1/file3_no_extension'),
-                         os.path.normpath('dir1/subdir2/subdir2_file_no_extension'),
-                         os.path.normpath('dir1/subdir3/'),
-                         ]
-        expectedPaths.sort()
-        
-        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_includefile.txt')
-
-        content = open(includeFilePath, 'r').readlines()
-        print content
-        print expectedPaths
-        content = [s.strip().lower() for s in content]
-        content.sort()
-        assert content == expectedPaths
-
-    def test_manifest_files_with_exclude_list_abs_nodrive(self):
-        """ A LogicalArchive can create a correct manifest with external list and drive. """
-        rtd = os.path.splitdrive(os.path.abspath(root_test_dir))[1]
-        excludelst = os.path.join(root_test_dir, 'exclude.lst')
-        flh = open(excludelst, 'w+')
-        flh.write("/epoc32/tools/variant/variant.cfg\n")
-        flh.write("\\epoc32\\tools\\abld.pl\n")
-        flh.write(os.path.join(rtd, 'dir1', 'file1.txt') + "\n")
-        flh.write(os.path.join(rtd, 'dir1/subdir1/subdir1_file.txt') + "\n")
-        flh.close()
-        configDict = {'root.dir': os.path.abspath(root_test_dir),
-                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
-                  'archives.dir': root_test_dir,
-                  'name': 'manifest_test',
-                  'include': 'dir1/**',
-                  'exclude.lst': excludelst,
-                  'archive.tool': '7za'
-                 }
-        config = configuration.Configuration(configDict)
-
-        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
-        builder.build_manifest(config)
-
-        expectedPaths = [os.path.normpath('dir1/file2.doc'),
-                         os.path.normpath('dir1/file3_no_extension'),
-                         os.path.normpath('dir1/subdir2/subdir2_file_no_extension'),
-                         os.path.normpath('dir1/subdir3/'),
-                         ]
-        expectedPaths.sort()
-        
-        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_includefile.txt')
-
-        content = open(includeFilePath, 'r').readlines()
-        if sys.platform == "win32":
-            content = [s.strip().lower() for s in content]
-        else:
-            content = [s.strip() for s in content]
-        content.sort()
-        print content
-        print expectedPaths
-        assert content == expectedPaths
-
-    
-    def test_distribution_policy_config(self):
-        expected_paths = [os.path.normpath('s60/component_public/component_public_file.txt'),
-                         os.path.normpath('s60/component_public/Distribution.Policy.S60'),
-                         os.path.normpath('s60/Distribution.Policy.S60'),
-                         os.path.normpath('s60/missing/subdir/Distribution.Policy.S60'),
-                         os.path.normpath('s60/missing/subdir/not_to_be_removed_0.txt'),
-                         os.path.normpath('s60/UPPERCASE_MISSING/subdir/Distribution.Policy.S60'),
-                         os.path.normpath('s60/UPPERCASE_MISSING/subdir/not_to_be_removed_0.txt'),]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths)):
-                expected_paths[i] = expected_paths[i].lower()
-        self.do_distribution_policy_config(expected_paths, policy='0')
-         
-        expected_paths = [os.path.normpath('s60/component_private/component_private_file.txt'),
-                         os.path.normpath('s60/component_private/Distribution.Policy.S60'),]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths)):
-                expected_paths[i] = expected_paths[i].lower()
-        self.do_distribution_policy_config(expected_paths, policy='1')
-
-        expected_paths = [os.path.normpath('s60/missing/subdir/another_subdir/to_be_removed_9999.txt'),
-                          os.path.normpath('s60/missing/to_be_removed_9999.txt'),
-                          os.path.normpath('s60/UPPERCASE_MISSING/subdir/another_subdir/to_be_removed_9999.txt'),
-                          os.path.normpath('s60/UPPERCASE_MISSING/to_be_removed_9999.txt')]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths)):
-                expected_paths[i] = expected_paths[i].lower()
-        self.do_distribution_policy_config(expected_paths, policy=archive.mappers.MISSING_POLICY)
-        
-    def do_distribution_policy_config(self, expected_paths, policy):
-        """ . """
-        configDict = {'root.dir': root_test_dir,
-                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
-                  'archives.dir': root_test_dir,
-                  'name': 's60_policy_test',
-                  'include': 's60/',
-                  'distribution.policy.s60': policy,
-                  'selectors': 'policy',
-                  'archive.tool': '7za'
-                 }
-        config = configuration.Configuration(configDict)
-
-        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
-        builder.build_manifest(config)
-        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/s60_policy_test_includefile.txt')
-        
-        content = open(includeFilePath, 'r').readlines()
-        if sys.platform == "win32":
-            content = [s.strip().lower() for s in content]
-        else:
-            content = [s.strip() for s in content]
-        content.sort()
-
-        print content
-        if sys.platform == "win32":
-            expected_paths = [s.strip().lower() for s in expected_paths]
-        else:
-            expected_paths = [s.strip() for s in expected_paths]
-        expected_paths.sort()
-        print expected_paths
-        assert content == expected_paths
-        
-    def test_split_manifest_file_unicode(self):
-        """ A LogicalArchive can split a manifest correctly. """
-        configDict = {'root.dir': os.path.abspath(root_test_dir),
-                  'temp.build.dir': os.path.abspath(os.path.join(root_test_dir, 'temp_build_files')),
-                  'archives.dir': os.path.abspath(root_test_dir),
-                  'name': 'manifest_test_unicode',
-                  'max.files.per.archive': '1',
-                  'include': 'test_unicode/',
-                  'archive.tool': '7za'
-                 }
-        config = configuration.Configuration(configDict)
-
-        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
-        manifest_file_path = builder.build_manifest(config)        
-        builder.manifest_to_commands(config, manifest_file_path)
-        
-        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_unicode_includefile.txt')
-        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/manifest_test_unicode_part01.txt')
-        includeFilePath2 = os.path.join(root_test_dir, 'temp_build_files/manifest_test_unicode_part02.txt')
-        includeFilePath3 = os.path.join(root_test_dir, 'temp_build_files/manifest_test_unicode_part03.txt')
-
-        content = open(includeFilePath, 'r').readlines()
-        content1 = open(includeFilePath1, 'r').readlines()
-        content2 = open(includeFilePath2, 'r').readlines()
-        content3 = open(includeFilePath3, 'r').readlines()
-        print "content: ", content
-        print "content1: ", content1
-        print "content2: ", content2
-        print "content3: ", content2
-        content = [s.strip() for s in content]
-        assert len(content) == 3
-        assert len(content1) == 1
-        assert len(content2) == 1
-        assert len(content3) == 1
-
-    def test_distribution_policy_mapper_config(self):
-        """ Testing the policy mapper. """
-        configDict = {'root.dir': root_test_dir,
-                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
-                  'archives.dir': root_test_dir,
-                  'name': 's60_policy_mapper_test',
-                  'include': 's60/',
-                  'archive.tool': '7za',
-                  'policy.zip2zip': 'true',
-                  'mapper': 'policy',
-                  'policy.csv': os.path.join(os.environ['HELIUM_HOME'], 'tests/data/distribution.policy.id_status.csv'),
-                 }
-        config = configuration.Configuration(configDict)
-
-        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
-        manifest_file_path = builder.build_manifest(config)
-        cmds = builder.manifest_to_commands(config, manifest_file_path)
-
-        
-        expected_paths = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
-                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
-                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'Distribution.Policy.S60',                           
-                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
-                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
-                           's60' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
-                           's60' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths)):
-                expected_paths[i] = expected_paths[i].lower()
-        expected_paths0 = ['s60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
-                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths0)):
-                expected_paths0[i] = expected_paths0[i].lower()
-        expected_paths1 = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
-                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60']
-        if sys.platform == "win32":
-            for i in range(len(expected_paths1)):
-                expected_paths1[i] = expected_paths1[i].lower()
-        expected_paths9999 = ['s60' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
-                              's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
-                              's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
-                              's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt']
-        if sys.platform == "win32":
-            for i in range(len(expected_paths9999)):
-                expected_paths9999[i] = expected_paths9999[i].lower()
-        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_includefile.txt')
-        includeFilePath0 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_0.txt')
-        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_1.txt')
-        includeFilePath9999 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_9999.txt')
-        includeFilePathInternal = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test.internal.txt')
-        
-        content = self.__read_manifest(includeFilePath)
-        expected_paths.sort()
-        print "Content"
-        print content
-        print "Expected"
-        print expected_paths
-        assert content == expected_paths
-
-        content = self.__read_manifest(includeFilePath0)
-        expected_paths0.sort()
-        print content
-        print expected_paths0
-        assert content == expected_paths0
-
-        content = self.__read_manifest(includeFilePath1)
-        expected_paths1.sort()
-        print content
-        print expected_paths1
-        assert content == expected_paths1
-        
-        content = self.__read_manifest(includeFilePath9999)
-        expected_paths9999.sort()
-        print content
-        print expected_paths9999
-        assert content == expected_paths9999
-
-        assert os.path.exists(includeFilePathInternal) == True
-        print "Commands : ", cmds
-        assert len(cmds) == 3
-
-
-    def test_distribution_policy_mapper_config_no_zip2zip(self):
-        """ Testing the policy mapper. """
-        configDict = {'root.dir': root_test_dir,
-                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
-                  'archives.dir': root_test_dir,
-                  'name': 's60_policy_mapper_test_noz2z',
-                  'include': 's60/',
-                  'archive.tool': '7za',
-                  'policy.zip2zip': 'false',
-                  'mapper': 'policy'
-                 }
-        config = configuration.Configuration(configDict)
-
-        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
-        manifest_file_path = builder.build_manifest(config)
-        cmds = builder.manifest_to_commands(config, manifest_file_path)
-
-        
-        expected_paths = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
-                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
-                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'Distribution.Policy.S60',                           
-                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
-                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
-                           's60' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
-                           's60' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths)):
-                expected_paths[i] = expected_paths[i].lower()
-        expected_paths0 = ['s60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
-                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths0)):
-                expected_paths0[i] = expected_paths0[i].lower()
-        expected_paths1 = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
-                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60']
-        if sys.platform == "win32":
-            for i in range(len(expected_paths1)):
-                expected_paths1[i] = expected_paths1[i].lower()
-        expected_paths9999 = ['s60' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
-                              's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
-                              's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
-                              's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt']
-        if sys.platform == "win32":
-            for i in range(len(expected_paths9999)):
-                expected_paths9999[i] = expected_paths9999[i].lower()
-
-        expected_paths.sort()
-        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_includefile.txt')
-        includeFilePath0 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_0.txt')
-        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_1.txt')
-        includeFilePath9999 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_9999.txt')
-        includeFilePathInternal = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_noz2z.internal.txt')
-        
-        content = self.__read_manifest(includeFilePath)
-        expected_paths.sort()
-        print content
-        print expected_paths
-        assert content == expected_paths
-
-        content = self.__read_manifest(includeFilePath0)
-        expected_paths0.sort()
-        print content
-        print expected_paths0
-        assert content == expected_paths0
-
-        content = self.__read_manifest(includeFilePath1)
-        expected_paths1.sort()
-        print content
-        print expected_paths1
-        assert content == expected_paths1
-        
-        content = self.__read_manifest(includeFilePath9999)
-        expected_paths9999.sort()
-        print content
-        print expected_paths9999
-        assert content == expected_paths9999
-
-        assert os.path.exists(includeFilePathInternal) == False
-        print "Commands : ", cmds
-        assert len(cmds) == 1
-
-
-    def test_distribution_policy_mapper_remover_config(self):
-        """ Testing the policy remover mapper. """
-        configDict = {'root.dir': root_test_dir,
-                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
-                  'archives.dir': root_test_dir,
-                  'name': 's60_policy_mapper_test',
-                  'include': 's60/',
-                  'policy.root.dir': os.path.join(root_test_dir, 's60'),
-                  'archive.tool': '7za',
-                  'mapper': 'policy.remover',
-                  'policy.zip2zip': 'true',
-                  'policy.csv': os.path.join(os.environ['HELIUM_HOME'], 'tests/data/distribution.policy.id_status.csv'),
-                 }
-        config = configuration.Configuration(configDict)
-
-        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
-        manifest_file_path = builder.build_manifest(config)
-        cmds = builder.manifest_to_commands(config, manifest_file_path)
-        
-        expected_paths = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
-                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
-                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',                           
-                           's60' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',                           
-                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'another_subdir' + os.sep + 'to_be_removed_9999.txt',                           
-                           's60' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths)):
-                expected_paths[i] = expected_paths[i].lower()
-        expected_paths.sort()
-        expected_paths0 = ['s60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
-                           's60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt',                           
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           's60' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'not_to_be_removed_0.txt']
-        if sys.platform == "win32":
-            for i in range(len(expected_paths0)):
-                expected_paths0[i] = expected_paths0[i].lower()
-        expected_paths1 = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
-                           's60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60']
-        if sys.platform == "win32":
-            for i in range(len(expected_paths1)):
-                expected_paths1[i] = expected_paths1[i].lower()
-        expected_paths1.sort()
-        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_includefile.txt')
-        includeFilePath0 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_0.txt')
-        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_1.txt')
-        
-        content = self.__read_manifest(includeFilePath)
-        expected_paths.sort()
-        print content
-        print expected_paths
-        assert content == expected_paths
-
-        content = self.__read_manifest(includeFilePath0)
-        expected_paths0.sort()
-        print content
-        print expected_paths0
-        assert content == expected_paths0
-
-        content = self.__read_manifest(includeFilePath1)
-        expected_paths1.sort()
-        print content
-        print expected_paths1
-        assert content == expected_paths1
-
-        print cmds        
-        assert len(cmds[3]) == 7
-
-
-    def test_distribution_policy_mapper_sf_remover_config(self):
-        """ Testing the policy SFL remover mapper. """
-        configDict = {'root.dir': root_test_dir,
-                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
-                  'archives.dir': root_test_dir,
-                  'name': 'sf_policy_sf_mapper_test',
-                  'include': 'sf/',
-                  'policy.root.dir': os.path.join(root_test_dir, 'sf'),
-                  'archive.tool': '7za',
-                  'mapper': 'sfl.policy.remover',
-                  'policy.zip2zip': 'false',
-                  'policy.csv': os.path.join(os.environ['HELIUM_HOME'], 'tests/data/distribution.policy.extended_for_sf.id_status.csv'),
-                 }
-        config = configuration.Configuration(configDict)
-
-        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
-        manifest_file_path = builder.build_manifest(config)
-        cmds = builder.manifest_to_commands(config, manifest_file_path)
-        
-        expected_paths = ['sf' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
-                           'sf' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
-                           'sf' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',                           
-                           'sf' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
-                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',
-                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
-                           'sf' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'component_sfl' + os.sep + 'component_sfl_file.txt',
-                           'sf' + os.sep + 'component_sfl' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'component_epl' + os.sep + 'component_epl_file.txt',
-                           'sf' + os.sep + 'component_epl' + os.sep + 'Distribution.Policy.S60',]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths)):
-                expected_paths[i] = expected_paths[i].lower()
-        expected_paths0 = ['sf' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
-                           'sf' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',
-                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt']
-        if sys.platform == "win32":
-            for i in range(len(expected_paths0)):
-                expected_paths0[i] = expected_paths0[i].lower()
-        expected_paths1 = ['sf' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
-                           'sf' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60']
-        if sys.platform == "win32":
-            for i in range(len(expected_paths1)):
-                expected_paths1[i] = expected_paths1[i].lower()
-        expected_paths3 = ['sf' + os.sep + 'component_sfl' + os.sep + 'component_sfl_file.txt',
-                           'sf' + os.sep + 'component_sfl' + os.sep + 'Distribution.Policy.S60',]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths3)):
-                expected_paths3[i] = expected_paths3[i].lower()
-        expected_paths7 = ['sf' + os.sep + 'component_epl' + os.sep + 'component_epl_file.txt',
-                           'sf' + os.sep + 'component_epl' + os.sep + 'Distribution.Policy.S60',]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths7)):
-                expected_paths7[i] = expected_paths7[i].lower()
-        expected_paths9 = ['sf' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
-                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
-                           'sf' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths9)):
-                expected_paths9[i] = expected_paths9[i].lower()
- 
-        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_includefile.txt')
-        includeFilePath0 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_0.txt')
-        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_1.txt')
-        includeFilePath3 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_3.txt')
-        includeFilePath7 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_7.txt')
-        includeFilePath9 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_sf_mapper_test_9999.txt')
-        
-        
-        content = self.__read_manifest(includeFilePath)
-        expected_paths.sort()
-        print content
-        print expected_paths
-        assert content == expected_paths
-
-        content = self.__read_manifest(includeFilePath0)
-        expected_paths0.sort()
-        print content
-        print expected_paths0
-        assert content == expected_paths0
-
-        content = self.__read_manifest(includeFilePath1)
-        expected_paths1.sort()
-        print content
-        print expected_paths1
-        assert content == expected_paths1
-
-        content = self.__read_manifest(includeFilePath3)
-        expected_paths3.sort()
-        print content
-        print expected_paths3
-        assert content == expected_paths3
-
-        content = self.__read_manifest(includeFilePath7)
-        expected_paths7.sort()
-        print content
-        print expected_paths7
-        assert content == expected_paths7
-
-        content = self.__read_manifest(includeFilePath9)
-        expected_paths9.sort()
-        print content
-        print expected_paths9
-        assert content == expected_paths9
-        
-        # checking the number of command generated
-        assert len(cmds) == 2, "Must only have 2 steps in the archiving (archiving, removing)."
-        assert len(cmds[0]) == 5, "Must only have 5 output files."
-        print len(cmds[1])
-        for cmd in cmds[1]:
-            print cmd
-        assert len(cmds[1]) == len(expected_paths)-len(expected_paths3), "Remore must be equal to len(expected_paths) - len(expected_paths3)"
-
-    def test_distribution_policy_mapper_epl_remover_config(self):
-        """ Testing the policy EPL remover mapper. """
-        configDict = {'root.dir': root_test_dir,
-                  'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
-                  'archives.dir': root_test_dir,
-                  'name': 'sf_policy_epl_mapper_test',
-                  'include': 'sf/',
-                  'policy.root.dir': os.path.join(root_test_dir, 'sf'),
-                  'archive.tool': '7za',
-                  'mapper': 'epl.policy.remover',
-                  'policy.zip2zip': 'false',
-                  'policy.csv': os.path.join(os.environ['HELIUM_HOME'], 'tests/data/distribution.policy.extended_for_sf.id_status.csv'),
-                 }
-        config = configuration.Configuration(configDict)
-
-        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
-        manifest_file_path = builder.build_manifest(config)
-        cmds = builder.manifest_to_commands(config, manifest_file_path)
-        
-        expected_paths = ['sf' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
-                           'sf' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
-                           'sf' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',
-                           'sf' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
-                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',
-                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
-                           'sf' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'component_sfl' + os.sep + 'component_sfl_file.txt',
-                           'sf' + os.sep + 'component_sfl' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'component_epl' + os.sep + 'component_epl_file.txt',
-                           'sf' + os.sep + 'component_epl' + os.sep + 'Distribution.Policy.S60',]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths)):
-                expected_paths[i] = expected_paths[i].lower()
-        expected_paths0 = ['sf' + os.sep + 'component_public' + os.sep + 'component_public_file.txt',
-                           'sf' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',
-                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60',
-                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'subdir' + os.sep + 'to_be_removed_9999.txt',]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths0)):
-                expected_paths0[i] = expected_paths0[i].lower()
-        expected_paths1 = ['sf' + os.sep + 'component_private' + os.sep + 'component_private_file.txt',
-                           'sf' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60',]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths1)):
-                expected_paths1[i] = expected_paths1[i].lower()
-        expected_paths3 = ['sf' + os.sep + 'component_sfl' + os.sep + 'component_sfl_file.txt',
-                           'sf' + os.sep + 'component_sfl' + os.sep + 'Distribution.Policy.S60',]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths3)):
-                expected_paths3[i] = expected_paths3[i].lower()
-        expected_paths7 = ['sf' + os.sep + 'component_epl' + os.sep + 'component_epl_file.txt',
-                           'sf' + os.sep + 'component_epl' + os.sep + 'Distribution.Policy.S60',]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths7)):
-                expected_paths7[i] = expected_paths7[i].lower()
-        expected_paths9 = ['sf' + os.sep + 'missing' + os.sep + 'to_be_removed_9999.txt',
-                           'sf' + os.sep + 'UPPERCASE_MISSING' + os.sep + 'to_be_removed_9999.txt',
-                           'sf' + os.sep + 'not_in_cvs' + os.sep + 'Distribution.Policy.S60',]
-        if sys.platform == "win32":
-            for i in range(len(expected_paths9)):
-                expected_paths9[i] = expected_paths9[i].lower()
-
-        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_includefile.txt')
-        includeFilePath0 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_0.txt')
-        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_1.txt')
-        includeFilePath3 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_3.txt')
-        includeFilePath7 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_7.txt')
-        includeFilePath9 = os.path.join(root_test_dir, 'temp_build_files/sf_policy_epl_mapper_test_9999.txt')
-        
-        
-        content = self.__read_manifest(includeFilePath)
-        expected_paths.sort()
-        print content
-        print expected_paths
-        assert content == expected_paths
-
-        content = self.__read_manifest(includeFilePath0)
-        expected_paths0.sort()
-        print content
-        print expected_paths0
-        assert content == expected_paths0
-
-        content = self.__read_manifest(includeFilePath1)
-        expected_paths1.sort()
-        print content
-        print expected_paths1
-        assert content == expected_paths1
-
-        content = self.__read_manifest(includeFilePath3)
-        expected_paths3.sort()
-        print content
-        print expected_paths3
-        assert content == expected_paths3
-
-        content = self.__read_manifest(includeFilePath7)
-        expected_paths7.sort()
-        print content
-        print expected_paths7
-        assert content == expected_paths7
-
-        content = self.__read_manifest(includeFilePath9)
-        expected_paths9.sort()
-        print content
-        print expected_paths9
-        assert content == expected_paths9
-        
-        # checking the number of command generated
-        assert len(cmds) == 2, "Must only have 2 steps in the archiving (archiving, removing)."
-        assert len(cmds[0]) == 5, "Must only have 5 output files."
-        assert len(cmds[1]) == len(expected_paths)-len(expected_paths3), "Remore must be equal to len(expected_paths) - len(expected_paths3)"
-
-
-
-
-    def __read_manifest(self, manifest):
-        content = open(manifest, 'r').readlines()
-        if sys.platform == "win32":
-            content = [s.strip().lower() for s in content]
-        else:
-            content = [s.strip() for s in content]
-        content.sort()
-        return content
-        
-
-    def test_split_manifest_file(self):
-        """ A LogicalArchive can split a manifest correctly. """
-        configDict = {'root.dir': os.path.abspath(root_test_dir),
-                  'temp.build.dir': os.path.abspath(os.path.join(root_test_dir, 'temp_build_files')),
-                  'archives.dir': os.path.abspath(root_test_dir),
-                  'name': 'manifest_test',
-                  'max.files.per.archive': '1',
-                  'include': 'dir/',
-                  'exclude': 'dir/emptysubdir3',
-                  'archive.tool': '7za'
-                 }
-        config = configuration.Configuration(configDict)
-
-        builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
-        manifest_file_path = builder.build_manifest(config)
-        builder.manifest_to_commands(config, manifest_file_path)
-
-        expectedPaths = ['dir' + os.sep + 'emptysubdir1','dir' + os.sep + 'emptysubdir2']
-        expectedPaths1 = ['dir' + os.sep + 'emptysubdir1\n']
-        expectedPaths2 = ['dir' + os.sep + 'emptysubdir2\n']
-        
-        includeFilePath = os.path.join(root_test_dir, 'temp_build_files/manifest_test_includefile.txt')
-        includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/manifest_test_part01.txt')
-        includeFilePath2 = os.path.join(root_test_dir, 'temp_build_files/manifest_test_part02.txt')
-
-        content = open(includeFilePath, 'r').readlines()
-        content1 = open(includeFilePath1, 'r').readlines()
-        content2 = open(includeFilePath2, 'r').readlines()
-        print "content: ", content
-        print "content1: ", content1
-        print "content2: ", content2
-        print "expectedPaths: ", expectedPaths
-        print "expectedPaths1: ", expectedPaths1
-        print "expectedPaths2: ", expectedPaths2
-        content = [s.strip().lower() for s in content]
-        assert content == expectedPaths
-        assert content1 == expectedPaths1
-        assert content2 == expectedPaths2
-
-class CheckRootDirValueTest(unittest.TestCase):
-    
-    def test_checkRootDirValue(self):
-        """ Testing the root drive value. """
-        configDict = {'root.dir': root_test_dir,
-                'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
-                'archives.dir': root_test_dir,
-                'name': 'regular_path_test',
-                'include': 'dir1/*.txt',
-                'archive.tool': '7za'
-               }
-        configDictUnc = {'root.dir': "\\\\server\\share\\dir",
-                'temp.build.dir': os.path.join(root_test_dir, 'temp_build_files'),
-                'archives.dir': root_test_dir,
-                'name': 'unc_test',
-                'include': 'dir1/*.txt',
-                'archive.tool': '7za'
-               }
-        config = configuration.Configuration(configDict)
-        configUnc = configuration.Configuration(configDictUnc)
-        builder = MockedArchivePreBuilder(configuration.ConfigurationSet([config, configUnc]), "config", writerType='make', index=0)
-        builder.rewriteXMLFile(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/zip_checkDrive_test.cfg.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/zip_checkDrive_test.cfg.xml.parsed'))
-        (build_drive, path) = os.path.splitdrive(os.path.normpath(os.environ['TEMP']))
-        rootList = builder.checkRootDirValue(MockedConfigBuilder(), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/zip_checkDrive_test.cfg.xml.parsed'), build_drive, 'wvdo_sources')
-        assert rootList is not None
-        if sys.platform == 'win32':
-            roots = builder.getCommonUncRoots(['\\\\server\\share\\dir', 
-                                               '\\\\server\\share', 
-                                               '\\\\server\\share1\\dir',
-                                               '\\\\server2\\share\\somedir'])
-            assert len(roots) == 3
-            assert '\\\\server\\share\\' in roots
-            assert '\\\\server\\share1\\' in roots
-            assert '\\\\server2\\share\\' in roots
-
-class MockedConfigBuilder:
-
-    def writeToXML(self, xml_file, configs, parse_xml_file):
-        pass
-    
-
-class MockedArchivePreBuilder(archive.ArchivePreBuilder):
-    
-    def substUncPath(self, path):
-        if sys.platform != 'win32':
-            return None
-        return fileutils.get_next_free_drive()
-          
-    def unSubStituteDrives(self, drive):
-        pass
-    
-    def rewriteXMLFile(self, xml_file, parse_xml_file):
-        doc = xml.dom.minidom.parse(xml_file)
-        out = open(parse_xml_file, 'w')
-        doc.writexml(out, indent='')
-        out.close()
-            
-  
-
-
-#class ZipArchiverTest(unittest.TestCase):
-#    def setUp(self):
-#        archiveConfig = amara.parse(open('tests/data/zip_archive_test.cfg.xml', 'r'))
-#        self.archivePreBuilder = archive.ArchivePreBuilder(archiveConfig)
-#
-#    def testZipArchiverCommand(self):
-#        """Zip archiver creates correct command."""
-#        archiver = archive.ZipArchiver(self.archivePreBuilder)
-#        archiver._start_archive('foo')
-#        archiver.end_archive()
-#        commands = archiver.commandList.allCommands()
-#        assert len(commands) == 1
-#        command = commands[0]
-#        assert command.executable() == 'zip.exe'
-#        assert command.cmd() == '-R . c:\\temp\\foo.zip'
-#
-#    def testZipArchiverOperation(self):
-#        """Zip archiver runs zip operation correctly."""
-#        buildFilePath = self.archivePreBuilder.createArchiveBuildFile('zip_exec.ant.xml')
-#        result = run(r'ant -f c:\temp\output\temp_build_files\zip_exec.ant.xml all -Dnumber.of.threads=1')
-#        print result
-
-def run( command ):
-    #print "Run command: " + command
-    ( stdin, stdout ) = os.popen4( command )
-    result = stdout.read()
-    return result
-
-
-if __name__ == "__main__":
-    unittest.main()
--- a/buildframework/helium/tools/common/python/lib/test/test_ats3.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1630 +0,0 @@
-# -*- encoding: latin-1 -*-
-
-#============================================================================ 
-#Name        : test_ats3.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-""" Testing ATS3 framework. """
-# pylint: disable-msg=E1101,C0302,w0142,w0603,R0912,F0401,R0902,R0903,R0201,W0404
-#w0142 => * and ** were used
-#w0603 => global variables used TSRC_PATH etc
-#R*    => will be fixed while refactoring
-#F0401 => pylint didn't find "path" module
-#E1101 => Mocker shows mockery
-
-
-from cStringIO import StringIO
-from pprint import pprint
-from xml.etree.ElementTree import fromstring, tostring
-from xml.etree import ElementTree as et
-import difflib
-import logging
-logging.getLogger().setLevel(logging.ERROR)
-import tempfile
-import zipfile
-import os
-import subprocess
-
-from path import path
-import amara
-import mocker
-
-from ntpath import sep as atssep
-from ntpath import sep as sossep
-
-
-import ats3
-import ats3.testconfigurator as atc
-import ats3.dropgenerator as adg
-import ats3.parsers as parser
-
-
-TEST_PATH = None
-TEST_FILES = {}
-TSRC = None
-OUTPUT = None
-
-# Shortcuts
-E = et.Element
-SE = et.SubElement
-
-class Bunch(object):
-    """ Configuration object. Argument from constructor are converted into class attributes. """
-    def __init__(self, **kwargs):
-        self.__dict__.update(kwargs)
-        
-def equal_xml(xml1, xml2):
-    """Check the equality of the given XML snippets.
-    
-    Tag name equality:
-    
-    >>> equal_xml('<a/>', '<a/>')
-    True
-    >>> equal_xml('<a/>', '<b/>')
-    False
-    
-    Attribute equality:
-    
-    >>> equal_xml('<a k="v"/>', '<a k="v"/>')
-    True
-    >>> equal_xml('<a k="v"/>', '<a k="w"/>')
-    False
-    
-    Text content equality:
-    
-    >>> equal_xml('<a>v</a>', '<a>v</a>')
-    True
-    >>> equal_xml('<a>v</a>', '<a>w</a>')
-    False
-    >>> equal_xml('<a>v</a>', '<a></a>')
-    False
-    
-    Text content equality when whitespace differs:
-    >>> equal_xml('<a>v</a>', '<a>v </a>')
-    True
-
-    Equality of child elements:
-    
-    >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="v"/></b></a>')
-    True
-    >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="w"/></b></a>')
-    False
-    >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>w</b></a>')
-    False
-    >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>v </b></a>')
-    True
-    
-    """
-    def __init__():
-        check_instance(xml1, xml2)
-    
-    def check_instance(xml1, xml2):
-        """if xml1 and xml2 are instances, converts to strings"""
-        if isinstance(xml1, basestring):
-            xml1 = fromstring(xml1)
-        if isinstance(xml2, basestring):
-            xml2 = fromstring(xml2)
-        check_tags(xml1, xml2)
-
-    def check_tags(xml1, xml2):
-        """check xml tags and text equality"""
-        if xml1.tag != xml2.tag:
-            return False
-        if xml1.attrib != xml2.attrib:
-            return False
-        if xml1.text:
-            if not xml2.text:
-                return False
-        if xml2.text:
-            if not xml1.text:
-                return False
-
-        produce_xml_children(xml1, xml2)
-
-    def produce_xml_children(xml1, xml2):
-        """checks if xml children are of same length and are equal?"""
-        if xml1.text and xml2.text and xml1.text.strip() != xml2.text.strip():
-            return False
-        if xml1.tail is not None and xml2.tail is not None:
-            if xml1.tail.strip() != xml2.tail.strip():
-                return False
-        elif xml1.tail != xml2.tail:
-            return False
-        
-        children1 = list(xml1.getchildren())
-        children2 = list(xml2.getchildren())
-        if len(children1) != len(children2):
-            return False
-        for child1, child2 in zip(children1, children2):
-            return equal_xml(child1, child2)
-    return True        
-
-
-def setup_module():
-    """ Setup test environment. """
-    global TEST_PATH, TSRC, OUTPUT
-    TEST_PATH = path(tempfile.mkdtemp())
-    OUTPUT = TEST_PATH.joinpath(r"output")
-    component = TEST_PATH
-    component.joinpath("group").makedirs()
-    for path_parts in (("tsrc", "group", "bld.inf"),
-                       ("tsrc", "group", "test.pkg"),
-                       ("tsrc", "testmodules", "file1.dll"),
-                       ("tsrc", "testmodules", "file2.dll"),
-                       ("tsrc", "data", "file1"),
-                       ("tsrc", "data", "file2"),
-                       ("tsrc", "data", "file3"),
-                       ("tsrc", "data", "mmc", "file4"),
-                       ("tsrc", "data", "c", "file5"),
-                       ("tsrc", "conf", "file1.cfg"),
-                       ("tsrc", "conf", "file2.cfg"),
-                       ("tsrc", "init", "TestFramework.ini"),
-                       ("tsrc", "custom", "prepostaction.xml"),
-                       ("tsrc", "custom", "postpostaction.xml"),
-                       # These do not have to be under 'tsrc':
-                       ("tsrc", "output", "images", "file1.fpsx"),
-                       ("tsrc", "output", "images", "file2.fpsx"),
-                       ("tsrc", "sis", "file1.sisx"),
-                       ("tsrc", "sis", "file2.sisx"),
-                       ("tsrc", "sis", "file3.sisx"),
-                       ("tsrc", "trace_init", "trace_activation_1.xml")):
-        filepath = component.joinpath(*path_parts)
-        if not filepath.parent.exists():
-            filepath.parent.makedirs()
-        filepath.touch()
-        TEST_FILES.setdefault(path_parts[1], []).append(filepath)
-    TSRC = component.joinpath("tsrc")
-    filepath = OUTPUT.joinpath("pmd", "pmd_file.pmd")
-    if not filepath.parent.exists():
-        filepath.parent.makedirs()
-    filepath.touch()
-    TEST_FILES.setdefault("pmd_file", []).append(filepath)
-    tracing = component.joinpath("tsrc", "trace_init")
-    root = E('ConfigurationFile')
-    confs = E("Configurations")
-    trace_act = SE(confs, "TraceActivation")
-    conf = SE(trace_act, "Configuration")
-    conf.set('Name', 'MCU')
-    mcu = SE(conf, "MCU")
-    sett = SE(mcu, "settings")
-    SE(sett, "timestamp")
-    root.append(confs)
-    ettree = et.ElementTree(root)
-    doc = amara.parse(et.tostring(ettree.getroot()))
-    handle = open(tracing.joinpath("trace_activation_1.xml"), "w")
-    handle.write(doc.xml(indent="yes"))
-    handle.close()
-#    tracing.writestr("trace_activation_1.xml", doc.xml(indent=u"yes"))
-    group = component.joinpath("tsrc", "group")
-    group.joinpath("bld.inf").write_text(
-        r"""
-        PRJ_TESTMMPFILES
-        stif.mmp /* xyz.mmp */ abcd.mmp
-        /*xyz.mmp*/
-        eunit.mmp /* xyz.mmp */
-        both.mmp
-        ..\sub-component\group\sub-component.mmp
-        """.replace('\\', os.sep))
-
-    group.joinpath("test.pkg").write_text(
-        r"""
-        ;Language - standard language definitions
-        &EN
-        
-        ; standard SIS file header
-        #{"BTEngTestApp"},(0x04DA27D5),1,0,0
-        
-        ;Supports Series 60 v 3.0
-        (0x101F7961), 0, 0, 0, {"Series60ProductID"}
-        
-        ;Localized Vendor Name
-        %{"BTEngTestApp"}
-        
-        ;Unique Vendor name
-        :"Nokia"
-        
-        ; Files to copy
-        "\tsrc\testmodules\file1.dll"-"c:\sys\bin\file1.dll"
-        "\tsrc\testmodules\file2.dll"-"c:\sys\bin\file2.dll"
-        "\tsrc\data\file1"-"e:\sys\bin\file1"
-        "\tsrc\data\file2"-"e:\sys\bin\file2"
-        "\tsrc\data\file3"-"e:\sys\bin\file3"
-        "\tsrc\conf\file1.cfg"-"!:\sys\bin\file1.cfg"
-        "\tsrc\conf\file2.cfg"-"!:\sys\bin\file2.cfg"
-        "\tsrc\init\TestFramework.ini"-"!:\sys\bin\TestFramework.ini"
-        "\tsrc\sis\file1.sisx"-"!:\sys\bin\file1.sisx"
-        "\tsrc\sis\file2.sisx"-"!:\sys\bin\file2.sisx"
-        """.replace('\\', os.sep))
-    group.joinpath("stif.mmp").write_text("LIBRARY stiftestinterface.lib")
-    group.joinpath("eunit.mmp").write_text("LIBRARY eunit.lib")
-    group.joinpath("both.mmp").write_text("LIBRARY stiftestinterface.lib eunit.lib")
-    init = component.joinpath("tsrc", "init")
-    
-    init.joinpath("TestFramework.ini").write_text(
-        r"""
-#     - Sets a device reset module's dll name(Reboot).
-#        + If Nokia specific reset module is not available or it is not correct one
-#          StifHWResetStub module may use as a template for user specific reset
-#          module. 
-
-[Engine_Defaults]
-
-TestReportMode= FullReport        # Possible values are: 'Empty', 'Summary', 'Environment',
-                                                               'TestCases' or 'FullReport'
-
-CreateTestReport= YES            # Possible values: YES or NO
-
-TestReportFilePath= C:\LOGS\TestFramework\
-TestReportFileName= TestReport
-
-TestReportFormat= TXT            # Possible values: TXT or HTML
-        
-        """)
-
-
-def teardown_module():
-    """ Cleanup environment after testing. """    
-    def __init__():
-        path(TEST_PATH).rmtree()
-
-# CTC related functions    
-def check_ctc_write(steps):
-    """Checks if CTC data is written on the CTC log"""
-    step = steps.next()
-    assert step.get("name") == "Save CTC data"
-    assert step.findtext("./command") == "execute"
-    params = step.findall("./params/param")
-    assert params[0].get("parameters") == "writelocal"
-    assert params[1].get("file") == path(r"z:\sys\bin\ctcman.exe")
-    step = steps.next()
-    assert step.get("name") == "Save CTC data"
-    assert step.findtext("./command") == "execute"
-    params = step.findall("./params/param")
-    assert params[0].get("parameters") == "writefile"
-    assert params[1].get("file") == path(r"z:\sys\bin\ctcman.exe")
-
-def check_ctc_log(steps, testtype=""):
-    """Fetches CTC Log"""
-    #For the ctcdata.txt to be published on the ATS network drive
-    step = steps.next()
-    assert step.get("name") == "Fetch CTC data for post commands execution" #"Fetch and clean CTC data"
-    assert step.findtext("./command") == "fetch-log"
-    params = step.findall("./params/param")
-    assert params[0].get("delete") == "false"
-    if testtype == "withpkgfiles":
-        assert params[1].get("local-path") == r"\\10.0.0.1\ctc_helium\builds\drop0\set1\ctcdata"
-    else:
-        assert params[1].get("local-path") == r"\\10.0.0.1\ctc_helium\builds\drop0\set0\ctcdata"
-    assert params[2].get("path") == path(r"c:" + os.sep + "data" + os.sep + "ctc" + os.sep + "ctcdata.txt")
-    
-    #For the ctcdata.txt to be published on the build network drive
-    step = steps.next()
-    assert step.get("name") == "Fetch and clean CTC data" #"Fetch and clean CTC data"
-    assert step.findtext("./command") == "fetch-log"
-    params = step.findall("./params/param")
-    assert params[0].get("delete") == "true"
-    assert params[1].get("path") == path(r"c:" + os.sep + "data" + os.sep + "ctc" + os.sep + "ctcdata.txt")
-
-def check_ctc_start(steps):
-    """Checks if CTC starts in ATS"""
-    step = steps.next()
-    assert step.get("name") == "Create CTC log dir"
-    assert step.findtext("./command") == "makedir"
-    params = step.findall("./params/param")
-    assert params[0].get("dir") == path(r"c:" + os.sep + "data" + os.sep + "ctc")
-    step = steps.next()
-    assert step.get("name") == "CTC start"
-    assert step.findtext("./command") == "execute"
-    params = step.findall("./params/param")
-    assert params[0].get("file") == path(r"z:\sys\bin\ctcman.exe")   
-
-def check_fetch_logs(steps):
-    """Checks fetching log directory is created"""
-    step = steps.next()
-    if "Fetch test" in step.get("name"):
-        assert step.get("name") == "Fetch test module logs"
-        assert step.findtext("./command") == "fetch-log"
-        params = step.findall("./params/param")
-        assert params[0].get("type") == "text"
-        assert params[1].get("delete") == "true"
-        if step.get("harness") == "STIF":
-            assert params[2].get("path") == path(r"c:" + os.sep + "logs" + os.sep + "testframework" + os.sep + "*")
-        elif step.get("harness") == "EUNIT":
-            assert params[2].get("path") == path(r"c:" + os.sep + "Shared" + os.sep + "EUnit" + os.sep + "logs" + os.sep + "*")
-    else:
-        step = steps.next()
-        assert step.get("name") == "Fetch test module logs"
-        assert step.findtext("./command") == "fetch-log"
-        params = step.findall("./params/param")
-        assert params[0].get("type") == "text"
-        assert params[1].get("delete") == "true"
-        assert params[2].get("path") == path(r"c:" + os.sep + "logs" + os.sep + "testframework" + os.sep + "*")  
-
-def check_diamonds_action(action):
-    """ Testing Diamonds action. """
-    assert action.findtext("./type") == "DiamondsAction"
-    assert not action.findall("./params/param") 
-
-def check_send_email_action(action, reportemail):
-    """verifies if sening email option works"""
-    assert action.findtext("./type") == "SendEmailAction"
-    params = action.findall("./params/param")
-    assert params[0].get("name") == "subject"
-    assert params[0].get("value") == "email subject"
-    assert params[1].get("name") == "type"
-    assert params[1].get("value") == "ATS3_REPORT"
-    assert params[2].get("name") == "send-files"
-    assert params[2].get("value") == "true"
-    assert params[3].get("name") == "to"
-    assert params[3].get("value") == reportemail
-
-def check_ats_report_action(action, filestore):
-    """verifies if sening ATS report option works"""
-    assert action.findtext("./type") == "FileStoreAction"
-    params = action.findall("./params/param")
-    assert params[0].get("name") == "to-folder"
-    assert params[0].get("value") == filestore
-    assert params[1].get("name") == "report-type"
-    assert params[1].get("value") == "ATS_REPORT"
-    assert params[2].get("name") == "date-format"
-    assert params[2].get("value") == "yyyyMMdd"
-    assert params[3].get("name") == "time-format"
-    assert params[3].get("value") == "HHmmss"
-
-def check_stif_report_action(action, filestore):
-    """verifies if sening STIF report option works"""
-    assert action.findtext("./type") == "FileStoreAction"
-    params = action.findall("./params/param")
-    assert params[0].get("name") == "to-folder"
-    assert params[0].get("value") == filestore
-    assert params[1].get("name") == "report-type"
-    assert params[1].get("value") == "STIF_COMPONENT_REPORT_ALL_CASES"
-    assert params[2].get("name") == "run-log"
-    assert params[2].get("value") == "true"
-    assert params[3].get("name") == "date-format"
-    assert params[3].get("value") == "yyyyMMdd"
-    assert params[4].get("name") == "time-format"
-    assert params[4].get("value") == "HHmmss"
-
-def check_log_dir(steps):
-    """ Test the log dir. """
-    step = steps.next()
-    if step.get("harness") is "STIF":
-        assert step.get("name") == "Create STIF log dir"
-    elif step.get("harness") is "EUNIT":
-        assert step.get("name") == "Create EUNIT log dir"
-    assert step.findtext("./command") == "makedir"
-
-def check_trace_start(steps, filestore):
-    """Checks if tracing is started on the ATS"""
-    step = steps.next()
-    assert step.get("name") == "Start tracing"
-    assert step.findtext("./command") == "trace-start"
-    params = step.findall("./params/param")
-    assert params[0].get("ta") == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "trace_activation" + os.sep + "trace_activation_1.xml")
-    assert params[1].get("tgrp") == "MCU"
-    assert params[2].get("pmd") == path(r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd")
-    assert params[3].get("log") == filestore.joinpath("traces", "set0", "tracelog.blx")
-    assert params[4].get("timeout") == "60"
-    assert params[5].get("date-format") == "yyyyMMdd"
-    assert params[6].get("time-format") == "HHmmss"
-    
-def check_trace_end_steps(steps, filestore):
-    """ Test trace end step. """
-    step = steps.next()
-    assert step.get("name") == "Stop tracing"
-    assert step.findtext("./command") == "trace-stop"
-    params = step.findall("./params/param")
-    assert params[0].get("timeout") == "60"
-    step = steps.next()
-    assert step.get("name") == "Convert tracing"
-    assert step.findtext("./command") == "trace-convert"
-    params = step.findall("./params/param")
-    assert params[0].get("pmd") == path(r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd")
-    assert params[1].get("log") == filestore.joinpath("traces", "set0", "tracelog.blx")
-    assert params[2].get("timeout") == "60"
-    assert params[3].get("date-format") == "yyyyMMdd"
-    assert params[4].get("time-format") == "HHmmss"
-
-class TestTestPlan(mocker.MockerTestCase):
-    """Creates TestPlan mocker setup"""
-    def __init__(self, methodName="runTest"):
-        mocker.MockerTestCase.__init__(self, methodName)  
-          
-    def setUp(self):
-        """ Setup TestTestPlan testsuite. """
-        opts = Bunch(testrun_name="testrun", harness="STIF", 
-                     device_type="product", plan_name="ats3_test_plan",
-                     diamonds_build_url="", report_email="", file_store=path(), test_timeout="60",
-                     device_hwid="5425", trace_enabled="True", ctc_enabled="True", eunitexerunner_flags="/E S60AppEnv /R Off", 
-                     multiset_enabled=False, ats_network_drive=r"10.0.0.1#x:\ats\drop0.zip", monsym_files="")
-        self.atp = ats3.Ats3TestPlan(opts)
-        self.config_files = TEST_FILES["conf"]
-        self.data_files = TEST_FILES["data"]
-        self.engine_ini_file = TEST_FILES["init"][0]
-        self.image_files = TEST_FILES["output"]
-        self.sis_files = TEST_FILES["sis"]
-        self.testmodule_files = TEST_FILES["testmodules"]
-        self.ctc_enabled = self.atp["ctc_enabled"]
-        self.custom_dir = "CustomD"
-        self.eunitexerunner_flags = self.atp["eunitexerunner_flags"]
-        if self.atp["trace_enabled"].lower() == "true":
-            self.trace_activation_files = TEST_FILES["trace_init"]    
-            self.pmd_files = TEST_FILES["pmd_file"]
-        else:
-            self.trace_activation_files = []    
-            self.pmd_files = []
-        self.test_timeout = self.atp["test_timeout"]
-        self.eunitexerunner_flags = self.atp["eunitexerunner_flags"]
-        self.device_hwid = self.atp["device_hwid"]
-        self.test_harness = self.atp["harness"]
-        self.src_dst = [("" + os.sep + "tsrc" + os.sep + "testmodules" + os.sep + "file1.dll", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll", "testmodule"),
-            ("" + os.sep + "tsrc" + os.sep + "testmodules" + os.sep + "file2.dll", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll", "testmodule"),
-            ("" + os.sep + "tsrc" + os.sep + "data" + os.sep + "file1", "e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1", "data"),
-            ("" + os.sep + "tsrc" + os.sep + "data" + os.sep + "file2", "e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2", "data"),
-            ("" + os.sep + "tsrc" + os.sep + "data" + os.sep + "file3", "e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3", "data"),
-            ("" + os.sep + "tsrc" + os.sep + "conf" + os.sep + "file1.cfg", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg", "conf"),
-            ("" + os.sep + "tsrc" + os.sep + "conf" + os.sep + "file2.cfg", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg", "conf"),
-            ("" + os.sep + "tsrc" + os.sep + "init" + os.sep + "TestFramework.ini", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini", "engine_ini"),
-            ("" + os.sep + "tsrc" + os.sep + "sis" + os.sep + "file1.sisx", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.sisx", ""),
-            ("" + os.sep + "tsrc" + os.sep + "sis" + os.sep + "file2.sisx", "c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.sisx", ""),]
-        self.component_path = str(TEST_PATH.joinpath("tsrc", "group"))
-
-    def test_creation(self):
-        """ Testing creation. """        
-        assert self.atp["testrun_name"] == "testrun"
-        assert self.atp["harness"] == "STIF"
-        assert self.atp["device_type"] == "product"
-    
-    def test_insert_set(self):
-        """ Inserting a set of file. """        
-        self.atp.insert_set(data_files=self.data_files,
-                           config_files=self.config_files,
-                           engine_ini_file=self.engine_ini_file,
-                           image_files=self.image_files,
-                           testmodule_files=self.testmodule_files,
-                           test_timeout=self.test_timeout,
-                           eunitexerunner_flags=self.eunitexerunner_flags,
-                           pmd_files=self.pmd_files,                            
-                           trace_activation_files=self.trace_activation_files,
-                           component_path=self.component_path)
-        self.atp.insert_set(image_files=self.image_files,                           
-                           engine_ini_file=self.engine_ini_file,
-                           sis_files=self.sis_files,
-                           test_timeout=self.test_timeout,
-                           eunitexerunner_flags=self.eunitexerunner_flags,
-                           pmd_files=self.pmd_files,                            
-                           trace_activation_files=self.trace_activation_files,
-                           component_path=self.component_path)
-        self.atp.insert_set(data_files=self.data_files,
-                           config_files=self.config_files,
-                           engine_ini_file=self.engine_ini_file,
-                           image_files=self.image_files,
-                           testmodule_files=self.testmodule_files,
-                           test_timeout=self.test_timeout,
-                           eunitexerunner_flags=self.eunitexerunner_flags,
-                           src_dst=self.src_dst,
-                           pmd_files=self.pmd_files,                            
-                           trace_activation_files=self.trace_activation_files,
-                           component_path=self.component_path)
-        self.atp.insert_set(engine_ini_file=self.engine_ini_file,
-                           test_timeout=self.test_timeout,
-                           eunitexerunner_flags=self.eunitexerunner_flags,
-                           image_files=self.image_files,
-                           test_harness=self.test_harness,
-                           src_dst=self.src_dst,
-                           pmd_files=self.pmd_files,                            
-                           trace_activation_files=self.trace_activation_files,
-                           component_path=self.component_path)
-        self.atp.insert_set(test_timeout=self.test_timeout,      
-                           eunitexerunner_flags=self.eunitexerunner_flags,               
-                           image_files=self.image_files,                        
-                           test_harness=self.test_harness,                      
-                           src_dst=self.src_dst,                                
-                           pmd_files=self.pmd_files,                            
-                           trace_activation_files=self.trace_activation_files,
-                           component_path=self.component_path)  
-
-        assert self.atp.sets[0] == dict(name="set0",
-                                       data_files=self.data_files,
-                                       config_files=self.config_files,
-                                       engine_ini_file=self.engine_ini_file,
-                                       image_files=self.image_files,
-                                       testmodule_files=self.testmodule_files,
-                                       test_timeout=self.test_timeout,
-                                       eunitexerunner_flags=self.eunitexerunner_flags,
-                                       test_harness=self.test_harness,
-                                       src_dst=[],
-                                       pmd_files=self.pmd_files,
-                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set0", "tracelog.blx"),
-                                       trace_activation_files=self.trace_activation_files,
-                                       ctc_enabled=self.atp["ctc_enabled"],
-                                       custom_dir=None,
-                                       component_path=self.component_path)
-        assert self.atp.sets[1] == dict(name="set1",
-                                       image_files=self.image_files,
-                                       engine_ini_file=self.engine_ini_file,
-                                       sis_files=self.sis_files,
-                                       test_timeout=self.test_timeout,
-                                       eunitexerunner_flags=self.eunitexerunner_flags,
-                                       test_harness=self.test_harness,
-                                       pmd_files=self.pmd_files,
-                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set1", "tracelog.blx"),
-                                       trace_activation_files=self.trace_activation_files,
-                                       ctc_enabled=self.atp["ctc_enabled"],
-                                       custom_dir=None,
-                                       component_path=self.component_path)
-
-        assert self.atp.sets[2] == dict(name="set2",
-                                       data_files=self.data_files,
-                                       config_files=self.config_files,
-                                       engine_ini_file=self.engine_ini_file,
-                                       image_files=self.image_files,
-                                       testmodule_files=self.testmodule_files,
-                                       test_timeout=self.test_timeout,
-                                       eunitexerunner_flags=self.eunitexerunner_flags,
-                                       test_harness=self.test_harness,
-                                       src_dst=self.src_dst,
-                                       pmd_files=self.pmd_files,
-                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set2", "tracelog.blx"),
-                                       trace_activation_files=self.trace_activation_files,
-                                       ctc_enabled=self.atp["ctc_enabled"],
-                                       custom_dir=None,
-                                       component_path=self.component_path)
-        assert self.atp.sets[3] == dict(name="set3",
-                                       data_files=[],
-                                       config_files=[],
-                                       engine_ini_file=self.engine_ini_file,
-                                       image_files=self.image_files,
-                                       testmodule_files=[],
-                                       test_timeout=self.test_timeout,
-                                       eunitexerunner_flags=self.eunitexerunner_flags,
-                                       test_harness=self.test_harness,
-                                       src_dst=self.src_dst,
-                                       pmd_files=self.pmd_files,
-                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set3", "tracelog.blx"),
-                                       trace_activation_files=self.trace_activation_files,
-                                       ctc_enabled=self.atp["ctc_enabled"],
-                                       custom_dir=None,
-                                       component_path=self.component_path)
-
-        assert self.atp.sets[4] == dict(name="set4",
-                                       data_files=[],
-                                       config_files=[],
-                                       engine_ini_file=None,
-                                       image_files=self.image_files,
-                                       testmodule_files=[],
-                                       test_timeout=self.test_timeout,
-                                       eunitexerunner_flags=self.eunitexerunner_flags,
-                                       test_harness=self.test_harness,
-                                       src_dst=self.src_dst,
-                                       pmd_files=self.pmd_files,
-                                       trace_path=self.atp.file_store.joinpath(u"§RUN_NAME§" + os.sep + u"§RUN_START_DATE§_§RUN_START_TIME§", "traces", "set4", "tracelog.blx"),
-                                       trace_activation_files=self.trace_activation_files,
-                                       ctc_enabled=self.atp["ctc_enabled"],
-                                       custom_dir=None,
-                                       component_path=self.component_path)
-        
-    def test_post_actions_email(self):
-        """ Testing the send email post-action. """        
-        assert not self.atp.post_actions
-        receiver = "joe.average@example.com"
-        self.atp.report_email = receiver
-        assert len(self.atp.post_actions) == 1
-        action, items = self.atp.post_actions[0]
-        items = dict(items)
-        assert action == "SendEmailAction"
-        assert items["to"] == receiver
-    
-    def test_post_actions_ats3_report_only(self):
-        """ Testing the ats3 report only post-action. """        
-        file_store = path("path/to/files")
-        self.atp.file_store = file_store
-        self.atp.harness = "EUNIT"
-        assert len(self.atp.post_actions) == 2
-        action, items = self.atp.post_actions[0]
-        items = dict(items)
-        assert action == "FileStoreAction"
-        assert items["report-type"] == "ATS3_REPORT"
-        assert items["to-folder"].startswith(file_store)
-        assert items["to-folder"].endswith("ATS3_REPORT")
-    
-    def test_post_actions_stif(self):
-        """ Testing STIF post-actions. """        
-        file_store = path("path/to/files")
-        self.atp.file_store = file_store
-        assert len(self.atp.post_actions) == 2
-        action, items = self.atp.post_actions[1]
-        items = dict(items)
-        assert action == "FileStoreAction"
-        assert items["report-type"] == "STIF_COMPONENT_REPORT_ALL_CASES"
-        assert items["to-folder"].startswith(file_store)
-        assert items["to-folder"].endswith("STIF_REPORT")
-        
-    def test_post_actions_diamonds(self):
-        """ Testing Diamonds post-actions. """        
-        self.atp.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
-        assert len(self.atp.post_actions) == 1
-        action, items = self.atp.post_actions[0]
-        assert action == "DiamondsAction"
-        assert not items
-
-
-class TestComponentParser(mocker.MockerTestCase):
-    """ Testing the Ats3ComponentParser component parser. """
-    
-    def __init__(self, methodName="runTest"):
-        mocker.MockerTestCase.__init__(self, methodName)
-    
-    def assert_paths(self, path1, path2):
-        """ Checking the path. Validates that path1 and path2 are instance of path and they are equals. """
-        if not isinstance(path1, path):
-            path1 = path(path1)
-        if not isinstance(path2, path):
-            path2 = path(path2)            
-        return self.assertEqual(path1.normpath(), path2.normpath())
-    
-    def setUp(self):
-        """ Setting up TestComponentParser testsuite."""
-        opts = Bunch(build_drive=path(TEST_PATH+os.sep), target_platform="target platform", eunitexerunner_flags="/E S60AppEnv /R Off",
-                     data_dir=["data"], flash_images=[], sis_files=[], test_timeout="60", harness="STIF", trace_enabled="True")
-        self.acp = atc.Ats3ComponentParser(opts)
-        self.acp.tsrc_dir = TSRC
-      
-    def test_detect_dlls(self):
-        """ Testing dlls detection. """
-        # Setup mock objects.
-        process = self.mocker.mock()
-        process.communicate()
-        self.mocker.result(["lib1.dll\npath/to/another/library.dll\nsome/other/file.txt\nlib2.dll\nlib3.dll\n"])
-        obj = self.mocker.replace("subprocess.Popen")
-        obj("abld -w test build target platform", shell=True, stdout=subprocess.PIPE)
-        self.mocker.result(process)
-        
-        exists = self.mocker.replace("os.path.exists")
-        exists()
-        self.mocker.result(True)
-        exists()
-        self.mocker.result(True)
-        exists()
-        self.mocker.result(True)
-        exists()
-        self.mocker.result(False)
-        
-        self.mocker.replay()
-        
-        self.assertEqual([u"lib1.dll", u"library.dll", u"lib2.dll"],
-                         [dll.name for dll in self.acp.tsrc_dll_files()])
-
-    def test_harness(self):
-        """ Detect test harness."""
-        mmp_parser = parser.MmpFileParser()
-        group = TSRC.joinpath("group")
-        for harness, mmp in [
-            ("STIF", group / "stif.mmp"),
-            ("EUNIT", group / "eunit.mmp"),
-            ("STIF", group / "both.mmp"),
-            ]:
-            self.assertEqual(harness, mmp_parser.get_harness(mmp))
-
-class TestXMLGeneration(mocker.MockerTestCase):
-    """
-    Unit tests for the test.xml generation.
-    """
-    def __init__(self, methodName="runTest"):
-        mocker.MockerTestCase.__init__(self, methodName)
-        self.data_files = None
-        self.config_files = None
-        self.testmodule_files = None
-        self.image_files = None
-        self.engine_ini_file = None
-        self.report_email = None
-        self.file_store = None
-        self.diamonds_build_url = None
-        self.test_harness = None     
-        self.src_dst = []
-        self.trace_enabled = None
-        self.pmd_files = None
-        self.trace_activation_files = None
-        self.ctc_enabled = None
-        self.eunitexerunner_flags = None
-        self.test_plan = None
-        self.gen = None
-        self.custom_dir = None
-            
-    def generate_xml(self, trace_enabled="False"):
-        """ Generating the XML. """
-        def files(*paths):
-            """creating tsrc path list"""
-            return [TEST_PATH.joinpath("tsrc", tpath) for tpath in paths]
-        self.testmodule_files = files("testmodules/file1.dll", "testmodules/file2.dll")
-        self.data_files = files("data/file1", "data/file2", "data/file3")
-        self.config_files = files("conf/file1.cfg", "conf/file2.cfg")
-        self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
-        self.engine_ini_file = files("init/TestFramework.ini")[0]
-        self.report_email = "test.receiver@company.com"
-        self.file_store = path(r"path/to/reports")
-        self.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
-        self.test_harness = "STIF"        
-        self.src_dst = []
-        self.trace_enabled = trace_enabled
-        self.pmd_files = TEST_FILES["pmd_file"]
-        self.trace_activation_files = files("trace_init/trace_activation_1.xml")
-        self.ctc_enabled = "True"
-        self.eunitexerunner_flags = "/E S60AppEnv /R Off"
-        self.custom_dir = "CustomB"
-        self.component_path = str(TEST_PATH.joinpath("tsrc", "group"))
-        self.ats_network_drive = r"10.0.0.1#x:\ats\drop0.zip"
-
-        self.mocker.restore()
-        test_plan = self.mocker.mock(count=False)
-        mocker.expect(test_plan["testrun_name"]).result("test")
-        mocker.expect(test_plan["harness"]).result("STIF")
-        mocker.expect(test_plan["device_type"]).result("product")
-        mocker.expect(test_plan["plan_name"]).result("test plan")
-        mocker.expect(test_plan["diamonds_build_url"]).result(self.diamonds_build_url)
-        mocker.expect(test_plan["test_timeout"]).result("60")
-        mocker.expect(test_plan["eunitexerunner_flags"]).result("/E S60AppEnv /R Off")
-        mocker.expect(test_plan["device_hwid"]).result("5425")
-        mocker.expect(test_plan["custom_dir"]).result("custom")
-        mocker.expect(test_plan.custom_dir).result(path(r"self.custom_dir"))
-        
-        mocker.expect(test_plan["ats_network_drive"]).result(self.ats_network_drive)
-                
-        if self.trace_enabled.lower() == "true":
-            mocker.expect(test_plan["trace_enabled"]).result("True")
-        else:
-            mocker.expect(test_plan["trace_enabled"]).result("False")
-        if self.trace_enabled == "False":
-            mocker.expect(test_plan.sets).result([
-                dict(name="set0", image_files=self.image_files, data_files=self.data_files,
-                     config_files=self.config_files, testmodule_files=self.testmodule_files,
-                     engine_ini_file=self.engine_ini_file, test_harness="STIF", src_dst=self.src_dst,
-                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
-                     custom_dir=self.custom_dir, component_path=self.component_path),
-                dict(name="set1", image_files=self.image_files, data_files=self.data_files,
-                     config_files=self.config_files, testmodule_files=self.testmodule_files,
-                     engine_ini_file=self.engine_ini_file,test_harness="STIF", src_dst=self.src_dst,
-                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
-                     custom_dir=self.custom_dir, component_path=self.component_path),
-            ])
-        elif self.trace_enabled == "True":
-            mocker.expect(test_plan.sets).result([
-                dict(name="set0", image_files=self.image_files, data_files=self.data_files,
-                     config_files=self.config_files, testmodule_files=self.testmodule_files,
-                     engine_ini_file=self.engine_ini_file, test_harness="STIF", src_dst=self.src_dst,
-                     pmd_files=self.pmd_files, trace_activation_files=self.trace_activation_files,
-                     trace_path=self.file_store.joinpath("traces", "set0", "tracelog.blx"),
-                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags, component_path=self.component_path),
-                dict(name="set1", image_files=self.image_files, data_files=self.data_files,
-                     config_files=self.config_files, testmodule_files=self.testmodule_files,
-                     engine_ini_file=self.engine_ini_file,test_harness="STIF", src_dst=self.src_dst,
-                     pmd_files=self.pmd_files, trace_activation_files=self.trace_activation_files,
-                     trace_path=self.file_store.joinpath("traces", "set1", "tracelog.blx"),
-                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags, component_path=self.component_path),
-            ])
-        mocker.expect(test_plan.post_actions).result([
-            ("SendEmailAction", (("subject", "email subject"),
-                                 ("type", "ATS3_REPORT"),
-                                 ("send-files", "true"),
-                                 ("to", self.report_email))),
-            ("FileStoreAction", (("to-folder", self.file_store),
-                                 ("report-type", "ATS_REPORT"),
-                                 ("date-format", "yyyyMMdd"),
-                                 ("time-format", "HHmmss"))),
-            ("FileStoreAction", (("to-folder", self.file_store),
-                                 ("report-type", "STIF_COMPONENT_REPORT_ALL_CASES"),
-                                 ("run-log", "true"),
-                                 ("date-format", "yyyyMMdd"),
-                                 ("time-format", "HHmmss"))),
-            ("DiamondsAction", ())
-        ])
-        
-        self.mocker.replay()
-        self.test_plan = test_plan
-        
-        self.gen = adg.Ats3TestDropGenerator()
-        return self.gen.generate_xml(test_plan)
-
-    def test_basic_structure(self):
-        """ Check that the overall test.xml structure is valid. """
-        xml = self.generate_xml()
-        # Check basics.
-        assert xml.find(".").tag == "test"
-        assert xml.find("./name").text == "test"
-        assert xml.find("./buildid").text == self.diamonds_build_url
-        assert xml.find("./target").tag
-        assert xml.find("./target/device").tag
-        harness, type_, device_hwid = xml.findall("./target/device/property")
-        assert harness.get("value") == "STIF"
-        assert type_.get("value") == "product"
-        assert device_hwid.get("value") == "5425"
-        
-        # Check generation of the test plan.
-        assert xml.find("./plan").get("name") == "test Plan"
-        assert xml.find("./plan/session").tag 
-        sets = xml.findall("./plan/session/set")
-        assert len(sets) == 2
-        assert sets[0].get("name") == "set0-"+str(TEST_PATH.joinpath("tsrc", "group"))
-        assert sets[0].find("./target/device").tag
-    
-    def test_set_structure(self):
-        """ Check that a <set> element's structure is valid. """
-        xml = self.generate_xml()
-        tstset = xml.find("./plan/session/set")
-        assert tstset.tag
-        case = tstset.find("./case")
-        assert case.tag
-        assert case.get("name") == "set0 case"
-        
-    def test_case_flash_elems(self):
-        """ Test case flash elems. """
-        xml = self.generate_xml()
-        case = xml.find("./plan/session/set/case")
-        flashes = case.findall("./flash")
-        assert len(flashes) == len(self.image_files)
-        for i, flash_file in enumerate(self.image_files):
-            assert flashes[i].get("target-alias") == "DEFAULT_STIF"
-            assert flashes[i].get("images") == path(r"ATS3Drop" + os.sep + "images") / flash_file.name
-        
-    def test_case_steps(self):
-        """ Test case steps. """
-        xml = self.generate_xml()
-        steps = iter(xml.findall("./plan/session/set/case/step"))
-        check_ctc_start(steps)
-        check_log_dir(steps)
-        self.check_install_data(steps)
-        self.check_install_configuration(steps)
-        self.check_install_tmodules(steps)
-        self.check_install_engine_ini(steps)
-        self.check_run_cases(steps)
-        check_ctc_write(steps)
-        check_ctc_log(steps)
-        check_fetch_logs(steps)
-
-    def check_install_data(self, steps):
-        """ Test install data. """
-        for filename in self.data_files:
-            step = steps.next()
-            assert step.get("name") == "Install data: %s" % filename.name
-            assert step.findtext("./command") == "install"
-            params = step.findall("./params/param")            
-            src = params[0].get("src")
-            assert src.name == filename.name
-            assert src.parent == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "data")            
-            dst = params[1].get("dst")
-            assert dst.name == filename.name
-            assert dst.parent == path(r"e:\testing\data")
-    
-    def check_install_configuration(self, steps):
-        """ Test install configuration. """
-        for filepath in self.config_files:
-            step = steps.next()
-            assert step.get("name") == "Install conf: %s" % filepath.name
-            assert step.findtext("./command") == "install"
-            params = step.findall("./params/param")
-            assert params[0].get("src") == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "conf") / filepath.name
-            assert params[1].get("dst") == path(r"e:\testing\conf") / filepath.name
-
-    def check_install_tmodules(self, steps):
-        """ Test install tmodules. """
-        for filepath in self.testmodule_files:
-            step = steps.next()
-            assert step.get("name") == "Install testmodule: %s" % filepath.name
-            assert step.findtext("./command") == "install"
-            params = step.findall("./params/param")
-            assert params[0].get("src") == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules") / filepath.name
-            assert params[1].get("dst") == path(r"c:\sys\bin") / filepath.name            
-    
-    def check_install_engine_ini(self, steps):
-        """ Test install engine ini. """
-        filepath = self.engine_ini_file
-        step = steps.next()
-        assert step.get("name") == "Install engine_ini: %s" % filepath.name
-        assert step.findtext("./command") == "install"
-        params = step.findall("./params/param")
-        assert params[0].get("src") == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "init") / filepath.name
-        assert params[1].get("dst") == path(r"c:" + os.sep + "testframework") / filepath.name
-    
-    def check_run_cases(self, steps):
-        """ Test run cases. """
-        step = steps.next()
-        filepath = self.engine_ini_file
-        assert step.get("name") == "Execute test: %s" % filepath.name
-        assert step.findtext("./command") == "run-cases"
-        params = step.findall("./params/param")
-        assert params[0].get("filter") == "*"
-        assert params[1].get("timeout") == "60"
-        assert params[2].get("engineini") == path(r"c:" + os.sep + "testframework") / self.engine_ini_file.name
-
-    def test_steps_trace_enabled(self):
-        """ Test steps trace enabled. """
-        xml = self.generate_xml(trace_enabled="True")
-        steps = iter(xml.findall("./plan/session/set/case/step"))
-        check_ctc_start(steps)
-        check_log_dir(steps)
-        self.check_install_data(steps)
-        self.check_install_configuration(steps)
-        self.check_install_tmodules(steps)
-        self.check_install_engine_ini(steps)
-        check_trace_start(steps, self.file_store)
-        self.check_run_cases(steps)
-        check_trace_end_steps(steps, self.file_store)
-        check_ctc_write(steps)
-        check_ctc_log(steps)
-        check_fetch_logs(steps) 
-    
-    def test_post_actions(self):
-        """ Post actions are inserted into XML. """
-        xml = self.generate_xml()        
-        post_actions = xml.findall("./postAction")
-        check_send_email_action(post_actions[0], self.report_email)
-        check_ats_report_action(post_actions[1], self.file_store)
-        check_stif_report_action(post_actions[2], self.file_store)
-        check_diamonds_action(post_actions[3])
-    
-    def test_files(self):
-        """ Testing files. """
-        xml = self.generate_xml()
-        files = iter(xml.findall("./files/file"))
-        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx"
-        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file1"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file2"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file3"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file1.cfg"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file2.cfg"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file1.dll"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file2.dll"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "init" + os.sep + "TestFramework.ini"        
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file1"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file2"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file3"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file1.cfg"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file2.cfg"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file1.dll"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file2.dll"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "init" + os.sep + "TestFramework.ini"        
-        self.assertRaises(StopIteration, files.next)
-        xml = self.generate_xml(trace_enabled="True")
-        files = iter(xml.findall("./files/file"))
-        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx"
-        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx"
-        assert files.next().text == r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file1"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file2"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file3"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file1.cfg"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file2.cfg"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file1.dll"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file2.dll"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "init" + os.sep + "TestFramework.ini"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file1"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file2"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file3"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file1.cfg"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file2.cfg"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file1.dll"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file2.dll"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "init" + os.sep + "TestFramework.ini"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml"        
-        self.assertRaises(StopIteration, files.next)
-        
-    def test_generate_drop(self):
-        """ Manifest for ATS3Drop directory structure is generated. """
-        xml = self.generate_xml()
-        strbuffer = StringIO()
-        
-        self.gen.generate_drop(self.test_plan, xml, strbuffer)
-        zfile = zipfile.ZipFile(strbuffer, "r")
-        try:
-            contents = sorted(path(tpath).normpath() for tpath in zfile.namelist())
-            expected = sorted(path(tpath).normpath()
-                           for tpath in [r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file1.cfg",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file2.cfg",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file1",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file2",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file3",
-                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
-                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "init" + os.sep + "TestFramework.ini",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file1.dll",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file2.dll",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file1.cfg",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file2.cfg",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file1",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file2",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file3",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "init" + os.sep + "TestFramework.ini",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file1.dll",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file2.dll",
-                                     r"test.xml"])
-            diff = difflib.context_diff(expected, contents)
-            assert contents == expected, "\n".join(diff)
-        finally:
-            zfile.close()
-
-    def test_generate_drop_trace (self):
-        "Manifest for ATS3Drop directory structure is generated when trace enabled."
-        xml = self.generate_xml(trace_enabled="True")
-        strbuffer = StringIO()
-        
-        self.gen.generate_drop(self.test_plan, xml, strbuffer)
-        zfile = zipfile.ZipFile(strbuffer, "r")
-        try:
-            contents = sorted(path(tpath).normpath() for tpath in zfile.namelist())
-            expected = sorted(path(tpath).normpath()
-                           for tpath in [r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file1.cfg",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "conf" + os.sep + "file2.cfg",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file1",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file2",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "data" + os.sep + "file3",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml",
-                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
-                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "init" + os.sep + "TestFramework.ini",
-                                     r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file1.dll",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "testmodules" + os.sep + "file2.dll",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file1.cfg",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "conf" + os.sep + "file2.cfg",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file1",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file2",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "data" + os.sep + "file3",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "init" + os.sep + "TestFramework.ini",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file1.dll",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "testmodules" + os.sep + "file2.dll",
-                                     r"test.xml"])
-            diff = difflib.context_diff(expected, contents)
-            assert contents == expected, "\n".join(diff)
-        finally:
-            zfile.close()
-
-
-class TestXMLGenerationWithPKG(mocker.MockerTestCase):
-    """
-    Unit tests for the test.xml generation.
-    """
-    def __init__(self, methodName="runTest"):
-        mocker.MockerTestCase.__init__(self, methodName)
-        self.src_dst1 = []
-        self.data_files = None
-        self.config_files = None
-        self.testmodule_files = None
-        self.image_files = None
-        self.engine_ini_file = None
-        self.report_email = None
-        self.file_store = None
-        self.diamonds_build_url = None
-        self.trace_enabled = None
-        self.pmd_files = None
-        self.trace_activation_files = None
-        self.ctc_enabled = None
-        self.eunitexerunner_flags = None
-        self.test_plan = None
-        self.gen = None
-        self.src_dst0 = []
-        self.custom_dir = None
-        
-    def generate_xml(self, harness, trace_enabled="False"):
-        """Generates XML"""
-        def files(*paths):
-            """generates paths for the files"""
-            return [TEST_PATH.joinpath("tsrc", tpath) for tpath in paths]
-        self.src_dst1 = []
-        self.data_files = files("data/file1", "data/file2", "data/file3")
-        self.config_files = files("conf/file1.cfg", "conf/file2.cfg")
-        self.testmodule_files = files("testmodules/file1.dll", "testmodules/file2.dll")
-        self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
-        self.engine_ini_file = files("init/TestFramework.ini")[0]
-        self.report_email = "test.receiver@company.com"
-        self.file_store = path("path/to/reports")
-        self.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
-        self.trace_enabled = trace_enabled
-        self.pmd_files = TEST_FILES["pmd_file"]
-        self.trace_activation_files = files("trace_init/trace_activation_1.xml")
-        self.ctc_enabled = "True"
-        self.eunitexerunner_flags = "/E S60AppEnv /R Off"
-        self.custom_dir = "custom"
-        self.custom_files = files("custom/postpostaction.xml", "custom/prepostaction.xml")
-        self.component_path = str(TEST_PATH.joinpath("tsrc", "group"))
-        self.ats_network_drive = r"10.0.0.1#x:\ats\drop0.zip"
-        
-        
-        self.src_dst0 = [
-            (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file1.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"), "testmodule"),
-            (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file2.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"), "testmodule"),
-            (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file1"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"), "data"),
-            (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file2"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"), "data"),
-            (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file3"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"), "data"),
-            ]
-        if harness == "STIF" or harness == "MULTI_HARNESS":
-            harness0 = harness1 = "STIF"
-            if "MULTI_HARNESS" in harness:
-                harness1 = "EUNIT"
-                self.src_dst1 = [
-                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file1.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"), "testmodule"),
-                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file2.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"), "testmodule"),
-                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file1"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"), "data"),
-                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file2"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"), "data"),
-                    (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file3"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"), "data"),
-                    ] 
-            self.src_dst0 = [
-                (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file1.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"), "testmodule"),
-                (TEST_PATH.joinpath(r"tsrc" + os.sep + "testmodules" + os.sep + "file2.dll"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"), "testmodule"),
-                (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file1"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"), "data"),
-                (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file2"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"), "data"),
-                (TEST_PATH.joinpath(r"tsrc" + os.sep + "data" + os.sep + "file3"), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"), "data"),
-                (TEST_PATH.joinpath(r"tsrc" + os.sep + "conf" + os.sep + "file1.cfg"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg"), "conf"),
-                (TEST_PATH.joinpath(r"tsrc" + os.sep + "conf" + os.sep + "file2.cfg"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg"), "conf"),
-                (TEST_PATH.joinpath(r"tsrc" + os.sep + "init" + os.sep + "TestFramework.ini"), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini"), "engine_ini"),
-                ]
-            if "STIF" in harness:
-                self.src_dst1 = self.src_dst0
-            
-        elif harness == "EUNIT":
-            harness0 = harness1 = harness
-            self.src_dst1 = self.src_dst0
-            
-        self.mocker.restore()
-        test_plan = self.mocker.mock(count=False)
-        mocker.expect(test_plan["testrun_name"]).result("test")
-        mocker.expect(test_plan["harness"]).result(harness)
-        mocker.expect(test_plan["device_type"]).result("product")
-        mocker.expect(test_plan["plan_name"]).result("test plan")
-        mocker.expect(test_plan["diamonds_build_url"]).result(self.diamonds_build_url)
-        mocker.expect(test_plan["test_timeout"]).result("60")
-        mocker.expect(test_plan["eunitexerunner_flags"]).result("/E S60AppEnv /R Off")
-        mocker.expect(test_plan["eunitexerunner?flags"]).result(self.eunitexerunner_flags)
-        mocker.expect(test_plan["device_hwid"]).result("5425")
-        mocker.expect(test_plan["trace_enabled"]).result(self.trace_enabled)
-        mocker.expect(test_plan["ctc_enabled"]).result(self.ctc_enabled)
-        mocker.expect(test_plan["custom_dir"]).result("custom1A")
-        mocker.expect(test_plan.custom_dir).result(path(r"self.custom_dir"))
-        mocker.expect(test_plan["ats_network_drive"]).result(self.ats_network_drive)
-        if self.trace_enabled == "False":
-            mocker.expect(test_plan.sets).result([
-                dict(name="set0", image_files=self.image_files, data_files=self.data_files,
-                     config_files=self.config_files, testmodule_files=self.testmodule_files,
-                     engine_ini_file=self.engine_ini_file, test_harness=harness0,src_dst=self.src_dst0,
-                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
-                     custom_dir = self.custom_dir, component_path=self.component_path),
-                dict(name="set1", image_files=self.image_files, data_files=self.data_files,
-                     config_files=self.config_files, testmodule_files=self.testmodule_files,
-                     engine_ini_file=self.engine_ini_file, test_harness=harness1, src_dst=self.src_dst1,
-                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
-                     custom_dir = self.custom_dir, component_path=self.component_path),
-            ])
-        else:
-            mocker.expect(test_plan.sets).result([
-                dict(name="set0", image_files=self.image_files, data_files=self.data_files,
-                     config_files=self.config_files, testmodule_files=self.testmodule_files,
-                     engine_ini_file=self.engine_ini_file, test_harness=harness0, src_dst=self.src_dst0,
-                     pmd_files=self.pmd_files, trace_activation_files=self.trace_activation_files,
-                     trace_path=self.file_store.joinpath("traces", "set0", "tracelog.blx"),
-                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
-                     custom_dir = self.custom_dir, component_path=self.component_path),
-                dict(name="set1", image_files=self.image_files, data_files=self.data_files,
-                     config_files=self.config_files, testmodule_files=self.testmodule_files,
-                     engine_ini_file=self.engine_ini_file, test_harness=harness1, src_dst=self.src_dst1,
-                     pmd_files=self.pmd_files, trace_activation_files=self.trace_activation_files,
-                     trace_path=self.file_store.joinpath("traces", "set1", "tracelog.blx"),
-                     ctc_enabled=self.ctc_enabled, eunitexerunner_flags=self.eunitexerunner_flags,
-                     custom_dir = self.custom_dir, component_path=self.component_path),
-            ])
-        mocker.expect(test_plan.post_actions).result([
-            ("SendEmailAction", (("subject", "email subject"),
-                                 ("type", "ATS3_REPORT"),
-                                 ("send-files", "true"),
-                                 ("to", self.report_email))),
-            ("FileStoreAction", (("to-folder", self.file_store),
-                                 ("report-type", "ATS_REPORT"),
-                                 ("date-format", "yyyyMMdd"),
-                                 ("time-format", "HHmmss"))),
-            ("FileStoreAction", (("to-folder", self.file_store),
-                                 ("report-type", "STIF_COMPONENT_REPORT_ALL_CASES"),
-                                 ("run-log", "true"),
-                                 ("date-format", "yyyyMMdd"),
-                                 ("time-format", "HHmmss"))),
-            ("DiamondsAction", ())
-        ])
-        
-        self.mocker.replay()
-        self.test_plan = test_plan
-        
-        self.gen = adg.Ats3TestDropGenerator()
-        return self.gen.generate_xml(test_plan)
-
-    def test_basic_structure(self):
-        "Check that the overall test.xml structure is valid."
-        
-        test_harness = ["STIF", "EUNIT", "MULTI_HARNESS"]
-        
-        for thar in test_harness:
-            xml = self.generate_xml(thar)
-            # Check basics.
-            assert xml.find(".").tag == "test"
-            assert xml.find("./name").text == "test"
-            assert xml.find("./buildid").text == self.diamonds_build_url
-            assert xml.find("./target").tag
-            assert xml.find("./target/device").tag
-            if self.test_plan["harness"] == "MULTI_HARNESS":
-                harness_1, type_1, device_hwid_1, harness_2, type_2, device_hwid_2 = xml.findall("./target/device/property")
-            else:
-                harness_1, type_1, device_hwid_1 = xml.findall("./target/device/property")
-            
-            if self.test_plan["harness"] == "MULTI_HARNESS":
-                assert harness_1.get("value") == "STIF"
-                assert type_1.get("value") == "product"
-                assert device_hwid_1.get("value") == "5425"
-                assert harness_2.get("value") == "EUNIT"
-                assert type_2.get("value") == "product"
-                assert device_hwid_2.get("value") == "5425"
-            else:
-                assert harness_1.get("value") == thar
-                assert type_1.get("value") == "product"
-                assert device_hwid_1.get("value") == "5425"
-
-        # Check generation of the test plan.
-        assert xml.find("./plan").get("name") == "test Plan"
-        assert xml.find("./plan/session").tag 
-        sets = xml.findall("./plan/session/set")
-        assert len(sets) == 2
-        assert sets[0].get("name") == "set0-"+str(TEST_PATH.joinpath("tsrc", "group"))
-        assert sets[0].find("./target/device").tag
-    
-    def test_set_structure(self):
-        "Check that a <set> element's structure is valid."
-        xml = self.generate_xml("STIF")
-        tstset = xml.find("./plan/session/set")
-        assert tstset.tag
-        case = tstset.find("./case")
-        assert case.tag
-        assert case.get("name") == "set0 case"
-        
-    def test_case_flash_elems(self):
-        """Checks flash target element in the test.xml file"""
-        xml = self.generate_xml("STIF")
-        case = xml.find("./plan/session/set/case")
-        flashes = case.findall("./flash")
-        assert len(flashes) == len(self.image_files)
-        for i, flash_file in enumerate(self.image_files):
-            assert flashes[i].get("target-alias") == "DEFAULT_STIF"
-            assert flashes[i].get("images") == path(r"ATS3Drop" + os.sep + "images") / flash_file.name
-        
-    def test_case_steps(self):
-        """Checks cases in steps in the test.xml file"""
-        test_harness = ["STIF", "EUNIT", "MULTI_HARNESS"]
-        for thar in test_harness:
-            xml = self.generate_xml(thar)
-            steps = iter(xml.findall("./plan/session/set/case/step"))
-            check_ctc_start(steps)
-            check_log_dir(steps)
-            if "MULTI_HARNESS" in thar:            
-                self.check_install_step(steps, "STIF")
-                self.check_run_cases(steps)
-                check_ctc_write(steps)
-                check_ctc_log(steps)
-                check_fetch_logs(steps)
-                check_ctc_start(steps)
-                check_log_dir(steps)
-                self.check_install_step(steps, "EUNIT", set_count="1")
-                self.check_run_cases(steps)
-                check_ctc_write(steps)
-                check_ctc_log(steps, "withpkgfiles")
-                check_fetch_logs(steps)
-            else:
-                self.check_install_step(steps, thar)
-                self.check_run_cases(steps)
-                check_ctc_write(steps)
-                check_ctc_log(steps)
-                check_fetch_logs(steps)
-
-    def check_install_step(self, steps, harness, set_count="0"):
-        """Checks install steps in the test.xml file"""
-        if harness == "MULTI_HARNESS":
-            dst = [self.src_dst0, self.src_dst1]
-        else:
-            dst = [self.src_dst0]
-        if set_count == "1":
-            dst = [self.src_dst1]
-        
-        for dest in dst:
-            for file1 in dest:
-                step = steps.next()
-                filename = file1[1]
-                letter = filename[filename.rfind(":")-1:filename.rfind(":")]
-                filename = filename[filename.rfind(os.sep)+1:]
-                if "Install" in step.get("name"):
-                    assert step.get("name") == "Install %s: %s" %  (file1[2], filename)
-                    assert step.findtext("./command") == "install"
-                    params = step.findall("./params/param")            
-                    src = params[0].get("src")
-                    assert src.name == filename
-                    assert src.parent == path(r"ATS3Drop" + os.sep + "set" + set_count + os.sep + letter + os.sep + "sys" + os.sep + "bin")
-                    dst = params[1].get("dst")
-                    assert dst.name == filename
-                    assert dst.parent == path(letter + ":" + os.sep + "sys" + os.sep + "bin")
-            
-    
-    def check_run_cases(self, steps):
-        """Checks run cases in the test.xml file"""
-        step = steps.next()
-        if step.get("harness") == "STIF":
-            file_ = self.engine_ini_file 
-            assert step.get("name") == "Execute test: %s" % file_.name
-            assert step.findtext("./command") == "run-cases"
-            params = step.findall("./params/param")
-            assert params[0].get("filter") == "*"
-            assert params[1].get("timeout") == "60"
-            assert params[2].get("engineini") == path(r"c:" + os.sep + "sys" + os.sep + "bin") / self.engine_ini_file.name
-        elif step.get("harness") == "EUNIT":
-            file_ = self.testmodule_files[0]
-            if "Execute" in step.get("name"):
-                assert step.get("name") == "Execute test: %s" % file_.name
-                assert step.findtext("./command") == "execute"
-                params = step.findall("./params/param")
-                assert params[0].get("file") == path(r"z:" + os.sep + "sys" + os.sep + "bin" + os.sep + "EUNITEXERUNNER.EXE")
-                assert params[1].get("result-file") == path(r"c:" + os.sep + "Shared" + os.sep + "EUnit" + os.sep + "logs" + os.sep + "file1_log.xml")
-                assert params[2].get("parameters") == "/E S60AppEnv /R Off /F file1 /l xml file1.dll"
-                assert params[3].get("timeout") == "60"
-                step = steps.next()
-                file_ = self.testmodule_files[1]
-                assert step.get("name") == "Execute test: %s" % file_.name
-                assert step.findtext("./command") == "execute"
-                params = step.findall("./params/param")
-                assert params[0].get("file") == path(r"z:" + os.sep + "sys" + os.sep + "bin" + os.sep + "EUNITEXERUNNER.EXE")
-                assert params[1].get("result-file") == path(r"c:" + os.sep + "Shared" + os.sep + "EUnit" + os.sep + "logs" + os.sep + "file2_log.xml")
-                assert params[2].get("parameters") == "/E S60AppEnv /R Off /F file2 /l xml file2.dll"
-                assert params[3].get("timeout") == "60"
-
-    def test_steps_trace_enabled(self):
-        """checks if traing is enabled"""
-        test_harness = ["STIF"]
-        for thar in test_harness:
-            xml = self.generate_xml(thar, trace_enabled="True")
-            steps = iter(xml.findall("./plan/session/set/case/step"))
-            check_ctc_start(steps)
-            check_log_dir(steps)
-            self.check_install_step(steps, thar)
-            check_trace_start(steps, self.file_store)
-            self.check_run_cases(steps)
-            check_trace_end_steps(steps, self.file_store)
-            check_ctc_write(steps)
-            check_ctc_log(steps)
-            check_fetch_logs(steps)
-        
-    def test_post_actions(self):
-        "Post actions are inserted into XML."
-        xml = self.generate_xml("STIF")
-        post_actions = xml.findall("./postAction")
-        check_send_email_action(post_actions[0], self.report_email)
-        check_ats_report_action(post_actions[1], self.file_store)
-        check_stif_report_action(post_actions[2], self.file_store)
-        check_diamonds_action(post_actions[3])
-        
-    def test_files(self):
-        """Tests if the files are created for mock"""
-        xml = self.generate_xml("STIF")
-        files = iter(xml.findall("./files/file"))
-        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx"
-        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg"        
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini"
-        self.assertRaises(StopIteration, files.next)
-        xml = self.generate_xml(harness="STIF", trace_enabled="True")
-        files = iter(xml.findall("./files/file"))
-        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx"
-        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx"
-        assert files.next().text == r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg"
-        assert files.next().text == r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini"
-
-        self.assertRaises(StopIteration, files.next)
-        
-    def test_generate_drop(self):
-        "Manifest for ATS3Drop directory structure is generated."        
-        xml = self.generate_xml("STIF")
-        strbuffer = StringIO()
-        self.gen.generate_drop(self.test_plan, xml, strbuffer)
-        
-        zfile = zipfile.ZipFile(strbuffer, "r")
-        try:
-            contents = sorted(path(tpath).normpath() for tpath in zfile.namelist())
-            expected = sorted(path(tpath).normpath()
-                           for tpath in [r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3",
-                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
-                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll",
-                                     r"test.xml"])
-            diff = difflib.context_diff(expected, contents)
-            assert contents == expected, "\n".join(diff)
-        finally:
-            zfile.close()
-
-    def test_generate_drop_trace_enabled(self):
-        "Manifest for ATS3Drop directory structure is generated when trace enabled."
-        xml = self.generate_xml(harness="STIF", trace_enabled="True")
-        strbuffer = StringIO()
-        
-        self.gen.generate_drop(self.test_plan, xml, strbuffer)
-        zfile = zipfile.ZipFile(strbuffer, "r")
-        try:
-            contents = sorted(path(tpath).normpath() for tpath in zfile.namelist())
-            expected = sorted(path(tpath).normpath()
-                           for tpath in [r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml",
-                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
-                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
-                                     r"ATS3Drop" + os.sep + "pmds" + os.sep + "pmd_file.pmd",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll",
-                                     r"ATS3Drop" + os.sep + "set0" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.cfg",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.cfg",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "e" + os.sep + "sys" + os.sep + "bin" + os.sep + "file3",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "trace_init" + os.sep + "trace_activation_1.xml",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll",
-                                     r"ATS3Drop" + os.sep + "set1" + os.sep + "c" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.dll",
-                                     r"test.xml"])
-            diff = difflib.context_diff(expected, contents)
-            assert contents == expected, "\n".join(diff)
-        finally:
-            zfile.close()
-            
-class TestDropGenerationWithSis(mocker.MockerTestCase):
-    """
-    Unit tests for the test.xml generation with sis files.
-    """
-    def __init__(self, methodName="runTest"):
-        mocker.MockerTestCase.__init__(self, methodName)
-        self.sis_files = None
-        self.image_files = None
-        self.engine_ini_file = None
-        self.report_email = None
-        self.file_store = None
-        self.diamonds_build_url = None
-        self.harness = None
-        self.test_plan = None
-        self.gen = None
-        self.src_dst = []
-        
-    def generate_xml(self):
-        """Geberates XML if sis files"""
-        def files(*paths):
-            """generates paths for the files"""
-            return [TEST_PATH.joinpath("tsrc", tpath) for tpath in paths]
-        self.sis_files = files("sis/file1.sisx", "sis/file2.sisx", "sis/file3.sisx")
-        self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
-        self.engine_ini_file = files("init/TestFramework.ini")[0]
-        self.report_email = "test.receiver@company.com"
-        self.file_store = path("path/to/reports")
-        self.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
-        self.harness = "STIF"
-        self.component_path = str(TEST_PATH.joinpath("tsrc", "group"))
-        self.ats_network_drive = r"10.0.0.1#x:\ats\drop0.zip"
-        
-        test_plan = self.mocker.mock(count=False)
-        mocker.expect(test_plan["testrun_name"]).result("test")
-        mocker.expect(test_plan["harness"]).result("STIF")
-        mocker.expect(test_plan["device_type"]).result("product")
-        mocker.expect(test_plan["plan_name"]).result("test plan")
-        mocker.expect(test_plan["diamonds_build_url"]).result(self.diamonds_build_url)
-        mocker.expect(test_plan["test_timeout"]).result("60")
-        mocker.expect(test_plan["device_hwid"]).result("5425")
-        mocker.expect(test_plan["ctc_enabled"]).result("False")
-        mocker.expect(test_plan["trace_enabled"]).result("False")
-        mocker.expect(test_plan["custom_dir"]).result("CustomC")
-        mocker.expect(test_plan.custom_dir).result(path(r"self.custom_dir"))
-        mocker.expect(test_plan["ats_network_drive"]).result(self.ats_network_drive)
-        mocker.expect(test_plan.sets).result([
-            dict(name="set0", image_files=self.image_files, sis_files=self.sis_files,
-                 engine_ini_file=self.engine_ini_file, test_harness=self.harness, ctc_enabled="False", component_path=self.component_path),
-             ])
-        mocker.expect(test_plan.post_actions).result([])
-        self.mocker.replay()
-        self.test_plan = test_plan
-        
-        self.gen = adg.Ats3TestDropGenerator()
-        return self.gen.generate_xml(test_plan)
-
-    def test_case_steps(self):
-        """Checks cases in steps in the test.xml file"""
-        xml = self.generate_xml()
-        #print doc.xml(indent="yes")        
-        steps = iter(xml.findall("./plan/session/set/case/step"))
-        steps.next() # Stif log dir creation.
-        self.check_install_sis_files(steps)
-        steps.next() # Install engine ini.
-        self.check_install_sis_to_device(steps)
-        steps.next() # Run cases.
-        steps.next() # Fetch logs.
-        self.assertRaises(StopIteration, steps.next)
-
-    def check_install_sis_files(self, steps):
-        """Checks sis files install steps in the test.xml file"""
-        for filename in self.sis_files:
-            step = steps.next()
-            assert step.get("name") == "Install sis: %s" % filename.name
-            assert step.findtext("./command") == "install"
-            params = step.findall("./params/param")
-            # TO DO: Should sis files be specified outside of the set?
-            assert params[0].get("src") == path(r"ATS3Drop" + os.sep + "set0" + os.sep + "sis") / filename.name
-            assert params[1].get("dst") == path(r"c:" + os.sep + "testframework") / filename.name
-
-    def check_install_sis_to_device(self, steps):
-        """Checks sis files installation on the device"""
-        for filename in self.sis_files:
-            step = steps.next()
-            assert step.get("name") == "Install SIS to the device: %s" % filename.name
-            assert step.findtext("./command") == "install-software"
-            params = step.findall("./params/param")
-            assert params[-1].get("sisPackageName") == path(r"c:" + os.sep + "testframework") / filename.name
--- a/buildframework/helium/tools/common/python/lib/test/test_ats3_aste.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,493 +0,0 @@
-# -*- coding: latin-1 -*-
-
-#============================================================================ 
-#Name        : test_ats3_aste.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-""" Testing ATS3 ASTE framework. """
-
-# pylint: disable-msg=E1101,W0603,W0142
-
-from cStringIO import StringIO
-from pprint import pprint
-from xml.etree.ElementTree import fromstring, tostring
-from xml.etree import ElementTree as et
-import difflib
-import logging
-logging.getLogger().setLevel(logging.ERROR)
-import re
-import tempfile
-import zipfile
-import os
-
-from path import path
-import amara
-import mocker
-
-import ats3.aste
-
-TEST_PATH = None
-TEST_FILES = {}
-TEST_ASSET_FILES = {}
-TSRC = None
-OUTPUT = None
-TEST_ZIP_PATH = None
-
-# Shortcuts
-E = et.Element
-SE = et.SubElement
-
-class Bunch(object):
-    
-    def __init__(self, **kwargs): 
-        self.__dict__.update(kwargs)
-    
-
-def equal_xml(xml1, xml2):
-    """Check the equality of the given XML snippets.
-    
-    Tag name equality:
-    
-    >>> equal_xml('<a/>', '<a/>')
-    True
-    >>> equal_xml('<a/>', '<b/>')
-    False
-    
-    Attribute equality:
-    
-    >>> equal_xml('<a k="v"/>', '<a k="v"/>')
-    True
-    >>> equal_xml('<a k="v"/>', '<a k="w"/>')
-    False
-    
-    Text content equality:
-    
-    >>> equal_xml('<a>v</a>', '<a>v</a>')
-    True
-    >>> equal_xml('<a>v</a>', '<a>w</a>')
-    False
-    >>> equal_xml('<a>v</a>', '<a></a>')
-    False
-    
-    Text content equality when whitespace differs:
-    >>> equal_xml('<a>v</a>', '<a>v </a>')
-    True
-
-    Equality of child elements:
-    
-    >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="v"/></b></a>')
-    True
-    >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="w"/></b></a>')
-    False
-    >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>w</b></a>')
-    False
-    >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>v </b></a>')
-    True
-    
-    """
-    if isinstance(xml1, basestring):
-        xml1 = fromstring(xml1)
-    if isinstance(xml2, basestring):
-        xml2 = fromstring(xml2)
-    if xml1.tag != xml2.tag:
-        return False
-    if xml1.attrib != xml2.attrib:
-        return False
-    if xml1.text:
-        if not xml2.text:
-            return False
-    if xml2.text:
-        if not xml1.text:
-            return False
-    if xml1.text and xml2.text and xml1.text.strip() != xml2.text.strip():
-        return False
-    if xml1.tail is not None and xml2.tail is not None:
-        if xml1.tail.strip() != xml2.tail.strip():
-            return False
-    elif xml1.tail != xml2.tail:
-        return False
-    children1 = list(xml1.getchildren())
-    children2 = list(xml2.getchildren())
-    if len(children1) != len(children2):
-        return False
-    for child1, child2 in zip(children1, children2):
-        return equal_xml(child1, child2)
-    return True        
-
-
-def setup_module():
-    global TEST_PATH, OUTPUT, TEST_ZIP_PATH
-    TEST_PATH = path(tempfile.mkdtemp())
-    OUTPUT = TEST_PATH.joinpath("TestAsset")
-    TEST_ZIP_PATH = TEST_PATH.joinpath("test_zip")
-    asset = TEST_PATH
-    component = TEST_PATH
-    component.joinpath("group").makedirs()
-    for path_parts in (("output", "images", "file1.fpsx"),
-                       ("output", "images", "file2.fpsx")):
-        filename = component.joinpath(*path_parts)
-        if not filename.parent.exists():
-            filename.parent.makedirs()
-        filename.touch()
-        TEST_FILES.setdefault(path_parts[1], []).append(file)
-    for path_parts in (("TestAsset", "Localisation", "S60", "localisation.txt"),
-                       ("TestAsset", "TestCases", "TC_100_Test0", "file1.sis"),
-                       ("TestAsset", "TestCases", "TC_100_Test0", "file2.tcf"),
-                       ("TestAsset", "Tools", "TestCaseCreator", "test_creator.ini"),
-                       ("TestAsset", "testdrop.xml"),):
-        filename = asset.joinpath(*path_parts)
-        if not filename.parent.exists():
-            filename.parent.makedirs()
-        filename.touch()
-        TEST_ASSET_FILES.setdefault(path_parts[1], []).append(file)
-    try:
-        zip_component = TEST_ZIP_PATH
-        filename = zip_component.joinpath("TestAsset.zip")
-        if not filename.parent.exists():
-            filename.parent.makedirs()
-        filename.touch()
-        zfile = zipfile.ZipFile(zip_component.joinpath("TestAsset.zip"), "w", zipfile.ZIP_DEFLATED)
-        for p in TEST_ASSET_FILES:
-            print p
-            zfile.write(p)
-        zfile.close()
-        TEST_ASSET_FILES.setdefault("ZIP", []).append(file)
-    except OSError:
-        print "Got except OSError. Continuing...\n"  
-        
-    
-def teardown_module():
-    path(TEST_PATH).rmtree()
-    
-    
-class TestTestPlan(mocker.MockerTestCase):
-
-    def __init__(self, methodName="runTest"):
-        mocker.MockerTestCase.__init__(self, methodName)
-             
-    def setUp(self):
-        opts = Bunch(testrun_name="testrun", harness="ASTE", 
-                     device_type="product", plan_name="ats3_test_plan", diamonds_build_url="",
-                     software_version="W810", software_release="SPP 51.32", device_language="English",
-                     testasset_location=TEST_PATH.joinpath("TestAsset"), testasset_caseids="100",repeat="1", report_email="",
-                     file_store=path(), test_timeout="60", device_hwid="5425", test_type="smoke")
-        self.tp = ats3.aste.AsteTestPlan(opts)
-        self.image_files = TEST_FILES["images"]
-        self.test_timeout = self.tp["test_timeout"]
-        self.device_hwid = self.tp["device_hwid"]
-        self.test_harness = self.tp["harness"]
-        self.device_language = self.tp["device_language"]
-        self.software_release = self.tp["software_release"]
-        self.software_version = self.tp["software_version"]
-        self.testasset_caseids = self.tp["testasset_caseids"]
-        self.testasset_location = self.tp["testasset_location"]
-        self.test_type = self.tp["test_type"]
-        
-        if self.testasset_location != "":
-            self.test_asset_testcases = [self.testasset_location.joinpath("TestCases", "TC_100_Test0", "file1.sis"), self.testasset_location.joinpath("TestCases", "TC_100_Test0", "file2.tcf")]
-            self.test_asset_tools = [self.testasset_location.joinpath("Tools", "TestCaseCreator", "test_creator.ini")]
-            self.test_asset_localisation = [self.testasset_location.joinpath("Localisation", "S60", "localisation.txt")]
-            self.test_asset_testdrop = self.testasset_location.joinpath("testdrop.xml")
-        else:
-            self.test_asset_testcases = TEST_ASSET_FILES["TestCases"]
-            self.test_asset_tools = TEST_ASSET_FILES["Tools"]
-            self.test_asset_localisation = TEST_ASSET_FILES["Localisation"]
-            self.test_asset_testdrop = TEST_ASSET_FILES["testdrop.xml"]
-
-            
-    def test_creation(self):        
-        assert self.tp["testrun_name"] == "testrun"
-        assert self.tp["harness"] == "ASTE"
-        assert self.tp["device_type"] == "product"
-    
-    def test_insert_set(self):
-        
-        self.tp.insert_set(image_files=self.image_files,
-                           test_timeout=self.test_timeout)
-        
-        assert self.tp.sets[0] == dict(name="set0",
-                                       image_files=self.image_files,
-                                       test_timeout=self.test_timeout,
-                                       test_harness=self.test_harness)
-
-    def test_post_actions_email(self):
-        assert not self.tp.post_actions
-        receiver = "joe.average@example.com"
-        self.tp.report_email = receiver
-        assert len(self.tp.post_actions) == 1
-        action, items = self.tp.post_actions[0]
-        items = dict(items)
-        assert action == "SendEmailAction"
-        assert items["to"] == receiver
-    
-    def test_post_actions_ats3_report_only(self):
-        file_store = path("path/to/files")
-        self.tp.file_store = file_store
-        self.tp.harness = "EUNIT"
-        assert len(self.tp.post_actions) == 2
-        action, items = self.tp.post_actions[0]
-        items = dict(items)
-        assert action == "FileStoreAction"
-        assert items["report-type"] == "ATS_REPORT"
-        assert items["to-folder"].startswith(file_store)
-        assert items["to-folder"].endswith("ATS3_REPORT")
-    
-    def test_post_actions_aste(self):
-        file_store = path("path/to/files")
-        self.tp.file_store = file_store
-        assert len(self.tp.post_actions) == 2
-        action, items = self.tp.post_actions[1]
-        items = dict(items)
-        assert action == "FileStoreAction"
-        assert items["report-type"] == "ASTE_REPORT"
-        assert items["to-folder"].startswith(file_store)
-        assert items["to-folder"].endswith("ASTE_REPORT")
-        
-    def test_post_actions_diamonds(self):
-        self.tp.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
-        assert len(self.tp.post_actions) == 1
-        action, items = self.tp.post_actions[0]
-        assert action == "DiamondsAction"
-        assert not items
-
-
-            
-class TestXMLGeneration(mocker.MockerTestCase):
-    """
-    Unit tests for the test.xml generation.
-    """    
-
-    def __init__(self, methodName="runTest"):
-        self.image_files = None
-        self.report_email = None
-        self.diamonds_build_url = None
-        self.test_harness = None
-        self.file_store = None
-        self.testasset_location = None
-        self.test_plan = None
-        self.gen = None
-        mocker.MockerTestCase.__init__(self, methodName)
-        
-        
-    def generate_xml(self):
-        def files(*paths):
-            return [TEST_PATH.joinpath(p) for p in paths]
-        self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
-        self.report_email = "test.receiver@company.com"
-        self.diamonds_build_url = "http://diamonds.nmp.company.com/diamonds/builds/1234"
-        self.test_harness = "ASTE"
-        self.file_store = path(r"path/to/reports")
-        self.testasset_location = OUTPUT
-        
-        self.mocker.restore()
-        test_plan = self.mocker.mock(count=False)
-        mocker.expect(test_plan["testrun_name"]).result("test")
-        mocker.expect(test_plan["harness"]).result("ASTE")
-        mocker.expect(test_plan["device_type"]).result("product")
-        mocker.expect(test_plan["plan_name"]).result("test plan")
-        mocker.expect(test_plan["diamonds_build_url"]).result(self.diamonds_build_url)
-        mocker.expect(test_plan["test_timeout"]).result("60")
-        mocker.expect(test_plan["device_hwid"]).result("5425")
-        mocker.expect(test_plan["testasset_location"]).result(self.testasset_location)
-        mocker.expect(test_plan["testasset_caseids"]).result("100")
-        mocker.expect(test_plan["software_release"]).result("SPP 51.32")
-        mocker.expect(test_plan["software_version"]).result("W810")
-        mocker.expect(test_plan["device_language"]).result("English")
-        mocker.expect(test_plan["test_type"]).result("smoke")
-        mocker.expect(test_plan["temp_directory"]).result(TEST_PATH)
-        mocker.expect(test_plan.sets).result([
-            dict(name="set0", image_files=self.image_files, test_harness="ASTE")])
-        mocker.expect(test_plan.post_actions).result([
-            ("SendEmailAction", (("subject", "email subject"),
-                                 ("type", "ATS3_REPORT"),
-                                 ("send-files", "true"),
-                                 ("to", self.report_email))),
-            ("FileStoreAction", (("to-folder", self.file_store),
-                                 ("report-type", "ATS_REPORT"),
-                                 ("date-format", "yyyyMMdd"),
-                                 ("time-format", "HHmmss"))),
-            ("FileStoreAction", (("to-folder", self.file_store),
-                                 ("report-type", "ASTE_REPORT"),
-                                 ("run-log", "true"),
-                                 ("date-format", "yyyyMMdd"),
-                                 ("time-format", "HHmmss"))),
-            ("DiamondsAction", ())
-        ])
-        
-        self.mocker.replay()
-        self.test_plan = test_plan
-        
-        self.gen = ats3.aste.AsteTestDropGenerator()
-        return self.gen.generate_xml(test_plan)
-
-    def test_basic_structure(self):
-        "Check that the overall test.xml structure is valid."
-        xml = self.generate_xml()
-        # Check basics.
-        assert xml.find(".").tag == "test"
-        assert xml.find("./name").text == "test"
-        assert xml.find("./buildid").text == self.diamonds_build_url
-        assert xml.find("./target").tag
-        assert xml.find("./target/device").tag
-        harness, hardware, device_hwid = xml.findall("./target/device/property")
-        softwareVersion, softwareRelease, deviceLanguage = xml.findall("./target/device/setting")
-        assert harness.get("value") == "ASTE"
-        assert hardware.get("value") == "product"
-        assert softwareVersion.get("value") == "W810"
-        assert softwareRelease.get("value") == "SPP 51.32"
-        assert deviceLanguage.get("value") == "English"
-        assert device_hwid.get("value") == "5425"
-        
-        # Check generation of the test plan.
-        assert xml.find("./plan").get("name") == "Plan smoke product"
-        assert xml.find("./plan/session").tag 
-        sets = xml.findall("./plan/session/set")
-        assert len(sets) == 1
-        assert sets[0].get("name") == "set0"
-        assert sets[0].find("./target/device").tag
-    
-    def test_set_structure(self):
-        "Check that a <set> element's structure is valid."
-        xml = self.generate_xml()
-        tstset = xml.find("./plan/session/set")
-        assert tstset.tag
-        case = tstset.find("./case")
-        assert case.tag
-        assert case.get("name") == "set0 case"                
-        
-    def test_case_flash_elems(self):
-        xml = self.generate_xml()
-        case = xml.find("./plan/session/set/case")
-        flashes = case.findall("./flash")
-        assert len(flashes) == len(self.image_files)
-        for i, flash_file in enumerate(self.image_files):
-            assert flashes[i].get("target-alias") == "DEFAULT"
-            assert flashes[i].get("images") == path(r"ATS3Drop" + os.sep + "images") / flash_file.name
-    
-    def test_steps(self):
-        xml = self.generate_xml()
-        steps = iter(xml.findall("./plan/session/set/case/step"))
-        self.check_executeasset_step(steps)
-
-    def check_executeasset_step(self, steps):
-        step = steps.next()
-        assert step.get("name") == "Execute asset zip step"
-        assert step.findtext("./command") == "execute-asset"
-        params = step.findall("./params/param")
-        assert params[0].get("repeat") == "1"
-        assert params[1].get("asset-source") == "ATS3Drop" + os.sep + "TestAssets" + os.sep + "TestAsset.zip"
-        assert params[2].get("testcase-ids") == "100"
-
-    def test_post_actions(self):
-        "Post actions are inserted into XML."
-        xml = self.generate_xml()        
-        post_actions = xml.findall("./postAction")
-        self.check_send_email_action(post_actions[0])
-        self.check_ats_report_action(post_actions[1])
-        self.check_aste_report_action(post_actions[2])
-        self.check_diamonds_action(post_actions[3])
-
-    def check_send_email_action(self, action):
-        assert action.findtext("./type") == "SendEmailAction"
-        params = action.findall("./params/param")
-        assert params[0].get("name") == "subject"
-        assert params[0].get("value") == "email subject"
-        assert params[1].get("name") == "type"
-        assert params[1].get("value") == "ATS3_REPORT"
-        assert params[2].get("name") == "send-files"
-        assert params[2].get("value") == "true"
-        assert params[3].get("name") == "to"
-        assert params[3].get("value") == self.report_email
-
-    def check_ats_report_action(self, action):
-        assert action.findtext("./type") == "FileStoreAction"
-        params = action.findall("./params/param")
-        assert params[0].get("name") == "to-folder"
-        assert params[0].get("value") == self.file_store
-        assert params[1].get("name") == "report-type"
-        assert params[1].get("value") == "ATS_REPORT"
-        assert params[2].get("name") == "date-format"
-        assert params[2].get("value") == "yyyyMMdd"
-        assert params[3].get("name") == "time-format"
-        assert params[3].get("value") == "HHmmss"
-
-    def check_aste_report_action(self, action):
-        assert action.findtext("./type") == "FileStoreAction"
-        params = action.findall("./params/param")
-        assert params[0].get("name") == "to-folder"
-        assert params[0].get("value") == self.file_store
-        assert params[1].get("name") == "report-type"
-        assert params[1].get("value") == "ASTE_REPORT"
-        assert params[2].get("name") == "run-log"
-        assert params[2].get("value") == "true"
-        assert params[3].get("name") == "date-format"
-        assert params[3].get("value") == "yyyyMMdd"
-        assert params[4].get("name") == "time-format"
-        assert params[4].get("value") == "HHmmss"
-        
-    def check_diamonds_action(self, action):
-        assert action.findtext("./type") == "DiamondsAction"
-        assert not action.findall("./params/param")
-    
-    def test_files(self):
-        xml = self.generate_xml()
-        files = iter(xml.findall("./files/file"))
-        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx"
-        assert files.next().text == r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx"
-        assert files.next().text == r"ATS3Drop" + os.sep + "TestAssets" + os.sep + "TestAsset.zip"
-        self.assertRaises(StopIteration, files.next)
-        
-    def test_generate_testasset_zip(self):
-        self.generate_xml()
-        if re.search(r"[.]zip", self.test_plan["testasset_location"]):
-            pass
-        else:
-            strbuffer = StringIO()
-            assert strbuffer == self.gen.generate_testasset_zip(self.test_plan, strbuffer)
-            zfile = zipfile.ZipFile(strbuffer, "r")
-            try:
-                contents = sorted(path(p).normpath() for p in zfile.namelist())
-                expected = sorted(path(p).normpath()
-                               for p in [(r"Localisation" + os.sep + "S60" + os.sep + "localisation.txt"),
-                                         (r"TestCases" + os.sep + "TC_100_Test0" + os.sep + "file1.sis"),
-                                         (r"TestCases" + os.sep + "TC_100_Test0" + os.sep + "file2.tcf"),
-                                         (r"Tools" + os.sep + "TestCaseCreator" + os.sep + "test_creator.ini"),
-                                         (r"testdrop.xml")])
-                diff = difflib.context_diff(expected, contents)
-                assert contents == expected, "\n".join(diff)
-            finally:
-                zfile.close()
-        
-    def test_generate_drop(self):
-        "Manifest for ATS3Drop directory structure is generated."
-        xml = self.generate_xml()
-        strbuffer = StringIO()
-
-        self.gen.generate_drop(self.test_plan, xml, strbuffer)
-        zfile = zipfile.ZipFile(strbuffer, "r")
-        try:
-            contents = sorted(path(p).normpath() for p in zfile.namelist())
-            expected = sorted(path(p).normpath()
-                           for p in [r"ATS3Drop" + os.sep + "images" + os.sep + "file1.fpsx",
-                                     r"ATS3Drop" + os.sep + "images" + os.sep + "file2.fpsx",
-                                     r"ATS3Drop" + os.sep + "TestAssets" + os.sep + "TestAsset.zip",
-                                     r"test.xml"])
-            diff = difflib.context_diff(expected, contents)
-            assert contents == expected, "\n".join(diff)
-        finally:
-            zfile.close()
--- a/buildframework/helium/tools/common/python/lib/test/test_atsconfigparser.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,101 +0,0 @@
-#============================================================================ 
-#Name    : test_atsconfigparser.py
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-""" Testing the ATS configuration file """
-
-import os
-import logging
-import tempfile
-import unittest
-
-import ats3.atsconfigparser
-
-_logger = logging.getLogger('test.atsconfigparser')
-logging.basicConfig(level=logging.INFO)
-
-class AtsConfigParserTest(unittest.TestCase):
-      
-    def test_x(self):
-        spectext = """<ATSConfigData>
-    <config name="common" abstract="true">
-
-        <!-- Properties to add/modify -->
-        <config type="properties">
-           <set name="HARNESS" value="STIFx" />
-           <set name="HARNESS2" value="STIF2"/>
-           <set name="HARNESS3" value="STIF2"/>
-           <set name="2" value="3" />
-        </config>
-
-        <!-- Attributes to modify -->
-        <config type="attributes">
-           <set name="xyz" value="2" />
-           <set name="significant" value="true" />
-        </config>
-
-        <!-- Settings to add/modify -->
-        <config type="settings">
-           <set name="HARNESS" value="STIF" />
-           <set name="2" value="3" />
-        </config>
-
-    </config>
-</ATSConfigData>
-        """
-
-        testxmldata = """<test>
-  <name>helium_clock</name>
-  <target>
-    <device alias="DEFAULT_STIF" rank="none">
-      <property name="HARNESS" value="STIF"/>
-      <property name="HARNESS2" value="STIF"/>
-      <property name="HARNESS3" value="STIF"/>
-    </device>
-    <device alias="DEFAULT_EUIT" rank="none">
-      <property name="HARNESS" value="STIF"/>
-      <property name="HARNESS2" value="STIF3"/>
-    </device>
-  </target>
-  <plan passrate="100" harness="STIF" enabled="true" name="helium_clock Plan" significant="false">
-    <session passrate="100" harness="STIF" enabled="true" name="session" significant="false">
-      <set passrate="100" harness="STIF" enabled="true" name="set0" significant="false">
-        <target>
-          <device alias="DEFAULT_STIF" rank="master"/>
-        </target>
-      </set>
-    </session>
-  </plan>
-</test>
-        """
-        
-        (fd, filename) = tempfile.mkstemp()
-        f = os.fdopen(fd, 'w')
-        f.write(spectext)
-        f.close()
-        
-        output = ats3.atsconfigparser.converttestxml(filename, testxmldata)
-        os.remove(filename)
-        _logger.info(output)
-        assert '<property name="2" value="3"/>' in output
-        assert '<property name="HARNESS" value="STIFx"/>' in output
-        assert '<property name="HARNESS" value="STIF"/>' not in output
-        assert '<property name="HARNESS2" value="STIF2"/>' in output
-        assert '<property name="HARNESS2" value="STIF3"/>' not in output
-        assert '<property name="HARNESS3" value="STIF2"/>' in output
-        
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/test/test_atsconfiguration.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,120 +0,0 @@
-# -*- encoding: latin-1 -*-
-
-#============================================================================ 
-#Name    : test_ATSconfiguration.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-""" Testing the ATS configuration file """
-
-import logging
-import StringIO
-import unittest
-
-import configuration
-import ats3.parsers
-
-_logger = logging.getLogger('test.atsconfiguration')
-logging.basicConfig(level=logging.INFO)
-
-
-
-def test_ATS_element():
-    """ ATS elements can be used in configuration. """
-    config_text = """
-<ATSConfigData>
-    <config name="properties">
-    <set name="PA" value="foo"/>
-    </config>
-    <config name="attributes">
-    <set name="attrs" value="foo"/>
-    <set name="AB" value="100"/>
-    <set name="AC" value="101"/>
-    </config>
-</ATSConfigData>"""
-
-    builder = configuration.NestedConfigurationBuilder(StringIO.StringIO(config_text))
-    config = builder.getConfiguration().getConfigurations()
-    assert config[0]['PA'] == 'foo'
-    assert config[1]['AB'] == '100'
-
-
-
-def test_ATS_config_attirbutes():
-    """ ATS elements can be used attributes only. """
-    config_text = """
-<ATSConfigData>
-    <config name="attributes">
-    <set name="attrs" value="foo"/>
-    <set name="AB" value="100"/>
-    <set name="AC" value="101"/>
-    </config>
-</ATSConfigData>"""
-    (params, attrs) = ats3.parsers.split_config_to_attributes_and_properties(StringIO.StringIO(config_text))
-
-    print attrs
-    print params
-    assert params ==  {}
-    assert attrs ==  {u'attrs': u'foo', u'AC': u'101', u'AB': u'100'}
-
-def test_ATS_config_properties():
-    """ ATS elements can be used properties only. """
-    config_text = """
-<ATSConfigData>
-    <config name="noattributes">
-    <set name="attrs" value="foo"/>
-    <set name="AB" value="100"/>
-    <set name="AC" value="101"/>
-    </config>
-    <config name="properties">
-    <set name="HW" value="foo"/>
-    </config>
-</ATSConfigData>"""
-    (params, attrs) = ats3.parsers.split_config_to_attributes_and_properties(StringIO.StringIO(config_text))
-
-    print attrs
-    print params
-    assert params ==  {u'HW': u'foo' }
-    assert attrs ==  { }
-
-
-def test_ATS_element3():
-    """ All alements can be used and several times. """
-    config_text = """
-<ATSConfigData>
-    <config name="attributes">
-    <set name="attrs" value="foo"/>
-    <set name="AB" value="100"/>
-    <set name="AC" value="101"/>
-    </config>
-    <config name="properties">
-    <set name="PA" value="foo"/>
-    </config>
-    <config name="properties">
-    <set name="HW" value="bar"/>
-    </config>
-</ATSConfigData>"""
-    	
-    (params, attrs) = ats3.parsers.split_config_to_attributes_and_properties(StringIO.StringIO(config_text))
-
-    print attrs
-    print params
-    assert params ==  {u'PA': u'foo' , u'HW': u'bar'}
-    assert attrs ==  {u'attrs': u'foo', u'AC': u'101', u'AB': u'100'}
-
-
-
--- a/buildframework/helium/tools/common/python/lib/test/test_build_io.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_build_io.py	Wed Dec 23 19:29:07 2009 +0200
@@ -21,7 +21,7 @@
 
 import logging
 import unittest
-
+import os
 import build.io
 
 
@@ -33,25 +33,24 @@
     
     def test_abld_what_parsing(self):
         """ Basic abld -what section parsing. """ 
-        reader = build.io.AbldLogWhatReader('tests/data/build/io/abld_what.log')
+        reader = build.io.AbldLogWhatReader(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/build/io/abld_what.log'))
         reader_iter = iter(reader)
         (component1, binaries1) = reader_iter.next()
-        assert component1 == 'ibusal_chipset_product2'
-        assert binaries1 == [r'\epoc32\release\ARMV5\UDEB\_product2_accelerometerpdd.pdd',
-                             r'\epoc32\release\ARMV5\UDEB\_product2_accelerometerpdd.pdd.map']
+        assert component1 == 'ibusal_chipset_product'
+        assert binaries1 == [r'\epoc32\release\ARMV5\UDEB\_product_NaviScrollPdd.pdd',
+                             r'\epoc32\release\ARMV5\UDEB\_product_NaviScrollPdd.pdd.map']
         
         (component2, binaries2) = reader_iter.next()
-        assert component2 == 'ibusal_chipset_product'
-        assert binaries2 == [r'\epoc32\release\ARMV5\UDEB\_product_NaviScrollPdd.pdd',
-                             r'\epoc32\release\ARMV5\UDEB\_product_NaviScrollPdd.pdd.map']
-
+        assert component2 == 'ibusal_chipset_product2'
+        assert binaries2 == [r'\epoc32\release\ARMV5\UDEB\_product2_accelerometerpdd.pdd',
+                             r'\epoc32\release\ARMV5\UDEB\_product2_accelerometerpdd.pdd.map']
 
 class RombuildLogBinarySizeReaderTest(unittest.TestCase):
     """ Test reading Symbian ROM build logs for extracting binaries and their sizes. """
     
     def test_rom_log_parsing(self):
         """ Basic ROM log binary size parsing. """ 
-        reader = build.io.RombuildLogBinarySizeReader('tests/data/build/io/test_rom.log')
+        reader = build.io.RombuildLogBinarySizeReader(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/build/io/test_rom.log'))
         reader_iter = iter(reader)
         (binary, size, rom_type) = reader_iter.next()
         assert binary == r'\epoc32\release\ARMV5\urel\__ekern.exe'
@@ -70,7 +69,7 @@
         
     def test_rofs_log_parsing(self):
         """ Basic ROFS log binary size parsing. """ 
-        reader = build.io.RombuildLogBinarySizeReader('tests/data/build/io/test_rofs.log')
+        reader = build.io.RombuildLogBinarySizeReader(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/build/io/test_rofs.log'))
         reader_iter = iter(reader)
         (binary, size, rom_type) = reader_iter.next()
         assert binary == r'\epoc32\data\Z\Resource\ICL\jpegcodec_extra.rsc'
--- a/buildframework/helium/tools/common/python/lib/test/test_buildmodel.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-#============================================================================ 
-#Name        : test_buildmodel.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-""" Test build.model module. """
-
-import os
-import sys
-import unittest
-
-import build.model
-import configuration
-import ccm
-import amara
-
-database = "to1tobet"
-
-class BOMMockFolder:    
-    def __init__(self, name, instance, description, tasks):
-        self.name = name
-        self.instance = instance
-        self.description = description
-        self.tasks = tasks
-        
-class BOMMockProject:
-    def __init__(self, name):
-        self.name = name
-    
-    def __str__(self):
-        return self.name
-    
-    @property
-    def tasks(self):
-        return []
-    
-    @property
-    def folders(self):
-        return [BOMMockFolder('5856', 'tr1s60', "all completed tasks for release ABS_domain/abs.mcl for collaborative projects", [])] 
-    
-class BOMMock:
-    
-    def __init__(self):
-        self.config = {}
-        self.config['build.id'] = "mock"
-    
-    @property
-    def projects(self):    
-        return [BOMMockProject('ABS_domain-abs.mcl_200843:project:tr1s60#1')] 
-
-    def all_baselines(self):
-        return []
-
-# Refactor required: See http://delivery.nmp.nokia.com/trac/helium/ticket/1517
-class BOMTest(unittest.TestCase):
-    """ Test BOM and related classes. """
-    
-# TODO - removed until non-Synergy dependent tests can be provided.
-
-#    def test_bom_output(self):
-#        """ Test basic BOM execution. Only new spec format will be covered!"""
-#        try:
-#            session = ccm.open_session(database=database)
-#        except ccm.CCMException:
-#            print "Skipping BOMTest test cases."
-#            return
-#            
-#        project = session.create('helium-helium_0.1:project:vc1s60p1#1')
-#        config_dict = {'delivery': 'tests/data/test_delivery.xml',
-#                       'prep.xml': 'tests/data/test_prep.xml',
-#                       'build.id': "test_0.0",
-#                       'ccm.database': session.database()}
-#        config = configuration.Configuration(config_dict)
-#        bom = build.model.BOM_new_spec_config(config, project)
-#        writer = build.model.BOMHTMLWriter(bom)
-#        writer.write("bom2.html")
-#        session.close()
-#        os.remove("bom2.html")
-#        os.remove("bom2.html.xml")
-
-    def test_bom_delta(self):
-        """ Testing BOM delta creation... """
-        delta = build.model.BOMDeltaXMLWriter(BOMMock(), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/build_model_bom.xml'))
-        delta.write(os.path.join(os.environ['HELIUM_HOME'], 'build','delta.xml'))
-        xml = amara.parse(open(os.path.join(os.environ['HELIUM_HOME'], 'build','delta.xml'), 'r'))
-        assert xml.bomDelta[0].buildFrom[0] == "ido_raptor_mcl_abs_MCL.52.57"
-        assert xml.bomDelta[0].buildTo[0] == "mock"
-
-        print "baselines: ", len(xml.bomDelta.content.baseline)
-        print "folders: ", len(xml.bomDelta.content.folder)
-        print "tasks: ", len(xml.bomDelta.content.task)
-        print "baseline[@overridden='false']:", len(xml.bomDelta.content.xml_xpath("baseline[@overridden='false']"))
-        print "baseline[@overridden='true']: ", len(xml.bomDelta.content.xml_xpath("baseline[@overridden='true']"))
-        print "folder[@status='deleted']: ", len(xml.bomDelta.content.xml_xpath("folder[@status='deleted']"))
-        print "task[@status='deleted']: ", len(xml.bomDelta.content.xml_xpath("task[@status='deleted']"))
-
-        assert len(xml.bomDelta.content.baseline) == 156
-        assert len(xml.bomDelta.content.folder) == 1
-        assert len(xml.bomDelta.content.task) == 1
-        assert len(xml.bomDelta.content.xml_xpath("baseline[@overridden='false']")) == 155
-        assert len(xml.bomDelta.content.xml_xpath("baseline[@overridden='true']")) == 1
-
-        assert len(xml.bomDelta.content.xml_xpath("folder[@status='deleted']")) == 1
-
-        assert len(xml.bomDelta.content.xml_xpath("task[@status='deleted']")) == 1
-        
-    def test_validate_bom_delta(self):
-        """ Testing BOM delta validation... """
-        bom_delta_validate = build.model.BOMDeltaXMLWriter((os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_102_bom.xml')), (os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_101_bom.xml')))
-        delta_bom_content_validity = bom_delta_validate.validate_delta_bom_contents(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_102_bom_delta.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_102_bom.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_101_bom.xml'))
-        self.assertEqual(True, delta_bom_content_validity) 
-        delta_bom_content_validity = bom_delta_validate.validate_delta_bom_contents(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_104_bom_delta.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_102_bom.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_101_bom.xml'))
-        self.assertEqual(False, delta_bom_content_validity) 
-        delta_bom_content_validity = bom_delta_validate.validate_delta_bom_contents(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_103_bom_delta.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_103_bom.xml'), os.path.join(os.environ['HELIUM_HOME'], 'tests/data/bom/bom_validate_102_bom.xml'))
-        self.assertEqual(None, delta_bom_content_validity) 
--- a/buildframework/helium/tools/common/python/lib/test/test_ccm.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-#============================================================================ 
-#Name        : test_ccm.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-""" Test cases for ccm python toolkit.
-
-"""
-
-# pylint: disable-msg=E1101
-
-import logging
-import os
-import subprocess
-import sys
-import unittest
-
-import mocker
-
-import ccm
-import nokia.nokiaccm
-
-
-_logger = logging.getLogger('test.ccm')
-
-
-class CcmTest(mocker.MockerTestCase):
-    """ Tests the ccm module using mocker to prevent accessing a real Synergy database. """
-
-    def test_running_sessions(self):
-        """ Running sessions can be checked. """
-        obj = self.mocker.replace(ccm._execute)
-        if sys.platform == "win32":
-            obj('c:\\apps\\ccm65\\bin\\ccm.exe status')
-        else:
-            obj('/nokia/fa_nmp/apps/cmsynergy/6.5/bin/ccm status')
-        self.mocker.result(("""Sessions for user pmackay:
-
-Command Interface @ 1CAL01176:1553:10.241.72.23
-Database: /nokia/vc_nmp/groups/gscm/dbs/vc1s60p1
-
-Current project could not be identified.
-""", 0))
-
-        self.mocker.replay()
-
-        sessions = ccm.running_sessions()
-        print sessions
-
-#    def test_open_session(self):
-#        """ ccm session can be opened. """
-#        gscm_obj = self.mocker.replace(nokia.gscm._execute)
-#        gscm_obj('perl f:\\helium\\svn\\trunk\\helium\\tools/common/bin/get_gscm_info.pl get_router_address /nokia/vc_nmp/groups/gscm/dbs/vc1s60p1')
-#        self.mocker.result(("vccmsr65:55414:172.18.95.98:172.18.95.61:172.18.95.95:172.18.95.96:172.18.95.97", 0))
-#        
-#        obj = self.mocker.replace(ccm._execute)
-#        obj('c:\\apps\\ccm65\\bin\\ccm.exe start -m -q -nogui -n username -pw foobar -h vccmsweh.americas.company.com -d /nokia/vc_nmp/groups/gscm/dbs/vc1s60p1')
-#        self.mocker.result(("1CAL01176:1333:10.186.216.77:10.241.72.68", 0))
-#        
-#        self.mocker.replay()
-#        session = nokia.nokiaccm.open_session(password='foobar', engine='vccmsweh.americas.company.com', dbpath='/nokia/vc_nmp/groups/gscm/dbs/vc1s60p1', database='/nokia/vc_nmp/groups/gscm/dbs/vc1s60p1')
-        
-        
-        
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/test/test_ccm_results.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_ccm_results.py	Wed Dec 23 19:29:07 2009 +0200
@@ -31,8 +31,6 @@
 logging.basicConfig(level=logging.INFO)
 
 class CounterHandler(logging.Handler):
-    """ 
-    """
     def __init__(self, level=logging.NOTSET):
         logging.Handler.__init__(self, level)
         self.warnings = 0
@@ -218,9 +216,9 @@
         session = MockResultSession(behave)
         result = session.execute('test_update', ccm.UpdateResult(session))
         #logger.debug(result.output)
-        assert(len(result.output['tasks'])==4, "Number of tasks doesn't match.")
-        assert(len(result.output['modifications'])==4, "Number of modifications doesn't match.")
-        assert(len(result.output['errors'])==1, "Number of errors doesn't match.")
+        assert len(result.output['tasks']) == 4, "Number of tasks doesn't match."
+        assert len(result.output['modifications']) == 4, "Number of modifications doesn't match."
+        assert len(result.output['errors']) == 1, "Number of errors doesn't match."
 
     def test_update_result_serious_failure(self):
         """ Validating UpdateResult with serious failure."""        
@@ -255,10 +253,10 @@
         #logger.debug(len(result.output['errors']))
         #logger.debug(len(result.output['warnings']))
         
-        assert ((len(result.output['tasks'])==0), "Number of tasks doesn't match.")
-        assert ((len(result.output['modifications'])==0), "Number of modifications doesn't match.")
-        assert ((len(result.output['errors'])==3), "Number of errors doesn't match.")
-        assert ((len(result.output['warnings'])==5), "Number of warnings doesn't match.")
+        assert (len(result.output['tasks']) == 0), "Number of tasks doesn't match."
+        assert (len(result.output['modifications']) == 0), "Number of modifications doesn't match."
+        assert (len(result.output['errors']) == 1), "Number of errors doesn't match."
+        assert (len(result.output['warnings']) == 5), "Number of warnings doesn't match."
 
 
     def test_UpdateTemplateInformation_result(self):        
@@ -279,12 +277,12 @@
         session = MockResultSession(behave)
         result = session.execute('test_update', ccm.UpdateTemplateInformation(session))
         #logger.debug(result.output)
-        assert(result.output['baseline_selection_mode']== "Latest Baseline Projects", "BSM doesn't match.")
-        assert(result.output['prep_allowed']== False, "Prep allowed doesn't match.")
-        assert(result.output['version_matching']== "*abs.50*", "Version matching doesn't match.")
-        assert(result.output['release_purpose']== "", "Release purpose doesn't match.")
-        assert(result.output['modifiable_in_database']== "tr1s60", "Modifiable in Database doesn't match.")
-        assert(result.output['in_use_for_release']== True, "In Use For Release doesn't match.")
+        assert result.output['baseline_selection_mode'] == "Latest Baseline Projects", "BSM doesn't match."
+        assert result.output['prep_allowed'] == False, "Prep allowed doesn't match."
+        assert result.output['version_matching'] == "*abs.50*", "Version matching doesn't match."
+        assert result.output['release_purpose'] == "", "Release purpose doesn't match."
+        assert result.output['modifiable_in_database'] == "tr1s60", "Modifiable in Database doesn't match."
+        assert result.output['in_use_for_release'] == True, "In Use For Release doesn't match."
     
     def test_ConflictsResult_result(self):        
         """ Validating ConflictsResult."""                
--- a/buildframework/helium/tools/common/python/lib/test/test_comments.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-#============================================================================ 
-#Name        : test_comments.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-""" Test cases for Comments.py. """
-import unittest
-import comments
-import logging
-import amara
-
-
-class CommentParserTest(unittest.TestCase):
-    """ Test cases for Comments.py. """
-    
-    def setUp(self):
-        # Initialize the sample files into two Comment Parsers.
-        self.parser1 = comments.CommentParser( [r'tests/data/comments_test.txt'], 'branchInfo' )
-        self.parser2 = comments.CommentParser( [r'tests/data/comments_test.cpp', r'tests/data/comments_test.bat',
-                                                r'tests/data/comments_test.h', r'tests/data/comments_test.hrh',
-                                                r'tests/data/comments_test.iby', r'tests/data/comments_test.inf',
-                                                r'tests/data/comments_test.mk', r'tests/data/comments_test.mmp',
-                                                r'tests/data/comments_test.pl', r'tests/data/comments_test.xml',
-                                                r'tests/data/comments_test.py', r'tests/data/comments_test.java',
-                                                r'tests/data/comments_test1.cmd', r'tests/data/comments_test2.cmd'], 'branchInfo' )
-     #   self.parser3 = comments.CommentParser( [r'tests/data/comments_test2.cmd'], 'branchInfo' )
-     
-        
-
-    """ Unit test for method scan() in comments.py. It also tested scan_content by using scan()
-    """
-    def test_scan(self):
-        #doc1 for only one txt file. 
-        doc1 = amara.parse(self.parser1.scan().xml())
-        #doc2 for all other 14 types of files. It also included two types of cmd files.
-        doc2 = amara.parse(self.parser2.scan().xml())
-        
-        # doc1's test verifies all the information the xml comment provides.
-        self.assertEquals(doc1.commentLog.branchInfo.originator, "sanummel")
-        self.assertEquals(doc1.commentLog.branchInfo.category, "")
-        self.assertEquals(doc1.commentLog.branchInfo.since, "07-03-22")
-        self.assertEquals(doc1.commentLog.branchInfo.file, r'tests/data/comments_test.txt')
-        self.assertEquals(doc1.commentLog.branchInfo.error, "kkk")
-        self.assertEquals(str(doc1.commentLog.branchInfo).strip(),"Add rofsfiles for usage in paged images")
-        # s = (str(doc1.commentLog.xml()))
-        # print s
-        # doc2's test only verifies the main comment content.
-        self.assertEquals(str(doc2.commentLog.branchInfo[0]).strip(), "We need TwistOpen and TwistClose to cause display to change between\n landscape and portrait, but SysAp is consuming the key events.  Try\n treating them as Flip events are handled already by SysAp.")
-        self.assertEquals(str(doc2.commentLog.branchInfo[1]).strip(), "Testing if it's good~~~")
-        self.assertEquals(str(doc2.commentLog.branchInfo[2]).strip(), "We need TwistOpen and TwistClose to cause display to change between\n landscape and portrait, but SysAp is consuming the key events.  Try\n treating them as Flip events are handled already by SysAp.")
-        self.assertEquals(str(doc2.commentLog.branchInfo[3]).strip(), "puikko ME SCD DeSW: wk21 Flag fix")
-        self.assertEquals(str(doc2.commentLog.branchInfo[4]).strip(), "Since Catalogs is not compiling at this point, and we are not building it, don't try to\n pull it into the rom.  Also, tfxserver is crashing, so don't build or pull it in either.")
-        self.assertEquals(str(doc2.commentLog.branchInfo[5]).strip(), "Fix target export, which cause issue when cleanexport.")
-        self.assertEquals(str(doc2.commentLog.branchInfo[6]).strip(), "Move command to makmake as EBS does not call abld build")
-        self.assertEquals(str(doc2.commentLog.branchInfo[7]).strip(), "Activate PCFW for Screensaver")
-        self.assertEquals(str(doc2.commentLog.branchInfo[8]).strip(), "Support SPP mechanism for flags support.")
-        self.assertEquals(str(doc2.commentLog.branchInfo[9]).strip(), "Enabling all the HWRM light zones target for product")
-        self.assertEquals(str(doc2.commentLog.branchInfo[10]).strip(), "Again, it is just a test")
-        self.assertEquals(str(doc2.commentLog.branchInfo[11]).strip(), "Test info, so whatever~")
-        self.assertEquals(str(doc2.commentLog.branchInfo[12]).strip(), "k")
-        self.assertEquals(str(doc2.commentLog.branchInfo[13]).strip(), "")
-          
-    
-
--- a/buildframework/helium/tools/common/python/lib/test/test_configuration.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_configuration.py	Wed Dec 23 19:29:07 2009 +0200
@@ -22,8 +22,7 @@
 import unittest
 import os
 import tempfile
-from path import path
-
+import sys
 import configuration
 
 _logger = logging.getLogger('test.configuration')
@@ -32,7 +31,7 @@
 class NestedConfigurationBuilderTest(unittest.TestCase):
     def setUp(self):
         """ Setup. """
-        config_file = open('tests/data/config_test.cfg.xml', 'r')
+        config_file = open(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/config_test.cfg.xml'), 'r')
         self._builder = configuration.NestedConfigurationBuilder(config_file)
         
     def test_config_parsing(self):
@@ -77,8 +76,8 @@
     def test_parent_interpolated_by_child(self):
         """ A child value can be interpolated into a parent template. """
         configs = self._builder.getConfigurations()
-        parent_config = configs[6]
-        child_config = configs[5]
+        parent_config = configs[5]
+        child_config = configs[6]
         assert parent_config['template'] == 'value -> from parent'
         assert child_config['template'] == 'value -> from child'
      
@@ -240,50 +239,45 @@
     """ Test plain text configuration files. """
     def test_text_config(self):
         """ Basic text properties can be read. """
-        config = configuration.PropertiesConfiguration(open('tests/data/ant_config_test.txt', 'r'))
+        config = configuration.PropertiesConfiguration(open(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/ant_config_test.txt'), 'r'))
         
         assert config['text.a'] == 'text.value.A'
         assert config['text.b'] == 'text.value.B'
 
     def test_text_config_store(self):
         """ Basic text properties can be read. """
-        config = configuration.PropertiesConfiguration(open('tests/data/ant_config_test.txt', 'r'))
+        config = configuration.PropertiesConfiguration(open(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/ant_config_test.txt'), 'r'))
 
         config['foo'] = "bar"
         
-        config.store(open('build/test.ini', "w+"))
-        config = configuration.PropertiesConfiguration(open('build/test.ini', 'r'))
+        config.store(open(os.path.join(os.environ['HELIUM_HOME'], 'build/test.ini'), "w+"))
+        config = configuration.PropertiesConfiguration(open(os.path.join(os.environ['HELIUM_HOME'], 'build/test.ini'), 'r'))
         
         assert config['text.a'] == 'text.value.A'
         assert config['text.b'] == 'text.value.B'
         assert config['foo'] == 'bar'
         
         
-        
-class XMLConfigurationTest(unittest.TestCase):
-    """ Test XML format configuration files. """
-    
-    def test_single_node_xml(self):
-        """ Properties can be read from 1 level of XML sub-elements. """
-        config = configuration.XMLConfiguration(open('tests/data/ant_config_test.xml', 'r'))
-        
-        assert config['foo'] == 'bar'
-        assert config['interpolated'] == 'foo value = bar'
+if 'java' not in sys.platform:
+    class XMLConfigurationTest(unittest.TestCase):
+        """ Test XML format configuration files. """
         
-    def test_nested_node_xml(self):
-        """ Properties can be read from multiple levels of XML sub-elements. """
-        config = configuration.XMLConfiguration(open('tests/data/ant_config_test.xml', 'r'))
-        
-        assert config['xml.c'] == 'C'
-        
-    def test_xml_list(self):
-        """ Multiple XML elements can be read as a list. """
-        config = configuration.XMLConfiguration(open('tests/data/ant_config_test.xml', 'r'))
-        
-        assert config['array.value'] == 'one,two,three'
-        
-        
-
-
-
-
+        def test_single_node_xml(self):
+            """ Properties can be read from 1 level of XML sub-elements. """
+            config = configuration.XMLConfiguration(open(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/ant_config_test.xml'), 'r'))
+            
+            assert config['foo'] == 'bar'
+            assert config['interpolated'] == 'foo value = bar'
+            
+        def test_nested_node_xml(self):
+            """ Properties can be read from multiple levels of XML sub-elements. """
+            config = configuration.XMLConfiguration(open(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/ant_config_test.xml'), 'r'))
+            
+            assert config['xml.c'] == 'C'
+            
+        def test_xml_list(self):
+            """ Multiple XML elements can be read as a list. """
+            config = configuration.XMLConfiguration(open(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/ant_config_test.xml'), 'r'))
+            
+            assert config['array.value'] == 'one,two,three'
+        
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/test/test_configuration_model.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,120 +0,0 @@
-#============================================================================ 
-#Name        : test_configuration_model.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-import logging
-import os
-import sys
-import unittest
-import nose
-
-import configuration
-import configuration_model
-
-
-logger = logging.getLogger('test.configuration_model')
-#logging.basicConfig(level=logging.DEBUG)
-
-class GroupDefTest(unittest.TestCase):
-    """ Check config model groups are correctly defined. """
-    
-    def setUp(self):
-        """ Create model. """
-        self.model = configuration_model.DataModel('tests/data/data_model_test.xml')
-        
-    def test_init_model(self):
-        """ Test groups can be created. """
-        assert len(self.model.properties.keys()) == 3
-        assert len(self.model.groups.keys()) == 1
-        
-        prop1 = self.model.properties['test.property.1']
-        assert prop1.description == 'Test property one.'
-        
-        prop2 = self.model.properties['test.property.2']
-        assert prop2.description == 'Test property two.'
-        
-        assert self.model.groups['testGroup'] != None
-
-    def test_property_not_in_model(self):
-        """ Property not in model is identified. """
-        data = {'missing.property': 'foobar', 'test.property.1': '1'}
-        config = configuration.Configuration(data)
-        items = self.model.validate_config(config)
-        
-        assert len(items) == 2
-        assert isinstance(items[0], configuration_model.MissingFromDataModelItem)
-    
-    def test_required_property_in_group_not_defined(self):
-        """ Required property in a group missing from config is identified. """
-        config = configuration.Configuration({'test.property.1': '1', 'test.property.3': '3'})
-        items = self.model.validate_config(config)
-        
-        assert len(items) == 1
-        assert isinstance(items[0], configuration_model.UndefinedRequiredInGroupItem)
- 
-        
-class MissingFromDataModelItemTest(unittest.TestCase):
-    """ Item class operations. """
-    def test_create(self):
-        """ Basic validation item usage. """
-        item = configuration_model.MissingFromDataModelItem('test.property')
-        assert str(item) == 'Property not in data model: test.property'
-        item.log(logger)
-        
-        
-class DataModelTest(unittest.TestCase):
-    """ Checks Data Model is properly defined """
-    
-    def setUp(self):
-        """ Create model. """
-        self.model = configuration_model.DataModel('tests/data/data_model_validation_test.xml')    
-       
-    def test_init_model(self):
-        """ Test groups can be created. """
-        assert len(self.model.properties.keys()) == 3
-        assert len(self.model.groups.keys()) == 1
-        
-        prop1 = self.model.properties['test.property.1']
-        assert prop1.type == 'string'
-        assert prop1.description == 'Test property one.'
-        
-        prop2 = self.model.properties['test.property.2']
-        assert prop2.type == 'string'
-        assert prop2.description == 'Test property two.'
-        
-        assert self.model.groups['testGroup'] != None
-        
-        
-class DataModelPropertyTest(unittest.TestCase):
-    """ Checks Data Model that an exception is thrown if properties are not properly defined """
-    
-    @nose.tools.raises(Exception)
-    def setUp(self):
-        """ Create model. """
-        self.model = configuration_model.DataModel('tests/data/data_model_validation__property_test.xml')
-        
-        
-class DataModelGroupTest(unittest.TestCase):
-    """ Checks Data Model that an exception is thrown if there is a required property in groups is missing"""
-    
-    @nose.tools.raises(Exception)
-    def setUp(self):
-        """ Create model. """
-        self.model = configuration_model.DataModel('tests/data/data_model_validation_group_test.xml')
-        
-             
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/test/test_deltazip.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_deltazip.py	Wed Dec 23 19:29:07 2009 +0200
@@ -21,10 +21,13 @@
 
 """
 
+from __future__ import with_statement
 import unittest
 import delta_zip
 import logging
 import os
+import sys
+import tempfile
 
 class DeltaZipTest( unittest.TestCase ):
     
@@ -48,9 +51,9 @@
         
         sig = delta_zip.MD5SignatureBuilderEBS(self.root, 1, self.output2, '', output)
         sig.write_build_file()
-        
+        if sys.platform == 'win32':
+            assert os.path.splitdrive(self.root)[0] + os.sep not in open(output).read()
         assert os.path.exists(output)
-
     def test_DeltaZipBuilder(self):
         if not os.path.exists(self.output):
             os.mkdir(self.output)
@@ -102,6 +105,19 @@
         delta = delta_zip.DeltaZipBuilder(self.root, self.output, oldmd5output, md5output)
         delta.create_delta_zip(deltazipfile, deletefile, 1, deltaantfile)
 
+    def test_changedFiles(self):
+        dir1 = tempfile.mkdtemp()
+        dir2 = tempfile.mkdtemp()
+        
+        with open(os.path.join(dir1, '1'), 'w') as f1:
+            f1.write('Directory:%s\n' % self.helium_home)
+            f1.write('myfile1 TYPE=unknown format MD5=34dcda0d351c75e4942b55e1b2e2422g')
+        with open(os.path.join(dir2, '2'), 'w') as f2:
+            f2.write('Directory:%s\n' % self.helium_home)
+            f2.write('myfile1 TYPE=unknown format MD5=34dcda0d351c75e4542b55e1b2e2422g')
+        
+        assert delta_zip.changedFiles(dir1, dir2) == [os.path.join(self.helium_home, 'myfile1')]
+
     def tearDown(self):
         """ Restore path """
         os.chdir(self.cwd_backup)
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/test/test_fileutils.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,641 +0,0 @@
-#============================================================================ 
-#Name        : test_fileutils.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-""" Test fileutils module. """
-
-import unittest
-import logging
-import os
-import shutil
-import time
-import sys
-import fileutils
-import archive
-
-_logger = logging.getLogger('test.fileutils')
-
-
-_test_file_paths = [
-    'root_file1.txt',
-    'root_file2.doc',
-    'root_file3_no_extension',
-
-    'dir1/file1.txt',
-    'dir1/file2.doc',
-    'dir1/file3_no_extension',
-    'dir1/subdir1/subdir1_file.txt',
-    'dir1/subdir2/subdir2_file_no_extension',
-    'dir1/subdir3/',
-
-    'dir2/',
-    'dir3/subdir/',
-    
-    'wildcard1.txt',
-    'wildcard2.doc',
-    'wildcard3',
-    'wildcard4/',
-    'wildcard5/file.txt',
-    
-    'dir/emptysubdir1/',
-    'dir/emptysubdir2/',
-    'dir/emptysubdir3/',
-    
-    u'test_unicode/test_\u00e9.txt',
-    u'test_unicode/test_\u00e7.txt',
-    u'test_unicode/test_\u00e4.txt',
-    
-    's60/Distribution.Policy.S60',
-    's60/component_public/Distribution.Policy.S60',
-    's60/component_public/component_public_file.txt',
-    's60/component_private/Distribution.Policy.S60',
-    's60/component_private/component_private_file.txt',
-    's60/missing/to_be_removed_9999.txt',    
-    's60/missing/subdir/Distribution.Policy.S60',
-    's60/missing/subdir/not_to_be_removed_0.txt',    
-    's60/missing/subdir/another_subdir/to_be_removed_9999.txt',    
-    's60/UPPERCASE_MISSING/to_be_removed_9999.txt',
-    's60/UPPERCASE_MISSING/subdir/Distribution.Policy.S60',
-    's60/UPPERCASE_MISSING/subdir/not_to_be_removed_0.txt',
-    's60/UPPERCASE_MISSING/subdir/another_subdir/to_be_removed_9999.txt',
-    's60/not_in_cvs/Distribution.Policy.S60',
-    'test_policies/1/Distribution.Policy.S60',
-    'test_policies/2/Distribution.Policy.S60',
-    'test_policies/3/Distribution.Policy.S60',
-    'test_policies/4/Distribution.Policy.S60',
-    'test_policies/5/Distribution.Policy.S60',
-    'test_policies/6/Distribution.Policy.S60',
-    'test_policies/7/Distribution.Policy.S60',
-    'test_policies/8/Distribution.Policy.S60',
-    'test_policies/9/Distribution.Policy.S60',
-    'symbian/distribution.policy',
-    'symbian/dir1/distribution.policy',
-    'symbian/dir2/distribution.policy',
-    'symbian/dir3/distribution.policy',
-    'symbian/dir4/distribution.policy',
-    'symbian/dir5/distribution.policy',
-    's60src/src-a/distribution.policy',
-    's60src/src-b/distribution.policy',
-    's60src/src-c/distribution.policy',
-
-    'sf/Distribution.Policy.S60',
-    'sf/component_public/Distribution.Policy.S60',
-    'sf/component_public/component_public_file.txt',
-    'sf/component_epl/Distribution.Policy.S60',
-    'sf/component_epl/component_epl_file.txt',
-    'sf/component_sfl/Distribution.Policy.S60',
-    'sf/component_sfl/component_sfl_file.txt',
-    'sf/component_private/Distribution.Policy.S60',
-    'sf/component_private/component_private_file.txt',
-    'sf/missing/to_be_removed_9999.txt',
-    'sf/missing/subdir/Distribution.Policy.S60',
-    'sf/missing/subdir/to_be_removed_9999.txt',
-    'sf/UPPERCASE_MISSING/to_be_removed_9999.txt',
-    'sf/UPPERCASE_MISSING/subdir/Distribution.Policy.S60',
-    'sf/UPPERCASE_MISSING/subdir/to_be_removed_9999.txt',
-    'sf/not_in_cvs/Distribution.Policy.S60',
-    ]
-
-_test_file_content = {
-    's60/Distribution.Policy.S60': '0',
-    's60/missing/subdir/Distribution.Policy.S60' : '0',
-    's60/UPPERCASE_MISSING/subdir/Distribution.Policy.S60': '0',
-    's60/component_public/Distribution.Policy.S60': '0',
-    's60/component_private/Distribution.Policy.S60': '1\r\n',
-    'test_policies/1/Distribution.Policy.S60': '\xFF\xFE\x30\x00\x0D\x00\x0D\x00\x0D\x00\x0A\x00',
-    'test_policies/2/Distribution.Policy.S60': '\xEF\xBB\xBF\x30\x0D\x0D\x0A',
-    'test_policies/3/Distribution.Policy.S60': '0 ; %version: 1 %',
-    'test_policies/4/Distribution.Policy.S60': '10 ; %version: 1 %',
-    'test_policies/5/Distribution.Policy.S60': '10ABC10',
-    'test_policies/6/Distribution.Policy.S60': '10ABC10 ; %version: 1 %',
-    'test_policies/7/Distribution.Policy.S60': '08421A2', # good
-    'test_policies/8/Distribution.Policy.S60': '08421A2 ; %version: 1 %', # bad
-    'test_policies/9/Distribution.Policy.S60': '1110A12', # bad
-    's60/not_in_cvs/Distribution.Policy.S60': '77777',
-    'symbian/distribution.policy': 'Category A',
-    'symbian/dir1/distribution.policy': 'Category B',
-    'symbian/dir2/distribution.policy': 'Line one \r\nAnother one \r\nCategory C',
-    'symbian/dir3/distribution.policy': 'Line one \r\nAnother one \r\nAnother one \r\nCategory D',
-    'symbian/dir4/distribution.policy': 'Line one \r\nAnother one \r\nNo Category',
-    'symbian/dir5/distribution.policy': 'Line one \r\nAnother one \r\nagain no category',
-    's60src/src-a/distribution.policy': 'Category A',
-    's60src/src-b/distribution.policy': 'Category B',
-    's60src/src-c/distribution.policy': 'Category C',
-    'sf/Distribution.Policy.S60': '0',
-    'sf/missing/subdir/Distribution.Policy.S60' : '0',
-    'sf/UPPERCASE_MISSING/subdir/Distribution.Policy.S60': '0',
-    'sf/component_public/Distribution.Policy.S60': '0',
-    'sf/component_sfl/Distribution.Policy.S60': '3',
-    'sf/component_epl/Distribution.Policy.S60': '7',
-    'sf/component_private/Distribution.Policy.S60': '1',
-    }
-    
-""" Used by test_archive. """
-root_test_dir = "build/_test_" + str(time.strftime("%H.%M.%S"))
-    
-def _testpath(subpath):
-    """ Normalised path for test paths. """
-    return os.path.normpath(os.path.join(root_test_dir, subpath))
-    
-def setup_module():
-    """ Setup files test config. 
-    
-    This creates a number of empty files in a temporary directory structure
-    for testing various file selection and archiving operations.
-    """
-    #print 'setup_module()'
-    #print _test_file_content.keys()
-    for child_path in _test_file_paths:
-        path = os.path.join(root_test_dir, child_path)
-        path_dir = path
-        path_dir = os.path.dirname(path)
-        
-        if (not os.path.exists(path_dir)):
-            _logger.debug('Creating dir:  ' + path_dir)
-            os.makedirs(path_dir)
-
-        if(not path.endswith('/') and not path.endswith('\\')):
-            _logger.debug('Creating file: ' + path)
-            handle = open(path, 'w')
-            # Write any file content that is needed
-            if _test_file_content.has_key(child_path):
-                handle.write(_test_file_content[child_path])
-            handle.close()
-
-def teardown_module():
-    """ Teardown test config. """
-    if os.path.exists(root_test_dir):
-        fileutils.rmtree(root_test_dir)
-    
-
-class FileScannerTest(unittest.TestCase):
-    """ Test FileScanner class. """
-    def test_1_scanner_paths(self):
-        """1) String representation of a constructed FileScanner is correct."""
-        scanner = fileutils.FileScanner(_testpath('test'))
-        scanner.add_include('python/')
-        # new implementation of the scanner doesn't convert modify the pattern strings...
-        expected_result = _testpath('test') + ';include:' + os.path.normpath('python/**')
-        assert str(scanner) == expected_result
-
-    def test_2_include_1(self):
-        """Files from root are included, no subdirs."""
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('dir1/*')
-        testpaths = [_testpath('dir1/file1.txt'),
-                     _testpath('dir1/file2.doc'),
-                     _testpath('dir1/file3_no_extension'),
-                     _testpath('dir1/subdir3')]
-        result = []
-        for path in scanner.scan():
-            result.append(path)
-        _logger.debug(result)
-        
-        # sorting the resuts
-        testpaths.sort()
-        result.sort()
-        
-        print result
-        print testpaths
-        assert result == testpaths
-        
-    def test_include_single_file(self):
-        """A single file from root is included."""
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('dir1/file1.txt')
-        testpaths = [_testpath('dir1/file1.txt')]
-        result = []
-        for path in scanner.scan():
-            result.append(path)
-        _logger.debug(result)
-        
-        print result
-        print testpaths
-        assert result == testpaths
-        
-    def test_include_single_file_and_glob_path(self):
-        """A single file from root and a glob path are included."""
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('dir1/file1.txt')
-        scanner.add_include('s60/component_public/')
-        testpaths = [_testpath(u'dir1/file1.txt'),
-                     _testpath(u's60/component_public/Distribution.Policy.S60'),
-                     _testpath(u's60/component_public/component_public_file.txt'),]
-        result = []
-        for path in scanner.scan():
-            result.append(path)
-        
-        if sys.platform == "win32":
-            testpaths = [s.lower() for s in testpaths]
-            result = [s.lower() for s in result]
-        result.sort()
-        testpaths.sort()
-        print result
-        print testpaths
-        assert result == testpaths
-
-    def test_3_include_2(self):
-        """Files and subdirs are included."""
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('dir1/**')
-        testpaths = [_testpath('dir1/file1.txt'),
-                     _testpath('dir1/file2.doc'),
-                     _testpath('dir1/file3_no_extension'),
-                     _testpath('dir1/subdir1/subdir1_file.txt'),
-                     _testpath('dir1/subdir2/subdir2_file_no_extension'),
-                     _testpath('dir1/subdir3')]
-        result = []
-        for path in scanner.scan():
-            result.append(path)
-        _logger.debug(result)
-        result.sort()
-        testpaths.sort()
-        print result
-        print testpaths
-        assert result == testpaths
-
-    def test_4_include_3(self):
-        """Wildcard includes in root."""
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('wild*')
-        testpaths = [_testpath('wildcard1.txt'),
-                     _testpath('wildcard2.doc'),
-                     _testpath('wildcard3'),
-                     _testpath('wildcard4')]
-        result = []
-        for path in scanner.scan():
-            result.append(path)
-        _logger.debug(result)
-        result.sort()
-        testpaths.sort()        
-        print result
-        print testpaths
-        assert result == testpaths
-
-    def test_5_include_4(self):
-        """Include empty dirs."""
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('dir2/')
-        scanner.add_include('dir3/**')
-        testpaths = [_testpath('dir2'),
-                     _testpath('dir3/subdir')]
-        result = []
-        for path in scanner.scan():
-            result.append(path)
-        _logger.debug(result)
-        result.sort()
-        testpaths.sort()        
-        print result
-        print testpaths
-        assert result == testpaths
-
-    def test_6_include_exclude_1(self):
-        """Wildcard excludes."""
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('root*')
-        scanner.add_include('wild*')
-        scanner.add_exclude('root_*')
-        testpaths = [_testpath('wildcard1.txt'),
-                     _testpath('wildcard2.doc'),
-                     _testpath('wildcard3'),
-                     _testpath('wildcard4')]
-        result = []
-        for path in scanner.scan():
-            result.append(path)
-        _logger.debug(result)
-        result.sort()
-        testpaths.sort()
-        
-        print result
-        print testpaths
-        assert result == testpaths
-
-    def test_7_include_exclude_2(self):
-        """Directory can be excluded."""
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('dir1/')
-        scanner.add_exclude('dir1/subdir1/')
-        scanner.add_exclude('dir1/subdir2/')
-        result = []
-        [result.append(path) for path in scanner.scan()]
-        testpaths = [_testpath('dir1/file1.txt'),
-                     _testpath('dir1/file2.doc'),
-                     _testpath('dir1/file3_no_extension'),
-                     _testpath('dir1/subdir3')]                   
-        result.sort()
-        testpaths.sort()
-        
-        print result
-        print testpaths
-        assert result == testpaths
-        
-    def test_8_include_exclude_3(self):
-        """Wildcard exclude."""
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('dir1/')
-        scanner.add_exclude('**/*.doc')
-        scanner.add_exclude('**/*.txt')
-        result = []
-        testpaths = [_testpath('dir1/file3_no_extension'),
-                     _testpath('dir1/subdir2/subdir2_file_no_extension'),
-                     _testpath('dir1/subdir3')]                   
-        [result.append(path) for path in scanner.scan()]
-        result.sort()
-        testpaths.sort()
-        
-        print result
-        print testpaths
-        assert result == testpaths
-
-    def test_case_sensitivity(self):
-        """ Test if returned list has correct case. """
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('s60/UPPERCASE_MISSING/')
-        result = []
-        testpaths = [_testpath('s60/UPPERCASE_MISSING/to_be_removed_9999.txt'),
-                     _testpath('s60/UPPERCASE_MISSING/subdir/Distribution.Policy.S60'),
-                     _testpath('s60/UPPERCASE_MISSING/subdir/not_to_be_removed_0.txt'),
-                     _testpath('s60/UPPERCASE_MISSING/subdir/another_subdir/to_be_removed_9999.txt')
-                     ]                   
-        [result.append(path) for path in scanner.scan()]
-        
-        testpaths.sort()
-        result.sort()
-        print result
-        print testpaths
-        assert result == testpaths
-
-
-    def test_emptydir(self):
-        """Empty dir."""
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('dir/emptysubdir1/')
-        result = []
-        testpaths = [_testpath('dir/emptysubdir1')]                   
-        [result.append(path) for path in scanner.scan()]
-        
-        result.sort()
-        testpaths.sort()
-
-        print result
-        print testpaths
-        assert result == testpaths
-        
-    def test_emptydirs(self):
-        """Empty dirs."""
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('dir/')
-        scanner.add_exclude('dir/emptysubdir3/')
-        result = []
-        testpaths = [_testpath('dir/emptysubdir1'),
-                     _testpath('dir/emptysubdir2')]                   
-        [result.append(path) for path in scanner.scan()]
-        
-        print result
-        print testpaths
-        assert result == testpaths
-        
-    def test_distribution_policy_include(self):
-        """ Distribution policy files can determine file selection - include. """
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('s60/component_public/')
-        selector = archive.selectors.DistributionPolicySelector(['Distribution.policy.s60'], '0')
-        scanner.add_selector(selector)
-        
-        result = []
-        [result.append(path) for path in scanner.scan()]
-        testpaths = [_testpath('s60/component_public/component_public_file.txt'),
-                     _testpath('s60/component_public/distribution.policy.s60')]                   
-        
-        result = [s.lower() for s in result]
-        result.sort()
-        testpaths.sort()
-        print result
-        print testpaths
-        assert result == testpaths
-        
-        
-    def test_distribution_policy_exclude(self):
-        """ Distribution policy files can determine file selection - exclude. """
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('s60/component_private/')
-        selector = archive.selectors.DistributionPolicySelector(['Distribution.policy.s60'], '0')
-        scanner.add_selector(selector)
-        
-        result = []
-        [result.append(path) for path in scanner.scan()]
-        testpaths = []                   
-        
-        assert result == testpaths
-        
-        
-    def test_symbian_distribution_policy_cat_a(self):
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('s60src/src-a/')
-        selector = archive.selectors.SymbianPolicySelector(['distribution.policy'], 'A')
-        scanner.add_selector(selector)
-                
-        result = []
-        [result.append(path) for path in scanner.scan()]
-        testpaths = [_testpath('s60src/src-a/distribution.policy')] 
- 
-        assert result == testpaths
-        
-    def test_symbian_distribution_policy_cat_b(self):        
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('s60src/src-b/')
-        selector = archive.selectors.SymbianPolicySelector(['distribution.policy'], 'B')
-        scanner.add_selector(selector)
-                       
-        result = []
-        [result.append(path) for path in scanner.scan()]
-        testpaths = [_testpath('s60src/src-b/distribution.policy')] 
-              
-        assert result == testpaths     
-        
-    def test_symbian_distribution_policy_cat_not_a_not_b(self):        
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('s60src/src-c/')
-        selector = archive.selectors.SymbianPolicySelector(['distribution.policy'], '!A,!B')
-        scanner.add_selector(selector)
-                       
-        result = []
-        [result.append(path) for path in scanner.scan()]
-                  
-        testpaths = [_testpath('s60src/src-c/distribution.policy')] 
-        
-        assert result == testpaths     
-    
-        
-    def test_find_subroots(self):
-        """ Testing the find_subroots method. """
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('dir/emptysubdir1')
-        scanner.add_include('dir/**/dir')
-        scanner.add_include('foo/**/dir')
-        scanner.add_include('bar/subdir/dir1/**')
-        scanner.add_include('bar/subdir/dir2/**')
-        scanner.add_include('bar/subdir/dir3/x/**')
-        scanner.add_include('bar/subdir/dir3/**')
-        result = scanner.find_subroots()
-        _logger.debug(result)
-        print result              
-        assert result == [_testpath('dir'), _testpath('foo'), 
-                          _testpath('bar/subdir/dir1'), 
-                          _testpath('bar/subdir/dir2'), 
-                          _testpath('bar/subdir/dir3')]
-
-        scanner = fileutils.FileScanner(_testpath(''))
-        scanner.add_include('dir/emptysubdir1')
-        scanner.add_include('**/dir')
-        scanner.add_include('foo/**/dir')
-        result = scanner.find_subroots()
-        _logger.debug(result)              
-        assert result == [_testpath('')]
-
-
-    def test_load_policy_content(self):
-        try:
-            fileutils.load_policy_content(_testpath('test_policies/1/Distribution.Policy.S60'))
-            assert "Should fail while loading 'test_policies/1/Distribution.Policy.S60'."
-        except:
-            pass
-        
-        try:
-            fileutils.load_policy_content(_testpath('s60/Distribution.Policy.S60'))
-        except:
-            assert "Should not fail while loading 's60/Distribution.Policy.S60'."
-
-
-    def assert_policy_file(self, filename, value=None, exception=False):
-        if exception:
-            try:
-                fileutils.read_policy_content(filename)
-                assert "Should fail while loading '%s'." % filename
-            except:
-                pass
-        else:
-            assert fileutils.read_policy_content(filename) == value
-    def assert_symbian_policy_file(self, filename, value=None, exception=False):
-        if exception:
-            try:
-                fileutils.read_symbian_policy_content(filename)
-                assert "Should fail while loading '%s'." % filename
-            except:
-                pass
-        else:
-            assert fileutils.read_symbian_policy_content(filename) == value
-        
-    def test_read_policy_content_strict(self):
-        """ Test policy content using strict rules. """
-
-        self.assert_policy_file(_testpath('s60/Distribution.Policy.S60'), value='0')
-        self.assert_policy_file(_testpath('s60/component_private/Distribution.Policy.S60'), value='1')
-        self.assert_policy_file(_testpath('test_policies/1/Distribution.Policy.S60'), exception=True)
-        self.assert_policy_file(_testpath('test_policies/2/Distribution.Policy.S60'), exception=True)
-        self.assert_policy_file(_testpath('test_policies/3/Distribution.Policy.S60'), exception=True)
-        self.assert_policy_file(_testpath('test_policies/4/Distribution.Policy.S60'), exception=True)
-        self.assert_policy_file(_testpath('test_policies/5/Distribution.Policy.S60'), exception=True)
-        self.assert_policy_file(_testpath('test_policies/6/Distribution.Policy.S60'), exception=True)
-
-    def test_read_policy_content_strict_focalid(self):
-        """ Testing Focal ID support. """
-        self.assert_policy_file(_testpath('test_policies/7/Distribution.Policy.S60'), value='08421A2')
-        self.assert_policy_file(_testpath('test_policies/8/Distribution.Policy.S60'), exception=True)
-        self.assert_policy_file(_testpath('test_policies/9/Distribution.Policy.S60'), exception=True)
-
-    def test_read_symbian_policy_content_strict(self):
-        """ Test symbian policy content using strict rules. """
-
-        self.assert_symbian_policy_file(_testpath('symbian/distribution.policy'), value='A')
-        self.assert_symbian_policy_file(_testpath('symbian/dir1/distribution.policy'), value='B')
-        self.assert_symbian_policy_file(_testpath('symbian/dir2/distribution.policy'), value='C')
-        self.assert_symbian_policy_file(_testpath('symbian/dir3/distribution.policy'), value='D')
-        self.assert_symbian_policy_file(_testpath('symbian/dir4/distribution.policy'), exception=True)
-        self.assert_symbian_policy_file(_testpath('symbian/dir5/distribution.policy'), exception=True)
-
-class TestLongPath(unittest.TestCase):
-
-    long_path = os.path.join(root_test_dir, '01234567890123456789012345678901234567890123456789', 
-                     '01234567890123456789012345678901234567890123456789', '01234567890123456789012345678901234567890123456789',
-                     '01234567890123456789012345678901234567890123456789', '01234567890123456789012345678901234567890123456789')
-    def setUp(self):
-        self.mkdirs(os.path.join(self.long_path, r'dir1'))
-        self.mkdirs(os.path.join(self.long_path, r'dir2'))
-        if not '\\\\?\\' + os.path.abspath((os.path.join( self.long_path, r'foo.txt'))):
-            import win32file
-            win32file.CreateFileW('\\\\?\\' + os.path.abspath(os.path.join(self.long_path, r'foo.txt')), 0, 0, None, win32file.CREATE_NEW, 0, None)
-
-    def mkdirs(self, path):
-        if not os.path.isabs(path):
-            path = os.path.join(os.path.abspath('.'), os.path.normpath(path))
-        if not os.path.exists(os.path.dirname(path)):
-            self.mkdirs(os.path.dirname(path))
-        self.mkdir(path)
-
-    def mkdir(self, path):
-        if not os.path.exists(path):
-            if sys.platform == "win32":
-                try:
-                    import win32file
-                    win32file.CreateDirectoryW('\\\\?\\' + path, None)
-                except:
-                    pass
-            else:
-                os.mkdir(path)
-
-    def test_rmtree_long_path(self):
-        fileutils.rmtree(root_test_dir)
-        assert not os.path.exists(self.long_path)
-        assert not os.path.exists(root_test_dir)
-
-    def test_rmtree_long_path_unc_format(self):
-        if sys.platform == "win32":
-            fileutils.rmtree(u"\\\\?\\" + os.path.join(os.path.abspath('.'), root_test_dir))
-            assert not os.path.exists(self.long_path)
-            assert not os.path.exists(root_test_dir)
-        
-class DestInSrcTest(unittest.TestCase):
-    
-    def test_destinsrc(self):
-        """ Verify that Z:/a/b/c/d is under Z:/a/b/c """
-        src = r"Z:/a/b/c"
-        dst = r"Z:/a/b/c/d"
-        assert fileutils.destinsrc(src, dst) is True
-    
-    def test_destinsrc2(self):
-        """ Verify that Z:/a/b/c/d is not under Z:/a/b/cc """
-        src = r"Z:/a/b/cc"
-        dst = r"Z:/a/b/c/d"
-        assert fileutils.destinsrc(src, dst) is False
-
-    def test_destinsrc_nt(self):
-        """ Verify that Z:/a/b/c/d is under Z:/a/b/C """
-        src = r"Z:/a/b/C"
-        dst = r"Z:/a/b/c/d"
-        if sys.platform == "win32":
-            assert fileutils.destinsrc(src, dst) is True
-        else:
-            assert fileutils.destinsrc(src, dst) is False
-
-    def test_destinsrc2_nt(self):
-        """ Verify that Z:/a/b/c/d is not under Z:/a/b/CC """
-        if sys.platform == "win32":
-            src = r"Z:/a/b/CC"
-            dst = r"Z:/a/b/c/d"
-            assert fileutils.destinsrc(src, dst) is False
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_filter_heliumlog.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,256 @@
+#============================================================================ 
+#Name        : test_filter_heliumlog.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for filter meta data logs.
+
+"""
+
+# pylint: disable-msg=E1101
+
+import logging
+import os
+import sys
+import time
+import mocker
+import re
+import tempfile
+import shutil
+
+_logger = logging.getLogger('test.test_filter_heliumlog')
+
+TEMP_PATH = tempfile.mkdtemp()
+#NOTE: THE COMMENTED OUT CODE IS REQUIRED WHEN RUNNING THIS TEST USING THE PT TARGET
+#WITH THE COMMENTED OUT CODE IT DOES NOT WORK IN THE FULL UNITTEST TARGET DUE TO RAPTOR.PY
+#FILE BEING CALLED WITHOUT ALL THE ENVIRONMENT VARIABLES SET WHEN RUN SINGLY AND THEY ARE SET WHEN
+#RUN AS PART OF THE UNITTEST TARGET.
+
+PYTHON_FILE_NAME = os.path.join(TEMP_PATH, 'raptor.py')
+FILTER_FILE_NAME = os.path.join(TEMP_PATH, 'filter_interface.py')
+
+sys.path = [TEMP_PATH] + sys.path
+print "temp path is %s " % TEMP_PATH
+
+def setup_module():
+    """ Setup for test_filter_metadata """
+    #in order to allow the filter_metadata.py file to compile we need to create a dummy 
+    #raptor.py file as this is part of SBS and not present here, the classes and objects 
+    #it uses from raptor.py file are created in this file, the same goes for the file filter_interface.py
+
+    #does not exist so create empty python.py file
+    f_handle = open(PYTHON_FILE_NAME, "w")
+    f_handle.write("class testRaptor():\n")
+    f_handle.write("    def testRaptorFunc(self):\n")
+    f_handle.write("        return True \n")
+    f_handle.close()
+
+    #does not exist so create empty python.py file
+    f_handle = open(FILTER_FILE_NAME, "w")
+    f_handle.write("class Filter():\n")
+    f_handle.write("    def testFilterFunc(self):\n")
+    f_handle.write("        return True \n")
+    f_handle.close()
+
+
+def teardown_module():
+    """ Teardown test_filter_metadata. """
+    if os.path.exists(TEMP_PATH):
+        shutil.rmtree(TEMP_PATH)
+
+# regex for "bare" drive letters  
+DRIVERE = re.compile('^[A-Za-z]:$')
+
+# are we on windows, and if so what is the current drive letter
+ISWIN = sys.platform.lower().startswith("win")
+if ISWIN:
+    DRIVE = re.match('^([A-Za-z]:)', os.getcwd()).group(0)
+
+# Base class
+class Path(object):
+    """This class represents a file path.                                      
+                                                                               
+    A generic path object supports operations without needing to know          
+    about Windows and Linux differences. The standard str() function can       
+    obtain a string version of the path in Local format for use by             
+    platform-specific functions (file opening for example).                    
+                                                                               
+    We use forward slashes as path separators (even on Windows).               
+                                                                               
+    For example,                                                               
+                                                                               
+      path1 = generic_path.Path("/foo")                                        
+      path2 = generic_path.Path("bar", "bing.bang")                            
+                                                                               
+      print str(path1.Append(path2))                                           
+                                                                               
+    Prints /foo/bar/bing.bang   on Linux                                       
+    Prints c:/foo/bar/bing.bang   on Windows (if c is the current drive)       
+    """                                                                        
+
+    def __init__(self, *arguments):
+        """construct a path from a list of path elements"""
+        
+        if len(arguments) == 0:
+            self.path = ""
+            return
+        
+        list = []
+        for i, arg in enumerate(arguments):
+            if ISWIN:
+                if i == 0:
+                    # If the first element starts with \ or / then we will
+                    # add the current drive letter to make a fully absolute path
+                    if arg.startswith("\\\\"):
+                        list.append(arg) # A UNC path - don't mess with it
+                    elif arg.startswith("\\") or arg.startswith("/"):
+                        list.append(DRIVE + arg)
+                    # If the first element is a bare drive then dress it with a \
+                    # temporarily otherwise "join" will not work properly.
+                    elif DRIVERE.match(arg):
+                        list.append(arg + "\\")
+                    # nothing special about the first element
+                    else:
+                        list.append(arg)
+                else:
+                    if arg.startswith("\\\\"):
+                        raise ValueError("non-initial path components must not start with \\\\ : %s" % arg)
+                    else:
+                        list.append(arg)
+                if ";" in arg:
+                    raise ValueError("An individual windows Path may not contain ';' : %s" % arg)
+            else:
+                list.append(arg)
+      
+        self.path = os.path.join(*list)
+        
+        # normalise to avoid nastiness with dots and multiple separators
+        # but do not normalise "" as it will become "."
+        if self.path != "":
+            self.path = os.path.normpath(self.path)
+        
+        # always use forward slashes as separators
+        self.path = self.path.replace("\\", "/")
+        
+        # remove trailing slashes unless we are just /
+        if self.path != "/":
+            self.path = self.path.rstrip("/")
+
+    def Dir(self):
+        "return an object for the directory part of this path"
+        if DRIVERE.match(self.path):
+            return Path(self.path)
+        else:
+            return Path(os.path.dirname(self.path))
+    def __str__(self):
+        return self.path
+
+
+class Raptor(object):
+    """An instance of a running Raptor program.
+
+    When operated from the command-line there is a single Raptor object
+    created by the Main function. When operated by an IDE several Raptor
+    objects may be created and operated at the same time."""
+
+    def defaultSetUp(self):
+        """ setup some variables for use by the unit under test """
+        self.logFile = None #self.mocker.proxy(generic_path.Join)
+        self.summary = True
+        # things to initialise
+        self.starttime = time.time()
+        self.timestring = time.strftime("%Y-%m-%d-%H-%M-%S")
+        self.logFileName = Path(os.path.join(TEMP_PATH, 'makefile_2009-11-12-12-32-34.log'))
+
+class FilterHeliumLogTest(mocker.MockerTestCase):
+    """ Tests the filter_heliumLog wrapper to the SBS plugin. 
+    The plugin uses the SBS API of open, write, summary and close. """
+
+#    def test_a_setupOK(self):       #need to call it this to get it executed in the right order (alphabetical)
+#        """test_a_setupOK: tests that we have imported the correct files and that they are present 
+#        before importing the file to be tested and having it fail due to missing files"""
+#        import filter_heliumlog
+#        #setup an instance of the class and test it exists OK
+#        obj = filter_heliumlog.raptor.testRaptor()
+#        result = obj.testRaptorFunc()
+#        assert result == True
+#        obj = filter_heliumlog.filter_interface.Filter()
+#        result = obj.testFilterFunc()
+#        assert result == True
+
+    def test_openWriteSummaryCloseInvalidData(self):
+        """test_openWriteSummaryCloseInvalidData: test the opening writing, summary and 
+        closing of the log file with invalid data."""
+        import filter_heliumlog
+        obj = self.mocker.patch(filter_heliumlog.SBSScanlog)
+        obj.initialize(mocker.ANY)
+        self.mocker.result(False)
+        self.mocker.replay()
+        
+        raptor_instance = Raptor()
+        raptor_instance.defaultSetUp()
+        raptor_instance.logFileName = Path("..")
+        filter_HLog = filter_heliumlog.FilterHeliumLog()
+        result = filter_HLog.open(raptor_instance)
+        assert result == False
+        result = filter_HLog.close()
+        assert result == False
+
+    def test_openValidData_default(self):
+        """test_openValidData_default: test the opening of the log file with valid data."""
+        import filter_heliumlog
+        obj = self.mocker.patch(filter_heliumlog.SBSScanlog)
+        obj.initialize(mocker.ANY)
+        self.mocker.result(True)
+        self.mocker.replay()
+        
+        raptor_instance = Raptor()
+        raptor_instance.defaultSetUp()
+        filter_HLog = filter_heliumlog.FilterHeliumLog()
+        result = filter_HLog.open(raptor_instance)
+        assert result == True
+
+    def test_openValidData_empty(self):
+        """test_openValidData_empty: test the opening of the log file with valid data."""
+        import filter_heliumlog
+        obj = self.mocker.patch(filter_heliumlog.SBSScanlog)
+        obj.initialize(mocker.ANY)
+        self.mocker.result(True)
+        self.mocker.replay()
+        
+        raptor_instance = Raptor()
+        raptor_instance.defaultSetUp()
+        raptor_instance.logFileName = Path("")
+        filter_HLog = filter_heliumlog.FilterHeliumLog()
+        result = filter_HLog.open(raptor_instance)
+        assert result == True
+
+    def test_openValidData_stdout(self):
+        """test_openValidData_stdout: test the opening of the log file with valid data."""
+        import filter_heliumlog
+        obj = self.mocker.patch(filter_heliumlog.SBSScanlog)
+        obj.initialize(mocker.ANY)
+        self.mocker.count(0, 0)
+        self.mocker.replay()
+        
+        raptor_instance = Raptor()
+        raptor_instance.defaultSetUp()
+        raptor_instance.logFileName = None
+        filter_HLog = filter_heliumlog.FilterHeliumLog()
+        result = filter_HLog.open(raptor_instance)
+        assert result == True
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_filter_metadatalog.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,257 @@
+#============================================================================ 
+#Name        : test_filter_metadatalog.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test cases for filter meta data logs.
+
+"""
+
+# pylint: disable-msg=E1101
+
+import logging
+import os
+import sys
+import time
+import mocker
+import re
+import tempfile
+import shutil
+
+_logger = logging.getLogger('test.test_filter_metadatalog')
+logging.basicConfig(level=logging.DEBUG)
+
+TEMP_PATH = tempfile.mkdtemp()
+#NOTE: THE COMMENTED OUT CODE IS REQUIRED WHEN RUNNING THIS TEST USING THE PT TARGET
+#WITH THE COMMENTED OUT CODE IT DOES NOT WORK IN THE FULL UNITTEST TARGET DUE TO RAPTOR.PY
+#FILE BEING CALLED WITHOUT ALL THE ENVIRONMENT VARIABLES SET WHEN RUN SINGLY AND THEY ARE SET WHEN
+#RUN AS PART OF THE UNITTEST TARGET.
+
+PYTHON_FILE_NAME = os.path.join(TEMP_PATH, 'raptor.py')
+FILTER_FILE_NAME = os.path.join(TEMP_PATH, 'filter_interface.py')
+
+sys.path = [TEMP_PATH] + sys.path
+
+def setup_module():
+    """ Setup for test_filter_metadata """
+    #in order to allow the filter_metadata.py file to compile we need to create a dummy 
+    #raptor.py file as this is part of SBS and not present here, the classes and objects 
+    #it uses from raptor.py file are created in this file, the same goes for the file filter_interface.py
+    #does not exist so create empty python.py file
+    f_handle = open(PYTHON_FILE_NAME, "w")
+    f_handle.write("class testRaptor():\n")
+    f_handle.write("    def testRaptorFunc(self):\n")
+    f_handle.write("        return True \n")
+    f_handle.close()
+    #does not exist so create empty python.py file
+    f_handle = open(FILTER_FILE_NAME, "w")
+    f_handle.write("class Filter():\n")
+    f_handle.write("    def testFilterFunc(self):\n")
+    f_handle.write("        return True \n")
+    f_handle.close()
+
+
+def teardown_module():
+    """ Teardown test_filter_metadata. """
+    print("teardown called")
+    if os.path.exists(TEMP_PATH):
+        shutil.rmtree(TEMP_PATH)
+
+# regex for "bare" drive letters  
+DRIVERE = re.compile('^[A-Za-z]:$')
+
+# are we on windows, and if so what is the current drive letter
+ISWIN = sys.platform.lower().startswith("win")
+if ISWIN:
+    DRIVE = re.match('^([A-Za-z]:)', os.getcwd()).group(0)
+
+# Base class
+class Path(object):
+    """This class represents a file path.                                      
+                                                                               
+    A generic path object supports operations without needing to know          
+    about Windows and Linux differences. The standard str() function can       
+    obtain a string version of the path in Local format for use by             
+    platform-specific functions (file opening for example).                    
+                                                                               
+    We use forward slashes as path separators (even on Windows).               
+                                                                               
+    For example,                                                               
+                                                                               
+      path1 = generic_path.Path("/foo")                                        
+      path2 = generic_path.Path("bar", "bing.bang")                            
+                                                                               
+      print str(path1.Append(path2))                                           
+                                                                               
+    Prints /foo/bar/bing.bang   on Linux                                       
+    Prints c:/foo/bar/bing.bang   on Windows (if c is the current drive)       
+    """                                                                        
+
+    def __init__(self, *arguments):
+        """construct a path from a list of path elements"""
+        
+        if len(arguments) == 0:
+            self.path = ""
+            return
+        
+        list = []
+        for i, arg in enumerate(arguments):
+            if ISWIN:
+                if i == 0:
+                    # If the first element starts with \ or / then we will
+                    # add the current drive letter to make a fully absolute path
+                    if arg.startswith("\\\\"):
+                        list.append(arg) # A UNC path - don't mess with it
+                    elif arg.startswith("\\") or arg.startswith("/"):
+                        list.append(DRIVE + arg)
+                    # If the first element is a bare drive then dress it with a \
+                    # temporarily otherwise "join" will not work properly.
+                    elif DRIVERE.match(arg):
+                        list.append(arg + "\\")
+                    # nothing special about the first element
+                    else:
+                        list.append(arg)
+                else:
+                    if arg.startswith("\\\\"):
+                        raise ValueError("non-initial path components must not start with \\\\ : %s" % arg)
+                    else:
+                        list.append(arg)
+                if ";" in arg:
+                    raise ValueError("An individual windows Path may not contain ';' : %s" % arg)
+            else:
+                list.append(arg)
+      
+        self.path = os.path.join(*list)
+        
+        # normalise to avoid nastiness with dots and multiple separators
+        # but do not normalise "" as it will become "."
+        if self.path != "":
+            self.path = os.path.normpath(self.path)
+        
+        # always use forward slashes as separators
+        self.path = self.path.replace("\\", "/")
+        
+        # remove trailing slashes unless we are just /
+        if self.path != "/":
+            self.path = self.path.rstrip("/")
+
+    def Dir(self):
+        "return an object for the directory part of this path"
+        if DRIVERE.match(self.path):
+            return Path(self.path)
+        else:
+            return Path(os.path.dirname(self.path))
+    def __str__(self):
+        return self.path
+
+
+class Raptor(object):
+    """An instance of a running Raptor program.
+
+    When operated from the command-line there is a single Raptor object
+    created by the Main function. When operated by an IDE several Raptor
+    objects may be created and operated at the same time."""
+
+    def defaultSetUp(self):
+        """ setup some variables for use by the unit under test """
+        self.logFile = None #self.mocker.proxy(generic_path.Join)
+        self.summary = True
+        # things to initialise
+        self.starttime = time.time()
+        self.timestring = time.strftime("%Y-%m-%d-%H-%M-%S")
+        self.logFileName = Path(os.path.join(TEMP_PATH, 'makefile_2009-11-12-12-32-34.log'))
+
+class FilterMetaDataLogTest(mocker.MockerTestCase):
+    """ Tests the filter_metadataLog wrapper to the SBS plugin. 
+    The plugin uses the SBS API of open, write, summary and close. """
+
+#    def test_a_setupOK(self):       #need to call it this to get it executed in the right order (alphabetical)
+#        """test_a_setupOK: tests that we have imported the correct files and that they are present 
+#        before importing the file to be tested and having it fail due to missing files"""
+#        print("got to test-a-setup ")
+#        import filter_metadatalog
+#        print("got passed import filter file to test-a-setup ")
+#        #setup an instance of the class and test it exists OK
+#        obj = filter_metadatalog.raptor.testRaptor()
+#        result = obj.testRaptorFunc()
+#        assert result == True
+#        obj = filter_metadatalog.filter_interface.Filter()
+#        result = obj.testFilterFunc()
+#        assert result == True
+
+    def test_openWriteSummaryCloseInvalidData(self):
+        """test_openWriteSummaryCloseInvalidData: test the opening writing, summary and 
+        closing of the log file with invalid data."""
+        import filter_metadatalog
+        obj = self.mocker.patch(filter_metadatalog.SBSScanlogMetadata)
+        obj.initialize(mocker.ANY)
+        self.mocker.result(False)
+        self.mocker.replay()
+        
+        raptor_instance = Raptor()
+        raptor_instance.defaultSetUp()
+        raptor_instance.logFileName = Path("..")
+        filter_mLog = filter_metadatalog.FilterMetadataLog()
+        result = filter_mLog.open(raptor_instance)
+        assert result == False
+        result = filter_mLog.close()
+        assert result == False
+
+    def test_openValidData_default(self):
+        """test_openValidData_default: test the opening of the log file with valid data."""
+        import filter_metadatalog
+        obj = self.mocker.patch(filter_metadatalog.SBSScanlogMetadata)
+        obj.initialize(mocker.ANY)
+        self.mocker.result(True)
+        self.mocker.replay()
+        
+        raptor_instance = Raptor()
+        raptor_instance.defaultSetUp()
+        filter_mLog = filter_metadatalog.FilterMetadataLog()
+        result = filter_mLog.open(raptor_instance)
+        assert result == True
+
+    def test_openValidData_empty(self):
+        """test_openValidData_empty: test the opening of the log file with valid data."""
+        import filter_metadatalog
+        obj = self.mocker.patch(filter_metadatalog.SBSScanlogMetadata)
+        obj.initialize(mocker.ANY)
+        self.mocker.result(True)
+        self.mocker.replay()
+        
+        raptor_instance = Raptor()
+        raptor_instance.defaultSetUp()
+        raptor_instance.logFileName = Path("")
+        filter_mLog = filter_metadatalog.FilterMetadataLog()
+        result = filter_mLog.open(raptor_instance)
+        assert result == True
+
+    def test_openValidData_stdout(self):
+        """test_openValidData_stdout: test the opening of the log file with valid data."""
+        import filter_metadatalog
+        obj = self.mocker.patch(filter_metadatalog.SBSScanlogMetadata)
+        obj.initialize(mocker.ANY)
+        self.mocker.count(0, 0)
+        self.mocker.replay()
+        
+        raptor_instance = Raptor()
+        raptor_instance.defaultSetUp()
+        raptor_instance.logFileName = None
+        filter_mLog = filter_metadatalog.FilterMetadataLog()
+        result = filter_mLog.open(raptor_instance)
+        assert result == True
+
--- a/buildframework/helium/tools/common/python/lib/test/test_freedisk.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_freedisk.py	Wed Dec 23 19:29:07 2009 +0200
@@ -26,6 +26,13 @@
 import os, string
 import sys
 
+class FreeDiskTest(unittest.TestCase):
+        
+    def test_freedisk(self):
+        sys.path.append(os.path.join(os.environ['HELIUM_HOME'], 'tools/preparation'))
+        import freedisk
+        freedisk.print_space_report(os.environ['HELIUM_HOME'], 1)
+
 if sys.platform == "win32":
     from win32api import GetLogicalDriveStrings
     
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_ido.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,30 @@
+#============================================================================ 
+#Name        : test_ido.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import unittest
+import ido
+import logging
+
+_logger = logging.getLogger('test.ido')
+logging.basicConfig(level=logging.INFO)
+
+class IDOTest(unittest.TestCase):
+        
+    def test_ido(self):
+        ido.is_in_interval(1, '01:02', 2, '02:03')
\ No newline at end of file
--- a/buildframework/helium/tools/common/python/lib/test/test_iqrf.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-#============================================================================ 
-#Name        : test_iqrf.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-""" Test cases for iqrf module. """
-import unittest
-import os
-import imaker.iqrf
-
-
-class Test_iQRF(unittest.TestCase):
-    """ Test for iQRF data access. """
-    
-    def test_file_parsing_5250(self):
-        """ Testing if the iqrf module is able to load the 5250 configuration. """
-        root = imaker.iqrf.load(os.path.join(os.environ['HELIUM_HOME'], "tests/data/iqrf/imaker_5250.xml"))        
-        assert root.result != None
-        assert len(root.result.targets) == 228
-        assert len(root.result.interfaces) == 1
-        assert len(root.result.configurations) == 6
-        
-        # testing a configurations
-        assert root.result.configurations[0].name == "image_conf_product52.mk"
-        assert root.result.configurations[0].filePath == r"\epoc32\rom\config\platform\product52\image_conf_product52.mk"
-        assert len(root.result.configurations[0].targetrefs) == 38
-        assert root.result.configurations[0].targetrefs[0].name == "all"
-        
-        # testing interfaces
-        print "root.result.configurations[0].filePath: %s" % root.result.configurations[0].filePath
-        assert len(root.result.interfaces[0].configurationElements) == 516
--- a/buildframework/helium/tools/common/python/lib/test/test_logger.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-#============================================================================ 
-#Name        : test_logger.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-import logging
-import os
-import unittest
-
-import helium.logger
-import helium.outputer
-
-
-# Uncomment this line to enable logging in this module, or configure logging elsewhere
-#logging.basicConfig(level=logging.DEBUG)
-logger = logging.getLogger('test.helium.logger')
-
-
-class TestHeliumLogger(unittest.TestCase):
-            
-    def test_mc_logger_xml_generation(self):
-        """ Test simple XML logging generation. """
-        mclogger = helium.logger.Logger()
-        mclogger.SetInterface("http://fawww.europe.company.com/isis/isis_interface/")
-        mclogger.SetTitle("Validate Overlay")
-        mclogger.SetSubTitle("Validating: ")
-        mclogger.OpenMainContent("test")
-        mclogger.PrintRaw("<a href=\"google.com\">test</a>")
-        mclogger.Print("test")
-        mclogger.Print(u"\u00A9")
-        mclogger.error("test")
-        mclogger.CloseMainContent()
-        mclogger.OpenMainContent("test2")
-        mclogger.OpenEvent("test2")
-        mclogger.Print("test2")
-        mclogger.error("test2")
-        mclogger.CloseEvent()
-        mclogger.CloseMainContent()
-        mclogger.WriteToFile('log.xml')
-        
-        logger.info(mclogger)
-        
-        os.unlink('log.xml')
-        
-        #out = helium.outputer.XML2XHTML("log.xml")
-        #out.generate()
-        #out.WriteToFile("log.html")
-
-    def test_helium_logger_unicode_handling(self):
-        """ Test simple XML logging generation with unicode handling. """
-        mclogger = helium.logger.Logger()
-        mclogger.SetInterface("http://fawww.europe.company.com/isis/isis_interface/")
-        mclogger.SetTitle("Validate Overlay")
-        mclogger.SetSubTitle("Validating: ")
-        mclogger.OpenMainContent("test")
-        mclogger.Print(u"Test unicode handling: \u00A9")
-        mclogger.CloseMainContent()
-        mclogger.WriteToFile('log.xml')
-        
-        logger.info(mclogger)
-        
-        os.unlink('log.xml')
-
-    def test_helium_logger_outputer(self):
-        """ Test simple XML logging generation with unicode handling and XHTML generation. """
-        mclogger = helium.logger.Logger()
-        mclogger.SetInterface("http://fawww.europe.company.com/isis/isis_interface/")
-        mclogger.SetTitle("Validate Overlay")
-        mclogger.SetSubTitle("Validating: ")
-        mclogger.OpenMainContent("test")
-        mclogger.Print(u"Test unicode handling: \u00A9")
-        mclogger.CloseMainContent()
-        mclogger.WriteToFile('log.xml')
-        
-        logger.info(mclogger)
-        
-        out = helium.outputer.XML2XHTML('log.xml')
-        out.generate()
-        out.WriteToFile('log.html')
-        
-        os.unlink('log.xml')
-        os.unlink('log.html')
-
-
-if __name__ == '__main__':
-    unittest.main()
--- a/buildframework/helium/tools/common/python/lib/test/test_parsers.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,689 +0,0 @@
-# -*- encoding: latin-1 -*-
-
-#============================================================================ 
-#Name        : test_parsers.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-import os
-import sys
-import tempfile
-import mocker
-from path import path
-import StringIO
-
-import ats3.parsers
-import ats3.testconfigurator
-
-import logging
-logging.getLogger().setLevel(logging.ERROR)
-
-TSRC_DIR = None
-
-def setup_module():
-    """Setup the test environment. The testing of the test parser script requires spesific
-    structure to be available with bld.inf files (with the content written into those)."""
-    global TSRC_DIR
-    TSRC_DIR = path(tempfile.mkdtemp()).normpath()
-    test_component = TSRC_DIR
-    for path_parts in (("tsrc", "group"),
-                       ("tsrc", "tc1", "group"),
-                       ("tsrc", "tc1", "data"),
-                       ("tsrc", "tc1", "dependent_1", "group"),
-                       ("tsrc", "tc1", "dependent_2", "group"),
-                       ("tsrc", "tc1", "subtest", "group"),
-                       ("tsrc", "tc1", "subtest", "data"),
-                       ("tsrc", "tc1", "subtest", "if_test", "group"),
-                       ("tsrc", "tc2", "group"),
-                       ("tsrc", "tc2", "data"),
-                       ("tsrc", "tc3", "group"),
-                       ("tsrc", "tc3", "data"),
-                       ("tmp", "macros"),
-                       ):
-        filepath = path.joinpath(test_component, *path_parts).normpath()
-        if not filepath.exists():
-            os.makedirs(filepath)
-    
-        
-    tsrc = open(path.joinpath(TSRC_DIR, "tsrc", "group", "bld.inf"), 'w')
-    tsrc.write(
-            r"""
-#include "../tc1/group/bld.inf"
-#include "../tc2/group/bld.inf"
-#include "../tc3/group/bld.inf" 
-
-PRJ_TESTMMPFILES
-
-            """)
-    tsrc.close()
-    
-    tc1 = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "group", "bld.inf"), 'w')
-    tc1.write(
-            r"""
-#include "../dependent_1/group/bld.inf"
-#include "../dependent_2/group/bld.inf"
-#include "../subtest/group/bld.inf"
-
-PRJ_TESTMMPFILES
-tc1.mmp
-
-PRJ_MMPFILES
-not_included.mmp
-            """)
-    tc1.close()
-    
-    tc1_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "group", "tc1.mmp"), 'w')
-    tc1_mmp.write(
-            r"""
-TARGET          tc1.dll
-TARGETTYPE      dll
-LIBRARY         stiftestinterface.lib
-LIBRARY         user.lib
-            """)
-    tc1_mmp.close()
-    
-    tc1_sub = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "subtest", "group", "bld.inf"), "w")
-    tc1_sub.write(
-            r"""
-PRJ_TESTMMPFILES
-sub_test.mmp    
-#ifndef RD_TEST1
-#include "../if_test/group/bld.inf"
-#endif
-            """)
-    tc1_sub.close()
-    tc1_sub_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "subtest", "group", "sub_test.mmp"), 'w')
-    tc1_sub_mmp.write(
-            r"""
-TARGET          sub_test.dll
-TARGETTYPE      dll
-LIBRARY         stiftestinterface.lib
-            """)
-    tc1_sub_mmp.close()
-
-    
-    tc1_if = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "subtest", "if_test", "group", "bld.inf"), "w")
-    tc1_if.write(
-            r"""
-PRJ_TESTMMPFILES
-if_test.mmp
-            """)
-    tc1_if.close()
-    tc1_if_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "subtest", "if_test", "group", "if_test.mmp"), 'w')
-    tc1_if_mmp.write(
-            r"""
-TARGET          tc1_if.dll
-TARGETTYPE      dll
-LIBRARY         stifunit.lib
-            """)
-    tc1_if_mmp.close()
-
-    tc1_dep1 = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "dependent_1", "group", "bld.inf"), "w")
-    tc1_dep1.write(
-            r"""
-PRJ_TESTMMPFILES
-dependent_1.mmp
-onemore.mmp
-            """)
-    tc1_dep1.close()
-
-    tc1_dep1_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "dependent_1", "group", "dependent_1.mmp"), 'w')
-    tc1_dep1_mmp.write(
-            r"""
-TARGET          dependent_1.dll
-TARGETTYPE      PLUGIN
-            """)
-    tc1_dep1_mmp.close()
-        
-    tc1_dep2 = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "dependent_2", "group", "bld.inf"), "w")
-    tc1_dep2.write(
-            r"""
-PRJ_TESTMMPFILES
-dependent_2.mmp
-            """)
-    tc1_dep2.close()
-    
-    tc1_dep2_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "dependent_2", "group", "dependent_2.mmp"), 'w')
-    tc1_dep2_mmp.write(
-            r"""
-TARGET          dependent_2.dll
-TARGETTYPE      PLUGIN
-            """)
-    tc1_dep2_mmp.close()
-    
-    tc1_pkg = open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "group", "tc1.pkg"), 'w')
-    tc1_pkg.write(
-                  r"""
-;Language - standard language definitions
-&EN
-
-; standard SIS file header
-#{"BTEngTestApp"},(0x04DA27D5),1,0,0
-
-;Supports Series 60 v 3.0
-(0x101F7961), 0, 0, 0, {"Series60ProductID"}
-
-;Localized Vendor Name
-%{"BTEngTestApp"}
-
-;Unique Vendor name
-:"Nokia"
-
-; Files to copy
-"..\data\file1.dll"-"c:\sys\bin\file1.dll"
-"..\data\file1.txt"-"e:\sys\bin\file1.txt" , FF   ; FF stands for Normal file
-"..\data\file2.mp3"-"e:\sys\bin\file2.mp3"
-"..\data\TestFramework.ini"-"c:\sys\bin\TestFramework.ini"
-;"..\xyz\TestFramework.ini"-"!:\sys\bin\TestFramework.ini" (commented line)
-"../data/temp.ini"-"!:/sys/bin/temp.ini" , FF ; "something here"
-"..\data\tc1.cfg"-"e:\sys\bin\tc1.cfg"
-"..\data\tc1.sisx"-"e:\sys\bin\tc1.sisx"
-"..\data\DUMP.xyz"-"e:\sys\bin\DUMP.xyz"
-
-            
-        """.replace('\\', os.sep))
-    tc1_pkg.close()
-    
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "file1.dll"), 'w').close()
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "file1.txt"), 'w').close()
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "file2.mp3"), 'w').close()
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "TestFramework.ini"), 'w').close()
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "temp.ini"), 'w').close()
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc1", "data", "DUMP.xyz"), 'w').close()
-    
-    tc2 = open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "group", "bld.inf"), "w")
-    tc2.write(
-            r"""
-PRJ_TESTMMPFILES
-tc2.mmp
-            """)
-    tc2.close()
-    tc2_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "group", "tc2.mmp"), 'w')
-    tc2_mmp.write(
-            r"""
-TARGET          tc2.dll
-TARGETTYPE      dll
-LIBRARY         EUnit.lib
-            """)
-    tc2_mmp.close()
-    
-    tc2_pkg = open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "group", "tc2.pkg"), 'w')
-    tc2_pkg.write(
-                  r"""
-;Language - standard language definitions
-&EN
-
-; standard SIS file header
-#{"BTEngTestApp"},(0x04DA27D5),1,0,0
-
-;Supports Series 60 v 3.0
-(0x101F7961), 0, 0, 0, {"Series60ProductID"}
-
-;Localized Vendor Name
-%{"BTEngTestApp"}
-
-;Unique Vendor name
-:"Nokia"
-
-; Files to copy
-"..\data\file1.dll"-"c:\sys\bin\file1.dll"
-"..\data\file1.txt"-"e:\sys\bin\file1.txt"
-"..\data\file2.mp3"-"e:\sys\bin\file2.mp3"
-"..\data\TestFramework.ini"-"!:\sys\bin\TestFramework.ini" , FF   ; FF stands for Normal file
-"..\data\tc2.cfg"-"!:\sys\bin\tc2.cfg"
-        """.replace('\\', os.sep))
-    tc2_pkg.close()
-    
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "data", "file1.dll"), 'w').close()
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "data", "file1.txt"), 'w').close()
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "data", "file2.mp3"), 'w').close()
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "data", "TestFramework.ini"), 'w').close()
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "data", "tc2.cfg"), 'w').close()
-
-    
-    tc3 = open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "group", "bld.inf"), "w")
-    tc3.write(
-            r"""
-PRJ_TESTMMPFILES
-tc3.mmp
-            """)
-    tc3.close()
-    tc3_mmp = open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "group", "tc3.mmp"), 'w')
-    tc3_mmp.write(
-            r"""
-TARGET          tc3.dll
-TARGETTYPE      dll
-LIBRARY         EUnit.lib
-            """)
-    tc3_mmp.close()
-    
-    tc3_pkg = open(path.joinpath(TSRC_DIR, "tsrc", "tc2", "group", "tc2.pkg"), 'w')
-    tc3_pkg.write(
-                  r"""
-;Language - standard language definitions
-&EN
-
-; standard SIS file header
-#{"BTEngTestApp"},(0x04DA27D5),1,0,0
-
-;Supports Series 60 v 3.0
-(0x101F7961), 0, 0, 0, {"Series60ProductID"}
-
-;Localized Vendor Name
-%{"BTEngTestApp"}
-
-;Unique Vendor name
-:"Nokia"
-
-; Files to copy
-"..\data\file1.dll"-"c:\sys\bin\file1.dll"
-"..\data\file1.txt"-"e:\sys\bin\file1.txt"
-"..\data\file2.mp3"-"e:\sys\bin\file2.mp3" , FF   ; FF stands for Normal file
-"..\data\TestFramework.ini"-"!:\sys\bin\TestFramework.ini"
-"..\data\temp.ini"-"!:\sys\bin\temp.ini"
-"..\data\tc2.cfg"-"!:\sys\bin\tc2.cfg"
-        """.replace('\\', os.sep))
-    tc3_pkg.close()
-    
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "file1.dll"), 'w').close()
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "file1.txt"), 'w').close()
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "file2.mp3"), 'w').close()
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "TestFramework.ini"), 'w').close()
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "temp.ini"), 'w').close()
-    open(path.joinpath(TSRC_DIR, "tsrc", "tc3", "data", "tc2.cfg"), 'w').close()
-    
-    macros = open(path.joinpath(TSRC_DIR, "tmp", "macros", "bldcodeline.hrh"), 'w')
-    macros.write(
-              r"""
-#ifndef __BLDCODELINE_HRH
-#define __BLDCODELINE_HRH
-
-/** #RD_TEST */
-#define RD_TEST1
-
-/** #RD_TEST2 */
-#define RD_TEST2
-
-/** #RD_TEST3 */
-#define RD_TEST3
-
-#endif  // __BLDCODELINE_HRH
-
-    """)
-    macros.close()
-
-    
-def teardown_module():
-    """ Cleanup environment after testing. """    
-    def __init__():
-        TSRC_DIR.rmtree()
-        
-        
-#        list_of_paths = []
-#        list_of_paths = path.walk(TSRC_DIR)
-#        for file in list_of_paths[2]:
-#            continue
-#        for dir in list_of_paths[1]:
-#            continue
-        
-
-class TestPkgFileParser(mocker.MockerTestCase):
-    """Testing Package file parser"""
-    def __init__(self, methodName="runTest"):
-        mocker.MockerTestCase.__init__(self, methodName)
-
-    def setUp(self):
-        """Setup for PkgFile parser"""
-        self.pkg_file_path1 = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "tc1", "group"))
-        self.pkg_file_path2 = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "tc2", "group"))
-        self.pkg_file_path3 = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "tc3", "group"))
-        self.tcp = ats3.parsers.PkgFileParser("tc1.pkg")        
-        
-        self.data_files = [
-            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "file1.dll").normpath(), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.dll").normpath(), "testmodule", 'tc1.pkg'),
-            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "file1.txt").normpath(), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file1.txt").normpath(), "data", 'tc1.pkg'),
-            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "file2.mp3").normpath(), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "file2.mp3").normpath(), "data", 'tc1.pkg'),
-            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "TestFramework.ini").normpath(), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "TestFramework.ini").normpath(), "engine_ini", 'tc1.pkg'),
-            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "temp.ini").normpath(), path(r"c:" + os.sep + "sys" + os.sep + "bin" + os.sep + "temp.ini").normpath(), "engine_ini", 'tc1.pkg'),
-            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "tc1.cfg").normpath(), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "tc1.cfg").normpath(), "conf", 'tc1.pkg'),
-            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "tc1.sisx").normpath(), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "tc1.sisx").normpath(), "", 'tc1.pkg'),
-            (path(TSRC_DIR+r"" + os.sep + "tsrc" + os.sep + "tc1" + os.sep + "data" + os.sep + "DUMP.xyz").normpath(), path(r"e:" + os.sep + "sys" + os.sep + "bin" + os.sep + "DUMP.xyz").normpath(), "data", 'tc1.pkg'),
-            ]
-
-    def test_get_pkg_files(self):
-        """Test if pkg files are returned from a specified location"""
-        assert self.tcp.get_pkg_files(self.pkg_file_path1, False) == ["tc1.pkg"]
-
-
-
-    def test_parser_receives_path(self):      
-        """Test if None is returned when a path to PKG file is incorrect"""
-        assert self.tcp.get_data_files("string") == []
-            
-    def test_data_files_creation_without_exclude(self):
-        """ Tests if PKG file parser creates data files list as expected without exclude"""
-        assert self.tcp.get_data_files(self.pkg_file_path1, "d:") == self.data_files
-        
-    def test_data_files_creation_with_exclude(self):
-        """ Tests if PKG file parser creates data files list as expected with exclude"""
-        self.data_files.pop()
-        assert self.tcp.get_data_files(self.pkg_file_path1, "d:", "\.xyz") == self.data_files
-
-    def test_data_files_creation_without_drive_with_exclude(self):
-        """ Tests if PKG file parser creates data files list as expected without drive with exclude"""
-        
-        self.data_files.pop()
-        assert self.tcp.get_data_files(self.pkg_file_path1, "", "\.xyz") == self.data_files
-
-    def test_data_files_creation_without_drive_without_exclude(self):
-        """ Tests if PKG file parser creates data files list as expected without drive without exclude"""
-        
-        assert self.tcp.get_data_files(self.pkg_file_path1, "") == self.data_files
-            
-
-class TestCppParser(mocker.MockerTestCase):
-    """Testing CPP parser"""
-    def __init__(self, methodName="runTest"):
-        mocker.MockerTestCase.__init__(self, methodName)
-
-    def setUp(self):
-        self.bld_path = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "group"))
-        self.bld_path_comp1 = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "tc1", "group"))
-        self.tcp = ats3.parsers.CppParser()
-        upper_bld_path = os.path.dirname(self.bld_path)
-        self.bldDir = r'C:\DOCUME~1\wbernard\LOCALS~1\Temp\tmpbrgo0s\tsrc'
-
-        
-        self.dependent_paths_dictionary = {(os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/subtest/if_test/group"))): {'content': {(os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/subtest/if_test/group"))): {'pkg_files': [], 'mmp_files': ['if_test.mmp'], 'harness': 'STIFUNIT', 'type': ''}}},
-                                            (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc2//group"))): {'content': {(os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc2/group"))): {'pkg_files': ['tc2.pkg'], 'mmp_files': ['tc2.mmp'], 'harness': 'EUNIT', 'type': 'executable'}}}, 
-                                            (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc3/group"))): {'content': {(os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc3/group"))): {'pkg_files':[], 'mmp_files': ['tc3.mmp'], 'harness': 'EUNIT', 'type': 'executable'}}},
-                                            (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group"))): {'content': {(os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/subtest/group"))): {'pkg_files': [], 'mmp_files': ['sub_test.mmp'], 'harness': 'STIF', 'type': 'executable'}, 
-                                                                                                                                (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/dependent_1/group"))): {'pkg_files': [], 'mmp_files': ['dependent_1.mmp', 'onemore.mmp'], 'harness': "", 'type':''}, 
-                                                                                                                                (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/dependent_2/group"))): {'pkg_files': [], 'mmp_files': ['dependent_2.mmp'], 'harness': "", 'type': 'dependent'}, 
-                                                                                                                                (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group"))): {'pkg_files': ['tc1.pkg'], 'mmp_files': ['tc1.mmp'],'harness': 'STIF', 'type': 'executable'}}}} 
-        
-        self.extended_path_list = [(os.path.normpath(upper_bld_path), upper_bld_path),
-                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group")), upper_bld_path),
-                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../dependent_1/group")), os.path.normpath(os.path.join(upper_bld_path, "../tc1/group"))),
-                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../dependent_2/group")), os.path.normpath(os.path.join(upper_bld_path, "../tc1/group"))),
-                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../subtest/group")), os.path.normpath(os.path.join(upper_bld_path, "../tc1/group"))),
-                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../subtest/group/../if_test/group")), os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../subtest/group"))),
-                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc2/group")), upper_bld_path),
-                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc3/group")), upper_bld_path),
-                           (os.path.normpath(os.path.join(upper_bld_path, "../tsrc/group/group")), upper_bld_path),
-                           ]
-        self.path_list = [os.path.normpath(os.path.join(upper_bld_path, "group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../dependent_1/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../dependent_2/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../subtest/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc1/group/../subtest/group/../if_test/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc2/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tsrc/tc3/group")),
-                           ]
-        self.path_list_without_undefined = [os.path.normpath(upper_bld_path),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../dependent_1/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../dependent_2/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../subtest/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tc2/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tc3/group")),
-                           ]
-        self.cpp_output = ['# 1 "bld.inf"', 
-                           '# 1 "../tc1/group/bld.inf" 1', 
-                           '# 1 "../tc1/group/../dependent_1/group/bld.inf" 1', 
-                           '# 4 "../tc1/group/bld.inf" 2', 
-                           '# 1 "../tc1/group/../dependent_2/group/bld.inf" 1', 
-                           '# 5 "../tc1/group/bld.inf" 2', 
-                           '# 1 "../tc1/group/../subtest/group/bld.inf" 1', 
-                           '# 1 "../tc1/group/../subtest/group/../if_test/group/bld.inf" 1', 
-                           '# 4 "../tc1/group/../subtest/group/bld.inf" 2', 
-                           '# 6 "../tc1/group/bld.inf" 2', 
-                           '# 3 "bld.inf" 2', 
-                           '# 1 "../tc2/group/bld.inf" 1', 
-                           '# 4 "bld.inf" 2', 
-                           '# 1 "../tc3/group/bld.inf" 1', 
-                           '# 5 "bld.inf" 2']
-        
-        
-         
-    def test_pathlist_output(self):
-        """Test get_cpp_output-method using "n" -parameter"""
-        assert self.path_list.sort() == self.tcp.get_cpp_output(self.bld_path, "n").sort()
-        
-    def test_extended_pathlist_output(self):
-        """Test get_cpp_output-method using "e" -parameter"""
-        assert self.extended_path_list.sort() == self.tcp.get_cpp_output(self.bld_path, "e").sort()
-
-    def test_dictionary_pathlist_output(self):
-        """Test get_cpp_output-method using "d" -parameter (dependent paths)"""
-        output = """# 1 "bld.inf"
-
-# 1 "../tc1/group/bld.inf" 1
-
-# 1 "../tc1/group/../dependent_1/group/bld.inf" 1
-
-PRJ_TESTMMPFILES
-dependent_1.mmp
-onemore.mmp
-            
-# 2 "../tc1/group/bld.inf" 2
-
-# 1 "../tc1/group/../dependent_2/group/bld.inf" 1
-
-PRJ_TESTMMPFILES
-dependent_2.mmp
-            
-# 3 "../tc1/group/bld.inf" 2
-
-# 1 "../tc1/group/../subtest/group/bld.inf" 1
-
-PRJ_TESTMMPFILES
-sub_test.mmp    
-
-# 1 "../tc1/group/../subtest/group/../if_test/group/bld.inf" 1
-
-PRJ_TESTMMPFILES
-if_test.mmp
-            
-# 5 "../tc1/group/../subtest/group/bld.inf" 2
-
-
-            
-# 4 "../tc1/group/bld.inf" 2
-
-
-PRJ_TESTMMPFILES
-tc1.mmp
-
-PRJ_MMPFILES
-not_included.mmp
-            
-# 2 "bld.inf" 2
-
-# 1 "../tc2/group/bld.inf" 1
-
-PRJ_TESTMMPFILES
-tc2.mmp
-            
-# 3 "bld.inf" 2
-
-# 1 "../tc3/group/bld.inf" 1
-
-PRJ_TESTMMPFILES
-tc3.mmp
-            
-# 4 "bld.inf" 2
-
-
-PRJ_TESTMMPFILES
-
-            
-"""
-        
-        result = self.tcp.create_dependency_dictionary(StringIO.StringIO(output), self.bld_path)
-        print "INPUT :", self.dependent_paths_dictionary
-        print "OUTPUT:", result 
-
-        assert self.dependent_paths_dictionary == result
-        
-    def test_conditional_cpp_parsing(self):
-        """Test functionality of cpp parser when removing conditionals"""
-        assert self.path_list_without_undefined.sort() == self.tcp.get_cpp_output(bld_path=self.bld_path, output_parameter="n", imacros=os.path.normpath(os.path.join(TSRC_DIR, "tmp", "macros", "bldcodeline.hrh"))).sort()
-
-class TestBldFileParser(mocker.MockerTestCase):
-    """Testing BldFileParser Class"""
-    
-    def __init__(self, methodName="runTest"):
-        mocker.MockerTestCase.__init__(self, methodName)
-    
-    def setUp(self):
-        """Setup for BldFile parser"""
-
-        self.bld_path = path.joinpath(TSRC_DIR, "tsrc", "group", "bld.inf").normpath()
-        upper_bld_path = self.bld_path.dirname()
-        self.tcp = ats3.parsers.BldFileParser()
-        
-        self.test_mmp_files = [
-                               ['tc1.mmp'], 
-                               ['dependent_1.mmp', 'onemore.mmp'], 
-                               ['dependent_2.mmp'], 
-                               ['sub_test.mmp'], 
-                               ['if_test.mmp'], 
-                               ['tc2.mmp'], 
-                               ["tc3.mmp"],
-                               ]
-
-        self.path_list = [path.joinpath(upper_bld_path, "../tc1/group").normpath(),
-                           path.joinpath(upper_bld_path, "../tc1/group/../dependent_1/group").normpath(),
-                           path.joinpath(upper_bld_path, "../tc1/group/../dependent_2/group").normpath(),
-                           path.joinpath(upper_bld_path, "../tc1/group/../subtest/group").normpath(),
-                           path.joinpath(upper_bld_path, "../tc1/group/../subtest/group/../if_test/group").normpath(),
-                           path.joinpath(upper_bld_path, "../tc2/group").normpath(),
-                           path.joinpath(upper_bld_path, "../tc3/group").normpath(),
-                           ]
-
-
-    def test_testmmp_files_with_full_path(self):
-        """Test if mmp file is returned with its full path"""
-        self.mmp_file_path = [path.joinpath(TSRC_DIR, "tsrc", "tc1", "group", "tc1.mmp").normpath()]
-        assert self.tcp.get_test_mmp_files(os.path.normpath(os.path.join(self.path_list[0], "bld.inf"))) == self.mmp_file_path
-        
-        
-
-    def test_testmmp_files(self):
-        """Tests if test mmp files are included"""
-        self.lst_test_mmp = []
-        
-        for p in self.path_list:
-            self.lst_test_mmp.append(self.tcp.get_test_mmp_files(os.path.normpath(os.path.join(p, "bld.inf")), False))
-
-        assert self.lst_test_mmp == self.test_mmp_files
-        
-    def test_ignore_comments(self):
-        """ Test if comments are ignored correctly. """
-        for input_, output in [
-            ("abc.mmp /* apuva.mmp */ xyz.mmp", ("abc.mmp xyz.mmp")),
-            ("abc.mmp /* apuva.mmp */", ("abc.mmp")),
-            ("/* apuva.mmp */", ""),
-            ("  // apuva.mmp", ""),
-            ("   apuva.mmp", "apuva.mmp"),
-            ("xyz.mmp // apuva.mmp", "xyz.mmp"),
-            ("abc.mmp /* apuva.mmp */ xyz.mmp //rst.mmp", ("abc.mmp xyz.mmp")),
-            ]:
-            assert self.tcp.ignore_comments_from_input(input_) == output
-        
-    def test_broken_path(self):
-        """Tests if 'None' is returned when path is broken"""
-        upper_bld_path = os.path.dirname(self.bld_path)
-        assert self.tcp.get_test_mmp_files(os.path.normpath(os.path.join(upper_bld_path, "../tc99/group"))) == None
-    
-    def test_empty_parameter(self):
-        """Tests if 'None' is returned when bld file path is empty"""
-        upper_bld_path = os.path.dirname(self.bld_path)
-        assert self.tcp.get_test_mmp_files("") == None
-
-    
-class TestMmpFileParser(mocker.MockerTestCase):
-    """Testing MmpFileParser Class"""
-    def __init__(self, methodName="runTest"):
-        mocker.MockerTestCase.__init__(self, methodName)
-        
-    def setUp(self):
-        self.bld_path = os.path.normpath(os.path.join(TSRC_DIR, "tsrc", "group", "bld.inf"))
-        upper_bld_path = os.path.dirname(self.bld_path)
-        self.tcp = ats3.parsers.MmpFileParser()
-        self.tc1_type = "dll"
-        self.tc1_name = "tc1.dll"
-        self.tc1_dll_type = "executable"
-        self.tc1_harness = "STIF"
-        self.tc1_libraries = ['stiftestinterface.lib', 'user.lib']
-        self.tc1_all = (self.tc1_name, self.tc1_type, self.tc1_libraries, self.tc1_harness)
-        self.tc1_no_harness = (self.tc1_name, self.tc1_type, self.tc1_libraries)
-        self.tc1_name_type = (self.tc1_name, self.tc1_type) 
-        self.tc1_iftest_harness = "STIFUNIT"
-        self.tc1_iftest_name = "tc1_if.dll"
-        self.tc1_iftest_type = "dll"
-        
-        self.test_mmp_files = [['tc1.mmp'], ['dependent_1.mmp', 'onemore.mmp'], ['dependent_2.mmp'], ['sub_test.mmp'], ['if_test.mmp'], 
-                               ['tc2.mmp'], ["tc3.mmp"]]
-
-        self.path_list = [os.path.normpath(os.path.join(upper_bld_path, "../tc1/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../dependent_1/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../dependent_2/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../subtest/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tc1/group/../subtest/group/../if_test/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tc2/group")),
-                           os.path.normpath(os.path.join(upper_bld_path, "../tc3/group")),
-                           ]
-    
-    def test_get_dlltype(self):
-        """Test if get_filetype returns right type for given mmp"""
-        assert self.tc1_dll_type == self.tcp.get_dll_type(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp'))) 
-    
-    def test_get_target_filename(self):
-        """Test if get_filename returns right name for dll for given mmp"""
-        assert self.tc1_name == self.tcp.get_target_filename(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')))
-    
-    def test_get_libraries(self):
-        """Test if get_harness returns right harness for given mmp"""
-        assert self.tc1_libraries == self.tcp.get_libraries(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')))
-    
-    def test_get_harness(self):
-        """Test if get_harness returns right harness for given mmp"""
-        assert self.tc1_harness == self.tcp.get_harness(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')))
-    
-    def test_read_information_method(self):
-        """Test if read_information_from_mmp returns wanted output for given parameter and mmp-file"""
-        assert self.tc1_all == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 0)
-        assert self.tc1_no_harness == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 1)
-        assert self.tc1_name_type == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 2)
-        assert self.tc1_name == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 3)
-        assert self.tc1_type == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 4) 
-        assert self.tc1_libraries == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 5)
-        assert self.tc1_harness == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[0], 'tc1.mmp')), 6)
-        assert self.tc1_iftest_name == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[4], 'if_test.mmp')), 3)
-        assert self.tc1_iftest_type == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[4], 'if_test.mmp')), 4) 
-        assert self.tc1_iftest_harness == self.tcp.read_information_from_mmp(os.path.normpath(os.path.join(self.path_list[4], 'if_test.mmp')), 6)
-
-class TestParsers(mocker.MockerTestCase):
-    """Testing Parsers functionality"""
-    def __init__(self, methodName="runTest"):
-        mocker.MockerTestCase.__init__(self, methodName)
-        
-    def setUp(self):
-        pass
--- a/buildframework/helium/tools/common/python/lib/test/test_policy_validator.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-#============================================================================ 
-#Name        : test_policy_validator.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-"""Test the integration.quality module."""
-
-import os
-import unittest
-import sys
-import time
-import shutil
-
-import integration.quality
-import logging
-
-import test.test_fileutils
-
-
-_logger = logging.getLogger('test.archive')
-    
-    
-_test_file_paths = [
-    's60/Distribution.Policy.S60',
-    's60/ADO/Distribution.Policy.S60',
-    's60/ADO/group/Distribution.Policy.S60',
-    's60/ADO/internal/Distribution.Policy.S60',
-    's60/ADO/internal/good/Distribution.Policy.S60',
-    's60/ADO/internal/bad/Distribution.Policy.S60',
-    's60/ADO/tsrc/Distribution.Policy.S60',
-    's60/ADO/tsrc/group/Distribution.Policy.S60',
-    's60/ADO/tsrc/private/Distribution.Policy.S60',
-    's60/component_public/Distribution.Policy.S60',
-    's60/component_public/component_public_file.txt',
-    's60/component_private/Distribution.Policy.S60',
-    's60/component_private/component_private_file.txt',    
-    's60/missing/to_be_removed_9999.txt',
-    's60/missing/subdir/Distribution.Policy.S60',
-    's60/missing/subdir/to_be_removed_9999.txt',
-    's60/invalid/Distribution.Policy.S60',
-    's60/invalid/comment/Distribution.Policy.S60',
-    's60/invalid/utf16/Distribution.Policy.S60',
-    's60/invalid/letter/Distribution.Policy.S60',
-    ]
-
-_test_file_content = {
-    's60/Distribution.Policy.S60': '0',
-    's60/missing/subdir/Distribution.Policy.S60' : '0',
-    's60/component_public/Distribution.Policy.S60': '0',
-    's60/component_private/Distribution.Policy.S60': '1',
-    's60/ADO/Distribution.Policy.S60': '0',
-    's60/ADO/group/Distribution.Policy.S60': '0',
-    's60/ADO/internal/Distribution.Policy.S60': '1',
-    's60/ADO/internal/good/Distribution.Policy.S60': '1',
-    's60/ADO/internal/bad/Distribution.Policy.S60': '0',
-    's60/ADO/tsrc/Distribution.Policy.S60': '950',
-    's60/ADO/tsrc/group/Distribution.Policy.S60': '0',
-    's60/ADO/tsrc/private/Distribution.Policy.S60': '0',
-    's60/invalid/Distribution.Policy.S60': '0',
-    's60/invalid/comment/Distribution.Policy.S60': '0 ; some comment',
-    's60/invalid/utf16/Distribution.Policy.S60': '\xFF\xFE\x30\x00\x0D\x00\x0D\x00\x0D\x00\x0A\x00',
-    's60/invalid/letter/Distribution.Policy.S60': '9A0',
-    }
-    
-""" Used by test_archive. """
-root_test_dir = "_test_" + str(time.strftime("%H.%M.%S"))
-    
-def _testpath(subpath):
-    """ Normalised path for test paths. """
-    return os.path.normpath(os.path.join(root_test_dir, subpath))
-    
-def setup_module():
-    """ Setup files test config. 
-    
-    This creates a number of empty files in a temporary directory structure
-    for testing various file selection and archiving operations.
-    """
-    #print 'setup_module()'
-    #print _test_file_content.keys()
-    for child_path in _test_file_paths:
-        path = os.path.join(root_test_dir, child_path)
-        path_dir = path
-        path_dir = os.path.dirname(path)
-        
-        if (not os.path.exists(path_dir)):
-            _logger.debug('Creating dir:  ' + path_dir)
-            os.makedirs(path_dir)
-
-        if(not path.endswith('/') and not path.endswith('\\')):
-            _logger.debug('Creating file: ' + path)
-            handle = open(path, 'w')
-            # Write any file content that is needed
-            if _test_file_content.has_key(child_path):
-                handle.write(_test_file_content[child_path])
-            handle.close()
-
-def teardown_module():
-    """ Teardown test config. """
-    shutil.rmtree(root_test_dir)
-    
-    
-class PolicyValidatorTest(unittest.TestCase):
-    EXEC_FILE = "archive_create.ant.xml"
-
-    def test_policy_validator(self):
-        """ Testing the policy validator behaviour. """
-        validator = integration.quality.PolicyValidator()
-        errors = [] 
-        errors.extend(validator.validate(_testpath('s60')))
-        errors.sort()
-        print errors
-        assert len(errors) == 4
-
-        
-        # Invalid encoding: contains other stuff than policy id.
-        assert errors[0][0] == "invalidencoding"
-        assert errors[0][1].lower() == _testpath('s60' + os.sep + 'invalid' + os.sep + 'comment' + os.sep + 'distribution.policy.s60')
-        assert errors[0][2] == None
-        
-        # Invalid encoding: ID contains a letter.
-        assert errors[1][0] == "invalidencoding"
-        assert errors[1][1].lower() == _testpath('s60' + os.sep + 'invalid' + os.sep + 'letter' + os.sep + 'distribution.policy.s60')
-        assert errors[1][2] == None
-        
-        # Invalid encoding: not ascii.
-        assert errors[2][0] == "invalidencoding"
-        assert errors[2][1].lower() == _testpath('s60' + os.sep + 'invalid' + os.sep + 'utf16' + os.sep + 'distribution.policy.s60')
-        assert errors[2][2] == None
-        
-        # Policy file is missing
-        assert errors[3][0] == "missing"
-        assert errors[3][1].lower() == _testpath('s60' + os.sep + 'missing')
-        assert errors[3][2] == None
-
--- a/buildframework/helium/tools/common/python/lib/test/test_relnotes.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-#============================================================================ 
-#Name        : test_relnotes.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-""" Unit tests for the relnotes tool.
-
-"""
-import unittest
-import StringIO
-import rtfutils
-import logging
-import os
-
-def test_initialization():
-    "Modules are imported properly, i.e. PyRTF is there etc."
-    import PyRTF
-
-def test_pyrtf():
-    import PyRTF
-    
-    DR = PyRTF.Renderer()
-    doc     = PyRTF.Document()
-    ss      = doc.StyleSheet
-    section = PyRTF.Section()
-    doc.Sections.append( section )
-    
-    string = StringIO.StringIO()
-    DR.Write(doc, string)
-    assert string.getvalue() != ""
-    string.close()
-    
-class RelNotesTest( unittest.TestCase ):
-    
-    def setUp(self):
-        self.helium_home = os.environ["HELIUM_HOME"]
-        self.logger = logging.getLogger('test.relnotes')
-        logging.basicConfig(level=logging.INFO)
-      
-    def test_rtfconvert(self):
-        props = {r'my.val1=hello world' : r'my.val1=hello world',
-        r'my.val2=http://www.company.com/a' : r'my.val2={\\field{\\*\\fldinst HYPERLINK http://www.company.com/a}}',
-        r'my.val3=ftp://ftp.company.com/a' : r'my.val3={\\field{\\*\\fldinst HYPERLINK ftp://ftp.company.com/a}}',
-        r'my.val4=\\server\share1\dir' : r'my.val4={\\field{\\*\\fldinst HYPERLINK \\\\\\\\\\\\\\\\server\\\\\\\\share1\\\\\\\\dir}}',
-        r'my.val5=.\projects' : r'my.val5={\\field{\\*\\fldinst HYPERLINK .\\\\\\\\projects}}'}
-        
-        for p, output in props.iteritems():
-            self._check_rtfconvert(p, output)
-        
-    def _check_rtfconvert(self, value, correctoutput):
-        output = StringIO.StringIO()
-        rtfu = rtfutils.RTFUtils('')
-        rtfu._rtfconvert([value], output)
-        self.logger.info(output.getvalue())
-        self.logger.info(correctoutput) 
-        assert output.getvalue() == correctoutput #.strip()
-        output.close()
-
-    def test_rtftable(self):
-        output = StringIO.StringIO()
-        errors = ["component,error,warning", "app2,1,2"]
-        input = ["text <tag> text"]
-        
-        rtfu = rtfutils.RTFUtils('')
-        rtfu._rtftable(errors, output, '<tag>', input)
-        
-        self.logger.info(output.getvalue())
-        output.close()
-        
-    def test_rtfimage(self):
-        output = StringIO.StringIO()
-        image = os.path.join(self.helium_home, 'extensions', 'nokia', 'config', 'relnotes', 'logo.png')
-        input = ["text <tag> text"]
-        
-        rtfu = rtfutils.RTFUtils('')
-        rtfu._rtfimage(image, output, '<tag>', input)
-        
-        self.logger.info(output.getvalue())
-        output.close()
--- a/buildframework/helium/tools/common/python/lib/test/test_rom.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_rom.py	Wed Dec 23 19:29:07 2009 +0200
@@ -17,13 +17,11 @@
 #Description:
 #===============================================================================
 
-
-import unittest, amara, os
+from __future__ import with_statement
+import unittest, os
 from rom import *
 import configuration
 
-
-
 class ImageTest( unittest.TestCase ):
     def setUp( self ):
         pass #productConfig = amara.parse( PRODUCT_CONFIG )
@@ -40,7 +38,8 @@
         assert os.path.exists('mytraces.txt')
         
         # Check content
-        mytraces_lines = open( 'mytraces.txt', 'r' ).readlines()
+        with open('mytraces.txt') as f:
+            mytraces_lines = f.readlines()
         print mytraces_lines[0]
         assert mytraces_lines[0] == 'foo.dll\n'
         assert mytraces_lines[1] == 'bar.dll\n'
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_sbs.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,50 @@
+#============================================================================ 
+#Name        : test_sbs.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import unittest
+import logging
+import sys
+import os
+import tempfile
+
+_logger = logging.getLogger('test.sbs')
+logging.basicConfig(level=logging.INFO)
+
+class SBSTest(unittest.TestCase):
+        
+    def setUp(self):
+        sys.path.append(os.path.join(os.environ['HELIUM_HOME'], 'tools/common/python/scripts'))
+        
+    def test_sbs(self):
+        #import filter_metadatalog
+        import sbsscanlogmetadata
+        sbs = sbsscanlogmetadata.SBSScanlogMetadata()
+        (_, filename) = tempfile.mkstemp()
+        sbs.open(filename)
+        sbs.write(open(os.path.join(os.environ['HELIUM_HOME'], 'tests/data/scanlog/all_regex_type.log')).read())
+        sbs.close()
+        
+    def test_sbsscanlog(self):
+        import sbsscanlog
+        filter = sbsscanlog.SBSScanlog()
+        (_, filename) = tempfile.mkstemp()
+        filter.open(filename)
+        filter.write('hi')
+        filter.summary()
+        filter.close()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_searchnextdrive.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,51 @@
+#============================================================================ 
+#Name        : test_searchnextdrive.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test searchnextdrive module. """
+import os
+from string import strip
+from subprocess import Popen, PIPE 
+from tempfile import mkdtemp
+if os.sep == '\\':
+    from searchnextdrive import search_next_free_drive
+    from fileutils import subst, unsubst
+import unittest
+
+class SearchNextDriveTest(unittest.TestCase):
+    """ Test search next drive script... """
+
+    def test_searchnextdrive(self):
+        """ Testing search next drive script... """
+        if os.sep == '\\':
+            if os.environ.has_key("HELIUM_HOME"):
+                freedrive1 = search_next_free_drive()
+                if freedrive1 != "Error: No free drive!":
+                    mytmpdir = mkdtemp()
+                    subst(freedrive1, mytmpdir)
+                    freedrive2 = search_next_free_drive()
+                    unsubst(freedrive1)
+                    os.rmdir(mytmpdir)
+                    if freedrive2 != "Error: No free drive!":
+                        self.assertNotEqual(freedrive1, freedrive2, "searchnextdrive.py couldn't find a valid free drive");
+                    else:
+                        raise Exception("Couldn't find a valid free drive")
+                else:
+                    raise Exception("Couldn't find a valid free drive")
+            else:
+                raise Exception("HELIUM_HOME variable not defined.")
--- a/buildframework/helium/tools/common/python/lib/test/test_session_provider.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_session_provider.py	Wed Dec 23 19:29:07 2009 +0200
@@ -54,7 +54,7 @@
             result.status = -1  
         return result
 
-class MockOpener:
+class MockOpener(object):
     def __init__(self):
         self.failOnNewOpen = False
     
@@ -118,7 +118,7 @@
         p = ccm.extra.CachedSessionProvider(opener=opener)
         db = p.get(database="fakedb")
         assert db is not None
-        del db
+        db.close()
         opener.failOnNewOpen = True
         db2 = p.get(database="fakedb")
         assert db2 is not None
@@ -142,7 +142,7 @@
         db = p.get(database="fakedb")
         assert db is not None
         del db
-        del p
+        p.close()
         assert os.path.exists(self.session_cache), "Cache file %s is missing." % self.session_cache
         
         opener = MockOpener()
--- a/buildframework/helium/tools/common/python/lib/test/test_symbian_log.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_symbian_log.py	Wed Dec 23 19:29:07 2009 +0200
@@ -17,8 +17,6 @@
 #Description:
 #===============================================================================
 
-"""
-"""
 import unittest
 import logging
 import StringIO
--- a/buildframework/helium/tools/common/python/lib/test/test_symrec.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_symrec.py	Wed Dec 23 19:29:07 2009 +0200
@@ -24,7 +24,6 @@
 import logging
 import os
 from xml.dom.minidom import *
-import amara
 
 logger = logging.getLogger("test.symrec")
 logging.basicConfig()
@@ -191,6 +190,7 @@
 
 
 def test_find_latest_metadata():
+    """ Check find latest metadata. """
     assert symrec.find_latest_metadata(os.path.join(os.environ['HELIUM_HOME'], "tests/data/symrec/override/none")) == None
     
     expected = os.path.normpath(os.path.join(os.environ['HELIUM_HOME'], "tests/data/symrec/override/one", "release_metadata.xml"))
@@ -201,7 +201,13 @@
     filename = symrec.find_latest_metadata(os.path.dirname(expected))
     assert expected == filename, "Should be %s (%s)" % (expected, filename)
 
-
+def test_find_latest_metadata_invalid_path():
+    """ Check find latest metadata with an invalid path. """
+    path = os.path.join(os.environ['HELIUM_HOME'], "tests/data/symrec/override/invalid")
+    open(path, "w+").close()
+    assert symrec.find_latest_metadata(path) == None
+    os.remove(path)
+    
 def test_cached_release_validator():
     """ Testing the cached release metadata xml validator. """
     
@@ -242,3 +248,16 @@
     assert validator.is_valid() == True
     assert os.path.exists(cachefile), "Cache file has not been created"
     assert len(validator.load_cache()) == 3
+
+
+def test_ignore_whitespace_writexml():
+    myText = '''<foo>    
+     <bar attr1="value" attr2="&gt;">   foo bar  
+     </bar>
+     <bar x="y"/>    
+     </foo>'''
+    result1 =  xml.dom.minidom.parseString(myText).toprettyxml()
+    result2 =  xml.dom.minidom.parseString(result1).toprettyxml()
+    print logger.debug(result1)
+    print logger.debug(result2)
+    assert result1 == result2
--- a/buildframework/helium/tools/common/python/lib/test/test_threadpool.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_threadpool.py	Wed Dec 23 19:29:07 2009 +0200
@@ -33,6 +33,7 @@
 _logger = logging.getLogger('test.threadpool')
 
 class Job:
+    """Job: a job created, used to test threadpool"""
     def __init__(self, jid):
         self.__id = jid
         
@@ -45,14 +46,14 @@
         time.sleep(1)
 
 class LeavingJob(Job):
-
+    """LeavingJob: sleeps and raises exception"""
     def work(self):
         time.sleep(1)
         raise Exception("Error!")
     
 
 class TestThreadPool(unittest.TestCase):
-
+    """TestThreadPool: sets up 6 jobs and clears them down again."""
     def test_thread_pool(self):
         """ Test the thread pool.
         """
@@ -64,7 +65,7 @@
         pool.addWork(Job(5))
         pool.addWork(Job(6))
         pool.wait()
- 
+
     def test_thread_pool_leaving(self):
         """ Test the thread pool when exception happens.
         """
@@ -82,5 +83,3 @@
         pool.wait()
         assert len(exceptions)==6
         _logger.debug(exceptions)
- 
- 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/test/test_unittestadditions.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,47 @@
+#============================================================================ 
+#Name        : test_unittestadditions.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+import unittest
+from unittestadditions import skip
+
+class TestSkipDecorator(unittest.TestCase):
+
+    def test_skip_false(self):
+        """ A skip(False) decorated function is executed properly """
+        @skip(False)
+        def func(data):
+            return data
+        
+        assert func("test") == "test"
+    
+    def test_skip_true(self):
+        """ A skip(True) decorated function is executed properly """
+        @skip(True)
+        def func(data):
+            return data
+        
+        assert func("test") == None
+
+
+    def test_skip_true_default_return(self):
+        """ A skip(True, 'some return value') decorated function is executed properly """
+        @skip(True, "stub")
+        def func(data):
+            return data
+        
+        assert func("test") == "stub"
--- a/buildframework/helium/tools/common/python/lib/test/test_vbaconf.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-#============================================================================ 
-#Name        : test_vbaconf.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-""" Some test cases for VBA config generation.
-"""
-import unittest
-import logging
-import os
-import vbaconf
-import vbaconf.new_delivery
-import amara
-
-# Uncomment this line to enable logging in this module, or configure logging elsewhere
-#logging.basicConfig(level=logging.DEBUG)
-logger = logging.getLogger('test.vbaconf')
-
-
-class TestVBAConf(unittest.TestCase):
-    """ Implementation of VBA test cases. """
-    
-    def test_vba_conf_generation(self):
-        """ Testing all methods from VBA config generation.
-        """
-        delivery = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/delivery.xml.parsed')
-        prep = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/prep.xml.parsed')
-        doc = vbaconf.generate_config(delivery, prep)
-        
-        logger.info(doc.toprettyxml())
-        
-        doc = amara.parse(str(doc.toprettyxml()))
-        assert len(doc.xml_xpath("/virtualBuildArea/add")) == 24 
-        
-    def test_vba_conf_generation_new_delivery_format(self):
-        """ Testing all methods from VBA config generation.
-        """
-        delivery = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/new_delivery/delivery.xml.parsed')
-        prep = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/new_delivery/prep.xml.parsed')
-        doc = vbaconf.new_delivery.generate_config(delivery, prep)
-        
-        logger.info(doc.toprettyxml())
-        
-        doc = amara.parse(str(doc.toprettyxml()))
-        ##assert len(doc.xml_xpath("/virtualBuildArea/add")) == 24 
-        
-    def test_vba_conf_generation_new_api(self):
-        """ Testing all methods from VBA config generation.
-        """
-        delivery = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/delivery.xml.parsed')
-        prep = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/prep.xml.parsed')
-        conv = vbaconf.ConfigConverter(delivery, prep)
-        doc = conv.generate_config()
-        
-        logger.info(doc.toprettyxml())
-        
-        doc = amara.parse(str(doc.toprettyxml()))
-        assert len(doc.xml_xpath("/virtualBuildArea/add")) == 24 
-
-    def test_vba_conf_generation_new_api_new_delivery_format(self):
-        """ Testing all methods from VBA config generation.
-        """
-        delivery = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/new_delivery/delivery.xml.parsed')
-        prep = os.path.join(os.environ['HELIUM_HOME'],'tests/data/validate_overlay/new_delivery/prep.xml.parsed')
-        conv = vbaconf.ConfigConverterNewDelivery(delivery, prep)
-        doc = conv.generate_config()
-        
-        logger.info(doc.toprettyxml())
-        
-        doc = amara.parse(str(doc.toprettyxml()))
-        assert len(doc.xml_xpath("/virtualBuildArea/add")) == 24 
-
- 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/python/lib/unittestadditions.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,45 @@
+#============================================================================ 
+#Name        : unittestadditions.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import logging
+logger = logging.getLogger('unittestadditions')
+
+class skip(object):
+    """ Skip decorator. The decorated function will only be called
+        if the parameter is true.
+         
+        e.g: 
+        @skip(True)
+        def test():
+           assert True==False
+               
+    """
+    
+    def __init__(self, shouldSkip, returns=None):
+        self.shouldSkip = shouldSkip
+        self.returns = returns
+
+    def __call__(self, f):
+        """ Returns the function f if  shouldSkip is False. Else a stub function is returned. """
+        def __skiptest(*args, **kargs):
+            logger.warning("Skipping test %s" % f.__name__)
+            return self.returns
+        if self.shouldSkip:
+            return __skiptest
+        return f
--- a/buildframework/helium/tools/common/python/scripts/filter_heliumlog.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/scripts/filter_heliumlog.py	Wed Dec 23 19:29:07 2009 +0200
@@ -36,10 +36,11 @@
 
 
 
-""" Log scanner for filter logs
+""" plugin that gets copied to raptor folder so that wehn raptor (SBS) runs it
+    knows the format of the log files.
 """
 class FilterHeliumLog(filter_interface.Filter):
-
+    """ Log scanner for filter logs"""
     def open(self, raptor_instance):
         """Open a log file for the various I/O methods to write to."""
         self.raptor = raptor_instance
@@ -55,7 +56,7 @@
                 dirname = str(self.raptor.logFileName.Dir())
                 if dirname and not os.path.isdir(dirname):
                     os.makedirs(dirname)
-            except Exception, e:
+            except Exception, e_error:
                 return False
             return  self.scanlog.initialize(self.logFileName)
         else:
@@ -64,10 +65,13 @@
         return True
 
     def write(self, text):
+        """write text to the open file"""
         return self.scanlog.write(text)
 
     def summary(self):
+        """write the summary log file"""
         return self.scanlog.summary()
 
     def close(self):
+        """close the log file"""
         return self.scanlog.close()
--- a/buildframework/helium/tools/common/python/scripts/filter_metadatalog.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/scripts/filter_metadatalog.py	Wed Dec 23 19:29:07 2009 +0200
@@ -36,10 +36,11 @@
 
 
 
-""" Log scanner for filter logs
+""" plugin that gets copied to raptor folder so that wehn raptor (SBS) runs it
+    knows the format of the log files.
 """
 class FilterMetadataLog(filter_interface.Filter):
-
+    """Log scanner for filter logs"""
     def open(self, raptor_instance):
         """Open a log file for the various I/O methods to write to."""
         self.raptor = raptor_instance
@@ -55,7 +56,7 @@
                 dirname = str(self.raptor.logFileName.Dir())
                 if dirname and not os.path.isdir(dirname):
                     os.makedirs(dirname)
-            except Exception, e:
+            except Exception, e_error:
                 return False
             return  self.scanlog.initialize(self.logFileName)
         else:
@@ -64,10 +65,13 @@
         return True
 
     def write(self, text):
+        """write the text to the opened file"""
         return self.scanlog.write(text)
 
     def summary(self):
+        """write the summary file"""
         return self.scanlog.summary()
 
     def close(self):
+        """close the log file"""
         return self.scanlog.close()
--- a/buildframework/helium/tools/common/python/scripts/sbsscanlog.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/scripts/sbsscanlog.py	Wed Dec 23 19:29:07 2009 +0200
@@ -1,5 +1,5 @@
 #============================================================================ 
-#Name        : filter_heliumlog.py 
+#Name        : sbsscanlog.py 
 #Part of     : Helium 
 
 #Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
@@ -101,7 +101,9 @@
             rc = rc + node.data
     return rc
 
-class SBSScanlog():
+class SBSScanlog(object):
+    """parses the raptor logs and separates the info out into HTML and XML logs for writing to diamonds
+    and other logs"""
     def initialize(self, logFile):
         """Initialize helium log filter"""
     #try:
--- a/buildframework/helium/tools/common/python/scripts/sbsscanlogmetadata.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/scripts/sbsscanlogmetadata.py	Wed Dec 23 19:29:07 2009 +0200
@@ -33,39 +33,75 @@
 
 IGNORE_TEXT_REG_EX = "warning: no newline at end of file"
 
-WARNING_TAG = "<warning>.*</warning>"
+STREAM_REGEX =  {   "clean" : [r'<clean', r'</clean'],
+                    "whatlog" : [r'<whatlog', r'</whatlog'],
+                    "warning" : [r'<warning', r'</warning']
+                }
 
-class SBSScanlogMetadata():
+class SBSScanlogMetadata(object):
+    """parses the raptor meatadata logs and separates the info out into HTML and XML logs for writing 
+    to diamonds and other logs"""
+    
+    def initializeLogPath(self):
+        index = self.logFileName.rfind(".")
+        if index < 0:
+            index = len(self.logFileName)
+        for stream in STREAM_REGEX.keys():
+            self.stream_path[stream] = self.logFileName[:index] + "." + stream + \
+                        self.logFileName[index:]            
+        if os.environ.has_key('SBS_CLEAN_LOG_FILE'):
+            self.stream_path['clean'] = os.environ['SBS_CLEAN_LOG_FILE']
+            
     def initialize(self, logFile):
         """Initialize helium log filter"""
         self.ignoreTextCompileObject = re.compile(IGNORE_TEXT_REG_EX);
-        self.warningCompileObject = re.compile(WARNING_TAG);
-        self.startRecording = False
-        self.logFileName = logFile
-        self.warningFileName = "%s%s" % (logFile, "exceptions.xml")
-        self.inReceipe = False
+        self.logFileName = str(logFile)
+        self.streamStatus = {}
+        self.streams = {}
+        self.stream_path = {}
         self.start_time = datetime.datetime.now()
-        self.loggerout = open(str(self.logFileName),"w")
-        self.warningout = open(str(self.warningFileName),"w")
+        self.loggerout = open(self.logFileName,"w")
+        self.compiled_stream_object = {}
         print "logName: %s\n" % self.logFileName
+        self.initializeLogPath()
+        for stream in STREAM_REGEX.keys():
+            self.compiled_stream_object[stream] = []
+            self.streams[stream] = open(self.stream_path[stream], "w")
+            self.streamStatus[stream] = False
+            for  searchString in STREAM_REGEX[stream]:
+                self.compiled_stream_object[stream].append(re.compile(searchString))
         return True
 
     def open(self, logFile):
-        self.logFileName = logFile
-        self.initialize(logFile)
+        self.logFileName = str(logFile)
+        return self.initialize(logFile)
         
         
     def write(self, text):
         """ callback function which is to process the logs"""
+        stream_list = STREAM_REGEX.keys()
         for textLine in text.splitlines():
             textLine = textLine + '\n'
+            if textLine.startswith("<?xml ") or textLine.startswith("<buildlog ") \
+                or textLine.startswith("</buildlog"):
+                self.loggerout.write(textLine)
+                for stream in stream_list:
+                    self.streams[stream].write(textLine)
+                continue
             if(self.ignoreTextCompileObject.search(textLine)):
                 continue
+            for stream in stream_list:
+                if( (not self.streamStatus[stream]) and self.compiled_stream_object[stream][0].search(textLine)!= None):
+                    self.streamStatus[stream] = True
+                if (self.streamStatus[stream] and self.compiled_stream_object[stream][1].search(textLine)!= None):
+                    self.streams[stream].write(textLine)
+                    self.streamStatus[stream] = False
+                    break
+    
+                if(self.streamStatus[stream]):
+                    self.streams[stream].write(textLine)
+                    break
 
-            #only temporary until the fix for special character handling from raptor is available
-            if(self.warningCompileObject.search(textLine)):
-                self.warningout.write(textLine + "\n")
-                continue
             self.loggerout.write(textLine)
         return True
         
@@ -78,11 +114,13 @@
         """Close the log file"""
 
         try:
-            self.warningout.close()
             self.loggerout.close()
+            for stream in self.streams.keys():
+                self.streams[stream].close()
             return True
         except:
             self.loggerout = None
+            self.streams = None
         return False
 
 if __name__ == "__main__":
--- a/buildframework/helium/tools/common/python/scripts/searchnextdrive.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/scripts/searchnextdrive.py	Wed Dec 23 19:29:07 2009 +0200
@@ -22,13 +22,12 @@
     If none available it returns "Error: No free drive!". 
     win32 only!
 """
-import string
-from win32api import GetLogicalDriveStrings
+from fileutils import get_next_free_drive
+def search_next_free_drive():
+    try:
+        return get_next_free_drive()
+    except Exception, e:
+        return "Error: No free drive!"
 
-DRIVE_LABELS = sorted(list(set(string.ascii_uppercase) - set(GetLogicalDriveStrings())), reverse=True)
-if len(DRIVE_LABELS) != 0 :
-    print DRIVE_LABELS[0] + ":"
-else:
-    print "Error: No free drive!"
-        
-
+if __name__ == "__main__":
+    print search_next_free_drive()
--- a/buildframework/helium/tools/common/python/scripts/test_scanlog.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/scripts/test_scanlog.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -98,35 +98,35 @@
 
     <target name="test-scanlog-metadata-1">
         <echo message="log.dir:${env.TEMP}/" />
-        <delete file="${env.TEMP}/test-scanlog-metadata-1.log" failonerror="false"/>
-        <delete file="${env.TEMP}/test-metadata-1.sqlite" failonerror="false"/>
-        <delete file="${env.TEMP}/test-scanlog-metadata-1.log.scan2.html" failonerror="false"/>
+        <delete file="${helium.dir}\tests\data\test-scanlog-metadata-1.log" failonerror="false"/>
+        <delete file="${helium.dir}\tests\data\test-metadata-1.sqlite" failonerror="false"/>
+        <delete file="${helium.dir}\tests\data\test-scanlog-metadata-1.log.scan2.html" failonerror="false"/>
         
-        <hlm:scanlogMetadataTest log="${helium.dir}\tests\data\scanlog\S60.MCL_7952_200932_5000__all_variants_multiple_thread_pf_7952_build_compile.log"
-            output="${env.TEMP}/test-scanlog-metadata-1.log" />
-        <hlm:assertFileExists file="${env.TEMP}/test-scanlog-metadata-1.log"/>
-        <hlm:metadatarecord database="${env.TEMP}/test-metadata-1.sqlite">
+        <hlm:scanlogMetadataTest log="${helium.dir}/tests/data/scanlog/all_regex_type.log"
+            output="${helium.dir}/tests/data/test-scanlog-metadata-1.log" />
+        <hlm:assertFileExists file="${helium.dir}/tests/data/test-scanlog-metadata-1.log"/>
+        <hlm:metadatarecord database="${helium.dir}/tests/data/test-metadata-1.sqlite">
             <hlm:sbsmetadatainput>
-                <fileset casesensitive="false" file="${env.TEMP}/test-scanlog-metadata-1.log"/>
+                <fileset casesensitive="false" file="${helium.dir}/tests/data/test-scanlog-metadata-1.log"/>
                 <metadatafilterset refid="filterset.sbs" />
             </hlm:sbsmetadatainput>
         </hlm:metadatarecord>
         <fmpp sourceFile="${helium.dir}/tools/common/templates/log/scan2.html.ftl"
-                     outputfile="${env.TEMP}/test-scanlog-metadata-1.log.scan2.html">
+                     outputfile="${helium.dir}/tests/data/test-scanlog-metadata-1.log.scan2.html">
             <freemarkerLinks expandProperties="yes">
                 macro: ${helium.dir}/tools/common/templates/macro
             </freemarkerLinks>
             <data expandProperties="yes">
-                dbPath: ${env.TEMP}/test-metadata-1.sqlite
+                dbPath: ${helium.dir}/tests/data/test-metadata-1.sqlite
                 doc: xml(${helium.dir}/tests/data/scanlog/all_regex_type.log_sbs_info.xml)
                 ant: antProperties()
             </data>
         </fmpp>
-        <hlm:generateBuildStatus dbfile="${env.TEMP}/test-metadata-1.sqlite" output-dir="${env.TEMP}" file="test-scanlog-metadata-1.log"/>
-        <hlm:assertFileExists file="${env.TEMP}/test-scanlog-metadata-1.log.scan2.html"/>
+        <hlm:generateBuildStatus dbfile="${helium.dir}/tests/data/test-metadata-1.sqlite" output-dir="${helium.dir}/tests/data/" file="test-scanlog-metadata-1.log"/>
+        <hlm:assertFileExists file="${helium.dir}/tests/data/test-scanlog-metadata-1.log.scan2.html"/>
     </target>
     
     <target name="test-metadata-signal">
         <antcall target="test-scanlog-metadata-1" />
     </target>
-</project>
\ No newline at end of file
+</project>
--- a/buildframework/helium/tools/common/python/scripts/timeout_launcher.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/python/scripts/timeout_launcher.py	Wed Dec 23 19:29:07 2009 +0200
@@ -37,8 +37,7 @@
     import win32api
     windows = True
 
-
-if __name__ == '__main__':
+def main():
     cmdarg = False
     cmdline = []
     timeout = None
@@ -95,3 +94,6 @@
             p = subprocess.Popen(' '.join(cmdline), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
             print p.communicate()[0]
             sys.exit(p.returncode)
+
+if __name__ == '__main__':
+    main()
\ No newline at end of file
--- a/buildframework/helium/tools/common/schema/ant.xsd	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/schema/ant.xsd	Wed Dec 23 19:29:07 2009 +0200
@@ -1,1 +1,1 @@
-<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="ant.apache.org"
           xmlns:au="org.apache.ant.antunit"
           xmlns:hlm="http://www.nokia.com/helium"
           xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">
    <xs:import namespace="org.apache.ant.antunit" schemaLocation="antunit.xsd"/>
    <xs:import namespace="http://www.nokia.com/helium" schemaLocation="helium_ant.xsd"/>
    <xs:complexType name="taskcontainerType" abstract="true">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="propertyfile" type="propertyfileType"/>
            <xs:element name="propertycopy" type="propertycopyType"/>
            <xs:element name="importtypelib" type="importtypelibType"/>
            <xs:element name="sql" type="sqlType"/>
            <xs:element name="cvspass" type="cvspassType"/>
            <xs:element name="p4reopen" type="p4reopenType"/>
            <xs:element name="csc" type="cscType"/>
            <xs:element name="dirname" type="dirnameType"/>
            <xs:element name="p4label" type="p4labelType"/>
            <xs:element name="p4revert" type="p4revertType"/>
            <xs:element name="replaceregexp" type="replaceregexpType"/>
            <xs:element name="get" type="getType"/>
            <xs:element name="jjtree" type="jjtreeType"/>
            <xs:element name="sleep" type="sleepType"/>
            <xs:element name="jarlib-display" type="jarlib-displayType"/>
            <xs:element name="dependset" type="dependsetType"/>
            <xs:element name="zip" type="zipType"/>
            <xs:element name="patch" type="patchType"/>
            <xs:element name="jspc" type="jspcType"/>
            <xs:element name="style" type="styleType"/>
            <xs:element name="test" type="testType"/>
            <xs:element name="tstamp" type="tstampType"/>
            <xs:element name="unwar" type="unwarType"/>
            <xs:element name="icontract" type="icontractType"/>
            <xs:element name="cvschangelog" type="cvschangelogType"/>
            <xs:element name="p4submit" type="p4submitType"/>
            <xs:element name="p4change" type="p4changeType"/>
            <xs:element name="bzip2" type="bzip2Type"/>
            <xs:element name="sync" type="syncType"/>
            <xs:element name="p4delete" type="p4deleteType"/>
            <xs:element name="javadoc" type="javadocType"/>
            <xs:element name="p4integrate" type="p4integrateType"/>
            <xs:element name="translate" type="translateType"/>
            <xs:element name="signjar" type="signjarType"/>
            <xs:element name="chown" type="chownType"/>
            <xs:element name="vajload" type="vajloadType"/>
            <xs:element name="jarlib-available" type="jarlib-availableType"/>
            <xs:element name="buildnumber" type="buildnumberType"/>
            <xs:element name="jpcovmerge" type="jpcovmergeType"/>
            <xs:element name="war" type="warType"/>
            <xs:element name="rename" type="renameType"/>
            <xs:element name="sequential" type="sequentialType"/>
            <xs:element name="serverdeploy" type="serverdeployType"/>
            <xs:element name="property" type="propertyType"/>
            <xs:element name="subant" type="subantType"/>
            <xs:element name="move" type="moveType"/>
            <xs:element name="ildasm" type="ildasmType"/>
            <xs:element name="copydir" type="copydirType"/>
            <xs:element name="fixcrlf" type="fixcrlfType"/>
            <xs:element name="pathconvert" type="pathconvertType"/>
            <xs:element name="record" type="recordType"/>
            <xs:element name="p4sync" type="p4syncType"/>
            <xs:element name="exec" type="execType"/>
            <xs:element name="ccmklabel" type="ccmklabelType"/>
            <xs:element name="p4edit" type="p4editType"/>
            <xs:element name="manifest" type="manifestType"/>
            <xs:element name="maudit" type="mauditType"/>
            <xs:element name="antlr" type="antlrType"/>
            <xs:element name="jpcovreport" type="jpcovreportType"/>
            <xs:element name="execon" type="execonType"/>
            <xs:element name="ant" type="antType"/>
            <xs:element name="xmlvalidate" type="xmlvalidateType"/>
            <xs:element name="xslt" type="xsltType"/>
            <xs:element name="p4resolve" type="p4resolveType"/>
            <xs:element name="gzip" type="gzipType"/>
            <xs:element name="native2ascii" type="native2asciiType"/>
            <xs:element name="ccrmtype" type="ccrmtypeType"/>
            <xs:element name="ear" type="earType"/>
            <xs:element name="input" type="inputType"/>
            <xs:element name="presetdef" type="presetdefType"/>
            <xs:element name="rmic" type="rmicType"/>
            <xs:element name="checksum" type="checksumType"/>
            <xs:element name="mail" type="mailType"/>
            <xs:element name="loadfile" type="loadfileType"/>
            <xs:element name="loadresource" type="loadresourceType"/>
            <xs:element name="mimemail" type="mimemailType"/>
            <xs:element name="gunzip" type="gunzipType"/>
            <xs:element name="concat" type="concatType"/>
            <xs:element name="cab" type="cabType"/>
            <xs:element name="touch" type="touchType"/>
            <xs:element name="parallel" type="parallelType"/>
            <xs:element name="splash" type="splashType"/>
            <xs:element name="antcall" type="antcallType"/>
            <xs:element name="typedef" type="typedefType"/>
            <xs:element name="p4have" type="p4haveType"/>
            <xs:element name="filter" type="filterType"/>
            <xs:element name="xmlproperty" type="xmlpropertyType"/>
            <xs:element name="import" type="importType"/>
            <xs:element name="copy" type="copyType"/>
            <xs:element name="jsharpc" type="jsharpcType"/>
            <xs:element name="symlink" type="symlinkType"/>
            <xs:element name="antstructure" type="antstructureType"/>
            <xs:element name="script" type="scriptType"/>
            <xs:element name="rpm" type="rpmType"/>
            <xs:element name="delete" type="deleteType"/>
            <xs:element name="replace" type="replaceType"/>
            <xs:element name="attrib" type="attribType"/>
            <xs:element name="waitfor" type="waitforType"/>
            <xs:element name="untar" type="untarType"/>
            <xs:element name="loadproperties" type="loadpropertiesType"/>
            <xs:element name="available" type="availableType"/>
            <xs:element name="echoproperties" type="echopropertiesType"/>
            <xs:element name="chgrp" type="chgrpType"/>
            <xs:element name="vajexport" type="vajexportType"/>
            <xs:element name="bunzip2" type="bunzip2Type"/>
            <xs:element name="whichresource" type="whichresourceType"/>
            <xs:element name="copyfile" type="copyfileType"/>
            <xs:element name="p4labelsync" type="p4labelsyncType"/>
            <xs:element name="macrodef" type="macrodefType"/>
            <xs:element name="unjar" type="unjarType"/>
            <xs:element name="vbc" type="vbcType"/>
            <xs:element name="mkdir" type="mkdirType"/>
            <xs:element name="condition" type="conditionType"/>
            <xs:element name="cvs" type="cvsType"/>
            <xs:element name="tempfile" type="tempfileType"/>
            <xs:element name="junit" type="junitType"/>
            <xs:element name="junitreport" type="junitreportType"/>
            <xs:element name="cobertura-instrument" type="cobertura-instrumentType"/>
            <xs:element name="cobertura-report" type="cobertura-reportType"/>
            <xs:element name="taskdef" type="taskdefType"/>
            <xs:element name="echo" type="echoType"/>
            <xs:element name="java" type="javaType"/>
            <xs:element name="renameext" type="renameextType"/>
            <xs:element name="basename" type="basenameType"/>
            <xs:element name="javadoc2" type="javadoc2Type"/>
            <xs:element name="tar" type="tarType"/>
            <xs:element name="vajimport" type="vajimportType"/>
            <xs:element name="p4fstat" type="p4fstatType"/>
            <xs:element name="setproxy" type="setproxyType"/>
            <xs:element name="p4counter" type="p4counterType"/>
            <xs:element name="ilasm" type="ilasmType"/>
            <xs:element name="apply" type="applyType"/>
            <xs:element name="jarlib-resolve" type="jarlib-resolveType"/>
            <xs:element name="jlink" type="jlinkType"/>
            <xs:element name="cvstagdiff" type="cvstagdiffType"/>
            <xs:element name="javacc" type="javaccType"/>
            <xs:element name="chmod" type="chmodType"/>
            <xs:element name="pvcs" type="pvcsType"/>
            <xs:element name="jarlib-manifest" type="jarlib-manifestType"/>
            <xs:element name="jar" type="jarType"/>
            <xs:element name="ccmklbtype" type="ccmklbtypeType"/>
            <xs:element name="sound" type="soundType"/>
            <xs:element name="scriptdef" type="scriptdefType"/>
            <xs:element name="defaultexcludes" type="defaultexcludesType"/>
            <xs:element name="blgenclient" type="blgenclientType"/>
            <xs:element name="uptodate" type="uptodateType"/>
            <xs:element name="jjdoc" type="jjdocType"/>
            <xs:element name="genkey" type="genkeyType"/>
            <xs:element name="javah" type="javahType"/>
            <xs:element name="ccmreconfigure" type="ccmreconfigureType"/>
            <xs:element name="fail" type="failType"/>
            <xs:element name="unzip" type="unzipType"/>
            <xs:element name="javac" type="javacType"/>
            <xs:element name="p4add" type="p4addType"/>
            <xs:element name="jpcoverage" type="jpcoverageType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="deltree" type="deltreeType"/>
            <xs:element name="ddcreator" type="ddcreatorType"/>
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="assertions" type="assertionsType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="filterset" type="filtersetType"/>
            <xs:element name="libfileset" type="libfilesetType"/>
            <xs:element name="filterreader" type="filterreaderType"/>
            <xs:element name="scriptfilter" type="scriptfilterType"/>
            <xs:element name="concatfilter" type="concatfilterType"/>
            <xs:element name="extension" type="extensionType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="filterchain" type="filterchainType"/>
            <xs:element name="path" type="pathType"/>
            <xs:element name="classfileset" type="classfilesetType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
            <xs:element name="description" type="descriptionType"/>
            <xs:element name="mapper" type="mapperType"/>
            <xs:element name="zipfileset" type="zipfilesetType"/>
            <xs:element name="substitution" type="substitutionType"/>
            <xs:element name="extensionSet" type="extensionSetType"/>
            <xs:element name="regexp" type="regexpType"/>
            <xs:element name="foreach" type="foreachType"/>
            <xs:element name="doxygen" type="doxygenType"/>
            <xs:element name="var" type="varType"/>
            <xs:element name="propertyregex" type="propertyregexType"/>
            <xs:element name="if" type="ifType"/>
            <xs:element name="for" type="forType"/>
            <xs:element name="mergelogs" type="mergelogsType"/>
            <xs:element name="reviewplan" type="reviewplanType"/>
            <xs:element name="processreviewplan" type="processreviewplanType"/>
            <xs:element name="convertreviewlog" type="convertreviewlogType"/>
            <xs:element name="lint" type="lintType"/>
            <xs:element name="customcopy" type="customcopyType"/>
            <xs:element name="fop" type="fopType"/>
            <xs:element name="xmltask" type="xmltaskType"/>
            <xs:element name="ftp" type="ftpType"/>
            <xs:element name="abld" type="abldType"/>
            <xs:element name="getsize" type="getsizeType"/>
            <xs:element name="grand" type="grandType"/>
            <xs:element name="svn" type="svnType"/>
            <xs:element name="antunit" type="antunitType"/>
            <xs:element name="schemavalidate" type="schemavalidateType"/>
            <xs:element name="python" type="pythonType"/>
            <xs:element name="antform" type="antformType"/>
            <xs:element name="math" type="mathType"/>
            <xs:element name="antserver" type="antserverType"/>
            <xs:element name="shellscript" type="shellscriptType"/>
            <xs:element name="runtarget" type="runtargetType"/>
            <xs:element name="echoxml" type="echoxmlType"/>
            <xs:element name="trycatch" type="trycatchType"/>
            <xs:element name="resourcecount" type="resourcecountType"/>
            <xs:element name="remoteant" type="remoteantType"/>
            <xs:element name="retry" type="retryType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="then" type="thenType"/>
            <xs:element name="antcallback" type="antcallbackType"/>
            <xs:element name="diagnostics" type="diagnosticsType"/>
            <xs:element name="sshexec" type="sshexecType"/>
            <xs:element name="scp" type="scpType"/>
            <xs:element name="xcluder" type="xcluderType"/>
            <xs:element name="assertTrue" type="assertTrueType"/>
            <xs:element name="assertFileExists" type="assertFileExistsType"/>
            <xs:element name="fmpp" type="fmppType"/>
            <xs:element name="timestampselector" type="timestampselectorType"/>
            <xs:element name="preset.exec" type="preset.execType"/>
            <xs:element name="preset.mail" type="preset.mailType"/>
            <xs:element name="createDeltaZipMacro" type="createDeltaZipMacroType"/>
            <xs:element name="zipContentMacro" type="zipContentMacroType"/>
            
            <xs:element ref="au:assertPropertyEquals"/>
            <xs:element ref="au:assertLogDoesntContain"/>
            <xs:element ref="au:assertPropertySet"/>
            
            <xs:element ref="hlm:configuration"/>
            <xs:element ref="hlm:database"/>
            <xs:element ref="hlm:logextract"/>
            <xs:element ref="hlm:signal"/>
            <xs:element ref="hlm:dependencies"/>
            <xs:element ref="hlm:compileHtmlscanlogMacro"/>
            <xs:element ref="hlm:cmakerMacro"/>
            <xs:element ref="hlm:compileEbsMacro"/>
            <xs:element ref="hlm:buildEbsXmlMacro"/>
            <xs:element ref="hlm:logHtmlMacro"/>
            <xs:element ref="hlm:compileGenxmlMacro"/>
            <xs:element ref="hlm:bldmakeBldfilesMacro"/>
            <xs:element ref="hlm:abldMacro"/>
            <xs:element ref="hlm:filterRecordStartMacro"/>
            <xs:element ref="hlm:filterRecordStopMacro"/>
            <xs:element ref="hlm:updateStatusMacro"/>
            <xs:element ref="hlm:createCshelpBldinfMacro"/>
            <xs:element ref="hlm:imakerMacro"/>
            <xs:element ref="hlm:rombuildImakerMacro"/>
            <xs:element ref="hlm:ecImakerMacro"/>
            <xs:element ref="hlm:preECImakerMacro"/>
            <xs:element ref="hlm:ccmAvailableMacro"/>
            <xs:element ref="hlm:publishMacro"/>
            <xs:element ref="hlm:rombuildMacro"/>
            <xs:element ref="hlm:notifyMacro"/>
            <xs:element ref="hlm:diskspaceMacro"/>
            <xs:element ref="hlm:netrcPasswordMacro"/>
            <xs:element ref="hlm:netrcUsernameMacro"/>
            <xs:element ref="hlm:compileGenxmlMergeMacro"/>
            <xs:element ref="hlm:declareIdMacro"/>
            <xs:element ref="hlm:mailTargetCompletedMacro"/>
            <xs:element ref="hlm:deleteFotaConfMacro"/>
            <xs:element ref="hlm:rombuildValueMacro"/>
            <xs:element ref="hlm:assert"/>
            <xs:element ref="hlm:assertFileExists"/>
            <xs:element ref="hlm:referenceToFileMacro"/>
            <xs:element ref="hlm:xmlToFmtlMacro"/>
            <xs:element ref="hlm:tempRecordStartMacro"/>
            <xs:element ref="hlm:tempRecordStopMacro"/>
            <xs:element ref="hlm:fooMacro"/>
            <!-- Presets -->
            <!-- Macros -->
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="resourceCollectionContainerType" abstract="true">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
            <xs:element name="first" type="firstType"/>
            <xs:element name="sort" type="sortType"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="addfilesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="andType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="isset" type="issetType"/>
            <xs:element name="os" type="osType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="antType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="property" type="propertyType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="inheritAll">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="inheritrefs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="antfile" type="xs:string"/>
        <xs:attribute name="target" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="antcallType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="param" type="paramType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="inheritAll">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="inheritrefs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="target" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="antlrType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="jvmarg" type="jvmargType"/>
            <xs:element name="classpath" type="classpathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputdirectory" type="xs:string"/>
        <xs:attribute name="fork">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="trace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tracetreewalker">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="html">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tracelexer">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="diagnostic">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="traceparser">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="glib" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="antstructureType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="applyType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="archivesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="argType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="line" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="argumentType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="line" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="assertionsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="disable" type="disableType"/>
            <xs:element name="enable" type="enableType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="enablesystemassertions">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="attribType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="readonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="hidden">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="system">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="archive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="attributeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="default" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="availableType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="filepath" type="filepathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="ignoresystemclasses">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="filepath" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="basenameType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="suffix" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="bccType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="address" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="blgenclientType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="mode" type="xs:string"/>
        <xs:attribute name="ejbjar" type="xs:string"/>
        <xs:attribute name="version" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="clientjar" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="bootclasspathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="bottomType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="buildnumberType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="buildpathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="buildpathelementType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="bunzip2Type">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="bzip2Type">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="zipfile" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cabType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cabfile" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="options" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="catalogpathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ccType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="address" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ccmklabelType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="recurse">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="replace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="viewpath" type="xs:string"/>
        <xs:attribute name="typename" type="xs:string"/>
        <xs:attribute name="comment" type="xs:string"/>
        <xs:attribute name="version" type="xs:string"/>
        <xs:attribute name="failonerr">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="objselect" type="xs:string"/>
        <xs:attribute name="cleartooldir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vob" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="commentfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ccmklbtypeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="global">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="replace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="shared">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="viewpath" type="xs:string"/>
        <xs:attribute name="typename" type="xs:string"/>
        <xs:attribute name="pbranch">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="comment" type="xs:string"/>
        <xs:attribute name="failonerr">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="objselect" type="xs:string"/>
        <xs:attribute name="cleartooldir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vob" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="commentfile" type="xs:string"/>
        <xs:attribute name="ordinary">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="ccmreconfigureType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="ccmaction" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="ccmproject" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="recurse">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="ccmdir" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ccrmtypeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="viewpath" type="xs:string"/>
        <xs:attribute name="typename" type="xs:string"/>
        <xs:attribute name="rmall">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="comment" type="xs:string"/>
        <xs:attribute name="ignore">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="typekind" type="xs:string"/>
        <xs:attribute name="failonerr">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="objselect" type="xs:string"/>
        <xs:attribute name="cleartooldir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vob" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="commentfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="checksumType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="fileext" type="xs:string"/>
        <xs:attribute name="totalproperty" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="readbuffersize" type="xs:string"/>
        <xs:attribute name="verifyproperty" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="algorithm" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="provider" type="xs:string"/>
        <xs:attribute name="forceoverwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="chgrpType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="group" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="chmodType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="mapper" type="mapperType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="arg" type="argType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="perm" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="chownType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="owner" type="xs:string"/>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="classType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="classconstantsType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="classesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="classfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="rootfileset" type="rootfilesetType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="root" type="rootType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="rootclass" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="classpathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="commandlineType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="marker" type="markerType"/>
            <xs:element name="argument" type="argumentType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="executable" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="commentType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="compilerargType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="line" type="xs:string"/>
        <xs:attribute name="implementation" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="compiler" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="compilerclasspathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="concatType" mixed="true">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterchain" type="filterchainType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="path" type="pathType"/>
            <xs:element name="footer" type="footerType"/>
            <xs:element name="header" type="headerType"/>
            <xs:element name="propertyresource" type="propertyresourceType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="force">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="eol">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="asis"/>
                    <xs:enumeration value="cr"/>
                    <xs:enumeration value="lf"/>
                    <xs:enumeration value="crlf"/>
                    <xs:enumeration value="mac"/>
                    <xs:enumeration value="unix"/>
                    <xs:enumeration value="dos"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputencoding" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="fixlastline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="concatfilterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="append" type="xs:string"/>
        <xs:attribute name="prepend" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="conditionType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="isfalse" type="isfalseType"/>
            <xs:element name="isreference" type="isreferenceType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="available" type="availableType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="contains" type="containsconditionType"/>
            <xs:element name="os" type="osType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="filesmatch" type="filesmatchType"/>
            <xs:element name="checksum" type="checksumType"/>
            <xs:element name="istrue" type="istrueType"/>
            <xs:element name="isset" type="issetType"/>
            <xs:element name="socket" type="socketType"/>
            <xs:element name="http" type="httpType"/>
            <xs:element name="uptodate" type="uptodateType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="containsType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="ignorewhitespace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="text" type="xs:string"/>
    </xs:complexType>
    <!-- Used for <contains> in <fail> -->
    <xs:complexType name="containsconditionType">
        <xs:attribute name="casesensitive" type="xs:boolean"/>
        <xs:attribute name="string" type="xs:string"/>
        <xs:attribute name="substring" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="containsregexType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flags" type="xs:string"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="replace" type="xs:string"/>
        <xs:attribute name="pattern" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="containsregexpType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="expression" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="containsstringType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="contains" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="copyType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterchain" type="filterchainType"/>
            <xs:element name="resources" type="resourcesType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="filterset" type="filtersetType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flatten">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="verbose" type="xs:string"/>
        <xs:attribute name="includeemptydirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="enablemultiplemappings">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputencoding" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="preservelastmodified">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filtering">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="copydirType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flatten">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="forceoverwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="filtering">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="copyfileType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="forceoverwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="filtering" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="coveragepathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cscType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="resource" type="resourceType"/>
            <xs:element name="define" type="defineType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="src" type="srcType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="win32icon" type="xs:string"/>
        <xs:attribute name="definitions" type="xs:string"/>
        <xs:attribute name="referencefiles" type="xs:string"/>
        <xs:attribute name="fullpaths">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="mainclass" type="xs:string"/>
        <xs:attribute name="utf8output">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="useresponsefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includedefaultreferences">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="warnlevel" type="xs:string"/>
        <xs:attribute name="win32res" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="extraoptions" type="xs:string"/>
        <xs:attribute name="incremental">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="noconfig">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="references" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="optimize">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="additionalmodules" type="xs:string"/>
        <xs:attribute name="docfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="unsafe">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filealign" type="xs:string"/>
        <xs:attribute name="targettype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="exe"/>
                    <xs:enumeration value="library"/>
                    <xs:enumeration value="module"/>
                    <xs:enumeration value="winexe"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="customType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="param" type="paramType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cvsType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="commandline" type="commandlineType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cvsrsh" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="passfile" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="cvsroot" type="xs:string"/>
        <xs:attribute name="reallyquiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="compressionlevel" type="xs:string"/>
        <xs:attribute name="noexec">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="date" type="xs:string"/>
        <xs:attribute name="compression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tag" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cvschangelogType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="user" type="userType"/>
            <xs:element name="commandline" type="commandlineType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cvsrsh" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="passfile" type="xs:string"/>
        <xs:attribute name="end" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="start" type="xs:string"/>
        <xs:attribute name="cvsroot" type="xs:string"/>
        <xs:attribute name="reallyquiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="compressionlevel" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="usersfile" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="noexec">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="daysinpast" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="date" type="xs:string"/>
        <xs:attribute name="compression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tag" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cvspassType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="cvsroot" type="xs:string"/>
        <xs:attribute name="passfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cvstagdiffType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="commandline" type="commandlineType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cvsrsh" type="xs:string"/>
        <xs:attribute name="endtag" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="passfile" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="cvsroot" type="xs:string"/>
        <xs:attribute name="reallyquiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="starttag" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="compressionlevel" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="enddate" type="xs:string"/>
        <xs:attribute name="noexec">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="date" type="xs:string"/>
        <xs:attribute name="startdate" type="xs:string"/>
        <xs:attribute name="compression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tag" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="daemonsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="propertyfile" type="propertyfileType"/>
                <xs:element name="importtypelib" type="importtypelibType"/>
                <xs:element name="sql" type="sqlType"/>
                <xs:element name="cvspass" type="cvspassType"/>
                <xs:element name="p4reopen" type="p4reopenType"/>
                <xs:element name="csc" type="cscType"/>
                <xs:element name="dirname" type="dirnameType"/>
                <xs:element name="p4label" type="p4labelType"/>
                <xs:element name="p4revert" type="p4revertType"/>
                <xs:element name="replaceregexp" type="replaceregexpType"/>
                <xs:element name="get" type="getType"/>
                <xs:element name="jjtree" type="jjtreeType"/>
                <xs:element name="sleep" type="sleepType"/>
                <xs:element name="jarlib-display" type="jarlib-displayType"/>
                <xs:element name="dependset" type="dependsetType"/>
                <xs:element name="zip" type="zipType"/>
                <xs:element name="patch" type="patchType"/>
                <xs:element name="jspc" type="jspcType"/>
                <xs:element name="style" type="styleType"/>
                <xs:element name="test" type="testType"/>
                <xs:element name="tstamp" type="tstampType"/>
                <xs:element name="unwar" type="unwarType"/>
                <xs:element name="icontract" type="icontractType"/>
                <xs:element name="cvschangelog" type="cvschangelogType"/>
                <xs:element name="p4submit" type="p4submitType"/>
                <xs:element name="p4change" type="p4changeType"/>
                <xs:element name="bzip2" type="bzip2Type"/>
                <xs:element name="sync" type="syncType"/>
                <xs:element name="p4delete" type="p4deleteType"/>
                <xs:element name="javadoc" type="javadocType"/>
                <xs:element name="p4integrate" type="p4integrateType"/>
                <xs:element name="translate" type="translateType"/>
                <xs:element name="signjar" type="signjarType"/>
                <xs:element name="chown" type="chownType"/>
                <xs:element name="vajload" type="vajloadType"/>
                <xs:element name="jarlib-available" type="jarlib-availableType"/>
                <xs:element name="buildnumber" type="buildnumberType"/>
                <xs:element name="jpcovmerge" type="jpcovmergeType"/>
                <xs:element name="war" type="warType"/>
                <xs:element name="rename" type="renameType"/>
                <xs:element name="sequential" type="sequentialType"/>
                <xs:element name="serverdeploy" type="serverdeployType"/>
                <xs:element name="property" type="propertyType"/>
                <xs:element name="subant" type="subantType"/>
                <xs:element name="move" type="moveType"/>
                <xs:element name="ildasm" type="ildasmType"/>
                <xs:element name="copydir" type="copydirType"/>
                <xs:element name="fixcrlf" type="fixcrlfType"/>
                <xs:element name="pathconvert" type="pathconvertType"/>
                <xs:element name="record" type="recordType"/>
                <xs:element name="p4sync" type="p4syncType"/>
                <xs:element name="exec" type="execType"/>
                <xs:element name="ccmklabel" type="ccmklabelType"/>
                <xs:element name="p4edit" type="p4editType"/>
                <xs:element name="manifest" type="manifestType"/>
                <xs:element name="maudit" type="mauditType"/>
                <xs:element name="antlr" type="antlrType"/>
                <xs:element name="jpcovreport" type="jpcovreportType"/>
                <xs:element name="execon" type="execonType"/>
                <xs:element name="ant" type="antType"/>
                <xs:element name="xmlvalidate" type="xmlvalidateType"/>
                <xs:element name="xslt" type="xsltType"/>
                <xs:element name="p4resolve" type="p4resolveType"/>
                <xs:element name="gzip" type="gzipType"/>
                <xs:element name="native2ascii" type="native2asciiType"/>
                <xs:element name="ccrmtype" type="ccrmtypeType"/>
                <xs:element name="ear" type="earType"/>
                <xs:element name="input" type="inputType"/>
                <xs:element name="presetdef" type="presetdefType"/>
                <xs:element name="rmic" type="rmicType"/>
                <xs:element name="checksum" type="checksumType"/>
                <xs:element name="mail" type="mailType"/>
                <xs:element name="loadfile" type="loadfileType"/>
                <xs:element name="mimemail" type="mimemailType"/>
                <xs:element name="gunzip" type="gunzipType"/>
                <xs:element name="concat" type="concatType"/>
                <xs:element name="cab" type="cabType"/>
                <xs:element name="touch" type="touchType"/>
                <xs:element name="parallel" type="parallelType"/>
                <xs:element name="splash" type="splashType"/>
                <xs:element name="antcall" type="antcallType"/>
                <xs:element name="typedef" type="typedefType"/>
                <xs:element name="p4have" type="p4haveType"/>
                <xs:element name="filter" type="filterType"/>
                <xs:element name="xmlproperty" type="xmlpropertyType"/>
                <xs:element name="import" type="importType"/>
                <xs:element name="copy" type="copyType"/>
                <xs:element name="jsharpc" type="jsharpcType"/>
                <xs:element name="symlink" type="symlinkType"/>
                <xs:element name="antstructure" type="antstructureType"/>
                <xs:element name="script" type="scriptType"/>
                <xs:element name="rpm" type="rpmType"/>
                <xs:element name="delete" type="deleteType"/>
                <xs:element name="replace" type="replaceType"/>
                <xs:element name="attrib" type="attribType"/>
                <xs:element name="waitfor" type="waitforType"/>
                <xs:element name="untar" type="untarType"/>
                <xs:element name="loadproperties" type="loadpropertiesType"/>
                <xs:element name="available" type="availableType"/>
                <xs:element name="echoproperties" type="echopropertiesType"/>
                <xs:element name="chgrp" type="chgrpType"/>
                <xs:element name="vajexport" type="vajexportType"/>
                <xs:element name="bunzip2" type="bunzip2Type"/>
                <xs:element name="whichresource" type="whichresourceType"/>
                <xs:element name="copyfile" type="copyfileType"/>
                <xs:element name="p4labelsync" type="p4labelsyncType"/>
                <xs:element name="macrodef" type="macrodefType"/>
                <xs:element name="unjar" type="unjarType"/>
                <xs:element name="vbc" type="vbcType"/>
                <xs:element name="mkdir" type="mkdirType"/>
                <xs:element name="condition" type="conditionType"/>
                <xs:element name="cvs" type="cvsType"/>
                <xs:element name="tempfile" type="tempfileType"/>
                <xs:element name="junit" type="junitType"/>
                <xs:element name="junitreport" type="junitreportType"/>
                <xs:element name="cobertura-instrument" type="cobertura-instrumentType"/>
                <xs:element name="cobertura-report" type="cobertura-reportType"/>
                <xs:element name="taskdef" type="taskdefType"/>
                <xs:element name="echo" type="echoType"/>
                <xs:element name="java" type="javaType"/>
                <xs:element name="renameext" type="renameextType"/>
                <xs:element name="basename" type="basenameType"/>
                <xs:element name="javadoc2" type="javadoc2Type"/>
                <xs:element name="tar" type="tarType"/>
                <xs:element name="vajimport" type="vajimportType"/>
                <xs:element name="p4fstat" type="p4fstatType"/>
                <xs:element name="setproxy" type="setproxyType"/>
                <xs:element name="p4counter" type="p4counterType"/>
                <xs:element name="ilasm" type="ilasmType"/>
                <xs:element name="apply" type="applyType"/>
                <xs:element name="jarlib-resolve" type="jarlib-resolveType"/>
                <xs:element name="jlink" type="jlinkType"/>
                <xs:element name="cvstagdiff" type="cvstagdiffType"/>
                <xs:element name="javacc" type="javaccType"/>
                <xs:element name="chmod" type="chmodType"/>
                <xs:element name="pvcs" type="pvcsType"/>
                <xs:element name="jarlib-manifest" type="jarlib-manifestType"/>
                <xs:element name="jar" type="jarType"/>
                <xs:element name="ccmklbtype" type="ccmklbtypeType"/>
                <xs:element name="sound" type="soundType"/>
                <xs:element name="scriptdef" type="scriptdefType"/>
                <xs:element name="defaultexcludes" type="defaultexcludesType"/>
                <xs:element name="blgenclient" type="blgenclientType"/>
                <xs:element name="uptodate" type="uptodateType"/>
                <xs:element name="jjdoc" type="jjdocType"/>
                <xs:element name="genkey" type="genkeyType"/>
                <xs:element name="javah" type="javahType"/>
                <xs:element name="fail" type="failType"/>
                <xs:element name="unzip" type="unzipType"/>
                <xs:element name="javac" type="javacType"/>
                <xs:element name="p4add" type="p4addType"/>
                <xs:element name="jpcoverage" type="jpcoverageType"/>
                <xs:element name="depend" type="dependType"/>
                <xs:element name="deltree" type="deltreeType"/>
                <xs:element name="ddcreator" type="ddcreatorType"/>
                <xs:element name="retry" type="retryType"/>
            </xs:choice>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="dateType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="when">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="before"/>
                    <xs:enumeration value="after"/>
                    <xs:enumeration value="equal"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="millis" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="checkdirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="granularity" type="xs:string"/>
        <xs:attribute name="datetime" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ddcreatorType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="descriptors" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="defaultexcludesType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="remove" type="xs:string"/>
        <xs:attribute name="echo">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="default">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="add" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="defineType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="deleteType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeemptydirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="deletecharactersType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="chars" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="deltreeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dependType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="mapper" type="mapperType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="targetdir" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="granularity" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dependsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="libfileset" type="libfilesetType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dependsetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="targetfileset" type="targetfilesetType"/>
            <xs:element name="srcfileset" type="srcfilesetType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="srcfilelist" type="srcfilelistType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="targetfilelist" type="targetfilelistType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="depthType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="max" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="min" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="descriptionType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="refid" type="xs:IDREF"/>
                <xs:attribute name="description" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="differentType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="mapper" type="mapperType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="targetdir" type="xs:string"/>
        <xs:attribute name="ignoreFileTimes" type="xs:string"/>
        <xs:attribute name="ignoreContents" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="ignorefiletimes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="granularity" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dirnameType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dirsetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="disableType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dnameType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="param" type="paramType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="docletType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="path" type="pathType"/>
            <xs:element name="param" type="paramType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="doctitleType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="dtdType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="base" type="xs:string"/>
        <xs:attribute name="publicid" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="earType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="manifest" type="manifestType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="metainf" type="metainfType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="archives" type="archivesType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="zipgroupfileset" type="zipgroupfilesetType"/>
            <xs:element name="zipfileset" type="zipfilesetType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="keepcompression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="whenempty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="create"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="duplicate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="preserve"/>
                    <xs:enumeration value="fail"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="manifest" type="xs:string"/>
        <xs:attribute name="jarfile" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="index">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="update">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="earfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="appxml" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="manifestencoding" type="xs:string"/>
        <xs:attribute name="filesonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="filesetmanifest">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="merge"/>
                    <xs:enumeration value="mergewithoutmain"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="zipfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="echoType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="append">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="file" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
                <xs:attribute name="message" type="xs:string"/>
                <xs:attribute name="level">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="error"/>
                            <xs:enumeration value="warning"/>
                            <xs:enumeration value="info"/>
                            <xs:enumeration value="verbose"/>
                            <xs:enumeration value="debug"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="echopropertiesType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="propertyset" type="propertysetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="format">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="xml"/>
                    <xs:enumeration value="text"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="srcfile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="elementType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="optional">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="implicit" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="type" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="enableType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="entityType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="base" type="xs:string"/>
        <xs:attribute name="publicid" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="entryType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="operation" type="xs:string"/>
        <xs:attribute name="default" type="xs:string"/>
        <xs:attribute name="key" type="xs:string"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="int"/>
                    <xs:enumeration value="date"/>
                    <xs:enumeration value="string"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="unit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="millisecond"/>
                    <xs:enumeration value="second"/>
                    <xs:enumeration value="minute"/>
                    <xs:enumeration value="hour"/>
                    <xs:enumeration value="day"/>
                    <xs:enumeration value="week"/>
                    <xs:enumeration value="month"/>
                    <xs:enumeration value="year"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="pattern" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="envType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="key" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="redirectorType">
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="logError" type="xs:string"/>
        <xs:attribute name="append" type="xs:boolean"/>
        <xs:attribute name="createemptyfiles" type="xs:boolean"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="inputencoding" type="xs:string"/>
        <xs:attribute name="outputencoding" type="xs:string"/>
        <xs:attribute name="errorencoding" type="xs:string"/>
        <xs:attribute name="alwayslog" type="xs:boolean"/>
        <xs:attribute name="loginputstring" type="xs:boolean"/>
    </xs:complexType>
    <xs:complexType name="equalsType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="trim">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="arg2" type="xs:string"/>
        <xs:attribute name="arg1" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="escapeunicodeType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="excludeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="excludepackageType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="excludesfileType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="execType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="redirector" type="redirectorType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="osfamily" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="execonType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="existingType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="expandpropertiesType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="extdirsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="extensionType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="implementationversion" type="xs:string"/>
        <xs:attribute name="specificationversion" type="xs:string"/>
        <xs:attribute name="extensionname" type="xs:string"/>
        <xs:attribute name="implementationvendorid" type="xs:string"/>
        <xs:attribute name="specificationvendor" type="xs:string"/>
        <xs:attribute name="implementationurl" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="implementationvendor" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="extensionSetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="libfileset" type="libfilesetType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="extensionsetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="libfileset" type="libfilesetType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="factoryType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="attribute" type="attributeType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="failType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="condition" type="conditionType"/>
        </xs:choice>
        <xs:attribute name="message" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="failsoundType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="loops" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="duration" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filelistType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="files" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filenameType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="negate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="filepathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="resourcesType">
        <xs:attribute name="refid" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filesmatchType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="file2" type="xs:string"/>
        <xs:attribute name="file1" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filetokenizerType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="filterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="token" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filterchainType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="headfilter" type="headfilterType"/>
            <xs:element name="classconstants" type="classconstantsType"/>
            <xs:element name="linecontains" type="linecontainsType"/>
            <xs:element name="filterreader" type="filterreaderType"/>
            <xs:element name="replaceregex" type="replaceregexType"/>
            <xs:element name="replacetokens" type="replacetokensType"/>
            <xs:element name="escapeunicode" type="escapeunicodeType"/>
            <xs:element name="ignoreblank" type="ignoreblankType"/>
            <xs:element name="tailfilter" type="tailfilterType"/>
            <xs:element name="tabstospaces" type="tabstospacesType"/>
            <xs:element name="prefixlines" type="prefixlinesType"/>
            <xs:element name="expandproperties" type="expandpropertiesType"/>
            <xs:element name="striplinebreaks" type="striplinebreaksType"/>
            <xs:element name="trim" type="trimType"/>
            <xs:element name="striplinecomments" type="striplinecommentsType"/>
            <xs:element name="replacestring" type="replacestringType"/>
            <xs:element name="tokenfilter" type="tokenfilterType"/>
            <xs:element name="stripjavacomments" type="stripjavacommentsType"/>
            <xs:element name="containsregex" type="containsregexType"/>
            <xs:element name="deletecharacters" type="deletecharactersType"/>
            <xs:element name="linecontainsregexp" type="linecontainsregexpType"/>
            <xs:element name="concatfilter" type="concatfilterType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filtermapperType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="replaceregex" type="replaceregexType"/>
            <xs:element name="scriptfilter" type="scriptfilterType"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="scriptmapperType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="setbeans">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <xs:attribute name="src" type="xs:string"/>
                <xs:attribute name="language" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="filterreaderType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="param" type="paramType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filtersType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="include" type="includeType"/>
            <xs:element name="exclude" type="excludeType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="defaultexclude">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="filtersetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterset" type="filtersetType"/>
            <xs:element name="filter" type="filterType"/>
            <xs:element name="filtersfile" type="filtersfileType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="begintoken" type="xs:string"/>
        <xs:attribute name="endtoken" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="filtersfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filtersfileType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="file" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="fixcrlfType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="tab">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="asis"/>
                    <xs:enumeration value="remove"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="cr">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="asis"/>
                    <xs:enumeration value="remove"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="eol">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="asis"/>
                    <xs:enumeration value="cr"/>
                    <xs:enumeration value="lf"/>
                    <xs:enumeration value="crlf"/>
                    <xs:enumeration value="mac"/>
                    <xs:enumeration value="unix"/>
                    <xs:enumeration value="dos"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="javafiles">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="eof">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="asis"/>
                    <xs:enumeration value="remove"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tablength" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fixlast">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="footerType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="formatType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="locale" type="xs:string"/>
        <xs:attribute name="timezone" type="xs:string"/>
        <xs:attribute name="unit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="millisecond"/>
                    <xs:enumeration value="second"/>
                    <xs:enumeration value="minute"/>
                    <xs:enumeration value="hour"/>
                    <xs:enumeration value="day"/>
                    <xs:enumeration value="week"/>
                    <xs:enumeration value="month"/>
                    <xs:enumeration value="year"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="pattern" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="offset" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="fromType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="address" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="genericType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="jvmarg" type="jvmargType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="server" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="username" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="genkeyType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="dname" type="dnameType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="storepass" type="xs:string"/>
        <xs:attribute name="sigalg" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keypass" type="xs:string"/>
        <xs:attribute name="dname" type="xs:string"/>
        <xs:attribute name="keysize" type="xs:string"/>
        <xs:attribute name="alias" type="xs:string"/>
        <xs:attribute name="keyalg" type="xs:string"/>
        <xs:attribute name="validity" type="xs:string"/>
        <xs:attribute name="keystore" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="storetype" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="getType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="ignoreerrors">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="username" type="xs:string"/>
        <xs:attribute name="usetimestamp">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="grantType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
        <xs:attribute name="actions" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="groupType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="package" type="packageType"/>
            <xs:element name="title" type="titleType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="packages" type="xs:string"/>
        <xs:attribute name="title" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="gunzipType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="gzipType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="zipfile" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="headerType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="headfilterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="lines" type="xs:string"/>
        <xs:attribute name="skip" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="httpType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="url" type="xs:string"/>
        <xs:attribute name="errorsbeginat" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="icontractType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classdir" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="repositorydir" type="xs:string"/>
        <xs:attribute name="instrumentdir" type="xs:string"/>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="builddir" type="xs:string"/>
        <xs:attribute name="updateicontrol">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="pre">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="controlfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="invariant">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="post">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="failthrowable" type="xs:string"/>
        <xs:attribute name="verbosity" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="repbuilddir" type="xs:string"/>
        <xs:attribute name="targets" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ignoreblankType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="ilasmType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="src" type="srcType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="owner" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="extraoptions" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="targettype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="exe"/>
                    <xs:enumeration value="library"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="outputfile" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="resourcefile" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="listing">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keyfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ildasmType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="assembler">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="encoding">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="ascii"/>
                    <xs:enumeration value="utf8"/>
                    <xs:enumeration value="unicode"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="progressbar">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="linenumbers">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="rawexceptionhandling">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="showsource">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="metadata">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="srcfile" type="xs:string"/>
        <xs:attribute name="bytes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="resourcedir" type="xs:string"/>
        <xs:attribute name="quoteallnames">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="header">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="visibility" type="xs:string"/>
        <xs:attribute name="sourcefile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="item" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="importType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="optional">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="importtypelibType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="unsafe">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="usesysarray">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="namespace" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="extraoptions" type="xs:string"/>
        <xs:attribute name="srcfile" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="includeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="includesfileType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="inputType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="addproperty" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
                <xs:attribute name="defaultvalue" type="xs:string"/>
                <xs:attribute name="validargs" type="xs:string"/>
                <xs:attribute name="message" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="isfalseType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="value">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="isreferenceType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="type" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="issetType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="istrueType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="value">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="jarType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="manifest" type="manifestType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="metainf" type="metainfType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="zipgroupfileset" type="zipgroupfilesetType"/>
            <xs:element name="zipfileset" type="zipfilesetType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="whenempty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="create"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keepcompression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="duplicate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="preserve"/>
                    <xs:enumeration value="fail"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="manifest" type="xs:string"/>
        <xs:attribute name="jarfile" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="index">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="update">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="manifestencoding" type="xs:string"/>
        <xs:attribute name="filesonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="filesetmanifest">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="merge"/>
                    <xs:enumeration value="mergewithoutmain"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="zipfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jarlib-availableType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="extensionset" type="extensionsetType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jarlib-displayType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jarlib-manifestType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="options" type="optionsType"/>
            <xs:element name="attribute" type="attributeType"/>
            <xs:element name="depends" type="dependsType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jarlib-resolveType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="ant" type="antType"/>
            <xs:element name="location" type="locationType"/>
            <xs:element name="url" type="urlType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="checkextension">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="javaType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="sysproperty" type="syspropertyType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
            <xs:element name="syspropertyset" type="syspropertysetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="permissions" type="permissionsType"/>
            <xs:element name="jvmarg" type="jvmargType"/>
            <xs:element name="arg" type="argType"/>
            <xs:element name="assertions" type="assertionsType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="jvmargs" type="xs:string"/>
        <xs:attribute name="args" type="xs:string"/>
        <xs:attribute name="fork">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="jar" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="jvm" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="jvmversion" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="javacType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="src" type="srcType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="sourcepath" type="sourcepathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="compilerarg" type="compilerargType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspathref" type="xs:IDREF"/>
        <xs:attribute name="compiler" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="debuglevel" type="xs:string"/>
        <xs:attribute name="memoryinitialsize" type="xs:string"/>
        <xs:attribute name="deprecation">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeantruntime">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="sourcepathref" type="xs:IDREF"/>
        <xs:attribute name="depend">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="includejavaruntime">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tempdir" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspath" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="nowarn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="proceed">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="fork">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="memorymaximumsize" type="xs:string"/>
        <xs:attribute name="optimize">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="sourcepath" type="xs:string"/>
        <xs:attribute name="listfiles">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="extdirs" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="javaccType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="debugparser">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="javacchome" type="xs:string"/>
        <xs:attribute name="forcelacheck">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="optimizetokenmanager">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="commontokenaction">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="buildtokenmanager">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="sanitycheck">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="buildparser">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="otherambiguitycheck" type="xs:string"/>
        <xs:attribute name="lookahead" type="xs:string"/>
        <xs:attribute name="debuglookahead">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="choiceambiguitycheck" type="xs:string"/>
        <xs:attribute name="unicodeinput">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="usercharstream">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="debugtokenmanager">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keeplinecolumn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="outputdirectory" type="xs:string"/>
        <xs:attribute name="cachetokens">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="javaunicodeescape">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="static">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="ignorecase">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="usertokenmanager">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errorreporting">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="javadocType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="taglet" type="tagletType"/>
            <xs:element name="doclet" type="docletType"/>
            <xs:element name="package" type="packageType"/>
            <xs:element name="arg" type="argType"/>
            <xs:element name="link" type="linkType"/>
            <xs:element name="doctitle" type="doctitleType"/>
            <xs:element name="bottom" type="bottomType"/>
            <xs:element name="group" type="groupType"/>
            <xs:element name="packageset" type="packagesetType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="sourcepath" type="sourcepathType"/>
            <xs:element name="footer" type="footerType"/>
            <xs:element name="source" type="sourceType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
            <xs:element name="header" type="headerType"/>
            <xs:element name="excludepackage" type="excludepackageType"/>
            <xs:element name="tag" type="tagType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="bottom" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspathref" type="xs:IDREF"/>
        <xs:attribute name="header" type="xs:string"/>
        <xs:attribute name="link" type="xs:string"/>
        <xs:attribute name="noindex">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="access">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="protected"/>
                    <xs:enumeration value="public"/>
                    <xs:enumeration value="package"/>
                    <xs:enumeration value="private"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="doclet" type="xs:string"/>
        <xs:attribute name="noqualifier" type="xs:string"/>
        <xs:attribute name="public">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="author">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="footer" type="xs:string"/>
        <xs:attribute name="docletpath" type="xs:string"/>
        <xs:attribute name="package">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="useexternalfile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="sourcepathref" type="xs:IDREF"/>
        <xs:attribute name="protected">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="breakiterator">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="nonavbar">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="group" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="linkoffline" type="xs:string"/>
        <xs:attribute name="additionalparam" type="xs:string"/>
        <xs:attribute name="linksource">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="locale" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspath" type="xs:string"/>
        <xs:attribute name="private">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="charset" type="xs:string"/>
        <xs:attribute name="nodeprecatedlist">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="stylesheetfile" type="xs:string"/>
        <xs:attribute name="docencoding" type="xs:string"/>
        <xs:attribute name="excludepackagenames" type="xs:string"/>
        <xs:attribute name="docletpathref" type="xs:IDREF"/>
        <xs:attribute name="packagenames" type="xs:string"/>
        <xs:attribute name="windowtitle" type="xs:string"/>
        <xs:attribute name="notree">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="splitindex">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="packagelist" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="doctitle" type="xs:string"/>
        <xs:attribute name="serialwarn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="old">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="use">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="sourcepath" type="xs:string"/>
        <xs:attribute name="helpfile" type="xs:string"/>
        <xs:attribute name="version">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="sourcefiles" type="xs:string"/>
        <xs:attribute name="extdirs" type="xs:string"/>
        <xs:attribute name="nohelp">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="nodeprecated">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="overview" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="javadoc2Type">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="taglet" type="tagletType"/>
            <xs:element name="doclet" type="docletType"/>
            <xs:element name="package" type="packageType"/>
            <xs:element name="arg" type="argType"/>
            <xs:element name="link" type="linkType"/>
            <xs:element name="doctitle" type="doctitleType"/>
            <xs:element name="bottom" type="bottomType"/>
            <xs:element name="group" type="groupType"/>
            <xs:element name="packageset" type="packagesetType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="sourcepath" type="sourcepathType"/>
            <xs:element name="footer" type="footerType"/>
            <xs:element name="source" type="sourceType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
            <xs:element name="header" type="headerType"/>
            <xs:element name="excludepackage" type="excludepackageType"/>
            <xs:element name="tag" type="tagType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="bottom" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspathref" type="xs:IDREF"/>
        <xs:attribute name="header" type="xs:string"/>
        <xs:attribute name="link" type="xs:string"/>
        <xs:attribute name="noindex">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="access">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="protected"/>
                    <xs:enumeration value="public"/>
                    <xs:enumeration value="package"/>
                    <xs:enumeration value="private"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="doclet" type="xs:string"/>
        <xs:attribute name="noqualifier" type="xs:string"/>
        <xs:attribute name="public">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="author">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="footer" type="xs:string"/>
        <xs:attribute name="docletpath" type="xs:string"/>
        <xs:attribute name="package">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="useexternalfile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="sourcepathref" type="xs:IDREF"/>
        <xs:attribute name="protected">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="breakiterator">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="nonavbar">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="group" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="linkoffline" type="xs:string"/>
        <xs:attribute name="additionalparam" type="xs:string"/>
        <xs:attribute name="linksource">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="locale" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspath" type="xs:string"/>
        <xs:attribute name="private">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="charset" type="xs:string"/>
        <xs:attribute name="nodeprecatedlist">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="stylesheetfile" type="xs:string"/>
        <xs:attribute name="docencoding" type="xs:string"/>
        <xs:attribute name="excludepackagenames" type="xs:string"/>
        <xs:attribute name="docletpathref" type="xs:IDREF"/>
        <xs:attribute name="packagenames" type="xs:string"/>
        <xs:attribute name="windowtitle" type="xs:string"/>
        <xs:attribute name="notree">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="splitindex">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="packagelist" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="doctitle" type="xs:string"/>
        <xs:attribute name="serialwarn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="old">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="use">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="sourcepath" type="xs:string"/>
        <xs:attribute name="helpfile" type="xs:string"/>
        <xs:attribute name="version">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="sourcefiles" type="xs:string"/>
        <xs:attribute name="extdirs" type="xs:string"/>
        <xs:attribute name="nohelp">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="nodeprecated">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="overview" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="javahType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="class" type="classType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="stubs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="force">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="old">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputfile" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspath" type="xs:string"/>
        <xs:attribute name="bootclasspathref" type="xs:IDREF"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jjdocType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="outputfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="javacchome" type="xs:string"/>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="text">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="onetable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="jjtreeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="nodedefaultvoid">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="buildnodefiles">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputdirectory" type="xs:string"/>
        <xs:attribute name="outputfile" type="xs:string"/>
        <xs:attribute name="static">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="javacchome" type="xs:string"/>
        <xs:attribute name="nodeprefix" type="xs:string"/>
        <xs:attribute name="nodefactory">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="multi">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="visitor">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="nodeusesparser">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="visitorexception" type="xs:string"/>
        <xs:attribute name="nodescopehook">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="nodepackage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jlinkType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="mergefiles" type="mergefilesType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="addfiles" type="addfilesType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="outfile" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="addfiles" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="mergefiles" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jonasType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="jonasroot" type="xs:string"/>
        <xs:attribute name="keepgeneric">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="additionalargs" type="xs:string"/>
        <xs:attribute name="javac" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="orb" type="xs:string"/>
        <xs:attribute name="jarsuffix" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="genericjarsuffix" type="xs:string"/>
        <xs:attribute name="nogenic">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="rmicopts" type="xs:string"/>
        <xs:attribute name="javacopts" type="xs:string"/>
        <xs:attribute name="novalidation">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keepgenerated">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="nocompil">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="secpropag">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="jpcoverageType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="socket" type="socketType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="jvmarg" type="jvmargType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="triggers" type="triggersType"/>
            <xs:element name="filters" type="filtersType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="applet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="recordfromstart">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="coverage"/>
                    <xs:enumeration value="none"/>
                    <xs:enumeration value="all"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="vm">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="java2"/>
                    <xs:enumeration value="jdk118"/>
                    <xs:enumeration value="jdk117"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="workingdir" type="xs:string"/>
        <xs:attribute name="inputfile" type="xs:string"/>
        <xs:attribute name="snapshotdir" type="xs:string"/>
        <xs:attribute name="seedname" type="xs:string"/>
        <xs:attribute name="javaexe" type="xs:string"/>
        <xs:attribute name="home" type="xs:string"/>
        <xs:attribute name="exitprompt" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="warnlevel" type="xs:string"/>
        <xs:attribute name="finalsnapshot" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="tracknatives">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="jpcovmergeType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="home" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jpcovreportType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="coveragepath" type="coveragepathType"/>
            <xs:element name="sourcepath" type="sourcepathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="snapshot" type="xs:string"/>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="filters" type="xs:string"/>
        <xs:attribute name="percent" type="xs:string"/>
        <xs:attribute name="home" type="xs:string"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="executive"/>
                    <xs:enumeration value="summary"/>
                    <xs:enumeration value="detailed"/>
                    <xs:enumeration value="verydetailed"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="format">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="html"/>
                    <xs:enumeration value="text"/>
                    <xs:enumeration value="xml"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includesource">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jsharpcType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="resource" type="resourceType"/>
            <xs:element name="define" type="defineType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="src" type="srcType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="references" type="xs:string"/>
        <xs:attribute name="useresponsefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="mainclass" type="xs:string"/>
        <xs:attribute name="extraoptions" type="xs:string"/>
        <xs:attribute name="additionalmodules" type="xs:string"/>
        <xs:attribute name="win32icon" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="utf8output">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includedefaultreferences">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="optimize">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="targettype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="exe"/>
                    <xs:enumeration value="library"/>
                    <xs:enumeration value="module"/>
                    <xs:enumeration value="winexe"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="win32res" type="xs:string"/>
        <xs:attribute name="baseaddress" type="xs:string"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="securescoping">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="purejava">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="warnlevel" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="referencefiles" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jspcType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="compilerclasspath" type="compilerclasspathType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="webapp" type="webappType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="mapped">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="ieplugin" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="compilerclasspath" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="uribase" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose" type="xs:string"/>
        <xs:attribute name="compiler" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="webxml" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="uriroot" type="xs:string"/>
        <xs:attribute name="webinc" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="junitType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="formatter" type="formatterType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="batchtest" type="batchtestType"/>
            <xs:element name="sysproperty" type="syspropertyType"/>
        </xs:choice>
        <xs:attribute name="fork" type="xs:string"/>
        <xs:attribute name="printsummary" type="xs:string"/>
        <xs:attribute name="haltonfailure" type="xs:string"/>
        <xs:attribute name="showoutput" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="junitreportType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="report" type="reportType"/>
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="tofile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cobertura-instrumentType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="ignore" type="ignoreType"/>
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="datafile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cobertura-reportType">
        <xs:choice minOccurs="0" maxOccurs="unbounded"/>
        <xs:attribute name="format" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="datafile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="formatterType">
        <xs:attribute name="type" type="xs:string"/>
        <xs:attribute name="usefile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="batchtestType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="formatter" type="formatterType"/>
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="fork" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ignoreType">
        <xs:attribute name="regex" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jvmargType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="line" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="libType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="libfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="urlbase" type="xs:string"/>
        <xs:attribute name="includeimpl">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeurl">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="linecontainsType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="contains" type="linecontains_containsType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="linecontains_containsType">
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="linecontainsregexpType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="regexp" type="regexpType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="linetokenizerType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="includedelims">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="linkType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="href" type="xs:string"/>
        <xs:attribute name="offline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="packagelistloc" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="loadfileType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterchain" type="filterchainType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="srcFile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="loadresourceType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="propertyresource" type="propertyresourceType"/>
            <xs:element name="filterchain" type="filterchainType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="quiet" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="loadpropertiesType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterchain" type="filterchainType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="srcFile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="locationType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macrodefType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="sequential" type="sequentialType"/>
            <xs:element name="element" type="elementType"/>
            <xs:element name="attribute" type="attributeType"/>
            <xs:element name="text" type="textType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="uri" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mailType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="bcc" type="bccType"/>
            <xs:element name="message" type="messageType"/>
            <xs:element name="replyto" type="replytoType"/>
            <xs:element name="cc" type="ccType"/>
            <xs:element name="to" type="toType"/>
            <xs:element name="from" type="fromType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cclist" type="xs:string"/>
        <xs:attribute name="messagefile" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="encoding">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="auto"/>
                    <xs:enumeration value="mime"/>
                    <xs:enumeration value="uu"/>
                    <xs:enumeration value="plain"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="charset" type="xs:string"/>
        <xs:attribute name="files" type="xs:string"/>
        <xs:attribute name="subject" type="xs:string"/>
        <xs:attribute name="message" type="xs:string"/>
        <xs:attribute name="ssl">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tolist" type="xs:string"/>
        <xs:attribute name="mailport" type="xs:string"/>
        <xs:attribute name="messagemimetype" type="xs:string"/>
        <xs:attribute name="bcclist" type="xs:string"/>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="replyto" type="xs:string"/>
        <xs:attribute name="mailhost" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="includefilenames">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="majorityType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="allowtie">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="manifestType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="attribute" type="attributeType"/>
            <xs:element name="section" type="sectionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="mapType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="to" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mapperType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="chainedmapper" type="chainedmapperType"/>
            <xs:element name="filtermapper" type="filtermapperType"/>
            <xs:element name="scriptmapper" type="scriptmapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="identity"/>
                    <xs:enumeration value="flatten"/>
                    <xs:enumeration value="glob"/>
                    <xs:enumeration value="merge"/>
                    <xs:enumeration value="regexp"/>
                    <xs:enumeration value="package"/>
                    <xs:enumeration value="unpackage"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="to" type="xs:string"/>
        <!-- TODO: define separate globmapper type because it has extra attributes -->
        <!--<xs:attribute name="casesensitive" type="xs:string"/>-->
    </xs:complexType>
    <xs:complexType name="globmapperType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="to" type="xs:string"/>
        <xs:attribute name="casesensitive" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="markerType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="mauditType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="jvmarg" type="jvmargType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="rulespath" type="rulespathType"/>
            <xs:element name="searchpath" type="searchpathType"/>
            <xs:element name="sourcepath" type="sourcepathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="exit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="offsets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="unused">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="fix">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="metamatahome" type="xs:string"/>
        <xs:attribute name="list">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="home" type="xs:string"/>
        <xs:attribute name="fullsemanticize">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mergefilesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="messageType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="mimetype" type="xs:string"/>
                <xs:attribute name="src" type="xs:string"/>
                <xs:attribute name="charset" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="metainfType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="methodType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="event" type="xs:string"/>
        <xs:attribute name="action" type="xs:string"/>
        <xs:attribute name="param" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mimemailType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="bcc" type="bccType"/>
            <xs:element name="message" type="messageType"/>
            <xs:element name="replyto" type="replytoType"/>
            <xs:element name="cc" type="ccType"/>
            <xs:element name="to" type="toType"/>
            <xs:element name="from" type="fromType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cclist" type="xs:string"/>
        <xs:attribute name="messagefile" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="encoding">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="auto"/>
                    <xs:enumeration value="mime"/>
                    <xs:enumeration value="uu"/>
                    <xs:enumeration value="plain"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="charset" type="xs:string"/>
        <xs:attribute name="files" type="xs:string"/>
        <xs:attribute name="subject" type="xs:string"/>
        <xs:attribute name="message" type="xs:string"/>
        <xs:attribute name="ssl">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tolist" type="xs:string"/>
        <xs:attribute name="mailport" type="xs:string"/>
        <xs:attribute name="messagemimetype" type="xs:string"/>
        <xs:attribute name="bcclist" type="xs:string"/>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="replyto" type="xs:string"/>
        <xs:attribute name="mailhost" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="includefilenames">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mkdirType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="modifiedType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="param" type="paramType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="comparator">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="equal"/>
                    <xs:enumeration value="rule"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="seldirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="cache">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="propertyfile"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="algorithm">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="hashvalue"/>
                    <xs:enumeration value="digest"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="update">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="moveType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterchain" type="filterchainType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="filterset" type="filtersetType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flatten">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeemptydirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="enablemultiplemappings">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputencoding" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="preservelastmodified">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filtering">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="native2asciiType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="mapper" type="mapperType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="ext" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="reverse">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="noneType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="notType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="filesmatch" type="filesmatchType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="isset" type="issetType"/>
            <xs:element name="available" type="availableType"/>
            <xs:element name="uptodate" type="uptodateType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="optionsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="libfileset" type="libfilesetType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="orType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="isset" type="issetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="osType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="version" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="family" type="xs:string"/>
        <xs:attribute name="arch" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="outputpropertyType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4addType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="changelist" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="commandlength" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4changeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4counterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4deleteType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="change" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4editType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="change" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4fstatType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="changelist" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="showfilter" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4haveType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4integrateType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="branch" type="xs:string"/>
        <xs:attribute name="leavetargetrevision">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="forceintegrate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="enablebaselessmerges">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="fromfile" type="xs:string"/>
        <xs:attribute name="reversebranchmappings">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="change" type="xs:string"/>
        <xs:attribute name="simulationmode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="propagatesourcefiletype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="nocopynewtargetfiles">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="restoredeletedrevisions">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4labelType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="desc" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="lock" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4labelsyncType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="simulationmode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="delete">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="add">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="p4reopenType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="tochange" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4resolveType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="forcetextmode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="markersforall">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="simulationmode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="resolvemode" type="xs:string"/>
        <xs:attribute name="redoall">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="p4revertType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="revertonlyunchanged">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="change" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4submitType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="needsresolveproperty" type="xs:string"/>
        <xs:attribute name="changeproperty" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="change" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4syncType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="force" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="label" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="packageType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="packagesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="parallelType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="pollinterval" type="xs:string"/>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
                <xs:attribute name="threadsperprocessor" type="xs:string"/>
                <xs:attribute name="timeout" type="xs:string"/>
                <xs:attribute name="threadcount" type="xs:string"/>
                <xs:attribute name="failonany">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="paramType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="type" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="expression" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="patchType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="strip" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="originalfile" type="xs:string"/>
        <xs:attribute name="patchfile" type="xs:string"/>
        <xs:attribute name="reverse">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="backups">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="ignorewhitespace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="pathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="pathconvertType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="path" type="pathType"/>
            <xs:element name="map" type="mapType"/>
            <xs:element name="mapper" type="mapperType"/>
            <xs:element name="resources" type="resourcesType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="first" type="firstType"/>
            <xs:element name="globmapper" type="globmapperType"/>
            <xs:element name="chainedmapper" type="chainedmapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="pathsep" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="dirsep" type="xs:string"/>
        <xs:attribute name="setonempty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="targetos" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="pathelementType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="patternsetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="include" type="includeType"/>
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="includesfile" type="includesfileType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="permissionsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="grant" type="grantType"/>
            <xs:element name="revoke" type="revokeType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="prefixlinesType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="prefix" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="presentType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="mapper" type="mapperType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="targetdir" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="present">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="srconly"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="presetdefType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="name" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
                <xs:attribute name="uri" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:element name="project">
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="target" type="targetType"/>
                <xs:element name="propertyfile" type="propertyfileType"/>
                <xs:element name="importtypelib" type="importtypelibType"/>
                <xs:element name="sql" type="sqlType"/>
                <xs:element name="cvspass" type="cvspassType"/>
                <xs:element name="p4reopen" type="p4reopenType"/>
                <xs:element name="csc" type="cscType"/>
                <xs:element name="dirname" type="dirnameType"/>
                <xs:element name="p4label" type="p4labelType"/>
                <xs:element name="p4revert" type="p4revertType"/>
                <xs:element name="replaceregexp" type="replaceregexpType"/>
                <xs:element name="get" type="getType"/>
                <xs:element name="jjtree" type="jjtreeType"/>
                <xs:element name="sleep" type="sleepType"/>
                <xs:element name="jarlib-display" type="jarlib-displayType"/>
                <xs:element name="dependset" type="dependsetType"/>
                <xs:element name="zip" type="zipType"/>
                <xs:element name="patch" type="patchType"/>
                <xs:element name="jspc" type="jspcType"/>
                <xs:element name="style" type="styleType"/>
                <xs:element name="test" type="testType"/>
                <xs:element name="tstamp" type="tstampType"/>
                <xs:element name="unwar" type="unwarType"/>
                <xs:element name="icontract" type="icontractType"/>
                <xs:element name="cvschangelog" type="cvschangelogType"/>
                <xs:element name="p4submit" type="p4submitType"/>
                <xs:element name="p4change" type="p4changeType"/>
                <xs:element name="bzip2" type="bzip2Type"/>
                <xs:element name="sync" type="syncType"/>
                <xs:element name="p4delete" type="p4deleteType"/>
                <xs:element name="javadoc" type="javadocType"/>
                <xs:element name="p4integrate" type="p4integrateType"/>
                <xs:element name="translate" type="translateType"/>
                <xs:element name="signjar" type="signjarType"/>
                <xs:element name="chown" type="chownType"/>
                <xs:element name="vajload" type="vajloadType"/>
                <xs:element name="jarlib-available" type="jarlib-availableType"/>
                <xs:element name="buildnumber" type="buildnumberType"/>
                <xs:element name="jpcovmerge" type="jpcovmergeType"/>
                <xs:element name="war" type="warType"/>
                <xs:element name="rename" type="renameType"/>
                <xs:element name="sequential" type="sequentialType"/>
                <xs:element name="serverdeploy" type="serverdeployType"/>
                <xs:element name="property" type="propertyType"/>
                <xs:element name="subant" type="subantType"/>
                <xs:element name="move" type="moveType"/>
                <xs:element name="ildasm" type="ildasmType"/>
                <xs:element name="copydir" type="copydirType"/>
                <xs:element name="fixcrlf" type="fixcrlfType"/>
                <xs:element name="pathconvert" type="pathconvertType"/>
                <xs:element name="record" type="recordType"/>
                <xs:element name="p4sync" type="p4syncType"/>
                <xs:element name="exec" type="execType"/>
                <xs:element name="ccmklabel" type="ccmklabelType"/>
                <xs:element name="p4edit" type="p4editType"/>
                <xs:element name="manifest" type="manifestType"/>
                <xs:element name="maudit" type="mauditType"/>
                <xs:element name="antlr" type="antlrType"/>
                <xs:element name="jpcovreport" type="jpcovreportType"/>
                <xs:element name="execon" type="execonType"/>
                <xs:element name="ant" type="antType"/>
                <xs:element name="xmlvalidate" type="xmlvalidateType"/>
                <xs:element name="xslt" type="xsltType"/>
                <xs:element name="p4resolve" type="p4resolveType"/>
                <xs:element name="gzip" type="gzipType"/>
                <xs:element name="native2ascii" type="native2asciiType"/>
                <xs:element name="ccrmtype" type="ccrmtypeType"/>
                <xs:element name="ear" type="earType"/>
                <xs:element name="input" type="inputType"/>
                <xs:element name="presetdef" type="presetdefType"/>
                <xs:element name="rmic" type="rmicType"/>
                <xs:element name="checksum" type="checksumType"/>
                <xs:element name="mail" type="mailType"/>
                <xs:element name="loadfile" type="loadfileType"/>
                <xs:element name="mimemail" type="mimemailType"/>
                <xs:element name="gunzip" type="gunzipType"/>
                <xs:element name="concat" type="concatType"/>
                <xs:element name="cab" type="cabType"/>
                <xs:element name="touch" type="touchType"/>
                <xs:element name="parallel" type="parallelType"/>
                <xs:element name="splash" type="splashType"/>
                <xs:element name="antcall" type="antcallType"/>
                <xs:element name="typedef" type="typedefType"/>
                <xs:element name="p4have" type="p4haveType"/>
                <xs:element name="filter" type="filterType"/>
                <xs:element name="xmlproperty" type="xmlpropertyType"/>
                <xs:element name="import" type="importType"/>
                <xs:element name="copy" type="copyType"/>
                <xs:element name="jsharpc" type="jsharpcType"/>
                <xs:element name="symlink" type="symlinkType"/>
                <xs:element name="antstructure" type="antstructureType"/>
                <xs:element name="script" type="scriptType"/>
                <xs:element name="rpm" type="rpmType"/>
                <xs:element name="delete" type="deleteType"/>
                <xs:element name="replace" type="replaceType"/>
                <xs:element name="attrib" type="attribType"/>
                <xs:element name="waitfor" type="waitforType"/>
                <xs:element name="untar" type="untarType"/>
                <xs:element name="loadproperties" type="loadpropertiesType"/>
                <xs:element name="available" type="availableType"/>
                <xs:element name="echoproperties" type="echopropertiesType"/>
                <xs:element name="chgrp" type="chgrpType"/>
                <xs:element name="vajexport" type="vajexportType"/>
                <xs:element name="bunzip2" type="bunzip2Type"/>
                <xs:element name="whichresource" type="whichresourceType"/>
                <xs:element name="copyfile" type="copyfileType"/>
                <xs:element name="p4labelsync" type="p4labelsyncType"/>
                <xs:element name="macrodef" type="macrodefType"/>
                <xs:element name="unjar" type="unjarType"/>
                <xs:element name="vbc" type="vbcType"/>
                <xs:element name="mkdir" type="mkdirType"/>
                <xs:element name="condition" type="conditionType"/>
                <xs:element name="cvs" type="cvsType"/>
                <xs:element name="tempfile" type="tempfileType"/>
                <xs:element name="junit" type="junitType"/>
                <xs:element name="junitreport" type="junitreportType"/>
                <xs:element name="cobertura-instrument" type="cobertura-instrumentType"/>
                <xs:element name="taskdef" type="taskdefType"/>
                <xs:element name="echo" type="echoType"/>
                <xs:element name="java" type="javaType"/>
                <xs:element name="renameext" type="renameextType"/>
                <xs:element name="basename" type="basenameType"/>
                <xs:element name="javadoc2" type="javadoc2Type"/>
                <xs:element name="tar" type="tarType"/>
                <xs:element name="vajimport" type="vajimportType"/>
                <xs:element name="p4fstat" type="p4fstatType"/>
                <xs:element name="setproxy" type="setproxyType"/>
                <xs:element name="p4counter" type="p4counterType"/>
                <xs:element name="ilasm" type="ilasmType"/>
                <xs:element name="apply" type="applyType"/>
                <xs:element name="jarlib-resolve" type="jarlib-resolveType"/>
                <xs:element name="jlink" type="jlinkType"/>
                <xs:element name="cvstagdiff" type="cvstagdiffType"/>
                <xs:element name="javacc" type="javaccType"/>
                <xs:element name="chmod" type="chmodType"/>
                <xs:element name="pvcs" type="pvcsType"/>
                <xs:element name="jarlib-manifest" type="jarlib-manifestType"/>
                <xs:element name="jar" type="jarType"/>
                <xs:element name="ccmklbtype" type="ccmklbtypeType"/>
                <xs:element name="sound" type="soundType"/>
                <xs:element name="scriptdef" type="scriptdefType"/>
                <xs:element name="defaultexcludes" type="defaultexcludesType"/>
                <xs:element name="blgenclient" type="blgenclientType"/>
                <xs:element name="uptodate" type="uptodateType"/>
                <xs:element name="jjdoc" type="jjdocType"/>
                <xs:element name="genkey" type="genkeyType"/>
                <xs:element name="javah" type="javahType"/>
                <xs:element name="ccmreconfigure" type="ccmreconfigureType"/>
                <xs:element name="fail" type="failType"/>
                <xs:element name="unzip" type="unzipType"/>
                <xs:element name="javac" type="javacType"/>
                <xs:element name="p4add" type="p4addType"/>
                <xs:element name="jpcoverage" type="jpcoverageType"/>
                <xs:element name="depend" type="dependType"/>
                <xs:element name="deltree" type="deltreeType"/>
                <xs:element name="ddcreator" type="ddcreatorType"/>
                <xs:element name="patternset" type="patternsetType"/>
                <xs:element name="assertions" type="assertionsType"/>
                <xs:element name="propertyset" type="propertysetType"/>
                <xs:element name="filterset" type="filtersetType"/>
                <xs:element name="libfileset" type="libfilesetType"/>
                <xs:element name="filterreader" type="filterreaderType"/>
                <xs:element name="scriptfilter" type="scriptfilterType"/>
                <xs:element name="concatfilter" type="concatfilterType"/>
                <xs:element name="extension" type="extensionType"/>
                <xs:element name="fileset" type="filesetType"/>
                <xs:element name="dirset" type="dirsetType"/>
                <xs:element name="filelist" type="filelistType"/>
                <xs:element name="filterchain" type="filterchainType"/>
                <xs:element name="path" type="pathType"/>
                <xs:element name="classfileset" type="classfilesetType"/>
                <xs:element name="selector" type="selectorType"/>
                <xs:element name="xmlcatalog" type="xmlcatalogType"/>
                <xs:element name="description" type="descriptionType"/>
                <xs:element name="mapper" type="mapperType"/>
                <xs:element name="zipfileset" type="zipfilesetType"/>
                <xs:element name="substitution" type="substitutionType"/>
                <xs:element name="extensionSet" type="extensionSetType"/>
                <xs:element name="regexp" type="regexpType"/>
                <xs:element name="var" type="varType"/>
                <xs:element name="if" type="ifType"/>
                <xs:element name="retry" type="retryType"/>
            </xs:choice>
            <xs:attribute name="name" type="xs:string"/>
            <xs:attribute name="default" type="xs:string"/>
            <xs:attribute name="basedir" type="xs:string"/>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="propertyType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="url" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="userproperty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="environment" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="propertyfileType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="entry" type="entryType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="comment" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="propertycopyType">
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="from" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="propertyrefType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="builtin">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="all"/>
                    <xs:enumeration value="system"/>
                    <xs:enumeration value="commandline"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="regex" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="propertysetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="propertyref" type="propertyrefType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="negate" type="xs:boolean"/>
        <xs:attribute name="dynamic">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="pvcsType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="pvcsproject" type="pvcsprojectType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="updateonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="force" type="xs:string"/>
        <xs:attribute name="config" type="xs:string"/>
        <xs:attribute name="workspace" type="xs:string"/>
        <xs:attribute name="pvcsbin" type="xs:string"/>
        <xs:attribute name="pvcsproject" type="xs:string"/>
        <xs:attribute name="filenameformat" type="xs:string"/>
        <xs:attribute name="userid" type="xs:string"/>
        <xs:attribute name="repository" type="xs:string"/>
        <xs:attribute name="ignorereturncode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="revision" type="xs:string"/>
        <xs:attribute name="linestart" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="promotiongroup" type="xs:string"/>
        <xs:attribute name="label" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="pvcsprojectType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="recordType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="loglevel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="error"/>
                    <xs:enumeration value="warn"/>
                    <xs:enumeration value="info"/>
                    <xs:enumeration value="verbose"/>
                    <xs:enumeration value="debug"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="emacsmode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="action">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="start"/>
                    <xs:enumeration value="stop"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="referenceType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="torefid" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="regexpType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="pattern" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="renameType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="replace" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="renameextType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="replace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="toextension" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="fromextension" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replaceType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="replacefilter" type="replacefilterType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="replacetoken" type="replacetokenType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="replacevalue" type="replacevalueType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="token" type="xs:string"/>
        <xs:attribute name="propertyfile" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="summary">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="replacefilterfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replacefilterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="token" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replaceregexType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flags" type="xs:string"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="replace" type="xs:string"/>
        <xs:attribute name="pattern" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replaceregexpType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="substitution" type="substitutionType"/>
            <xs:element name="regexp" type="regexpType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flags" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="match" type="xs:string"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="replace" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replacestringType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="to" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replacetokenType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="replacetokensType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="token" type="tokenType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="begintoken" type="xs:string"/>
        <xs:attribute name="endtoken" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replacevalueType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="replytoType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="address" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="reportType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="styledir" type="xs:string"/>
        <xs:attribute name="format">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="frames"/>
                    <xs:enumeration value="noframes"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="extension" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="resourceType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="public">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="embed">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="revokeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
        <xs:attribute name="actions" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="rmicType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="compilerarg" type="compilerargType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="verify">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="iiop">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="idlopts" type="xs:string"/>
        <xs:attribute name="extdirs" type="xs:string"/>
        <xs:attribute name="sourcebase" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="base" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeantruntime">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includejavaruntime">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="compiler" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="idl">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="iiopopts" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="filtering">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="stubversion" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="rootType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="rootfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="rpmType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="removesource">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="cleanbuilddir">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="removespec">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="specfile" type="xs:string"/>
        <xs:attribute name="topdir" type="xs:string"/>
        <xs:attribute name="rpmbuildcommand" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="rulespathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="scriptType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
                <xs:attribute name="src" type="xs:string"/>
                <xs:attribute name="language" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="scriptdefType" mixed="true">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="element" type="elementType"/>
            <xs:element name="attribute" type="attributeType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="uri" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="language" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="loaderref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="reverseloader">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="scriptfilterType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="byline">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <xs:attribute name="token" type="xs:string"/>
                <xs:attribute name="src" type="xs:string"/>
                <xs:attribute name="language" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="searchpathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="sectionType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="attribute" type="attributeType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="selectorType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="timestampselectorType">
        <xs:complexContent>
            <xs:extension base="resourceCollectionContainerType">
                <xs:attribute name="property" type="xs:string"/>
                <xs:attribute name="outputsetid" type="xs:string"/>
                <xs:attribute name="count" type="xs:string"/>
                <xs:attribute name="age" type="xs:string"/>
                <xs:attribute name="pathSep" type="xs:string"/>
                <xs:attribute name="pathref" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="sequentialType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="serverdeployType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="generic" type="genericType"/>
            <xs:element name="jonas" type="jonasType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="action" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="setproxyType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="nonproxyhosts" type="xs:string"/>
        <xs:attribute name="proxyhost" type="xs:string"/>
        <xs:attribute name="socksproxyhost" type="xs:string"/>
        <xs:attribute name="proxyport" type="xs:string"/>
        <xs:attribute name="socksproxyport" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="proxyuser" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="proxypassword" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="signjarType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="storepass" type="xs:string"/>
        <xs:attribute name="lazy">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="jar" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keypass" type="xs:string"/>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="alias" type="xs:string"/>
        <xs:attribute name="sectionsonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keystore" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="sigfile" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="internalsf">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="storetype" type="xs:string"/>
        <xs:attribute name="signedjar" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="sizeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="when">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="less"/>
                    <xs:enumeration value="more"/>
                    <xs:enumeration value="equal"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="units">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="K"/>
                    <xs:enumeration value="k"/>
                    <xs:enumeration value="kilo"/>
                    <xs:enumeration value="KILO"/>
                    <xs:enumeration value="Ki"/>
                    <xs:enumeration value="KI"/>
                    <xs:enumeration value="ki"/>
                    <xs:enumeration value="kibi"/>
                    <xs:enumeration value="KIBI"/>
                    <xs:enumeration value="M"/>
                    <xs:enumeration value="m"/>
                    <xs:enumeration value="mega"/>
                    <xs:enumeration value="MEGA"/>
                    <xs:enumeration value="Mi"/>
                    <xs:enumeration value="MI"/>
                    <xs:enumeration value="mi"/>
                    <xs:enumeration value="mebi"/>
                    <xs:enumeration value="MEBI"/>
                    <xs:enumeration value="G"/>
                    <xs:enumeration value="g"/>
                    <xs:enumeration value="giga"/>
                    <xs:enumeration value="GIGA"/>
                    <xs:enumeration value="Gi"/>
                    <xs:enumeration value="GI"/>
                    <xs:enumeration value="gi"/>
                    <xs:enumeration value="gibi"/>
                    <xs:enumeration value="GIBI"/>
                    <xs:enumeration value="T"/>
                    <xs:enumeration value="t"/>
                    <xs:enumeration value="tera"/>
                    <xs:enumeration value="TERA"/>
                    <xs:enumeration value="Ti"/>
                    <xs:enumeration value="TI"/>
                    <xs:enumeration value="ti"/>
                    <xs:enumeration value="tebi"/>
                    <xs:enumeration value="TEBI"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="sleepType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="hours" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="milliseconds" type="xs:string"/>
        <xs:attribute name="minutes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="seconds" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="socketType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="server" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="soundType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fail" type="failsoundType"/>
            <xs:element name="success" type="successType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="sourceType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="file" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="sourcepathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="splashType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="proxy" type="xs:string"/>
        <xs:attribute name="imageurl" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="showduration" type="xs:string"/>
        <xs:attribute name="useproxy">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="sqlType" mixed="true">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="transaction" type="transactionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="onerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="continue"/>
                    <xs:enumeration value="stop"/>
                    <xs:enumeration value="abort"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="userid" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="autocommit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="rdbms" type="xs:string"/>
        <xs:attribute name="print">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="version" type="xs:string"/>
        <xs:attribute name="url" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="driver" type="xs:string"/>
        <xs:attribute name="showheaders">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="delimitertype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="normal"/>
                    <xs:enumeration value="row"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="escapeprocessing">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="caching">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keepformat">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="delimiter" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="srcType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="srcfileType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="srcfilelistType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="files" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="srcfilesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="srcfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="stringtokenizerType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="suppressdelims">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includedelims">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="delimsaretokens">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="delims" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="stripjavacommentsType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="striplinebreaksType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="linebreaks" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="striplinecommentsType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="comment" type="commentType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="styleType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="factory" type="factoryType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="param" type="paramType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="outputproperty" type="outputpropertyType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="force">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="processor" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="scanincludeddirectories">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="extension" type="xs:string"/>
        <xs:attribute name="in" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="reloadstylesheet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="out" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="style" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="subantType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="buildpathelement" type="buildpathelementType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="buildpath" type="buildpathType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="property" type="propertyType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="genericantfile" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="inheritall" type="xs:boolean"/>
        <xs:attribute name="inheritrefs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="antfile" type="xs:string"/>
        <xs:attribute name="buildpathref" type="xs:IDREF"/>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="buildpath" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="substitutionType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="expression" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="successType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="loops" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="duration" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="supportType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="symlinkType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="linkfilename" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="link" type="xs:string"/>
        <xs:attribute name="action" type="xs:string"/>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="syncType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeemptydirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="syspropertyType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="key" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="syspropertysetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="propertyref" type="propertyrefType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="dynamic">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="tabstospacesType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="tablength" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tagType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="enabled">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="scope" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tagletType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="path" type="pathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tailfilterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="lines" type="xs:string"/>
        <xs:attribute name="skip" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tarType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="tarfileset" type="tarfilesetType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="tarfile" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="compression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="none"/>
                    <xs:enumeration value="gzip"/>
                    <xs:enumeration value="bzip2"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="longfile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="warn"/>
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="truncate"/>
                    <xs:enumeration value="gnu"/>
                    <xs:enumeration value="omit"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tarfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="preserveleadingslashes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="username" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="group" type="xs:string"/>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="mode" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="targetType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="name" type="xs:string" use="required"/>
                <xs:attribute name="if" type="xs:string"/>
                <xs:attribute name="unless" type="xs:string"/>
                <xs:attribute name="depends" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="targetfileType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="targetfilelistType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="files" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="targetfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="taskdefType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="uri" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="adaptto" type="xs:string"/>
        <xs:attribute name="onerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="report"/>
                    <xs:enumeration value="ignore"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="loaderref" type="xs:IDREF"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="adapter" type="xs:string"/>
        <xs:attribute name="format">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="properties"/>
                    <xs:enumeration value="xml"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="reverseloader">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="tempfileType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="suffix" type="xs:string"/>
        <xs:attribute name="deleteonexit" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="testType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="sysproperty" type="syspropertyType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="syspropertyset" type="syspropertysetType"/>
            <xs:element name="permissions" type="permissionsType"/>
            <xs:element name="jvmarg" type="jvmargType"/>
            <xs:element name="arg" type="argType"/>
            <xs:element name="assertions" type="assertionsType"/>
            <xs:element name="testlet" type="testletType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="jvmargs" type="xs:string"/>
        <xs:attribute name="args" type="xs:string"/>
        <xs:attribute name="fork">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="jar" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="forceshowtrace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="jvm" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="showsuccess">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="jvmversion" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="showbanner" type="xs:string"/>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="showtrace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="testletType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="textType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="trim">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="optional">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="titleType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="toType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="address" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tokenType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="key" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tokenfilterType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="containsstring" type="containsstringType"/>
            <xs:element name="linetokenizer" type="linetokenizerType"/>
            <xs:element name="trim" type="trimType"/>
            <xs:element name="stringtokenizer" type="stringtokenizerType"/>
            <xs:element name="replaceregex" type="replaceregexType"/>
            <xs:element name="replacestring" type="replacestringType"/>
            <xs:element name="ignoreblank" type="ignoreblankType"/>
            <xs:element name="deletecharacters" type="deletecharactersType"/>
            <xs:element name="containsregex" type="containsregexType"/>
            <xs:element name="filetokenizer" type="filetokenizerType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="delimoutput" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="touchType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="millis" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="datetime" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="transactionType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="src" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="translateType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="bundlecountry" type="xs:string"/>
        <xs:attribute name="bundlelanguage" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="srcencoding" type="xs:string"/>
        <xs:attribute name="bundle" type="xs:string"/>
        <xs:attribute name="bundleencoding" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destencoding" type="xs:string"/>
        <xs:attribute name="bundlevariant" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="endtoken" type="xs:string"/>
        <xs:attribute name="forceoverwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="starttoken" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="triggersType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="method" type="methodType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="trimType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="tstampType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="format" type="formatType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="typeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="typedefType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="uri" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="adaptto" type="xs:string"/>
        <xs:attribute name="onerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="report"/>
                    <xs:enumeration value="ignore"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="loaderref" type="xs:IDREF"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="adapter" type="xs:string"/>
        <xs:attribute name="format">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="properties"/>
                    <xs:enumeration value="xml"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="reverseloader">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="unjarType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="patternset" type="patternsetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="untarType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="patternset" type="patternsetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="compression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="none"/>
                    <xs:enumeration value="gzip"/>
                    <xs:enumeration value="bzip2"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="unwarType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="patternset" type="patternsetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="unzipType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="patternset" type="patternsetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="uptodateType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="srcfiles" type="srcfilesType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="targetfile" type="xs:string"/>
        <xs:attribute name="srcfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="urlType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="url" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="userType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="userid" type="xs:string"/>
        <xs:attribute name="displayname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="vajexportType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="include" type="includeType"/>
            <xs:element name="exclude" type="excludeType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="exportclasses">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="haltonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="remote" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="exportresources">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="exportsources">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="exportdebuginfo">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="vajimportType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="haltonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="remote" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="importsources">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="project" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="importresources">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="importclasses">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="vajloadType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="vajproject" type="vajprojectType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="remote" type="xs:string"/>
        <xs:attribute name="haltonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="vajprojectType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="version" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="vbcType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="resource" type="resourceType"/>
            <xs:element name="define" type="defineType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="src" type="srcType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="references" type="xs:string"/>
        <xs:attribute name="useresponsefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="removeintchecks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="mainclass" type="xs:string"/>
        <xs:attribute name="extraoptions" type="xs:string"/>
        <xs:attribute name="additionalmodules" type="xs:string"/>
        <xs:attribute name="win32icon" type="xs:string"/>
        <xs:attribute name="optionstrict">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="utf8output">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includedefaultreferences">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="optimize">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="targettype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="exe"/>
                    <xs:enumeration value="library"/>
                    <xs:enumeration value="module"/>
                    <xs:enumeration value="winexe"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="rootnamespace" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="win32res" type="xs:string"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="optionexplicit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="warnlevel" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="optioncompare" type="xs:string"/>
        <xs:attribute name="imports" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="referencefiles" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="waitforType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="isfalse" type="isfalseType"/>
            <xs:element name="isreference" type="isreferenceType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="available" type="availableType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="os" type="osType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="filesmatch" type="filesmatchType"/>
            <xs:element name="checksum" type="checksumType"/>
            <xs:element name="istrue" type="istrueType"/>
            <xs:element name="isset" type="issetType"/>
            <xs:element name="socket" type="socketType"/>
            <xs:element name="http" type="httpType"/>
            <xs:element name="uptodate" type="uptodateType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="checkeveryunit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="millisecond"/>
                    <xs:enumeration value="second"/>
                    <xs:enumeration value="minute"/>
                    <xs:enumeration value="hour"/>
                    <xs:enumeration value="day"/>
                    <xs:enumeration value="week"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="checkevery" type="xs:string"/>
        <xs:attribute name="maxwaitunit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="millisecond"/>
                    <xs:enumeration value="second"/>
                    <xs:enumeration value="minute"/>
                    <xs:enumeration value="hour"/>
                    <xs:enumeration value="day"/>
                    <xs:enumeration value="week"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxwait" type="xs:string"/>
        <xs:attribute name="timeoutproperty" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="warType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="manifest" type="manifestType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="metainf" type="metainfType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="lib" type="libType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="zipgroupfileset" type="zipgroupfilesetType"/>
            <xs:element name="zipfileset" type="zipfilesetType"/>
            <xs:element name="classes" type="classesType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="webinf" type="webinfType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="keepcompression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="whenempty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="create"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="duplicate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="preserve"/>
                    <xs:enumeration value="fail"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="manifest" type="xs:string"/>
        <xs:attribute name="jarfile" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="index">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="update">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="webxml" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="manifestencoding" type="xs:string"/>
        <xs:attribute name="filesonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="warfile" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="filesetmanifest">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="merge"/>
                    <xs:enumeration value="mergewithoutmain"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="zipfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="wasclasspathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="webappType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="basedir" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="webinfType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="whichresourceType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="wlclasspathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="xmlcatalogType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="entity" type="entityType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="catalogpath" type="catalogpathType"/>
            <xs:element name="dtd" type="dtdType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="catalogpathref" type="xs:IDREF"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="xmlpropertyType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="semanticattributes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keeproot">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="collapseattributes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="validate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="rootdirectory" type="xs:string"/>
        <xs:attribute name="includesemanticattribute">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="xmlvalidateType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="attribute" type="attributeType"/>
            <xs:element name="dtd" type="dtdType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="lenient">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="warn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="xsltType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="factory" type="factoryType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="param" type="paramType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="outputproperty" type="outputpropertyType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="force">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="processor" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="scanincludeddirectories">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="extension" type="xs:string"/>
        <xs:attribute name="in" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="reloadstylesheet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="out" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="style" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="zipType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="zipgroupfileset" type="zipgroupfilesetType"/>
            <xs:element name="zipfileset" type="zipfilesetType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="whenempty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="create"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keepcompression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="duplicate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="preserve"/>
                    <xs:enumeration value="fail"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="update">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="filesonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="zipfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="zipfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="zipgroupfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="doxygenType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="property">
                <xs:complexType>
                    <xs:choice minOccurs="0" maxOccurs="unbounded">
                        <xs:element name="fileset" type="filesetType"/>
                    </xs:choice>
                    <xs:attribute name="name" type="xs:string" use="required"/>
                    <xs:attribute name="value" type="xs:string" use="optional"/>
                </xs:complexType>
            </xs:element>
        </xs:choice>
        <xs:attribute name="versionCompatible" type="xs:string"/>
        <xs:attribute name="doxygenPath" type="xs:string"/>
        <xs:attribute name="configFilename" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="foreachType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="path" type="pathType"/>
            <xs:element name="param" type="paramType"/>
        </xs:choice>
        <xs:attribute name="list" type="xs:string"/>
        <xs:attribute name="target" type="xs:string" use="required"/>
        <xs:attribute name="param" type="xs:string"/>
        <xs:attribute name="delimiter" type="xs:string"/>
        <xs:attribute name="inheritall" type="xs:string"/>
        <xs:attribute name="inheritrefs" type="xs:string"/>
        <xs:attribute name="parallel" type="xs:string"/>
        <xs:attribute name="maxThreads" type="xs:string"/>
        <xs:attribute name="trim" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="varType">
        <xs:choice minOccurs="0" maxOccurs="unbounded"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="unset" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ifType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="isfalse" type="isfalseType"/>
            <xs:element name="isreference" type="isreferenceType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="available" type="availableType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="os" type="osType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="filesmatch" type="filesmatchType"/>
            <xs:element name="checksum" type="checksumType"/>
            <xs:element name="istrue" type="istrueType"/>
            <xs:element name="isset" type="issetType"/>
            <xs:element name="socket" type="socketType"/>
            <xs:element name="http" type="httpType"/>
            <xs:element name="uptodate" type="uptodateType"/>
            <xs:element name="then" type="thenType"/>
            <xs:element name="elseif" type="elseifType"/>
            <xs:element name="else" type="elseType"/>
            <xs:element name="resourcecount" type="resourcecountType"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="propertyregexType">
        <xs:attribute name="property" type="xs:string" use="required"/>
        <xs:attribute name="override" type="xs:boolean"/>
        <xs:attribute name="input" type="xs:string" use="required"/>
        <xs:attribute name="regexp" type="xs:string"/>
        <xs:attribute name="select" type="xs:string"/>
        <xs:attribute name="replace" type="xs:string"/>
        <xs:attribute name="casesensitive" type="xs:string"/>
        <xs:attribute name="global" type="xs:boolean"/>
        <xs:attribute name="defaultValue" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="thenType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="elseifType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="elseType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="mergelogsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="log" type="logType"/>
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="destfile" type="xs:string" use="required"/>
        <xs:attribute name="stdout" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="logType">
        <xs:attribute name="file" type="xs:string" use="required"/>
        <xs:attribute name="tool" type="xs:string" use="required"/>
        <xs:attribute name="regex" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="reviewplanType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="destdir" type="xs:string" use="required"/>
        <xs:attribute name="component" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="processreviewplanType">
        <xs:attribute name="in" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="convertreviewlogType">
        <xs:attribute name="input" type="xs:string" use="required"/>
        <xs:attribute name="template" type="xs:string" use="required"/>
        <xs:attribute name="review" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="lintType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="option">
                <xs:complexType>
                    <xs:choice minOccurs="0" maxOccurs="unbounded">
                        <xs:element name="fileset" type="filesetType"/>
                        <xs:element name="dirset" type="dirsetType"/>
                    </xs:choice>
                    <xs:attribute name="type" type="xs:string" use="optional"/>
                    <xs:attribute name="value" type="xs:string" use="optional"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="output" type="xs:string" use="required"/>
        <xs:attribute name="lintPath" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="customcopyType">
        <xs:complexContent>
            <xs:extension base="copyType">
                <xs:attribute name="preservereadonly">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <xs:attribute name="checkcontents">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="fopType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="messagelevel" type="xs:string"/>
        <xs:attribute name="userconfig" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="xmltaskType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="cut" type="cutXmlType"/>
            <xs:element name="copy" type="copyXmlType"/>
            <xs:element name="insert" type="insertXmlType"/>
            <xs:element name="rename" type="renameXmlType"/>
            <xs:element name="remove" type="removeXmlType"/>
            <xs:element name="attr" type="attrXmlType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
        </xs:choice>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="sourcebuffer" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="report" type="xs:string"/>
        <xs:attribute name="public" type="xs:string"/>
        <xs:attribute name="system" type="xs:string"/>
        <xs:attribute name="preservetype" type="xs:string"/>
        <xs:attribute name="failWithoutMatch" type="xs:string"/>
        <xs:attribute name="indent" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="outputter" type="xs:string"/>
        <xs:attribute name="omitHeader" type="xs:string"/>
        <xs:attribute name="standalone" type="xs:string"/>
        <xs:attribute name="clearBuffers" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cutXmlType">
        <xs:attribute name="path" type="xs:string"/>
        <xs:attribute name="buffer" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="append" type="xs:string"/>
        <xs:attribute name="attrValue" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="copyXmlType">
        <xs:attribute name="path" type="xs:string"/>
        <xs:attribute name="buffer" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="append" type="xs:string"/>
        <xs:attribute name="attrValue" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="insertXmlType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="path" type="xs:string" use="required"/>
                <xs:attribute name="buffer" type="xs:string" use="optional"/>
                <xs:attribute name="file" type="xs:string" use="optional"/>
                <xs:attribute name="xml" type="xs:string" use="optional"/>
                <xs:attribute name="position" type="xs:string" use="optional"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="renameXmlType">
        <xs:attribute name="path" type="xs:string"/>
        <xs:attribute name="to" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="removeXmlType">
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="attrXmlType">
        <xs:attribute name="path" type="xs:string" use="required"/>
        <xs:attribute name="attr" type="xs:string" use="required"/>
        <xs:attribute name="value" type="xs:string" use="optional"/>
        <xs:attribute name="remove" type="xs:boolean" use="optional"/>
    </xs:complexType>
    <xs:complexType name="ftpType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="server" type="xs:string"/>
        <xs:attribute name="userid" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="getsizeType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="output" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="abldType">
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="output" type="xs:string" use="optional"/>
        <xs:attribute name="test" type="xs:boolean" use="optional"/>
        <xs:attribute name="command" use="required">
            <xs:simpleType>
                <xs:restriction base="xs:token">
                    <xs:enumeration value="build"/>
                    <xs:enumeration value="clean"/>
                    <xs:enumeration value="cleanall"/>
                    <xs:enumeration value="cleanexport"/>
                    <xs:enumeration value="export"/>
                    <xs:enumeration value="final"/>
                    <xs:enumeration value="freeze"/>
                    <xs:enumeration value="help"/>
                    <xs:enumeration value="library"/>
                    <xs:enumeration value="listing"/>
                    <xs:enumeration value="makefile"/>
                    <xs:enumeration value="reallyclean"/>
                    <xs:enumeration value="resource"/>
                    <xs:enumeration value="target"/>
                    <xs:enumeration value="tidy"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="platform" use="optional">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="wins"/>
                    <xs:enumeration value="winscw"/>
                    <xs:enumeration value="gccxml"/>
                    <xs:enumeration value="thumb"/>
                    <xs:enumeration value="arm4at"/>
                    <xs:enumeration value="vc6"/>
                    <xs:enumeration value="cw_ide"/>
                    <xs:enumeration value="armv5"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="variant" use="optional">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="udeb"/>
                    <xs:enumeration value="urel"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="grandType">
        <xs:attribute name="buildfile" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="svnType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="update" type="updateSvnType"/>
            <xs:element name="status" type="statusSvnType"/>
        </xs:choice>
        <xs:attribute name="username" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="updateSvnType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="file" type="xs:string" use="optional"/>
        <xs:attribute name="dir" type="xs:string" use="optional"/>
        <xs:attribute name="recurse" type="xs:string" use="optional"/>
        <xs:attribute name="revision" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="statusSvnType">
        <xs:attribute name="path" type="xs:string"/>
        <xs:attribute name="textStatusProperty" type="xs:string" use="optional"/>
        <xs:attribute name="propStatusProperty" type="xs:string" use="optional"/>
        <xs:attribute name="revisionProperty" type="xs:string" use="optional"/>
        <xs:attribute name="lastChangedRevisionProperty" type="xs:string" use="optional"/>
        <xs:attribute name="lastCommitAuthorProperty" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="antunitType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="plainlistener" type="plainlistenerType"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="plainlistenerType"/>
    <xs:complexType name="schemavalidateType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="schema" type="schemaType"/>
        </xs:choice>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="noNamespaceFile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="pythonType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="outputproperty" type="xs:string"/>
                <xs:attribute name="resultproperty" type="xs:string"/>
                <xs:attribute name="failonerror" type="xs:string"/>
                <xs:attribute name="script" type="xs:string"/>
                <xs:attribute name="dir" type="xs:string"/>
                <xs:attribute name="output" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="forType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="path" type="pathType"/>
            <xs:element name="resources" type="resourcesType"/>
            <xs:element name="sequential" type="sequentialType"/>
        </xs:choice>
        <xs:attribute name="list" type="xs:string"/>
        <xs:attribute name="param" type="xs:string"/>
        <xs:attribute name="delimiter" type="xs:string"/>
        <xs:attribute name="parallel" type="xs:string"/>
        <xs:attribute name="keepgoing" type="xs:string"/>
        <xs:attribute name="threadCount" type="xs:string"/>
        <xs:attribute name="trim" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="chainedmapperType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="mapper" type="mapperType"/>
            <xs:element name="flattenmapper" type="flattenmapperType"/>
            <xs:element name="globmapper" type="globmapperType"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="flattenmapperType"/>
    <xs:complexType name="antformType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="label" type="xs:string"/>
            <xs:element name="separator"/>
            <xs:element name="tab">
                <xs:complexType>
                    <xs:attribute name="label" type="xs:string"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="fileSelectionProperty">
                <xs:complexType>
                    <xs:attribute name="if" type="xs:string"/>
                    <xs:attribute name="unless" type="xs:string"/>
                    <xs:attribute name="label" type="xs:string"/>
                    <xs:attribute name="property" type="xs:string"/>
                    <xs:attribute name="directoryChooser" type="xs:string"/>
                    <xs:attribute name="required" type="xs:boolean"/>
                    <xs:attribute name="tooltip" type="xs:string"/>
                    <xs:attribute name="focus" type="xs:boolean"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="selectionProperty">
                <xs:complexType>
                    <xs:attribute name="if" type="xs:string"/>
                    <xs:attribute name="unless" type="xs:string"/>
                    <xs:attribute name="label" type="xs:string"/>
                    <xs:attribute name="property" type="xs:string"/>
                    <xs:attribute name="values" type="xs:string"/>
                    <xs:attribute name="tooltip" type="xs:string"/>
                    <xs:attribute name="separator" type="xs:string"/>
                    <xs:attribute name="focus" type="xs:boolean"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="textProperty">
                <xs:complexType>
                    <xs:attribute name="if" type="xs:string"/>
                    <xs:attribute name="unless" type="xs:string"/>
                    <xs:attribute name="label" type="xs:string"/>
                    <xs:attribute name="property" type="xs:string"/>
                    <xs:attribute name="required" type="xs:boolean"/>
                    <xs:attribute name="tooltip" type="xs:string"/>
                    <xs:attribute name="password" type="xs:string"/>
                    <xs:attribute name="focus" type="xs:boolean"/>
                </xs:complexType>
            </xs:element>
        </xs:choice>
        <xs:attribute name="title" type="xs:string"/>
        <xs:attribute name="image" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mathType">
        <xs:attribute name="result" type="xs:string"/>
        <xs:attribute name="datatype" type="xs:string"/>
        <xs:attribute name="strict" type="xs:boolean"/>
        <xs:attribute name="operation" type="xs:string"/>
        <xs:attribute name="operand1" type="xs:string"/>
        <xs:attribute name="operand2" type="xs:string"/>
        <!-- TODO: define nested elements -->
    </xs:complexType>
    <xs:complexType name="antserverType">
        <xs:attribute name="port" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="shellscriptType" mixed="true">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="arg">
                <xs:complexType>
                    <xs:attribute name="value" type="xs:string"/>
                </xs:complexType>
            </xs:element>
        </xs:choice>
        <xs:attribute name="shell" type="xs:string"/>
        <xs:attribute name="tmpsuffix" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="runtargetType">
        <xs:attribute name="target" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="echoxmlType">
        <xs:choice maxOccurs="unbounded">
            <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:choice>
        <xs:attribute name="file" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="trycatchType">
        <xs:sequence>
            <xs:element name="try">
                <xs:complexType>
                    <xs:complexContent>
                        <xs:extension base="taskcontainerType"/>
                    </xs:complexContent>
                </xs:complexType>
            </xs:element>
            <xs:element name="catch">
                <xs:complexType>
                    <xs:complexContent>
                        <xs:extension base="taskcontainerType"/>
                    </xs:complexContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="resourcecountType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
        </xs:choice>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="when" type="xs:string"/>
        <xs:attribute name="count" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="remoteantType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="runtarget" type="runtargetType"/>
        </xs:choice>
        <xs:attribute name="machine" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="persistent" type="xs:string"/>
        <xs:attribute name="failonerror" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="propertyresourceType">
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="firstType">
        <xs:complexContent>
            <xs:extension base="resourceCollectionContainerType">
                <xs:attribute name="count" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="sortType">
        <xs:choice maxOccurs="unbounded">
            <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="schemaType">
        <xs:attribute name="namespace" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="retryType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="sleepTime" type="xs:string"/>
                <xs:attribute name="retryCount" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="antcallbackType">
        <xs:complexContent>
            <xs:extension base="antcallType">
                <xs:attribute name="return" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="diagnosticsType"/>
    <xs:complexType name="sshexecType">
        <xs:attribute name="host" type="xs:string"/>
        <xs:attribute name="username" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="trust" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="failonerror" type="xs:boolean"/>
    </xs:complexType>
    <xs:complexType name="scpType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="localFile" type="xs:string"/>
        <xs:attribute name="remoteFile" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="localTodir" type="xs:string"/>
        <xs:attribute name="localTofile" type="xs:string"/>
        <xs:attribute name="remoteTodir" type="xs:string"/>
        <xs:attribute name="remoteTofile" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="trust" type="xs:string"/>
        <xs:attribute name="knownhosts" type="xs:string"/>
        <xs:attribute name="failonerror" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="keyfile" type="xs:string"/>
        <xs:attribute name="passphrase" type="xs:string"/>
        <xs:attribute name="verbose" type="xs:string"/>
        <xs:attribute name="sftp" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="xcluderType">
        <xs:attribute name="in" type="xs:string"/>
        <xs:attribute name="out" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="assertTrueType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="message" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="assertFileExistsType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="file" type="xs:string"/>
                <xs:attribute name="message" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="fmppType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="data">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="expandProperties" type="xs:string"/>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
        </xs:choice>
        <xs:attribute name="sourceFile" type="xs:string"/>
        <xs:attribute name="outputFile" type="xs:string"/>
        <xs:attribute name="sourceRoot" type="xs:string"/>
        <xs:attribute name="outputRoot" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="replaceExtension" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="databaseType">
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="logextractType">
        <xs:complexContent>
            <xs:extension base="resourceCollectionContainerType">
                <xs:attribute name="file" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="signalType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="result" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dependenciesType">
        <xs:attribute name="format" type="xs:string"/>
    </xs:complexType>
    <!-- Presets -->
    <xs:complexType name="preset.mailType">
        <xs:complexContent>
            <xs:extension base="mailType"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="preset.execType">
        <xs:complexContent>
            <xs:extension base="execType"/>
        </xs:complexContent>
    </xs:complexType>
    <!-- Macros -->
    <xs:complexType name="macro.compile.htmlscanlogType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.cmakerType">
        <xs:attribute name="ncp" type="xs:string"/>
        <xs:attribute name="s60" type="xs:string"/>
        <xs:attribute name="action" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.compile.genxmlType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="configuration" type="xs:string"/>
        <xs:attribute name="log" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.compile.ebsType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="log" type="xs:string"/>
        <xs:attribute name="threads" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.build.ebs.xmlType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="logname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.log.htmlType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.bldmake-bldfilesType">
        <xs:attribute name="dir" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.abldType">
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="platform" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.filtered-record-startType"/>
    <xs:complexType name="macro.filtered-record-stopType">
        <xs:attribute name="pattern" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.update-statusType"/>
    <xs:complexType name="macro.create-cshelp-bldinfType">
        <xs:attribute name="delivery" type="xs:string"/>
        <xs:attribute name="product" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="createDeltaZipMacroType">
        <xs:attribute name="variant" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.rombuild-imakerType">
        <xs:attribute name="product" type="xs:string"/>
        <xs:attribute name="target" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.imakerType">
        <xs:attribute name="product" type="xs:string"/>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="makefile" type="xs:string"/>
        <xs:attribute name="cmd" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.ccm-availableType">
        <xs:attribute name="resultproperty" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.publishType"/>
    <xs:complexType name="macro.rom-buildType">
        <xs:attribute name="stage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.disk-spaceType">
        <xs:attribute name="drive" type="xs:string"/>
        <xs:attribute name="space" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.notifyType">
        <xs:attribute name="message" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.netrc-passwordType">
        <xs:attribute name="output-prop" type="xs:string"/>
        <xs:attribute name="result-prop" type="xs:string"/>
        <xs:attribute name="type" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.netrc-usernameType">
        <xs:attribute name="output-prop" type="xs:string"/>
        <xs:attribute name="result-prop" type="xs:string"/>
        <xs:attribute name="type" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.compile.genxml-mergeType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.declare.idType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="macro.mail-target-completedType">
        <xs:attribute name="section" type="xs:string"/>
        <xs:attribute name="sms" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="zipContentMacroType">
        <xs:attribute name="type" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.delete-fota-confType">
        <xs:attribute name="product" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.rombuild.valueType">
        <xs:attribute name="product.name" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="rombuild.value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="hlm-assertType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="message" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="hlm-assertFileExistsType">
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="message" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="reference-to-fileType">
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.xml.to.fmtlType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="xmlroot" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.temp.record.startType">
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.temp.record.stopType">
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <!--
    
    <xs:complexType name="Type">
        <xs:attribute name="" type="xs:string"/>
    </xs:complexType>
    -->
</xs:schema>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="ant.apache.org"
           xmlns:au="org.apache.ant.antunit"
           xmlns:hlm="http://www.nokia.com/helium"
           xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">
    <xs:import namespace="org.apache.ant.antunit" schemaLocation="antunit.xsd"/>
    <xs:import namespace="http://www.nokia.com/helium" schemaLocation="helium_ant.xsd"/>
    <xs:complexType name="taskcontainerType" abstract="true">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="propertyfile" type="propertyfileType"/>
            <xs:element name="propertycopy" type="propertycopyType"/>
            <xs:element name="importtypelib" type="importtypelibType"/>
            <xs:element name="sql" type="sqlType"/>
            <xs:element name="cvspass" type="cvspassType"/>
            <xs:element name="p4reopen" type="p4reopenType"/>
            <xs:element name="csc" type="cscType"/>
            <xs:element name="dirname" type="dirnameType"/>
            <xs:element name="p4label" type="p4labelType"/>
            <xs:element name="p4revert" type="p4revertType"/>
            <xs:element name="replaceregexp" type="replaceregexpType"/>
            <xs:element name="get" type="getType"/>
            <xs:element name="jjtree" type="jjtreeType"/>
            <xs:element name="sleep" type="sleepType"/>
            <xs:element name="jarlib-display" type="jarlib-displayType"/>
            <xs:element name="dependset" type="dependsetType"/>
            <xs:element name="zip" type="zipType"/>
            <xs:element name="patch" type="patchType"/>
            <xs:element name="jspc" type="jspcType"/>
            <xs:element name="style" type="styleType"/>
            <xs:element name="test" type="testType"/>
            <xs:element name="tstamp" type="tstampType"/>
            <xs:element name="unwar" type="unwarType"/>
            <xs:element name="icontract" type="icontractType"/>
            <xs:element name="cvschangelog" type="cvschangelogType"/>
            <xs:element name="p4submit" type="p4submitType"/>
            <xs:element name="p4change" type="p4changeType"/>
            <xs:element name="bzip2" type="bzip2Type"/>
            <xs:element name="sync" type="syncType"/>
            <xs:element name="p4delete" type="p4deleteType"/>
            <xs:element name="javadoc" type="javadocType"/>
            <xs:element name="p4integrate" type="p4integrateType"/>
            <xs:element name="translate" type="translateType"/>
            <xs:element name="signjar" type="signjarType"/>
            <xs:element name="chown" type="chownType"/>
            <xs:element name="vajload" type="vajloadType"/>
            <xs:element name="jarlib-available" type="jarlib-availableType"/>
            <xs:element name="buildnumber" type="buildnumberType"/>
            <xs:element name="jpcovmerge" type="jpcovmergeType"/>
            <xs:element name="war" type="warType"/>
            <xs:element name="rename" type="renameType"/>
            <xs:element name="sequential" type="sequentialType"/>
            <xs:element name="serverdeploy" type="serverdeployType"/>
            <xs:element name="property" type="propertyType"/>
            <xs:element name="subant" type="subantType"/>
            <xs:element name="move" type="moveType"/>
            <xs:element name="ildasm" type="ildasmType"/>
            <xs:element name="copydir" type="copydirType"/>
            <xs:element name="fixcrlf" type="fixcrlfType"/>
            <xs:element name="pathconvert" type="pathconvertType"/>
            <xs:element name="record" type="recordType"/>
            <xs:element name="p4sync" type="p4syncType"/>
            <xs:element name="exec" type="execType"/>
            <xs:element name="ccmklabel" type="ccmklabelType"/>
            <xs:element name="p4edit" type="p4editType"/>
            <xs:element name="manifest" type="manifestType"/>
            <xs:element name="maudit" type="mauditType"/>
            <xs:element name="antlr" type="antlrType"/>
            <xs:element name="jpcovreport" type="jpcovreportType"/>
            <xs:element name="execon" type="execonType"/>
            <xs:element name="ant" type="antType"/>
            <xs:element name="xmlvalidate" type="xmlvalidateType"/>
            <xs:element name="xslt" type="xsltType"/>
            <xs:element name="p4resolve" type="p4resolveType"/>
            <xs:element name="gzip" type="gzipType"/>
            <xs:element name="native2ascii" type="native2asciiType"/>
            <xs:element name="ccrmtype" type="ccrmtypeType"/>
            <xs:element name="ear" type="earType"/>
            <xs:element name="input" type="inputType"/>
            <xs:element name="presetdef" type="presetdefType"/>
            <xs:element name="rmic" type="rmicType"/>
            <xs:element name="checksum" type="checksumType"/>
            <xs:element name="mail" type="mailType"/>
            <xs:element name="loadfile" type="loadfileType"/>
            <xs:element name="loadresource" type="loadresourceType"/>
            <xs:element name="mimemail" type="mimemailType"/>
            <xs:element name="gunzip" type="gunzipType"/>
            <xs:element name="concat" type="concatType"/>
            <xs:element name="cab" type="cabType"/>
            <xs:element name="touch" type="touchType"/>
            <xs:element name="parallel" type="parallelType"/>
            <xs:element name="splash" type="splashType"/>
            <xs:element name="antcall" type="antcallType"/>
            <xs:element name="typedef" type="typedefType"/>
            <xs:element name="p4have" type="p4haveType"/>
            <xs:element name="filter" type="filterType"/>
            <xs:element name="xmlproperty" type="xmlpropertyType"/>
            <xs:element name="import" type="importType"/>
            <xs:element name="copy" type="copyType"/>
            <xs:element name="jsharpc" type="jsharpcType"/>
            <xs:element name="symlink" type="symlinkType"/>
            <xs:element name="antstructure" type="antstructureType"/>
            <xs:element name="script" type="scriptType"/>
            <xs:element name="rpm" type="rpmType"/>
            <xs:element name="delete" type="deleteType"/>
            <xs:element name="replace" type="replaceType"/>
            <xs:element name="attrib" type="attribType"/>
            <xs:element name="waitfor" type="waitforType"/>
            <xs:element name="untar" type="untarType"/>
            <xs:element name="loadproperties" type="loadpropertiesType"/>
            <xs:element name="available" type="availableType"/>
            <xs:element name="echoproperties" type="echopropertiesType"/>
            <xs:element name="chgrp" type="chgrpType"/>
            <xs:element name="vajexport" type="vajexportType"/>
            <xs:element name="bunzip2" type="bunzip2Type"/>
            <xs:element name="whichresource" type="whichresourceType"/>
            <xs:element name="copyfile" type="copyfileType"/>
            <xs:element name="p4labelsync" type="p4labelsyncType"/>
            <xs:element name="macrodef" type="macrodefType"/>
            <xs:element name="unjar" type="unjarType"/>
            <xs:element name="vbc" type="vbcType"/>
            <xs:element name="mkdir" type="mkdirType"/>
            <xs:element name="condition" type="conditionType"/>
            <xs:element name="cvs" type="cvsType"/>
            <xs:element name="tempfile" type="tempfileType"/>
            <xs:element name="junit" type="junitType"/>
            <xs:element name="junitreport" type="junitreportType"/>
            <xs:element name="cobertura-instrument" type="cobertura-instrumentType"/>
            <xs:element name="cobertura-report" type="cobertura-reportType"/>
            <xs:element name="taskdef" type="taskdefType"/>
            <xs:element name="echo" type="echoType"/>
            <xs:element name="java" type="javaType"/>
            <xs:element name="renameext" type="renameextType"/>
            <xs:element name="basename" type="basenameType"/>
            <xs:element name="javadoc2" type="javadoc2Type"/>
            <xs:element name="tar" type="tarType"/>
            <xs:element name="vajimport" type="vajimportType"/>
            <xs:element name="p4fstat" type="p4fstatType"/>
            <xs:element name="setproxy" type="setproxyType"/>
            <xs:element name="p4counter" type="p4counterType"/>
            <xs:element name="ilasm" type="ilasmType"/>
            <xs:element name="apply" type="applyType"/>
            <xs:element name="jarlib-resolve" type="jarlib-resolveType"/>
            <xs:element name="jlink" type="jlinkType"/>
            <xs:element name="cvstagdiff" type="cvstagdiffType"/>
            <xs:element name="javacc" type="javaccType"/>
            <xs:element name="chmod" type="chmodType"/>
            <xs:element name="pvcs" type="pvcsType"/>
            <xs:element name="jarlib-manifest" type="jarlib-manifestType"/>
            <xs:element name="jar" type="jarType"/>
            <xs:element name="ccmklbtype" type="ccmklbtypeType"/>
            <xs:element name="sound" type="soundType"/>
            <xs:element name="scriptdef" type="scriptdefType"/>
            <xs:element name="defaultexcludes" type="defaultexcludesType"/>
            <xs:element name="blgenclient" type="blgenclientType"/>
            <xs:element name="uptodate" type="uptodateType"/>
            <xs:element name="jjdoc" type="jjdocType"/>
            <xs:element name="genkey" type="genkeyType"/>
            <xs:element name="javah" type="javahType"/>
            <xs:element name="ccmreconfigure" type="ccmreconfigureType"/>
            <xs:element name="fail" type="failType"/>
            <xs:element name="unzip" type="unzipType"/>
            <xs:element name="javac" type="javacType"/>
            <xs:element name="p4add" type="p4addType"/>
            <xs:element name="jpcoverage" type="jpcoverageType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="deltree" type="deltreeType"/>
            <xs:element name="ddcreator" type="ddcreatorType"/>
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="assertions" type="assertionsType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="filterset" type="filtersetType"/>
            <xs:element name="libfileset" type="libfilesetType"/>
            <xs:element name="filterreader" type="filterreaderType"/>
            <xs:element name="scriptfilter" type="scriptfilterType"/>
            <xs:element name="concatfilter" type="concatfilterType"/>
            <xs:element name="extension" type="extensionType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="filterchain" type="filterchainType"/>
            <xs:element name="path" type="pathType"/>
            <xs:element name="classfileset" type="classfilesetType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
            <xs:element name="description" type="descriptionType"/>
            <xs:element name="mapper" type="mapperType"/>
            <xs:element name="zipfileset" type="zipfilesetType"/>
            <xs:element name="substitution" type="substitutionType"/>
            <xs:element name="extensionSet" type="extensionSetType"/>
            <xs:element name="regexp" type="regexpType"/>
            <xs:element name="foreach" type="foreachType"/>
            <xs:element name="doxygen" type="doxygenType"/>
            <xs:element name="var" type="varType"/>
            <xs:element name="propertyregex" type="propertyregexType"/>
            <xs:element name="if" type="ifType"/>
            <xs:element name="for" type="forType"/>
            <xs:element name="mergelogs" type="mergelogsType"/>
            <xs:element name="reviewplan" type="reviewplanType"/>
            <xs:element name="processreviewplan" type="processreviewplanType"/>
            <xs:element name="convertreviewlog" type="convertreviewlogType"/>
            <xs:element name="lint" type="lintType"/>
            <xs:element name="customcopy" type="customcopyType"/>
            <xs:element name="fop" type="fopType"/>
            <xs:element name="xmltask" type="xmltaskType"/>
            <xs:element name="ftp" type="ftpType"/>
            <xs:element name="abld" type="abldType"/>
            <xs:element name="getsize" type="getsizeType"/>
            <xs:element name="grand" type="grandType"/>
            <xs:element name="svn" type="svnType"/>
            <xs:element name="antunit" type="antunitType"/>
            <xs:element name="schemavalidate" type="schemavalidateType"/>
            <xs:element name="python" type="pythonType"/>
            <xs:element name="antform" type="antformType"/>
            <xs:element name="math" type="mathType"/>
            <xs:element name="antserver" type="antserverType"/>
            <xs:element name="shellscript" type="shellscriptType"/>
            <xs:element name="runtarget" type="runtargetType"/>
            <xs:element name="echoxml" type="echoxmlType"/>
            <xs:element name="trycatch" type="trycatchType"/>
            <xs:element name="resourcecount" type="resourcecountType"/>
            <xs:element name="remoteant" type="remoteantType"/>
            <xs:element name="retry" type="retryType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="then" type="thenType"/>
            <xs:element name="antcallback" type="antcallbackType"/>
            <xs:element name="diagnostics" type="diagnosticsType"/>
            <xs:element name="sshexec" type="sshexecType"/>
            <xs:element name="scp" type="scpType"/>
            <xs:element name="xcluder" type="xcluderType"/>
            <xs:element name="assertTrue" type="assertTrueType"/>
            <xs:element name="assertFileExists" type="assertFileExistsType"/>
            <xs:element name="fmpp" type="fmppType"/>
            <xs:element name="timestampselector" type="timestampselectorType"/>
            <xs:element name="preset.exec" type="preset.execType"/>
            <xs:element name="preset.mail" type="preset.mailType"/>
            <xs:element name="createDeltaZipMacro" type="createDeltaZipMacroType"/>
            <xs:element name="zipContentMacro" type="zipContentMacroType"/>
            
            <xs:element ref="au:assertPropertyEquals"/>
            <xs:element ref="au:assertLogDoesntContain"/>
            <xs:element ref="au:assertPropertySet"/>
            
            <xs:element ref="hlm:configuration"/>
            <xs:element ref="hlm:database"/>
            <xs:element ref="hlm:logextract"/>
            <xs:element ref="hlm:signal"/>
            <xs:element ref="hlm:dependencies"/>
            <xs:element ref="hlm:compileHtmlscanlogMacro"/>
            <xs:element ref="hlm:cmakerMacro"/>
            <xs:element ref="hlm:compileEbsMacro"/>
            <xs:element ref="hlm:buildEbsXmlMacro"/>
            <xs:element ref="hlm:logHtmlMacro"/>
            <xs:element ref="hlm:compileGenxmlMacro"/>
            <xs:element ref="hlm:bldmakeBldfilesMacro"/>
            <xs:element ref="hlm:abldMacro"/>
            <xs:element ref="hlm:filterRecordStartMacro"/>
            <xs:element ref="hlm:filterRecordStopMacro"/>
            <xs:element ref="hlm:updateStatusMacro"/>
            <xs:element ref="hlm:createCshelpBldinfMacro"/>
            <xs:element ref="hlm:imakerMacro"/>
            <xs:element ref="hlm:imaker"/>
            <xs:element ref="hlm:defaultEngine"/>
            <xs:element ref="hlm:emakeEngine"/>
            <xs:element ref="hlm:rombuildImakerMacro"/>
            <xs:element ref="hlm:ecImakerMacro"/>
            <xs:element ref="hlm:preECImakerMacro"/>
            <xs:element ref="hlm:ccmAvailableMacro"/>
            <xs:element ref="hlm:publishMacro"/>
            <xs:element ref="hlm:rombuildMacro"/>
            <xs:element ref="hlm:notifyMacro"/>
            <xs:element ref="hlm:diskspaceMacro"/>
            <xs:element ref="hlm:netrcPasswordMacro"/>
            <xs:element ref="hlm:netrcUsernameMacro"/>
            <xs:element ref="hlm:compileGenxmlMergeMacro"/>
            <xs:element ref="hlm:declareIdMacro"/>
            <xs:element ref="hlm:mailTargetCompletedMacro"/>
            <xs:element ref="hlm:deleteFotaConfMacro"/>
            <xs:element ref="hlm:rombuildValueMacro"/>
            <xs:element ref="hlm:assert"/>
            <xs:element ref="hlm:assertFileExists"/>
            <xs:element ref="hlm:referenceToFileMacro"/>
            <xs:element ref="hlm:xmlToFmtlMacro"/>
            <xs:element ref="hlm:tempRecordStartMacro"/>
            <xs:element ref="hlm:tempRecordStopMacro"/>
            <xs:element ref="hlm:fooMacro"/>
            <!-- Presets -->
            <!-- Macros -->
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="resourceCollectionContainerType" abstract="true">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
            <xs:element name="first" type="firstType"/>
            <xs:element name="sort" type="sortType"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="addfilesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="andType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="isset" type="issetType"/>
            <xs:element name="os" type="osType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="antType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="property" type="propertyType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="inheritAll">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="inheritrefs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="antfile" type="xs:string"/>
        <xs:attribute name="target" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="antcallType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="param" type="paramType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="inheritAll">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="inheritrefs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="target" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="antlrType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="jvmarg" type="jvmargType"/>
            <xs:element name="classpath" type="classpathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputdirectory" type="xs:string"/>
        <xs:attribute name="fork">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="trace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tracetreewalker">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="html">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tracelexer">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="diagnostic">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="traceparser">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="glib" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="antstructureType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="applyType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="archivesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="argType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="line" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="argumentType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="line" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="assertionsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="disable" type="disableType"/>
            <xs:element name="enable" type="enableType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="enablesystemassertions">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="attribType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="readonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="hidden">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="system">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="archive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="attributeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="default" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="availableType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="filepath" type="filepathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="ignoresystemclasses">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="filepath" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="basenameType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="suffix" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="bccType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="address" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="blgenclientType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="mode" type="xs:string"/>
        <xs:attribute name="ejbjar" type="xs:string"/>
        <xs:attribute name="version" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="clientjar" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="bootclasspathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="bottomType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="buildnumberType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="buildpathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="buildpathelementType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="bunzip2Type">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="bzip2Type">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="zipfile" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cabType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cabfile" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="options" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="catalogpathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ccType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="address" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ccmklabelType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="recurse">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="replace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="viewpath" type="xs:string"/>
        <xs:attribute name="typename" type="xs:string"/>
        <xs:attribute name="comment" type="xs:string"/>
        <xs:attribute name="version" type="xs:string"/>
        <xs:attribute name="failonerr">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="objselect" type="xs:string"/>
        <xs:attribute name="cleartooldir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vob" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="commentfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ccmklbtypeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="global">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="replace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="shared">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="viewpath" type="xs:string"/>
        <xs:attribute name="typename" type="xs:string"/>
        <xs:attribute name="pbranch">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="comment" type="xs:string"/>
        <xs:attribute name="failonerr">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="objselect" type="xs:string"/>
        <xs:attribute name="cleartooldir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vob" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="commentfile" type="xs:string"/>
        <xs:attribute name="ordinary">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="ccmreconfigureType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="ccmaction" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="ccmproject" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="recurse">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="ccmdir" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ccrmtypeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="viewpath" type="xs:string"/>
        <xs:attribute name="typename" type="xs:string"/>
        <xs:attribute name="rmall">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="comment" type="xs:string"/>
        <xs:attribute name="ignore">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="typekind" type="xs:string"/>
        <xs:attribute name="failonerr">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="objselect" type="xs:string"/>
        <xs:attribute name="cleartooldir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vob" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="commentfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="checksumType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="fileext" type="xs:string"/>
        <xs:attribute name="totalproperty" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="readbuffersize" type="xs:string"/>
        <xs:attribute name="verifyproperty" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="algorithm" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="provider" type="xs:string"/>
        <xs:attribute name="forceoverwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="chgrpType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="group" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="chmodType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="mapper" type="mapperType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="arg" type="argType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="perm" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="chownType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="owner" type="xs:string"/>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="classType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="classconstantsType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="classesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="classfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="rootfileset" type="rootfilesetType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="root" type="rootType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="rootclass" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="classpathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="commandlineType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="marker" type="markerType"/>
            <xs:element name="argument" type="argumentType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="executable" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="commentType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="compilerargType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="line" type="xs:string"/>
        <xs:attribute name="implementation" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="compiler" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="compilerclasspathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="concatType" mixed="true">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterchain" type="filterchainType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="path" type="pathType"/>
            <xs:element name="footer" type="footerType"/>
            <xs:element name="header" type="headerType"/>
            <xs:element name="propertyresource" type="propertyresourceType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="force">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="eol">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="asis"/>
                    <xs:enumeration value="cr"/>
                    <xs:enumeration value="lf"/>
                    <xs:enumeration value="crlf"/>
                    <xs:enumeration value="mac"/>
                    <xs:enumeration value="unix"/>
                    <xs:enumeration value="dos"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputencoding" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="fixlastline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="concatfilterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="append" type="xs:string"/>
        <xs:attribute name="prepend" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="conditionType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="isfalse" type="isfalseType"/>
            <xs:element name="isreference" type="isreferenceType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="available" type="availableType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="contains" type="containsconditionType"/>
            <xs:element name="os" type="osType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="filesmatch" type="filesmatchType"/>
            <xs:element name="checksum" type="checksumType"/>
            <xs:element name="istrue" type="istrueType"/>
            <xs:element name="isset" type="issetType"/>
            <xs:element name="socket" type="socketType"/>
            <xs:element name="http" type="httpType"/>
            <xs:element name="uptodate" type="uptodateType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="containsType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="ignorewhitespace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="text" type="xs:string"/>
    </xs:complexType>
    <!-- Used for <contains> in <fail> -->
    <xs:complexType name="containsconditionType">
        <xs:attribute name="casesensitive" type="xs:boolean"/>
        <xs:attribute name="string" type="xs:string"/>
        <xs:attribute name="substring" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="containsregexType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flags" type="xs:string"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="replace" type="xs:string"/>
        <xs:attribute name="pattern" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="containsregexpType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="expression" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="containsstringType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="contains" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="copyType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterchain" type="filterchainType"/>
            <xs:element name="resources" type="resourcesType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="filterset" type="filtersetType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flatten">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="verbose" type="xs:string"/>
        <xs:attribute name="includeemptydirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="enablemultiplemappings">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputencoding" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="preservelastmodified">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filtering">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="copydirType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flatten">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="forceoverwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="filtering">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="copyfileType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="forceoverwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="filtering" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="coveragepathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cscType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="resource" type="resourceType"/>
            <xs:element name="define" type="defineType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="src" type="srcType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="win32icon" type="xs:string"/>
        <xs:attribute name="definitions" type="xs:string"/>
        <xs:attribute name="referencefiles" type="xs:string"/>
        <xs:attribute name="fullpaths">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="mainclass" type="xs:string"/>
        <xs:attribute name="utf8output">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="useresponsefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includedefaultreferences">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="warnlevel" type="xs:string"/>
        <xs:attribute name="win32res" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="extraoptions" type="xs:string"/>
        <xs:attribute name="incremental">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="noconfig">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="references" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="optimize">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="additionalmodules" type="xs:string"/>
        <xs:attribute name="docfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="unsafe">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filealign" type="xs:string"/>
        <xs:attribute name="targettype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="exe"/>
                    <xs:enumeration value="library"/>
                    <xs:enumeration value="module"/>
                    <xs:enumeration value="winexe"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="customType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="param" type="paramType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cvsType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="commandline" type="commandlineType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cvsrsh" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="passfile" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="cvsroot" type="xs:string"/>
        <xs:attribute name="reallyquiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="compressionlevel" type="xs:string"/>
        <xs:attribute name="noexec">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="date" type="xs:string"/>
        <xs:attribute name="compression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tag" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cvschangelogType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="user" type="userType"/>
            <xs:element name="commandline" type="commandlineType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cvsrsh" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="passfile" type="xs:string"/>
        <xs:attribute name="end" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="start" type="xs:string"/>
        <xs:attribute name="cvsroot" type="xs:string"/>
        <xs:attribute name="reallyquiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="compressionlevel" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="usersfile" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="noexec">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="daysinpast" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="date" type="xs:string"/>
        <xs:attribute name="compression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tag" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cvspassType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="cvsroot" type="xs:string"/>
        <xs:attribute name="passfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cvstagdiffType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="commandline" type="commandlineType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cvsrsh" type="xs:string"/>
        <xs:attribute name="endtag" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="passfile" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="cvsroot" type="xs:string"/>
        <xs:attribute name="reallyquiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="starttag" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="compressionlevel" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="enddate" type="xs:string"/>
        <xs:attribute name="noexec">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="date" type="xs:string"/>
        <xs:attribute name="startdate" type="xs:string"/>
        <xs:attribute name="compression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tag" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="daemonsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="propertyfile" type="propertyfileType"/>
                <xs:element name="importtypelib" type="importtypelibType"/>
                <xs:element name="sql" type="sqlType"/>
                <xs:element name="cvspass" type="cvspassType"/>
                <xs:element name="p4reopen" type="p4reopenType"/>
                <xs:element name="csc" type="cscType"/>
                <xs:element name="dirname" type="dirnameType"/>
                <xs:element name="p4label" type="p4labelType"/>
                <xs:element name="p4revert" type="p4revertType"/>
                <xs:element name="replaceregexp" type="replaceregexpType"/>
                <xs:element name="get" type="getType"/>
                <xs:element name="jjtree" type="jjtreeType"/>
                <xs:element name="sleep" type="sleepType"/>
                <xs:element name="jarlib-display" type="jarlib-displayType"/>
                <xs:element name="dependset" type="dependsetType"/>
                <xs:element name="zip" type="zipType"/>
                <xs:element name="patch" type="patchType"/>
                <xs:element name="jspc" type="jspcType"/>
                <xs:element name="style" type="styleType"/>
                <xs:element name="test" type="testType"/>
                <xs:element name="tstamp" type="tstampType"/>
                <xs:element name="unwar" type="unwarType"/>
                <xs:element name="icontract" type="icontractType"/>
                <xs:element name="cvschangelog" type="cvschangelogType"/>
                <xs:element name="p4submit" type="p4submitType"/>
                <xs:element name="p4change" type="p4changeType"/>
                <xs:element name="bzip2" type="bzip2Type"/>
                <xs:element name="sync" type="syncType"/>
                <xs:element name="p4delete" type="p4deleteType"/>
                <xs:element name="javadoc" type="javadocType"/>
                <xs:element name="p4integrate" type="p4integrateType"/>
                <xs:element name="translate" type="translateType"/>
                <xs:element name="signjar" type="signjarType"/>
                <xs:element name="chown" type="chownType"/>
                <xs:element name="vajload" type="vajloadType"/>
                <xs:element name="jarlib-available" type="jarlib-availableType"/>
                <xs:element name="buildnumber" type="buildnumberType"/>
                <xs:element name="jpcovmerge" type="jpcovmergeType"/>
                <xs:element name="war" type="warType"/>
                <xs:element name="rename" type="renameType"/>
                <xs:element name="sequential" type="sequentialType"/>
                <xs:element name="serverdeploy" type="serverdeployType"/>
                <xs:element name="property" type="propertyType"/>
                <xs:element name="subant" type="subantType"/>
                <xs:element name="move" type="moveType"/>
                <xs:element name="ildasm" type="ildasmType"/>
                <xs:element name="copydir" type="copydirType"/>
                <xs:element name="fixcrlf" type="fixcrlfType"/>
                <xs:element name="pathconvert" type="pathconvertType"/>
                <xs:element name="record" type="recordType"/>
                <xs:element name="p4sync" type="p4syncType"/>
                <xs:element name="exec" type="execType"/>
                <xs:element name="ccmklabel" type="ccmklabelType"/>
                <xs:element name="p4edit" type="p4editType"/>
                <xs:element name="manifest" type="manifestType"/>
                <xs:element name="maudit" type="mauditType"/>
                <xs:element name="antlr" type="antlrType"/>
                <xs:element name="jpcovreport" type="jpcovreportType"/>
                <xs:element name="execon" type="execonType"/>
                <xs:element name="ant" type="antType"/>
                <xs:element name="xmlvalidate" type="xmlvalidateType"/>
                <xs:element name="xslt" type="xsltType"/>
                <xs:element name="p4resolve" type="p4resolveType"/>
                <xs:element name="gzip" type="gzipType"/>
                <xs:element name="native2ascii" type="native2asciiType"/>
                <xs:element name="ccrmtype" type="ccrmtypeType"/>
                <xs:element name="ear" type="earType"/>
                <xs:element name="input" type="inputType"/>
                <xs:element name="presetdef" type="presetdefType"/>
                <xs:element name="rmic" type="rmicType"/>
                <xs:element name="checksum" type="checksumType"/>
                <xs:element name="mail" type="mailType"/>
                <xs:element name="loadfile" type="loadfileType"/>
                <xs:element name="mimemail" type="mimemailType"/>
                <xs:element name="gunzip" type="gunzipType"/>
                <xs:element name="concat" type="concatType"/>
                <xs:element name="cab" type="cabType"/>
                <xs:element name="touch" type="touchType"/>
                <xs:element name="parallel" type="parallelType"/>
                <xs:element name="splash" type="splashType"/>
                <xs:element name="antcall" type="antcallType"/>
                <xs:element name="typedef" type="typedefType"/>
                <xs:element name="p4have" type="p4haveType"/>
                <xs:element name="filter" type="filterType"/>
                <xs:element name="xmlproperty" type="xmlpropertyType"/>
                <xs:element name="import" type="importType"/>
                <xs:element name="copy" type="copyType"/>
                <xs:element name="jsharpc" type="jsharpcType"/>
                <xs:element name="symlink" type="symlinkType"/>
                <xs:element name="antstructure" type="antstructureType"/>
                <xs:element name="script" type="scriptType"/>
                <xs:element name="rpm" type="rpmType"/>
                <xs:element name="delete" type="deleteType"/>
                <xs:element name="replace" type="replaceType"/>
                <xs:element name="attrib" type="attribType"/>
                <xs:element name="waitfor" type="waitforType"/>
                <xs:element name="untar" type="untarType"/>
                <xs:element name="loadproperties" type="loadpropertiesType"/>
                <xs:element name="available" type="availableType"/>
                <xs:element name="echoproperties" type="echopropertiesType"/>
                <xs:element name="chgrp" type="chgrpType"/>
                <xs:element name="vajexport" type="vajexportType"/>
                <xs:element name="bunzip2" type="bunzip2Type"/>
                <xs:element name="whichresource" type="whichresourceType"/>
                <xs:element name="copyfile" type="copyfileType"/>
                <xs:element name="p4labelsync" type="p4labelsyncType"/>
                <xs:element name="macrodef" type="macrodefType"/>
                <xs:element name="unjar" type="unjarType"/>
                <xs:element name="vbc" type="vbcType"/>
                <xs:element name="mkdir" type="mkdirType"/>
                <xs:element name="condition" type="conditionType"/>
                <xs:element name="cvs" type="cvsType"/>
                <xs:element name="tempfile" type="tempfileType"/>
                <xs:element name="junit" type="junitType"/>
                <xs:element name="junitreport" type="junitreportType"/>
                <xs:element name="cobertura-instrument" type="cobertura-instrumentType"/>
                <xs:element name="cobertura-report" type="cobertura-reportType"/>
                <xs:element name="taskdef" type="taskdefType"/>
                <xs:element name="echo" type="echoType"/>
                <xs:element name="java" type="javaType"/>
                <xs:element name="renameext" type="renameextType"/>
                <xs:element name="basename" type="basenameType"/>
                <xs:element name="javadoc2" type="javadoc2Type"/>
                <xs:element name="tar" type="tarType"/>
                <xs:element name="vajimport" type="vajimportType"/>
                <xs:element name="p4fstat" type="p4fstatType"/>
                <xs:element name="setproxy" type="setproxyType"/>
                <xs:element name="p4counter" type="p4counterType"/>
                <xs:element name="ilasm" type="ilasmType"/>
                <xs:element name="apply" type="applyType"/>
                <xs:element name="jarlib-resolve" type="jarlib-resolveType"/>
                <xs:element name="jlink" type="jlinkType"/>
                <xs:element name="cvstagdiff" type="cvstagdiffType"/>
                <xs:element name="javacc" type="javaccType"/>
                <xs:element name="chmod" type="chmodType"/>
                <xs:element name="pvcs" type="pvcsType"/>
                <xs:element name="jarlib-manifest" type="jarlib-manifestType"/>
                <xs:element name="jar" type="jarType"/>
                <xs:element name="ccmklbtype" type="ccmklbtypeType"/>
                <xs:element name="sound" type="soundType"/>
                <xs:element name="scriptdef" type="scriptdefType"/>
                <xs:element name="defaultexcludes" type="defaultexcludesType"/>
                <xs:element name="blgenclient" type="blgenclientType"/>
                <xs:element name="uptodate" type="uptodateType"/>
                <xs:element name="jjdoc" type="jjdocType"/>
                <xs:element name="genkey" type="genkeyType"/>
                <xs:element name="javah" type="javahType"/>
                <xs:element name="fail" type="failType"/>
                <xs:element name="unzip" type="unzipType"/>
                <xs:element name="javac" type="javacType"/>
                <xs:element name="p4add" type="p4addType"/>
                <xs:element name="jpcoverage" type="jpcoverageType"/>
                <xs:element name="depend" type="dependType"/>
                <xs:element name="deltree" type="deltreeType"/>
                <xs:element name="ddcreator" type="ddcreatorType"/>
                <xs:element name="retry" type="retryType"/>
            </xs:choice>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="dateType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="when">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="before"/>
                    <xs:enumeration value="after"/>
                    <xs:enumeration value="equal"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="millis" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="checkdirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="granularity" type="xs:string"/>
        <xs:attribute name="datetime" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ddcreatorType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="descriptors" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="defaultexcludesType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="remove" type="xs:string"/>
        <xs:attribute name="echo">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="default">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="add" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="defineType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="deleteType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeemptydirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="deletecharactersType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="chars" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="deltreeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dependType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="mapper" type="mapperType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="targetdir" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="granularity" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dependsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="libfileset" type="libfilesetType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dependsetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="targetfileset" type="targetfilesetType"/>
            <xs:element name="srcfileset" type="srcfilesetType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="srcfilelist" type="srcfilelistType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="targetfilelist" type="targetfilelistType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="depthType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="max" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="min" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="descriptionType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="refid" type="xs:IDREF"/>
                <xs:attribute name="description" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="differentType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="mapper" type="mapperType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="targetdir" type="xs:string"/>
        <xs:attribute name="ignoreFileTimes" type="xs:string"/>
        <xs:attribute name="ignoreContents" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="ignorefiletimes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="granularity" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dirnameType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dirsetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="disableType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dnameType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="param" type="paramType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="docletType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="path" type="pathType"/>
            <xs:element name="param" type="paramType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="doctitleType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="dtdType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="base" type="xs:string"/>
        <xs:attribute name="publicid" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="earType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="manifest" type="manifestType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="metainf" type="metainfType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="archives" type="archivesType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="zipgroupfileset" type="zipgroupfilesetType"/>
            <xs:element name="zipfileset" type="zipfilesetType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="keepcompression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="whenempty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="create"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="duplicate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="preserve"/>
                    <xs:enumeration value="fail"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="manifest" type="xs:string"/>
        <xs:attribute name="jarfile" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="index">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="update">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="earfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="appxml" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="manifestencoding" type="xs:string"/>
        <xs:attribute name="filesonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="filesetmanifest">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="merge"/>
                    <xs:enumeration value="mergewithoutmain"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="zipfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="echoType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="append">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="file" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
                <xs:attribute name="message" type="xs:string"/>
                <xs:attribute name="level">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="error"/>
                            <xs:enumeration value="warning"/>
                            <xs:enumeration value="info"/>
                            <xs:enumeration value="verbose"/>
                            <xs:enumeration value="debug"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="echopropertiesType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="propertyset" type="propertysetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="format">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="xml"/>
                    <xs:enumeration value="text"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="srcfile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="elementType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="optional">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="implicit" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="type" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="enableType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="entityType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="base" type="xs:string"/>
        <xs:attribute name="publicid" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="entryType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="operation" type="xs:string"/>
        <xs:attribute name="default" type="xs:string"/>
        <xs:attribute name="key" type="xs:string"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="int"/>
                    <xs:enumeration value="date"/>
                    <xs:enumeration value="string"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="unit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="millisecond"/>
                    <xs:enumeration value="second"/>
                    <xs:enumeration value="minute"/>
                    <xs:enumeration value="hour"/>
                    <xs:enumeration value="day"/>
                    <xs:enumeration value="week"/>
                    <xs:enumeration value="month"/>
                    <xs:enumeration value="year"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="pattern" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="envType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="key" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="redirectorType">
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="logError" type="xs:string"/>
        <xs:attribute name="append" type="xs:boolean"/>
        <xs:attribute name="createemptyfiles" type="xs:boolean"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="inputencoding" type="xs:string"/>
        <xs:attribute name="outputencoding" type="xs:string"/>
        <xs:attribute name="errorencoding" type="xs:string"/>
        <xs:attribute name="alwayslog" type="xs:boolean"/>
        <xs:attribute name="loginputstring" type="xs:boolean"/>
    </xs:complexType>
    <xs:complexType name="equalsType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="trim">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="arg2" type="xs:string"/>
        <xs:attribute name="arg1" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="escapeunicodeType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="excludeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="excludepackageType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="excludesfileType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="execType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="redirector" type="redirectorType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="osfamily" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="execonType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="targetfile" type="targetfileType"/>
            <xs:element name="srcfile" type="srcfileType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="skipemptyfilesets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failifexecutionfails">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxparallel" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="os" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="addsourcefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="forwardslash">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="resolveexecutable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="vmlauncher">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="relative">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="parallel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="existingType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="expandpropertiesType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="extdirsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="extensionType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="implementationversion" type="xs:string"/>
        <xs:attribute name="specificationversion" type="xs:string"/>
        <xs:attribute name="extensionname" type="xs:string"/>
        <xs:attribute name="implementationvendorid" type="xs:string"/>
        <xs:attribute name="specificationvendor" type="xs:string"/>
        <xs:attribute name="implementationurl" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="implementationvendor" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="extensionSetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="libfileset" type="libfilesetType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="extensionsetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="libfileset" type="libfilesetType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="factoryType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="attribute" type="attributeType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="failType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="condition" type="conditionType"/>
        </xs:choice>
        <xs:attribute name="message" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="failsoundType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="loops" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="duration" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filelistType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="files" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filenameType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="negate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="filepathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="resourcesType">
        <xs:attribute name="refid" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filesmatchType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="file2" type="xs:string"/>
        <xs:attribute name="file1" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filetokenizerType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="filterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="token" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filterchainType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="headfilter" type="headfilterType"/>
            <xs:element name="classconstants" type="classconstantsType"/>
            <xs:element name="linecontains" type="linecontainsType"/>
            <xs:element name="filterreader" type="filterreaderType"/>
            <xs:element name="replaceregex" type="replaceregexType"/>
            <xs:element name="replacetokens" type="replacetokensType"/>
            <xs:element name="escapeunicode" type="escapeunicodeType"/>
            <xs:element name="ignoreblank" type="ignoreblankType"/>
            <xs:element name="tailfilter" type="tailfilterType"/>
            <xs:element name="tabstospaces" type="tabstospacesType"/>
            <xs:element name="prefixlines" type="prefixlinesType"/>
            <xs:element name="expandproperties" type="expandpropertiesType"/>
            <xs:element name="striplinebreaks" type="striplinebreaksType"/>
            <xs:element name="trim" type="trimType"/>
            <xs:element name="striplinecomments" type="striplinecommentsType"/>
            <xs:element name="replacestring" type="replacestringType"/>
            <xs:element name="tokenfilter" type="tokenfilterType"/>
            <xs:element name="stripjavacomments" type="stripjavacommentsType"/>
            <xs:element name="containsregex" type="containsregexType"/>
            <xs:element name="deletecharacters" type="deletecharactersType"/>
            <xs:element name="linecontainsregexp" type="linecontainsregexpType"/>
            <xs:element name="concatfilter" type="concatfilterType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filtermapperType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="replaceregex" type="replaceregexType"/>
            <xs:element name="scriptfilter" type="scriptfilterType"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="scriptmapperType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="setbeans">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <xs:attribute name="src" type="xs:string"/>
                <xs:attribute name="language" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="filterreaderType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="param" type="paramType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filtersType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="include" type="includeType"/>
            <xs:element name="exclude" type="excludeType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="defaultexclude">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="filtersetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterset" type="filtersetType"/>
            <xs:element name="filter" type="filterType"/>
            <xs:element name="filtersfile" type="filtersfileType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="begintoken" type="xs:string"/>
        <xs:attribute name="endtoken" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="filtersfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="filtersfileType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="file" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="fixcrlfType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="tab">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="asis"/>
                    <xs:enumeration value="remove"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="cr">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="asis"/>
                    <xs:enumeration value="remove"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="eol">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="asis"/>
                    <xs:enumeration value="cr"/>
                    <xs:enumeration value="lf"/>
                    <xs:enumeration value="crlf"/>
                    <xs:enumeration value="mac"/>
                    <xs:enumeration value="unix"/>
                    <xs:enumeration value="dos"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="javafiles">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="eof">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="asis"/>
                    <xs:enumeration value="remove"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tablength" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fixlast">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="footerType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="formatType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="locale" type="xs:string"/>
        <xs:attribute name="timezone" type="xs:string"/>
        <xs:attribute name="unit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="millisecond"/>
                    <xs:enumeration value="second"/>
                    <xs:enumeration value="minute"/>
                    <xs:enumeration value="hour"/>
                    <xs:enumeration value="day"/>
                    <xs:enumeration value="week"/>
                    <xs:enumeration value="month"/>
                    <xs:enumeration value="year"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="pattern" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="offset" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="fromType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="address" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="genericType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="jvmarg" type="jvmargType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="server" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="username" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="genkeyType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="dname" type="dnameType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="storepass" type="xs:string"/>
        <xs:attribute name="sigalg" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keypass" type="xs:string"/>
        <xs:attribute name="dname" type="xs:string"/>
        <xs:attribute name="keysize" type="xs:string"/>
        <xs:attribute name="alias" type="xs:string"/>
        <xs:attribute name="keyalg" type="xs:string"/>
        <xs:attribute name="validity" type="xs:string"/>
        <xs:attribute name="keystore" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="storetype" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="getType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="ignoreerrors">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="username" type="xs:string"/>
        <xs:attribute name="usetimestamp">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="grantType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
        <xs:attribute name="actions" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="groupType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="package" type="packageType"/>
            <xs:element name="title" type="titleType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="packages" type="xs:string"/>
        <xs:attribute name="title" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="gunzipType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="gzipType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="zipfile" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="headerType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="headfilterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="lines" type="xs:string"/>
        <xs:attribute name="skip" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="httpType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="url" type="xs:string"/>
        <xs:attribute name="errorsbeginat" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="icontractType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classdir" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="repositorydir" type="xs:string"/>
        <xs:attribute name="instrumentdir" type="xs:string"/>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="builddir" type="xs:string"/>
        <xs:attribute name="updateicontrol">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="pre">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="controlfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="invariant">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="post">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="failthrowable" type="xs:string"/>
        <xs:attribute name="verbosity" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="repbuilddir" type="xs:string"/>
        <xs:attribute name="targets" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ignoreblankType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="ilasmType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="src" type="srcType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="owner" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="extraoptions" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="targettype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="exe"/>
                    <xs:enumeration value="library"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="outputfile" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="resourcefile" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="listing">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keyfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ildasmType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="assembler">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="encoding">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="ascii"/>
                    <xs:enumeration value="utf8"/>
                    <xs:enumeration value="unicode"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="progressbar">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="linenumbers">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="rawexceptionhandling">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="showsource">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="metadata">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="srcfile" type="xs:string"/>
        <xs:attribute name="bytes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="resourcedir" type="xs:string"/>
        <xs:attribute name="quoteallnames">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="header">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="visibility" type="xs:string"/>
        <xs:attribute name="sourcefile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="item" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="importType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="optional">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="importtypelibType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="unsafe">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="usesysarray">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="namespace" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="extraoptions" type="xs:string"/>
        <xs:attribute name="srcfile" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="includeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="includesfileType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="inputType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="addproperty" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
                <xs:attribute name="defaultvalue" type="xs:string"/>
                <xs:attribute name="validargs" type="xs:string"/>
                <xs:attribute name="message" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="isfalseType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="value">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="isreferenceType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="type" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="issetType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="istrueType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="value">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="jarType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="manifest" type="manifestType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="metainf" type="metainfType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="zipgroupfileset" type="zipgroupfilesetType"/>
            <xs:element name="zipfileset" type="zipfilesetType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="whenempty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="create"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keepcompression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="duplicate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="preserve"/>
                    <xs:enumeration value="fail"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="manifest" type="xs:string"/>
        <xs:attribute name="jarfile" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="index">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="update">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="manifestencoding" type="xs:string"/>
        <xs:attribute name="filesonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="filesetmanifest">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="merge"/>
                    <xs:enumeration value="mergewithoutmain"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="zipfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jarlib-availableType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="extensionset" type="extensionsetType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jarlib-displayType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jarlib-manifestType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="options" type="optionsType"/>
            <xs:element name="attribute" type="attributeType"/>
            <xs:element name="depends" type="dependsType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jarlib-resolveType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="ant" type="antType"/>
            <xs:element name="location" type="locationType"/>
            <xs:element name="url" type="urlType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="checkextension">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="javaType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="sysproperty" type="syspropertyType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
            <xs:element name="syspropertyset" type="syspropertysetType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="permissions" type="permissionsType"/>
            <xs:element name="jvmarg" type="jvmargType"/>
            <xs:element name="arg" type="argType"/>
            <xs:element name="assertions" type="assertionsType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="jvmargs" type="xs:string"/>
        <xs:attribute name="args" type="xs:string"/>
        <xs:attribute name="fork">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="jar" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="jvm" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="jvmversion" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="javacType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="src" type="srcType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="sourcepath" type="sourcepathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="compilerarg" type="compilerargType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspathref" type="xs:IDREF"/>
        <xs:attribute name="compiler" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="debuglevel" type="xs:string"/>
        <xs:attribute name="memoryinitialsize" type="xs:string"/>
        <xs:attribute name="deprecation">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeantruntime">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="sourcepathref" type="xs:IDREF"/>
        <xs:attribute name="depend">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="includejavaruntime">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tempdir" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspath" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="nowarn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="proceed">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="fork">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="memorymaximumsize" type="xs:string"/>
        <xs:attribute name="optimize">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="sourcepath" type="xs:string"/>
        <xs:attribute name="listfiles">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="extdirs" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="javaccType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="debugparser">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="javacchome" type="xs:string"/>
        <xs:attribute name="forcelacheck">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="optimizetokenmanager">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="commontokenaction">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="buildtokenmanager">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="sanitycheck">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="buildparser">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="otherambiguitycheck" type="xs:string"/>
        <xs:attribute name="lookahead" type="xs:string"/>
        <xs:attribute name="debuglookahead">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="choiceambiguitycheck" type="xs:string"/>
        <xs:attribute name="unicodeinput">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="usercharstream">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="debugtokenmanager">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keeplinecolumn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="outputdirectory" type="xs:string"/>
        <xs:attribute name="cachetokens">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="javaunicodeescape">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="static">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="ignorecase">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="usertokenmanager">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errorreporting">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="javadocType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="taglet" type="tagletType"/>
            <xs:element name="doclet" type="docletType"/>
            <xs:element name="package" type="packageType"/>
            <xs:element name="arg" type="argType"/>
            <xs:element name="link" type="linkType"/>
            <xs:element name="doctitle" type="doctitleType"/>
            <xs:element name="bottom" type="bottomType"/>
            <xs:element name="group" type="groupType"/>
            <xs:element name="packageset" type="packagesetType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="sourcepath" type="sourcepathType"/>
            <xs:element name="footer" type="footerType"/>
            <xs:element name="source" type="sourceType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
            <xs:element name="header" type="headerType"/>
            <xs:element name="excludepackage" type="excludepackageType"/>
            <xs:element name="tag" type="tagType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="bottom" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspathref" type="xs:IDREF"/>
        <xs:attribute name="header" type="xs:string"/>
        <xs:attribute name="link" type="xs:string"/>
        <xs:attribute name="noindex">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="access">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="protected"/>
                    <xs:enumeration value="public"/>
                    <xs:enumeration value="package"/>
                    <xs:enumeration value="private"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="doclet" type="xs:string"/>
        <xs:attribute name="noqualifier" type="xs:string"/>
        <xs:attribute name="public">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="author">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="footer" type="xs:string"/>
        <xs:attribute name="docletpath" type="xs:string"/>
        <xs:attribute name="package">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="useexternalfile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="sourcepathref" type="xs:IDREF"/>
        <xs:attribute name="protected">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="breakiterator">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="nonavbar">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="group" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="linkoffline" type="xs:string"/>
        <xs:attribute name="additionalparam" type="xs:string"/>
        <xs:attribute name="linksource">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="locale" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspath" type="xs:string"/>
        <xs:attribute name="private">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="charset" type="xs:string"/>
        <xs:attribute name="nodeprecatedlist">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="stylesheetfile" type="xs:string"/>
        <xs:attribute name="docencoding" type="xs:string"/>
        <xs:attribute name="excludepackagenames" type="xs:string"/>
        <xs:attribute name="docletpathref" type="xs:IDREF"/>
        <xs:attribute name="packagenames" type="xs:string"/>
        <xs:attribute name="windowtitle" type="xs:string"/>
        <xs:attribute name="notree">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="splitindex">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="packagelist" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="doctitle" type="xs:string"/>
        <xs:attribute name="serialwarn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="old">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="use">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="sourcepath" type="xs:string"/>
        <xs:attribute name="helpfile" type="xs:string"/>
        <xs:attribute name="version">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="sourcefiles" type="xs:string"/>
        <xs:attribute name="extdirs" type="xs:string"/>
        <xs:attribute name="nohelp">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="nodeprecated">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="overview" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="javadoc2Type">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="taglet" type="tagletType"/>
            <xs:element name="doclet" type="docletType"/>
            <xs:element name="package" type="packageType"/>
            <xs:element name="arg" type="argType"/>
            <xs:element name="link" type="linkType"/>
            <xs:element name="doctitle" type="doctitleType"/>
            <xs:element name="bottom" type="bottomType"/>
            <xs:element name="group" type="groupType"/>
            <xs:element name="packageset" type="packagesetType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="sourcepath" type="sourcepathType"/>
            <xs:element name="footer" type="footerType"/>
            <xs:element name="source" type="sourceType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
            <xs:element name="header" type="headerType"/>
            <xs:element name="excludepackage" type="excludepackageType"/>
            <xs:element name="tag" type="tagType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="bottom" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspathref" type="xs:IDREF"/>
        <xs:attribute name="header" type="xs:string"/>
        <xs:attribute name="link" type="xs:string"/>
        <xs:attribute name="noindex">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="access">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="protected"/>
                    <xs:enumeration value="public"/>
                    <xs:enumeration value="package"/>
                    <xs:enumeration value="private"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="doclet" type="xs:string"/>
        <xs:attribute name="noqualifier" type="xs:string"/>
        <xs:attribute name="public">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="author">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="footer" type="xs:string"/>
        <xs:attribute name="docletpath" type="xs:string"/>
        <xs:attribute name="package">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="useexternalfile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="sourcepathref" type="xs:IDREF"/>
        <xs:attribute name="protected">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="breakiterator">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="nonavbar">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="group" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="linkoffline" type="xs:string"/>
        <xs:attribute name="additionalparam" type="xs:string"/>
        <xs:attribute name="linksource">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="locale" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspath" type="xs:string"/>
        <xs:attribute name="private">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="charset" type="xs:string"/>
        <xs:attribute name="nodeprecatedlist">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="stylesheetfile" type="xs:string"/>
        <xs:attribute name="docencoding" type="xs:string"/>
        <xs:attribute name="excludepackagenames" type="xs:string"/>
        <xs:attribute name="docletpathref" type="xs:IDREF"/>
        <xs:attribute name="packagenames" type="xs:string"/>
        <xs:attribute name="windowtitle" type="xs:string"/>
        <xs:attribute name="notree">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="splitindex">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="packagelist" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="doctitle" type="xs:string"/>
        <xs:attribute name="serialwarn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="old">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="use">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="sourcepath" type="xs:string"/>
        <xs:attribute name="helpfile" type="xs:string"/>
        <xs:attribute name="version">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="sourcefiles" type="xs:string"/>
        <xs:attribute name="extdirs" type="xs:string"/>
        <xs:attribute name="nohelp">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="nodeprecated">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="overview" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="javahType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="class" type="classType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="stubs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="force">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="old">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputfile" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="bootclasspath" type="xs:string"/>
        <xs:attribute name="bootclasspathref" type="xs:IDREF"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jjdocType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="outputfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="javacchome" type="xs:string"/>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="text">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="onetable">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="jjtreeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="nodedefaultvoid">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="buildnodefiles">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputdirectory" type="xs:string"/>
        <xs:attribute name="outputfile" type="xs:string"/>
        <xs:attribute name="static">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="javacchome" type="xs:string"/>
        <xs:attribute name="nodeprefix" type="xs:string"/>
        <xs:attribute name="nodefactory">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="multi">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="visitor">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="nodeusesparser">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="visitorexception" type="xs:string"/>
        <xs:attribute name="nodescopehook">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="nodepackage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jlinkType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="mergefiles" type="mergefilesType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="addfiles" type="addfilesType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="outfile" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="addfiles" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="mergefiles" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jonasType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="jonasroot" type="xs:string"/>
        <xs:attribute name="keepgeneric">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="additionalargs" type="xs:string"/>
        <xs:attribute name="javac" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="orb" type="xs:string"/>
        <xs:attribute name="jarsuffix" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="genericjarsuffix" type="xs:string"/>
        <xs:attribute name="nogenic">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="rmicopts" type="xs:string"/>
        <xs:attribute name="javacopts" type="xs:string"/>
        <xs:attribute name="novalidation">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keepgenerated">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="nocompil">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="secpropag">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="jpcoverageType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="arg" type="argType"/>
            <xs:element name="socket" type="socketType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="jvmarg" type="jvmargType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="triggers" type="triggersType"/>
            <xs:element name="filters" type="filtersType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="applet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="recordfromstart">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="coverage"/>
                    <xs:enumeration value="none"/>
                    <xs:enumeration value="all"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="vm">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="java2"/>
                    <xs:enumeration value="jdk118"/>
                    <xs:enumeration value="jdk117"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="workingdir" type="xs:string"/>
        <xs:attribute name="inputfile" type="xs:string"/>
        <xs:attribute name="snapshotdir" type="xs:string"/>
        <xs:attribute name="seedname" type="xs:string"/>
        <xs:attribute name="javaexe" type="xs:string"/>
        <xs:attribute name="home" type="xs:string"/>
        <xs:attribute name="exitprompt" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="warnlevel" type="xs:string"/>
        <xs:attribute name="finalsnapshot" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="tracknatives">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="jpcovmergeType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="home" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jpcovreportType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="coveragepath" type="coveragepathType"/>
            <xs:element name="sourcepath" type="sourcepathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="snapshot" type="xs:string"/>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="filters" type="xs:string"/>
        <xs:attribute name="percent" type="xs:string"/>
        <xs:attribute name="home" type="xs:string"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="executive"/>
                    <xs:enumeration value="summary"/>
                    <xs:enumeration value="detailed"/>
                    <xs:enumeration value="verydetailed"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="format">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="html"/>
                    <xs:enumeration value="text"/>
                    <xs:enumeration value="xml"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includesource">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jsharpcType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="resource" type="resourceType"/>
            <xs:element name="define" type="defineType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="src" type="srcType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="references" type="xs:string"/>
        <xs:attribute name="useresponsefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="mainclass" type="xs:string"/>
        <xs:attribute name="extraoptions" type="xs:string"/>
        <xs:attribute name="additionalmodules" type="xs:string"/>
        <xs:attribute name="win32icon" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="utf8output">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includedefaultreferences">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="optimize">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="targettype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="exe"/>
                    <xs:enumeration value="library"/>
                    <xs:enumeration value="module"/>
                    <xs:enumeration value="winexe"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="win32res" type="xs:string"/>
        <xs:attribute name="baseaddress" type="xs:string"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="securescoping">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="purejava">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="warnlevel" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="referencefiles" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jspcType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="compilerclasspath" type="compilerclasspathType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="webapp" type="webappType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="mapped">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="ieplugin" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="package" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="compilerclasspath" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="uribase" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose" type="xs:string"/>
        <xs:attribute name="compiler" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="webxml" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="uriroot" type="xs:string"/>
        <xs:attribute name="webinc" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="junitType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="formatter" type="formatterType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="batchtest" type="batchtestType"/>
            <xs:element name="sysproperty" type="syspropertyType"/>
        </xs:choice>
        <xs:attribute name="fork" type="xs:string"/>
        <xs:attribute name="printsummary" type="xs:string"/>
        <xs:attribute name="haltonfailure" type="xs:string"/>
        <xs:attribute name="showoutput" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="junitreportType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="report" type="reportType"/>
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="tofile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cobertura-instrumentType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="ignore" type="ignoreType"/>
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="datafile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cobertura-reportType">
        <xs:choice minOccurs="0" maxOccurs="unbounded"/>
        <xs:attribute name="format" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="datafile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="formatterType">
        <xs:attribute name="type" type="xs:string"/>
        <xs:attribute name="usefile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="batchtestType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="formatter" type="formatterType"/>
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="fork" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ignoreType">
        <xs:attribute name="regex" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="jvmargType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="line" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="libType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="libfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="urlbase" type="xs:string"/>
        <xs:attribute name="includeimpl">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeurl">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="linecontainsType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="contains" type="linecontains_containsType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="linecontains_containsType">
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="linecontainsregexpType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="regexp" type="regexpType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="linetokenizerType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="includedelims">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="linkType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="href" type="xs:string"/>
        <xs:attribute name="offline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="packagelistloc" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="loadfileType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterchain" type="filterchainType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="srcFile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="loadresourceType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="propertyresource" type="propertyresourceType"/>
            <xs:element name="filterchain" type="filterchainType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="quiet" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="loadpropertiesType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterchain" type="filterchainType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="srcFile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="locationType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macrodefType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="sequential" type="sequentialType"/>
            <xs:element name="element" type="elementType"/>
            <xs:element name="attribute" type="attributeType"/>
            <xs:element name="text" type="textType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="uri" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mailType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="bcc" type="bccType"/>
            <xs:element name="message" type="messageType"/>
            <xs:element name="replyto" type="replytoType"/>
            <xs:element name="cc" type="ccType"/>
            <xs:element name="to" type="toType"/>
            <xs:element name="from" type="fromType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cclist" type="xs:string"/>
        <xs:attribute name="messagefile" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="encoding">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="auto"/>
                    <xs:enumeration value="mime"/>
                    <xs:enumeration value="uu"/>
                    <xs:enumeration value="plain"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="charset" type="xs:string"/>
        <xs:attribute name="files" type="xs:string"/>
        <xs:attribute name="subject" type="xs:string"/>
        <xs:attribute name="message" type="xs:string"/>
        <xs:attribute name="ssl">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tolist" type="xs:string"/>
        <xs:attribute name="mailport" type="xs:string"/>
        <xs:attribute name="messagemimetype" type="xs:string"/>
        <xs:attribute name="bcclist" type="xs:string"/>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="replyto" type="xs:string"/>
        <xs:attribute name="mailhost" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="includefilenames">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="majorityType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="allowtie">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="manifestType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="attribute" type="attributeType"/>
            <xs:element name="section" type="sectionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="mapType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="to" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mapperType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="chainedmapper" type="chainedmapperType"/>
            <xs:element name="filtermapper" type="filtermapperType"/>
            <xs:element name="scriptmapper" type="scriptmapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="identity"/>
                    <xs:enumeration value="flatten"/>
                    <xs:enumeration value="glob"/>
                    <xs:enumeration value="merge"/>
                    <xs:enumeration value="regexp"/>
                    <xs:enumeration value="package"/>
                    <xs:enumeration value="unpackage"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="to" type="xs:string"/>
        <!-- TODO: define separate globmapper type because it has extra attributes -->
        <!--<xs:attribute name="casesensitive" type="xs:string"/>-->
    </xs:complexType>
    <xs:complexType name="globmapperType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="to" type="xs:string"/>
        <xs:attribute name="casesensitive" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="markerType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="mauditType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="jvmarg" type="jvmargType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="rulespath" type="rulespathType"/>
            <xs:element name="searchpath" type="searchpathType"/>
            <xs:element name="sourcepath" type="sourcepathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="exit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="offsets">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="unused">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="fix">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="metamatahome" type="xs:string"/>
        <xs:attribute name="list">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="home" type="xs:string"/>
        <xs:attribute name="fullsemanticize">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mergefilesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="messageType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="mimetype" type="xs:string"/>
                <xs:attribute name="src" type="xs:string"/>
                <xs:attribute name="charset" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="metainfType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="methodType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="event" type="xs:string"/>
        <xs:attribute name="action" type="xs:string"/>
        <xs:attribute name="param" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mimemailType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="bcc" type="bccType"/>
            <xs:element name="message" type="messageType"/>
            <xs:element name="replyto" type="replytoType"/>
            <xs:element name="cc" type="ccType"/>
            <xs:element name="to" type="toType"/>
            <xs:element name="from" type="fromType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="cclist" type="xs:string"/>
        <xs:attribute name="messagefile" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="encoding">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="auto"/>
                    <xs:enumeration value="mime"/>
                    <xs:enumeration value="uu"/>
                    <xs:enumeration value="plain"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="charset" type="xs:string"/>
        <xs:attribute name="files" type="xs:string"/>
        <xs:attribute name="subject" type="xs:string"/>
        <xs:attribute name="message" type="xs:string"/>
        <xs:attribute name="ssl">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tolist" type="xs:string"/>
        <xs:attribute name="mailport" type="xs:string"/>
        <xs:attribute name="messagemimetype" type="xs:string"/>
        <xs:attribute name="bcclist" type="xs:string"/>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="replyto" type="xs:string"/>
        <xs:attribute name="mailhost" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="includefilenames">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mkdirType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="modifiedType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="param" type="paramType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="comparator">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="equal"/>
                    <xs:enumeration value="rule"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="seldirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="cache">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="propertyfile"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="algorithm">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="hashvalue"/>
                    <xs:enumeration value="digest"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="update">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="moveType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="filterchain" type="filterchainType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="filterset" type="filtersetType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flatten">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeemptydirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="enablemultiplemappings">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="outputencoding" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="preservelastmodified">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filtering">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="native2asciiType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="mapper" type="mapperType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="ext" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="reverse">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="noneType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="notType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="filesmatch" type="filesmatchType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="isset" type="issetType"/>
            <xs:element name="available" type="availableType"/>
            <xs:element name="uptodate" type="uptodateType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="optionsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="libfileset" type="libfilesetType"/>
            <xs:element name="extension" type="extensionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="orType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="isset" type="issetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="osType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="version" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="family" type="xs:string"/>
        <xs:attribute name="arch" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="outputpropertyType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4addType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="changelist" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="commandlength" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4changeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4counterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4deleteType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="change" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4editType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="change" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4fstatType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="changelist" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="showfilter" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4haveType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4integrateType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="branch" type="xs:string"/>
        <xs:attribute name="leavetargetrevision">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="forceintegrate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="enablebaselessmerges">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="fromfile" type="xs:string"/>
        <xs:attribute name="reversebranchmappings">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="change" type="xs:string"/>
        <xs:attribute name="simulationmode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="propagatesourcefiletype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="nocopynewtargetfiles">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="tofile" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="restoredeletedrevisions">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4labelType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="desc" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="lock" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4labelsyncType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="simulationmode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="delete">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="add">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="p4reopenType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="tochange" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4resolveType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="forcetextmode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="markersforall">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="simulationmode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="errormessage" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="resolvemode" type="xs:string"/>
        <xs:attribute name="redoall">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="p4revertType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="revertonlyunchanged">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="change" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4submitType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="needsresolveproperty" type="xs:string"/>
        <xs:attribute name="changeproperty" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="change" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="p4syncType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="force" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="client" type="xs:string"/>
        <xs:attribute name="inerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="cmdopts" type="xs:string"/>
        <xs:attribute name="globalopts" type="xs:string"/>
        <xs:attribute name="view" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="label" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="errormessage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="packageType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="packagesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="parallelType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="pollinterval" type="xs:string"/>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
                <xs:attribute name="threadsperprocessor" type="xs:string"/>
                <xs:attribute name="timeout" type="xs:string"/>
                <xs:attribute name="threadcount" type="xs:string"/>
                <xs:attribute name="failonany">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="paramType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="type" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="expression" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="patchType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="strip" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="quiet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="originalfile" type="xs:string"/>
        <xs:attribute name="patchfile" type="xs:string"/>
        <xs:attribute name="reverse">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="backups">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="ignorewhitespace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="pathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="pathconvertType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="path" type="pathType"/>
            <xs:element name="map" type="mapType"/>
            <xs:element name="mapper" type="mapperType"/>
            <xs:element name="resources" type="resourcesType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="first" type="firstType"/>
            <xs:element name="globmapper" type="globmapperType"/>
            <xs:element name="chainedmapper" type="chainedmapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="pathsep" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="dirsep" type="xs:string"/>
        <xs:attribute name="setonempty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="targetos" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="pathelementType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="patternsetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="include" type="includeType"/>
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="includesfile" type="includesfileType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="permissionsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="grant" type="grantType"/>
            <xs:element name="revoke" type="revokeType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="prefixlinesType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="prefix" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="presentType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="mapper" type="mapperType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="targetdir" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="present">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="srconly"/>
                    <xs:enumeration value="both"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="presetdefType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="name" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
                <xs:attribute name="uri" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:element name="project">
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="target" type="targetType"/>
                <xs:element name="propertyfile" type="propertyfileType"/>
                <xs:element name="importtypelib" type="importtypelibType"/>
                <xs:element name="sql" type="sqlType"/>
                <xs:element name="cvspass" type="cvspassType"/>
                <xs:element name="p4reopen" type="p4reopenType"/>
                <xs:element name="csc" type="cscType"/>
                <xs:element name="dirname" type="dirnameType"/>
                <xs:element name="p4label" type="p4labelType"/>
                <xs:element name="p4revert" type="p4revertType"/>
                <xs:element name="replaceregexp" type="replaceregexpType"/>
                <xs:element name="get" type="getType"/>
                <xs:element name="jjtree" type="jjtreeType"/>
                <xs:element name="sleep" type="sleepType"/>
                <xs:element name="jarlib-display" type="jarlib-displayType"/>
                <xs:element name="dependset" type="dependsetType"/>
                <xs:element name="zip" type="zipType"/>
                <xs:element name="patch" type="patchType"/>
                <xs:element name="jspc" type="jspcType"/>
                <xs:element name="style" type="styleType"/>
                <xs:element name="test" type="testType"/>
                <xs:element name="tstamp" type="tstampType"/>
                <xs:element name="unwar" type="unwarType"/>
                <xs:element name="icontract" type="icontractType"/>
                <xs:element name="cvschangelog" type="cvschangelogType"/>
                <xs:element name="p4submit" type="p4submitType"/>
                <xs:element name="p4change" type="p4changeType"/>
                <xs:element name="bzip2" type="bzip2Type"/>
                <xs:element name="sync" type="syncType"/>
                <xs:element name="p4delete" type="p4deleteType"/>
                <xs:element name="javadoc" type="javadocType"/>
                <xs:element name="p4integrate" type="p4integrateType"/>
                <xs:element name="translate" type="translateType"/>
                <xs:element name="signjar" type="signjarType"/>
                <xs:element name="chown" type="chownType"/>
                <xs:element name="vajload" type="vajloadType"/>
                <xs:element name="jarlib-available" type="jarlib-availableType"/>
                <xs:element name="buildnumber" type="buildnumberType"/>
                <xs:element name="jpcovmerge" type="jpcovmergeType"/>
                <xs:element name="war" type="warType"/>
                <xs:element name="rename" type="renameType"/>
                <xs:element name="sequential" type="sequentialType"/>
                <xs:element name="serverdeploy" type="serverdeployType"/>
                <xs:element name="property" type="propertyType"/>
                <xs:element name="subant" type="subantType"/>
                <xs:element name="move" type="moveType"/>
                <xs:element name="ildasm" type="ildasmType"/>
                <xs:element name="copydir" type="copydirType"/>
                <xs:element name="fixcrlf" type="fixcrlfType"/>
                <xs:element name="pathconvert" type="pathconvertType"/>
                <xs:element name="record" type="recordType"/>
                <xs:element name="p4sync" type="p4syncType"/>
                <xs:element name="exec" type="execType"/>
                <xs:element name="ccmklabel" type="ccmklabelType"/>
                <xs:element name="p4edit" type="p4editType"/>
                <xs:element name="manifest" type="manifestType"/>
                <xs:element name="maudit" type="mauditType"/>
                <xs:element name="antlr" type="antlrType"/>
                <xs:element name="jpcovreport" type="jpcovreportType"/>
                <xs:element name="execon" type="execonType"/>
                <xs:element name="ant" type="antType"/>
                <xs:element name="xmlvalidate" type="xmlvalidateType"/>
                <xs:element name="xslt" type="xsltType"/>
                <xs:element name="p4resolve" type="p4resolveType"/>
                <xs:element name="gzip" type="gzipType"/>
                <xs:element name="native2ascii" type="native2asciiType"/>
                <xs:element name="ccrmtype" type="ccrmtypeType"/>
                <xs:element name="ear" type="earType"/>
                <xs:element name="input" type="inputType"/>
                <xs:element name="presetdef" type="presetdefType"/>
                <xs:element name="rmic" type="rmicType"/>
                <xs:element name="checksum" type="checksumType"/>
                <xs:element name="mail" type="mailType"/>
                <xs:element name="loadfile" type="loadfileType"/>
                <xs:element name="mimemail" type="mimemailType"/>
                <xs:element name="gunzip" type="gunzipType"/>
                <xs:element name="concat" type="concatType"/>
                <xs:element name="cab" type="cabType"/>
                <xs:element name="touch" type="touchType"/>
                <xs:element name="parallel" type="parallelType"/>
                <xs:element name="splash" type="splashType"/>
                <xs:element name="antcall" type="antcallType"/>
                <xs:element name="typedef" type="typedefType"/>
                <xs:element name="p4have" type="p4haveType"/>
                <xs:element name="filter" type="filterType"/>
                <xs:element name="xmlproperty" type="xmlpropertyType"/>
                <xs:element name="import" type="importType"/>
                <xs:element name="copy" type="copyType"/>
                <xs:element name="jsharpc" type="jsharpcType"/>
                <xs:element name="symlink" type="symlinkType"/>
                <xs:element name="antstructure" type="antstructureType"/>
                <xs:element name="script" type="scriptType"/>
                <xs:element name="rpm" type="rpmType"/>
                <xs:element name="delete" type="deleteType"/>
                <xs:element name="replace" type="replaceType"/>
                <xs:element name="attrib" type="attribType"/>
                <xs:element name="waitfor" type="waitforType"/>
                <xs:element name="untar" type="untarType"/>
                <xs:element name="loadproperties" type="loadpropertiesType"/>
                <xs:element name="available" type="availableType"/>
                <xs:element name="echoproperties" type="echopropertiesType"/>
                <xs:element name="chgrp" type="chgrpType"/>
                <xs:element name="vajexport" type="vajexportType"/>
                <xs:element name="bunzip2" type="bunzip2Type"/>
                <xs:element name="whichresource" type="whichresourceType"/>
                <xs:element name="copyfile" type="copyfileType"/>
                <xs:element name="p4labelsync" type="p4labelsyncType"/>
                <xs:element name="macrodef" type="macrodefType"/>
                <xs:element name="unjar" type="unjarType"/>
                <xs:element name="vbc" type="vbcType"/>
                <xs:element name="mkdir" type="mkdirType"/>
                <xs:element name="condition" type="conditionType"/>
                <xs:element name="cvs" type="cvsType"/>
                <xs:element name="tempfile" type="tempfileType"/>
                <xs:element name="junit" type="junitType"/>
                <xs:element name="junitreport" type="junitreportType"/>
                <xs:element name="cobertura-instrument" type="cobertura-instrumentType"/>
                <xs:element name="taskdef" type="taskdefType"/>
                <xs:element name="echo" type="echoType"/>
                <xs:element name="java" type="javaType"/>
                <xs:element name="renameext" type="renameextType"/>
                <xs:element name="basename" type="basenameType"/>
                <xs:element name="javadoc2" type="javadoc2Type"/>
                <xs:element name="tar" type="tarType"/>
                <xs:element name="vajimport" type="vajimportType"/>
                <xs:element name="p4fstat" type="p4fstatType"/>
                <xs:element name="setproxy" type="setproxyType"/>
                <xs:element name="p4counter" type="p4counterType"/>
                <xs:element name="ilasm" type="ilasmType"/>
                <xs:element name="apply" type="applyType"/>
                <xs:element name="jarlib-resolve" type="jarlib-resolveType"/>
                <xs:element name="jlink" type="jlinkType"/>
                <xs:element name="cvstagdiff" type="cvstagdiffType"/>
                <xs:element name="javacc" type="javaccType"/>
                <xs:element name="chmod" type="chmodType"/>
                <xs:element name="pvcs" type="pvcsType"/>
                <xs:element name="jarlib-manifest" type="jarlib-manifestType"/>
                <xs:element name="jar" type="jarType"/>
                <xs:element name="ccmklbtype" type="ccmklbtypeType"/>
                <xs:element name="sound" type="soundType"/>
                <xs:element name="scriptdef" type="scriptdefType"/>
                <xs:element name="defaultexcludes" type="defaultexcludesType"/>
                <xs:element name="blgenclient" type="blgenclientType"/>
                <xs:element name="uptodate" type="uptodateType"/>
                <xs:element name="jjdoc" type="jjdocType"/>
                <xs:element name="genkey" type="genkeyType"/>
                <xs:element name="javah" type="javahType"/>
                <xs:element name="ccmreconfigure" type="ccmreconfigureType"/>
                <xs:element name="fail" type="failType"/>
                <xs:element name="unzip" type="unzipType"/>
                <xs:element name="javac" type="javacType"/>
                <xs:element name="p4add" type="p4addType"/>
                <xs:element name="jpcoverage" type="jpcoverageType"/>
                <xs:element name="depend" type="dependType"/>
                <xs:element name="deltree" type="deltreeType"/>
                <xs:element name="ddcreator" type="ddcreatorType"/>
                <xs:element name="patternset" type="patternsetType"/>
                <xs:element name="assertions" type="assertionsType"/>
                <xs:element name="propertyset" type="propertysetType"/>
                <xs:element name="filterset" type="filtersetType"/>
                <xs:element name="libfileset" type="libfilesetType"/>
                <xs:element name="filterreader" type="filterreaderType"/>
                <xs:element name="scriptfilter" type="scriptfilterType"/>
                <xs:element name="concatfilter" type="concatfilterType"/>
                <xs:element name="extension" type="extensionType"/>
                <xs:element name="fileset" type="filesetType"/>
                <xs:element name="dirset" type="dirsetType"/>
                <xs:element name="filelist" type="filelistType"/>
                <xs:element name="filterchain" type="filterchainType"/>
                <xs:element name="path" type="pathType"/>
                <xs:element name="classfileset" type="classfilesetType"/>
                <xs:element name="selector" type="selectorType"/>
                <xs:element name="xmlcatalog" type="xmlcatalogType"/>
                <xs:element name="description" type="descriptionType"/>
                <xs:element name="mapper" type="mapperType"/>
                <xs:element name="zipfileset" type="zipfilesetType"/>
                <xs:element name="substitution" type="substitutionType"/>
                <xs:element name="extensionSet" type="extensionSetType"/>
                <xs:element name="regexp" type="regexpType"/>
                <xs:element name="var" type="varType"/>
                <xs:element name="if" type="ifType"/>
                <xs:element name="retry" type="retryType"/>
            </xs:choice>
            <xs:attribute name="name" type="xs:string"/>
            <xs:attribute name="default" type="xs:string"/>
            <xs:attribute name="basedir" type="xs:string"/>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="propertyType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="url" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="userproperty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="environment" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="propertyfileType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="entry" type="entryType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="comment" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="propertycopyType">
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="from" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="propertyrefType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="builtin">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="all"/>
                    <xs:enumeration value="system"/>
                    <xs:enumeration value="commandline"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="regex" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="propertysetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="propertyref" type="propertyrefType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="negate" type="xs:boolean"/>
        <xs:attribute name="dynamic">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="pvcsType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="pvcsproject" type="pvcsprojectType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="updateonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="force" type="xs:string"/>
        <xs:attribute name="config" type="xs:string"/>
        <xs:attribute name="workspace" type="xs:string"/>
        <xs:attribute name="pvcsbin" type="xs:string"/>
        <xs:attribute name="pvcsproject" type="xs:string"/>
        <xs:attribute name="filenameformat" type="xs:string"/>
        <xs:attribute name="userid" type="xs:string"/>
        <xs:attribute name="repository" type="xs:string"/>
        <xs:attribute name="ignorereturncode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="revision" type="xs:string"/>
        <xs:attribute name="linestart" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="promotiongroup" type="xs:string"/>
        <xs:attribute name="label" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="pvcsprojectType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="recordType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="loglevel">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="error"/>
                    <xs:enumeration value="warn"/>
                    <xs:enumeration value="info"/>
                    <xs:enumeration value="verbose"/>
                    <xs:enumeration value="debug"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="emacsmode">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="action">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="start"/>
                    <xs:enumeration value="stop"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="referenceType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="torefid" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="regexpType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="pattern" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="renameType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="replace" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="renameextType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="replace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="toextension" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="fromextension" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replaceType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="replacefilter" type="replacefilterType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="replacetoken" type="replacetokenType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="replacevalue" type="replacevalueType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="token" type="xs:string"/>
        <xs:attribute name="propertyfile" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="summary">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="replacefilterfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replacefilterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="token" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replaceregexType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flags" type="xs:string"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="replace" type="xs:string"/>
        <xs:attribute name="pattern" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replaceregexpType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="substitution" type="substitutionType"/>
            <xs:element name="regexp" type="regexpType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="flags" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="match" type="xs:string"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="replace" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replacestringType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="from" type="xs:string"/>
        <xs:attribute name="to" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replacetokenType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="replacetokensType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="token" type="tokenType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="begintoken" type="xs:string"/>
        <xs:attribute name="endtoken" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="replacevalueType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="replytoType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="address" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="reportType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="styledir" type="xs:string"/>
        <xs:attribute name="format">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="frames"/>
                    <xs:enumeration value="noframes"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="extension" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="resourceType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="public">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="embed">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="revokeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
        <xs:attribute name="actions" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="rmicType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="compilerarg" type="compilerargType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="verify">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="iiop">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="idlopts" type="xs:string"/>
        <xs:attribute name="extdirs" type="xs:string"/>
        <xs:attribute name="sourcebase" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="base" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeantruntime">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includejavaruntime">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="compiler" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="idl">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="iiopopts" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="filtering">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="stubversion" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="rootType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="rootfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="rpmType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="removesource">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="cleanbuilddir">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="removespec">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="specfile" type="xs:string"/>
        <xs:attribute name="topdir" type="xs:string"/>
        <xs:attribute name="rpmbuildcommand" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="rulespathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="scriptType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
                <xs:attribute name="src" type="xs:string"/>
                <xs:attribute name="language" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="scriptdefType" mixed="true">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="element" type="elementType"/>
            <xs:element name="attribute" type="attributeType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="uri" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="language" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="loaderref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="reverseloader">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="scriptfilterType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="byline">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <xs:attribute name="token" type="xs:string"/>
                <xs:attribute name="src" type="xs:string"/>
                <xs:attribute name="language" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="searchpathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="sectionType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="attribute" type="attributeType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="selectorType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="custom" type="customType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="depth" type="depthType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="unless" type="xs:string"/>
        <xs:attribute name="if" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="timestampselectorType">
        <xs:complexContent>
            <xs:extension base="resourceCollectionContainerType">
                <xs:attribute name="property" type="xs:string"/>
                <xs:attribute name="outputsetid" type="xs:string"/>
                <xs:attribute name="count" type="xs:string"/>
                <xs:attribute name="age" type="xs:string"/>
                <xs:attribute name="pathSep" type="xs:string"/>
                <xs:attribute name="pathref" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="sequentialType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="taskname" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="serverdeployType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="generic" type="genericType"/>
            <xs:element name="jonas" type="jonasType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="action" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="setproxyType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="nonproxyhosts" type="xs:string"/>
        <xs:attribute name="proxyhost" type="xs:string"/>
        <xs:attribute name="socksproxyhost" type="xs:string"/>
        <xs:attribute name="proxyport" type="xs:string"/>
        <xs:attribute name="socksproxyport" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="proxyuser" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="proxypassword" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="signjarType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="storepass" type="xs:string"/>
        <xs:attribute name="lazy">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="jar" type="xs:string"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keypass" type="xs:string"/>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="alias" type="xs:string"/>
        <xs:attribute name="sectionsonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keystore" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="sigfile" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="internalsf">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="storetype" type="xs:string"/>
        <xs:attribute name="signedjar" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="sizeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="when">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="less"/>
                    <xs:enumeration value="more"/>
                    <xs:enumeration value="equal"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="units">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="K"/>
                    <xs:enumeration value="k"/>
                    <xs:enumeration value="kilo"/>
                    <xs:enumeration value="KILO"/>
                    <xs:enumeration value="Ki"/>
                    <xs:enumeration value="KI"/>
                    <xs:enumeration value="ki"/>
                    <xs:enumeration value="kibi"/>
                    <xs:enumeration value="KIBI"/>
                    <xs:enumeration value="M"/>
                    <xs:enumeration value="m"/>
                    <xs:enumeration value="mega"/>
                    <xs:enumeration value="MEGA"/>
                    <xs:enumeration value="Mi"/>
                    <xs:enumeration value="MI"/>
                    <xs:enumeration value="mi"/>
                    <xs:enumeration value="mebi"/>
                    <xs:enumeration value="MEBI"/>
                    <xs:enumeration value="G"/>
                    <xs:enumeration value="g"/>
                    <xs:enumeration value="giga"/>
                    <xs:enumeration value="GIGA"/>
                    <xs:enumeration value="Gi"/>
                    <xs:enumeration value="GI"/>
                    <xs:enumeration value="gi"/>
                    <xs:enumeration value="gibi"/>
                    <xs:enumeration value="GIBI"/>
                    <xs:enumeration value="T"/>
                    <xs:enumeration value="t"/>
                    <xs:enumeration value="tera"/>
                    <xs:enumeration value="TERA"/>
                    <xs:enumeration value="Ti"/>
                    <xs:enumeration value="TI"/>
                    <xs:enumeration value="ti"/>
                    <xs:enumeration value="tebi"/>
                    <xs:enumeration value="TEBI"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="sleepType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="hours" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="milliseconds" type="xs:string"/>
        <xs:attribute name="minutes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="seconds" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="socketType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="server" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="soundType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fail" type="failsoundType"/>
            <xs:element name="success" type="successType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="sourceType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="file" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="sourcepathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="splashType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="user" type="xs:string"/>
        <xs:attribute name="proxy" type="xs:string"/>
        <xs:attribute name="imageurl" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="showduration" type="xs:string"/>
        <xs:attribute name="useproxy">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="sqlType" mixed="true">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="transaction" type="transactionType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="onerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="continue"/>
                    <xs:enumeration value="stop"/>
                    <xs:enumeration value="abort"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="userid" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="autocommit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="rdbms" type="xs:string"/>
        <xs:attribute name="print">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="version" type="xs:string"/>
        <xs:attribute name="url" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="driver" type="xs:string"/>
        <xs:attribute name="showheaders">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="delimitertype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="normal"/>
                    <xs:enumeration value="row"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="escapeprocessing">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="caching">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keepformat">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="delimiter" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="srcType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="srcfileType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="srcfilelistType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="files" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="srcfilesType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="srcfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="stringtokenizerType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="suppressdelims">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includedelims">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="delimsaretokens">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="delims" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="stripjavacommentsType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="striplinebreaksType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="linebreaks" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="striplinecommentsType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="comment" type="commentType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="styleType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="factory" type="factoryType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="param" type="paramType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="outputproperty" type="outputpropertyType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="force">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="processor" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="scanincludeddirectories">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="extension" type="xs:string"/>
        <xs:attribute name="in" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="reloadstylesheet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="out" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="style" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="subantType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="buildpathelement" type="buildpathelementType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="buildpath" type="buildpathType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="property" type="propertyType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="genericantfile" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="inheritall" type="xs:boolean"/>
        <xs:attribute name="inheritrefs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="antfile" type="xs:string"/>
        <xs:attribute name="buildpathref" type="xs:IDREF"/>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="buildpath" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="substitutionType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="expression" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="successType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="loops" type="xs:string"/>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="duration" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="supportType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="symlinkType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="linkfilename" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="link" type="xs:string"/>
        <xs:attribute name="action" type="xs:string"/>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="syncType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="verbose">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includeemptydirs">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="syspropertyType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="key" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="syspropertysetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="propertyref" type="propertyrefType"/>
            <xs:element name="propertyset" type="propertysetType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="dynamic">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="tabstospacesType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="tablength" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tagType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="enabled">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="scope" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tagletType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="path" type="pathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="pathref" type="xs:IDREF"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tailfilterType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="lines" type="xs:string"/>
        <xs:attribute name="skip" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tarType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="tarfileset" type="tarfilesetType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="tarfile" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="compression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="none"/>
                    <xs:enumeration value="gzip"/>
                    <xs:enumeration value="bzip2"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="longfile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="warn"/>
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="truncate"/>
                    <xs:enumeration value="gnu"/>
                    <xs:enumeration value="omit"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tarfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="preserveleadingslashes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="username" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="group" type="xs:string"/>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="mode" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="targetType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="name" type="xs:string" use="required"/>
                <xs:attribute name="if" type="xs:string"/>
                <xs:attribute name="unless" type="xs:string"/>
                <xs:attribute name="depends" type="xs:string"/>
                <xs:attribute name="description" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="targetfileType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="targetfilelistType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="files" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="targetfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="taskdefType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="uri" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="adaptto" type="xs:string"/>
        <xs:attribute name="onerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="report"/>
                    <xs:enumeration value="ignore"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="loaderref" type="xs:IDREF"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="adapter" type="xs:string"/>
        <xs:attribute name="format">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="properties"/>
                    <xs:enumeration value="xml"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="reverseloader">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="tempfileType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="suffix" type="xs:string"/>
        <xs:attribute name="deleteonexit" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="testType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="sysproperty" type="syspropertyType"/>
            <xs:element name="bootclasspath" type="bootclasspathType"/>
            <xs:element name="env" type="envType"/>
            <xs:element name="syspropertyset" type="syspropertysetType"/>
            <xs:element name="permissions" type="permissionsType"/>
            <xs:element name="jvmarg" type="jvmargType"/>
            <xs:element name="arg" type="argType"/>
            <xs:element name="assertions" type="assertionsType"/>
            <xs:element name="testlet" type="testletType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="resultproperty" type="xs:string"/>
        <xs:attribute name="jvmargs" type="xs:string"/>
        <xs:attribute name="args" type="xs:string"/>
        <xs:attribute name="fork">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxmemory" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="jar" type="xs:string"/>
        <xs:attribute name="errorproperty" type="xs:string"/>
        <xs:attribute name="forceshowtrace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="timeout" type="xs:string"/>
        <xs:attribute name="spawn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="jvm" type="xs:string"/>
        <xs:attribute name="inputstring" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="logerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="showsuccess">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="jvmversion" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="append">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="showbanner" type="xs:string"/>
        <xs:attribute name="newenvironment">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="showtrace">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="testletType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="textType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="trim">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="optional">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="titleType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="toType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="address" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tokenType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="key" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="tokenfilterType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="containsstring" type="containsstringType"/>
            <xs:element name="linetokenizer" type="linetokenizerType"/>
            <xs:element name="trim" type="trimType"/>
            <xs:element name="stringtokenizer" type="stringtokenizerType"/>
            <xs:element name="replaceregex" type="replaceregexType"/>
            <xs:element name="replacestring" type="replacestringType"/>
            <xs:element name="ignoreblank" type="ignoreblankType"/>
            <xs:element name="deletecharacters" type="deletecharactersType"/>
            <xs:element name="containsregex" type="containsregexType"/>
            <xs:element name="filetokenizer" type="filetokenizerType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="delimoutput" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="touchType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="millis" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="datetime" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="transactionType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID"/>
                <xs:attribute name="src" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="translateType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="bundlecountry" type="xs:string"/>
        <xs:attribute name="bundlelanguage" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="srcencoding" type="xs:string"/>
        <xs:attribute name="bundle" type="xs:string"/>
        <xs:attribute name="bundleencoding" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destencoding" type="xs:string"/>
        <xs:attribute name="bundlevariant" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="endtoken" type="xs:string"/>
        <xs:attribute name="forceoverwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="starttoken" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="triggersType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="method" type="methodType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="trimType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="byline">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="tstampType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="format" type="formatType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="typeType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="error" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="type">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="file"/>
                    <xs:enumeration value="dir"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="typedefType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="uri" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="adaptto" type="xs:string"/>
        <xs:attribute name="onerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="report"/>
                    <xs:enumeration value="ignore"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="loaderref" type="xs:IDREF"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="adapter" type="xs:string"/>
        <xs:attribute name="format">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="properties"/>
                    <xs:enumeration value="xml"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="reverseloader">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="unjarType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="patternset" type="patternsetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="untarType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="patternset" type="patternsetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="compression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="none"/>
                    <xs:enumeration value="gzip"/>
                    <xs:enumeration value="bzip2"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="unwarType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="patternset" type="patternsetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="unzipType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="patternset" type="patternsetType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="src" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="uptodateType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="srcfiles" type="srcfilesType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="targetfile" type="xs:string"/>
        <xs:attribute name="srcfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="urlType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="url" type="xs:string"/>
        <xs:attribute name="destfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="userType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="userid" type="xs:string"/>
        <xs:attribute name="displayname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="vajexportType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="include" type="includeType"/>
            <xs:element name="exclude" type="excludeType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="exportclasses">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="haltonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="remote" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="exportresources">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="exportsources">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="overwrite">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="exportdebuginfo">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="vajimportType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="haltonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="remote" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="importsources">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="project" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="importresources">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="importclasses">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="vajloadType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="vajproject" type="vajprojectType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="remote" type="xs:string"/>
        <xs:attribute name="haltonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="vajprojectType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="version" type="xs:string"/>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="vbcType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="resource" type="resourceType"/>
            <xs:element name="define" type="defineType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="reference" type="referenceType"/>
            <xs:element name="src" type="srcType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="references" type="xs:string"/>
        <xs:attribute name="useresponsefile">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="removeintchecks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="mainclass" type="xs:string"/>
        <xs:attribute name="extraoptions" type="xs:string"/>
        <xs:attribute name="additionalmodules" type="xs:string"/>
        <xs:attribute name="win32icon" type="xs:string"/>
        <xs:attribute name="optionstrict">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="executable" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="utf8output">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includedefaultreferences">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="optimize">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="targettype">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="exe"/>
                    <xs:enumeration value="library"/>
                    <xs:enumeration value="module"/>
                    <xs:enumeration value="winexe"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="rootnamespace" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="win32res" type="xs:string"/>
        <xs:attribute name="debug">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="optionexplicit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="warnlevel" type="xs:string"/>
        <xs:attribute name="srcdir" type="xs:string"/>
        <xs:attribute name="optioncompare" type="xs:string"/>
        <xs:attribute name="imports" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="referencefiles" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="waitforType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="isfalse" type="isfalseType"/>
            <xs:element name="isreference" type="isreferenceType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="available" type="availableType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="os" type="osType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="filesmatch" type="filesmatchType"/>
            <xs:element name="checksum" type="checksumType"/>
            <xs:element name="istrue" type="istrueType"/>
            <xs:element name="isset" type="issetType"/>
            <xs:element name="socket" type="socketType"/>
            <xs:element name="http" type="httpType"/>
            <xs:element name="uptodate" type="uptodateType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="checkeveryunit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="millisecond"/>
                    <xs:enumeration value="second"/>
                    <xs:enumeration value="minute"/>
                    <xs:enumeration value="hour"/>
                    <xs:enumeration value="day"/>
                    <xs:enumeration value="week"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="checkevery" type="xs:string"/>
        <xs:attribute name="maxwaitunit">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="millisecond"/>
                    <xs:enumeration value="second"/>
                    <xs:enumeration value="minute"/>
                    <xs:enumeration value="hour"/>
                    <xs:enumeration value="day"/>
                    <xs:enumeration value="week"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="maxwait" type="xs:string"/>
        <xs:attribute name="timeoutproperty" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="warType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="manifest" type="manifestType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="metainf" type="metainfType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="lib" type="libType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="zipgroupfileset" type="zipgroupfilesetType"/>
            <xs:element name="zipfileset" type="zipfilesetType"/>
            <xs:element name="classes" type="classesType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="webinf" type="webinfType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="keepcompression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="whenempty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="create"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="duplicate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="preserve"/>
                    <xs:enumeration value="fail"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="manifest" type="xs:string"/>
        <xs:attribute name="jarfile" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="index">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="update">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="webxml" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="manifestencoding" type="xs:string"/>
        <xs:attribute name="filesonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="warfile" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="filesetmanifest">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="merge"/>
                    <xs:enumeration value="mergewithoutmain"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="zipfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="wasclasspathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="webappType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="basedir" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="webinfType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="whichresourceType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="classpath" type="classpathType"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="resource" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="wlclasspathType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="extdirs" type="extdirsType"/>
            <xs:element name="filelist" type="filelistType"/>
            <xs:element name="existing" type="existingType"/>
            <xs:element name="pathelement" type="pathelementType"/>
            <xs:element name="path" type="pathType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="location" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="xmlcatalogType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="entity" type="entityType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="catalogpath" type="catalogpathType"/>
            <xs:element name="dtd" type="dtdType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="catalogpathref" type="xs:IDREF"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="xmlpropertyType">
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="semanticattributes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keeproot">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="collapseattributes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="validate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="rootdirectory" type="xs:string"/>
        <xs:attribute name="includesemanticattribute">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="xmlvalidateType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="attribute" type="attributeType"/>
            <xs:element name="dtd" type="dtdType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="classname" type="xs:string"/>
        <xs:attribute name="lenient">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="warn">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="failonerror">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="xsltType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="factory" type="factoryType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="param" type="paramType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="classpath" type="classpathType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="outputproperty" type="outputpropertyType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="mapper" type="mapperType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="force">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="processor" type="xs:string"/>
        <xs:attribute name="classpathref" type="xs:IDREF"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="destdir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="scanincludeddirectories">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="extension" type="xs:string"/>
        <xs:attribute name="in" type="xs:string"/>
        <xs:attribute name="classpath" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="reloadstylesheet">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="out" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="style" type="xs:string"/>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="zipType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="zipgroupfileset" type="zipgroupfilesetType"/>
            <xs:element name="zipfileset" type="zipfilesetType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="whenempty">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="fail"/>
                    <xs:enumeration value="skip"/>
                    <xs:enumeration value="create"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="keepcompression">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="duplicate">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="add"/>
                    <xs:enumeration value="preserve"/>
                    <xs:enumeration value="fail"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="basedir" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="update">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="destfile" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="compress">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="taskname" type="xs:string"/>
        <xs:attribute name="filesonly">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="zipfile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="zipfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="filemode" type="xs:string"/>
        <xs:attribute name="prefix" type="xs:string"/>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="fullpath" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="dirmode" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="zipgroupfilesetType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="patternset" type="patternsetType"/>
            <xs:element name="exclude" type="excludeType"/>
            <xs:element name="include" type="includeType"/>
            <xs:element name="custom" type="customType"/>
            <xs:element name="present" type="presentType"/>
            <xs:element name="none" type="noneType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="type" type="typeType"/>
            <xs:element name="modified" type="modifiedType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="depend" type="dependType"/>
            <xs:element name="different" type="differentType"/>
            <xs:element name="size" type="sizeType"/>
            <xs:element name="majority" type="majorityType"/>
            <xs:element name="containsregexp" type="containsregexpType"/>
            <xs:element name="filename" type="filenameType"/>
            <xs:element name="selector" type="selectorType"/>
            <xs:element name="includesfile" type="includesfileType"/>
            <xs:element name="date" type="dateType"/>
            <xs:element name="excludesfile" type="excludesfileType"/>
            <xs:element name="depth" type="depthType"/>
            <xs:element name="and" type="andType"/>
        </xs:choice>
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="refid" type="xs:IDREF"/>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="defaultexcludes">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="followsymlinks">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="casesensitive">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="true"/>
                    <xs:enumeration value="false"/>
                    <xs:enumeration value="on"/>
                    <xs:enumeration value="off"/>
                    <xs:enumeration value="yes"/>
                    <xs:enumeration value="no"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="includesfile" type="xs:string"/>
        <xs:attribute name="excludesfile" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="doxygenType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="property">
                <xs:complexType>
                    <xs:choice minOccurs="0" maxOccurs="unbounded">
                        <xs:element name="fileset" type="filesetType"/>
                    </xs:choice>
                    <xs:attribute name="name" type="xs:string" use="required"/>
                    <xs:attribute name="value" type="xs:string" use="optional"/>
                </xs:complexType>
            </xs:element>
        </xs:choice>
        <xs:attribute name="versionCompatible" type="xs:string"/>
        <xs:attribute name="doxygenPath" type="xs:string"/>
        <xs:attribute name="configFilename" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="foreachType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="path" type="pathType"/>
            <xs:element name="param" type="paramType"/>
        </xs:choice>
        <xs:attribute name="list" type="xs:string"/>
        <xs:attribute name="target" type="xs:string" use="required"/>
        <xs:attribute name="param" type="xs:string"/>
        <xs:attribute name="delimiter" type="xs:string"/>
        <xs:attribute name="inheritall" type="xs:string"/>
        <xs:attribute name="inheritrefs" type="xs:string"/>
        <xs:attribute name="parallel" type="xs:string"/>
        <xs:attribute name="maxThreads" type="xs:string"/>
        <xs:attribute name="trim" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="varType">
        <xs:choice minOccurs="0" maxOccurs="unbounded"/>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
        <xs:attribute name="unset" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="ifType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="isfalse" type="isfalseType"/>
            <xs:element name="isreference" type="isreferenceType"/>
            <xs:element name="equals" type="equalsType"/>
            <xs:element name="available" type="availableType"/>
            <xs:element name="not" type="notType"/>
            <xs:element name="contains" type="containsType"/>
            <xs:element name="os" type="osType"/>
            <xs:element name="or" type="orType"/>
            <xs:element name="and" type="andType"/>
            <xs:element name="filesmatch" type="filesmatchType"/>
            <xs:element name="checksum" type="checksumType"/>
            <xs:element name="istrue" type="istrueType"/>
            <xs:element name="isset" type="issetType"/>
            <xs:element name="socket" type="socketType"/>
            <xs:element name="http" type="httpType"/>
            <xs:element name="uptodate" type="uptodateType"/>
            <xs:element name="then" type="thenType"/>
            <xs:element name="elseif" type="elseifType"/>
            <xs:element name="else" type="elseType"/>
            <xs:element name="resourcecount" type="resourcecountType"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="propertyregexType">
        <xs:attribute name="property" type="xs:string" use="required"/>
        <xs:attribute name="override" type="xs:boolean"/>
        <xs:attribute name="input" type="xs:string" use="required"/>
        <xs:attribute name="regexp" type="xs:string"/>
        <xs:attribute name="select" type="xs:string"/>
        <xs:attribute name="replace" type="xs:string"/>
        <xs:attribute name="casesensitive" type="xs:string"/>
        <xs:attribute name="global" type="xs:boolean"/>
        <xs:attribute name="defaultValue" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="thenType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="elseifType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="elseType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="mergelogsType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="log" type="logType"/>
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="destfile" type="xs:string" use="required"/>
        <xs:attribute name="stdout" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="logType">
        <xs:attribute name="file" type="xs:string" use="required"/>
        <xs:attribute name="tool" type="xs:string" use="required"/>
        <xs:attribute name="regex" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="reviewplanType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="destdir" type="xs:string" use="required"/>
        <xs:attribute name="component" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="processreviewplanType">
        <xs:attribute name="in" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="convertreviewlogType">
        <xs:attribute name="input" type="xs:string" use="required"/>
        <xs:attribute name="template" type="xs:string" use="required"/>
        <xs:attribute name="review" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="lintType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="option">
                <xs:complexType>
                    <xs:choice minOccurs="0" maxOccurs="unbounded">
                        <xs:element name="fileset" type="filesetType"/>
                        <xs:element name="dirset" type="dirsetType"/>
                    </xs:choice>
                    <xs:attribute name="type" type="xs:string" use="optional"/>
                    <xs:attribute name="value" type="xs:string" use="optional"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="output" type="xs:string" use="required"/>
        <xs:attribute name="lintPath" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="customcopyType">
        <xs:complexContent>
            <xs:extension base="copyType">
                <xs:attribute name="preservereadonly">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <xs:attribute name="checkcontents">
                    <xs:simpleType>
                        <xs:restriction base="xs:NMTOKEN">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                            <xs:enumeration value="on"/>
                            <xs:enumeration value="off"/>
                            <xs:enumeration value="yes"/>
                            <xs:enumeration value="no"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="fopType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="messagelevel" type="xs:string"/>
        <xs:attribute name="userconfig" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="xmltaskType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="cut" type="cutXmlType"/>
            <xs:element name="copy" type="copyXmlType"/>
            <xs:element name="insert" type="insertXmlType"/>
            <xs:element name="rename" type="renameXmlType"/>
            <xs:element name="remove" type="removeXmlType"/>
            <xs:element name="attr" type="attrXmlType"/>
            <xs:element name="xmlcatalog" type="xmlcatalogType"/>
        </xs:choice>
        <xs:attribute name="source" type="xs:string"/>
        <xs:attribute name="sourcebuffer" type="xs:string"/>
        <xs:attribute name="dest" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="report" type="xs:string"/>
        <xs:attribute name="public" type="xs:string"/>
        <xs:attribute name="system" type="xs:string"/>
        <xs:attribute name="preservetype" type="xs:string"/>
        <xs:attribute name="failWithoutMatch" type="xs:string"/>
        <xs:attribute name="indent" type="xs:string"/>
        <xs:attribute name="encoding" type="xs:string"/>
        <xs:attribute name="outputter" type="xs:string"/>
        <xs:attribute name="omitHeader" type="xs:string"/>
        <xs:attribute name="standalone" type="xs:string"/>
        <xs:attribute name="clearBuffers" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="cutXmlType">
        <xs:attribute name="path" type="xs:string"/>
        <xs:attribute name="buffer" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="append" type="xs:string"/>
        <xs:attribute name="attrValue" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="copyXmlType">
        <xs:attribute name="path" type="xs:string"/>
        <xs:attribute name="buffer" type="xs:string"/>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="append" type="xs:string"/>
        <xs:attribute name="attrValue" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="insertXmlType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="path" type="xs:string" use="required"/>
                <xs:attribute name="buffer" type="xs:string" use="optional"/>
                <xs:attribute name="file" type="xs:string" use="optional"/>
                <xs:attribute name="xml" type="xs:string" use="optional"/>
                <xs:attribute name="position" type="xs:string" use="optional"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="renameXmlType">
        <xs:attribute name="path" type="xs:string"/>
        <xs:attribute name="to" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="removeXmlType">
        <xs:attribute name="path" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="attrXmlType">
        <xs:attribute name="path" type="xs:string" use="required"/>
        <xs:attribute name="attr" type="xs:string" use="required"/>
        <xs:attribute name="value" type="xs:string" use="optional"/>
        <xs:attribute name="remove" type="xs:boolean" use="optional"/>
    </xs:complexType>
    <xs:complexType name="ftpType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="server" type="xs:string"/>
        <xs:attribute name="userid" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="getsizeType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="output" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="abldType">
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="output" type="xs:string" use="optional"/>
        <xs:attribute name="test" type="xs:boolean" use="optional"/>
        <xs:attribute name="command" use="required">
            <xs:simpleType>
                <xs:restriction base="xs:token">
                    <xs:enumeration value="build"/>
                    <xs:enumeration value="clean"/>
                    <xs:enumeration value="cleanall"/>
                    <xs:enumeration value="cleanexport"/>
                    <xs:enumeration value="export"/>
                    <xs:enumeration value="final"/>
                    <xs:enumeration value="freeze"/>
                    <xs:enumeration value="help"/>
                    <xs:enumeration value="library"/>
                    <xs:enumeration value="listing"/>
                    <xs:enumeration value="makefile"/>
                    <xs:enumeration value="reallyclean"/>
                    <xs:enumeration value="resource"/>
                    <xs:enumeration value="target"/>
                    <xs:enumeration value="tidy"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="platform" use="optional">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="wins"/>
                    <xs:enumeration value="winscw"/>
                    <xs:enumeration value="gccxml"/>
                    <xs:enumeration value="thumb"/>
                    <xs:enumeration value="arm4at"/>
                    <xs:enumeration value="vc6"/>
                    <xs:enumeration value="cw_ide"/>
                    <xs:enumeration value="armv5"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="variant" use="optional">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="udeb"/>
                    <xs:enumeration value="urel"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="grandType">
        <xs:attribute name="buildfile" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="svnType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="update" type="updateSvnType"/>
            <xs:element name="status" type="statusSvnType"/>
        </xs:choice>
        <xs:attribute name="username" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="updateSvnType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="file" type="xs:string" use="optional"/>
        <xs:attribute name="dir" type="xs:string" use="optional"/>
        <xs:attribute name="recurse" type="xs:string" use="optional"/>
        <xs:attribute name="revision" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="statusSvnType">
        <xs:attribute name="path" type="xs:string"/>
        <xs:attribute name="textStatusProperty" type="xs:string" use="optional"/>
        <xs:attribute name="propStatusProperty" type="xs:string" use="optional"/>
        <xs:attribute name="revisionProperty" type="xs:string" use="optional"/>
        <xs:attribute name="lastChangedRevisionProperty" type="xs:string" use="optional"/>
        <xs:attribute name="lastCommitAuthorProperty" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="antunitType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="plainlistener" type="plainlistenerType"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="plainlistenerType"/>
    <xs:complexType name="schemavalidateType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="schema" type="schemaType"/>
        </xs:choice>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="noNamespaceFile" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="pythonType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="outputproperty" type="xs:string"/>
                <xs:attribute name="resultproperty" type="xs:string"/>
                <xs:attribute name="failonerror" type="xs:string"/>
                <xs:attribute name="script" type="xs:string"/>
                <xs:attribute name="dir" type="xs:string"/>
                <xs:attribute name="output" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="forType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
            <xs:element name="path" type="pathType"/>
            <xs:element name="resources" type="resourcesType"/>
            <xs:element name="sequential" type="sequentialType"/>
        </xs:choice>
        <xs:attribute name="list" type="xs:string"/>
        <xs:attribute name="param" type="xs:string"/>
        <xs:attribute name="delimiter" type="xs:string"/>
        <xs:attribute name="parallel" type="xs:string"/>
        <xs:attribute name="keepgoing" type="xs:string"/>
        <xs:attribute name="threadCount" type="xs:string"/>
        <xs:attribute name="trim" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="chainedmapperType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="mapper" type="mapperType"/>
            <xs:element name="flattenmapper" type="flattenmapperType"/>
            <xs:element name="globmapper" type="globmapperType"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="flattenmapperType"/>
    <xs:complexType name="antformType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="label" type="xs:string"/>
            <xs:element name="separator"/>
            <xs:element name="tab">
                <xs:complexType>
                    <xs:attribute name="label" type="xs:string"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="fileSelectionProperty">
                <xs:complexType>
                    <xs:attribute name="if" type="xs:string"/>
                    <xs:attribute name="unless" type="xs:string"/>
                    <xs:attribute name="label" type="xs:string"/>
                    <xs:attribute name="property" type="xs:string"/>
                    <xs:attribute name="directoryChooser" type="xs:string"/>
                    <xs:attribute name="required" type="xs:boolean"/>
                    <xs:attribute name="tooltip" type="xs:string"/>
                    <xs:attribute name="focus" type="xs:boolean"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="selectionProperty">
                <xs:complexType>
                    <xs:attribute name="if" type="xs:string"/>
                    <xs:attribute name="unless" type="xs:string"/>
                    <xs:attribute name="label" type="xs:string"/>
                    <xs:attribute name="property" type="xs:string"/>
                    <xs:attribute name="values" type="xs:string"/>
                    <xs:attribute name="tooltip" type="xs:string"/>
                    <xs:attribute name="separator" type="xs:string"/>
                    <xs:attribute name="focus" type="xs:boolean"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="textProperty">
                <xs:complexType>
                    <xs:attribute name="if" type="xs:string"/>
                    <xs:attribute name="unless" type="xs:string"/>
                    <xs:attribute name="label" type="xs:string"/>
                    <xs:attribute name="property" type="xs:string"/>
                    <xs:attribute name="required" type="xs:boolean"/>
                    <xs:attribute name="tooltip" type="xs:string"/>
                    <xs:attribute name="password" type="xs:string"/>
                    <xs:attribute name="focus" type="xs:boolean"/>
                </xs:complexType>
            </xs:element>
        </xs:choice>
        <xs:attribute name="title" type="xs:string"/>
        <xs:attribute name="image" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="mathType">
        <xs:attribute name="result" type="xs:string"/>
        <xs:attribute name="datatype" type="xs:string"/>
        <xs:attribute name="strict" type="xs:boolean"/>
        <xs:attribute name="operation" type="xs:string"/>
        <xs:attribute name="operand1" type="xs:string"/>
        <xs:attribute name="operand2" type="xs:string"/>
        <!-- TODO: define nested elements -->
    </xs:complexType>
    <xs:complexType name="antserverType">
        <xs:attribute name="port" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="shellscriptType" mixed="true">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="arg">
                <xs:complexType>
                    <xs:attribute name="value" type="xs:string"/>
                </xs:complexType>
            </xs:element>
        </xs:choice>
        <xs:attribute name="shell" type="xs:string"/>
        <xs:attribute name="tmpsuffix" type="xs:string"/>
        <xs:attribute name="dir" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="runtargetType">
        <xs:attribute name="target" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="echoxmlType">
        <xs:choice maxOccurs="unbounded">
            <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:choice>
        <xs:attribute name="file" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="trycatchType">
        <xs:sequence>
            <xs:element name="try">
                <xs:complexType>
                    <xs:complexContent>
                        <xs:extension base="taskcontainerType"/>
                    </xs:complexContent>
                </xs:complexType>
            </xs:element>
            <xs:element name="catch">
                <xs:complexType>
                    <xs:complexContent>
                        <xs:extension base="taskcontainerType"/>
                    </xs:complexContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="property" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="resourcecountType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="dirset" type="dirsetType"/>
        </xs:choice>
        <xs:attribute name="property" type="xs:string"/>
        <xs:attribute name="when" type="xs:string"/>
        <xs:attribute name="count" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="remoteantType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="runtarget" type="runtargetType"/>
        </xs:choice>
        <xs:attribute name="machine" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="persistent" type="xs:string"/>
        <xs:attribute name="failonerror" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="propertyresourceType">
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="firstType">
        <xs:complexContent>
            <xs:extension base="resourceCollectionContainerType">
                <xs:attribute name="count" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="sortType">
        <xs:choice maxOccurs="unbounded">
            <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="schemaType">
        <xs:attribute name="namespace" type="xs:string"/>
        <xs:attribute name="file" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="retryType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="sleepTime" type="xs:string"/>
                <xs:attribute name="retryCount" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="antcallbackType">
        <xs:complexContent>
            <xs:extension base="antcallType">
                <xs:attribute name="return" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="diagnosticsType"/>
    <xs:complexType name="sshexecType">
        <xs:attribute name="host" type="xs:string"/>
        <xs:attribute name="username" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="trust" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="failonerror" type="xs:boolean"/>
    </xs:complexType>
    <xs:complexType name="scpType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="localFile" type="xs:string"/>
        <xs:attribute name="remoteFile" type="xs:string"/>
        <xs:attribute name="todir" type="xs:string"/>
        <xs:attribute name="localTodir" type="xs:string"/>
        <xs:attribute name="localTofile" type="xs:string"/>
        <xs:attribute name="remoteTodir" type="xs:string"/>
        <xs:attribute name="remoteTofile" type="xs:string"/>
        <xs:attribute name="port" type="xs:string"/>
        <xs:attribute name="trust" type="xs:string"/>
        <xs:attribute name="knownhosts" type="xs:string"/>
        <xs:attribute name="failonerror" type="xs:string"/>
        <xs:attribute name="password" type="xs:string"/>
        <xs:attribute name="keyfile" type="xs:string"/>
        <xs:attribute name="passphrase" type="xs:string"/>
        <xs:attribute name="verbose" type="xs:string"/>
        <xs:attribute name="sftp" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="xcluderType">
        <xs:attribute name="in" type="xs:string"/>
        <xs:attribute name="out" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="assertTrueType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="message" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="assertFileExistsType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="file" type="xs:string"/>
                <xs:attribute name="message" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="fmppType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
            <xs:element name="data">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="expandProperties" type="xs:string"/>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
        </xs:choice>
        <xs:attribute name="sourceFile" type="xs:string"/>
        <xs:attribute name="outputFile" type="xs:string"/>
        <xs:attribute name="sourceRoot" type="xs:string"/>
        <xs:attribute name="outputRoot" type="xs:string"/>
        <xs:attribute name="includes" type="xs:string"/>
        <xs:attribute name="excludes" type="xs:string"/>
        <xs:attribute name="replaceExtension" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="databaseType">
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="logextractType">
        <xs:complexContent>
            <xs:extension base="resourceCollectionContainerType">
                <xs:attribute name="file" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="signalType">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fileset" type="filesetType"/>
        </xs:choice>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="result" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="dependenciesType">
        <xs:attribute name="format" type="xs:string"/>
    </xs:complexType>
    <!-- Presets -->
    <xs:complexType name="preset.mailType">
        <xs:complexContent>
            <xs:extension base="mailType"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="preset.execType">
        <xs:complexContent>
            <xs:extension base="execType"/>
        </xs:complexContent>
    </xs:complexType>
    <!-- Macros -->
    <xs:complexType name="macro.compile.htmlscanlogType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.cmakerType">
        <xs:attribute name="ncp" type="xs:string"/>
        <xs:attribute name="s60" type="xs:string"/>
        <xs:attribute name="action" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.compile.genxmlType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
        <xs:attribute name="configuration" type="xs:string"/>
        <xs:attribute name="log" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.compile.ebsType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="log" type="xs:string"/>
        <xs:attribute name="threads" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.build.ebs.xmlType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="logname" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.log.htmlType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.bldmake-bldfilesType">
        <xs:attribute name="dir" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.abldType">
        <xs:attribute name="dir" type="xs:string"/>
        <xs:attribute name="command" type="xs:string"/>
        <xs:attribute name="platform" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.filtered-record-startType"/>
    <xs:complexType name="macro.filtered-record-stopType">
        <xs:attribute name="pattern" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.update-statusType"/>
    <xs:complexType name="macro.create-cshelp-bldinfType">
        <xs:attribute name="delivery" type="xs:string"/>
        <xs:attribute name="product" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="createDeltaZipMacroType">
        <xs:attribute name="variant" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.rombuild-imakerType">
        <xs:attribute name="product" type="xs:string"/>
        <xs:attribute name="target" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.imakerType">
        <xs:attribute name="product" type="xs:string"/>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="makefile" type="xs:string"/>
        <xs:attribute name="cmd" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.ccm-availableType">
        <xs:attribute name="resultproperty" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.publishType"/>
    <xs:complexType name="macro.rom-buildType">
        <xs:attribute name="stage" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.disk-spaceType">
        <xs:attribute name="drive" type="xs:string"/>
        <xs:attribute name="space" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.notifyType">
        <xs:attribute name="message" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.netrc-passwordType">
        <xs:attribute name="output-prop" type="xs:string"/>
        <xs:attribute name="result-prop" type="xs:string"/>
        <xs:attribute name="type" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.netrc-usernameType">
        <xs:attribute name="output-prop" type="xs:string"/>
        <xs:attribute name="result-prop" type="xs:string"/>
        <xs:attribute name="type" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.compile.genxml-mergeType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.declare.idType">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
    <xs:complexType name="macro.mail-target-completedType">
        <xs:attribute name="section" type="xs:string"/>
        <xs:attribute name="sms" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="zipContentMacroType">
        <xs:attribute name="type" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.delete-fota-confType">
        <xs:attribute name="product" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.rombuild.valueType">
        <xs:attribute name="product.name" type="xs:string"/>
        <xs:attribute name="outputproperty" type="xs:string"/>
        <xs:attribute name="rombuild.value" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="hlm-assertType">
        <xs:complexContent>
            <xs:extension base="taskcontainerType">
                <xs:attribute name="message" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="hlm-assertFileExistsType">
        <xs:attribute name="file" type="xs:string"/>
        <xs:attribute name="message" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="reference-to-fileType">
        <xs:attribute name="refid" type="xs:string"/>
        <xs:attribute name="output" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.xml.to.fmtlType">
        <xs:attribute name="input" type="xs:string"/>
        <xs:attribute name="xmlroot" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.temp.record.startType">
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="macro.temp.record.stopType">
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <!--
    
    <xs:complexType name="Type">
        <xs:attribute name="" type="xs:string"/>
    </xs:complexType>
    -->
</xs:schema>
\ No newline at end of file
--- a/buildframework/helium/tools/common/templates/ido/ido-ant-copy.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/templates/ido/ido-ant-copy.xml.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -22,10 +22,12 @@
 <?xml version="1.0"?>
 <project name="ido-ant-copy" default="all">
     <target name="all">
+        <#list data?keys as component>
+            <mkdir dir="${data[component]}"/>
+        </#list>
         <parallel threadCount="${r'$'}{number.of.threads}">
         <#list data?keys as component>
             <sequential>
-                <mkdir dir="${data[component]}"/>
                 <copy todir="${data[component]}" verbose="false" failonerror="false" overwrite="true">
                     <fileset dir="${component}" casesensitive="false" >
                         <exclude name="**/_ccmwaid.inf"/>
--- a/buildframework/helium/tools/common/templates/ido/ido-cmt-ant.xml.ftl	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/templates/ido/ido-cmt-ant.xml.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -28,9 +28,10 @@
     <#if (cmtid > 1)>
     <#assign targetlist="${targetlist}" + ","/>
     </#if>
+    <basename property="componentbase${cmtid}" file="${data[component]}"/>
     <hlm:argSet id="cmttool.refid.${cmtid}">
         <hlm:arg name="input" value="${data[component]}" />
-        <hlm:arg name="output" value="${ant['build.log.dir']}/${ant['build.id']}_${ant['ido.name']}_${cmtid}.xml" />
+        <hlm:arg name="output" value="${ant['build.log.dir']}/${ant['build.id']}_${ant['ido.name']}_${r'$'}{componentbase${cmtid}}_${cmtid}.txt" />
         <hlm:arg name="pattern" value="**/*.h,**/*.cpp" />
     </hlm:argSet>
 
@@ -43,8 +44,5 @@
     <#assign cmtid=cmtid+1/>
     </#list>
     <target name="all" depends="${targetlist}" >
-      <move todir="${ant['build.output.dir']}/codecomplexity" overwrite="true" preservelastmodified="true" failonerror="${ant['failonerror']}">
-          <fileset dir="${ant['build.log.dir']}/CMTHTML"/>
-      </move>
     </target>
 </project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/build_stages_summary.txt.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,35 @@
+<#--
+============================================================================ 
+Name        : build_stages_summary.txt.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+--> 
+
+*** BUILD STAGE SUMMARY ***
+
+<#assign count = 0>
+<#list statusReports as report>
+<#assign count = count + 1>
+${count}) ${report["phaseName"]}
+${""?left_pad(2)} Start Time : ${report["startTime"]}
+${""?left_pad(2)} Duration   : ${report["duration"]}
+${""?left_pad(2)} Status     : ${report["status"]}
+<#if  report["status"] == "FAILED">
+${""?left_pad(2)} Reason     : ${report["reason"]}
+</#if>
+</#list>
--- a/buildframework/helium/tools/common/templates/log/cc_summary_metadata.html.ftl	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/templates/log/cc_summary_metadata.html.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -75,7 +75,7 @@
 <tr>
 <td>"${component_table['${component_id}']}"</td>
     <#list colors?keys as type>
-        <#assign count = "${table_info['select count(data) as COUNT from metadata where logpath_id=${logpath} and (priority_id in (select id from priority where priority like \"${type}\"))'][0]['COUNT']}" >
+        <#assign count = "${table_info['select count(data) as COUNT from metadata where logpath_id=${logpath} and component_id=${component_id} and (priority_id in (select id from priority where priority like \"${type}\"))'][0]['COUNT']}" >
         <#if ( count?number &gt; 0)>
 <td align="center" bgcolor="#${colors[type]}">${count}</td>
         <#else>
--- a/buildframework/helium/tools/common/templates/log/scan2.html.ftl	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/templates/log/scan2.html.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -20,6 +20,58 @@
 ============================================================================
 -->
 
+<#macro print_component_summary component href_c_id>
+<#if component_table?keys?seq_contains("${component}")>
+<#if component_table["${component}"] != "general">
+<tr><td>${component_table['${component}']}</td>
+<#else>
+<tr><td>UnCategorized</td>
+</#if>
+</#if>
+<#assign href_id = 0>
+<#assign time_tbl = table_info['select time from componenttime where cid = \'${component}\' ']>
+
+<#if time_tbl?size &gt; 0 && time_tbl[0]?keys?seq_contains("time") >
+    <#assign time = time_tbl[0]["time"]?number/>
+<#else>
+    <#assign time = 0/>
+</#if>
+
+<#assign hours = (time /(60 * 60))?floor>
+<#assign minutes_secs = (time % (60 * 60))?floor>
+<#assign minutes = (minutes_secs / 60)?floor>
+<#assign seconds = (minutes_secs % 60)?floor>
+
+<td align="center">${hours?string("00")}:${minutes?string("00")}:${seconds?string("00")}</td>
+<#list priority_ids as priority>
+    <#assign count = table_info['select count(data) as COUNT from metadata where priority_id in (select id from priority      where priority like \'${priority}\') and logpath_id in (select id from logfiles where path like \'%${logfile}%\') and component_id = \'${component}\' '][0]['COUNT'] >
+    <#if count &gt; 0>
+        <#assign color = color_list['${priority}']>
+        <td align="center" bgcolor="${color}"><a href="#section${href_c_id}${href_id}">${count}</a></td>
+    <#else>
+        <td align="center">${count}</td>
+    </#if>
+    <#assign href_id = href_id + 1>
+</#list>
+    </tr>
+</#macro>
+
+<#macro print_list_text priority component href_id>
+<#assign count = table_info['select count(data) as COUNT from metadata where component_id=\'${component}\' and priority_id in (select id from priority where priority like \'${priority}\') and logpath_id in (select id from logfiles where path like \'%${logfile}%\')'][0]['COUNT'] >
+<#if count &gt; 0>
+<#if component_table?keys?seq_contains("${component}")>
+    <#if component_table["${component}"] != "general">
+        <h3><a name="section${href_id}">${component_table['${component}']}(${count})</a></h3>
+    <#else>
+        <h3><a name="section${href_id}">Uncategorized(${count})</a></h3>    
+    </#if>
+</#if>
+    <#list table_info['select * from metadata where component_id=\'${component}\' and priority_id in (select id from priority where priority like \'${priority}\')'] as recordentry >
+    ${logfile}:${recordentry['line_number']}>${recordentry['data']}<br />
+    </#list>
+</#if>
+</#macro>
+
 <#macro add_severity_count severity, color, count>
     <#if count &gt; 0>
         <#if severity == 'error'>
@@ -38,7 +90,9 @@
     <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
         "${dbPath}") >
 <#-- overall summary -->
-<#assign component_table = table_info['select id, component from component where logpath_id in (select id from logfiles where path like \'%${logfile}%\')'] >
+<#assign component_table = table_info['select id, component from component where logpath_id in (select id from logfiles where path like \'%${logfile}%\') ORDER BY component'] >
+<#assign general_id = table_info['select id from component where logpath_id in (select id from logfiles where path like \'%${logfile}%\') and component like \'%general%\''] >
+
 <html>
 <head><title>${logfile}</title></head>
 <body>
@@ -72,52 +126,49 @@
     <table border="1" cellpadding="0" cellspacing="0" width="100%%">
         <tr>
             <th width="50%%">Component</th>
-            <th width="10%%">Errors</th>
-            <th width="10%%">Warnings</th>
-            <th width="10%%">Criticals</th>
-            <th width="10%%">Notes</th>
-            <th width="10%%">Info</th>
+            <th width="9%%">Time</th>
+            <th width="9%%">Errors</th>
+            <th width="9%%">Warnings</th>
+            <th width="9%%">Criticals</th>
+            <th width="9%%">Notes</th>
+            <th width="9%%">Info</th>
         </tr>
+<#assign c_id = 0>
+<#if general_id?size &gt; 0>
+<@print_component_summary component="${general_id[0][\"id\"]}" href_c_id="${c_id}"/>
+</#if>
+
 <#assign component_ids = component_table?keys>
-<#assign href_id = 0>
 <#list component_ids as component>
-<tr><td>${component_table['${component}']}</td>
-<#list priority_ids as priority>
-    <#assign count = table_info['select count(data) as COUNT from metadata where priority_id in (select id from priority      where priority like \'${priority}\') and logpath_id in (select id from logfiles where path like \'%${logfile}%\') and component_id = \'${component}\' '][0]['COUNT'] >
-    <#if count &gt; 0>
-        <td align="center" bgcolor="${color_list['${priority}']}"><a href="#section${href_id}">${count}</a></td>
-        <#assign href_id = href_id + 1>
-    <#else>
-        <td align="center">${count}</td>
-    </#if>
-</#list>
-</tr>
+<#if component_table["${component}"] != "general">
+    <@print_component_summary component="${component}" href_c_id="${c_id}" />
+</#if>
+
+<#assign c_id = c_id + 1>
 </#list>
 </table>
 
 <#-- Individual components status -->
 
-<#assign component_ids = component_table?keys>
-<#assign href_id = 0>
+<#assign href_pid = 0>
+<#list priority_ids as p_id>
+<#assign p_count = table_info['select count(data) as COUNT from metadata where priority_id in (select id from priority where priority like \'${p_id}\') and logpath_id in (select id from logfiles where path like \'%${logfile}%\')'][0]['COUNT'] >
+<#if p_count &gt; 0>
+    <h3><a>${p_id} Details By Component</a></h3>
+</#if>
+
+<#assign href_cid = 0>
+<#if general_id?size &gt; 0>
+    <@print_list_text priority="${p_id}" component="${general_id[0][\"id\"]}" href_id="${href_cid}${href_pid}" /> 
+    <#assign href_cid = href_cid + 1>
+</#if>    
 <#list component_ids as component>
-<#assign displayComponentHeader= 0 >
-<#list priority_ids as priority>
-<#assign displayPriorityHeader= 0 >
-<#assign count = table_info['select count(data) as COUNT from metadata where component_id=\'${component}\' and priority_id in (select id from priority where priority like \'${priority}\')'][0]['COUNT'] >
-<#if count &gt; 0>
-    <h3><a name="section${href_id}">${priority} for ${component_table['${component}']}</a></h3>
-    <#assign href_id = href_id + 1>
-    <table border="1" cellpadding="0" cellspacing="0" width="100%%">
-    <tr>
-        <th width="85%%">Text</th>
-        <th width="15%%">Line Number</th>
-    </tr>
-    <#list table_info['select * from metadata where component_id=\'${component}\' and priority_id in (select id from priority where priority like \'${priority}\')'] as recordentry >
-    <tr><td>${recordentry['data']}</td><td>${recordentry['line_number']}</td></tr>
-    </#list>
-    </table>
-</#if>
+    <#if component_table["${component}"] != "general">
+        <@print_list_text priority="${p_id}" component="${component}" href_id="${href_cid}${href_pid}" />
+        <#assign href_cid = href_cid + 1>
+    </#if>
 </#list>
+<#assign href_pid = href_pid + 1>
 </#list>
 </body>
 </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/scan2_text.html.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,181 @@
+<#--
+============================================================================ 
+Name        : bmd.macros.xml.ftl 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+    -->
+
+<#macro print_component_summary component href_c_id>
+<#if component_table?keys?seq_contains("${component}")>
+<#if component_table["${component}"] != "general">
+<tr><td>${component_table['${component}']}</td>
+<#else>
+<tr><td>UnCategorized</td>
+</#if>
+</#if>
+<#assign href_id = 0>
+<#assign time_tbl = table_info['select time from componenttime where cid = \'${component}\' ']>
+
+<#if time_tbl?size &gt; 0 && time_tbl[0]?keys?seq_contains("time") >
+    <#assign time = time_tbl[0]["time"]?number/>
+<#else>
+    <#assign time = 0/>
+</#if>
+
+<#assign hours = (time /(60 * 60))?floor>
+<#assign minutes_secs = (time % (60 * 60))?floor>
+<#assign minutes = (minutes_secs / 60)?floor>
+<#assign seconds = (minutes_secs % 60)?floor>
+
+<td align="center">${hours?string("00")}:${minutes?string("00")}:${seconds?string("00")}</td>
+<#list priority_ids as priority>
+    <#assign count = table_info['select count(data) as COUNT from metadata where priority_id in (select id from priority      where priority like \'${priority}\') and logpath_id in (select id from logfiles where path like \'%${logfile}%\') and component_id = \'${component}\' '][0]['COUNT'] >
+    <#if count &gt; 0>
+        <#assign color = color_list['${priority}']>
+        <td align="center" bgcolor="${color}"><a href="#section${href_c_id}${href_id}">${count}</a></td>
+    <#else>
+        <td align="center">${count}</td>
+    </#if>
+    <#assign href_id = href_id + 1>
+</#list>
+    </tr>
+</#macro>
+
+<#macro print_list_text priority component href_id>
+<#assign count = table_info['select count(data) as COUNT from metadata where component_id=\'${component}\' and priority_id in (select id from priority where priority like \'${priority}\') and logpath_id in (select id from logfiles where path like \'%${logfile}%\')'][0]['COUNT'] >
+<#if count &gt; 0>
+<#if component_table?keys?seq_contains("${component}")>
+    <#if component_table["${component}"] != "general">
+        <h3><a name="section${href_id}">${component_table['${component}']}(${count})</a></h3>
+    <#else>
+        <h3><a name="section${href_id}">Uncategorized(${count})</a></h3>    
+    </#if>
+</#if>
+    <#list table_info['select * from metadata where component_id=\'${component}\' and priority_id in (select id from priority where priority like \'${priority}\')'] as recordentry >
+    ${logfile}:${recordentry['line_number']}>${recordentry['data']}<br />
+    </#list>
+</#if>
+</#macro>
+
+<#macro add_severity_count severity, color, count>
+<#assign additional_count = count>
+<#if severity == 'error'>
+    <#assign additional_count = count + 1>
+</#if>
+    <#if additional_count &gt; 0>
+        <#if severity == 'error'>
+<td width="12%%" align="center" bgcolor="${color}">${additional_count}</td>
+        <#else>
+<td align="center" bgcolor="${color}">${count}</td>
+        </#if>
+    <#else>
+    <td align="center">${count}</td>
+    </#if>
+</#macro>
+<#if (doc)??>
+    <#assign logfile = "${doc.sbsinfo.logfile.@name}" >
+    <#assign time = "${doc.sbsinfo.duration.@time}" >
+
+    <#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader',
+        "${dbPath}") >
+<#-- overall summary -->
+<#assign component_table = table_info['select id, component from component where logpath_id in (select id from logfiles where path like \'%${logfile}%\') ORDER BY component'] >
+<#assign general_id = table_info['select id from component where logpath_id in (select id from logfiles where path like \'%${logfile}%\') and component like \'%general%\''] >
+
+<html>
+<head><title>${logfile}</title></head>
+<body>
+<h2 STYLE="background-color :#FF0000">Generated using Text Parser instead of XML Parser because of Invalid XML output from Raptor</h2>
+<h2>Overall</h2>
+<table border="1" cellpadding="0" cellspacing="0" width="100%%">
+<tr>
+    <th width="22%%">&nbsp;</th>
+    <th width="11%%">Time</th>
+    <th width="11%%">Errors</th>
+    <th width="11%%">Warnings</th>
+    <th width="11%%">Critical</th>
+    <th width="23%%">Migration Notes</th>
+    <th width="11%%">Info</th>
+</tr>
+<tr>
+<td width="22%%">Total</td>
+<td width="12%%" align="center">${time}</td>
+<#assign color_list={'error': 'FF0000', 'warning': 'FFF000', 'critical': 'FF7000', 'remark': '0000FF', 'info': 'FFFFFF'}>
+<#assign priority_ids = color_list?keys>
+<#list priority_ids as priority>
+    <@add_severity_count severity='${priority}' 
+        count = table_info['select count(data) as COUNT from metadata where priority_id in (select id from priority where priority like \'${priority}\') and logpath_id in (select id from logfiles where path like \'%${logfile}%\')'][0]['COUNT'] color=color_list['${priority}'] />
+</#list>
+</tr>
+</table>
+
+<#-- Summary for each component -->
+
+
+<h1>${logfile}</h1>
+<h2>By Component</h2>
+    <table border="1" cellpadding="0" cellspacing="0" width="100%%">
+        <tr>
+            <th width="50%%">Component</th>
+            <th width="9%%">Time</th>
+            <th width="9%%">Errors</th>
+            <th width="9%%">Warnings</th>
+            <th width="9%%">Criticals</th>
+            <th width="9%%">Notes</th>
+            <th width="9%%">Info</th>
+        </tr>
+<#assign c_id = 0>
+<#if general_id?size &gt; 0>
+<@print_component_summary component="${general_id[0][\"id\"]}" href_c_id="${c_id}"/>
+</#if>
+
+<#assign component_ids = component_table?keys>
+<#list component_ids as component>
+<#if component_table["${component}"] != "general">
+    <@print_component_summary component="${component}" href_c_id="${c_id}" />
+</#if>
+
+<#assign c_id = c_id + 1>
+</#list>
+</table>
+
+<#-- Individual components status -->
+
+<#assign href_pid = 0>
+<#list priority_ids as p_id>
+<#assign p_count = table_info['select count(data) as COUNT from metadata where priority_id in (select id from priority where priority like \'${p_id}\') and logpath_id in (select id from logfiles where path like \'%${logfile}%\')'][0]['COUNT'] >
+<#if p_count &gt; 0>
+    <h3><a>${p_id} Details By Component</a></h3>
+</#if>
+
+<#assign href_cid = 0>
+<#if general_id?size &gt; 0>
+    <@print_list_text priority="${p_id}" component="${general_id[0][\"id\"]}" href_id="${href_cid}${href_pid}" /> 
+    <#assign href_cid = href_cid + 1>
+</#if>    
+<#list component_ids as component>
+    <#if component_table["${component}"] != "general">
+        <@print_list_text priority="${p_id}" component="${component}" href_id="${href_cid}${href_pid}" />
+        <#assign href_cid = href_cid + 1>
+    </#if>
+</#list>
+<#assign href_pid = href_pid + 1>
+</#list>
+</body>
+</html>
+</#if>
\ No newline at end of file
--- a/buildframework/helium/tools/common/test/test_common.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/test/test_common.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,6 +21,9 @@
 ============================================================================
 -->
 <project name="test_common" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Testing targets
+    </description>
     <property environment="env"/>
     
     <property name="helium.dir" location="../../.." />
@@ -66,9 +69,9 @@
             <then>
                 <record name="${build.log}" action="start"/>
                 <echo>Before password filtering</echo>
-                <hlm:filterRecordStartMacro/>
+                <hlm:filterRecordStartMacro pattern="${password}"/>
                 <echo>Logging password: ${password}</echo>
-                <hlm:filterRecordStopMacro pattern="${password}"/>
+                <hlm:filterRecordStopMacro/>
                 <echo>After password filtering</echo>
                 <record name="${build.log}" action="stop"/>
             </then>
@@ -223,7 +226,7 @@
     <target name="test-hlm-touch">
         <hlm:touch>
             <path>
-                <pathelement path="${helium.dir}/build"/>
+                <pathelement path="${helium.build.dir}"/>
             </path>
         </hlm:touch>
     </target>
@@ -247,11 +250,11 @@
     <!-- Test user flow graph creation -->
     <target name="test-helium-user-graph">
         <runtarget target="helium-user-graph"/>
-        <!--<au:assertFileExists file="${helium.dir}/build/doc/user-graph.html"/>-->
-        <au:assertFileExists file="${helium.dir}/build/doc/images/user-graph.dot.png"/>
+        <!--<au:assertFileExists file="${helium.build.dir}/doc/user-graph.html"/>-->
+        <au:assertFileExists file="${helium.build.dir}/doc/images/user-graph.dot.png"/>
         <!--<sequential>
             <au:assertTrue>
-                <isfileselected file="${helium.dir}/build/doc/user-graph.html">
+                <isfileselected file="${helium.build.dir}/doc/user-graph.html">
                     <contains text="area shape"/>
                 </isfileselected>
             </au:assertTrue>
@@ -264,11 +267,13 @@
         <delete file="${build.cache.log.dir}/test.log.xml" failonerror="false"/>
         <delete file="${build.cache.log.dir}/test.sqlite" failonerror="false"/>
         <delete file="${metadata.dbfile}" failonerror="false"/>
+        <var name="build.log.dir" value="${build.cache.dir}/helium/temp_drive/output/logs" unset="true"/>
+        <var name="test.log.dir" value="${build.cache.dir}/helium/temp_drive/output/logs/test" unset="true"/>        
         <hlm:tempRecordStartMacro name="test.log" />
         <echo>ERROR: an error</echo>
         <echo>WARNING: a warning</echo>
         <echo>INFO: some useless message</echo>
-        <hlm:tempRecordStopMacro name="test.log" database="${build.cache.log.dir}/test.sqlite"/>
+        <hlm:tempRecordStopMacro name="test.log" database="${build.cache.log.dir}/test.sqlite" phase="test"/>
         <au:assertTrue>
             <and>
                 <hlm:hasSeverity file="${build.cache.log.dir}/signals/test.log.status.xml" severity="error"/>
@@ -310,15 +315,9 @@
     <target name="test-sisfiles">
         <tempfile destdir="${build.cache.dir}" property="sisfiles.tempconfig.file" suffix=".xml"/>
         <tempfile destdir="${build.cache.dir}" property="sis.config.file.parsed" suffix=".xml"/>
-        <if>
+        <condition property="echocmd" value="${helium.dir}/tools/common/test/echo.bat" else="echo">
             <os family='windows'/>
-            <then>
-                <property name="echocmd" value="${helium.dir}/tools/common/test/echo.bat"/>
-            </then>
-            <else>
-                <property name="echocmd" value="echo"/>
-            </else>
-        </if>
+        </condition>
         <echoxml  file="${sisfiles.tempconfig.file}">
             <build>
                 <config abstract="true">
@@ -342,11 +341,31 @@
             <param name="build.drive" value="${build.cache.dir}/helium/temp_drive/"/>
             <param name="build.cache.log.dir" value="${build.cache.dir}/helium/temp_drive/output/logs"/>
             <param name="metadata.dbfile" value="${build.cache.dir}/helium/temp_drive/output/logs/${build.id}_metadata.sqlite"/>
+            <param name="build.log.dir" value="${build.cache.dir}/helium/temp_drive/output/logs"/>            
+            <param name="post.log.dir" value="${build.cache.dir}/helium/temp_drive/output/logs/post"/>
+            
         </antcall>
         <au:assertFileExists file="${build.cache.dir}/helium/temp_drive/output/temp_build_files/sis_build.ant.xml"/>
         <delete file="${sisfiles.tempconfig.file}"/>
         <delete file="${sis.config.file.parsed}"/>
-        <delete dir="${build.cache.dir}/helium/temp_drive"/>
     </target>
+
+    <target name="test-exec">
+        <au:expectfailure>
+            <hlm:exec executable="123"/>
+        </au:expectfailure>
+        <hlm:exec executable="perl" outputproperty="testexec">
+            <arg value="-e"/>
+            <arg value="print 'hi'"/>
+        </hlm:exec>
+        <au:assertPropertyEquals name="testexec" value="hi"/>
+    </target>
+    
+    
+    <target name="test-grep-macro">
+        <hlm:grepMacro filename="${helium.dir}/tests/data/logs/test_log.log" regexp="([^\\]*.confml)$" output="confml.file.list"/>
+        <au:assertPropertySet name="confml.file.list"/>
+    </target>
+
 </project>
 
--- a/buildframework/helium/tools/common/test/test_deconfigure_task.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/test/test_deconfigure_task.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,6 +21,9 @@
 ============================================================================
 -->
 <project name="test_deconfigure_task" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Deconfigure testing targets for script deconfigure.pl
+    </description>
     <property environment="env"/>
     
     <property name="helium.dir" location="../../.." />
@@ -28,107 +31,107 @@
 
 
     <target name="test-deconfigure-no-arguments-case">
-        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database projectName password">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database password ccmProject">
             <hlm:deconfigure/>
         </au:expectfailure>
     </target>
 
     <target name="test-deconfigure-task-database-set-case">
-        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - projectName password">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - password ccmProject">
             <hlm:deconfigure database="to1tobet"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set database to to1tobet" level="debug"/>
+        <au:assertLogContains text="Set database to to1tobet" />
     </target>
 
-    <target name="test-deconfigure-task-projectName-set-case">
+    <target name="test-deconfigure-task-ccmproject-set-case">
         <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database password">
-            <hlm:deconfigure projectName="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
+            <hlm:deconfigure ccmProject="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set projectName to helium-to1tobet#helium_4.49:project:vc1s60p1#1" level="debug"/>
+        <au:assertLogContains text="Set ccmProject to helium-to1tobet#helium_4.49:project:vc1s60p1#1" />
     </target>
 
     <target name="test-deconfigure-task-password-set-case">
-        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database projectName">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database ccmProject">
             <hlm:deconfigure password="test"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set password to test" level="debug"/>
+        <au:assertLogContains text="Set password to ******"/>
     </target>
 
     <target name="test-deconfigure-task-consider-branch-releases-set-case">
-        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database projectName password">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database password ccmProject">
             <hlm:deconfigure considerBranchReleases="yes"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set considerBranchReleases to true" level="debug"/>
+        <au:assertLogContains text="Set considerBranchReleases to true"/>
     </target>
 
     <target name="test-deconfigure-task-verbosity-set-to-quiet-case">
-        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database projectName password">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database password ccmProject">
             <hlm:deconfigure verbosity="0"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set verbosity to 0" level="debug"/>
+        <au:assertLogContains text="Set verbosity to 0"/>
     </target>
 
     <target name="test-deconfigure-task-verbosity-set-to-verbose-case">
-        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database projectName password">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database password ccmProject">
             <hlm:deconfigure verbosity="1"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set verbosity to 1" level="debug"/>
+        <au:assertLogContains text="Set verbosity to 1"/>
     </target>
 
     <target name="test-deconfigure-task-verbosity-set-to-very-verbose-case">
-        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database projectName password">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database password ccmProject">
             <hlm:deconfigure verbosity="2"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set verbosity to 2" level="debug"/>
+        <au:assertLogContains text="Set verbosity to 2"/>
     </target>
 
-    <target name="test-deconfigure-task-database-and-projectName-set-case">
+    <target name="test-deconfigure-task-database-and-ccmproject-set-case">
         <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - password">
-            <hlm:deconfigure database="to1tobet" projectName="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
+            <hlm:deconfigure database="to1tobet" ccmProject="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
         </au:expectfailure>
     </target>
 
     <target name="test-deconfigure-task-database-and-password-set-case">
-        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - projectName">
+        <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - ccmProject">
             <hlm:deconfigure database="to1tobet" password="test"/>
         </au:expectfailure>
     </target>
 
-    <target name="test-deconfigure-task-projectName-and-password-set-case">
+    <target name="test-deconfigure-task-ccmproject-and-password-set-case">
         <au:expectfailure expectedMessage="[hlm:deconfigure] Error: mandatory attributes are not defined - database">
-            <hlm:deconfigure projectName="helium-to1tobet#helium_4.49:project:vc1s60p1#1" password="test"/>
+            <hlm:deconfigure ccmProject="helium-to1tobet#helium_4.49:project:vc1s60p1#1" password="test"/>
         </au:expectfailure>
     </target>
 
     <target name="test-deconfigure-task-all-mandatory-arguments-given-but-password-wrong-case">
         <au:expectfailure expectedMessage="[hlm:deconfigure] Error: Script execution failure.">
-            <hlm:deconfigure database="to1tobet" projectName="helium-to1tobet#helium_4.49:project:vc1s60p1#1" password="test"/>
+            <hlm:deconfigure database="to1tobet" ccmProject="helium-to1tobet#helium_4.49:project:vc1s60p1#1" password="test"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set database to to1tobet" level="debug"/>
-        <au:assertLogContains text="Set projectName to helium-to1tobet#helium_4.49:project:vc1s60p1#1" level="debug"/>
-        <au:assertLogContains text="Set password to test" level="debug"/>
+        <au:assertLogContains text="Set database to to1tobet" />
+        <au:assertLogContains text="Set ccmProject to helium-to1tobet#helium_4.49:project:vc1s60p1#1" />
+        <au:assertLogContains text="Set password to ******" />
     </target>
 
     <target name="test-deconfigure-task-all-mandatory-arguments-and-optional-arguments-given-but-password-wrong-case">
         <au:expectfailure expectedMessage="[hlm:deconfigure] Error: Script execution failure.">
-            <hlm:deconfigure database="to1tobet" projectName="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" password="test" considerBranchReleases="yes" verbosity="1"/>
+            <hlm:deconfigure database="to1tobet" ccmProject="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" password="test" considerBranchReleases="yes" verbosity="1"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set database to to1tobet" level="debug"/>
-        <au:assertLogContains text="Set projectName to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" level="debug"/>
-        <au:assertLogContains text="Set password to test" level="debug"/>
-        <au:assertLogContains text="Set considerBranchReleases to true" level="debug"/>
-        <au:assertLogContains text="Set verbosity to 1" level="debug"/>
+        <au:assertLogContains text="Set database to to1tobet" />
+        <au:assertLogContains text="Set ccmProject to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" />
+        <au:assertLogContains text="Set password to ******" />
+        <au:assertLogContains text="Set considerBranchReleases to true" />
+        <au:assertLogContains text="Set verbosity to 1" />
     </target>
 
     <target name="test-deconfigure-task-all-mandatory-arguments-and-optional-arguments-given-but-password-wrong-and-verbosity-wrong-case">
         <au:expectfailure expectedMessage="[hlm:deconfigure] Error: Verbosity level is not recognised. Legal values are: 0 - quiet, 1 - verbose or 2 - very verbose">
-            <hlm:deconfigure database="to1tobet" projectName="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" password="test" considerBranchReleases="no" verbosity="9"/>
+            <hlm:deconfigure database="to1tobet" ccmProject="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" password="test" considerBranchReleases="no" verbosity="9"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set database to to1tobet" level="debug"/>
-        <au:assertLogContains text="Set projectName to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" level="debug"/>
-        <au:assertLogContains text="Set password to test" level="debug"/>
-        <au:assertLogContains text="Set considerBranchReleases to false" level="debug"/>
-        <au:assertLogContains text="Set verbosity to 9" level="debug"/>
+        <au:assertLogContains text="Set database to to1tobet" />
+        <au:assertLogContains text="Set ccmProject to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1"/>
+        <au:assertLogContains text="Set password to ******" />
+        <au:assertLogContains text="Set considerBranchReleases to false" />
+        <au:assertLogContains text="Set verbosity to 9" />
     </target>
 
 </project>
\ No newline at end of file
--- a/buildframework/helium/tools/common/test/test_getvariablevalue.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/test/test_getvariablevalue.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,6 +21,9 @@
 ============================================================================
 -->
 <project name="test_getvariablevalue" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Get Variable Value Testing target
+    </description>
     <property environment="env"/>
     
     <property name="helium.dir" location="../../.." />
@@ -28,15 +31,17 @@
         
     
     <target name="test-getvariablevalue">
-        <hlm:argSet id="test.variableSet">
-            <variable name="v1" value="the_value"/>
-        </hlm:argSet>
+        <hlm:sbsinput id="test.variableSet">
+            <sbsOptions>
+                <arg name="v1" value="test"/>
+            </sbsOptions>
+        </hlm:sbsinput>
+        
         <hlm:getVariableValue name="v1" property="v1.value">
-            <hlm:argSet refid="test.variableSet"/>
+            <hlm:sbsinput refid="test.variableSet" />
         </hlm:getVariableValue>
         <au:assertTrue>
-            <equals arg1="${v1.value}" arg2="the_value"/>
+            <equals arg1="${v1.value}" arg2="test"/>
         </au:assertTrue>
     </target>    
-</project>
-
+</project>
\ No newline at end of file
--- a/buildframework/helium/tools/common/test/test_logging.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/test/test_logging.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,7 +21,9 @@
 ============================================================================
 -->
 <project name="test_logging" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
-
+    <description>
+        Logging testing targets
+    </description>
     <property environment="env"/>
     
     <property name="helium.dir" location="../../.." />
@@ -90,9 +92,9 @@
   
     <target name="test-specificlogmacro-create">
         <!--Record something-->
-        <hlm:startSpecificLogMacro name="${env.TEMP}/record_test.log"/>         
+        <hlm:startSpecificLogMacro name="${env.TEMP}/record_test.log" phase="test"/>         
         <echo>astalavista</echo>
-        <hlm:stopSpecificLogMacro name="${env.TEMP}/record_test.log"/>         
+        <hlm:stopSpecificLogMacro name="${env.TEMP}/record_test.log" phase="test"/>         
         
         <!-- Assert if the file doesn't exists-->
         <au:assertFileExists file="${env.TEMP}/record_test.log"/>
@@ -105,22 +107,22 @@
         <delete file="${env.TEMP}/record_test.log"/>        
     </target>
     
-    
-    <target name="test-specificlogmacro-backup">
+   <!-- Commenting, as hlm:record is not yet has the feature of back up Raghu--> 
+ <!--   <target name="test-specificlogmacro-backup">
         <touch file="${env.TEMP}/backup_test.log"/>        
         <echo file="${env.TEMP}/backup_test.log">childhood memory</echo>
-        <hlm:startSpecificLogMacro name="${env.TEMP}/backup_test.log" backup="true" />         
+        <hlm:startSpecificLogMacro name="${env.TEMP}/backup_test.log" backup="true" phase="test"/>         
         <echo>Now a days</echo>        
-        <hlm:stopSpecificLogMacro name="${env.TEMP}/backup_test.log"/>                                            
+        <hlm:stopSpecificLogMacro name="${env.TEMP}/backup_test.log" phase="test"/>     -->                                       
         
         <!--Match the backup file content-->        
-        <loadfile property="backup.message" srcFile="${backup.file.name}"/>        
+    <!--    <loadfile property="backup.message" srcFile="${backup.file.name}"/>        
         <au:assertTrue message="Failed to match content!!">
             <equals arg1="${backup.message}" arg2="childhood memory" trim="true"/>          
-        </au:assertTrue>
+        </au:assertTrue>-->
         
         <!--Match the current file content-->        
-        <loadfile property="current.message" srcFile="${env.TEMP}/backup_test.log"/>               
+     <!--   <loadfile property="current.message" srcFile="${env.TEMP}/backup_test.log"/>               
         <au:assertTrue message="Failed to match content!!">
             <equals arg1="${current.message}" arg2="[echo] Now a days" trim="true"/>          
         </au:assertTrue>
@@ -132,7 +134,7 @@
     <target name="test-log4j-log-file">                
         <au:assertFileExists file="${log4j.cache.dir}/hlm_debug.log" />        
         <au:assertFileDoesntExist file="hlm_debug.log" />
-    </target>
+    </target>-->
     
      <!-- Check the build-property-cache-file exists or not -->
     <target name="test-build-property-cache-file-exists">
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/test/test_rebaseanddeconf_task.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,266 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_rebaseanddeconf_task.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_rebaseanddeconf_task" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Rebaseline and Deconfigure testing targets for script rbt.pl
+    </description>
+    <property environment="env"/>
+    
+    <property name="helium.dir" location="../../.." />
+    <import file="../../../helium.ant.xml"/>
+
+
+    <target name="test-rebaseanddeconf-no-arguments-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database password">
+            <hlm:rebaseanddeconf/>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-rebaseanddeconf-task-database-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - password">
+            <hlm:rebaseanddeconf database="to1tobet"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-ccmproject-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database password">
+            <hlm:rebaseanddeconf ccmProject="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set ccmProject to helium-to1tobet#helium_4.49:project:vc1s60p1#1" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-password-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database">
+            <hlm:rebaseanddeconf password="test"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set password to ******" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-release-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database password">
+            <hlm:rebaseanddeconf release="tony/test"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set release to tony/test" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-baseline-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database password">
+            <hlm:rebaseanddeconf baseline="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set baseline to helium-to1tobet#helium_4.49:project:vc1s60p1#1" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-version-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database password">
+            <hlm:rebaseanddeconf version="RnD_2007wk49"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set version to RnD_2007wk49" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-releasebaseline-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database password">
+            <hlm:rebaseanddeconf releaseBaseline="yes"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set releaseBaseline to true" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-leavefolders-writable-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database password">
+            <hlm:rebaseanddeconf leaveFoldersWritable="yes"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set leaveFoldersWritable to true" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-enabletask-rebadging-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database password">
+            <hlm:rebaseanddeconf enableTaskRebadging="yes"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set enableTaskRebadging to true" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-enabletask-rebadging-generic-release-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database password">
+            <hlm:rebaseanddeconf enableTaskRebadgingGenericRelease="yes"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set enableTaskRebadgingGenericRelease to true" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-rebadge-object-versions-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database password">
+            <hlm:rebaseanddeconf rebadgeObjectVersions="yes"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set rebadgeObjectVersions to true" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-newbaselinename-set-to-quiet-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database password">
+            <hlm:rebaseanddeconf newBaselineName="shoephone-RnD_2007wk49_01project:co1train#1"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set newBaselineName to shoephone-RnD_2007wk49_01project:co1train#1" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-use-branchrelease-methodology-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database password">
+            <hlm:rebaseanddeconf useBranchReleaseMethodology="yes"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set useBranchReleaseMethodology to true" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-create-baseline-for-rollingreleasetag-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database password">
+            <hlm:rebaseanddeconf createBaselineForRollingReleaseTag="yes"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set createBaselineForRollingReleaseTag to true" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-verbosity-set-to-quiet-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database password">
+            <hlm:rebaseanddeconf verbosity="0"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set verbosity to 0" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-verbosity-set-to-verbose-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database password">
+            <hlm:rebaseanddeconf verbosity="1"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set verbosity to 1" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-database-and-ccmproject-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - password">
+            <hlm:rebaseanddeconf database="to1tobet" ccmProject="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-rebaseanddeconf-task-database-and-baseline-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - password">
+            <hlm:rebaseanddeconf database="to1tobet" baseline="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" />
+        <au:assertLogContains text="Set baseline to helium-to1tobet#helium_4.49:project:vc1s60p1#1" />
+    </target>
+    
+    <target name="test-rebaseanddeconf-task-ccmproject-and-password-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database">
+            <hlm:rebaseanddeconf ccmProject="helium-to1tobet#helium_4.49:project:vc1s60p1#1" password="test"/>
+        </au:expectfailure>
+    </target>
+
+    <target name="test-rebaseanddeconf-task-baseline-and-password-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: mandatory attributes are not defined - database">
+            <hlm:rebaseanddeconf baseline="helium-to1tobet#helium_4.49:project:vc1s60p1#1" password="test"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set baseline to helium-to1tobet#helium_4.49:project:vc1s60p1#1" />
+        <au:assertLogContains text="Set password to ******" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-all-mandatory-arguments-with-ccmproject-given-but-password-wrong-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: Script execution failure.">
+            <hlm:rebaseanddeconf database="to1tobet" ccmProject="helium-to1tobet#helium_4.49:project:vc1s60p1#1" password="test"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" />
+        <au:assertLogContains text="Set ccmProject to helium-to1tobet#helium_4.49:project:vc1s60p1#1" />
+        <au:assertLogContains text="Set password to ******" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-all-mandatory-arguments-with-baseline-given-but-password-wrong-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: Script execution failure.">
+            <hlm:rebaseanddeconf database="to1tobet" baseline="helium-to1tobet#helium_4.49:project:vc1s60p1#1" password="test"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" />
+        <au:assertLogContains text="Set baseline to helium-to1tobet#helium_4.49:project:vc1s60p1#1" />
+        <au:assertLogContains text="Set password to ******" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-all-mandatory-arguments-and-optional-arguments-given-but-password-wrong-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: Script execution failure.">
+            <hlm:rebaseanddeconf database="to1tobet" ccmProject="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" password="test" verbosity="1"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" />
+        <au:assertLogContains text="Set ccmProject to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" />
+        <au:assertLogContains text="Set password to ******"/>
+        <au:assertLogContains text="Set verbosity to 1" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-all-mandatory-arguments-and-optional-arguments-given-but-password-wrong-and-verbosity-wrong-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: Verbosity level is not recognised. Legal values are: 0 - quiet, 1 - verbose, 2 - Interactive or 3 - Walk-through Rehearsal">
+            <hlm:rebaseanddeconf database="to1tobet" ccmProject="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" password="test" verbosity="9"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" />
+        <au:assertLogContains text="Set ccmProject to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" />
+        <au:assertLogContains text="Set password to ******"/>
+        <au:assertLogContains text="Set verbosity to 9" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-database-password-ccmproject-and-baseline-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: Option 'baseline' cannot be used with 'ccmProject' and 'newBaselineName'">
+            <hlm:rebaseanddeconf database="to1tobet" ccmProject="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" password="test" verbosity="1"
+                      baseline="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" />
+        <au:assertLogContains text="Set ccmProject to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" />
+        <au:assertLogContains text="Set password to ******"/>
+        <au:assertLogContains text="Set verbosity to 1" />
+        <au:assertLogContains text="Set baseline to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-database-password-baseline-newbaselineName-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: Option 'baseline' cannot be used with 'ccmProject' and 'newBaselineName'">
+            <hlm:rebaseanddeconf database="to1tobet" password="test" verbosity="1"
+                      baseline="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" newBaselineName="shoephone-RnD_2007wk49_01project:co1train#1"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" />
+        <au:assertLogContains text="Set baseline to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" />
+        <au:assertLogContains text="Set password to ******"/>
+        <au:assertLogContains text="Set verbosity to 1" />
+        <au:assertLogContains text="Set newBaselineName to shoephone-RnD_2007wk49_01project:co1train#1" />
+    </target>
+
+    <target name="test-rebaseanddeconf-task-database-password-baseline-enabletaskrebadging-and-enabletaskrebadginggenericrelease-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: Use Option either 'enableTaskRebadging' or 'enableTaskRebadgingGenericRelease'">
+            <hlm:rebaseanddeconf database="to1tobet" password="test" verbosity="1"
+                      baseline="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" enableTaskRebadging="yes" enableTaskRebadgingGenericRelease="yes"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" />
+        <au:assertLogContains text="Set baseline to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" />
+        <au:assertLogContains text="Set password to ******" />
+        <au:assertLogContains text="Set verbosity to 1" />
+        <au:assertLogContains text="Set enableTaskRebadging to true" />
+        <au:assertLogContains text="Set enableTaskRebadgingGenericRelease to true" />
+    </target>
+    
+    <target name="test-rebaseanddeconf-task-database-password-baseline-replacesubprojects-and-dontreplacesubprojects-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseanddeconf] Error: Use option either 'deconfigure' or 'skipDeconfigure'">
+            <hlm:rebaseanddeconf database="to1tobet" password="test" verbosity="1"
+                      baseline="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" deconfigure="yes" skipDeconfigure="yes"/>
+        </au:expectfailure>
+        <au:assertLogContains text="Set database to to1tobet" />
+        <au:assertLogContains text="Set baseline to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" />
+        <au:assertLogContains text="Set password to ******"/>
+        <au:assertLogContains text="Set verbosity to 1" />
+        <au:assertLogContains text="Set deconfigure to true" />
+        <au:assertLogContains text="Set skipDeconfigure to true" />
+    </target>
+</project>
--- a/buildframework/helium/tools/common/test/test_rebaseline_task.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/test/test_rebaseline_task.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,6 +21,9 @@
 ============================================================================
 -->
 <project name="test_rebaseline_task" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Rebaseline testing targets for script rebaseline.pl
+    </description>
     <property environment="env"/>
     
     <property name="helium.dir" location="../../.." />
@@ -28,161 +31,161 @@
 
 
     <target name="test-rebaseline-no-arguments-case">
-        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database password ccmProject">
             <hlm:rebaseline/>
         </au:expectfailure>
     </target>
 
     <target name="test-rebaseline-task-database-set-case">
-        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - projectName password">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - password ccmProject">
             <hlm:rebaseline database="to1tobet"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set database to to1tobet" level="debug"/>
+        <au:assertLogContains text="Set database to to1tobet" />
     </target>
 
-    <target name="test-rebaseline-task-projectName-set-case">
+    <target name="test-rebaseline-task-ccmproject-set-case">
         <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database password">
-            <hlm:rebaseline projectName="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
+            <hlm:rebaseline ccmProject="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set projectName to helium-to1tobet#helium_4.49:project:vc1s60p1#1" level="debug"/>
+        <au:assertLogContains text="Set ccmProject to helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
     </target>
 
     <target name="test-rebaseline-task-password-set-case">
-        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database ccmProject">
             <hlm:rebaseline password="test"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set password to test" level="debug"/>
+        <au:assertLogContains text="Set password to ******" />
     </target>
 
     <target name="test-rebaseline-task-release-set-case">
-        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database password ccmProject">
             <hlm:rebaseline release="tony/test"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set release to tony/test" level="debug"/>
+        <au:assertLogContains text="Set release to tony/test" />
     </target>
 
     <target name="test-rebaseline-task-baseline-set-case">
-        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database password ccmProject">
             <hlm:rebaseline baseline="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set baseline to helium-to1tobet#helium_4.49:project:vc1s60p1#1" level="debug"/>
+        <au:assertLogContains text="Set baseline to helium-to1tobet#helium_4.49:project:vc1s60p1#1" />
     </target>
 
     <target name="test-rebaseline-task-version-set-case">
-        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database password ccmProject">
             <hlm:rebaseline version="RnD_2007wk49"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set version to RnD_2007wk49" level="debug"/>
+        <au:assertLogContains text="Set version to RnD_2007wk49" />
     </target>
 
-    <target name="test-rebaseline-task-releaseBaseline-set-case">
-        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+    <target name="test-rebaseline-task-releasebaseline-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database password ccmProject">
             <hlm:rebaseline releaseBaseline="yes"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set releaseBaseline to true" level="debug"/>
+        <au:assertLogContains text="Set releaseBaseline to true" />
     </target>
 
-    <target name="test-rebaseline-task-leaveFolderswritable-set-case">
-        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
-            <hlm:rebaseline leaveFolderswritable="yes"/>
+    <target name="test-rebaseline-task-leavefolders-writable-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database password ccmProject">
+            <hlm:rebaseline leaveFoldersWritable="yes"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set leaveFolderswritable to true" level="debug"/>
+        <au:assertLogContains text="Set leaveFoldersWritable to true" />
     </target>
 
-    <target name="test-rebaseline-task-disableTaskRebadging-set-case">
-        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+    <target name="test-rebaseline-task-disable-taskrebadging-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database password ccmProject">
             <hlm:rebaseline disableTaskRebadging="yes"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set disableTaskRebadging to true" level="debug"/>
+        <au:assertLogContains text="Set disableTaskRebadging to true" />
     </target>
 
-    <target name="test-rebaseline-task-rebadgeObjectVersions-set-case">
-        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+    <target name="test-rebaseline-task-rebadgeobjectversions-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database password ccmProject">
             <hlm:rebaseline rebadgeObjectVersions="yes"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set rebadgeObjectVersions to true" level="debug"/>
+        <au:assertLogContains text="Set rebadgeObjectVersions to true" />
     </target>
 
-    <target name="test-rebaseline-task-baselineName-set-to-quiet-case">
-        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
-            <hlm:rebaseline baselineName="shoephone-RnD_2007wk49_01project:co1train#1"/>
+    <target name="test-rebaseline-task-newbaselineName-set-to-quiet-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database password ccmProject">
+            <hlm:rebaseline newBaselineName="shoephone-RnD_2007wk49_01project:co1train#1"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set baselineName to shoephone-RnD_2007wk49_01project:co1train#1" level="debug"/>
+        <au:assertLogContains text="Set newBaselineName to shoephone-RnD_2007wk49_01project:co1train#1" />
     </target>
 
-    <target name="test-rebaseline-task-useBranchReleaseMethodology-set-case">
-        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+    <target name="test-rebaseline-task-usebranchrelease-methodology-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database password ccmProject">
             <hlm:rebaseline useBranchReleaseMethodology="yes"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set useBranchReleaseMethodology to true" level="debug"/>
+        <au:assertLogContains text="Set useBranchReleaseMethodology to true" />
     </target>
 
-    <target name="test-rebaseline-task-createBaselineForRollingReleaseTag-set-case">
-        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+    <target name="test-rebaseline-task-create-baseline-for-rollingreleasetag-set-case">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database password ccmProject">
             <hlm:rebaseline createBaselineForRollingReleaseTag="yes"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set createBaselineForRollingReleaseTag to true" level="debug"/>
+        <au:assertLogContains text="Set createBaselineForRollingReleaseTag to true" />
     </target>
 
     <target name="test-rebaseline-task-verbosity-set-to-quiet-case">
-        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database password ccmProject">
             <hlm:rebaseline verbosity="0"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set verbosity to 0" level="debug"/>
+        <au:assertLogContains text="Set verbosity to 0" />
     </target>
 
     <target name="test-rebaseline-task-verbosity-set-to-verbose-case">
-        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database projectName password">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database password ccmProject">
             <hlm:rebaseline verbosity="1"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set verbosity to 1" level="debug"/>
+        <au:assertLogContains text="Set verbosity to 1" />
     </target>
 
-    <target name="test-rebaseline-task-database-and-projectName-set-case">
+    <target name="test-rebaseline-task-database-and-ccmproject-set-case">
         <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - password">
-            <hlm:rebaseline database="to1tobet" projectName="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
+            <hlm:rebaseline database="to1tobet" ccmProject="helium-to1tobet#helium_4.49:project:vc1s60p1#1"/>
         </au:expectfailure>
     </target>
 
     <target name="test-rebaseline-task-database-and-password-set-case">
-        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - projectName">
+        <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - ccmProject">
             <hlm:rebaseline database="to1tobet" password="test"/>
         </au:expectfailure>
     </target>
 
-    <target name="test-rebaseline-task-projectName-and-password-set-case">
+    <target name="test-rebaseline-task-ccmproject-and-password-set-case">
         <au:expectfailure expectedMessage="[hlm:rebaseline] Error: mandatory attributes are not defined - database">
-            <hlm:rebaseline projectName="helium-to1tobet#helium_4.49:project:vc1s60p1#1" password="test"/>
+            <hlm:rebaseline ccmProject="helium-to1tobet#helium_4.49:project:vc1s60p1#1" password="test"/>
         </au:expectfailure>
     </target>
 
     <target name="test-rebaseline-task-all-mandatory-arguments-given-but-password-wrong-case">
         <au:expectfailure expectedMessage="[hlm:rebaseline] Error: Script execution failure.">
-            <hlm:rebaseline database="to1tobet" projectName="helium-to1tobet#helium_4.49:project:vc1s60p1#1" password="test"/>
+            <hlm:rebaseline database="to1tobet" ccmProject="helium-to1tobet#helium_4.49:project:vc1s60p1#1" password="test"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set database to to1tobet" level="debug"/>
-        <au:assertLogContains text="Set projectName to helium-to1tobet#helium_4.49:project:vc1s60p1#1" level="debug"/>
-        <au:assertLogContains text="Set password to test" level="debug"/>
+        <au:assertLogContains text="Set database to to1tobet" />
+        <au:assertLogContains text="Set ccmProject to helium-to1tobet#helium_4.49:project:vc1s60p1#1" />
+        <au:assertLogContains text="Set password to ******"/>
     </target>
 
     <target name="test-rebaseline-task-all-mandatory-arguments-and-optional-arguments-given-but-password-wrong-case">
         <au:expectfailure expectedMessage="[hlm:rebaseline] Error: Script execution failure.">
-            <hlm:rebaseline database="to1tobet" projectName="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" password="test" verbosity="1"/>
+            <hlm:rebaseline database="to1tobet" ccmProject="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" password="test" verbosity="1"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set database to to1tobet" level="debug"/>
-        <au:assertLogContains text="Set projectName to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" level="debug"/>
-        <au:assertLogContains text="Set password to test" level="debug"/>
-        <au:assertLogContains text="Set verbosity to 1" level="debug"/>
+        <au:assertLogContains text="Set database to to1tobet" />
+        <au:assertLogContains text="Set ccmProject to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" />
+        <au:assertLogContains text="Set password to ******" />
+        <au:assertLogContains text="Set verbosity to 1" />
     </target>
 
     <target name="test-rebaseline-task-all-mandatory-arguments-and-optional-arguments-given-but-password-wrong-and-verbosity-wrong-case">
         <au:expectfailure expectedMessage="[hlm:rebaseline] Error: Verbosity level is not recognised. Legal values are: 0 - quiet, 1 - verbose.">
-            <hlm:rebaseline database="to1tobet" projectName="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" password="test" verbosity="9"/>
+            <hlm:rebaseline database="to1tobet" ccmProject="symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" password="test" verbosity="9"/>
         </au:expectfailure>
-        <au:assertLogContains text="Set database to to1tobet" level="debug"/>
-        <au:assertLogContains text="Set projectName to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" level="debug"/>
-        <au:assertLogContains text="Set password to test" level="debug"/>
-        <au:assertLogContains text="Set verbosity to 9" level="debug"/>
+        <au:assertLogContains text="Set database to to1tobet" />
+        <au:assertLogContains text="Set ccmProject to symbiantools-to1tobet#symbiantools_08_w34:project:ccm51#1" />
+        <au:assertLogContains text="Set password to ******" />
+        <au:assertLogContains text="Set verbosity to 9" />
     </target>
 
 </project>
\ No newline at end of file
--- a/buildframework/helium/tools/common/testing.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/common/testing.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -24,7 +24,6 @@
     <description>
         Targets to test Helium itself.
     </description>
-    <import file="${helium.dir}/build-jar.ant.xml"/>
     
     <fileset id="python.files" dir="${helium.dir}">
         <include name="tools/**/*.py"/>
@@ -55,10 +54,23 @@
 
     <!-- Do Python tests. -->
     <target name="do-py-unittest" depends="setup-py-unittest">
-        <property name="nose.args" value="nokiatest test"/>
+        <property name="nose.args" value="cpythontest nokiacpythontest nokiatest test"/>
         <exec executable="python" failonerror="true">
             <arg line="${python.tools}/coverage.py -x ${python.tools}/nosetests-script.py -v ${nose.args}"/>
         </exec>
+        <script language="jython" setbeans="false">
+import sys
+import os
+sys.path.append(os.path.join(os.environ['HELIUM_HOME'], 'external/python/lib/common/nose-0.11.1-py2.6.egg'))
+sys.path.append(os.path.join(os.environ['HELIUM_HOME'], 'external/python/lib/common/mocker-0.10.1-py2.5.egg'))
+import nose
+args = project.getProperty('nose.args')
+if args == 'cpythontest nokiacpythontest nokiatest test':
+    nose.run(argv=['-v', os.path.join(os.environ['HELIUM_HOME'], 'tools/common/python/lib/test'), 'nokiatest'])
+elif args.startswith('nokiatest.') or args.startswith('test.'):
+    nose.run(argv=['-v', args])
+print >> sys.stderr
+        </script>
     </target>
     
     <!-- Shortcut for Python unit tests. -->
@@ -67,34 +79,34 @@
         
     <!-- Create Python code coverage statistics. -->
     <target name="py-unittest-coverage">
-        <mkdir dir="${helium.dir}/build/coverage"/>
+        <mkdir dir="${helium.build.dir}/coverage"/>
         <pathconvert pathsep=" " property="python.modules.coverage">
             <fileset refid="python.files"/>
         </pathconvert>
         <exec executable="python" failonerror="true">
-            <arg line="${python.tools}/coverage.py -a -d ${helium.dir}/build/coverage ${python.modules.coverage}"/>
+            <arg line="${python.tools}/coverage.py -a -d ${helium.build.dir}/coverage ${python.modules.coverage}"/>
         </exec>
                         
         <!-- backup the old line coverage report and create the new one -->
-        <mkdir dir="${helium.dir}/build/coverage/report"/>        
+        <mkdir dir="${helium.build.dir}/coverage/report"/>        
         <if>
-            <available file="${helium.dir}/build/coverage/report/line_coverage.txt"/>
+            <available file="${helium.build.dir}/coverage/report/line_coverage.txt"/>
             <then>
-                <copy file="${helium.dir}/build/coverage/report/line_coverage.txt" tofile="${helium.dir}/build/coverage/report/line_coverage_old.txt" overwrite="true"/>
+                <copy file="${helium.build.dir}/coverage/report/line_coverage.txt" tofile="${helium.build.dir}/coverage/report/line_coverage_old.txt" overwrite="true"/>
             </then>    
         </if>        
-        <record name="${helium.dir}/build/coverage/report/line_coverage.txt" action="start"/>        
+        <hlm:record name="${helium.build.dir}/coverage/report/line_coverage.txt" action="start"/>        
         <exec executable="python" failonerror="true">
             <arg line="${python.tools}/coverage.py -r ${python.modules.coverage}"/>
         </exec>
-        <record name="${helium.dir}/build/coverage/report/line_coverage.txt" action="stop"/>
-        <replace file="${helium.dir}/build/coverage/report/line_coverage.txt">
+        <hlm:record name="${helium.build.dir}/coverage/report/line_coverage.txt" action="stop"/>
+        <replace file="${helium.build.dir}/coverage/report/line_coverage.txt">
             <replacetoken><![CDATA[[exec]]]></replacetoken>
             <replacevalue><![CDATA[]]></replacevalue>
         </replace>
         <hlm:python>
-for line in open(r'${helium.dir}/build/coverage/report/line_coverage.txt'):
-    if 'TOTAL' in line and '0%' in line:
+for line in open(r'${helium.build.dir}/coverage/report/line_coverage.txt'):
+    if 'TOTAL' in line and ' 0%' in line:
         raise Exception('Coverage at 0%')
         </hlm:python>
         <delete file="${helium.dir}/.coverage"/>
@@ -108,10 +120,15 @@
     <!-- Run Ant unit tests. -->
     <target name="ant-unittest">
         <mkdir dir="${helium.build.dir}/temp"/>
+        <mkdir dir="${helium.build.dir}/report/antunit"/>
         <au:antunit>
+            <propertyset>
+                <propertyref name="cache.dir"/>
+            </propertyset>
             <fileset dir="${helium.dir}" includes="tools/**/test_*.ant.xml"/>
             <fileset dir="${helium.dir}" includes="extensions/nokia/tools/**/test_*.ant.xml"/>
             <au:plainlistener/>
+            <au:xmllistener toDir="${helium.build.dir}/report/antunit"/>
         </au:antunit>
     </target>
     
@@ -163,10 +180,13 @@
             </batchtest>
         </junit>
         
-        <emma enabled="true" >
+        <emma enabled="true">
             <report>
+                <sourcepath>
+                    <dirset dir="${src.classes}" />
+                </sourcepath>
                 <infileset dir="${build.temp.dir}" includes="*.emma" />
-                <txt outfile="${build.temp.dir}/coverage.txt" />
+                <txt outfile="${build.temp.dir}/coverage.txt" depth="method" />
                 <html outfile="${build.temp.dir}/coverage.html" />
             </report>
         </emma>
--- a/buildframework/helium/tools/compile/compile.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/compile/compile.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -30,7 +30,7 @@
     <property name="genxml.output.file.suffix" value="genxml" />
     <property name="compile.sysdef.dtd.stub" location="${helium.dir}/tools/common/dtd/sysdef_dtd_1_4_0.xml" />
     <property name="compile.signal.input" value="compileSignalInput" />
-    <property name="diamonds.compile.summary" location="${build.log.dir}/${build.id}_compile_diamonds.xml" />
+    <property name="diamonds.compile.summary" location="${compile.log.dir}/${build.id}_compile_diamonds.xml" />
 
 
     <!-- including common compilation macros -->
@@ -57,7 +57,7 @@
 
     <!-- post operation for EC builds, submits the compile time and lists all the built components-->
     <target name="postcompile" depends="postcompile-ec,render-build-duplicates" unless="env.HLM_SUBCON">
-        <antcall target="submit-compile-time"/>
+        <runtarget target="submit-compile-time"/>
     </target>
     
     <!-- Pre-processes all System Definition input files.
@@ -81,7 +81,7 @@
         <for param="file">
             <resources refid="system.definition.files"/>
             <sequential>
-                <copy todir="${build.output.dir}/build/input"  verbose="true">
+                <copy todir="${build.output.dir}/build/input" verbose="true">
                     <fileset file="@{file}"/>
                     <filterchain>
                         <replaceregex pattern="bldFile=&quot;common" replace="bldFile=&quot;src\\\\common" flags="gi"/>
@@ -91,19 +91,12 @@
                         <expandproperties/>
                     </filterchain>
                     <mapper>
-                        <scriptmapper language="beanshell">
+                        <scriptmapper language="jython">
 <![CDATA[
-import java.io.File;
-String counter = project.getProperty(".unique.counter");
-int count;
-if (counter == null){
-    count = 0;
-}else{
-    count = Integer.valueOf(counter) + 1;
-}
-project.setProperty(".unique.counter", ""+count);
-targetname = (String.format("%016d",count) + "_"+new File(source).getName());
-self.addMappedName(targetname);
+import os
+(drive, _) = os.path.splitdrive(r'@{file}')
+path = r'@{file}'.replace(drive + os.sep, "", 1)
+self.addMappedName(path)
 ]]>
                         </scriptmapper>
                     </mapper>
@@ -115,14 +108,28 @@
 
     <!-- Merges all preprocessed System Definition files into one combined file. -->
     <target name="create-canonical-sysdef-file" depends="preprocess-sysdef-files">
-        <pathconvert pathsep=" " property="system.definition.files.list">
-            <fileset dir="${build.output.dir}/build/input/" includes="*"/>
-            <chainedmapper>
-                <globmapper from="*" to="-x *" casesensitive="no"/>
-            </chainedmapper>
-        </pathconvert>
-        <hlm:compileGenxmlMergeMacro input="-x ${compile.sysdef.dtd.stub} ${system.definition.files.list}"
-                                    output="${canonical.sysdef.file}"/>
+        <if>
+            <istrue value="${schema.new}" />
+            <then>
+                <echo message="system model file: ${system.model.file}" />
+                <copy file="${system.model.file}" tofile="${build.drive}/sf/os/deviceplatformrelease/foundation_system/system_model/system_model.xml"/> 
+                <hlm:joinSysdef epocroot="${build.drive}" srcfile="${build.drive}/sf/os/deviceplatformrelease/foundation_system/system_model/system_model.xml" 
+                    destfile="${canonical.sysdef.file}.join.xml" />
+                <!-- <hlm:mergeSysdef epocroot="${epocroot}" destfile="${canonical.sysdef.file}" srcfile="${canonical.sysdef.file}.join.xml" downstreamfile="${epocroot}/layer2.sysdef.xml" /> -->
+                <hlm:downgradeSysdef epocroot="${build.drive}" srcfile="${canonical.sysdef.file}.join.xml" 
+                    destfile="${canonical.sysdef.file}"/>
+            </then>
+            <else>
+                <pathconvert pathsep=" " property="system.definition.files.list">
+                    <fileset dir="${build.output.dir}/build/input/" includes="**"/>
+                    <chainedmapper>
+                        <globmapper from="*" to="-x *" casesensitive="no"/>
+                    </chainedmapper>
+                </pathconvert>
+                <hlm:compileGenxmlMergeMacro input="-x ${compile.sysdef.dtd.stub} ${system.definition.files.list}"
+                                            output="${canonical.sysdef.file}" logfile="${compile.log.dir}/${build.id}.sysdef_GenxmlMerge.log"/>
+            </else>
+        </if>
     </target>
 
     <!--
@@ -150,7 +157,7 @@
                 <hlm:compileGenxmlMacro input="-x ${canonical.sysdef.file}"
                                         configuration="${sysdef.configuration}"
                                         output="${genxml.output.file}"
-                                        log="${build.log.dir}/${build.id}.${sysdef.configuration}_${genxml.output.file.suffix}.log" />
+                                        log="${compile.log.dir}/${build.id}.${sysdef.configuration}_${genxml.output.file.suffix}.log" />
             </then>
         </if>
     </target>
@@ -221,21 +228,21 @@
                         <isfalse value="${compile.discard.result}"/>
                     </not>
                     <then>
-                        <delete file="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log.xml" failonerror="false"/>
+                        <delete file="${compile.log.dir}/${build.id}.${sysdef.configuration}_compile.log.xml" failonerror="false"/>
                     </then>
                 </if>
             </then>
             <else>
-                <exec executable="perl" dir="${build.drive}/" output="${build.log.dir}/${build.id}.${sysdef.configuration}_scan1.log" failonerror="${failonerror}">
+                <exec executable="perl" dir="${build.drive}/" output="${compile.log.dir}/${build.id}.${sysdef.configuration}_scan1.log" failonerror="${failonerror}">
                     <arg value="${epocroot}epoc32/tools/scanlog.pl"/>
-                    <arg file="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log"/>
+                    <arg file="${compile.log.dir}/${build.id}.${sysdef.configuration}_compile.log"/>
                 </exec>
                 <exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}">
                     <arg value="${epocroot}epoc32/tools/htmlscanlog.pl"/>
                     <arg value="-v"/>
                     <arg value="-v"/>
                     <arg value="-l"/>
-                    <arg file="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log"/>
+                    <arg file="${compile.log.dir}/${build.id}.${sysdef.configuration}_compile.log"/>
                     <arg value="-o"/>
                     <arg file="${build.log.dir}/${build.id}.${sysdef.configuration}_scan2.html"/>
                 </exec>
@@ -249,12 +256,12 @@
                     <then>
                         <hlm:metadatarecord database="${metadata.dbfile}">
                             <hlm:abldmetadatainput>
-                                <fileset casesensitive="false" file="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log" />
+                                <fileset casesensitive="false" file="${compile.log.dir}/${build.id}.${sysdef.configuration}_compile.log" />
                                 <metadatafilterset refid="filterset.compile" />
                             </hlm:abldmetadatainput>
                         </hlm:metadatarecord>
                         <hlm:compileLogSignalMacro compile.summary.file="${build.id}.${sysdef.configuration}_compile.log" 
-                            error.limit="${build.errors.limit}" />
+                            error.limit="${build.errors.limit}" phase="compile"/>
                         <!-- Todo: metadata: insert assertions for metadata parsing here -->
                     </then>
                 </if>
@@ -356,56 +363,36 @@
 
     <!-- Creates a .csv log of the sizes of all the binaries created in the build. -->
     <target name="binary-sizes-log" if="binary.sizes.output">
-        <hlm:startSpecificLogMacro name="${build.log.dir}/${build.id}_binary_sizes.log"/>
+        <hlm:startSpecificLogMacro name="${compile.log.dir}/${build.id}_binary_sizes.log" phase="compile"/>
         <property name="binary.sizes.output.file" location="${build.log.dir}/${build.id}_flash_image_size_data.csv"/>
         <pathconvert pathsep=";" property="build.logs.list">
-            <fileset dir="${build.log.dir}" includes="*_build.log" excludes="*ant_build.log;*_zipup_build.log"/>
+            <fileset dir="${compile.log.dir}" includes="*_build.log" excludes="*ant_build.log;*_zipup_build.log"/>
         </pathconvert>
         <pathconvert pathsep=";" property="binary.sizes.rom.logs.list">
             <fileset refid="binary.sizes.rom.logs"/>
         </pathconvert>
         <hlm:python>
 import logging
-
-import build.io
+import compilation
 import sysdef.api
-import sysdef.io
-
 #logging.basicConfig(level=logging.DEBUG)
 logging.basicConfig(level=logging.INFO)
 
 logging.info('Reading the System Sefinition information')
 sysDef = sysdef.api.SystemDefinition(r'${canonical.sysdef.file}')
 
+bnsizelogger = compilation.BinarySizeLogger(sysDef)
 # Read in the output binaries of each unit
-logging.info('Reading the output binaries created by each unit.')
-build_logs = r'${build.logs.list}'.split(';')
-if len(build_logs) == 0:
-    raise Exception('List of build logs is empty!')
-logging.info("The list of log files:\n")
-logging.info("\n".join(build_logs))
-for logpath in build_logs:
-    binaries_reader = build.io.AbldLogWhatReader(logpath)
-    sysDef.merge_binaries(binaries_reader)
+bnsizelogger.read_output_binaries_per_unit(r'${build.logs.list}'.split(';'))
 
 # Read in the binary sizes listed in the ROM output logs
-logging.info('Reading the binary sizes of each binary from ROM logs.')
-rom_logs = r'${binary.sizes.rom.logs.list}'.split(';')
-if len(rom_logs) == 0:
-    raise Exception('List of ROM logs is empty!')
-logging.info("The list of log files:\n")
-logging.info("\n".join(rom_logs))
-for log in rom_logs:
-    binary_sizes_reader = build.io.RombuildLogBinarySizeReader(log)
-    sysDef.merge_binary_sizes(binary_sizes_reader)
+bnsizelogger.read_binary_sizes_in_rom_output_logs(r'${binary.sizes.rom.logs.list}'.split(';'))
 
 # Write out a .csv file containing
-size_writer = sysdef.io.FlashImageSizeWriter(r'${binary.sizes.output.file}')
-size_writer.write(sysDef, r'${sysdef.configurations.list}'.split(','))
-size_writer.close()
+bnsizelogger.write2csvfile(r'${binary.sizes.output.file}', r'${sysdef.configurations.list}'.split(','))
         </hlm:python>
         <hlm:assertFileExists file="${binary.sizes.output.file}"/>
-        <hlm:stopSpecificLogMacro name="${build.log.dir}/${build.id}_binary_sizes.log"/>
+        <hlm:stopSpecificLogMacro name="${compile.log.dir}/${build.id}_binary_sizes.log" phase="compile"/>
     </target>
 
 
--- a/buildframework/helium/tools/compile/compile.antlib.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/compile/compile.antlib.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -26,7 +26,7 @@
         <attribute name="input"/>
         <attribute name="output"/>
         <sequential>
-            <exec dir="${build.drive}/" executable="perl" failonerror="${failonerror}">
+            <exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}">
                 <arg value="${epocroot}epoc32/tools/htmlscanlog.pl"/>
                 <arg value="-v"/>
                 <arg value="-v"/>
@@ -48,7 +48,7 @@
                 </not>
                 <then>
                     <fmpp sourceFile="${helium.dir}/tools/common/templates/diamonds/faults_metadata.ftl"
-                                 outputfile="${build.log.dir}/compile-main.xml">
+                                 outputfile="${diamonds.build.output.dir}/compile-main.xml">
                         <data expandProperties="yes">
                             dbPath: ${metadata.dbfile}
                             logpath: @{logfile} 
@@ -63,6 +63,7 @@
     <macrodef name="compileLogSignalMacro" uri="http://www.nokia.com/helium">
         <attribute name="compile.summary.file"/>
         <attribute name="error.limit"/>
+        <attribute name="phase" default="compile"/>
         <sequential>
             <hlm:metadataCountSeverity severity="ERROR" log="@{compile.summary.file}" 
                 db="${metadata.dbfile}" 
@@ -74,9 +75,8 @@
             <if>
                 <scriptcondition language="jython" value="false">
 errorsTotal = project.getProperty("build.errors.total")
-errorsLimit = project.getProperty("build.errors.limit")
-if int(errorsLimit) > -1:
-    if int(errorsTotal) > int(errorsLimit):
+if int(r'@{error.limit}') > -1:
+    if int(errorsTotal) > int(r'@{error.limit}'):
         self.setValue(1)
                 </scriptcondition>
                 <then>
@@ -88,7 +88,8 @@
             </if>
             <echo message="compile result:${compile.result}" />
             <hlm:signalMacro skip.count="true" result="${compile.result}" 
-                logfile="@{compile.summary.file}" 
+                logfile="@{compile.summary.file}"
+                phase="@{phase}" 
                 signal.input="${compile.signal.input}" />
         </sequential>
     </macrodef>
@@ -148,11 +149,16 @@
     <macrodef name="compileGenxmlMergeMacro" uri="http://www.nokia.com/helium">
         <attribute name="input"/>
         <attribute name="output"/>
+        <attribute name="logfile"/>
         <sequential>
+            <echo message="input:@{input}" />
+            <echo message="output:@{output}" />
+            <mkdir dir="${compile.log.dir}"/>
+            <mkdir dir="${temp.build.dir}"/>
             <copy todir="${build.drive}/" verbose="true">
                 <fileset dir="${helium.dir}/tools/common/dtd" includes="*.dtd"/>
             </copy>
-            <preset.exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}" output="${build.log.dir}/${build.id}.sysdef_GenxmlMerge.log">
+            <preset.exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}" output="@{logfile}">
                 <arg value="${epocroot}epoc32/tools/build/genxml.pl"/>
                 <arg value="-s"/>
                 <arg value="${epocroot}"/>
@@ -165,22 +171,24 @@
                     <available file="@{output}"/>
                 </not>
                 <then>
+                    <echo file="@{logfile}" message="ERROR: Check @{input}" append="true"/>
                     <!-- Todo: metadata: Make sure that logfilter is added to the filterset -->
                     <hlm:metadatarecord database="${metadata.dbfile}">
                         <hlm:textmetadatainput>
-                            <fileset casesensitive="false" file="${build.log.dir}/${build.id}.sysdef_GenxmlMerge.log" />
-                            <metadatafilterset>
-                                <metadatafilter priority="ERROR" regex="^ERROR:" description="genxml error" />
-                                <metadatafilter priority="ERROR" regex="^Context:" description="genxml context error" />
-                            </metadatafilterset>
+                            <fileset casesensitive="false" file="@{logfile}" />
                             <metadatafilterset refid="filterset.genxml.merge" />
                         </hlm:textmetadatainput>
                     </hlm:metadatarecord>
                     <hlm:generateBuildStatus file="${build.id}.sysdef_GenxmlMerge.log" />
                     <hlm:signal name="canonicalSysDefFailSignal" result="1" >
                         <signalNotifierInput>
-                            <signalInput refid="canonicalSysDefFailSignalInput" />
-                            <notifierInput file = "${build.signal.status.dir}/${build.id}.sysdef_GenxmlMerge.log.status.html" />
+                            <signalInput refid="canonicalSysDefFailSignalInput" >
+                                <notifierInput>
+                                    <fileset dir="${build.log.dir}" >
+                                        <include name="**/${build.id}.sysdef_GenxmlMerge.log*" />
+                                    </fileset>
+                                </notifierInput>
+                            </signalInput>
                         </signalNotifierInput>
                     </hlm:signal>
                 </then>
@@ -233,7 +241,8 @@
         <attribute name="dir"/>
         <attribute name="annodetail"/>
         <attribute name="root"/> 
-        <attribute name="failonerror"/> 
+        <attribute name="failonerror"/>
+        <attribute name="phase"/>
           self.setTaskName("emake");
           // check attributes
           if (attributes.get("name") == null)
@@ -244,6 +253,7 @@
           self.log("Makefile: " + attributes.get("makefile"));
           String target = "all";
           String custom = "";
+          String annofileDir = "";
           if (attributes.get("target") != null)
             target = attributes.get("target");
           self.log("Target: " + target);
@@ -253,10 +263,12 @@
             root = attributes.get("root");
           else
             root = "";
+          
           self.log("Custom: " + custom);
 
       // Create and configure exec target
           org.apache.tools.ant.taskdefs.ExecTask task = new org.apache.tools.ant.taskdefs.ExecTask();
+          task.setProject(self.getProject());
           task.setTaskName(self.getTaskName());
           String emake = com.nokia.ant.util.Helper.getProperty(project, "ec.emake");          
           task.setExecutable(emake);
@@ -285,9 +297,15 @@
             self.log("--emake-root=" + eroot + ";" + heliumDir + ";" + root);
           }         
           task.createArg().setValue("--emake-root=" + eroot + ";" + heliumDir + ";" + root);
+          if (attributes.get("phase") != null) {
+            annofileDir = com.nokia.ant.util.Helper.getProperty(project, "build.log.dir") + "/" + attributes.get("phase");
+          }
+          else {
+            annofileDir = com.nokia.ant.util.Helper.getProperty(project, "build.log.dir");  
+          }
           if (attributes.get("annodetail") != null) {
             task.createArg().setValue("--emake-annodetail=" + attributes.get("annodetail"));            
-            task.createArg().setValue("--emake-annofile=" + com.nokia.ant.util.Helper.getProperty(project, "build.log.dir") + "/" + buildId + "-" + attributes.get("name") + ".anno.xml");
+            task.createArg().setValue("--emake-annofile=" + annofileDir + "/" + buildId + "-" + attributes.get("name") + ".emake.anno.xml");
           }
           task.createArg().setLine(custom);
           task.createArg().setLine("-f " + attributes.get("makefile"));
--- a/buildframework/helium/tools/compile/ebs/ebs.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/compile/ebs/ebs.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -43,9 +43,9 @@
     <!-- Executes compilation of a System Definition configuration using Symbian EBS tools. -->
     <target name="compile-ebs" if="build.system.ebs" depends="set-arm-version">    
         <hlm:assertFileExists file="${genxml.output.file}"/>
-        <hlm:compileEbsMacro input="${genxml.output.file}" log="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log" />
+        <hlm:compileEbsMacro input="${genxml.output.file}" log="${compile.log.dir}/${build.id}.${sysdef.configuration}_compile.log" />
         <!-- calculate below only if metadata is enabled, error is calculated before the signal is being sent.-->
-        <hlm:calculateErrorsFromLog logfile="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log" />
+        <hlm:calculateErrorsFromLog logfile="${compile.log.dir}/${build.id}.${sysdef.configuration}_compile.log" />
     </target>
 
     
@@ -69,7 +69,7 @@
             </for>
             <preset.exec executable="perl" dir="${build.drive}/" failonerror="true">
                 <arg value="epoc32/tools/build/buildserver.pl"/>
-                <arg line="-d ${genxml.output.file} -p ${ebs.port.number} -l ${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log"/>
+                <arg line="-d ${genxml.output.file} -p ${ebs.port.number} -l ${compile.log.dir}/${build.id}.${sysdef.configuration}_compile.log"/>
             </preset.exec>
         </parallel>
     </target>
--- a/buildframework/helium/tools/compile/ec/ec.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/compile/ec/ec.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -29,6 +29,7 @@
     <property name="ec.makefile.file" location="${build.drive}/Makefile"/>
 
     <property name="ec.sysdef2make" location="${helium.dir}/tools/compile/ec/sysdef2make.pl"/>
+    <property name="ec.sysdef2make.cmdline" value="-forcemake ((abld.*\-(w|what|c|check))|(abld.*resource))" />
     
     <property name="ec.historyfile" value="${build.drive}/emake.data"/>
     <property name="ec.mem.limit" value="1000000000"/>
@@ -41,12 +42,12 @@
     <!-- Converting cononical SDF into a Makefile. -->
     <target name="compile-genxml-ec" if="build.system.ec-helium">
         <!-- Using now the official script for GTI. -->
-        <exec executable="perl" dir="${build.drive}/" error="${build.log.dir}/${build.id}.${sysdef.configuration}.sysdef2make.log" failonerror="${failonerror}">
-            <arg line="${ec.sysdef2make} -n ${sysdef.configuration} -s ${env.EPOCROOT} -forcemake ((abld.*\-(w|what|c|check))|(abld.*resource)) ${canonical.sysdef.file}"/>
+        <exec executable="perl" dir="${build.drive}/" error="${compile.log.dir}/${build.id}.${sysdef.configuration}.sysdef2make.log" failonerror="${failonerror}">
+            <arg line="${ec.sysdef2make} -n ${sysdef.configuration} -s ${env.EPOCROOT} ${ec.sysdef2make.cmdline} ${canonical.sysdef.file}"/>
         </exec>
         <hlm:metadatarecord database="${metadata.dbfile}">
             <hlm:textmetadatainput>
-                <fileset casesensitive="false" file="${build.log.dir}/${build.id}.${sysdef.configuration}.sysdef2make.log"/>
+                <fileset casesensitive="false" file="${compile.log.dir}/${build.id}.${sysdef.configuration}.sysdef2make.log"/>
                 <metadatafilterset refid="filterset.genxml.ec" />
             </hlm:textmetadatainput>
         </hlm:metadatarecord>
@@ -283,8 +284,8 @@
         <echo>Cleaning up the logs....</echo>
         <exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}">
             <arg line="${helium.dir}/tools/compile/ec/ec_whatcheck.pl"/>
-            <redirector input="${build.log.dir}/${build.id}.${sysdef.configuration}_build_output.log"
-                output="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log"/>
+            <redirector input="${compile.log.dir}/${build.id}.${sysdef.configuration}_build_output.log"
+                output="${compile.log.dir}/${build.id}.${sysdef.configuration}_compile.log"/>
         </exec>
     </target>
 
@@ -308,13 +309,13 @@
         <echo>emake debug flag: ${emake_debug_flag}</echo>
 
         <echo>Building ${sysdef.configuration}....</echo>
-        <echo file="${build.log.dir}/${build.id}.${sysdef.configuration}_run_emake.bat" level="info">
+        <echo file="${temp.build.dir}/${build.id}.${sysdef.configuration}_run_emake.bat" level="info">
 set
-${ec.emake} --emake-build-label=${build.id}.${sysdef.configuration} --emake-class=${ec.build.class} --emake-priority=normal --emake-maxagents=${ec.maxagents} --emake-job-limit=0 --emake-mem-limit=${ec.mem.limit} --emake-history=${ec.history.option} --emake-annodetail=basic,history,file,waiting --emake-annofile=${build.log.dir}\${build.id}.${sysdef.configuration}.emake.anno.xml --emake-historyfile=${ec.historyfile} --emake-debug=${emake_debug_flag} --emake-logfile=${build.log.dir}\${build.id}.${sysdef.configuration}.emake.g.dlog --emake-root=%EMAKE_ROOT%;${helium.dir} --emake-autodepend=1 -k -i -f ${build.drive}/${sysdef.configuration}.make LOGBUILDTIME=&quot;&quot; VERBOSE=&quot;&quot; SAVESPACE=&quot;&quot; ${sysdef.configuration}
+${ec.emake} --emake-build-label=${build.id}.${sysdef.configuration} --emake-class=${ec.build.class} --emake-priority=normal --emake-maxagents=${ec.maxagents} --emake-job-limit=0 --emake-mem-limit=${ec.mem.limit} --emake-history=${ec.history.option} --emake-annodetail=basic,history,file,waiting --emake-annofile=${compile.log.dir}\${build.id}.${sysdef.configuration}.emake.anno.xml --emake-historyfile=${ec.historyfile} --emake-debug=${emake_debug_flag} --emake-logfile=${compile.log.dir}\${build.id}.${sysdef.configuration}.emake.g.dlog --emake-root=%EMAKE_ROOT%;${helium.dir} --emake-autodepend=1 -k -i -f ${build.drive}/${sysdef.configuration}.make LOGBUILDTIME=&quot;&quot; VERBOSE=&quot;&quot; SAVESPACE=&quot;&quot; ${sysdef.configuration}
         </echo>
 
-        <exec executable="${build.log.dir}/${build.id}.${sysdef.configuration}_run_emake.bat"
-              dir="${build.drive}/" output="${build.log.dir}/${build.id}.${sysdef.configuration}_build_output.log"
+        <exec executable="${temp.build.dir}/${build.id}.${sysdef.configuration}_run_emake.bat"
+              dir="${build.drive}/" output="${compile.log.dir}/${build.id}.${sysdef.configuration}_build_output.log"
               failonerror="${failonerror}">
             <env key="SYMBIANBUILD_DEPENDENCYOFF" value="1" />
         </exec>
@@ -323,9 +324,9 @@
         <antcall target="compile-ec-logs"/>
 
         <!-- Testing everything happens correctly. -->
-        <hlm:assertFileExists file="${build.log.dir}/${build.id}.${sysdef.configuration}_run_emake.bat"/>
-        <hlm:assertFileExists file="${build.log.dir}/${build.id}.${sysdef.configuration}_build_output.log"/>
-        <hlm:assertFileExists file="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log"/>
-        <hlm:calculateErrorsFromLog logfile="${build.log.dir}/${build.id}.${sysdef.configuration}_compile.log" />
+        <hlm:assertFileExists file="${temp.build.dir}/${build.id}.${sysdef.configuration}_run_emake.bat"/>
+        <hlm:assertFileExists file="${compile.log.dir}/${build.id}.${sysdef.configuration}_build_output.log"/>
+        <hlm:assertFileExists file="${compile.log.dir}/${build.id}.${sysdef.configuration}_compile.log"/>
+        <hlm:calculateErrorsFromLog logfile="${compile.log.dir}/${build.id}.${sysdef.configuration}_compile.log" />
     </target>
 </project>
--- a/buildframework/helium/tools/compile/ec/sysdef2make.pl	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/compile/ec/sysdef2make.pl	Wed Dec 23 19:29:07 2009 +0200
@@ -63,7 +63,7 @@
 use XML::DOM;
 
 my @userFilters = ();
-my @forceMakeCommands = ("abld.*\-(w|what|c|check)[^a-zA-Z0-9]");
+my @forceMakeCommands = ("abld.*\-(w|what|c|check|checkwhat|cw)[^a-zA-Z0-9]");
 my $file = "";
 my $pathPrefix = "";
 
@@ -203,8 +203,13 @@
              $bldFile !~ m{^\Q$pathPrefix\E}i ) {
             $bldFile = $pathPrefix.$bldFile;
         }
-        # Set bldFile to the unitID
-        $bldFiles{$unitID} = $bldFile ;
+        if (-d $bldFile) {
+	        # Set bldFile to the unitID
+    	    $bldFiles{$unitID} = $bldFile;
+        } else {
+            print(STDERR "ERROR: could not find $bldFile.\n");
+            next;
+        }
 
         # Set the default priority
         if ( ! $priority ) {
@@ -464,7 +469,7 @@
                     # It is more important to relay the -keepgoing to abld export
                     # than try to protect the environment from user who uses abldOption wrong
                     if ( @{$options{$executable.'Option'}} &&
-                         $command !~ m{abld.*\-(w|what|c|check)\s}i ) {
+                         $command !~ m{abld.*\-(w|what|c|check|checkwhat|cw)\s}i ) {
                         $option =" \$(".$executable."Option)";
                     }
 
--- a/buildframework/helium/tools/compile/qt/qt.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/compile/qt/qt.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -25,32 +25,10 @@
     Qt build support.
     </description>
     
-    <property name="qt.dir" location="${build.drive}/qt"/>
-    <property name="qt.configure.log.name" value="${build.id}_configure-qt.log"/>
     <property name="qt.qmake.ant.template" location="${helium.dir}/tools/compile/qt/templates/run-qmake.ant.xml.ftl" />
     <property name="qt.qmake.makefile.template" location="${helium.dir}/tools/compile/qt/templates/run-qmake.mk.ftl" />
     <property name="qt.configure.args" value="-platform win32-mwc -xplatform symbian-abld -confirm-license"/>
-    <property name="qt.qmake.default.args" value="-platform symbian-abld -r"/>
-    
-    <!-- This target will run the configure tool under Qt (qt.dir) in order to create the
-        qmake tool and configure the Qt project for symbian building.
-        <deprecated>This target and its configuration are not maintained anymore, please consider building Qt using 
-         Symbian toolchain.</deprecated> 
-     -->
-    <target name="configure-qt">
-        <hlm:recordStartMacro name="${qt.configure.log.name}"/>
-        <exec dir="${qt.dir}" executable="${qt.dir}/configure.exe" failonerror="false">
-            <arg line="${qt.configure.args}"/>
-        </exec>
-        <hlm:recordStopMacro name="${qt.configure.log.name}"/>
-        <hlm:metadatarecord database="${metadata.dbfile}">
-            <hlm:textmetadatainput>
-                <fileset casesensitive="false" file="${build.log.dir}/${qt.configure.log.name}"/>
-                <metadatafilterset refid="filterset.qt.configure" />
-            </hlm:textmetadatainput>
-        </hlm:metadatarecord>
-        <hlm:generateBuildStatus file="${qt.configure.log.name}" />
-    </target>
+    <property name="qt.qmake.default.args" value="-r"/>
 
     <!--
         Executing qmake on all Qt components defined under the system definition file.
@@ -76,10 +54,11 @@
     
                 <!-- Running the qmake steps -->
                 <hlm:emakeMacro name="run-qmake-${sysdef.configuration}" makefile="${temp.build.dir}/run-qmake-${sysdef.configuration}.mk"
-                    target="all" dir="${build.drive}/" log="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.log"
+                    target="all" dir="${build.drive}/" log="${compile.log.dir}/${build.id}_${sysdef.configuration}.qmake.log"
                     annodetail="basic,history,file,waiting"
-                    failonerror="false" />
-                <hlm:assertFileExists file="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.log" />
+                    failonerror="false" 
+                    phase="compile"/>
+                <hlm:assertFileExists file="${compile.log.dir}/${build.id}_${sysdef.configuration}.qmake.log" />
             </then>
             <else>
                 <fmpp sourceFile="${qt.qmake.ant.template}"
@@ -93,32 +72,26 @@
     
                 <!-- Running the qmake steps -->
                 <ant antfile="${temp.build.dir}/run-qmake-${sysdef.configuration}.ant.xml" dir="${build.drive}/"
-                    output="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.log"/>
-                <hlm:assertFileExists file="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.log" />
+                    output="${compile.log.dir}/${build.id}_${sysdef.configuration}.qmake.log"/>
+                <hlm:assertFileExists file="${compile.log.dir}/${build.id}_${sysdef.configuration}.qmake.log" />
             </else>
         </if>
-        <copy file="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.log" tofile="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.generated.txt">
+        <copy file="${compile.log.dir}/${build.id}_${sysdef.configuration}.qmake.log" tofile="${compile.log.dir}/${build.id}_${sysdef.configuration}.qmake.generated.txt">
             <filterchain>
                 <linecontainsregexp>
                     <regexp pattern="Generating"/>
                 </linecontainsregexp>
             </filterchain>
         </copy>
-        <replaceregexp file="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.generated.txt" match="^\s*(?:\[exec\])?\s*Generating[^/\\]*." replace="" byline="true"/>
-        <hlm:assertFileExists file="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.generated.txt"/>
+        <replaceregexp file="${compile.log.dir}/${build.id}_${sysdef.configuration}.qmake.generated.txt" match="^\s*(?:\[exec\])?\s*Generating[^/\\]*." replace="" byline="true"/>
+        <hlm:assertFileExists file="${compile.log.dir}/${build.id}_${sysdef.configuration}.qmake.generated.txt"/>
         <hlm:metadatarecord database="${metadata.dbfile}">
             <hlm:textmetadatainput>
-                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_${sysdef.configuration}.qmake.log" />
-                <metadatafilterset>
-                    <metadatafilter priority="error" regex="^Error processing project file:" description="qt error" />
-                    <metadatafilter priority="error" regex="^'.*' is not recognized as an internal or external command," description="qt error" />
-                    <metadatafilter priority="error" regex="^Result: [1-9][0-9]*" description="qt error" />
-                    <metadatafilter priority="warning" regex="^WARNING:" description="qt error" />
-                    <metadatafilter priority="info" regex="INFO:" description="qt error" />
-                </metadatafilterset>
+                <fileset casesensitive="false" file="${compile.log.dir}/${build.id}_${sysdef.configuration}.qmake.log" />
+                <metadatafilterset refid="filterset.qmake" />
             </hlm:textmetadatainput>
         </hlm:metadatarecord>
         <hlm:signalMacro logfile="${build.id}_${sysdef.configuration}.qmake.log" 
-            signal.input="signalRunQMakeInput" />
+            signal.input="signalRunQMakeInput" phase="compile"/>
     </target>
 </project>
--- a/buildframework/helium/tools/compile/sbs/sbs.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/compile/sbs/sbs.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -72,140 +72,133 @@
         </sequential>
     </macrodef>
 
-    <if>
-        <not>
-            <isset property="sbs.config"/>
-        </not>
-        <then>
-            <property name="sbs.config" value="armv5" />
-            <property name="sbs.tools.config" value="tools_rel" />
-        </then>
-    </if>
-
-    <import file="sbs.settings.ant.xml" />
-
     <!-- SBS build with gmake as engine type. Default is using sbs macro, to use old implementation to
     use using exec task, then sbs.using.exec needs to be set. -->
     <target name="compile-sbs" description="This is the main build that gets built for ARMV5 and WINSCW platforms">
+        <!-- only temporary once config file option starts to work, then no 
+        need to copy the plugin file -->
+
         <if>
             <or>
                 <equals arg1="${build.system}" arg2="sbs" />
                 <equals arg1="${build.system}" arg2="sbs-ec" />
             </or>
             <then>
-                <!-- Choosing the right command (either clean or normal command) and 
-                    the default command if no input is specified for sbs -->
-                <var name="sbs.cmd.reference" value="sbs" />
-                <var name="sbs.make.reference" value="${build.system}.make.options" />
-                <hlm:sbsMakeOptions id="sbs.internal.make.options" refid="${sbs.make.reference}" />
-                <if>
-                    <istrue value="${compile.cmd.clean}"/>
-                    <then>
-                        <var name="sbs.cmd.reference" value="${sbs.cmd.reference}.clean" />
-                    </then>
-                </if>
-                <if>
-                    <not>
-                        <isreference refid="${sbs.cmd.reference}.var"/>
-                    </not>
-                    <then>
-                        <var name="sbs.cmd.reference" value="${sbs.cmd.reference}.default" />
-                    </then>
-                </if>
-                <if>
-                    <not>
-                        <isreference refid="${sbs.make.reference}"/>
-                    </not>
-                    <then>
-                        <hlm:sbsMakeOptions id="sbs.internal.make.options" refid="${sbs.make.reference}.default" />
-                    </then>
-                </if>
-                <var name="sbs.cmd.reference" value="${sbs.cmd.reference}.var" />
-                <echo message="sbs build:${env.SBS_HOME}/python/plugins/filter_heliumlog.py" />
-
-                <!-- Generate the filtered layers -->
-                <hlm:generate-layers />
-
-                <!-- run arm license checking / setting arm version only for arm config --> 
-                <hlm:getVariableValue name="config" property="compilevalue.var">
-                    <hlm:argSet refid="${sbs.cmd.reference}" />
-                </hlm:getVariableValue>
-                <if>
-                    <not>
-                        <equals arg1="${compilevalue.var}" arg2="winscw"/>
-                    </not>
-                    <then>
-                        <runtarget target="set-arm-version"/>
-                    </then>
-                </if>
-
-                <!-- only temporary once config file option starts to work, then no 
-                need to copy the plugin file -->
-
                 <echo message="Copying helium filter plugin to sbs home" />
                 <copy file="${helium.dir}/tools/common/python/scripts/filter_metadatalog.py" todir="${env.SBS_HOME}/python/plugins/" failonerror="true" />
                 <copy file="${helium.dir}/tools/common/python/scripts/sbsscanlogmetadata.py" todir="${env.SBS_HOME}/python/plugins/" failonerror="true" />
-
-
-                <echo>Building with SBSv2</echo>
-                <echo message="build.drive:${build.drive}"/>
-                <echo message="build.log.dir:${build.log.dir}"/>
-                <echo message="sysdef.configuration:${sysdef.configuration}"/>
-                <echo message="canonical.sysdef.file:${canonical.sysdef.file}"/>
-                <echo message="env.SBS_HOME:${env.SBS_HOME}"/>
-                <!-- Implicit calls to tools configuration, for temporary once the sbs is working
-                    to execte all configuration at the same time, this could be removed. -->
-                <if>
-                    <istrue value="${sbs.implicit.tools.build}" />
-                    <then>
-                        <echo message="Implicit tools configuration build" />
-                        <hlm:sbsCompileMacro cmdreference = "sbs.implicit.tools.var" />
-                    </then>
-                </if>
-                <hlm:sbsCompileMacro cmdreference = "${sbs.cmd.reference}" />
+                <echo message="sbs.patternset: ${sbs.patternset}" />
+                <hlm:generate-layers />
+                <var name="sbs.inputs.list" value="" unset="true"/>
+                <hlm:getsbsinputs config="sbs.${sysdef.configuration}" outputProperty="sbs.inputs.list"/>
+                <for list="${sbs.inputs.list}" delimiter="," param="sbs.input">
+                    <sequential>
+                        <echo message="building raptor input: @{sbs.input}" />
+                        <hlm:getVariableValue name="--logfile" property="sbs.log.file">
+                            <hlm:sbsinput refid="@{sbs.input}" />
+                        </hlm:getVariableValue>
+                        <!-- run arm license checking / setting arm version only for arm config -->
+                        <hlm:getVariableValue name="-c" property="compilevalue.var" failOnerror="false">
+                            <hlm:sbsinput refid="@{sbs.input}" />
+                        </hlm:getVariableValue>
+                        <echo message="config parameter -c : ${compilevalue.var}" />
+                        <if>
+                            <and>
+                                <isset property="compilevalue.var"/>
+                                <matches string="${compilevalue.var}" pattern="arm.*"/>
+                            </and>
+                            <then>
+                                <runtarget target="set-arm-version"/>
+                            </then>
+                        </if>
+                        <var name="sbs.clean.log" value="${sbs.log.file}.clean.log"/>
+                        <!-- Generate the filtered layers -->
+                        <hlm:sbstask sbsinput="@{sbs.input}" sysdefFile="${build.drive}/output/build/canonical_system_definition_${sysdef.configuration}.xml" 
+                            layerPatternSetRef="${sbs.patternset}" errorOutput="${sbs.log.file}.sbs_error.log" 
+                            workingDir="${build.drive}/" failOnError="false" outputLog="${sbs.log.file}" cleanLog = "${sbs.clean.log}"
+                             statsLog="${compile.log.dir}/${build.id}_${sysdef.configuration}.info.xml" />
+                        <!-- run arm license checking / setting arm version only for arm config --> 
+                        <echo message="sbs.log.file: ${sbs.log.file}" />
+                        <hlm:sbsProcessOutputMacro sbs.log.file="${sbs.log.file}"
+                            sbs.clean.log.file="${sbs.clean.log}"  sbs.stats.file="${compile.log.dir}/${build.id}_${sysdef.configuration}.info.xml"
+                            sbs.ant.output.file="${sbs.log.file}" sbs.error.output.file="${sbs.log.file}.sbs_error.log"/>
+                    </sequential>
+                </for>
+                <hlm:assertFileExists file="${sbs.log.file}.sbs_error.log"/>
+                <hlm:assertFileExists file="${compile.log.dir}/${build.id}_${sysdef.configuration}.info.xml"/>
+                <hlm:assertFileExists file="${sbs.log.file}"/>
+                <hlm:assertFileExists file="${sbs.clean.log}"/>
             </then>
         </if>
     </target>
 
-    <macrodef name="sbsCompileMacro" uri="http://www.nokia.com/helium">
-        <attribute name="cmdreference" />
+    <macrodef name="sbsProcessOutputMacro" uri="http://www.nokia.com/helium">
+        <attribute name="sbs.clean.log.file" />
+        <attribute name="sbs.log.file" />
+        <attribute name="sbs.stats.file" />
+        <attribute name="sbs.error.output.file" />
+        <attribute name="sbs.ant.output.file" />
         <sequential>
-            <var name="sbs.log.file" value="" unset="true"/>
-            
-            <delete file="${build.log.dir}/${build.id}.${sysdef.configuration}_sbs_info.xml" failonerror="false"/>
-            <!-- sbs.log.file set by sbs tool execution, temporary -->
-            <hlm:toolMacro name="sbs">
-                <hlm:toolvarset refid="@{cmdreference}"/>
-            </hlm:toolMacro>
-            
+            <var name="sbs.scan2.template" value="scan2.html.ftl" />
+            <basename property="base.sbs.log" file="@{sbs.log.file}" suffix=".log"/>
+            <hlm:metadatarecord database="${metadata.dbfile}">
+                <hlm:textmetadatainput>
+                    <fileset casesensitive="false" file="@{sbs.error.output.file}"/>
+                    <metadatafilterset refid="filterset.sbs" />
+                </hlm:textmetadatainput>
+            </hlm:metadatarecord>
+            <basename property="base.sbs.ant.output.log" file="@{sbs.ant.output.file}" />
+            <hlm:signalMacro logfile="@{sbs.error.output.file}" 
+                signal.input="raptorErrorSignalInput" phase="compile"/>
             <!-- update the resultes to database -->
-            <hlm:assertFileExists file="${build.log.dir}/${build.id}.${sysdef.configuration}_sbs_info.xml"/>
             <echo message="Metadata enabled, storing build status in database" />
-            <echo message="sbs log file :${sbs.log.file}" />
-            <hlm:metadatarecord database="${metadata.dbfile}">
-                <hlm:sbsmetadatainput>
-                    <fileset casesensitive="false" file="${sbs.log.file}"/>
-                    <metadatafilterset refid="filterset.sbs" />
-                </hlm:sbsmetadatainput>
-            </hlm:metadatarecord>
-            <basename property="base.sbs.log.file" file="${sbs.log.file}" suffix=".log"/>
-            <echo message="base sbs log file :${base.sbs.log.file}" />
-            <fmpp sourceFile="${helium.dir}/tools/common/templates/log/scan2.html.ftl"
-                         outputfile="${sbs.log.file}.scan2.html">
+            <echo message="sbs log file :@{sbs.log.file}" />
+            <echo message="sbs.clean.log.file :@{sbs.clean.log.file}" />
+            <trycatch property="hlm-sbs.parser.thrown">
+                <try>
+                    <hlm:metadatarecord database="${metadata.dbfile}">
+                        <hlm:sbsmetadatainput cleanLogFile="@{sbs.clean.log.file}">
+                            <fileset casesensitive="false" file="@{sbs.log.file}"/>
+                            <metadatafilterset refid="filterset.sbs" />
+                        </hlm:sbsmetadatainput>
+                    </hlm:metadatarecord>
+                </try>
+                <catch>
+                    <if>
+                        <istrue value="${skip.sbs.parser.exception}" />
+                        <then>
+                            <var name="sbs.scan2.template" value="scan2_text.html.ftl" />
+                            <hlm:metadatadelete database="${metadata-read-db}">
+                                <fileset casesensitive="false" file="@{sbs.log.file}"/>
+                            </hlm:metadatadelete>
+                            <hlm:metadatarecord database="${metadata-read-db}" >
+                                <hlm:textmetadatainput>
+                                    <fileset casesensitive="false" file="@{sbs.log.file}"/>
+                                </hlm:textmetadatainput>
+                            </hlm:metadatarecord>
+                        </then>
+                        <else>
+                            <fail message="failed during raptor log parsing: might be due to invalid xml output from raptor" />
+                        </else>
+                    </if>
+                </catch>
+            </trycatch>
+            <fmpp sourceFile="${helium.dir}/tools/common/templates/log/${sbs.scan2.template}"
+                         outputfile="@{sbs.log.file}.scan2.html">
                 <freemarkerLinks expandProperties="yes">
                     macro: ${helium.dir}/tools/common/templates/macro
                 </freemarkerLinks>
                 <data expandProperties="yes">
                     dbPath: ${metadata.dbfile}
-                    doc: xml(${build.log.dir}/${build.id}.${sysdef.configuration}_sbs_info.xml)
+                    doc: xml(@{sbs.stats.file})
                     ant: antProperties()
                 </data>
             </fmpp>
             <echo message="generating signal" />
-            <hlm:assertFileExists file="${sbs.log.file}.scan2.html"/>
-            <hlm:calculateErrorsFromLog logfile="${sbs.log.file}" />
-            <hlm:compileLogSignalMacro compile.summary.file="${base.sbs.log.file}" 
-                error.limit="${build.errors.limit}"/>
+            <hlm:assertFileExists file="@{sbs.log.file}.scan2.html"/>
+            <hlm:calculateErrorsFromLog logfile="@{sbs.log.file}" />
+            <hlm:compileLogSignalMacro compile.summary.file="${base.sbs.log}" 
+                error.limit="${build.errors.limit}" phase="compile"/>
             <!-- Blocks packaging configuration generation. -->
             <if>
                 <istrue value="${blocks.enabled}" />
@@ -226,11 +219,4 @@
             </if>
         </sequential>
     </macrodef>
-
-    <!-- Get the supported configuration(armv5, winscw) from system definition file.  This is 
-    temporary and will be moved to get values from carbon tool. -->
-    <target name="get-sbs-configs">
-        <hlm:getSBSConfigMacro sbs.sysdef.file="${canonical.sysdef.file}"/>
-        <echo message="configs:${sbs.configs}"/>
-    </target>
-</project>
+</project>
\ No newline at end of file
--- a/buildframework/helium/tools/compile/sbs/sbs.settings.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-============================================================================ 
-Name        : sbs.ant.xml 
-Part of     : Helium 
-
-Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-All rights reserved.
-This component and the accompanying materials are made available
-under the terms of the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<project name="compile.sbs.settings" xmlns:hlm="http://www.nokia.com/helium">
-    <description>
-        sbs default settings input.
-    </description>
-
-    <if>
-        <not>
-            <isset property="sbs.config"/>
-        </not>
-        <then>
-            <property name="sbs.config" value="armv5" />
-            <property name="sbs.tools.config" value="tools_rel" />
-        </then>
-    </if>
-
-    <hlm:argSet id="sbs.default.var">
-        <hlm:arg name="config" value="${sbs.config}" />
-        <hlm:arg name="enable-filter" value="true" />
-    </hlm:argSet>
-
-    <hlm:argSet id="sbs.clean.default.var">
-        <hlm:arg name="config" value="${sbs.config}" />
-        <hlm:arg name="command" value="REALLYCLEAN" />
-        <hlm:arg name="enable-filter" value="true" />
-    </hlm:argSet>
-
-    <hlm:sbsMakeOptions engine="emake" id="sbs-ec.make.options.default">
-        <hlm:makeOption name="--emake-emulation" value="gmake" />
-        <hlm:makeOption name="--emake-annodetail" value="basic,history,waiting" />
-        <hlm:makeOption name="--emake-class" value="${ec.build.class}"/>
-    </hlm:sbsMakeOptions>
-
-    <hlm:argSet id="sbs.implicit.tools.var">
-        <hlm:arg name="config" value="${sbs.tools.config}" />
-        <hlm:arg name="enable-filter" value="true" />
-    </hlm:argSet>
-
-    <hlm:sbsMakeOptions engine="gmake" id="sbs.make.options.default"/>
-</project>
--- a/buildframework/helium/tools/compile/sbs/test/test_sbs.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/compile/sbs/test/test_sbs.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,80 +21,62 @@
 
 ============================================================================
 -->
-<project name="test_sbs" xmlns:hlm="http://www.nokia.com/helium">
+<project name="test_sbs" xmlns:hlm="http://www.nokia.com/helium" xmlns:au="antlib:org.apache.ant.antunit" >
     <description>
     Used to test get variable and checking its value for SBS build config data.
     </description>
-    <property environment="env" />
-    <property name="helium.dir" location="../../../.." />
-    <import file="../../../../helium.ant.xml" />
-    <property name="sbs.tools.config" value="tools_rel" />
+
+    <taskdef resource="com/nokia/helium/sbs/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
     
+    <hlm:sbsinput id="test-sbs-armv5">
+        <sbsOptions>
+            <arg line="-c armv5" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="test-sbs-winscw">
+        <sbsOptions>
+            <arg line="-c winscw" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+    <hlm:sbsinput id="test-sbs-both">
+        <sbsOptions>
+            <arg line="-c winscw -c armv5" />
+        </sbsOptions>
+    </hlm:sbsinput>
+
+
     <!-- test the variable sbs.config set to armv5 and check it calls the set-arm-version-test
     target so that I can check the code to do the get variable and read it works properly. -->
     <target name="test-sbs-armv5">
-        <hlm:argSet id="sbs.config">
-            <hlm:arg name="config" value="armv5" />
-        </hlm:argSet>
-        <echo>message="config = ${sbs.config}"</echo>
-        <runtarget target="compile-sbs-test"/>
+        <hlm:getVariableValue name="-c" property="compilevalue.var">
+            <hlm:sbsinput refid="test-sbs-armv5" />
+        </hlm:getVariableValue>
+        <au:assertTrue>
+            <matches string="${compilevalue.var}" pattern="arm.*"/>
+        </au:assertTrue>
     </target>
 
     <!-- test the variable sbs.config set to winscw and check it does not call the set-arm-version-test
     target so that I can check the code to do the get variable and read it works properly. -->
     <target name="test-sbs-winscw">
-        <hlm:argSet id="sbs.config">
-            <hlm:arg name="config" value="winscw" />
-        </hlm:argSet>
-        <runtarget target="compile-sbs-test"/>
+        <hlm:getVariableValue name="-c" property="compilevalue.var">
+            <hlm:sbsinput refid="test-sbs-winscw" />
+        </hlm:getVariableValue>
+        <au:assertFalse>
+            <matches string="${compilevalue.var}" pattern="arm.*"/>
+        </au:assertFalse>
     </target>
 
     <!-- test the variable sbs.config set to armv5,winscw and check it calls the set-arm-version-test
     target so that I can check the code to do the get variable and read it works properly. -->
     <target name="test-sbs-both">
-        <hlm:argSet id="sbs.config">
-            <hlm:arg name="config" value="armv5,winscw" />
-        </hlm:argSet>
-        <runtarget target="compile-sbs-test"/>
-    </target>
-
-    <!-- test the variable sbs.config set to all valid values and that it behaves as above. -->
-    <target name="test-sbs-all">
-        <runtarget target="test-sbs-armv5"/>
-        <runtarget target="test-sbs-winscw"/>
-        <runtarget target="test-sbs-both"/>
-    </target>
-
-    <!-- call this to use the sbs.config value set in the build.xml file (if set). -->
-    <target name="test-sbs-build">
-        <runtarget target="compile-sbs-test"/>
+        <hlm:getVariableValue name="-c" property="compilevalue.var">
+            <hlm:sbsinput refid="test-sbs-both" />
+        </hlm:getVariableValue>
+        <au:assertTrue>
+            <matches string="${compilevalue.var}" pattern="arm.*"/>
+        </au:assertTrue>
     </target>
-    
-    
-    <!-- test the variable sbs.config if set to anyhting other than winscw check it calls the set-arm-version-test
-    if set to winscw then it should not call set-arm-version-test. -->
-    <target name="compile-sbs-test" description="This is the main build that gets built for ARMV5 and WINSCW platforms">
-        <hlm:getVariableValue name="config" property="compilevalue.var">
-            <hlm:argSet refid="sbs.default.var" />
-        </hlm:getVariableValue>
-        <echo> stick in an extra line</echo>
-        <echo> message="sbs.config = ${sbs.config}"</echo>
-        <echo> message="compilevalue.var = ${compilevalue.var}"</echo>
-        <if>
-            <not>
-                <equals arg1="${compilevalue.var}" arg2="winscw"/>
-            </not>
-            <then>
-                <runtarget target="set-arm-version-test"/>
-                <echo>running set-arm-version-test</echo>
-            </then>
-        </if>
-        <echo>in the main body of target</echo>
-    </target>
-
-    <!-- just to confirm the if/then/else is working correctly -->
-    <target name="set-arm-version-test">
-        <echo>running set-arm-version-test yippee!!!!</echo>
-    </target>
-  
-</project>
\ No newline at end of file
+</project>
--- a/buildframework/helium/tools/compile/sis.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/compile/sis.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -23,6 +23,8 @@
 <project name="compile.sis" xmlns:hlm="http://www.nokia.com/helium">
     <description>Create SIS files.</description>
     
+    <property name="sis.config.name" value=""/>
+    
     <!-- Preprocesses the SIS configuration file to insert Ant properties. -->
     <target name="preprocess-sis-config" if="sis.config.file">
         <property name="sis.config.file.parsed" location="${build.output.dir}/sis.cfg.xml.parsed" />
@@ -38,20 +40,21 @@
     <target name="sisfiles" depends="preprocess-sis-config" if="sis.config.file">
         <hlm:tempRecordStartMacro name="${build.id}_sisfiles.log"/>        
         <mkdir dir="${build.sisfiles.dir}" />
+        <delete file="${temp.build.dir}/sis_build.ant.xml" failonerror="false"/>
         <hlm:python>
 import configuration
 import sis
 import os
 
 builder = configuration.NestedConfigurationBuilder(open(r'${sis.config.file.parsed}', 'r'))
-configSet = builder.getConfiguration()
-configs = configSet.getConfigurations()
+config_set = builder.getConfiguration()
+config_name = r'${sis.config.name}' if (len(r'${sis.config.name}') > 0) else None
 
-prebuilder = sis.SisPreBuilder(configSet)
+prebuilder = sis.SisPreBuilder(config_set, config_name)
 prebuilder.write(os.path.join(r'${temp.build.dir}', 'sis_build.ant.xml'))
         </hlm:python>
         <ant antfile="${temp.build.dir}/sis_build.ant.xml"/>
-        <hlm:tempRecordStopMacro name="${build.id}_sisfiles.log" filterref="filterset.sisfiles"/>
+        <hlm:tempRecordStopMacro name="${build.id}_sisfiles.log" filterref="filterset.sisfiles" phase="post"/>
         <hlm:metadatarecord xmlns:hlm="http://www.nokia.com/helium" database="${metadata.dbfile}">
             <hlm:textmetadatainput>
                 <fileset casesensitive="false" file="${build.cache.log.dir}/${build.id}_sisfiles.log"/>
@@ -62,3 +65,5 @@
 
 </project>
 
+
+
--- a/buildframework/helium/tools/compile/util/ini2sysdef.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,111 +0,0 @@
-#============================================================================ 
-#Name        : ini2sysdef.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-
-import os
-import sys
-import shutil
-import string
-
-
-if __name__ == "__main__":
-    argc = len(sys.argv)
-    if argc >= 4 or argc < 2:
-        print 'Simple tool for one-time converting ini-files to SystemDefinitions'
-        print 'remeber to manually edit the outputs'
-        print 'usage:', sys.argv[0], 'infile [outfile] '
-        sys.exit(1)
-
-
-    filename = sys.argv[1]
-##    r"C:\USERS\work\systemdefinitionXML\spp_config\build\spp_convcom.ini"
-    if argc == 3:
-        filename2 =  sys.argv[2]
-    else:
-        filename2, ext = os.path.splitext(filename)
-        filename2 += ".xml"
-    print "outfilename is %s" % filename2
-
-    
-
-    ##r"C:\USERS\work\systemdefinitionXML\spp_config\build\spp_convcom.xml"
-    #filename = "logparse_rules.txt"
-
-    file = open (filename,"r")
-    global DATA
-    DATA = file.readlines()
-
-    try:
-        shutil.copyfile("spp_dtd.xml", filename2)
-    except:
-        pass
-    
-    outfile = open(filename2,"a")
-    component = ""
-    compname = ""
-    bld_path = ""
-    
-    outfile.write('<SystemDefinition name="spp_SystemModel" schema="1.4.0">\n')
-    outfile.write('  <systemModel>\n')
-    outfile.write('<layer name="%s">\n' % filename)
-    outfile.write('  <logicalset name="%s">\n'   % filename)
-
-
-    #print DATA
-    for line in DATA:
-        if '[' in line:
-            if not component == "":
-                #the first one
-                outfile.write('</component> \n')
-                outfile.write('</module> \n')
-            component = line.split('[')[1].split(']')[0]
-            print "we have component here : ",  component
-
-            outfile.write('<module name="%s"> \n' % component.strip())
-        if "name" in line:
-            compname = line.split('=')[1]
-#            print "we have  name here : ",  compname
-            outfile.write('<component name="%s"> \n' % compname.strip())
-        if "bld_path" in line:
-            bldpath = line.split('=')[1]
-            bldpath = bldpath.strip()
-            bldpath = bldpath.strip('\\')
-            bldpath = bldpath.replace('<', '')
-            bldpath = bldpath.replace('>', '')
-            
-            
-            
-#            print "we have path here : ",  bldpath
-            outfile.write('<unit unitID="%s_%s"  name="%s" bldFile="%s" mrp=""/> \n' % 
-                          (os.path.basename(filename), component.strip(), compname.strip(), bldpath.strip()))
-
-
-
-    print "finishing"
-    outfile.write('</component> \n')
-    outfile.write('</module> \n')
-    outfile.write('    </logicalset>\n')
-    outfile.write('    </layer>\n')
-    
-    outfile.write('  </systemModel>\n')
-    outfile.write('</SystemDefinition>\n')
-
-
-    
-    outfile.close()    
--- a/buildframework/helium/tools/compile/util/txt2sysdef.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-#============================================================================ 
-#Name        : txt2sysdef.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-
-import os
-import os.path
-import sys
-import shutil
-import string
-
-
-if __name__ == "__main__":
-    argc = len(sys.argv)
-    if argc >= 4 or argc < 2:
-        print 'Simple tool for one-time converting txt-files to SystemDefinitions'
-        print 'remeber to manually edit the outputs'
-        print 'usage:', sys.argv[0], 'infile [outfile] '
-        sys.exit(1)
-
-
-    filename = sys.argv[1]
-
-    if argc == 3:
-        filename2 =  sys.argv[2]
-    else:
-        filename2, ext = os.path.splitext(filename)
-        filename2 += ".xml"
-    print "outfilename is %s" % filename2
-
-    
-
-
-    file = open (filename,"r")
-    global DATA
-    DATA = file.readlines()
-
-    try:
-        shutil.copyfile("dtd.xml", filename2)
-    except:
-        pass
-    
-    outfile = open(filename2,"a")
-    component = ""
-    compname = ""
-    bld_path = ""
-    
-    outfile.write('<SystemDefinition name="SystemModel" schema="1.4.0">\n')
-    outfile.write('  <systemModel>\n')
-    outfile.write('<layer name="%s">\n' % os.path.basename(filename))
-
-
-    #print DATA
-    for line in DATA:
-        # ignore outcommented lines in input 
-        if '#Components' in line:
-            continue
-        if 'Component' in line:
-            try:
-                # we are expecting lines "Component /path/to/named/group componentName"
-                component, bldpath, comname =  line.split()
-                print ("prosessing component %s \n" % comname.strip())
-                outfile.write('<unit unitID="%s_%s"  name="%s" bldFile="%s" mrp=""/> \n' % 
-                              (os.path.basename(filename), comname.strip(), comname.strip(), bldpath.strip()))
-            except:
-                print ("Problems with Line:\n %s\n" % line)
-
-
-    print "finishing"
-    outfile.write('</component> \n')
-    outfile.write('</module> \n')
-    outfile.write('    </layer>\n')
-    
-    outfile.write('  </systemModel>\n')
-    outfile.write('</SystemDefinition>\n')
-
-    outfile.close()    
--- a/buildframework/helium/tools/iad/iad.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/iad/iad.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,7 +21,9 @@
 ============================================================================
 -->
 <project name="iad">
-    
+    <description>
+        Targets related to iad
+    </description>
     <!-- Target to generate IAD sis packages. -->
     <target name="makeiadsis">
         <echo message="Building IAD SIS packages"/>
--- a/buildframework/helium/tools/iad/packageiad.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/iad/packageiad.py	Wed Dec 23 19:29:07 2009 +0200
@@ -16,6 +16,9 @@
 #
 #Description:
 #===============================================================================
+
+""" packageIAD.py module """
+
 import os
 import sys
 import xml.dom.minidom
@@ -23,12 +26,17 @@
 import zipfile
 import encodings.utf_8
 
+
 class IADPackager :
-
-    def __init__ (self) :
+    """ package IAD class "
+    """
+    
+    def __init__(self) :
+        """ class init method """
         self.hasStub = False
 
-    def getBldDirs (self, layer, bldDirs) :
+    def getBldDirs(self, layer, bldDirs) :
+        """ get the list of build directories """
         units = layer.getElementsByTagName ("unit")
         for unit in units :
             dir = unit.getAttribute ("bldFile").rstrip ('\\/')
@@ -37,31 +45,33 @@
                 i = dir.rfind ("/")
             bldDirs.append (dir[:i + 1])
     
-    def getLayer (self, configuration, layers, bldDirs) :
+    def getLayer(self, configuration, layers, bldDirs) :
+        """ get each layer info """
         layerRef = configuration.getElementsByTagName ("layerRef")[0].getAttribute ("layerName")
         for layer in layers :
             if layer.getAttribute ("name") == layerRef :
                 self.getBldDirs (layer, bldDirs)
     
-    def createInfoFiles (self, sisInfo) :
+    def createInfoFiles(self, sisInfo) :
+        """ create the INfo files depends.xml etc."""
         depends = xml.dom.minidom.parse ("depends.xml")
         info = xml.dom.minidom.parseString (sisInfo)
         
         infoFile = file ("sisinfo.xml", "w")
-        platDeps = info.getElementsByTagName("platform_dependency")
         packageDeps = info.getElementsByTagName("package_dependency")
         for packageDep in packageDeps :
-            p = depends.createElement ("package")
-            depends.childNodes[1].appendChild (p)
+            pack = depends.createElement ("package")
+            depends.childNodes[1].appendChild (pack)
             for child in packageDep.childNodes :
-                p.appendChild (child)
+                pack.appendChild (child)
         infoFile.write (info.toxml ())
         infoFile.close()
         depFile = file ("depends.xml", "w")
         depFile.write (depends.toxml ())
         depFile.close()
     
-    def createSis (self, packageDir, packageName) :
+    def createSis(self, packageDir, packageName, makesis) :
+        """ create the .sis file """
         sisReader = iadinfo.IADHandler()
         os.chdir (packageDir)
         sisPackage = packageName + ".sis"
@@ -69,14 +79,15 @@
         print "Creating", sisPackage
         cmd = makesis + " package.pkg " + sisPackage
         os.system (cmd)
-        self.createInfoFiles (sisReader.getInfo (sisPackage))
+        self.createInfoFiles (sisReader.getInfo(sisPackage))
         if os.path.exists(stubPackage) :
             print "Creating stub SIS file", stubPackage
             self.hasStub = True
             cmd = makesis + " -s package.pkg " + stubPackage
             os.system (cmd)
         
-    def createPackage (self, topDir, packageName) :
+    def createPackage(self, topDir, packageName) :
+        """ create the Data Package """
         print "Creating package", packageName
         os.chdir (topDir)
         zipFile = packageName + ".zip"
@@ -93,27 +104,31 @@
         zip.close()
         
     
-    def processSisDir (self, sisDir) :
-        for root, dirs, files in os.walk (sisDir):
+    def processSisDir(self, sisDir, makesis) :
+        """ handle the directory used to create the .sis file """
+        for root, dirs, _ in os.walk (sisDir):
             for name in dirs :
-                self.createSis (os.path.join (root, name), name)
+                self.createSis (os.path.join (root, name), name, makesis)
                 self.createPackage (root, name)
 
-makesis = sys.argv[3] + "\\epoc32\\tools\\makesis.exe"
-signsis = sys.argv[3] + "\\epoc32\\tools\\signsis.exe"
-
-sysdef = xml.dom.minidom.parse (sys.argv[1])
-configurations = sysdef.getElementsByTagName ("configuration")
-layers = sysdef.getElementsByTagName ("layer")
-bldDirs = []
+def main(sysdefFile, sysdefconfigs, bldDrive):
+    """ main to called when imported """
+    makesis = bldDrive + "\\epoc32\\tools\\makesis.exe"
+    
+    sysdef = xml.dom.minidom.parse (sysdefFile)
+    configurations = sysdef.getElementsByTagName ("configuration")
+    layers = sysdef.getElementsByTagName ("layer")
+    bldDirs = []
+    
+    packager = IADPackager()
+    
+    for configuration in configurations :
+        if configuration.getAttribute ("name") == sysdefconfigs :
+            packager.getLayer (configuration, layers, bldDirs)
+     
+    
+    for bldDir in bldDirs :
+        packager.processSisDir (bldDrive + bldDir + "sis\\", makesis)
 
-packager = IADPackager()
-
-for configuration in configurations :
-    if configuration.getAttribute ("name") == sys.argv[2] :
-        packager.getLayer (configuration, layers, bldDirs)
- 
-
-for bldDir in bldDirs :
-    packager.processSisDir (sys.argv[3] + bldDir + "sis\\")
-
+if __name__ == "__main__":
+    main(sys.argv[1], sys.argv[2], sys.argv[3])
--- a/buildframework/helium/tools/integration/integration.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/integration/integration.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,13 +21,12 @@
 ============================================================================
 -->
 <project name="integration" xmlns:hlm="http://www.nokia.com/helium">
-
+    <description>
+        Targets related to integration
+    </description>
     <!-- include overlay validation/merge tools -->    
     <import file="validate_overlay/validate_overlay.ant.xml" />
 
-    <!-- Template build, this is usefull if you want to generate automatically files for many products quickly. -->
-    <import file="template-builder/template-builder.ant.xml" />
-
     <import file="patching.ant.xml" />
 
 </project>
--- a/buildframework/helium/tools/integration/template-builder/template-builder.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-============================================================================ 
-Name        : template-builder.ant.xml 
-Part of     : Helium 
-
-Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-All rights reserved.
-This component and the accompanying materials are made available
-under the terms of the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<project name="template-builder" xmlns:hlm="http://www.nokia.com/helium">
-    <description>
-        This target provides support to replace properties from a text file
-        using values from the ROM image configuration. 
-    </description>
-
-    <!--
-        This target provides support to replace properties from a text file
-        using values from the ROM image configuration. 
-         <deprecated>ROM building implementation will change in future release of Helium.</deprecated>
-    -->
-    <target name="template-builder" depends="rombuild-prepare-input">        
-        <hlm:python>
-import configuration
-import integration.templatebuilder
-import os
-import logging
-            
-# Enabling info outputing.
-logging.basicConfig(level=logging.INFO)
-
-configBuilder = configuration.NestedConfigurationBuilder(open(r'${rombuild.config.file.parsed}', 'r'))
-configSet = configBuilder.getConfiguration()
-for product in r'${product.list}'.split(','):
-    builder = integration.templatebuilder.TemplateBuilder(configSet, product)
-    builder.build()    
-        </hlm:python>
-    </target>
-</project>
--- a/buildframework/helium/tools/integration/validate_overlay/validate_overlay.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/integration/validate_overlay/validate_overlay.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -39,31 +39,20 @@
             <arg line="${prep.config.file.parsed}"/>                         
             <arg line="${build.cache.dir}/validate_overlay.input.xml"/>
         </preset.exec>
-        
         <hlm:python>
-import nokia.nokiaccm
 import sys
 import validateoverlay
 import ant
 import traceback
+import ccmutil
 session = None
 try:
-    database = ant.get_property(r'${ccm.database}')
-    username = ant.get_property(r'${ccm.user.login}')
-    password = ant.get_property(r'${ccm.user.password}')
-    engine = ant.get_property(r'${ccm.engine.host}')
-    dbpath = ant.get_property(r'${ccm.database.path}')
-    if database != None:
-        session = nokia.nokiaccm.open_session(username, password, database=database)
-    else:
-        session = nokia.nokiaccm.open_session(username, password, engine, dbpath)
-
-    objects = validateoverlay.get_additional_delivery_objects(session, ant.get_property(r'${prep.delivery.conf.parsed}'))
-    # overlay validation
-    #validate(session, inputfile, overlaydir, showBranchInfo, createtask=False, releasetag=None, extra_objects=[]):    
-    validateoverlay.validate(session, ant.get_property(r'${build.cache.dir}/validate_overlay.input.xml'), ant.get_property(r'${common.overlay.dir}'), True, False, None, objects, r'${build.cache.dir}\validate_overlay')
-    
-    session.close()
+    session = ccmutil.get_session(ant.get_property(r'${ccm.database}'), ant.get_property(r'${ccm.user.login}'), ant.get_property(r'${ccm.user.password}'), ant.get_property(r'${ccm.engine.host}'), ant.get_property(r'${ccm.database.path}'))
+    if session is not None:
+        objects = validateoverlay.get_additional_delivery_objects(session, ant.get_property(r'${prep.delivery.conf.parsed}'))
+        #overlay validation
+        validateoverlay.validate(session, ant.get_property(r'${build.cache.dir}/validate_overlay.input.xml'), ant.get_property(r'${common.overlay.dir}'), True, False, None, objects, r'${build.cache.dir}\validate_overlay')
+        session.close()
 except Exception, e:
     print "ERROR: %s" % e
     print traceback.format_exc()
@@ -94,27 +83,19 @@
             <arg line="${build.cache.dir}/validate_overlay.input.xml"/>                     
         </preset.exec>
         <hlm:python>
-import nokia.nokiaccm
 import sys
 import validateoverlay
 import ant
 import traceback
+import ccmutil
 session = None
 try:
-    database = ant.get_property(r'${ccm.database}')
-    username = ant.get_property(r'${ccm.user.login}')
-    password = ant.get_property(r'${ccm.user.password}')
-    engine = ant.get_property(r'${ccm.engine.host}')
-    dbpath = ant.get_property(r'${ccm.database.path}')
-    if database != None:
-        session = nokia.nokiaccm.open_session(username, password, database=database)
-    else:
-        session = nokia.nokiaccm.open_session(username, password, engine, dbpath)
-    objects = validateoverlay.get_additional_delivery_objects(session, ant.get_property(r'${prep.delivery.conf.parsed}'))
-    # overlay validation    
-    validateoverlay.validate(session, ant.get_property(r'${build.cache.dir}/validate_overlay.input.xml'), ant.get_property(r'${common.overlay.dir}'), True, True, 'mc/integration', objects, r'${build.cache.dir}\validate_overlay')    
-    
-    session.close()
+    session = ccmutil.get_session(ant.get_property(r'${ccm.database}'), ant.get_property(r'${ccm.user.login}'), ant.get_property(r'${ccm.user.password}'), ant.get_property(r'${ccm.engine.host}'), ant.get_property(r'${ccm.database.path}'))
+    if session is not None:
+        objects = validateoverlay.get_additional_delivery_objects(session, ant.get_property(r'${prep.delivery.conf.parsed}'))
+        # overlay validation    
+        validateoverlay.validate(session, ant.get_property(r'${build.cache.dir}/validate_overlay.input.xml'), ant.get_property(r'${common.overlay.dir}'), True, True, 'mc/integration', objects, r'${build.cache.dir}\validate_overlay')    
+        session.close()
 except Exception, e:
     print "ERROR: %s" % e
     print traceback.format_exc()
--- a/buildframework/helium/tools/localisation/localisation-32.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/localisation/localisation-32.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -65,6 +65,7 @@
         <attribute name="force" default="false"/>
         <sequential>
             <mkdir dir="${build.log.dir}"/>
+            <mkdir dir="${localisation.log.dir}"/>            
             <if>
                 <and>
                     <available file="${zips.loc.dir}/delta_@{variant}_package.zip" />
@@ -88,30 +89,30 @@
                     <hlm:compileGenxmlMacro input="-x ${canonical.sysdef.file}"
                                           configuration="${s60.delta.config.prefix}@{variant}${internal.variant.type}"
                                           output="${build.drive}\epoc32\tools\s60tools\variant_build_@{variant}${internal.variant.type}.xml"
-                                          log="${build.log.dir}/${build.id}.variant_build_@{variant}${internal.variant.type}_genxml.log"/>
+                                          log="${localisation.log.dir}/${build.id}.variant_build_@{variant}${internal.variant.type}_genxml.log"/>
 
                     <echo>Building ${build.drive}\epoc32\tools\s60tools\variant_build_@{variant}${internal.variant.type}.xml</echo>
-                    <hlm:compileEbsMacro input="${build.drive}\epoc32\tools\s60tools\variant_build_@{variant}${internal.variant.type}.xml" log="${build.log.dir}/${build.id}.@{variant}${internal.variant.type}_compile.log" />
-                    <hlm:compileHtmlscanlogMacro input="${build.log.dir}/${build.id}.@{variant}${internal.variant.type}_compile.log" output="${build.log.dir}/${build.id}.@{variant}${internal.variant.type}_scan2.html" />
+                    <hlm:compileEbsMacro input="${build.drive}\epoc32\tools\s60tools\variant_build_@{variant}${internal.variant.type}.xml" log="${localisation.log.dir}/${build.id}.@{variant}${internal.variant.type}_compile.log" />
+                    <hlm:compileHtmlscanlogMacro input="${localisation.log.dir}/${build.id}.@{variant}${internal.variant.type}_compile.log" output="${build.log.dir}/${build.id}.@{variant}${internal.variant.type}_scan2.html" />
                     
                     <if>
                         <istrue value="@{ctool}"/>
                         <then>
                             <property name="ctool.region.@{variant}" value="@{variant}"/>
                             <echo>Region ctool: ${ctool.region.@{variant}} (@{variant}).</echo>
-                            <preset.exec executable="cmd" dir="${ctool.dir}/" failonerror="true" output="${build.log.dir}/${build.id}.configtool_@{variant}_log.txt">
-                                <arg line="/c cli_build.cmd ${ctool.@{variant}.conf} -report ${build.log.dir}/${build.id}.configtool_@{variant}_delta.txt -ignore_errors"/>
+                            <preset.exec executable="cmd" dir="${ctool.dir}/" failonerror="true" output="${localisation.log.dir}/${build.id}.configtool_@{variant}_log.txt">
+                                <arg line="/c cli_build.cmd ${ctool.@{variant}.conf} -report ${localisation.log.dir}/${build.id}.configtool_@{variant}_delta.txt -ignore_errors"/>
                             </preset.exec>
                         </then>
                     </if>
                     <preset.exec executable="perl" dir="${build.drive}/" failonerror="true">
                         <arg value="${parse_abld_what.tool}"/>
-                        <arg line="-i ${build.log.dir}/${build.id}.@{variant}${internal.variant.type}_compile.log -filter \epoc32 -zip ${zips.loc.dir}/delta_@{variant}_package -ex productvariant.hrh"/>
+                        <arg line="-i ${localisation.log.dir}/${build.id}.@{variant}${internal.variant.type}_compile.log -filter \epoc32 -zip ${zips.loc.dir}/delta_@{variant}_package -ex productvariant.hrh"/>
                     </preset.exec>
                     <if>
                         <istrue value="@{ctool}"/>
                         <then>
-                            <preset.exec executable="${build.drive}\epoc32\tools\zip.exe" dir="${build.drive}/" input="${build.log.dir}/${build.id}.configtool_@{variant}_delta.txt">
+                            <preset.exec executable="${build.drive}\epoc32\tools\zip.exe" dir="${build.drive}/" input="${localisation.log.dir}/${build.id}.configtool_@{variant}_delta.txt">
                                 <arg line="-r -u ${zips.loc.dir}/delta_@{variant}_package -@"/>
                             </preset.exec>
                         </then>
@@ -133,24 +134,25 @@
         <attribute name="ctool" default="false"/>
         <sequential>
             <mkdir dir="${zips.loc.dir}"/>
+            <mkdir dir="${localisation.log.dir}"/>
             <for list="@{configs}" delimiter="," param="conf" >
                 <sequential>
                     <if>
                         <istrue value="@{ctool}"/>
                         <then>
-                            <preset.exec executable="cmd" dir="${ctool.dir}/" failonerror="true" output="${build.log.dir}/${build.id}.configtool_western_log.txt">
-                                <arg line="/c cli_build.cmd ${ctool.western.conf} -report ${build.log.dir}/${build.id}.configtool_western_delta.txt -ignore_errors"/>
+                            <preset.exec executable="cmd" dir="${ctool.dir}/" failonerror="true" output="${localisation.log.dir}/${build.id}.configtool_western_log.txt">
+                                <arg line="/c cli_build.cmd ${ctool.western.conf} -report ${localisation.log.dir}/${build.id}.configtool_western_delta.txt -ignore_errors"/>
                             </preset.exec>
                         </then>
                     </if>
                     <preset.exec executable="perl" dir="${build.drive}/" failonerror="true">
                         <arg value="${parse_abld_what.tool}"/>
-                        <arg line="-i ${build.log.dir}/${build.id}.@{conf}_compile.log -filter \epoc32 -zip ${zips.loc.dir}/delta_western_package -ex productvariant.hrh"/>
+                        <arg line="-i ${compile.log.dir}/${build.id}.@{conf}_compile.log -filter \epoc32 -zip ${zips.loc.dir}/delta_western_package -ex productvariant.hrh"/>
                     </preset.exec>
                     <if>
                         <istrue value="@{ctool}"/>
                         <then>
-                            <preset.exec executable="${build.drive}\epoc32\tools\zip.exe" dir="${build.drive}/" input="${build.log.dir}/${build.id}.configtool_western_delta.txt">
+                            <preset.exec executable="${build.drive}\epoc32\tools\zip.exe" dir="${build.drive}/" input="${localisation.log.dir}/${build.id}.configtool_western_delta.txt">
                                 <arg line="-r -u ${zips.loc.dir}/delta_western_package -@"/>
                             </preset.exec>
                         </then>
@@ -166,6 +168,7 @@
     -->
     <target name="localisation-postbuild-western">
         <mkdir dir="${zips.loc.dir}"/>
+        <mkdir dir="${localisation.log.dir}"/>
 
         <antcall target="compile-main">
             <param name="sysdef.configurations.list" value="S60_bldmelast" />
@@ -173,7 +176,7 @@
 
         <preset.exec executable="perl" dir="${build.drive}/" failonerror="true">
             <arg value="${parse_abld_what.tool}"/>
-            <arg line="-i ${build.log.dir}/${build.id}.S60_bldmelast_compile.log -filter \epoc32 -zip ${zips.loc.dir}/delta_western_package -ex productvariant.hrh"/>
+            <arg line="-i ${compile.log.dir}/${build.id}.S60_bldmelast_compile.log -filter \epoc32 -zip ${zips.loc.dir}/delta_western_package -ex productvariant.hrh"/>
         </preset.exec>
         <copy file="${build.drive}\epoc32\release\ARMV5\urel\elocl.dll" tofile="${build.drive}\epoc32\release\ARMV5\urel\elocl.01" />
         <copy file="${build.drive}\epoc32\release\ARMV5\udeb\elocl.dll" tofile="${build.drive}\epoc32\release\ARMV5\udeb\elocl.01" />
@@ -189,6 +192,7 @@
         <deprecated>This feature is now supported by iMaker, please update your  Makefile templates to migrate the language data from XML.</deprecated>
     -->
     <target name="localisation-create-languagepack" depends="rombuild-prepare-input">
+        <mkdir dir="${localisation.log.dir}"/>
         <for list="${product.list}" delimiter="," param="product.name" >
             <sequential>
                 <echo>Language Pack configuration for @{product.name}</echo>
@@ -272,11 +276,12 @@
     
     <!-- Localisation configuration -->
     <target name="localisation-create-config">
-        <record name="${build.log.dir}/${build.id}_localisation_config.log" action="start"/>
+        <mkdir dir="${localisation.log.dir}"/>
+        <hlm:record name="${localisation.log.dir}/${build.id}_localisation_config.log" action="start"/>
         <antcall target="localisation-create-languagepack" />
         <antcall target="localisation-create-cenrep" />
         <copy file="${helium.dir}/tools/localisation/templates/rom/mc_variant_imaker.oby" todir="${build.drive}/epoc32/rom"/>
-        <record name="${build.log.dir}/${build.id}_localisation_config.log" action="stop"/>
+        <hlm:record name="${localisation.log.dir}/${build.id}_localisation_config.log" action="stop"/>
     </target>
 
     <!-- Localise resources using either EC / EBS based on build system type-->
@@ -307,7 +312,7 @@
         <!-- localisation build cleanup -->
         <echo message="isis_EClocaliser.pl -b=${localisation.region}_${localisation.buildfile} -state=2 -dest=&quot;${zips.loc.dir}&quot; -h" />
         <exec executable="perl" dir="${build.drive}/" failonerror="${failonerror}">
-            <arg line="${build.drive}/epoc32/tools/isis_EClocaliser.pl ${localisation.files} ${localisation.files.region} -b=${build.log.dir}/${build.id}.${localisation.region}_${localisation.buildfile} -state=2 -c=&quot;${localisation.languages}&quot; -dest=&quot;${zips.loc.dir}&quot; -s60locfiles=&quot;${localisation.s60locfiles.dir}&quot; -l=&quot;${localisation.log}&quot; -nolocal -k"/>
+            <arg line="${build.drive}/epoc32/tools/isis_EClocaliser.pl ${localisation.files} ${localisation.files.region} -b=${temp.build.dir}/${build.id}.${localisation.region}_${localisation.buildfile} -state=2 -c=&quot;${localisation.languages}&quot; -dest=&quot;${zips.loc.dir}&quot; -s60locfiles=&quot;${localisation.s60locfiles.dir}&quot; -l=&quot;${localisation.log}&quot; -nolocal -k"/>
         </exec>
     </target>
 
@@ -336,7 +341,7 @@
         <for list="${isis_mktarget.list}" delimiter="," param="mktarget">
             <sequential>
                 <hlm:recordStartMacro name="@{mktarget}.log" emacsmode="true"/>
-                <hlm:emakeMacro name="localisation" makefile="${build.drive}/${localisation.region}_${localisation.buildfile}.make" target="@{mktarget}" dir="${build.drive}/" annodetail="basic,history,file,waiting"/>
+                <hlm:emakeMacro name="localisation" makefile="${build.drive}/${localisation.region}_${localisation.buildfile}.make" target="@{mktarget}" dir="${build.drive}/" annodetail="basic,history,file,waiting" phase="localisation"/>
                 <hlm:recordStopMacro name="@{mktarget}.log"/>
             </sequential>
         </for>
@@ -355,7 +360,7 @@
     
     <!-- Build localised content -->
     <target name="localisation-build" depends="rombuild-prepare-input">
-        <record name="${build.log.dir}/${build.id}_localisation_build.log" action="start"/>
+        <hlm:record name="${localisation.log.dir}/${build.id}_localisation_build.log" action="start"/>
         <copy file="${parse_abld_what.tool}" todir="${build.drive}/epoc32/tools/s60tools" failonerror="false"/>
         <mkdir dir="${zips.loc.dir}"/>    
         
@@ -395,7 +400,7 @@
                 </for>
             </sequential>
         </for>
-        <record name="${build.log.dir}/${build.id}_localisation_build.log" action="stop"/>
+        <hlm:record name="${localisation.log.dir}/${build.id}_localisation_build.log" action="stop"/>
     </target>
     
     
@@ -403,8 +408,9 @@
         Target to rebuild locales 
         This could be useful for incremental changes/test.
     -->
-    <target name="localisation-create-locales"> 
-        <record name="${build.log.dir}/${build.id}_create_locales.log" action="start"/>
+    <target name="localisation-create-locales">
+        <mkdir dir="${localisation.log.dir}"/>
+        <hlm:record name="${localisation.log.dir}/${build.id}_create_locales.log" action="start"/>
         
         <!-- get all variation available -->    
         <exec executable="python" outputproperty="localisation.variation" dir="${build.drive}/" failonerror="${failonerror}">
@@ -435,14 +441,15 @@
                 </for>
             </sequential>
         </for>
-        <record name="${build.log.dir}/${build.id}_create_locales.log" action="stop"/>
+        <hlm:record name="${localisation.log.dir}/${build.id}_create_locales.log" action="stop"/>
     </target>    
 
     
     <!-- Creates localised rom images -->
     <target name="localisation-roms" depends="rombuild-create-makefile,flash-config-file"> 
+        <mkdir dir="${localisation.log.dir}"/>
         <!-- get product path -->
-        <record name="${build.log.dir}/${build.id}_localisation_roms.log" action="start"/>
+        <hlm:record name="${localisation.log.dir}/${build.id}_localisation_roms.log" action="start"/>
         <hlm:preECImakerMacro/>
         <for list="${product.list}" delimiter="," param="product.name" >
             <sequential>
@@ -450,15 +457,16 @@
             </sequential>
         </for>
         <hlm:ecImakerMacro makefile.target="${localisation.makefile.target}" />
-        <record name="${build.log.dir}/${build.id}_localisation_roms.log" action="stop"/>
-        <hlm:logextract file="${build.log.dir}/${build.id}_localisation_roms.log"/>
+        <hlm:record name="${localisation.log.dir}/${build.id}_localisation_roms.log" action="stop"/>
+        <hlm:logextract file="${localisation.log.dir}/${build.id}_localisation_roms.log"/>
     </target>
 
     
     <!-- Creates customer rom images -->
     <target name="customer-roms" depends="rombuild-create-makefile,flash-config-file"> 
+        <mkdir dir="${localisation.log.dir}"/>
         <!-- get product path -->
-        <record name="${build.log.dir}/${build.id}_customer_roms.log" action="start"/>
+        <hlm:record name="${localisation.log.dir}/${build.id}_customer_roms.log" action="start"/>
         <hlm:preECImakerMacro/>
         <for list="${product.list}" delimiter="," param="product.name" >
             <sequential>
@@ -466,8 +474,8 @@
             </sequential>
         </for>
         <hlm:ecImakerMacro makefile.target="${customer.makefile.target}" />
-        <record name="${build.log.dir}/${build.id}_customer_roms.log" action="stop"/>
-        <hlm:logextract file="${build.log.dir}/${build.id}_customer_roms.log"/>
+        <hlm:record name="${localisation.log.dir}/${build.id}_customer_roms.log" action="stop"/>
+        <hlm:logextract file="${localisation.log.dir}/${build.id}_customer_roms.log"/>
     </target>
 
     
--- a/buildframework/helium/tools/localisation/localisation-50.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/localisation/localisation-50.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -32,11 +32,12 @@
             This target launch the localisation of DTD files. 
             This is handled by the DTDLocaliser.pl script from S60.  
     --> 
-    <target name="localisation-dtd"> 
+    <target name="localisation-dtd">
+        <mkdir dir="${localisation.log.dir}"/>
         <exec dir="${build.drive}/" executable="perl.exe" failonerror="false"> 
             <arg value="${build.drive}/epoc32/tools/DTDLocaliser.pl"/> 
             <arg value="-l"/> 
-            <arg value="${build.log.dir}/${build.id}.dtd_localisation.log}"/> 
+            <arg value="${localisation.log.dir}/${build.id}.dtd_localisation.log}"/> 
         </exec> 
     </target> 
      
--- a/buildframework/helium/tools/localisation/localisation.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/localisation/localisation.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,7 +21,9 @@
 ============================================================================
 -->
 <project name="localisation">
-
+    <description>
+        Localisation
+    </description>
     <import file="localisation-50.ant.xml" />
     <import file="localisation-32.ant.xml" />
 
--- a/buildframework/helium/tools/localisation/localiser/ECLocaliser.pm	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/localisation/localiser/ECLocaliser.pm	Wed Dec 23 19:29:07 2009 +0200
@@ -273,7 +273,7 @@
 
 		while (<RDRFH>)
 		{
-				if ( /^\s*<option (\w+)>/ )
+				if ( /^\s*<option ([A-Za-z0-9\.]+)>/ )				
 				{
 					my $option = lc($1);
 					$self->{ __platform }->{ $option } = $option; # if ($option =~ /^(armv5|winscw)$/i);
@@ -1484,7 +1484,9 @@
 				{
 					my $uf = $f;
 					$uf =~ s/\.(mmp|mk)$//i;
-					if ( $uf =~ m/$mmp$/i )
+					# Following reqular expression is changed to match with strings starting with a slash or backslash
+					# in order to prevent similarly ending but unidentical files to match with each other.
+					if ( $uf =~ m/[\/\\]$mmp$/i )
 					{
 						__OUT::Print ("  + Found '$mmp' match => '$f'\n");
 						$self->{__mmpstype}->{$mmp}->{path} = $f;
@@ -1810,7 +1812,7 @@
 		# if distination file exist then clear read flag
 		if (-f $dist)
 		{
-				chmod ($dist , 0755);
+				chmod (0755 , $dist);
 		}
 		else
 		{
--- a/buildframework/helium/tools/preparation/bom/bom.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/preparation/bom/bom.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -27,16 +27,13 @@
     
     <property name="create.bom.workarea.root" value="."/> 
     
-    <!-- The target create-bom creates a Bill-Of-Material based on the Synergy project 
+    <!-- The target create-bom creates a Bill-Of-Material based on the SCM project 
     The target can be run in the project's root directory or the directory can be given by
     setting the property create.bom.workarea.root. The IDO builds are expected to set it to their 
     projects work area directory. -->
-    <target name="create-bom" depends="get-ccm-password,old-bom-log,ccm-prepare-input,prep-prepare-input" if="prep.delivery.file">
-        <if>
-            <isset property="run.ccm"/>
-            <then>
-                <hlm:startSpecificLogMacro name="${build.log.dir}/${build.id}_bom.log" regexp="${ccm.user.password}"/>
-                <hlm:python>
+    <target name="create-bom" depends="get-ccm-password,old-bom-log,ccm-prepare-input,prep-prepare-input">
+        <hlm:startSpecificLogMacro name="${prep.log.dir}/${build.id}_bom.log" regexp="${ccm.user.password}" phase="prep"/>
+        <hlm:python>
 import os
 import build.model
 import configuration
@@ -48,6 +45,7 @@
 
 session = None
 try:
+    runccm = ant.get_property(r'${run.ccm}')
     database = ant.get_property(r'${ccm.database}')
     username = ant.get_property(r'${ccm.user.login}')
     password = ant.get_property(r'${ccm.user.password}')
@@ -56,38 +54,45 @@
     waroot = ant.get_property(r'${create.bom.workarea.root}')
     buildid = ant.get_property(r'${build.id}')
     buildlogdir = ant.get_property(r'${build.log.dir}')
-    cache = None
-    if ant.get_property(r'${ccm.cache.xml}') is not None:
-        cache = str(ant.get_property(r'${ccm.cache.xml}'))
-    provider = ccm.extra.CachedSessionProvider(opener=nokia.nokiaccm.open_session, cache=cache)
-        
-    configBuilder = configuration.NestedConfigurationBuilder(open(ant.get_property(r'${prep.delivery.conf.parsed}'), 'r'))
-    configSet = configBuilder.getConfiguration()
-    for config in configSet.getConfigurations():
-        waroot = config['dir']
-        print "Found wa for project %s" % waroot
-                    
-    if database != None:
-        session = provider.get(username, password, database=database)
-    else:
-        session = provider.get(username, password, engine, dbpath)
+    deliveryfile = ant.get_property(r'${prep.delivery.conf.parsed}')
+    oldbom = ant.get_property(r'${old.bom.log}')
+    bom = None
+    bomfilename = r"%s/%s_bom.xml" % (buildlogdir, buildid)
+    if runccm and deliveryfile:
+        cache = None
+        if ant.get_property(r'${ccm.cache.xml}') is not None:
+            cache = str(ant.get_property(r'${ccm.cache.xml}'))
+        provider = ccm.extra.CachedSessionProvider(opener=nokia.nokiaccm.open_session, cache=cache)
+            
+        configBuilder = configuration.NestedConfigurationBuilder(open(deliveryfile, 'r'))
+        configSet = configBuilder.getConfiguration()
+        for config in configSet.getConfigurations():
+            waroot = config['dir']
+            print "Found wa for project %s" % waroot
+                        
+        if database != None:
+            session = provider.get(username, password, database=database)
+        else:
+            session = provider.get(username, password, engine, dbpath)
+            
+        ccmproject =  ccm.extra.get_toplevel_project(session, waroot)
         
-    ccmproject =  ccm.extra.get_toplevel_project(session, waroot)
-    
-    config_data = {'delivery': ant.get_property(r'${prep.delivery.conf.parsed}'), 'prep.xml': ant.get_property(r'${prep.config.file.parsed}'), 'build.id': buildid, 'ccm.database': database, 'symbian_rel_week': ant.get_property(r'${symbian.version.week}'), 'symbian_rel_ver': ant.get_property(r'${symbian.version}'), 'symbian_rel_year': ant.get_property(r'${symbian.version.year}'), 's60_version': ant.get_property(r'${s60.version}'), 's60_release': ant.get_property(r'${s60.release}'), 'currentRelease.xml': ant.get_property(r'${build.drive}') + "/currentRelease.xml"}
-    config = configuration.Configuration(config_data)
-    
-    bom = None
-    # let's only support the new spec model!
-    bom = build.model.BOM(config, ccmproject, username=username, password=password, provider=provider)
-    
-    xml_writer = build.model.BOMXMLWriter(bom)
-    xml_writer.write(r"%s/%s_bom.xml" % (buildlogdir, buildid))
-    
-    if os.path.exists(ant.get_property(r'${old.bom.log}')):
-        xml_delta_writer = build.model.BOMDeltaXMLWriter(bom, ant.get_property(r'${old.bom.log}'))
+        config_data = {'delivery': deliveryfile, 'prep.xml': ant.get_property(r'${prep.config.file.parsed}'), 'build.id': buildid, 'ccm.database': database, 'symbian_rel_week': ant.get_property(r'${symbian.version.week}'), 'symbian_rel_ver': ant.get_property(r'${symbian.version}'), 'symbian_rel_year': ant.get_property(r'${symbian.version.year}'), 's60_version': ant.get_property(r'${s60.version}'), 's60_release': ant.get_property(r'${s60.release}'), 'currentRelease.xml': ant.get_property(r'${build.drive}') + "/currentRelease.xml"}
+        config = configuration.Configuration(config_data)
+        
+        # let's only support the new spec model!
+        bom = build.model.SynergyBOM(config, ccmproject, username=username, password=password, provider=provider)
+        
+        xml_writer = build.model.BOMXMLWriter(bom)
+        xml_writer.write(bomfilename)
+    if not bom and os.path.exists(bomfilename):
+        config_data = {'prep.xml': ant.get_property(r'${prep.config.file.parsed}'), 'build.id': buildid, 'symbian_rel_week': ant.get_property(r'${symbian.version.week}'), 'symbian_rel_ver': ant.get_property(r'${symbian.version}'), 'symbian_rel_year': ant.get_property(r'${symbian.version.year}'), 's60_version': ant.get_property(r'${s60.version}'), 's60_release': ant.get_property(r'${s60.release}'), 'currentRelease.xml': ant.get_property(r'${build.drive}') + "/currentRelease.xml"}
+        config = configuration.Configuration(config_data)
+        bom = build.model.SimpleBOM(config, bomfilename)
+    if os.path.exists(oldbom):
+        xml_delta_writer = build.model.BOMDeltaXMLWriter(bom, oldbom)
         xml_delta_writer.write(buildlogdir + "/" + buildid + "_bom_delta.xml")
-        delta_bom_content_validity = xml_delta_writer.validate_delta_bom_contents(buildlogdir + "/" + buildid + "_bom_delta.xml", "%s/%s_bom.xml" % (buildlogdir, buildid), ant.get_property(r'${old.bom.log}'))
+        delta_bom_content_validity = xml_delta_writer.validate_delta_bom_contents(buildlogdir + "/" + buildid + "_bom_delta.xml", bomfilename, oldbom)
         if((delta_bom_content_validity == False) and (ant.get_property(r'${hlm.enable.asserts}') is not None)):
             print 'Bom delta contents are not matching'
             raise Exception
@@ -96,128 +101,207 @@
         elif(delta_bom_content_validity == False):
             print 'Bom delta contents are not matching.'
     else:
-        print 'Old BOM log cannot be found, skipping BOM delta creation.'
-    bom.close()
-    session.close()
+        print 'Old BOM log cannot be found ' + oldbom + ', skipping BOM delta creation.'
+    if runccm:
+        bom.close()
+    if session:
+        session.close()
 except Exception, ex:
     print 'Caught exception in BOM: ' + str(ex)
     traceback.print_exc()
-                </hlm:python>
-            
+        </hlm:python>
+        <if>
+            <available file="${build.log.dir}/${build.id}_bom.xml"/>
+            <then>
+                <echo>${build.log.dir}</echo>
+                <xmltask source="${build.log.dir}/${build.id}_bom.xml" dest="${build.log.dir}/${build.id}_bom.xml" outputter="simple">
+                    <replace path="//bom/build/text()" withText="${build.id}"/>
+                </xmltask>
+                <fmpp sourceRoot="${helium.dir}/tools/preparation/bom"
+                      outputRoot="${prep.log.dir}" includes="bom.html.*,bom.txt.*" removeExtensions="ftl">
+                    <freemarkerLinks expandProperties="yes">
+                        macro: ${helium.dir}/tools/common/templates/macro
+                    </freemarkerLinks>
+                    <data expandProperties="yes">
+                        doc: xml(${build.log.dir}/${build.id}_bom.xml)                
+                    </data>
+                </fmpp>
+                
+                <move file="${prep.log.dir}/bom.html" tofile="${build.log.dir}/${build.id}_bom.html"/>
+                <move file="${prep.log.dir}/bom.txt" tofile="${prep.log.dir}/${build.id}_bom.txt"/>
+
+                <!-- Transform bom data into the diamonds xml format: 
+                     * BOM folders are flattened into tasks.
+                     * Schema version is extracted from the appropriate FMPP template. -->
+                <fmpp sourcefile="${helium.dir}/tools/common/templates/diamonds/diamonds_header.ftl" 
+                      outputfile="${build.temp.dir}/diamonds_header.xml" quiet="true"/>
+                <loadfile srcfile="${build.temp.dir}/diamonds_header.xml" property="diamonds.schema.xml">
+                    <filterchain>
+                        <linecontains>
+                            <contains value="schema"/>
+                        </linecontains>
+                    </filterchain>
+                </loadfile>                
+                <mkdir dir="${diamonds.build.output.dir}" />
+                <xmltask source="${build.log.dir}/${build.id}_bom.xml" dest="${diamonds.build.output.dir}/create-bom.xml">           
+                    <insert path="bom/content" xml="${diamonds.schema.xml}" position="before"/>
+                    <remove path="bom/content/project/folder/name"/>
+                    <remove path="bom/build"/>
+                    <rename path="bom" to="diamonds-build"/>
+                </xmltask>                
+                <delete file="${build.temp.dir}/diamonds_header.xml"/>
+                <replace file="${diamonds.build.output.dir}/create-bom.xml" token="&lt;folder&gt;" value="&lt;!-- &lt;folder&gt; --&gt;"/>
+                <replace file="${diamonds.build.output.dir}/create-bom.xml" token="&lt;/folder&gt;" value="&lt;!-- &lt;/folder&gt; --&gt;"/>
+                <xmltask source="${diamonds.build.output.dir}/create-bom.xml" dest="${diamonds.build.output.dir}/create-bom.xml"
+                         outputter="simple">
+                    <remove path="//comment()"/>
+                </xmltask>
+             
+                <hlm:assertFileExists file="${diamonds.build.output.dir}/create-bom.xml"/>
+                <hlm:assertFileExists file="${build.log.dir}/${build.id}_bom.html"/>
+                <hlm:assertFileExists file="${prep.log.dir}/${build.id}_bom.txt"/>
+                
+                <runtarget target="collect-task-owner-email"/>
+            </then>
+            <else>
+                <echo>WARNING: ${build.log.dir}/${build.id}_bom.xml file not found.</echo>
+            </else>
+        </if>
+        
+        <if>
+            <available file="${old.bom.log}"/>
+            <then>
+                <hlm:assertFileExists file="${build.log.dir}/${build.id}_bom_delta.xml"/>
+                <fmpp sourceRoot="${helium.dir}/tools/preparation/bom"
+                      outputRoot="${prep.log.dir}" includes="bom_delta.*" removeExtensions="ftl">
+                    <freemarkerLinks expandProperties="yes">
+                        macro: ${helium.dir}/tools/common/templates/macro
+                    </freemarkerLinks>
+                    <data expandProperties="yes">
+                        doc: xml(${build.log.dir}/${build.id}_bom_delta.xml)                
+                    </data>
+                </fmpp>
+                                
+                <move file="${prep.log.dir}/bom_delta.html" tofile="${build.log.dir}/${build.id}_bom_delta.html"/>
+                <move file="${prep.log.dir}/bom_delta.txt" tofile="${prep.log.dir}/${build.id}_bom_delta.txt"/>
+                
+                <hlm:assertFileExists file="${build.log.dir}/${build.id}_bom_delta.html"/>
+            </then>
+        </if>
+        <hlm:stopSpecificLogMacro name="${prep.log.dir}/${build.id}_bom.log" phase="prep"/>
+    </target>
+    
+    <!-- Private: The target create-task-owner-email creates a property task.owners.email which will contain
+    the list of task owners email IDs seperated by comma, the newly created property can be used thereafter
+    to send emails.
+    This target is automatically called by create-bom target -->
+    <target name="collect-task-owner-email">
+        <if>
+            <available file="${build.log.dir}/${build.id}_bom_delta.xml"/>
+            <then>
+                <xmltask source="${build.log.dir}/${build.id}_bom_delta.xml" dest="${build.log.dir}/${build.id}_bom_delta.xml"> 
+                    <call path="/bomDelta/content/task">
+                        <param name="task.delta" path="text()"/>
+                        <actions>
+                            <var name="task.delta" value="@{task.delta}"/>
+                            <propertyregex property="delta.task.id" input="${task.delta}" regexp="^([^:]+):\s*" select="\1"/>
+                            <xmltask source="${build.log.dir}/${build.id}_bom.xml" dest="${build.log.dir}/${build.id}_bom.xml"> 
+                                <call path="/bom/content/project/folder/task/owner/text()[../../id[.='${delta.task.id}']]" >
+                                    <param name="task.owner" path="."/>
+                                    <actions>
+                                        <var name="task.owner" value="@{task.owner}"/>
+                                        <if>
+                                            <and>
+                                                <isset property="task.owners"/>
+                                            </and>
+                                            <then>
+                                                <var name="task.owners" value="${task.owners},${task.owner}"/>
+                                            </then>
+                                            <else>
+                                                <var name="task.owners" value="${task.owner}"/>
+                                            </else>
+                                        </if>
+                                    </actions>
+                                </call>
+                            </xmltask>
+                        </actions>
+                    </call>
+                </xmltask> 
+            </then>
+            <else>
                 <if>
                     <available file="${build.log.dir}/${build.id}_bom.xml"/>
                     <then>
-                        <echo>${build.log.dir}</echo>
-                        <fmpp sourceRoot="${helium.dir}/tools/preparation/bom"
-                              outputRoot="${build.log.dir}" includes="bom.html.*,bom.txt.*" removeExtensions="ftl">
-                            <freemarkerLinks expandProperties="yes">
-                                macro: ${helium.dir}/tools/common/templates/macro
-                            </freemarkerLinks>
-                            <data expandProperties="yes">
-                                doc: xml(${build.log.dir}/${build.id}_bom.xml)                
-                            </data>
-                        </fmpp>
-                        
-                        <move file="${build.log.dir}/bom.html" tofile="${build.log.dir}/${build.id}_bom.html"/>
-                        <move file="${build.log.dir}/bom.txt" tofile="${build.log.dir}/${build.id}_bom.txt"/>
-        
-                        <!-- Transform bom data into the diamonds xml format: 
-                             * BOM folders are flattened into tasks.
-                             * Schema version is extracted from the appropriate FMPP template. -->
-                        <fmpp sourcefile="${helium.dir}/tools/common/templates/diamonds/diamonds_header.ftl" 
-                              outputfile="${build.temp.dir}/diamonds_header.xml" quiet="true"/>
-                        <loadfile srcfile="${build.temp.dir}/diamonds_header.xml" property="diamonds.schema.xml">
-                            <filterchain>
-                                <linecontains>
-                                    <contains value="schema"/>
-                                </linecontains>
-                            </filterchain>
-                        </loadfile>                
-                        <xmltask source="${build.log.dir}/${build.id}_bom.xml" dest="${build.log.dir}/create-bom.xml">           
-                            <insert path="bom/content" xml="${diamonds.schema.xml}" position="before"/>
-                            <remove path="bom/content/project/folder/name"/>
-                            <remove path="bom/build"/>
-                            <rename path="bom" to="diamonds-build"/>
-                        </xmltask>                
-                        <delete file="${build.temp.dir}/diamonds_header.xml"/>
-                        <replace file="${build.log.dir}/create-bom.xml" token="&lt;folder&gt;" value="&lt;!-- &lt;folder&gt; --&gt;"/>
-                        <replace file="${build.log.dir}/create-bom.xml" token="&lt;/folder&gt;" value="&lt;!-- &lt;/folder&gt; --&gt;"/>
-                        <xmltask source="${build.log.dir}/create-bom.xml" dest="${build.log.dir}/create-bom.xml"
-                                 outputter="simple">
-                            <remove path="//comment()"/>
-                        </xmltask>
-                     
-                        <hlm:assertFileExists file="${build.log.dir}/create-bom.xml"/>
-                        <hlm:assertFileExists file="${build.log.dir}/${build.id}_bom.html"/>
-                        <hlm:assertFileExists file="${build.log.dir}/${build.id}_bom.txt"/>
+                        <xmltask source="${build.log.dir}/${build.id}_bom.xml" dest="${build.log.dir}/${build.id}_bom.xml"> 
+                            <call path="/bom/content/project/folder/task/owner">
+                                <param name="task.owner" path="text()"/>
+                                <actions>
+                                    <var name="task.owner" value="@{task.owner}"/>
+                                    <if>
+                                        <and>
+                                            <isset property="task.owners"/>
+                                        </and>
+                                        <then>
+                                            <var name="task.owners" value="${task.owners},${task.owner}"/>
+                                        </then>
+                                        <else>
+                                            <var name="task.owners" value="${task.owner}"/>
+                                        </else>
+                                    </if>
+                                </actions>
+                            </call>
+                        </xmltask> 
+                    </then>
+                </if>
+            </else>
+        </if>
+        <sortlist property="task.owners" override="true" value="${task.owners}"/>
+        <propertyregex property="task.owners" override="true" input="${task.owners}" regexp="([^,]+),.*\1" replace="\1" global='true'/>
+        <for list="${task.owners}" delimiter="," param="task.owner" >
+            <sequential>
+                <var name="task.owner" value="@{task.owner}"/>
+                <hlm:ldap url="${email.ldap.server}" rootdn="${email.ldap.rootdn}" filter="uid=${task.owner}" outputproperty="task.owner.email" key="mail"/>
+                <if>
+                    <and>
+                        <isset property="task.owners.email"/>
+                    </and>
+                    <then>
+                        <var name="task.owners.email" value="${task.owners.email},${task.owner.email}"/>
                     </then>
                     <else>
-                        <echo>WARNING: ${build.log.dir}/${build.id}_bom.xml file not found.</echo>
+                        <var name="task.owners.email" value="${task.owner.email}"/>
                     </else>
                 </if>
-                
-                <if>
-                    <isset property="old.bom.log.present"/>
-                    <then>
-                        <hlm:assertFileExists file="${build.log.dir}/${build.id}_bom_delta.xml"/>
-                        <fmpp sourceRoot="${helium.dir}/tools/preparation/bom"
-                              outputRoot="${build.log.dir}" includes="bom_delta.*" removeExtensions="ftl">
-                            <freemarkerLinks expandProperties="yes">
-                                macro: ${helium.dir}/tools/common/templates/macro
-                            </freemarkerLinks>
-                            <data expandProperties="yes">
-                                doc: xml(${build.log.dir}/${build.id}_bom_delta.xml)                
-                            </data>
-                        </fmpp>
-                                        
-                        <move file="${build.log.dir}/bom_delta.html" tofile="${build.log.dir}/${build.id}_bom_delta.html"/>
-                        <move file="${build.log.dir}/bom_delta.txt" tofile="${build.log.dir}/${build.id}_bom_delta.txt"/>
-                        
-                        <hlm:assertFileExists file="${build.log.dir}/${build.id}_bom_delta.html"/>
-                    </then>
-                </if>
-                <hlm:stopSpecificLogMacro name="${build.log.dir}/${build.id}_bom.log"/>
-            </then>
-        </if>
+            </sequential>
+        </for>
     </target>
 
-    <!-- Calculates the previous build number based on the current one. -->
-    <target name="previous-build-number" unless="previous.build.number">
-        <script language="jython" setbeans="false">
-import ant
-from com.nokia.ant.util import Helper
-buildnum = Helper.getProperty(project, "build.number")
-pbuildnum = ant.get_previous_build_number(buildnum)
-if pbuildnum != None:
-    project.setProperty("previous.build.number", pbuildnum)
-        </script>
-        <echo>Previous build number = ${previous.build.number}</echo>
-    </target>
-    
-    
     <!-- Finds the path to the last usable XML BOM log for creating a BOM delta. --> 
-    <target name="old-bom-log" unless="old.bom.log" depends="previous-build-number">
-        <property name="bom.log" value="${publish.dir}/logs/${build.id}_bom.xml"/>
+    <target name="old-bom-log" unless="old.bom.log">
+        <property name="old.bom.log.publish.dir" value="${publish.dir}" />
+        <property name="bom.log" value="${old.bom.log.publish.dir}/logs/${build.id}_bom.xml"/>
         <script language="jython" setbeans="false">
 import re
-try:
-    buildnumber = project.getProperty("build.number")
-    pbuildnumber = project.getProperty("previous.build.number")
-    bomlog = project.getProperty("bom.log")
-    old_bom_log = re.sub(r'\.(%s)([\/_])' % buildnumber, r'.' + pbuildnumber + r'\2', bomlog)
-    project.setProperty("old.bom.log", old_bom_log)
-except ValueError:
-    # Do nothing - old BOM cannot be calulated
-    self.log("Old BOM cannot be found")
+import ant
+import os
+from com.nokia.ant.util import Helper
+
+previousbuildnumber = 1
+buildnumber = Helper.getProperty(project, "build.number")
+bomlog = project.getProperty("bom.log")
+while(previousbuildnumber > 0 and previousbuildnumber != ''):
+    previousbuildnumber = ant.get_previous_build_number(buildnumber)
+    try:
+        old_bom_log = re.sub(r'\.(%s)([\/_])' % project.getProperty("build.number"), r'.' + previousbuildnumber + r'\2', bomlog)
+        if os.path.exists(old_bom_log):
+            break
+    except ValueError:
+        self.log("Old BOM cannot be found")
+    buildnumber = previousbuildnumber
+project.setProperty("old.bom.log", old_bom_log)
         </script>
         <echo>Previous BOM log: ${old.bom.log}</echo>
         <available file="${old.bom.log}" property="old.bom.log.present"/>
-        <if>
-            <isset property="old.bom.log.present"/>
-            <then>
-                <hlm:assertFileExists file="${old.bom.log}"/>
-            </then>
-        </if>
         <echo>Previous BOM log present: ${old.bom.log.present}</echo>
     </target>
     
--- a/buildframework/helium/tools/preparation/ci.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/preparation/ci.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -72,18 +72,21 @@
     try:
         if os.sep == '\\':
             fileutils.subst(del_folder_drive, dir_)
-            self.log(str("substed for deleling folders"))
+            self.log(str("substed for deleting folders"))
             self.log(str("Removing %s\\" % del_folder_drive))
             fileutils.rmtree("%s\\" % del_folder_drive)
             fileutils.unsubst(del_folder_drive)
-            self.log(str("unsbusted substed for deleling folders"))
+            self.log(str("unsubsted substed for deleting folders"))
         else:
             self.log(str("Removing %s" % dir_))
             fileutils.rmtree(dir_)
     except Exception, e:
         if os.sep == '\\':
-            fileutils.unsubst(del_folder_drive)
-            self.log(str("unsbusted for deleling folders"))
+            try:
+                fileutils.unsubst(del_folder_drive)
+                self.log(str("unsubsted for deleling folders"))
+            except Exception, e2:
+                self.log(str("failed when unsubsting for failed deleting folders... process will continue anyway"))
         self.log(str("ERROR: %s" % e))
 
 # Delete all config files
@@ -133,14 +136,11 @@
     <!-- This target flags the Build areas for deletion. So the cleanup build robot could remove them. -->
     <target name="flag-ba-for-deletion" if = "ci.cleanup.env.dir">
         <mkdir dir="${ci.cleanup.env.dir}"/>
-        <if>
+        <condition property="ci.min.ba.maintain" value="2">
             <not>
                 <isset property="ci.min.ba.maintain"/>
             </not>
-            <then>
-                <property name="ci.min.ba.maintain" value="2"/>
-            </then>
-        </if>
+        </condition>
         <hlm:BADeleteMacro outputdir="${ci.cleanup.env.dir}" rootdir="${prep.root.dir}" no.ba.remain="${ci.min.ba.maintain}"/>
     </target>
     
@@ -268,7 +268,7 @@
     root.xml_append(p)
         
 output = open(outputFilename, "w+")
-output.write(doc.xml())
+output.write(doc.xml(indent=u"yes"))
 output.close()
             </hlm:python>
         </sequential>
@@ -286,7 +286,7 @@
                 <property name="do.ci-monitor-ccm-session" value="true"/>
             </then>
             <else>
-                <echo>Delivery file not available or 'ci.session.file' not defined or ccm.enabled not set to true.</echo>
+                <echo>'prep.delivery.file' not available or 'ci.session.file' not defined or 'ccm.enabled' not set to true.</echo>
             </else>
         </if>
     </target>
@@ -294,9 +294,7 @@
     <!-- Validate input for the ci-prep-wa-create-list target. --> 
     <target name="ci-prep-wa-create-list-validate" depends="ci-monitor-ccm-session-validate" if="do.ci-monitor-ccm-session">
         <if>
-            <and>
-                <isset property="ci.project.config"/>             
-            </and>
+            <isset property="ci.project.config"/>
             <then>
                 <property name="do.ci-prep-wa-create-list" value="true"/>
             </then>
--- a/buildframework/helium/tools/preparation/freedisk.py	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/preparation/freedisk.py	Wed Dec 23 19:29:07 2009 +0200
@@ -46,6 +46,9 @@
         if sys.platform == "win32":
             import win32file
             free_bytes = win32file.GetDiskFreeSpaceEx(drive)[0]
+        elif 'java' in sys.platform:
+            import java.io
+            free_bytes = java.io.File(drive).getFreeSpace()
         else:
             import os
             import statvfs
@@ -61,14 +64,12 @@
 
     free_space = free_bytes / (1024 * 1024)
 
-
     print "drive:", drive
     print "Required Space:", space_required
     print "Free Space:", free_space
     
     if space_required < free_space:
         print "Enough free space"
-        sys.exit(0)
     else:
         print "Not enough free space, exiting"
         sys.exit(-1)
--- a/buildframework/helium/tools/preparation/getenv.pl	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/preparation/getenv.pl	Wed Dec 23 19:29:07 2009 +0200
@@ -420,20 +420,6 @@
     }
 }
 
-# Make sure paths are as windows likes 'em
-# change '/' ==> '\\' and make sure last char is \\
-sub UnFixPaths {
-    my $tmpParam = shift;
-    $tmpParam =~ s/\//\\/g;
-    
-    if( substr( $tmpParam, -1 ) eq "\\" ) {
-        return $tmpParam;
-    }
-    else {
-        return $tmpParam."\\";
-    }
-}
-
 # smarter handling of logging
 sub printLog {
     foreach my $trace ( @_ ) {
@@ -612,7 +598,7 @@
         }
         my $wantedService = $serviceList[ ReturnMenuIndex( "Please select GRACE Service.", @serviceNameList)];
         printLog( "selected: $wantedServer.$wantedService - accessing.." );
-		local *GRACETEST2;
+        local *GRACETEST2;
         if( opendir( GRACETEST2, $wantedServer.$wantedService ) ) {
             printLog( "serviceconnection tested OK" );
             $defaultServiceName = $wantedService
@@ -852,7 +838,7 @@
     $releaseLocationInServer = $data->{releaseDetails}->{releaseID}->{service}->{name} . "/";
     $releaseLocationInServer .= $data->{releaseDetails}->{releaseID}->{product}->{name} ."/";
     $releaseLocationInServer .= $data->{releaseDetails}->{releaseID}->{release}->{name} ."/";
-	local *DEPTEST;
+    local *DEPTEST;
     
     # check if we can find this release from GRACE
     if( $graceServer ) {
@@ -883,7 +869,21 @@
     my( $xmlDataHandle, $releaseInServer )  = @_;
     my $finalState = 0;
     printLog( "parse filenames to extract to packageHah" );
+    no strict 'refs';
         
+# Incase if we have only one package in the release to extract, then in the case
+# the Xml::Simple::XMLin is not creating keys inside $xmlDataHandle->{releaseFiles}->{package}
+# with package names. So to address it, the below part of code is done..
+####
+    if(exists $xmlDataHandle->{releaseFiles}->{package}->{name}){
+        my $pkgName = $xmlDataHandle->{releaseFiles}->{package}->{name};
+        my $tmphash = $xmlDataHandle->{releaseFiles}->{package};
+        delete $tmphash->{name} ;
+        delete $xmlDataHandle->{releaseFiles}->{package};
+        $xmlDataHandle->{releaseFiles}->{package}->{$pkgName} = $tmphash;
+    }
+#####
+
     # generate new hash of zips to DL for %packageHash
     # foreach my $key( sort { $xmlDataHandle{a}->{'state'} <=> $xmlDataHandle{b}->{'state'} } %{$xmlDataHandle->{releaseFiles}->{'package'} } ){
     foreach my $key( keys(%{$xmlDataHandle->{releaseFiles}->{package} } ) ) {
@@ -1083,7 +1083,7 @@
         my $dependsOfReleaseToRemove = FixPaths( $currentReleaseXmlHandle->{releaseDetails}->{dependsOf}->{release}->{name} );
         
         my $dependsOf = $dependsOfServiceToRemove.$dependsOfProductToRemove.$dependsOfReleaseToRemove;
-		local *TMPTEST;
+        local *TMPTEST;
         
         # find out where the release came from
         if( $param_release_path ) {
@@ -1129,7 +1129,7 @@
 #               if( $finalZip->{filename} eq $zips and
 #                       $finalZip->{path} eq %packageHash->{$zips}->{'path'} ) {
                 if( $finalZip->{filename} eq $zips ) {
-                            printLog( "removing $finalZip->{path} $finalZip->{filename} from dl list" );
+                            printLog( "removing $finalZip->{path}/$finalZip->{filename} from dl list" );
                             $finalZip->{default} = "false";
                 }
             }
@@ -1259,10 +1259,14 @@
                 # unzip double zipped zips to $tmpDlDir
                 # there shouldnt be much of these anymore
                 printLog( "parent: double zipped - unzip to $tmpDlDir" );
-                my $extrCmd = "7za x -y \"";
+                my $extrCmd = q{7za x -y "};
                 $extrCmd .= $file->{path} . $file->{filename};
-                $extrCmd .= "\" -o" . $tmpDlDir;
-                $extrCmd .= " > NUL";
+                $extrCmd .= q{" -o} . $tmpDlDir;
+                if ( $^O =~ /linux/i){
+                    $extrCmd .= " > /dev/null";
+                }else{
+                    $extrCmd .= " > NUL";
+                }
                 print "system: $extrCmd\n" if( $param_print_only );
                 printLog( "parent: system: $extrCmd" );;
                 system( $extrCmd ) if( !$param_print_only );
@@ -1313,11 +1317,12 @@
         }
 
         if( $somethingToCopy ) {
-            printLog( "move everything from $tmpDlDir to $tmpDir > NUL" ); 
-            my $moveCmd = "move $tmpDlDir\\*.* $tmpDir > NUL";
-            printLog( "running moveCmd: $moveCmd" );
-            system( $moveCmd ) if( !$param_print_only );
-    #       move( "$tmpDlDir/*.*", "$tmpDir" ) or die( "move failed: $!" );
+            printLog( "move everything from $tmpDlDir to $tmpDir" ); 
+            opendir( DLTEMP , $tmpDlDir );
+            for (grep( !/^\.\.?$/, readdir(DLTEMP))){
+                move("$tmpDlDir/$_", $tmpDir) or die("$tmpDlDir/$_ move failed :$!");
+            }
+            closedir( DLTEMP );
         }
         
         if( $returnValue == 0 ) {
@@ -1331,7 +1336,9 @@
     }
     
     # current forking mechanism is leaving last package(s) to $tmpDir
-    UnzipFromTempToEnv( );
+    opendir(TEMPDIR,  $tmpDir);
+    UnzipFromTempToEnv() if(scalar(grep( !/^\.\.?$/, readdir(TEMPDIR))) > 0);
+    closedir(TEMPDIR);
 
     if( -e FixPaths( getcwd )."currentRelease.xml" ) {
         unlink( FixPaths( getcwd )."currentRelease.xml" ) if( ! $param_print_only );
@@ -1353,8 +1360,13 @@
 sub UnzipFromTempToEnv {
     # extract from temp to extractDir
     printLog( "child: unzip from temp" );
-    my $finalUnzipCmd = "7za x -y \"".UnFixPaths( $tmpDir )."\\*.zip\" -o\"".UnFixPaths( getcwd )."\"";
-    $finalUnzipCmd .= " > NUL";
+    my $finalUnzipCmd = qq{7za x -y "$tmpDir/*.zip" -o"}.getcwd.q{"};
+    if ( $^O =~ /linux/i){
+        $finalUnzipCmd .= " > /dev/null";
+    }else{
+        $finalUnzipCmd .= " > NUL";
+    }
+
     print "system: $finalUnzipCmd\n" if( $param_print_only );
     printLog( "child: system: $finalUnzipCmd" );
     system( $finalUnzipCmd ) if( !$param_print_only );
@@ -1365,7 +1377,6 @@
     
     # empty temp dir
     printLog( "child: empty temp dir" );
-    $tmpDir =~ s/\//\\/g;
     printLog( "child: unlink: $tmpDir" );
 
     # dont handle errors - temp might be empty as well!
--- a/buildframework/helium/tools/preparation/ido-prep.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/preparation/ido-prep.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -43,49 +43,87 @@
         <mkdir dir="${build.output.dir}/build"/>
         <mkdir dir="${temp.build.dir}"/>
         <tempfile property="prep.dynamic.sysdef.config" suffix=".txt" deleteonexit="false" destdir="${temp.build.dir}"/>
-        <hlm:referenceToFileMacro refid="system.definition.files" output="${prep.dynamic.sysdef.config}"/>
+        <trycatch property="error.message">
+            <try>
+                <hlm:referenceToFileMacro refid="system.definition.files" output="${prep.dynamic.sysdef.config}"/>
+            </try>
+            <catch>       
+                <propertyregex property="message" input="${error.message}"
+                  regexp=":(.*)$"
+                  select="\1" casesensitive="false" />
+                <fail message="Error: ${message}" />     
+            </catch>               
+        </trycatch>
         <trycatch>
             <try>
                 <pathconvert pathsep="," property="ado.quality.dirs.path">
                     <dirset refid="ado.quality.dirs"/>
-                </pathconvert>
+                </pathconvert>                              
             </try>
         </trycatch>
         <script language="jython" setbeans="false">
-import os
-import ant
-import shutil
-import fileutils
-import ido
-
-input = open(project.getProperty(r"prep.dynamic.sysdef.config"), 'r')
-output = open(project.getProperty(r"ado.mapping.file"), 'w')
-outputquality = open(project.getProperty(r"ado.quality.mapping.file"), 'w')
-components = {}
-for sysdef in input.readlines():
-    sysdef = sysdef.strip()
-    if len(sysdef) > 0:
-        print "Checking %s" % sysdef
-        os.path.dirname(sysdef)
-        location = ido.get_sysdef_location(sysdef)
-        if location != None:
-            sysdef = os.path.dirname(sysdef).replace('\\','/').replace(':','\\:')
-            component = os.path.normpath(os.path.join(project.getProperty(r"build.drive"), os.environ['EPOCROOT'], location)).replace('\\','/').replace(':','\\:')
-            print "%s=%s\n" % (sysdef, component)
-            output.write("%s=%s\n" % (sysdef, component))
-            
-            if project.getProperty("ado.quality.dirs.path") == None:
-                outputquality.write("%s=%s\n" % (sysdef, component))
-            else:
-                for dir in project.getProperty("ado.quality.dirs.path").split(','):
-                    if os.path.normpath(dir) == os.path.normpath(os.path.join(project.getProperty(r"build.drive"), os.environ['EPOCROOT'], location)):
-                        outputquality.write("%s=%s\n" % (sysdef, component))
-outputquality.close()
-output.close()
-input.close()        
+import idoprep
+idoprep.create_ado_mapping(project.getProperty(r"prep.dynamic.sysdef.config"), project.getProperty(r"ado.mapping.file"), project.getProperty(r"ado.quality.mapping.file"), project.getProperty(r"build.drive"), project.getProperty("ado.quality.dirs.path"))
         </script>
     </target>
     
+    <!-- Target to generate cenreps using cone tool -->
+    <target name="ido-gen-cenrep">
+        <for list="${sysdef.configurations.list}" delimiter="," param="sysdef.config">
+            <sequential>
+                <if>
+                    <available file="${compile.log.dir}/${build.id}.@{sysdef.config}_compile.log"/>
+                    <then>
+                        <hlm:grepMacro filename="${compile.log.dir}/${build.id}.@{sysdef.config}_compile.log" regexp="([^\\]*.confml)$" output="confml.file.list"/>
+                        <for list="${confml.file.list}" delimiter="," param="confml.file">
+                            <sequential>
+                                <var name="crml.regexp" unset="true"/>
+                                <propertyregex property="crml.regexp" input="@{confml.file}"  regexp="([^\.]*).confml" select="\1" />
+                                <hlm:conEToolMacro>
+                                    <arg name="output" value="${post.log.dir}/${build.id}_cenrep.cone.log"/>
+                                    <arg name="path" value="${build.drive}/epoc32/tools/" />
+                                    <arg name="-v" value="5" />
+                                    <arg name="-p" value="${build.drive}\epoc32\rom\config\assets\s60" />
+                                    <arg name="-o" value="${build.drive}\epoc32\release\winscw\urel\z" />
+                                    <arg name="-c" value="root.confml" />
+                                    <arg name="-i" value="${crml.regexp}" />
+                                </hlm:conEToolMacro>
+                                <hlm:conEToolMacro>
+                                    <arg name="output" value="${post.log.dir}/${build.id}_cenrep.cone.log"/>
+                                    <arg name="path" value="${build.drive}/epoc32/tools/" />
+                                    <arg name="-v" value="5" />
+                                    <arg name="-p" value="${build.drive}\epoc32\rom\config\assets\s60" />
+                                    <arg name="-o" value="${build.drive}\epoc32\release\winscw\udeb\z" />
+                                    <arg name="-c" value="root.confml" />
+                                    <arg name="-i" value="${crml.regexp}" />
+                                </hlm:conEToolMacro>
+                            </sequential>
+                        </for>
+                    </then>
+                </if>
+            </sequential>
+        </for>
+        <copy file="${post.log.dir}/${build.id}_cenrep.cone.log" tofile="${temp.build.dir}/${build.id}_cenrep_includefile.txt" overwrite="true">
+            <filterchain>
+                <linecontainsregexp>
+                    <regexp pattern="^\s*Generating file"/>
+                </linecontainsregexp>
+            </filterchain>
+        </copy>
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:textmetadatainput>
+                <fileset casesensitive="false" file="${post.log.dir}/${build.id}_cenrep.cone.log" />
+                <metadatafilterset>
+                    <metadatafilter priority="error" regex="^ERROR\s+:.*" description="cone error" />
+                    <metadatafilter priority="warning" regex="^WARNING\s+:.*" description="cone warnings" />
+                    <metadatafilter priority="info" regex="^INFO\s+:.*" description="cone info" />
+                </metadatafilterset>
+            </hlm:textmetadatainput>
+        </hlm:metadatarecord>
+        <hlm:metadataCountSeverity severity="ERROR" log="${build.id}_cenrep.cone.log" db="${metadata.dbfile}" property="cone.error.total"/>
+        <echo>ConE error: ${cone.error.total}</echo>
+        <hlm:generateBuildStatus file="${build.id}_cenrep.cone.log" />
+    </target>
     
     <!-- Target that uses the information from the system.definition.files to prepare the IDO build area.
         It relies on the fact that layer_real_source_path entity is declared in each ADO configuration.
@@ -175,12 +213,9 @@
       Internal target that set an intermediate property to disable codescanner execution.
     -->
     <target name="ido-codescanner-skip">
-        <if>
+        <condition property="do.skip.codescanner" value="1">
             <istrue value="${skip.codescanner}"/>
-            <then>
-                <property name="do.skip.codescanner" value="1"/>
-            </then>
-        </if>
+        </condition>
     </target>
 
     <!--
@@ -314,99 +349,15 @@
     extended to product builds.-->    
     <target name="ido-check-latest-release-grace" unless="use.dragonfly">
         <script language="jython" setbeans="false">
-import re
 import os
-import symrec
-import logging
-import traceback
-import ant
-            
-if not project.getProperty('s60.grace.server'):
-    raise Exception("Property 's60.grace.server' is not defined.")
-if not project.getProperty('s60.grace.service'):
-    raise Exception("Property 's60.grace.service' is not defined.")
-if not project.getProperty('s60.grace.product'):
-    raise Exception("Property 's60.grace.product' is not defined.")
-if not project.getProperty('s60.grace.release'):
-    raise Exception("Property 's60.grace.release' is not defined.")
-grace = project.getProperty('s60.grace.server')
-service = project.getProperty('s60.grace.service')
-product = project.getProperty('s60.grace.product')
-release = project.getProperty('s60.grace.release')
-revision = r'(_\d{3})?'
-if project.getProperty('s60.grace.revision') != None:
-    revision = project.getProperty('s60.grace.revision')
-
-# Get the cache filename.
-cachefilename = project.getProperty('s60.grace.cache')
-if cachefilename:
-    self.log(str("Using cache file: %s" % cachefilename))
+import idoprep
 
-checkmd5 = False
-if project.getProperty('s60.grace.checkmd5') != None:
-    checkmd5 = str(project.getProperty('s60.grace.checkmd5')).lower()
-    checkmd5 = ((checkmd5 == "true") or (checkmd5 == "1") or (checkmd5 == "on"))
-            
-branch = os.path.join(grace, service, product)
-if not os.path.exists(branch):
-    raise Exception("Error occurred: Could not find directory %s" % branch)
-    
-result = []
-for rel in os.listdir(branch):
-    relpath = os.path.join(branch, rel)
-    self.log("Checking: %s" % str(relpath))
-    res = re.match(r"%s%s$" % (release, revision), rel, re.I)
-    if res != None:
-        self.log("Found: %s" % str(relpath))
-        result.append(relpath)
-result.sort(reverse=True)
-use_tickler = False
-tickler_validation = str(project.getProperty('s60.grace.usetickler')).lower()
-if tickler_validation != None:
-    use_tickler = ((tickler_validation == "true") or (tickler_validation == "1"))
-validresults = []
-for rel in result:
-    try:
-        metadata_filename = symrec.find_latest_metadata(str(rel))
-        if metadata_filename is not None and os.path.exists(metadata_filename):
-            self.log(str("Validating: %s" % metadata_filename))
-            if (use_tickler):
-                validator = symrec.ValidateTicklerReleaseMetadata(metadata_filename, cachefilename)
-            else:
-                validator = symrec.ValidateReleaseMetadataCached(metadata_filename, cachefilename)
-            if validator.is_valid(checkmd5):
-                self.log(str("%s is valid." % rel))
-                validresults.append(rel)
-                break
-            else:
-                self.log(str("%s is not a valid release." % rel))
-        elif metadata_filename is None:
-            self.log(str("Could not find the release metadata file under %s" % rel))
-    except Exception, e:
-        self.log(str("WARNING: %s: %s" % (rel , e)))
-        self.log(str("%s is not a valid release." % rel))
-        traceback.print_exc()
-
-result = validresults
-if len(result) == 0:
-    raise Exception("Error finding GRACE release.")
-print result[0]
+result = idoprep.get_s60_env_details(project.getProperty('s60.grace.server'), project.getProperty('s60.grace.service'), project.getProperty('s60.grace.product'), project.getProperty('s60.grace.release'), project.getProperty('s60.grace.revision'), project.getProperty('s60.grace.cache'), project.getProperty('s60.grace.checkmd5'), project.getProperty('s60.grace.usetickler'))
 resultname = os.path.basename(result[0])
-vfile = os.path.join(project.getProperty('build.drive') + os.sep, 's60_version.txt')
-if (os.path.exists(vfile)):
-    self.log("Are we still up-to-date compare to %s" % str(vfile))
-    f = open(str(vfile), 'r')
-    version = f.readline()
-    self.log(str("'%s' == '%s'" % (version, resultname)))
-    project.setProperty('s60.getenv.path', str(result[0]))
-    project.setProperty('s60.getenv.release', str(resultname))
-    if version.strip() != resultname:
-        project.setProperty('s60.getenv.update', "1")
-    f.close()
-else:
-    self.log("Version file not found getting new environment...")
-    project.setProperty('s60.getenv.path', str(result[0]))
-    project.setProperty('s60.getenv.release', str(resultname))
+project.setProperty('s60.getenv.path', str(result[0]))
+project.setProperty('s60.getenv.release', str(resultname))
+version = idoprep.get_version(project.getProperty('build.drive'), resultname)
+if version is None or version.strip() != resultname:
     project.setProperty('s60.getenv.update', "1")
         </script>
     </target>
@@ -418,9 +369,6 @@
 
     <!-- Creates the build area by getting the contents from GRACE release.-->    
     <target name="ido-update-build-area-grace" if="s60.getenv.update" depends="ido-check-latest-release" unless="use.dragonfly">
-        <!-- We must update the build area so let's get rid of the old one. -->
-        <hlm:unsubst drive="${build.drive}" failonerror="false"/>
-        
         <!-- Just get S60 for IDOs -->
         <echo>Location of the new S60 release:${s60.getenv.path}</echo>
         <tstamp>
@@ -508,9 +456,9 @@
             java.util.Properties props = new java.util.Properties();
             props.load(pin);
             org.apache.tools.ant.types.Path path = project.createDataType("path");
-            for (java.util.Iterator i = props.stringPropertyNames().iterator(); i.hasNext() ; ) {
+            for (java.util.Iterator i = props.stringPropertyNames().iterator(); i.hasNext() ; ) { 
                 org.apache.tools.ant.types.Path.PathElement pe = (org.apache.tools.ant.types.Path.PathElement)path.createPathElement();
-                pe.setPath(i.next());
+                pe.setPath(i.next()); 
             }
             self.log("Creating reference: " + attributes.get("pathid"));
             project.addReference(attributes.get("pathid"), path);
--- a/buildframework/helium/tools/preparation/ivy/dependencies.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/preparation/ivy/dependencies.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -39,7 +39,7 @@
     
     <!-- This is a test target for resolving the inputs for preparing the build area. -->
     <target name="resolve-build-inputs">
-        <record name="f:\resolve.txt" action="start" loglevel="verbose"/>
+        <hlm:record name="f:\resolve.txt" action="start" loglevel="verbose"/>
         <fmpp sourceRoot="${helium.dir}/tools/preparation/ivy/templates" outputRoot="${temp.build.dir}/ivy"
               replaceExtension="xml.ftl, ivy.xml">
             <data expandProperties="yes">
@@ -50,7 +50,7 @@
         <ivy:configure file="${build_area.ivy.config.file}"/>
         <ivy:resolve file="${temp.build.dir}/ivy/ivy_file.ivy.xml" haltonfailure="false"/>
         <ivy:artifactreport tofile="${build.log.dir}/build_area_artifacts.xml"/>
-        <record name="f:\resolve.txt" action="stop"/>
+        <hlm:record name="f:\resolve.txt" action="stop"/>
     </target>
     
 
--- a/buildframework/helium/tools/preparation/password.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/preparation/password.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -28,6 +28,7 @@
     <!-- Retrieve the ATS password from the .netrc file and store it into ats.password property. -->
     <target name="ats-password">
         <hlm:netrcPasswordMacro output-prop="ats.password" result-prop="ats.password.available" type="ats"/>
+        <hlm:logreplace regexp="ats.password"/>
     </target>
     
     <!-- Retrieve the ATS username from the .netrc file and store it into ats.username property. -->
@@ -38,6 +39,7 @@
     <!-- Retrieve the unix password from the .netrc file and store it into unix.password property. -->
     <target name="unix-password">
         <hlm:netrcPasswordMacro output-prop="unix.password" result-prop="unix.password.available" type="synergy"/>
+        <hlm:logreplace regexp="${unix.password}"/>
     </target>
     
     <!-- Retrieve the unix username from the .netrc file and store it into unix.username property. -->
@@ -47,7 +49,7 @@
     
     <!-- Ask for unix login using UI. -->
     <target name="get-unix-password" depends="unix-username,unix-password">
-        <hlm:filterRecordStartMacro/>
+        <hlm:filterRecordStartMacro pattern="${unix.password}" category="unix"/>
         <if>
             <not>
                 <equals arg1="${unix.password.available}" arg2="0"/>
@@ -61,17 +63,19 @@
                 <property name="unix.password.available" value="1"/>
             </then>
         </if>
-        <hlm:filterRecordStopMacro pattern="${unix.password}"/>
+        <hlm:filterRecordStopMacro/>
     </target>
     
     <!-- Retrieve the GRACE password from the .netrc file and store it into release.grace.password property. -->
     <target name="grace-password" if="release.grace">
         <hlm:netrcPasswordMacro output-prop="release.grace.password" result-prop="grace.password.available" type="grace"/>
+        <hlm:logreplace regexp="${release.grace.password}"/>
     </target>
     
     <!-- Retrieve the NOE password from the .netrc file and store it into noe.password property. -->
     <target name="noe-password">
         <hlm:netrcPasswordMacro output-prop="noe.password" result-prop="noe.password.available" type="noe"/>
+        <hlm:logreplace regexp="${noe.password}"/>
         <if>
             <not>
                 <isset property="noe.password"/>
@@ -88,28 +92,19 @@
     <!-- Retrieve the notes password from the .netrc file and store it into notes.password property. -->    
     <target name="notes-password">
         <hlm:netrcPasswordMacro output-prop="release.notes.password" result-prop="notes.password.available" type="notes"/>
+        <hlm:logreplace regexp="${release.notes.password}" />
     </target>
 
     <!-- Retrieve the ccm password from the .netrc file and store it into ccm.password property. 
     Requires ccm.enabled tobe set to 'true' to work.-->
-    <target name="ccm-password">
-        <if>
-            <isset property="run.ccm"/>
-            <then>
-                <hlm:netrcPasswordMacro output-prop="ccm.password.rc" result-prop="ccm.password.available" type="synergy"/>
-            </then>
-        </if>
+    <target name="ccm-password" if="run.ccm">
+        <hlm:netrcPasswordMacro output-prop="ccm.password.rc" result-prop="ccm.password.available" type="synergy"/>
     </target>
     
     <!-- Retrieve the ccm username from the .netrc file and store it into ccm.username property.
     Requires ccm.enabled tobe set to 'true' to work. -->
-    <target name="ccm-username">
-        <if>
-            <isset property="run.ccm"/>
-            <then>
-                <hlm:netrcUsernameMacro output-prop="ccm.login.rc" result-prop="ccm.username.available" type="synergy"/>
-            </then>
-        </if>
+    <target name="ccm-username" if="run.ccm">
+        <hlm:netrcUsernameMacro output-prop="ccm.login.rc" result-prop="ccm.username.available" type="synergy"/>
     </target>
     
     <!--
@@ -124,7 +119,7 @@
         <if>
             <isset property="run.ccm"/>
             <then>
-                <hlm:filterRecordStartMacro/>
+                <hlm:filterRecordStartMacro pattern="${ccm.password.rc}" category="ccm"/>
                 <if>
                     <not>
                         <and>
@@ -158,9 +153,8 @@
                         <property name="ccm.user.password" value="${ccm.password.rc}"/>
                     </else>
                 </if>
-        
                 <antcall target="ccm-check"/>
-                <hlm:filterRecordStopMacro pattern="${ccm.user.password}"/>
+                <hlm:filterRecordStopMacro/>
             </then>
             <!--echo> ccm not enabled so not get password</echo-->
         </if>
--- a/buildframework/helium/tools/preparation/preparation.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/preparation/preparation.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -77,7 +77,7 @@
                 <echo message="Error: getenv failed"/>
             </catch>
         </trycatch>
-        <hlm:tempRecordStopMacro name="${build.id}_getenv.log" filterref="filterset.getenv"/>
+        <hlm:tempRecordStopMacro name="${build.id}_getenv.log" filterref="filterset.getenv" phase="prep"/>
     </target>
 
         
@@ -205,7 +205,7 @@
 
     <!-- Gets the ARM compiler license text. -->
     <target name="get-arm-license">
-        <exec executable="armcc.exe" outputproperty="arm.compiler.version.text" failonerror="${failonerror}">
+        <exec executable="armcc" outputproperty="arm.compiler.version.text" failonerror="${failonerror}">
             <arg value="--vsn" />
         </exec>
         <echo message="ARM compiler version text: ${arm.compiler.version.text}" />
@@ -230,7 +230,7 @@
             <propertyresource name="arm.compiler.version.text"/>
             <filterchain>
                 <linecontainsregexp>
-                    <regexp pattern="ARM/Thumb C/C\+\+ Compiler" />
+                    <regexp pattern="ARM.* C/C\+\+ Compiler" />
                 </linecontainsregexp>
             </filterchain>
         </loadresource>
@@ -267,6 +267,7 @@
     <target name="build-info" depends="log-build-start">
         <dirname file="${build.summary.file}" property="build.summary.file.dir"/>
         <mkdir dir="${build.summary.file.dir}"/>
+        <mkdir dir="${prep.log.dir}"/>
         <xmltask dest="${build.log.dir}/${build.id}_info.log.xml">
             <insert path="/">
                 <![CDATA[
@@ -410,7 +411,12 @@
     <target name="init-build-area" depends="check-env-build-drive">
         <mkdir dir="${build.output.dir}" />
         <mkdir dir="${build.log.dir}" />
-        <mkdir dir="${temp.build.dir}" />
+        <mkdir dir="${prep.log.dir}" />
+        <mkdir dir="${compile.log.dir}" />
+        <mkdir dir="${test.log.dir}" />
+        <mkdir dir="${post.log.dir}" />
+        <mkdir dir="${temp.build.dir}" />  
+        <mkdir dir="${diamonds.build.output.dir}" />       
     </target>
     
     
@@ -419,29 +425,32 @@
     <target name="init" depends="get-ccm-password">
         <runtarget target="build-number"/>
         <runtarget target="init-build-area"/>
-        <runtarget target="start-ant-log"/>
-    </target>
-    
-    <!-- Starting the main ant_build log -->
-    <target name="start-ant-log" depends="build-info">
-        <record name="${build.log}" append="true" loglevel="info"/>
-        <echo>Start main Ant build log: ${build.log}</echo>
-    
+        <runtarget target="build-info"/>
+        
         <echo>Copying temp logs from ${build.cache.log.dir} into the build area.</echo>
-        <copy todir="${build.log.dir}" verbose="true" failonerror="false">
+        <copy todir="${prep.log.dir}" verbose="true" failonerror="false">
             <fileset dir="${build.cache.log.dir}">
                 <include name="*.log"/>
                 <include name="*.xml"/>
             </fileset>
         </copy>
+        
     </target>
     
+    <!-- Starting the main ant_build log 
+    <deprecated>
+    Now this will be take care by the logging listener.
+    It will start the main ant logging when ever the build starts.
+    </deprecated>-->
+    <target name="start-ant-log" />
+    
+    
     <!-- This target exists as a trigger for initiating the Diamonds logger. If 
           it is not included in the build sequence, the build will not be logged to 
           Diamonds. Also  build.property.cache.file will be there contains all the diamonds related properties 
     --> 
     <target name="diamonds">
-        <mkdir dir="${build.log.dir}" />
+        <mkdir dir="${diamonds.build.output.dir}" />
         <var name="diamonds.build.url"  value="http://${diamonds.host}:${diamonds.port}${diamonds.build.id}"/>
         <echoproperties destfile="${build.property.cache.file}">
             <propertyset>
@@ -479,7 +488,7 @@
 
     <!-- Preps the build area by copying and unzipping all the inputs. -->
     <target name="prep-copy" depends="prep-prepare-input">
-        <preset.exec executable="${env.PERL}" output="${build.log.dir}/${build.id}_buildarea_prep.log" failonerror="true">
+        <preset.exec executable="${env.PERL}" output="${prep.log.dir}/${build.id}_buildarea_prep.log" failonerror="true">
             <arg value="${helium.dir}/tools/preparation/prep_build_area.pl" />
             <arg value="-config" />
             <arg value="${prep.config.file.parsed}" />
@@ -493,7 +502,7 @@
         <!-- parsing the generated log -->
         <hlm:metadatarecord database="${metadata.dbfile}">
             <hlm:textmetadatainput>
-                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_buildarea_prep.log" />
+                <fileset casesensitive="false" file="${prep.log.dir}/${build.id}_buildarea_prep.log" />
                 <metadatafilterset refid="filterset.buildarea.prep" />
             </hlm:textmetadatainput>
         </hlm:metadatarecord>
@@ -514,8 +523,9 @@
          Property ccm.enabled has to be set to 'true' to enable that step!
          prep-work-area-check-errors is also run so it emits a signal in case of errors.
       -->
-    <target name="do-prep-work-area">
+    <target name="do-prep-work-area" depends="find-files-pre">
         <runtarget target="prep-work-area"/>
+        <runtarget target="find-files-post"/>
     </target>
     <!-- <deprecated>Please use do-prep-work-area</deprecated> -->
     <target name="do-ccm-get-input" depends="do-prep-work-area"/>
@@ -561,11 +571,11 @@
         </if>
         <hlm:metadatarecord database="${metadata.dbfile}">
             <hlm:antmetadatainput>
-                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_ant_build.log" />
+                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_main.ant.log" />
                 <metadatafilterset refid="filterset.ant.output" />
             </hlm:antmetadatainput>
         </hlm:metadatarecord>
-        <hlm:generateBuildStatus file="${build.id}_ant_build.log" />
+        <hlm:generateBuildStatus file="${build.id}_main.ant.log" />
         <!-- Todo: metadata: insert assertions for metadata parsing here -->
     </target>
     
--- a/buildframework/helium/tools/preparation/synergy/buildmanagement.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/preparation/synergy/buildmanagement.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -37,7 +37,7 @@
 
     <!-- Runs the build manager Synergy operations. -->
     <target name="build-manager" depends="build-manager-prepare-input">
-        <record name="${build.log.dir}/${build.id}_build_manager.log" action="start" />
+        <hlm:record name="${build.log.dir}/${build.id}_build_manager.log" action="start" />
         <echo>ccm.engine.host = ${ccm.engine.host}</echo>
         <echo>ccm.database.path = ${ccm.database.path}</echo>
         <hlm:python resultproperty="buildmanagement.result">
@@ -45,7 +45,7 @@
 
 buildmanagement.buildmanager(r'${ccm.engine.host}', r'${ccm.database.path}', r'${project.config.file.parsed}', r'${project.spec.name}')
         </hlm:python>
-        <record name="${build.log.dir}/${build.id}_build_manager.log" action="stop" />
+        <hlm:record name="${build.log.dir}/${build.id}_build_manager.log" action="stop" />
         <hlm:logextract file="${build.log.dir}/${build.id}_build_manager.log" />
         <!-- <hlm:signal name="buildManagementSignal" result="${buildmanagement.result}"/> -->
     </target>
--- a/buildframework/helium/tools/preparation/synergy/ccmgetinput.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/preparation/synergy/ccmgetinput.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -76,7 +76,7 @@
                 </hlm:python>
             </try>
             <finally>
-                <hlm:tempRecordStopMacro name="${build.id}_ccm_get_input.log" filterref="filterset.prepWorkArea"/>
+                <hlm:tempRecordStopMacro name="${build.id}_ccm_get_input.log" filterref="filterset.prepWorkArea" phase="prep"/>
                 <hlm:assertFileExists file="${build.cache.log.dir}/${build.id}_ccm_get_input.log" />
             </finally>
         </trycatch>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/test/test_bom.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : test_ci.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_bom" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        Targets to test Bom creation 
+    </description>
+    <property environment="env" />
+    <property name="helium.dir" location="../../.." />
+    <property name="build.drive" location="${env.TEMP}/helium/${env.USERNAME}/testbom"/>
+    <property name="publish.dir" value="${build.drive}/output" />
+    <property name="build.number" value="1" />
+    <import file="../../../helium.ant.xml" />
+    
+    <target name="test-create-bom">
+        <delete dir="${build.drive}"/>
+        <mkdir dir="${build.log.dir}"/>    
+        
+        <unzip src="${helium.dir}/external/helium-antlib/scm/demo/hg_test2.zip" dest="${build.drive}" />
+        <unzip src="${helium.dir}/external/helium-antlib/scm/demo/hg_test3.zip" dest="${build.drive}" />
+        <hlm:scm scmurl="scm:hg:${build.drive}/test2">
+            <hlm:checkout baseDir="${build.drive}/test2a"/>
+            <hlm:changelog baseDir="${build.drive}/test2a" xmlbom="${build.log.dir}/${build.id}_bom.xml" />
+        </hlm:scm>
+
+        <antcall target="create-bom" />
+        
+        <antcall target="p2-create-bom">
+            <param name="build.id" value="${build.name}_${core.build.version}.2" />
+            <param name="build.number" value="2" />
+        </antcall>
+    </target>
+    
+    <target name="p2-create-bom">
+        <hlm:scm scmurl="scm:hg:${build.drive}/test2">
+            <hlm:changelog baseDir="${build.drive}/test2a" xmlbom="${build.log.dir}/${build.id}_bom.xml" />
+        </hlm:scm>
+        <hlm:scm scmurl="scm:hg:${build.drive}/test3">
+            <hlm:checkout baseDir="${build.drive}/test3a"/>
+            <hlm:changelog baseDir="${build.drive}/test3a" xmlbom="${build.log.dir}/${build.id}_bom.xml" />
+        </hlm:scm>
+        <antcall target="create-bom" />
+        <au:assertFileExists file="${build.log.dir}/${build.id}_bom.html"/>
+        <au:assertFileExists file="${build.log.dir}/${build.id}_bom_delta.html"/>
+        <xpathtest xmlfile="${build.log.dir}/${build.id}_bom_delta.xml">
+            <namespace uri="" prefix=""/>
+            <xpath expression="/bomDelta/content/task[@status='added']"/>
+        </xpathtest>
+    </target>
+</project>
--- a/buildframework/helium/tools/preparation/test/test_ci.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/preparation/test/test_ci.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,6 +21,9 @@
 ============================================================================
 -->
 <project name="test_ci" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+         Testing Targets
+    </description>
     <property environment="env" />
     <property name="publish.root.dir" value="${env.TEMP}" />
     <property name="helium.dir" location="../../.." />
--- a/buildframework/helium/tools/preparation/test/test_preparation.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/preparation/test/test_preparation.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,6 +21,9 @@
 ============================================================================
 -->
 <project name="test_preparation" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+         Preparation Testing targets
+    </description>
     <property environment="env" />
     <property name="publish.root.dir" value="${env.TEMP}" />
     <property name="build.name" value="buildtest" />
@@ -69,7 +72,7 @@
         <runtarget target="prep-drive" />
         <echo file="${build.drive}/newpath-test.txt">foo</echo>
         <sleep seconds="1" />
-        <au:assertFileExists file="${helium.dir}/build/test/preproot/buildtest_0.00.0/newpath-test.txt" />
+        <au:assertFileExists file="${helium.build.dir}/test/preproot/buildtest_0.00.0/newpath-test.txt" />
         <delete file="${build.drive}/newpath-test.txt" />
     </target>
 
@@ -183,4 +186,23 @@
         </if>
     </target>
 
+    <!-- Test for check the setting of arm.compiler.version property when RVCT is 2.x -->
+    <target name="test-set-arm-version2">
+         <!-- mocking the call of  "armcc - - vsn" in order to not depend on it. 
+         In real world should call  c:\APPS\rvct22_593\rvctcmdprompt.bat -->
+        <var name="arm.compiler.version.text" value="ARM/Thumb C/C++ Compiler, RVCT2.2 [Build 593]${line.separator}for support contact Target.Tools@nokia.com${line.separator}Software supplied by: ARM Limited" />
+        <runtarget target="set-arm-version" />
+        <au:assertPropertyEquals name="arm.compiler.version" value="ARM/Thumb C/C++ Compiler, RVCT2.2 [Build 593]${line.separator}"/>
+    </target>
+
+    <!-- Test for check the setting of arm.compiler.version property when RVCT is 4.x -->
+    <target name="test-set-arm-version4">
+         <!-- mocking the call of  "armcc - - vsn" in order to not depend on it.
+         In real world should call  c:\APPS\rvct40_400\rvctcmdprompt.bat -->
+        <var name="arm.compiler.version.text" value="ARM C/C++ Compiler, RVCT4.0 [Build 400]${line.separator}for support contact Target.Tools@nokia.com${line.separator}Software supplied by: ARM Limited" />
+        <runtarget target="set-arm-version" />
+        <au:assertPropertyEquals name="arm.compiler.version" value="ARM C/C++ Compiler, RVCT4.0 [Build 400]${line.separator}"/>
+    </target>
+
+
 </project>
--- a/buildframework/helium/tools/preparation/test/test_synergy.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/preparation/test/test_synergy.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,6 +21,9 @@
 ============================================================================
 -->
 <project name="test_synergy" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+         Testing targets related to Synergy
+    </description>
     <property environment="env" />
     <property name="publish.root.dir" value="${env.TEMP}" />
     <property name="helium.dir" location="../../.." />
--- a/buildframework/helium/tools/publish/nwiki.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/publish/nwiki.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -90,7 +90,7 @@
               - location could be, MBPVancouver for example
     -->
     <target name="create-wiki-bom" depends="remove-build-version-dots,get-nwiki-username,get-nwiki-password" if="publish">
-        <loadfile property="temp-bom-data" srcfile="${build.log.dir}/${build.name}_${build.version}_BOM.txt" failonerror="false">
+        <loadfile property="temp-bom-data" srcfile="${prep.log.dir}/${build.name}_${build.version}_BOM.txt" failonerror="false">
         </loadfile>
         <if>
             <isset property="temp-bom-data" />
@@ -109,7 +109,7 @@
               - location could be, MBPVancouver for example
     -->
     <target name="create-wiki-bom-delta" depends="remove-build-version-dots,get-nwiki-username,get-nwiki-password" if="publish">
-        <loadfile property="temp-bom-delta-data" srcfile="${build.log.dir}/${build.name}_${build.version}_BOM_delta.txt" failonerror="false">
+        <loadfile property="temp-bom-delta-data" srcfile="${prep.log.dir}/${build.name}_${build.version}_BOM_delta.txt" failonerror="false">
         </loadfile>
 
         <if>
@@ -123,6 +123,7 @@
     <!-- Retrieve the NWiki password from the .netrc file and store it into nwiki.password property. -->
     <target name="get-nwiki-password">
         <hlm:netrcPasswordMacro output-prop="nwiki.password" result-prop="nwiki.password.available" type="nwiki" />
+        <hlm:logreplace regexp="${nwiki.password}"/>
     </target>
 
     <!-- Retrieve the NWiki username from the .netrc file and store it into nwiki.username property. -->
--- a/buildframework/helium/tools/publish/publish.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/publish/publish.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -128,30 +128,36 @@
     <hlm:mergeMetadataMacro file="${zip.config.file.parsed}" config="${zips.@{type}.spec.name}"/>
     </pre>
     -->
-    <scriptdef name="mergeMetadataMacro" language="jython" uri="http://www.nokia.com/helium">
+    <macrodef name="mergeMetadataMacro" uri="http://www.nokia.com/helium">
         <attribute name="file" />
         <attribute name="config" />
-        <![CDATA[
+        <sequential>
+            <hlm:python>
+                <![CDATA[
 import configuration
 import symrec
 import os
-import traceback
-# Nicer name
-self.setTaskName("merge-metadata")
+import sys
+import logging
+import ant
+
+LOGGER = logging.getLogger("metadatamerger")
+LOGGER.setLevel(level=logging.INFO)
+logging.basicConfig(level=logging.INFO)
 
 def merge_filelist(merger, filelist):
     for filename in filelist:
         try:
-            self.log(str("Merging %s" % filename))
+            LOGGER.info("Merging %s" % filename)
             merger.merge(filename)
             os.unlink(filename)
         except Exception, exc:
-            self.log("Warning: %s" % exc)
+            LOGGER.warning("Warning: %s" % exc)
 
 try:
-    builder = configuration.NestedConfigurationBuilder(open(str(attributes.get('file')), 'r'))
+    builder = configuration.NestedConfigurationBuilder(open(ant.get_property(r'@{file}')), 'r')
     configSet = builder.getConfiguration()
-    configs = configSet.getConfigurations(str(attributes.get('config')))
+    configs = configSet.getConfigurations(ant.get_property(r'@{config}'))
     
     if len(configs) > 0:
         filelist = []
@@ -159,7 +165,7 @@
             if config.get_boolean("grace.metadata", False):
                 metadata = os.path.join(config['archives.dir'], config['name']+ ".metadata.xml")
                 if os.path.exists(metadata):
-                    self.log(str("Found %s" % metadata))
+                    LOGGER.info("Found %s" % metadata)
                     filelist.append(metadata)
         
         merger = None
@@ -167,22 +173,22 @@
         if os.path.exists(metadata_main):
             merger = symrec.MetadataMerger(metadata_main)
             merge_filelist(merger, filelist)
-            self.log(str("Writing %s" % metadata_main))
+            LOGGER.info(str("Writing %s" % metadata_main))
             merger.save()
         elif len(filelist) > 0:
             input = filelist.pop(0)
             merger = symrec.MetadataMerger(input)
             merge_filelist(merger, filelist)
-            self.log(str("Writing %s" % metadata_main))
+            LOGGER.info(str("Writing %s" % metadata_main))
             merger.save(metadata_main)
             os.unlink(input)
 except Exception, e:
-    self.log('ERROR: %s' % e)
-    traceback.print_exc()
-    # Let's propagate at the moment
-    raise e
+    LOGGER.error('ERROR: %s' % e)
+    sys.exit(-1)
 ]]> 
-    </scriptdef>
+            </hlm:python>
+        </sequential>
+    </macrodef>
 
     <!-- This macro allows you to add or update one archive definition inside the release metadata files.
     e.g.:
@@ -190,39 +196,48 @@
         <hlm:updateMetadataMacro file="<path>/release_metadata.xml" archive="<path>/archive.zip" />
     </pre>
      -->
-    <scriptdef name="updateMetadataMacro" language="jython" uri="http://www.nokia.com/helium">
+    <macrodef name="updateMetadataMacro" uri="http://www.nokia.com/helium">
         <attribute name="file" />
         <attribute name="archive" />
-        <attribute name="filters" />
+        <attribute name="filters" default=""/>
+        <sequential>
+            <hlm:python>
         <![CDATA[
 import symrec
 import os
 import traceback
 import fileutils
-self.setTaskName("updateMetadataMacro")
-if attributes.get('file') is None:
+import ant
+import sys
+import logging
+
+LOGGER = logging.getLogger("metadataupdater")
+LOGGER.setLevel(level=logging.INFO)
+logging.basicConfig(level=logging.INFO)
+
+if ant.get_property(r'@{file}') is None:
     raise Exception('file attribute is not defined.')
-if attributes.get('archive') is None:
+if ant.get_property(r'@{archive}') is None:
     raise Exception('archive attribute is not defined.')
 filters = None
-if attributes.get('filters') is not None:
-    filters = str(attributes.get('filters')).split(r',')
+if ant.get_property(r'@{filters}') is not None:
+    filters = ant.get_property(r'@{filters}').split(r',')
 
 try:
-    filename = str(attributes.get('file'))
-    archive = str(attributes.get('archive'))
+    filename = ant.get_property(r'@{file}')
+    archive = ant.get_property(r'@{archive}')
     if not os.path.exists(filename):
         raise Exception("Could not find file: %s" % filename)
     if not os.path.exists(archive):
         raise Exception("Could not find file: %s" % archive)
 
-    self.log(str("Opening %s" % filename))
+    LOGGER.info(str("Opening %s" % filename))
     md = symrec.ReleaseMetadata(filename)
     if os.path.basename(archive) not in md.keys():
-        self.log(str("Adding %s to metadata" % os.path.basename(archive)))
+        LOGGER.info(str("Adding %s to metadata" % os.path.basename(archive)))
         md.add_package(os.path.basename(archive), md5checksum=fileutils.getmd5(archive), size=os.path.getsize(archive), filters=filters)
     else:
-        self.log(str("Updating %s to metadata" % os.path.basename(archive)))
+        LOGGER.info(str("Updating %s to metadata" % os.path.basename(archive)))
         result = md[os.path.basename(archive)]
         result['md5checksum'] = unicode(fileutils.getmd5(archive))
         result['size'] = unicode(os.path.getsize(archive))
@@ -231,12 +246,12 @@
         md[os.path.basename(archive)] = result
     md.save()
 except Exception, e:
-    self.log('ERROR: %s' % e)
-    traceback.print_exc()
-    # Let's propagate at the moment
-    raise e
+    LOGGER.error('ERROR: %s' % e)
+    sys.exit(-1)
 ]]> 
-    </scriptdef>
+            </hlm:python>
+        </sequential>
+    </macrodef>
     
     <!-- This macro update the metadata file generated by the config provided by file.
     e.g:
@@ -244,22 +259,28 @@
     <hlm:updateMD5Macro file="${zip.config.file.parsed}" config="${zips.@{type}.spec.name}"/>
     </pre>
     -->
-    <scriptdef name="updateMD5Macro" language="jython" uri="http://www.nokia.com/helium">
+    <macrodef name="updateMD5Macro" uri="http://www.nokia.com/helium">
         <attribute name="file" />
         <attribute name="config" />
+        <sequential>
+            <hlm:python>
         <![CDATA[
 import configuration
 import archive
 import os
 import symrec
-import traceback       
+import ant
+import logging
+import sys
 
-self.setTaskName("update-md5")
+LOGGER = logging.getLogger("metadataMD5updater")
+LOGGER.setLevel(level=logging.INFO)
+logging.basicConfig(level=logging.INFO)
           
 # Reading the config from Ant
 try:
-    config_filename = str(attributes.get('file'))
-    spec_name = str(attributes.get('config'))
+    config_filename = ant.get_property(r'@{file}')
+    spec_name = ant.get_property(r'@{config}')
     # Loading the config file.                        
     builder = configuration.NestedConfigurationBuilder(open(config_filename, 'r'))
     configSet = builder.getConfiguration()
@@ -271,16 +292,16 @@
             md5update.update()
             md5update.save()
         else:
-            self.log(str('WARNING: Could not find %s.' % os.path.join(configs[0]['archives.dir'], "release_metadata.xml")))
+            LOGGER.warning(str('WARNING: Could not find %s.' % os.path.join(configs[0]['archives.dir'], "release_metadata.xml")))
     else:
-        self.log('WARNING: No config.')
+        LOGGER.warning('WARNING: No config.')
 except Exception, e:
-    self.log('ERROR: %s' % e)
-    traceback.print_exc()
-    # Let's propagate at the moment
-    raise e
+    LOGGER.error('ERROR: %s' % e)
+    sys.exit(-1)
 ]]> 
-    </scriptdef>
+        </hlm:python>
+        </sequential>
+    </macrodef>
 
     <condition property="archive.using.ec">
         <or>
@@ -294,21 +315,27 @@
         <attribute name="type" />
         <attribute name="file" />
         <attribute name="ec" default="${archive.using.ec}"/>
+        <attribute name="failonemptyconfig" default="true"/>
+        <attribute name="phase" default="archive"/>
         <sequential>
             <if>
                 <not>
                     <isset property="zip.@{type}.log.file" />
                 </not>
                 <then>
-                    <property name="zip.@{type}.log.file" location="${build.log.dir}/${build.id}_@{type}_zip.log" />
+                    <property name="zip.@{type}.log.file" location="${@{phase}.log.dir}/${build.id}_@{type}_zip.log" />
                 </then>
             </if>
+            <mkdir dir="${@{phase}.log.dir}"/>
+            <mkdir dir="${post.log.dir}"/>
+            <property name="zip.@{type}.nopolicy.log.file" location="${@{phase}.log.dir}/${build.id}_@{type}_archive.nopolicy.log" />
+            <property name="zip.@{type}.policy.log.file" location="${@{phase}.log.dir}/${build.id}_@{type}_archive.policy.log" />
             <trycatch property="exception" reference="exception">
                 <try>
                     <!-- Don't print 'compressing' on console -->
                     <hlm:logtoconsole action="stop" />
                     <!-- Stops writing on ...ant_build.log file-->
-                    <hlm:startSpecificLogMacro name="${zip.@{type}.log.file}" />
+                    <hlm:startSpecificLogMacro name="${zip.@{type}.log.file}" phase="@{phase}"/>
             
                     <property name="zip.config.file.parsed" location="${temp.build.dir}/zip.cfg.xml.parsed" />
                     <copy file="@{file}" tofile="${zip.config.file.parsed}" overwrite="true">
@@ -316,12 +343,12 @@
                             <expandproperties />
                         </filterchain>
                     </copy>
-                    <hlm:updateArchiveConfig configtype="${zips.@{type}.spec.name}" configfileparsed="${zip.config.file.parsed}" usingec="@{ec}" />
+                    <hlm:updateArchiveConfig configtype="${zips.@{type}.spec.name}" configfileparsed="${zip.config.file.parsed}" usingec="@{ec}" failonemptyconfig="@{failonemptyconfig}"/>
                     <if>
                         <istrue value="@{ec}" />
                         <then>
                             <echo>emake.root.to.append=${emake.root.to.append}</echo>
-                            <hlm:emakeMacro name="archive-full-@{type}" makefile="${build.drive}/ZIP_${zips.@{type}.spec.name}.make" target="all" dir="${build.drive}" annodetail="basic,history,file,waiting" root="${emake.root.to.append}" failonerror="false" />
+                            <hlm:emakeMacro name="archive-full-@{type}" makefile="${build.drive}/ZIP_${zips.@{type}.spec.name}.make" target="all" dir="${build.drive}/" annodetail="basic,history,file,waiting" root="${emake.root.to.append}" failonerror="false" phase="archive"/>
                         </then>
                         <else>
                             <if>
@@ -358,12 +385,12 @@
                 <finally>
                     <!-- Todo: metadata: Convert to metadata structure -->
                     <!-- Stops log back to main log. -->
-                    <hlm:stopSpecificLogMacro name="${zip.@{type}.log.file}" />
+                    <hlm:stopSpecificLogMacro name="${zip.@{type}.log.file}" phase="@{phase}"/>
                     <hlm:logtoconsole action="resume" />
                 </finally>
             </trycatch>
             <hlm:assertFileExists file="${zip.@{type}.log.file}" />
-            <copy file="${zip.@{type}.log.file}" tofile="${build.log.dir}/${build.id}_@{type}_archive.nopolicy.log" verbose="true">
+            <copy file="${zip.@{type}.log.file}" tofile="${zip.@{type}.nopolicy.log.file}" verbose="true">
                 <filterchain>
                     <linecontainsregexp negate="true">
                         <regexp pattern="POLICY_(ERROR|WARNING|INFO)" />
@@ -372,15 +399,15 @@
             </copy>
             <hlm:metadatarecord database="${metadata.dbfile}">
                 <hlm:textmetadatainput>
-                    <fileset casesensitive="false" file="${build.log.dir}/${build.id}_@{type}_archive.nopolicy.log" />
+                    <fileset casesensitive="false" file="${zip.@{type}.nopolicy.log.file}" />
                     <metadatafilterset refid="filterset.archive.nopolicy" />
                 </hlm:textmetadatainput>
             </hlm:metadatarecord>
-            <hlm:signalMacro logfile="${build.log.dir}/${build.id}_@{type}_archive.nopolicy.log" 
+            <hlm:signalMacro logfile="${zip.@{type}.nopolicy.log.file}" 
                 signal.input="archiveErrorSignalInput" />
 
             <!-- Extracting policy errors from archiving. -->
-            <copy file="${zip.@{type}.log.file}" tofile="${build.log.dir}/${build.id}_@{type}_archive.policy.log" verbose="true">
+            <copy file="${zip.@{type}.log.file}" tofile="${zip.@{type}.policy.log.file}" verbose="true">
                 <filterchain>
                     <linecontainsregexp>
                         <regexp pattern="POLICY_(ERROR|WARNING|INFO)" />
@@ -390,14 +417,14 @@
                     </tokenfilter>
                 </filterchain>
             </copy>
-            <hlm:assertFileExists file="${build.log.dir}/${build.id}_@{type}_archive.policy.log" />
+            <hlm:assertFileExists file="${zip.@{type}.policy.log.file}" />
             <hlm:metadatarecord database="${metadata.dbfile}">
                 <hlm:textmetadatainput>
-                    <fileset casesensitive="false" file="${build.log.dir}/${build.id}_@{type}_archive.policy.log" />
+                    <fileset casesensitive="false" file="${zip.@{type}.policy.log.file}" />
                     <metadatafilterset refid="filterset.archive.policy" />
                 </hlm:textmetadatainput>
             </hlm:metadatarecord>
-            <hlm:signalMacro logfile="${build.log.dir}/${build.id}_@{type}_archive.policy.log" 
+            <hlm:signalMacro logfile="${zip.@{type}.policy.log.file}" 
                 signal.input="archivePolicyErrorSignalInput" />
         </sequential>
     </macrodef>
@@ -410,12 +437,16 @@
         <attribute name="configtype" />
         <attribute name="configfileparsed" />
         <attribute name="usingec" />
+        <attribute name="failonemptyconfig" />
         <![CDATA[
 import archive
 import configuration
 import logging
 import os
 
+failonemptyconfig = True      
+if attributes.get('failonemptyconfig'):
+    failonemptyconfig = str(attributes.get('failonemptyconfig')).lower() == "true"
 config_parsed_filename = str(attributes.get('configfileparsed'))
 config_type = str(attributes.get('configtype'))
 is_it_ec = str(attributes.get('usingec'))
@@ -430,14 +461,13 @@
     outputtype = 'make'
     outputext = '.make'
 
-if len(configs) > 0:
+if len(configs) > 0 or not failonemptyconfig:
     prebuilder = archive.ArchivePreBuilder(configuration.ConfigurationSet(configs), config_type, outputtype)
     if os.sep == '\\':
         toAppendEmakeRoot = prebuilder.checkRootDirValue(builder, config_parsed_filename, project.getProperty('build.drive'), config_type)
         if toAppendEmakeRoot is not None:
             project.setProperty("emake.root.to.append", str(toAppendEmakeRoot))
     prebuilder.writeTopLevel(os.path.join(project.getProperty('build.drive') + os.sep, 'ZIP_' + config_type + outputext), project.getProperty('temp.build.dir'), config_parsed_filename)       
-    
 else:
     raise Exception('There are no archive configs to build. Looked for %s' % config_type)
 ]]>
@@ -776,16 +806,58 @@
     by the "final" target last.
     -->
     <target name="publish-build-log" depends="prep-publish" if="publish">
-        <record name="${build.log}" action="stop" append="true" />
         <copy todir="${publish.dir}/logs" preservelastmodified="true" failonerror="false">
-            <fileset dir="${build.log.dir}" includes="${build.id}*_ant_build.log" />
+            <fileset dir="${build.log.dir}" includes="**/*.log" />
         </copy>
     </target>
 
+    <!-- Copy the debug log to the build area if available-->
+    <target name="copy-debug-logs">
+        <echo message="log4j.dir:${log4j.cache.dir}" /> 
+        <if>
+            <available file="${log4j.cache.dir}" />
+            <then>
+                <copy todir="${build.log.dir}/debug" failonerror="false">
+                    <fileset dir="${log4j.cache.dir}" includes="hlm_*.log" />
+                </copy>
+            </then>
+        </if>
+    </target>
+
+    <!-- Target to simulate that the build is failed because of processing
+    ant output
+    -->
+    <target name="raise-error">
+        <echo message="ERROR: Build failed due to exceptions" />
+    </target>
+
+    <!-- Update the build status by processing the ant build output log -->
+    <target name="build-status">
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:antmetadatainput>
+                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_ant_build.log" />
+                <metadatafilterset refid="filterset.ant.output" />
+            </hlm:antmetadatainput>
+        </hlm:metadatarecord>
+
+        <hlm:signalMacro logfile="${build.id}_ant_build.log" 
+            signal.input="exceptionSignalInput" />
+    </target>
+
+    <!-- Exception handler to process the ant output log -->
+    <target name="hlm-exception-handler">
+        <if>
+            <available file="${build.log.dir}/${build.id}_ant_build.log"/>
+            <then>
+                <runtarget target="do-exception-handler" />
+            </then>
+        </if>
+    </target>
+
+    <target name="do-exception-handler" depends="raise-error, build-status, build-log-summary, copy-debug-logs, publish-build-log" />
 
     <!-- Does any wrap-up at the end of the build. This should be the last target for every top-level target. -->
-    <target name="final" depends="publish-build-log">
-    </target>
+    <target name="final" depends="build-status, build-log-summary, copy-debug-logs, publish-build-log" />
     
     <!-- This target will zip the WA depending on the ado mapping file -->
     <target name="zip-wa" depends="ido-create-ado-mapping" if="zip.wa">
--- a/buildframework/helium/tools/publish/publish_dir_files/build.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/publish/publish_dir_files/build.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,8 +21,9 @@
 ============================================================================
 -->
 <project name="published.root">
-
-    <property environment="env"/>
+    <description>
+        published.root
+    </description>    
     <property file="build_properties.txt"/>
     <import file="helium/helium.ant.xml"/>
 
--- a/buildframework/helium/tools/publish/synergy.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/publish/synergy.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -27,12 +27,9 @@
 
     <!-- Validate all the inputs for the publish-tasks-to-folder target. -->
     <target name="publish-tasks-to-folder-check" if="publish.ccm.folder">
-        <if>
-            <available file="${build.log.dir}/${build.id}_bom.xml" />
-            <then>
-                <property name="do.publish-tasks-to-folder" value="true" />
-            </then>
-        </if>
+        <condition property="do.publish-tasks-to-folder" value="true">
+            <available file="${temp.build.dir}/${build.id}_bom.xml" />
+        </condition>
     </target>
 
     <!-- Copies all the task found in the BOM into defined folder. -->
@@ -43,7 +40,7 @@
                 macro: ${helium.dir}/tools/common/templates/macro
             </freemarkerLinks>
             <data expandProperties="yes">
-                bom: xml(${build.log.dir}/${build.id}_bom.xml)
+                bom: xml(${temp.build.dir}/${build.id}_bom.xml)
                 ant: antProperties()
             </data>
         </fmpp>
--- a/buildframework/helium/tools/publish/test/test2_publishing_to_diamonds.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/publish/test/test2_publishing_to_diamonds.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,7 +21,9 @@
 ============================================================================
 -->
 <project name="xtest_publishing_to_diamonds" xmlns:hlm="http://www.nokia.com/helium">
-
+    <description>
+        Targets to test publishing to diamonds
+    </description>
     <!-- Private: -->
     <target name="xtest-diamonds" depends="setup-test-publishing-to-diamonds,diamonds,xtest-diamonds-validate-policy,xtest-diamonds-check-tool-dependencies"/>
     
@@ -57,13 +59,13 @@
     <target name="xtest-diamonds-check-tool-dependencies">
         <antcall target="check-tool-dependencies">
         </antcall>            
-        <xpathtest xmlfile="${build.log.dir}/check-tool-dependencies.xml">  
+        <xpathtest xmlfile="${diamonds.build.output.dir}/check-tool-dependencies.xml">  
             <namespace uri="" prefix=""/>
             <xpath expression="/diamonds-build/tools/tool[name='java']"/>
             <xpath expression="/diamonds-build/tools/tool[name='ant']"/>
             <xpath expression="/diamonds-build/tools/tool[name='python']"/>
         </xpathtest>
-        <xpathtest xmlfile="${build.log.dir}/diamonds-start.log.xml">  
+        <xpathtest xmlfile="${diamonds.build.output.dir}/diamonds-start.log.xml">  
             <namespace uri="" prefix=""/>
             <xpath expression="/diamonds-build/build[build_system='ebs']"/> 
         </xpathtest>
@@ -73,7 +75,7 @@
     <target name="xtest-diamonds-validate-policy">
         <antcall target="render-validate-policy">
         </antcall>            
-        <xpathtest xmlfile="${build.log.dir}/render-validate-policy.xml">  
+        <xpathtest xmlfile="${diamonds.build.output.dir}/render-validate-policy.xml">  
             <namespace uri="" prefix=""/>
             <xpath expression="/diamonds-build[schema &gt; 9]"/> 
         </xpathtest>
--- a/buildframework/helium/tools/publish/test/test_macro.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/publish/test/test_macro.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,6 +21,9 @@
 ============================================================================
 -->
 <project name="test_macro" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+          Targets to test macro
+    </description>
     <property environment="env" />
     <property name="helium.dir" location="../../.." />
     <import file="../../../helium.ant.xml" />
--- a/buildframework/helium/tools/quality/conflict-checker.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/quality/conflict-checker.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -25,7 +25,7 @@
         Analyse the content created from two different components.
     </description>
 
-    <property name="build.duplicates.log" location="${build.log.dir}/${build.id}_build_duplicates.xml" />
+    <property name="build.duplicates.log" location="${temp.build.dir}/${build.id}_build_duplicates.xml" />
 
     <!--
         This macro extract the list of files generated/exported several time from different component 
@@ -55,15 +55,12 @@
        Check if the build duplicated needs to be run.
     -->
     <target name="check-build-duplicates">
-        <if>
+        <condition property="skip.build.duplicates" value="">
             <or>
                 <equals arg1="${build.system}" arg2="sbs" />
                 <equals arg1="${build.system}" arg2="sbs-ec" />
             </or>
-            <then>
-                <property name="skip.build.duplicates" value="" />
-            </then>
-        </if>
+        </condition>
     </target>
 
     <!-- Parse all the build log and extract files that are generated/exported
@@ -71,7 +68,7 @@
     -->
     <target name="integration-build-duplicates" depends="check-build-duplicates" unless="skip.build.duplicates">
         <hlm:checkBuildDuplicatesMacro output="${build.duplicates.log}">
-            <fileset dir="${build.log.dir}">
+            <fileset dir="${compile.log.dir}">
                 <include name="${build.id}.*_compile.log" />
                 <include name="${build.id}.what.cmaker.log" />
                 <exclude name="${build.id}.*_output_build.log" />
--- a/buildframework/helium/tools/quality/internal-exports.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/quality/internal-exports.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -71,8 +71,8 @@
         source tree. The files are sorted by components.
     -->
     <target name="integration-internal-exports">
-        <hlm:internalExportsMacro output="${build.log.dir}/${build.id}_internal_exports.xml">
-            <fileset dir="${build.log.dir}">
+        <hlm:internalExportsMacro output="${temp.build.dir}/${build.id}_internal_exports.xml">
+            <fileset dir="${compile.log.dir}">
                 <include name="${build.id}.*_compile.log"/>
                 <exclude name="${build.id}.*_output_build.log"/>
             </fileset>
@@ -88,7 +88,7 @@
                 macro: ${helium.dir}/tools/common/templates/macro
             </freemarkerLinks>
             <data expandProperties="yes">
-                doc: xml(${build.log.dir}/${build.id}_internal_exports.xml)
+                doc: xml(${temp.build.dir}/${build.id}_internal_exports.xml)
                 ant: antProperties()
             </data>
         </fmpp>
--- a/buildframework/helium/tools/quality/mmp-to-target.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/quality/mmp-to-target.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -79,7 +79,8 @@
         \src\common\generic\wap-stack\wapstack\group\wapstksrv.mmp : wapstksrv.dll        
     -->
     <target name="integration-mmp-to-target">
-        <hlm:mmpToTargetMacro output="${build.log.dir}/${build.id}_targets_from_mmps.txt">
+        <mkdir dir="${post.log.dir}" />
+        <hlm:mmpToTargetMacro output="${post.log.dir}/${build.id}_targets_from_mmps.txt">
             <fileset refid="mmp.to.target.config"/>
         </hlm:mmpToTargetMacro>
     </target>
--- a/buildframework/helium/tools/quality/quality.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/quality/quality.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,6 +21,9 @@
 ============================================================================
 -->
 <project name="quality">
+    <description>
+        Quality
+    </description>
     <import file="conflict-checker.ant.xml"/>
     <import file="internal-exports.ant.xml"/>
     <import file="mmp-to-target.ant.xml"/>
--- a/buildframework/helium/tools/quality/validate-policy.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/quality/validate-policy.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -25,8 +25,8 @@
     Policy file validation.
     </description>
 
-    <property name="validate.policy.log" location="${build.log.dir}/${build.id}_validate-policy.summary.xml" />
-    <property name="validate.policy.log.xml" location="${build.log.dir}/${build.id}_validate-policy.log.xml" />
+    <property name="validate.policy.log" location="${temp.build.dir}/${build.id}_validate-policy.summary.xml" />
+    <property name="validate.policy.log.xml" location="${temp.build.dir}/${build.id}_validate-policy.log.xml" />
     <property name="validate.policy.csv" location="${helium.dir}/tests/minibuilds/compile/distribution.policy.extended_for_sf.id_status.csv" />
     <property name="validate.policy.ignoreroot" value="false" />
     <property name="validate.policy.pattern" value="distribution.policy.s60,distribution.policy" />
@@ -109,6 +109,7 @@
   -->
     <target name="integration-validate-policy">
         <mkdir dir="${build.log.dir}"/>
+        <mkdir dir="${post.log.dir}"/>
         <hlm:validatePolicyMacro output="${validate.policy.log}" ids="${validate.policy.csv}" ignoreroot="${validate.policy.ignoreroot}" pattern="${validate.policy.pattern}">
             <path refid="reference.policy.path.list" />
         </hlm:validatePolicyMacro>
@@ -117,7 +118,7 @@
                 <fileset casesensitive="false" file="${validate.policy.log}/" />
             </hlm:policymetadatainput>
         </hlm:metadatarecord>
-        <hlm:generateBuildStatus file="${build.id}_validate_policy.log" />
+        <hlm:generateBuildStatus file="${build.id}_validate-policy.summary" />
     </target>
 
     <!--
@@ -129,7 +130,7 @@
                 <istrue value="${metadata.enable}" />
             </not>
             <then>
-                <fmpp sourceFile="${helium.dir}/tools/common/templates/integration/validate-policy.log.ftl" outputFile="${build.log.dir}/${build.id}_validate-policy.log">
+                <fmpp sourceFile="${helium.dir}/tools/common/templates/integration/validate-policy.log.ftl" outputFile="${post.log.dir}/${build.id}_validate-policy.log">
                     <freemarkerLinks expandProperties="yes">
                       macro: ${helium.dir}/tools/common/templates/macro
                   </freemarkerLinks>
@@ -167,12 +168,9 @@
       Internal target that set an intermediate property to disable policy validation execution.
     -->
     <target name="ido-validate-policy-skip">
-        <if>
+        <condition property="do.skip.policy-validation" value="1">
             <istrue value="${skip.policy-validation}"/>
-            <then>
-                <property name="do.skip.policy-validation" value="1"/>
-            </then>
-        </if>
+        </condition>
     </target>
     
     <!-- Policy validation target for IDO. Only detected ADO will get scanned. -->    
--- a/buildframework/helium/tools/relnotes/relnotes.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/relnotes/relnotes.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -106,11 +106,12 @@
     <!-- Private: Find project and baseline of what is running helium -->
     <target name="release-notes-getcmprojectname">
         <script language="jython" setbeans="false">
-import nokia.nokiaccm
 import ccm.extra
 import traceback
 import os
 import logging
+import ccmutil
+
 #logging.basicConfig(level=logging.DEBUG)
 session = None
 try:
@@ -120,12 +121,10 @@
     engine = project.getProperty('ccm.engine.host')
     dbpath = project.getProperty('ccm.database.path')     
     waroot = project.getProperty('create.bom.workarea.root')
-    if database != None:
-        session = nokia.nokiaccm.open_session(username, password, database=database)
-    else:
-        session = nokia.nokiaccm.open_session(username, password, engine, dbpath)
-        
+    
+    session = ccmutil.get_session(database, username, password, engine, dbpath)
     cmproject = ccm.extra.get_toplevel_project(session, waroot)
+    
     if cmproject == None:
         print 'Error: ' + waroot + ' must be a synergy project and still be in database'
     else:
@@ -135,12 +134,11 @@
     print 'Caught exception: ' + str(ex)
     traceback.print_exc()
         </script>
-        
         <hlm:python outputproperty="ccm.toplevel.baseline">
-import nokia.nokiaccm
 import traceback
 import ant
 import logging
+import ccmutil
 logging.disable(logging.INFO)
 session = None
 try:
@@ -149,11 +147,7 @@
     password = ant.get_property(r'${ccm.user.password}')
     engine = ant.get_property(r'${ccm.engine.host}')
     dbpath = ant.get_property(r'${ccm.database.path}')
-    if database != None:
-        session = nokia.nokiaccm.open_session(username, password, database=database)
-    else:
-        session = nokia.nokiaccm.open_session(username, password, engine, dbpath)
-        
+    session = ccmutil.get_session(database, username, password, engine, dbpath)
     cmproject = session.create(ant.get_property(r'${ccm.toplevel.project}'))
     print cmproject.baseline
     session.close()
@@ -172,7 +166,7 @@
 import amara
 import ant
 
-bomfile = open(r"${build.log.dir}/${build.id}_BOM.xml")
+bomfile = open(r"${temp.build.dir}/${build.id}_BOM.xml")
 bom = amara.parse(bomfile)
 
 for p in bom.bom.content.project:
@@ -188,93 +182,28 @@
     
     <!-- Private: Write projects, baselines and task list for MC and IBUSAL -->
     <target name="release-notes-ccm" depends="get-ccm-password,release-notes-getcmprojectname,create-bom">
-        
         <hlm:python>
 import amara
-import nokia.nokiaccm
 import ant
+import bomtofile
+import ccmutil
 
-class BOMToFile(object):
-    """
-    Read BOM and output in text
-    """
-    def __init__(self, session, project_name, project, output_dir):
-        self.project_name = project_name
-        self.project = project
-        self.output_dir = output_dir
-        self.session = session
-      
-    def writeprojects(self):
-        fileout = file(self.output_dir + '/' + self.project_name + '_projects.txt', 'w')
-        
-        i = 1
-        for project in self.project.baseline:
-            fileout.write(str(i) + ") " + str(project) + "\n")
-            
-            i += 1
-        fileout.close()
-        
-    def writebaselines(self):
-        fileout = file(self.output_dir + '/' + self.project_name + '_baselines.txt', 'w')    
-        
-        i = 1
-        for project in self.project.baseline:
-            fileout.write(str(i) + ") " + str(project) + "\n")
-            
-            cmproject = self.session.create(str(project))
-            
-            try:
-                baseline = str(cmproject.baseline).strip()
-                if baseline == "None":
-                    fileout.write(str(i) + ") " + str(project) + "\n")
-                else:
-                    fileout.write(str(i) + ") " + baseline + "\n")
-                i += 1
-            except Exception, ex:
-                print ex
-        fileout.close()
-            
-    def writetasks(self):
-        if self.project.xml_properties.has_key("task"):
-            fileout = file(self.output_dir + '/' + self.project_name + '_tasks.txt', 'w')
-            
-            i = 1
-            for task in self.project.task:
-                fileout.write(str(i) + ") Task " + str(task) + "\n")
-                i += 1
-            fileout.close()
-
-bomfile = open(r"${build.log.dir}/${build.id}_BOM.xml")
+bomfile = open(r"${temp.build.dir}/${build.id}_BOM.xml")
 bom = amara.parse(bomfile)
-database = ant.get_property(r'${ccm.database}')
-username = ant.get_property(r'${ccm.user.login}')
-password = ant.get_property(r'${ccm.user.password}')
-engine = ant.get_property(r'${ccm.engine.host}')
-dbpath = ant.get_property(r'${ccm.database.path}')
-if database != None:
-    session = nokia.nokiaccm.open_session(username, password, database=database)
-else:
-    session = nokia.nokiaccm.open_session(username, password, engine, dbpath)
-
+session = ccmutil.get_session(ant.get_property(r'${ccm.database}'), ant.get_property(r'${ccm.user.login}'), ant.get_property(r'${ccm.user.password}'), ant.get_property(r'${ccm.engine.host}'), ant.get_property(r'${ccm.database.path}'))
 for p in bom.bom.content.project:
     if p.name == ant.get_property(r'${ccm.toplevel.project}'):
-        btof = BOMToFile(session, 'MC', p, ant.get_property(r'${releasenotes.output.dir}'))
-        
-        btof.writeprojects()
-        btof.writebaselines()
-            
-        btof.writetasks()
+        bomwriter = bomtofile.BOMWriter(session, 'MC', p, ant.get_property(r'${releasenotes.output.dir}'))
+        bomwriter.writeprojects()
+        bomwriter.writebaselines()
+        bomwriter.writetasks()
             
     if (str(p.name).startswith('IBUSAL')):
-        btof = BOMToFile(session, 'IBUSAL', p, ant.get_property(r'${releasenotes.output.dir}'))
-        
-        btof.writeprojects()
-            
-        btof.writetasks()
-            
+        bomwriter = bomtofile.BOMWriter(session, 'IBUSAL', p, ant.get_property(r'${releasenotes.output.dir}'))
+        bomwriter.writeprojects()
+        bomwriter.writetasks()
 session.close()
 bomfile.close()
-
         </hlm:python>
     </target>
     
@@ -282,7 +211,7 @@
     <target name="release-notes-icfs" depends="create-bom">
         <exec executable="python" dir="${helium.dir}/tools/relnotes" failonerror="${failonerror}">
             <arg value="icf2txt.py"/>
-            <arg value="${build.log.dir}/${build.id}_BOM.xml"/>            
+            <arg value="${temp.build.dir}/${build.id}_BOM.xml"/>            
             <arg value="${releasenotes.output.dir}/icdicf.txt"/>
         </exec>
     </target>
--- a/buildframework/helium/tools/rombuild/dryrun_parser.py	Wed Oct 28 14:39:48 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,216 +0,0 @@
-#============================================================================ 
-#Name        : dryrun_parser.py 
-#Part of     : Helium 
-
-#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-#All rights reserved.
-#This component and the accompanying materials are made available
-#under the terms of the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-""" parse a python file in a given environment, and get out some results """
-import re
-import os
-import sys
-
-if __name__ == '__main__':
-    if len(sys.argv)<3:
-        print("dryrun requires input txt file and output make file and the target to run")
-        sys.exit(-1)
-
-    #input arguments    
-    input_file = sys.argv[1]
-    output_file = sys.argv[2]
-    make_target = sys.argv[3]
-    
-    
-    variation_commands = {}
-    regional_commands = []
-
-    #parse imaker output
-    fin = open(input_file, "r")
-    imaker_pattern = '^imaker'
-    foti_fota_pattern = ' fot[ia]'
-    core_pattern = 'core|rofs3|flash$'
-    workdir_pattern = 'WORKDIR='
-    regional_pattern = '^unzip'
-    regional_key = ""
-    new_regional_key = ""
-    regional_keys = []
-    temporary_list = []
-    unzip_commands = []
-    workdir_string = ""
-    
-    for line in fin:
-#       """ First look for unzip command. """
-        if(re.search(regional_pattern, line)):
-            temporary_list = line.split(' ')
-            unzip_commands.append(line)
-            new_regional_key = temporary_list[-1]
-            #print regional_key
-            if(not len(regional_key) == 0):
-#                """ Will be processing next region, so store the commands for this region."""
-                if(variation_commands.has_key(regional_key)):
-                    variation_commands[regional_key] = regional_commands
-                regional_key = new_regional_key
-                if(variation_commands.has_key(new_regional_key)):
-                    regional_commands = variation_commands[new_regional_key]
-                else:
-                    regional_commands = []
-                    variation_commands[new_regional_key] = regional_commands
-            else:
-                variation_commands[new_regional_key] = regional_commands
-                regional_key = new_regional_key
-        if(re.search(imaker_pattern, line)):
-            workdir_list = re.split(workdir_pattern, line)
-            if(len(workdir_list) > 1):
-                #print workdir_list
-                workdir_string = re.split("\"", workdir_list[1])[0]
-                #print "workdir_string"
-                #print workdir_string
-                if(not os.path.exists(workdir_string)):
-                    os.makedirs(workdir_string)
-            regional_commands.append(line)
-    fin.close()
-    variation_commands[regional_key] = regional_commands
-    
-#    """ Group the commands for the region and write the commands into a makefile."""
-    fin = open(output_file, "w")
-    all_string = "%s: foti_fota_all \\\n\tcore_rofs_image_all \\\n\trest_of_all" % make_target
-    core_rofs_all_string = "core_rofs_image_all:"
-    variation_image_all_string = "variation_all:"
-    variation_image_string = ""
-    core_rofs_string = ""
-    core_image_id = 0
-    e2flash_id = 0
-    e2flash_all_string = "#pragma runlocal\ne2flash_target_all:\n"
-    variation_image_id = 0
-    variation_e2f_id = 0
-    variation_id = 0
-    
-    foti_fota_all_string = "#pragma runlocal\nfoti_fota_all:"
-    foti_fota_all_string += "\n\t"+unzip_commands[variation_id]
-    rest_of_all_target_string = "rest_of_all:"
-    rest_of_target_string = ""
-    rest_of_target_id = 0
-
-    count = 0
-    dict_list = variation_commands.keys()
-    for key in dict_list:
-        print "before reverse key"
-        print key
-        print len(variation_commands.get(key))
-    
-    dict_list.reverse()
-
-    for key in dict_list:
-        print "key"
-        print key
-        print len(variation_commands.get(key))
-    #    for command in commands:
-    #        print command
-
-    unzip_var_string = ""
-    variation_image_all_string = ""
-    variation_dependency = "variation0"
-    for key in dict_list:
-        commands = variation_commands.get(key)
-        if(variation_id != 0):
-            unzip_var_string += "unzip_var%d:%s" % (variation_id, variation_dependency)
-            variation_dependency ="variation%d " % (variation_id)
-            unzip_var_string += "\n\t"+unzip_commands[variation_id]
-        all_string += "\\\n\tvariation%d " % variation_id
-        variation_image_all_string +="variation%d: " % variation_id
-        #print "no. of comands"
-        #print len(commands)
-        for command in commands:
-            #print variation_id
-            #print command
-            if(re.search(foti_fota_pattern, command)):
-                #print "foti command"
-                #print command
-                foti_fota_all_string += "\t"+command
-            elif(re.search('flash$',command)):
-                #print "flash command"
-                #print command
-                core_rofs_string += ("core_rofs_image%d:foti_fota_all" % (core_image_id))
-                temp_string = re.sub('flash$', 'core-image rofs2-image rofs3-image', command)
-                core_rofs_string += "\n\t"+temp_string+"\n"
-                temp_string = re.sub('flash$', 'core-e2flash rofs2-e2flash rofs3-e2flash', command)
-                e2flash_all_string += "\t"+temp_string
-                core_rofs_all_string += " \\\n\t core_rofs_image%d" % core_image_id
-                core_image_id += 1
-            elif(re.search('core$',command)):
-                #print "core command"
-                #print command
-                core_rofs_string += ("core_rofs_image%d:foti_fota_all" % (core_image_id))
-                temp_string = re.sub('core$', 'core-image', command)
-                core_rofs_string += "\n\t"+temp_string + "\n"
-                temp_string = re.sub('core$', 'core-e2flash', command)
-                e2flash_all_string += "\t"+temp_string
-                core_rofs_all_string += " \\\n\t core_rofs_image%d" % core_image_id
-                core_image_id += 1
-            elif(re.search('rofs3$', command)):
-                #print "rofs3 command"
-                #print command
-                core_rofs_string += ("core_rofs_image%d:foti_fota_all" % (core_image_id))
-                temp_string = re.sub('rofs3$', 'rofs3-image', command)
-                core_rofs_string += "\n\t"+temp_string + "\n"
-                temp_string = re.sub('rofs3$', 'rofs3-e2flash', command)
-                e2flash_all_string += "\t"+temp_string
-                core_rofs_all_string += " \\\n\t core_rofs_image%d" % core_image_id
-                core_image_id += 1
-            elif(re.search('rofs2$',command)):
-                #print "rofs2 command"
-                #print variation_id
-                #print command
-                if(variation_id == 0):
-                    variation_image_string += ("variation_image%d:rest_of_all")  %(variation_image_id)
-                else:
-                    variation_image_string += ("variation_image%d:unzip_var%d")  %(variation_image_id, variation_id)
-                temp_string = re.sub('rofs2$', 'rofs2-image', command)
-                variation_image_string += "\n\t"+temp_string+"\n"
-                temp_string = re.sub('rofs2$', 'rofs2-e2flash', command)
-                e2flash_all_string += "\t"+temp_string
-                variation_image_all_string += " \\\n\tvariation_image%d" % variation_image_id
-                variation_image_id += 1
-            else:
-                rest_of_target_string += ("\nrest_%d:core_rofs_image_all" % (rest_of_target_id))
-                rest_of_target_string += "\n\t"+command+"\n"
-                rest_of_all_target_string += " \\\n\t rest_%d" % rest_of_target_id
-                rest_of_target_id += 1
-        variation_id += 1
-        unzip_var_string += "\n\n"
-        variation_image_all_string += "\n\n"
-
-    all_string += "\\\n\te2flash_target_all\n\n"
-    #print core_rofs_all_string
-    core_rofs_all_string += "\n\n"
-    rest_of_all_target_string += "\n\n"
-    e2flash_all_string += "\n\n"
-    foti_fota_all_string += "\n\n"
-    core_rofs_string += "\n\n"
-    rest_of_target_string += "\n\n"
-    unzip_var_string += "\n\n"
-    variation_image_all_string += "\n\n"
-    e2flash_all_string += "\n\n"
-    fin.write(all_string)
-    fin.write(core_rofs_all_string)
-    fin.write(rest_of_all_target_string)
-    fin.write(unzip_var_string)
-    fin.write(variation_image_all_string)
-    fin.write(foti_fota_all_string)
-    fin.write(core_rofs_string)
-    fin.write(variation_image_string)
-    fin.write(rest_of_target_string)
-    fin.write(e2flash_all_string)
-    fin.close()
\ No newline at end of file
--- a/buildframework/helium/tools/rombuild/imaker.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/rombuild/imaker.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -25,111 +25,6 @@
         ROM image creation using iMaker (future implementation).
     </description>
 
-    <!-- Defining the default rom image creation templates. -->
-    <property name="imaker.fmpp.makefile" location="${helium.dir}/tools/common/templates/imaker/build_imaker_roms_signing.mk.ftl"/>
-    <property name="imaker.fmpp.ant" location="${helium.dir}/tools/common/templates/imaker/build_imaker_roms.ant.xml.ftl"/>
-    
-    
-    <!-- The iMaker task. -->
-    <macrodef name="imaker" uri="http://www.nokia.com/helium">
-        <element name="config"/>
-        <attribute name="engine" default="ebs"/>
-        <attribute name="name" default=""/>
-        <attribute name="signal" default="true"/>
-        <sequential>
-            <hlm:tempRecordStartMacro name="${build.id}@{name}.roms.log"/>
-            <hlm:imaker2tdd property="internal.imaker.tdd" dir="${build.drive}/">
-                <config/>
-            </hlm:imaker2tdd>
-            <echo>
-Generated TDD:
-${internal.imaker.tdd}
-            </echo>
-            <mkdir dir="${build.log.dir}"/>
-            <if>
-                <matches pattern="ec(-helium)?" string="@{engine}"/>
-                <then>
-                    <fmpp sourceFile="${imaker.fmpp.makefile}"
-                        outputFile="${temp.build.dir}/build_imaker_roms@{name}.mk">
-                        <data expandProperties="yes">
-                            data: ${internal.imaker.tdd}
-                            ant: antProperties()
-                        </data>
-                    </fmpp>
-                    <exec executable="${ec.emake}" dir="${build.drive}/">
-                        <arg value="--emake-build-label=${build.id}@{name}-ROMS"/>
-                        <arg value="--emake-class=${ec.build.class}"/>
-                        <arg value="--emake-annofile=${build.log.dir}\${build.id}@{name}.ROMS.emake.anno.xml"/>
-                        <arg value="--emake-autodepend=1"/>
-                        <arg value="--emake-annodetail=basic,history,file,waiting"/>                            
-                        <arg line="-f ${temp.build.dir}/build_imaker_roms@{name}.mk all"/>
-                    </exec>
-                </then>
-                <else>
-                    <fmpp sourceFile="${imaker.fmpp.ant}"
-                        outputFile="${temp.build.dir}/build_imaker_roms@{name}.ant.xml">
-                        <data expandProperties="yes">
-                            data: ${internal.imaker.tdd}
-                            ant: antProperties()
-                        </data>
-                    </fmpp>
-                    <ant antfile="${temp.build.dir}/build_imaker_roms@{name}.ant.xml" target="all" />
-                </else>
-            </if>
-            
-            <hlm:tempRecordStopMacro name="${build.id}@{name}.roms.log" filterref="filterset.imaker"/>
-            <!-- Todo: metadata: insert assertions for metadata parsing here -->
-            <if>
-                <istrue value="@{signal}"/>
-                <then>
-                    <hlm:signalMacro logfile="${build.log.dir}/${build.id}@{name}.roms.log" 
-                        signal.input="rombuildSignalInput" />
-                </then>
-            </if>
-        </sequential>
-    </macrodef>
-
-    <!--
-        This task implements the transformation of iMaker introspection into a TDD for FMPP.
-        Syntax will be like:
-        <pre>
-        <hlm:imaker2tdd property="internal.imaker.tdd">
-            <imakerconfigurationset>
-                <imakerconfiguration>
-                    <makefileset>
-                        <include name="**/PRODUCT/*ui.mk"/>
-                    </makefileset>
-                    <categoryset>
-                        <include name="build"/>
-                        <include name="release"/>
-                        <include name="test"/>
-                    </categoryset>
-                </imakerconfiguration>
-            </imakerconfigurationset>
-        </hlm:imaker2tdd>                 
-        </pre>
-    -->
-    
-    <scriptdef name="imaker2tdd" language="jython" uri="http://www.nokia.com/helium">
-        <element name="imakerconfigurationset" classname="com.nokia.ant.types.imaker.ConfigurationSet"/>
-        <attribute name="property"/>
-        <attribute name="file"/>
-        <attribute name="dir"/>
-        <![CDATA[
-import imaker
-import traceback
-import ant
-import logging
-logging.getLogger('imaker.api').addHandler(ant.AntHandler(self))
-try:
-    imaker.ant_task_configuration(project, self, elements, attributes)
-except Exception, e:
-    traceback.print_exc()
-    # Propagate the exception
-    raise e
-]]>
-    </scriptdef>
-
     <!--
        This task merges all files mentioned in the fileset and output them in filename output file. 
     -->
@@ -190,12 +85,28 @@
          'imaker.rom.config'.
     -->
     <target name="build-roms" depends="rombuild-imaker-create-buildinfo">
-        <property name="imaker.engine" value="${build.system}" />
+        <mkdir dir="${roms.log.dir}"/>
+        <if>
+            <not>
+                <isset property="imaker.engine" />
+            </not>
+            <then>
+                <if>
+                    <or>
+                        <equals arg1="${build.system}" arg2="ec-helium" />
+                        <equals arg1="${build.system}" arg2="sbs-ec" />
+                    </or>
+                    <then>
+                        <property name="imaker.engine" value="imaker.engine.ec" />
+                    </then>
+                </if>
+            </then>
+        </if>
+        <property name="imaker.engine" value="imaker.engine.default" />        
         <property name="imaker.rom.name" value=""/>
-        <hlm:imaker engine="${imaker.engine}" name="${imaker.rom.name}">
-            <config>
-                <imakerconfigurationset refid="imaker.rom.config"/>
-            </config>
+        <hlm:imaker epocroot="${build.drive}/" engineRefid="${imaker.engine}"
+                        output="${roms.log.dir}/${build.id}${imaker.rom.name}.roms.log" verbose="true">
+            <hlm:imakerconfigurationset refid="imaker.rom.config" />
         </hlm:imaker>
         <if>
             <istrue value="${blocks.enabled}" />
@@ -216,4 +127,15 @@
         </if>
     </target>
     
+    <!-- iMaker engine configuration -->
+    <hlm:defaultEngine id="imaker.engine.default" threads="${number.of.threads}" />
+
+    <hlm:emakeEngine id="imaker.engine.ec">
+        <arg value="--emake-annofile=${roms.log.dir}/${build.id}${imaker.rom.name}.anno.xml"/>
+        <arg value="--emake-root=${env.EMAKE_ROOT}${path.separator}${helium.dir}"/>
+        <arg value="--emake-annodetail=basic,history,file,waiting"/>
+        <arg value="--emake-historyfile=${roms.log.dir}/${build.id}${imaker.rom.name}.emake.data" />
+        <arg value="--emake-class=${ec.build.class}" />
+    </hlm:emakeEngine>
+    
 </project>
--- a/buildframework/helium/tools/rombuild/rombuild.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/rombuild/rombuild.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -34,9 +34,9 @@
     <property name="ee.makefile.target" value="ee_roms" />
     <property name="subcon.makefile.target" value="subcon_roms" />
     <property name="trace.makefile.target" value="trace_roms" />
-    <property name="ee_roms.log.file" value="${build.log.dir}/${build.id}_ee_roms.log" />
-    <property name="trace.log.file" value="${build.log.dir}/${build.id}_trace_roms.log" />
-    <property name="subcon.log.file" value="${build.log.dir}/${build.id}_subcon_roms.log" />
+    <property name="ee_roms.log.file" value="${roms.log.dir}/${build.id}_ee_roms.log" />
+    <property name="trace.log.file" value="${roms.log.dir}/${build.id}_trace_roms.log" />
+    <property name="subcon.log.file" value="${roms.log.dir}/${build.id}_subcon_roms.log" />
 
     <!-- Properties for image-creation target which is being used by IDOs -->
     <property name="image_creation.copyto" value="${build.output.dir}/images" />
@@ -205,7 +205,7 @@
     <!-- Creates ee-images
      -->
     <target name="ee-roms" depends="rombuild-create-makefile" unless="no.ncp">
-        <hlm:startSpecificLogMacro name="${ee_roms.log.file}" />
+        <hlm:startSpecificLogMacro name="${ee_roms.log.file}" phase="roms"/>
         <hlm:preECImakerMacro />
         <for list="${product.list}" delimiter="," param="product.name">
             <sequential>
@@ -213,7 +213,7 @@
             </sequential>
         </for>
         <hlm:ecImakerMacro makefile.target="${ee.makefile.target}" />
-        <hlm:stopSpecificLogMacro name="${ee_roms.log.file}" />
+        <hlm:stopSpecificLogMacro name="${ee_roms.log.file}" phase="roms"/>
         <hlm:metadatarecord database="${metadata.dbfile}">
             <hlm:textmetadatainput>
                 <fileset casesensitive="false" file="${ee_roms.log.file}" />
@@ -228,7 +228,7 @@
 
     <!-- Creates subcon certified rom images with imaker tool -->
     <target name="subcon-roms" depends="rombuild-create-makefile" unless="no.ncp">
-        <hlm:startSpecificLogMacro name="${subcon.log.file}" />
+        <hlm:startSpecificLogMacro name="${subcon.log.file}" phase="roms"/>
         <mkdir dir="${subcon.build.drive}/output/development_flash_images/engineering_english/${product.name}/subcon" />
         <hlm:preECImakerMacro />
         <for list="${product.list}" delimiter="," param="product.name">
@@ -237,7 +237,7 @@
             </sequential>
         </for>
         <hlm:ecImakerMacro makefile.target="${ee.makefile.target}" />
-        <hlm:stopSpecificLogMacro name="${subcon.log.file}" />
+        <hlm:stopSpecificLogMacro name="${subcon.log.file}" phase="roms"/>
         <hlm:metadatarecord database="${metadata.dbfile}">
             <hlm:textmetadatainput>
                 <fileset casesensitive="false" file= "${subcon.log.file}"/>
@@ -282,7 +282,7 @@
 
     <!-- Creates trace rom images -->
     <target name="trace-roms" depends="rombuild-create-makefile" unless="no.ncp">
-        <hlm:startSpecificLogMacro name="${trace.log.file}" />
+        <hlm:startSpecificLogMacro name="${trace.log.file}" phase="roms"/>
         <hlm:preECImakerMacro />
         <for list="${product.list}" delimiter="," param="product.name">
             <sequential>
@@ -290,7 +290,7 @@
             </sequential>
         </for>
         <hlm:ecImakerMacro makefile.target="${ee.makefile.target}" />
-        <hlm:stopSpecificLogMacro name="${trace.log.file}" />
+        <hlm:stopSpecificLogMacro name="${trace.log.file}" phase="roms"/>
         <!-- Todo: Make sure that logfilter is added to the filterset -->
         <hlm:metadatarecord database="${metadata.dbfile}">
             <hlm:textmetadatainput>
@@ -331,9 +331,6 @@
                     <isset property="rom.dryrun" />
                 </and>
                 <then>
-                    <exec executable="python" dir="${build.drive}/" failonerror="${failonerror}">
-                        <arg line="${helium.dir}/tools/rombuild/dryrun_parser.py ${build.drive}/dryrun_out.txt ${build.drive}/@{makefile.target}.make @{makefile.target}" />
-                    </exec>
                     <antcall target="compile-ec-helium">
                         <param name="skip.compile-ec-patch" value="yes" />
                         <param name="sysdef.configuration" value="@{makefile.target}" />
--- a/buildframework/helium/tools/startup/bootstrap/bootstrap.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/startup/bootstrap/bootstrap.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -46,7 +46,7 @@
     </target>
 
     <!-- Install CruiseControl if not already installed -->
-    <target name="install-cruisecontrol">
+    <target name="install-cruisecontrol" unless="env.HLM_SUBCON">
         <if>
             <not>
                 <available file="${helium.dir}/external/CruiseControl/real_cruisecontrol.bat" />
--- a/buildframework/helium/tools/testing/ats/ats.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/testing/ats/ats.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,7 +21,6 @@
 ============================================================================
 -->
 <project name="_testing.ats" xmlns:hlm="http://www.nokia.com/helium">
-    <var name="drop.file.counter" value="0" />
     <description>
         ATS testing targets.
     </description>
@@ -35,96 +34,156 @@
         <include name="**/*.fpsx" />
         <include name="**/*_rnd.fpsx" />
     </fileset>
-    <property environment="env" />
+    
     <property name="ats.flashfiles.minlimit" value="2" />
 
     <fileset id="reference.ats.sis.images" dir="${ats.sis.images.dir}">
         <include name="**/*.sis" />
     </fileset>
     <property name="ats.sisfiles.minlimit" value="1" />
+    
+    <var name="drop.file.counter" value="0" />
 
     <!-- 
     The target creates ATSDrop.zip file which also includes test.xml file; and sends the drop to ATS. 
     The layer definition, in system definition file, for tsrc directory should look like:
     <pre>
     <layer name="name_test_layer">
-    
         <module name="module_name">
-        
             <unit id="unit_id" name="unti_name" bldFile="path_of_tsrc_folder_to_be_built" filter=""/>
-            
         </module>
-        
     </layer>
     </pre>
     -->
-
     <target name="ats-test" if="enabled.ats">
-        <hlm:filterRecordStartMacro/>
-        <runtarget target="copy-mon-sym" />
-        <runtarget target="ats-create-drop" />
-        <hlm:filterRecordStopMacro pattern="${ats.password}" log="${build.log.dir}/${build.id}_ats.log" append="false"/>
+        <mkdir dir="${test.log.dir}"/>
+        <hlm:filterRecordStartMacro pattern="${ats.password}" category="ats"/>
+        <trycatch property="exception" reference="exception">
+            <try>
+                <runtarget target="ats-delta"/>
+                <antcall target="create-canonical-sysdef-file" inheritRefs="true">
+                    <reference refid="ats.system.definition.files" torefid="system.definition.files" />
+                </antcall>
+                <runtarget target="copy-mon-sym" />
+                <runtarget target="ats-create-drop" />
+            </try>
+            <catch>
+                <if>
+                    <istrue value="${ats.delta.enabled}" />
+                    <then>
+                        <echo message="${exception}"/>
+                    </then>
+                    <else>
+                        <throw refid="exception"/>
+                    </else>
+                </if>
+            </catch>
+        </trycatch>
+        <hlm:filterRecordStopMacro log="${test.log.dir}/${build.id}_ats.log" append="false"/>
         <hlm:metadatarecord database="${metadata.dbfile}">
             <hlm:textmetadatainput>
-                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_ats.log" />
+                <fileset casesensitive="false" file="${test.log.dir}/${build.id}_ats.log" />
                 <metadatafilterset refid="filterset.ats" />
             </hlm:textmetadatainput>
         </hlm:metadatarecord>
         <hlm:generateBuildStatus file="${build.id}_ats.log" />
     </target>
 
-    <!-- The target creates the ATS3drop.zip file including test.xml for ATS ASTE tests. This target is executable.-->
-
+    <!-- The target creates the ATSdrop.zip file including test.xml for ATS ASTE tests. This target is executable.-->
     <target name="ats-aste" if="enabled.aste">
-        <hlm:filterRecordStartMacro/>
+        <mkdir dir="${test.log.dir}"/>
+        <hlm:filterRecordStartMacro pattern="${ats.password}" category="ats"/>
         <runtarget target="do-ats-aste" />
-        <hlm:filterRecordStopMacro pattern="${ats.password}" log="${build.log.dir}/${build.id}_ats.log" append="false"/>
+        <hlm:filterRecordStopMacro log="${test.log.dir}/${build.id}_aste.log" append="false"/>
         <hlm:metadatarecord database="${metadata.dbfile}">
             <hlm:textmetadatainput>
-                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_ats.log" />
+                <fileset casesensitive="false" file="${test.log.dir}/${build.id}_aste.log" />
                 <metadatafilterset refid="filterset.aste" />
             </hlm:textmetadatainput>
         </hlm:metadatarecord>
-        <hlm:generateBuildStatus file="${build.id}_ats.log" />
+        <hlm:generateBuildStatus file="${build.id}_aste.log" />
     </target>
 
     <!-- The target creates the MATTI_drop.zip file including test.xml for MATTI tests. This target is executable.-->
     <target name="matti-test" if="enabled.matti">
-        <hlm:filterRecordStartMacro/>
+        <mkdir dir="${test.log.dir}"/>
+        <hlm:filterRecordStartMacro pattern="${ats.password}" category="ats"/>
         <runtarget target="do-ats-matti" />
-        <hlm:filterRecordStopMacro pattern="${ats.password}" log="${build.log.dir}/${build.id}_matti.log" append="false"/>
+        <hlm:filterRecordStopMacro log="${test.log.dir}/${build.id}_matti.log" append="false"/>
         <hlm:metadatarecord database="${metadata.dbfile}">
             <hlm:textmetadatainput>
-                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_matti.log" />
+                <fileset casesensitive="false" file="${test.log.dir}/${build.id}_matti.log" />
                 <metadatafilterset refid="filterset.matti" />
             </hlm:textmetadatainput>
         </hlm:metadatarecord>
         <hlm:generateBuildStatus file="${build.id}_matti.log" />
     </target>
 
-
     <!-- Sends drop file to ATS/ASTE. Please see `ats-test` for description. -->
     <target name="do-ats-test" depends="ats-username, ats-password" unless="skip.ats.sending">
-        <!-- Make the drop file visible to ATS3. -->
-        <mkdir dir="${ats.drop.location}" />
-        <copy file="${ats.drop.file}" tofile="${ats.drop.location.file}" />
-        <!-- Notify ATS3 about the drop. -->
-        <exec executable="cscript" dir="${build.drive}/" failonerror="false">
-            <env key="ats3.username" value="${ats.username}" />
-            <env key="ats3.password" value="${ats.password}" />
-            <env key="ats3.host" value="${ats.server}" />
-            <env key="ats3.pathToDrop" value="${ats.drop.location.file}"/>
-            <arg value="${helium.dir}/tools/testing/ats/${ats.wsh.testrun.file}" />
-        </exec>
+        <property name="ats.sending" value="true" />
+        <!-- Make the drop file visible to ATS. -->
+        
+        <var name="ats.drop.location.file" unset="true"/>
+        <if>
+            <isset property="ats.drop.location" />
+            <then>
+                <mkdir dir="${ats.drop.location}" />
+                <property name="ats.drop.location.file" location="${ats.drop.location}/${ats.drop.file}" />
+                <copy file="${build.output.dir}/ats/${ats.drop.file}" tofile="${ats.drop.location.file}" />
+            </then>
+            <else>
+                <property name="ats.drop.location.file" location="${build.output.dir}/ats/${ats.drop.file}" />
+            </else>
+        </if>
+
+        <!-- Notify ATS about the drop. -->
+        <if>
+            <istrue value="${ats4.enabled}" />
+            <then>
+                <hlm:python failonerror="true">
+version = r'${java.version}'
+if '1.6.0' in version:
+    assert int(version.split('_')[1]) > 6, 'Java 6 u7 required'
+                </hlm:python>
+                <condition property="ats.import.arg" value="-import" else="">
+                    <equals arg1="${ats.script.type}" arg2="import" />
+                </condition>
+                <java classname="com.nokia.ats.util.server.CommandLineClient" fork="true">
+                    <classpath>
+                        <pathelement path="${java.class.path}"/>
+                    </classpath>
+                    <arg line="-url http://${ats.server}/ServerService -path ${ats.drop.location.file} ${ats.import.arg}"/>
+                </java>
+            </then>
+            <else>
+                <condition property="ats.wsh.testrun.file" value="wshTestRunImport.vbs" else="wshTestRunX.vbs">
+                    <equals arg1="${ats.script.type}" arg2="import" />
+                </condition>
+                <exec executable="cscript" dir="${build.drive}/" failonerror="false">
+                    <env key="ats3.username" value="${ats.username}" />
+                    <env key="ats3.password" value="${ats.password}" />
+                    <env key="ats3.host" value="${ats.server}" />
+                    <env key="ats3.pathToDrop" value="${ats.drop.location.file}"/>
+                    <arg value="${helium.dir}/tools/testing/ats/${ats.wsh.testrun.file}" />
+                </exec>
+            </else>
+        </if>
     </target>
 
-
-
     <!-- The target is dependent on "ats-test", should not be called independently. The target fetches flash files location -->
     <target name="ats-set-flash-image-path">
         <pathconvert pathsep="," property="ats.flash.images">
             <fileset refid="reference.ats.flash.images"/>
         </pathconvert>
+        <hlm:python failonerror="true">
+<![CDATA[
+flashfilescount = len(r'${ats.flash.images}'.split(','))
+mincount = int(r'${ats.flashfiles.minlimit}')
+if flashfilescount < mincount:
+    raise Exception('Not enough flash files, check reference.ats.flash.images')
+]]>
+        </hlm:python>
     </target>
 
     <!-- The target is dependent on "ats-test", should not be called independently. The target fetches flash files location -->
@@ -137,19 +196,13 @@
     <!-- Sets values common for ATS, this is a dependent target and shouldn't be used as an individual target -->
     <target name="ats-common">
         <property name="ats.config.file" value="" />
+        <property name="ats4.enabled" value="False" />
         <property name="ats.product.hwid" value="" />
         <property name="ats.test.timeout" value="60" />
         <property name="ats.report.location" value="${publish.dir}/${publish.subdir}" />
-        <var name="ats.drop.file" value="${build.output.dir}/ats/ATSDrop${drop.file.counter}.zip" />
-        <if>
+        <condition property="internal.ats.diamonds.arg" value="--diamonds-build-url=http://${diamonds.host}${diamonds.build.id}" else="">
             <isset property="diamonds.build.url" />
-            <then>
-                <property name="internal.ats.diamonds.arg" value="--diamonds-build-url=http://${diamonds.host}${diamonds.build.id}" />
-            </then>
-            <else>
-                <property name="internal.ats.diamonds.arg" value="" />
-            </else>
-        </if>
+        </condition>
     </target>
 
     <!-- Sets default values for the ATS (STIF and EUnit), this is a dependent target and shouldn't be used as an individual target -->
@@ -160,12 +213,11 @@
         <property name="ats.plan.name" value="plan" />
         <property name="ats.testrun.name" value="${build.id}_${ats.product.name}" />
         <property name="ats.ctc.host" value="" />
-        <condition property="ats.wsh.testrun.file" value="wshTestRunImport.vbs">
-            <equals arg1="${ats.script.type}" arg2="import" />
+        <condition property="ats.version" value="4" else="3">
+            <istrue value="${ats4.enabled}" />
         </condition>
-        <!-- if test run file is not explicitly mentioned, default is RunX-->
-        <property name="ats.wsh.testrun.file" value="wshTestRunX.vbs" />
-        <var name="ats.drop.file" value="ATS3Drop${drop.file.counter}.zip" />
+        <var name="ats.drop.file" value="ATS${ats.version}Drop${drop.file.counter}.zip" />
+        
         <property name="ats.target.platform" value="armv5 urel" />
         <property name="ats.trace.enabled" value="False" />
         <property name="ats.ctc.enabled" value="False" />
@@ -176,11 +228,7 @@
 
     <!-- Sets default values for the ASTE, this is a dependent target and shouldn't be used as an individual target -->
     <target name="ats-set-defaults-aste" depends="ats-common">
-        <condition property="ats.wsh.testrun.file" value="wshTestRunImport.vbs">
-            <equals arg1="${ats.script.type}" arg2="import" />
-        </condition>
-        <!-- if test run file is not explicitly mentioned, default is RunX-->
-        <property name="ats.wsh.testrun.file" value="wshTestRunX.vbs" />
+        <var name="ats.drop.file" value="ATSAsteDrop.zip" />
         <property name="ats.aste.test.type" value="smoke" />
         <property name="ats.aste.testasset.caseids" value="100,101,102,103,105,106,107,108,109,110,111,112,113,114,115" />
         <property name="ats.aste.software.version" value="${build.id}" />
@@ -202,79 +250,27 @@
     -->
     <scriptdef name="getModuleTsrcMacro" language="jython" uri="http://www.nokia.com/helium">
         <attribute name="property" />
-        <attribute name="prefix"/>
-        
+        <attribute name="prefix"/>        
+import traceback
 import os
-import re
-import sysdef.api
-import pathaddition.match
-import traceback
-## using create-canonical-sysdef-file target, it works and gets tsrc paths
-
-if project.getProperty('canonical.sysdef.file') == None :
-    raise Exception("'canonical.sysdef.file' property is not defined")
+import atsant
+from com.nokia.ant.util import Helper
 
-try:
-    sdf = sysdef.api.SystemDefinition(str(project.getProperty('canonical.sysdef.file')))
-    
-    modules = {}
-    paths_list = []
-    for la in sdf.layers:
-        if re.match(r".*_test_layer$", la):
-            try:
-                if re.search(r"\b%s\b" % la, project.getProperty('exclude.test.layers')):
-                    continue
-            except TypeError, exp:
-                pass
+canonicalsysdeffile = Helper.getProperty(project, 'canonical.sysdef.file')
+modules = atsant.files_to_test(canonicalsysdeffile, project.getProperty('exclude.test.layers'), project.getProperty('ido.build.filter'), project.getProperty('build.drive'))
 
-            layer = sdf.layers[la]
-            for mod in layer.modules:
-                if mod.name not in modules:
-                    modules[mod.name] = []
-                for unit in mod.units:
-                    include_unit = True
-                    if project.getProperty('ido.build.filter') != None:
-                        if project.getProperty('ido.build.filter') != "":
-                            include_unit = False
-                            if hasattr(unit, 'filters'):
-                                if len(unit.filters) > 0:
-                                    for filter in unit.filters:
-                                        if re.search(r"\b%s\b" % filter, project.getProperty('ido.build.filter')):
-                                            include_unit = True
-                                        else:
-                                            include_unit = False
-                                elif len(unit.filters) == 0:
-                                    include_unit = True
-                            else:
-                                include_unit = False
-                        else:
-                            include_unit = False
-                            if hasattr(unit, 'filters'):                            
-                                if len(unit.filters) == 0:
-                                    include_unit = True
-                    if include_unit:
-                        #if pathaddition.match.ant_match(unit.path, "**/tsrc/**", False):
-                        modules[mod.name].append(os.path.join(project.getProperty('build.drive') + os.sep, unit.path))
-                        #else:
-                        #    project.log('tcrc not found in ' + str(unit.path))
-
-            #substituting paths in the modules dictionary from path list using keys
-            for name in modules.keys():
-                if not modules[name] == []:
-                    project.setProperty(str("%s.%s" % (attributes.get('prefix'), name)), str(" ".join(modules[name])))
-                else:
-                    del modules[name]
-
-            project.setProperty(str(attributes.get('property')), str(",".join(modules.keys())))
-            
-except Exception, e:
-    traceback.print_exc()
-    project.log("ERROR: could not generate tsrc path list. %s" % e)
+for name in modules.keys():    
+    if modules[name] == []:
+        del modules[name]
+    else:
+        project.setProperty("%s.%s" % (attributes.get('prefix'), name), " ".join(modules[name]))
+        
+project.setProperty(attributes.get('property'), ",".join(modules.keys()))
+project.setProperty('ats.drops.count', str(len(modules)))
     </scriptdef>
 
-    <!-- The target is dependent on "ats-test", should not be called individually. The target creates the ATS3drop.zip file including test:xml file -->
-    <target name="ats-create-drop" depends="create-canonical-sysdef-file, ats-set-flash-image-path">
-        <var name="ats.drop.location.file" value="${ats.drop.location}/ATS3Drop${drop.file.counter}.zip" />
+    <!-- The target is dependent on "ats-test", should not be called individually. The target creates the ATSdrop.zip file including test:xml file -->
+    <target name="ats-create-drop" depends="ats-set-flash-image-path">
         <mkdir dir="${build.output.dir}/ats" />
         <hlm:getModuleTsrcMacro property="module.list" prefix="module.tsrc" />
         <if>
@@ -290,48 +286,24 @@
                             }
                         } else {
                             self.log("Error: module.list not defined.");
-                                self.setValue(true);
+                            self.setValue(true);
                         }
                             ]]>
             </scriptcondition>
             <then>
                 <echo message="Error: No test modules found!" />
             </then>
-            <elseif>
-                <scriptcondition language="beanshell">
-                    <![CDATA[
-                        String flashfiles = project.getProperty("ats.flash.images");
-                        String value = project.getProperty("ats.flashfiles.minlimit");
-                        if (flashfiles != null && value != null) {
-                            int cond = Integer.valueOf(value).intValue();
-                            String[] out = flashfiles.split(",");
-                            if (out.length < cond ) {
-                                self.setValue(true);
-                            } else {
-                                self.setValue(false);
-                            }
-                        } else {
-                            self.log("Error: flashfiles not defined.");
-                            self.setValue(true);
-                        }
-                            ]]>
-                </scriptcondition>
-                <then>
-                    <echo message="Error: Not enough flash files!" />
-                </then>
-            </elseif>
             <else>
                 <for list="${module.list}" delimiter="," param="module">
                     <sequential>
                         <runtarget target="ats-set-defaults-stifeunit" />
-                        <var name="ats.drop.file" value="${build.output.dir}/ats/ATS3Drop${drop.file.counter}.zip" />
                         <echo>${ats.drop.file}</echo>
                         <exec executable="python">
                             <arg value="${helium.dir}/tools/common/python/lib/ats3/__init__.py" />
                             <arg value="--device-type=${ats.product.name}" />
                             <arg value="--device-hwid=${ats.product.hwid}" />
                             <arg value="${internal.ats.diamonds.arg}" />
-                            <arg value="--drop-file=${ats.drop.file}" />
+                            <arg value="--drop-file=${build.output.dir}/ats/${ats.drop.file}" />
                             <arg value="--report-email=${ats.email.list}" />
                             <arg value="--plan-name=${ats.plan.name}" />
                             <arg value="--testrun-name=${ats.testrun.name}_@{module}" />
@@ -346,10 +318,11 @@
                             <arg value="--multiset-enabled=${ats.multiset.enabled}" />
                             <arg value="--file-store=${ats.report.location}" />
                             <arg value="--eunitexerunner-flags=${eunitexerunner.flags}" />
-                            <arg value="--ats-network-drive=${ats.ctc.host}#${ats.drop.file}" />
+                            <arg value="--ctc-run-process-params=${ats.ctc.host}#${ats.drop.file}#${ats.drops.count}" /> <!-- Three differnt value are combined with '#' character which is later parsed inside the script -->
                             <arg value="--monsym-files=${ats.ctc.monsyms}" />
                             <arg value="--config=${ats.config.file}" />
                             <arg value="--obey-pkgfiles=${ats.obey.pkgfiles.rule}" />
+                            <arg value="--ats4-enabled=${ats4.enabled}" />
                             <arg value="--verbose" />
                             <arg line="${module.tsrc.@{module}}" />
                         </exec>
@@ -364,55 +337,30 @@
 
     <!-- Please see ats-aste for description.-->
     <target name="do-ats-aste" depends="ats-set-flash-image-path, ats-set-defaults-aste" if="enabled.aste">
-
         <mkdir dir="${build.output.dir}/ats" />
-        <if>
-            <scriptcondition language="beanshell">
-                <![CDATA[
-                String flashfiles = project.getProperty("ats.flash.images");
-                String value = project.getProperty("ats.flashfiles.minlimit");
-                if (flashfiles != null && value != null) {
-                    int cond = Integer.valueOf(value).intValue();
-                    String[] out = flashfiles.split(",");
-                    if (out.length < cond ) {
-                        self.setValue(true);
-                    } else {
-                            self.setValue(false);
-                    }
-                } else {
-                    self.log("Error: flashfiles not defined.");
-                    self.setValue(true);
-                }
-                    ]]>
-            </scriptcondition>
-            <then>
-                <echo message="Error: Not enough flash files!" />
-            </then>
-            <else>
-                <exec executable="python">
-                    <arg value="${helium.dir}/tools/common/python/lib/ats3/aste.py" />
-                    <arg value="--report-email=${ats.aste.email.list}" />
-                    <arg value="--device-type=${ats.product.name}" />
-                    <arg value="--flash-images=${ats.flash.images}" />
-                    <arg value="--minimum-flash-images=${ats.flashfiles.minlimit}" />
-                    <arg value="--plan-name=${ats.aste.plan.name}" />
-                    <arg value="--testrun-name=${ats.aste.testrun.name}" />
-                    <arg value="--device-hwid=${ats.product.hwid}" />
-                    <arg value="--test-timeout=${ats.test.timeout}" />
-                    <arg value="--build-drive=${build.drive}" />
-                    <arg value="${internal.ats.diamonds.arg}" />
-                    <arg value="--drop-file=${ats.drop.file}" />
-                    <arg value="--test-type=${ats.aste.test.type}" />
-                    <arg value="--testasset-location=${ats.aste.testasset.location}" />
-                    <arg value="--testasset-caseids=${ats.aste.testasset.caseids}" />
-                    <arg value="--software-version=${ats.aste.software.version}" />
-                    <arg value="--device-language=${ats.aste.language}" />
-                    <arg value="--software-release=${ats.aste.software.release}" />
-                    <arg value="--verbose" />
-                </exec>
-                <runtarget target="do-ats-test" />
-            </else>
-        </if>
+        <exec executable="python">
+            <arg value="${helium.dir}/tools/common/python/lib/ats3/aste.py" />
+            <arg value="--report-email=${ats.aste.email.list}" />
+            <arg value="--device-type=${ats.product.name}" />
+            <arg value="--flash-images=${ats.flash.images}" />
+            <arg value="--minimum-flash-images=${ats.flashfiles.minlimit}" />
+            <arg value="--plan-name=${ats.aste.plan.name}" />
+            <arg value="--testrun-name=${ats.aste.testrun.name}" />
+            <arg value="--device-hwid=${ats.product.hwid}" />
+            <arg value="--test-timeout=${ats.test.timeout}" />
+            <arg value="--build-drive=${build.drive}" />
+            <arg value="${internal.ats.diamonds.arg}" />
+            <arg value="--drop-file=${build.output.dir}/ats/${ats.drop.file}" />
+            <arg value="--test-type=${ats.aste.test.type}" />
+            <arg value="--testasset-location=${ats.aste.testasset.location}" />
+            <arg value="--testasset-caseids=${ats.aste.testasset.caseids}" />
+            <arg value="--software-version=${ats.aste.software.version}" />
+            <arg value="--device-language=${ats.aste.language}" />
+            <arg value="--software-release=${ats.aste.software.release}" />
+            <arg value="--ats4-enabled=${ats4.enabled}" />
+            <arg value="--verbose" />
+        </exec>
+        <runtarget target="do-ats-test" />
     </target>
 
     <!--
@@ -420,16 +368,19 @@
         Then it copies the discovered files under the ftp server defined by ats.ctc.host.
         The target url is: ftp ://[server]/ctc_helium/[diamonds_id]/mon_syms/[id]/mon.sym 
     -->
-    <target name="copy-mon-sym" if="ats.ctc.enabled">
-        <fmpp sourceFile="${helium.dir}/tools/testing/ats/templates/monsym-file-list.txt.ftl"
-            outputFile="${temp.build.dir}/monsym-file-list.txt">
-            <data expandProperties="yes">
-                data: xml(${canonical.sysdef.file})
-                ant: antProperties()
-            </data>
-        </fmpp>
-        <hlm:path2file reference="mon.sym.list" file="${temp.build.dir}/monsym-file-list.txt" />
-        <script language="jython">
+    <target name="copy-mon-sym">
+        <if>
+            <istrue value="${ats.ctc.enabled}"/>
+            <then>
+                <fmpp sourceFile="${helium.dir}/tools/testing/ats/templates/monsym-file-list.txt.ftl"
+                    outputFile="${temp.build.dir}/monsym-file-list.txt">
+                    <data expandProperties="yes">
+                        data: xml(${canonical.sysdef.file})
+                        ant: antProperties()
+                    </data>
+                </fmpp>
+                <hlm:path2file reference="mon.sym.list" file="${temp.build.dir}/monsym-file-list.txt" />
+                <script language="jython">
 import os
 import ctc
 
@@ -449,8 +400,10 @@
             
 # Using ; to separate the path because the target script is running on windows
 project.setNewProperty('ats.ctc.monsyms', ';'.join([ "//%s/%s" % (server, x) for x in monsyms]))
-        </script>
-        <echo>ats.ctc.monsyms: ${ats.ctc.monsyms}</echo>
+                </script>
+                <echo>ats.ctc.monsyms: ${ats.ctc.monsyms}</echo>
+            </then>
+        </if>
     </target>
 
     <!-- a dependant target please do not call directly use matti-test,
@@ -460,91 +413,112 @@
         <runtarget target="ats-set-defaults-stifeunit" />
         <!--need to set theseup for use by do-ats-test target-->
         <mkdir dir="${build.output.dir}/ats" />
-        <var name="ats.drop.location" value="${build.output.dir}/ats" />
-        <var name="ats.drop.file" value="${build.output.dir}/ats/ATS3Drop.zip" />
-        <var name="ats.drop.location.file" value="${ats.drop.file}" />
+        <var name="ats.drop.file" value="ATSMattiDrop.zip" />
         <if>
-            <!-- get the list of .fpsx files (and others) in the defined folder
-             to pass as a list to the python script-->
+            <!-- get the list of .sis files in the defined folder to pass as a list to the python script-->
             <scriptcondition language="beanshell">
                 <![CDATA[
-                    String flashfiles = project.getProperty("ats.flash.images");
-                    String value = project.getProperty("ats.flashfiles.minlimit");
-                    if (flashfiles != null && value != null) {
+                    String sisfiles = project.getProperty("ats.sis.images");
+                    String value = project.getProperty("ats.sisfiles.minlimit");
+                    if (sisfiles != null && value != null) {
                         int cond = Integer.valueOf(value).intValue();
-                        String[] out = flashfiles.split(",");
+                        String[] out = sisfiles.split(",");
                         if (out.length < cond ) {
                             self.setValue(true);
                         } else {
                             self.setValue(false);
                         }
                     } else {
-                        self.log("Error: flashfiles not defined.");
+                        self.log("Error: reference.ats.sis.images not defined.");
                         self.setValue(true);
                     }
                         ]]>
             </scriptcondition>
             <then>
-                <echo message="Error: Not enough flash files!" />
+                <echo message="Error: Not enough sis files check reference.ats.sis.images" />
             </then>
             <else>
-                <if>
-                    <!-- get the list of .sis files in the defined folder to pass as a list to the python script-->
-                    <scriptcondition language="beanshell">
-                        <![CDATA[
-                            String sisfiles = project.getProperty("ats.sis.images");
-                            String value = project.getProperty("ats.sisfiles.minlimit");
-                            if (sisfiles != null && value != null) {
-                                int cond = Integer.valueOf(value).intValue();
-                                String[] out = sisfiles.split(",");
-                                if (out.length < cond ) {
-                                    self.setValue(true);
-                                } else {
-                                    self.setValue(false);
-                                }
-                            } else {
-                                self.log("Error: sisfiles not defined.");
-                                self.setValue(true);
-                            }
-                                ]]>
-                    </scriptcondition>
+                <!-- execute the MattiDrops.py script with parameters-->
+                <exec executable="python" resultproperty="script.response">
+                    <arg value="${helium.dir}/tools/common/python/lib/ats3/matti/MattiDrops.py" />
+                    <arg value="--build-drive=${build.drive}" />
+                    <arg value="--matti-scripts=${matti.scripts}" />
+                    <arg value="--flash-images=${ats.flash.images}" />
+                    <arg value="--harness=STIF" />
+                    <arg value="--file-store=${ats.output.dir}" />
+                    <arg value="--testrun-name=${ats.testrun.name}" />
+                    <arg value="--device-type=${ats.product.name}" />
+                    <arg value="--device-hwid=${ats.product.hwid}" />
+                    <arg value="--diamonds-build-url=${internal.ats.diamonds.arg}" />
+                    <arg value="--drop-file=${build.output.dir}/ats/${ats.drop.file}" />
+                    <arg value="--minimum-flash-images=${ats.flashfiles.minlimit}" />
+                    <arg value="--plan-name=${ats.plan.name}" />
+                    <arg value="--sis-files=${ats.sis.images}" />
+                    <arg value="--template-loc=${template.file}" />
+                </exec>
+                <if> 
+                    <not>
+                        <!-- if the response is not 0 then need to create the skip.ats.sending
+                         flag so that do-ats-test is not run-->
+                        <equals arg1="${script.response}" arg2="0" />
+                    </not>
                     <then>
-                        <echo message="Error: Not enough sis files!" />
+                        <property name="skip.ats.sending" value="1" />
                     </then>
-                    <else>
-                        <!-- execute the MattiDrops.py script with parameters-->
-                        <exec executable="python" resultproperty="script.response">
-                            <arg value="${helium.dir}/tools/common/python/lib/ats3/matti/MattiDrops.py" />
-                            <arg value="--build-drive=${build.drive}" />
-                            <arg value="--matti-scripts=${matti.scripts}" />
-                            <arg value="--flash-images=${ats.flash.images}" />
-                            <arg value="--harness=STIF" />
-                            <arg value="--file-store=${ats.output.dir}" />
-                            <arg value="--testrun-name=${ats.testrun.name}" />
-                            <arg value="--device-type=${ats.product.name}" />
-                            <arg value="--device-hwid=${ats.product.hwid}" />
-                            <arg value="--diamonds-build-url=${internal.ats.diamonds.arg}" />
-                            <arg value="--drop-file=${ats.drop.file}" />
-                            <arg value="--minimum-flash-images=${ats.flashfiles.minlimit}" />
-                            <arg value="--plan-name=${ats.plan.name}" />
-                            <arg value="--sis-files=${ats.sis.images}" />
-                            <arg value="--template-loc=${template.file}" />
-                        </exec>
-                        <if> 
-                            <not>
-                                <!-- if the response is not 0 then need to create the skip.ats.sending
-                                 flag so that do-ats-test is not run-->
-                                <equals arg1="${script.response}" arg2="0" />
-                            </not>
-                            <then>
-                                <property name="skip.ats.sending" value="1" />
-                            </then>
-                        </if>
-                        <runtarget target="do-ats-test" />
-                    </else>
-                </if>    
+                </if>
+                <runtarget target="do-ats-test" />
             </else>
-        </if>    
+        </if>
+    </target>
+    
+    <property name="ats.evalid.pre" value="${temp.build.dir}/${build.id}_atsevalidpre" />
+    <property name="ats.evalid.post" value="${temp.build.dir}/${build.id}_atsevalidpost" />
+    
+    <!-- Call before preperation -->
+    <target name="find-files-pre" if="ats.delta.enabled">
+        <hlm:evalidMacro dir="${ats.evalid.pre}"/>
     </target>
     
+    <!-- Call after preperation -->
+    <target name="find-files-post" if="ats.delta.enabled">
+        <hlm:evalidMacro dir="${ats.evalid.post}"/>
+    </target>
+    
+    <!-- Run evalid on ido directories -->
+    <macrodef name="evalidMacro" uri="http://www.nokia.com/helium">
+        <attribute name="dir"/>
+        <sequential>
+            <runtarget target="ido-create-ado-mapping"/>
+            <hlm:python>
+import delta_zip
+delta_zip.evalidAdomapping(r'${build.drive}', r'@{dir}', r'${ado.mapping.file}')
+            </hlm:python>
+        </sequential>
+    </macrodef>
+    
+    <!-- Generate sysdef fileset based on evalid data -->
+    <target name="ats-delta" if="ats.delta.enabled">
+        <script language="jython">
+import ido
+from com.nokia.ant.util import Helper
+import delta_zip
+import os
+
+atspath = project.createDataType("path")
+i = project.getReference('system.definition.files').iterator()
+changedfiles = delta_zip.changedFiles(Helper.getProperty(project, 'ats.evalid.pre'), Helper.getProperty(project, 'ats.evalid.post'))
+while i.hasNext():
+    path = i.next().toString()
+    sysdefpath = os.path.abspath(os.path.join(project.getProperty('build.drive') + os.sep, ido.get_sysdef_location(path)))
+    for f in changedfiles:
+        if sysdefpath.lower() in os.path.abspath(f).lower():
+            pe = atspath.createPathElement()
+            pe.setPath(path)
+            break
+project.addReference('ats.system.definition.files', atspath)
+        </script>
+    </target>
+    
+    <!-- Common target to run ats, aste and matti -->
+    <target name="run-test" depends="ats-test,ats-aste,matti-test"/>
 </project>
--- a/buildframework/helium/tools/testing/ats/templates/monsym-file-list.txt.ftl	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/testing/ats/templates/monsym-file-list.txt.ftl	Wed Dec 23 19:29:07 2009 +0200
@@ -19,6 +19,7 @@
 
 ============================================================================
 -->
+${ant['build.drive']}/mon.sym
 <#list data["//unit"] as unit>
 ${ant['build.drive']}${unit.@bldFile}/mon.sym
 </#list>
--- a/buildframework/helium/tools/testing/eunit/eunit.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/testing/eunit/eunit.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -32,6 +32,7 @@
 
     <!-- Runs eunittests for Java code -->
     <target name="eunittest" depends="prepare-eunit">
+        <mkdir dir="${test.log.dir}"/>
         <for list="${eunit.dlls}" delimiter="," param="eunit.dll">
             <sequential>
                 <exec executable="${build.drive}/epoc32/release/winscw/udeb/EUnitExeRunner.exe" dir="${build.drive}/epoc32/release/winscw/udeb" failonerror="${failonerror}">
@@ -39,7 +40,7 @@
                 </exec>
             </sequential>
         </for>
-        <copy file="${build.drive}\epoc32\winscw\c\shared\Eunit\logs\Eunit_Log.xml" tofile="${build.log.dir}\${build.id}_Eunit_Log.xml" />
+        <copy file="${build.drive}\epoc32\winscw\c\shared\Eunit\logs\Eunit_Log.xml" tofile="${temp.build.dir}\${build.id}_Eunit_Log.xml" />
     </target>
 
 </project>
--- a/buildframework/helium/tools/testing/testing.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/testing/testing.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -21,7 +21,9 @@
 ============================================================================
 -->
 <project name="testing">
-
+    <description>
+    Testing  
+    </description>
     <!-- ATS testing -->
     <import file="ats/ats.ant.xml" />
 
--- a/buildframework/helium/tools/uda/uda.ant.xml	Wed Oct 28 14:39:48 2009 +0000
+++ b/buildframework/helium/tools/uda/uda.ant.xml	Wed Dec 23 19:29:07 2009 +0200
@@ -29,17 +29,18 @@
 
     <!-- Creates uda rom images according to configuration -->
     <target name="uda-roms" depends="rombuild-create-makefile">
+        <mkdir dir="${roms.log.dir}"/>
         <!-- get product path -->
-        <record name="${build.log.dir}/${build.id}_uda.log" action="start" />
+        <hlm:record name="${roms.log.dir}/${build.id}_uda.log" action="start" />
         <for list="${product.list}" delimiter="," param="product.name">
             <sequential>
                 <hlm:rombuildImakerMacro product="@{product.name}" target="${uda.makefile.target}" />
             </sequential>
         </for>
-        <record name="${build.log.dir}/${build.id}_uda.log" action="stop" />
+        <hlm:record name="${roms.log.dir}/${build.id}_uda.log" action="stop" />
         <hlm:metadatarecord database="${metadata.dbfile}">
             <hlm:textmetadatainput>
-                <fileset casesensitive="false" file="${build.log.dir}/${build.id}_uda.log" />
+                <fileset casesensitive="false" file="${roms.log.dir}/${build.id}_uda.log" />
                 <metadatafilterset refid="filterset.uda.roms" />
             </hlm:textmetadatainput>
         </hlm:metadatarecord>